From 4a6dd3da86b5c6fec2ff26a886ba17dc63a8b77e Mon Sep 17 00:00:00 2001 From: AJ Fontaine Date: Mon, 30 Sep 2024 14:36:25 -0400 Subject: [PATCH] Add docstrings, passives.ts --- src/data/balance/passives.ts | 574 +++++++++++++++++ src/data/balance/starters.ts | 595 +----------------- src/data/challenge.ts | 6 +- src/data/daily-run.ts | 6 +- src/data/egg.ts | 14 +- .../an-offer-you-cant-refuse-encounter.ts | 4 +- .../the-expert-pokemon-breeder-encounter.ts | 6 +- .../the-pokemon-salesman-encounter.ts | 4 +- .../encounters/training-session-encounter.ts | 4 +- .../utils/encounter-pokemon-utils.ts | 6 +- src/data/pokemon-species.ts | 6 +- src/field/pokemon.ts | 5 +- src/phases/command-phase.ts | 4 +- src/system/game-data.ts | 12 +- .../mystery-encounter-utils.test.ts | 8 +- src/ui/game-stats-ui-handler.ts | 6 +- src/ui/starter-select-ui-handler.ts | 21 +- src/ui/summary-ui-handler.ts | 4 +- 18 files changed, 654 insertions(+), 631 deletions(-) create mode 100644 src/data/balance/passives.ts diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts new file mode 100644 index 00000000000..6fb0e80e085 --- /dev/null +++ b/src/data/balance/passives.ts @@ -0,0 +1,574 @@ +import { Abilities } from "#app/enums/abilities"; +import { Species } from "#app/enums/species"; + +export const starterPassiveAbilities = { + [Species.BULBASAUR]: Abilities.GRASSY_SURGE, + [Species.CHARMANDER]: Abilities.BEAST_BOOST, + [Species.SQUIRTLE]: Abilities.STURDY, + [Species.CATERPIE]: Abilities.MAGICIAN, + [Species.WEEDLE]: Abilities.TINTED_LENS, + [Species.PIDGEY]: Abilities.SHEER_FORCE, + [Species.RATTATA]: Abilities.STRONG_JAW, + [Species.SPEAROW]: Abilities.MOXIE, + [Species.EKANS]: Abilities.REGENERATOR, + [Species.SANDSHREW]: Abilities.TOUGH_CLAWS, + [Species.NIDORAN_F]: Abilities.FLARE_BOOST, + [Species.NIDORAN_M]: Abilities.GUTS, + [Species.VULPIX]: Abilities.FUR_COAT, + [Species.ZUBAT]: Abilities.INTIMIDATE, + [Species.ODDISH]: Abilities.TRIAGE, + [Species.PARAS]: Abilities.TRIAGE, + [Species.VENONAT]: Abilities.SIMPLE, + [Species.DIGLETT]: Abilities.STURDY, + [Species.MEOWTH]: Abilities.TOUGH_CLAWS, + [Species.PSYDUCK]: Abilities.SIMPLE, + [Species.MANKEY]: Abilities.IRON_FIST, + [Species.GROWLITHE]: Abilities.SPEED_BOOST, + [Species.POLIWAG]: Abilities.NO_GUARD, + [Species.ABRA]: Abilities.PSYCHIC_SURGE, + [Species.MACHOP]: Abilities.QUICK_FEET, + [Species.BELLSPROUT]: Abilities.FLOWER_GIFT, + [Species.TENTACOOL]: Abilities.TOXIC_CHAIN, + [Species.GEODUDE]: Abilities.DRY_SKIN, + [Species.PONYTA]: Abilities.MAGIC_GUARD, + [Species.SLOWPOKE]: Abilities.UNAWARE, + [Species.MAGNEMITE]: Abilities.LEVITATE, + [Species.FARFETCHD]: Abilities.SNIPER, + [Species.DODUO]: Abilities.PARENTAL_BOND, + [Species.SEEL]: Abilities.WATER_BUBBLE, + [Species.GRIMER]: Abilities.WATER_ABSORB, + [Species.SHELLDER]: Abilities.ICE_SCALES, + [Species.GASTLY]: Abilities.SHADOW_SHIELD, + [Species.ONIX]: Abilities.ROCKY_PAYLOAD, + [Species.DROWZEE]: Abilities.MAGICIAN, + [Species.KRABBY]: Abilities.THERMAL_EXCHANGE, + [Species.VOLTORB]: Abilities.TRANSISTOR, + [Species.EXEGGCUTE]: Abilities.RIPEN, + [Species.CUBONE]: Abilities.PARENTAL_BOND, + [Species.LICKITUNG]: Abilities.CHEEK_POUCH, + [Species.KOFFING]: Abilities.PARENTAL_BOND, + [Species.RHYHORN]: Abilities.FILTER, + [Species.TANGELA]: Abilities.SEED_SOWER, + [Species.KANGASKHAN]: Abilities.GUTS, + [Species.HORSEA]: Abilities.DRAGONS_MAW, + [Species.GOLDEEN]: Abilities.MULTISCALE, + [Species.STARYU]: Abilities.REGENERATOR, + [Species.SCYTHER]: Abilities.TINTED_LENS, + [Species.PINSIR]: Abilities.TINTED_LENS, + [Species.TAUROS]: Abilities.STAMINA, + [Species.MAGIKARP]: Abilities.MULTISCALE, + [Species.LAPRAS]: Abilities.LIGHTNING_ROD, + [Species.DITTO]: Abilities.ADAPTABILITY, + [Species.EEVEE]: Abilities.PICKUP, + [Species.PORYGON]: Abilities.PROTEAN, + [Species.OMANYTE]: Abilities.STURDY, + [Species.KABUTO]: Abilities.TOUGH_CLAWS, + [Species.AERODACTYL]: Abilities.ORICHALCUM_PULSE, + [Species.ARTICUNO]: Abilities.SNOW_WARNING, + [Species.ZAPDOS]: Abilities.DRIZZLE, + [Species.MOLTRES]: Abilities.DROUGHT, + [Species.DRATINI]: Abilities.AERILATE, + [Species.MEWTWO]: Abilities.NEUROFORCE, + [Species.MEW]: Abilities.PROTEAN, + [Species.CHIKORITA]: Abilities.THICK_FAT, + [Species.CYNDAQUIL]: Abilities.DROUGHT, + [Species.TOTODILE]: Abilities.TOUGH_CLAWS, + [Species.SENTRET]: Abilities.PICKUP, + [Species.HOOTHOOT]: Abilities.AERILATE, + [Species.LEDYBA]: Abilities.PRANKSTER, + [Species.SPINARAK]: Abilities.PRANKSTER, + [Species.CHINCHOU]: Abilities.WATER_BUBBLE, + [Species.PICHU]: Abilities.ELECTRIC_SURGE, + [Species.CLEFFA]: Abilities.ANALYTIC, + [Species.IGGLYBUFF]: Abilities.HUGE_POWER, + [Species.TOGEPI]: Abilities.PIXILATE, + [Species.NATU]: Abilities.TINTED_LENS, + [Species.MAREEP]: Abilities.ELECTROMORPHOSIS, + [Species.HOPPIP]: Abilities.FLUFFY, + [Species.AIPOM]: Abilities.SCRAPPY, + [Species.SUNKERN]: Abilities.DROUGHT, + [Species.YANMA]: Abilities.SHEER_FORCE, + [Species.WOOPER]: Abilities.COMATOSE, + [Species.MURKROW]: Abilities.DARK_AURA, + [Species.MISDREAVUS]: Abilities.BEADS_OF_RUIN, + [Species.UNOWN]: Abilities.PICKUP, + [Species.GIRAFARIG]: Abilities.PARENTAL_BOND, + [Species.PINECO]: Abilities.IRON_BARBS, + [Species.DUNSPARCE]: Abilities.UNAWARE, + [Species.GLIGAR]: Abilities.TOXIC_BOOST, + [Species.SNUBBULL]: Abilities.PIXILATE, + [Species.QWILFISH]: Abilities.TOXIC_DEBRIS, + [Species.SHUCKLE]: Abilities.HARVEST, + [Species.HERACROSS]: Abilities.TECHNICIAN, + [Species.SNEASEL]: Abilities.TOUGH_CLAWS, + [Species.TEDDIURSA]: Abilities.THICK_FAT, + [Species.SLUGMA]: Abilities.DESOLATE_LAND, + [Species.SWINUB]: Abilities.SLUSH_RUSH, + [Species.CORSOLA]: Abilities.STORM_DRAIN, + [Species.REMORAID]: Abilities.SIMPLE, + [Species.DELIBIRD]: Abilities.HUGE_POWER, + [Species.SKARMORY]: Abilities.LIGHTNING_ROD, + [Species.HOUNDOUR]: Abilities.DROUGHT, + [Species.PHANPY]: Abilities.SPEED_BOOST, + [Species.STANTLER]: Abilities.SPEED_BOOST, + [Species.SMEARGLE]: Abilities.PRANKSTER, + [Species.TYROGUE]: Abilities.MOXIE, + [Species.SMOOCHUM]: Abilities.PSYCHIC_SURGE, + [Species.ELEKID]: Abilities.SHEER_FORCE, + [Species.MAGBY]: Abilities.CONTRARY, + [Species.MILTANK]: Abilities.STAMINA, + [Species.RAIKOU]: Abilities.TRANSISTOR, + [Species.ENTEI]: Abilities.MOXIE, + [Species.SUICUNE]: Abilities.UNAWARE, + [Species.LARVITAR]: Abilities.SAND_RUSH, + [Species.LUGIA]: Abilities.DELTA_STREAM, + [Species.HO_OH]: Abilities.MAGIC_GUARD, + [Species.CELEBI]: Abilities.PSYCHIC_SURGE, + [Species.TREECKO]: Abilities.TINTED_LENS, + [Species.TORCHIC]: Abilities.RECKLESS, + [Species.MUDKIP]: Abilities.DRIZZLE, + [Species.POOCHYENA]: Abilities.TOUGH_CLAWS, + [Species.ZIGZAGOON]: Abilities.RUN_AWAY, + [Species.WURMPLE]: Abilities.SIMPLE, + [Species.LOTAD]: Abilities.DRIZZLE, + [Species.SEEDOT]: Abilities.SHARPNESS, + [Species.TAILLOW]: Abilities.AERILATE, + [Species.WINGULL]: Abilities.SWIFT_SWIM, + [Species.RALTS]: Abilities.PSYCHIC_SURGE, + [Species.SURSKIT]: Abilities.WATER_BUBBLE, + [Species.SHROOMISH]: Abilities.GUTS, + [Species.SLAKOTH]: Abilities.GUTS, + [Species.NINCADA]: Abilities.MAGIC_GUARD, + [Species.WHISMUR]: Abilities.PUNK_ROCK, + [Species.MAKUHITA]: Abilities.STAMINA, + [Species.AZURILL]: Abilities.MISTY_SURGE, + [Species.NOSEPASS]: Abilities.LEVITATE, + [Species.SKITTY]: Abilities.SCRAPPY, + [Species.SABLEYE]: Abilities.UNNERVE, + [Species.MAWILE]: Abilities.UNNERVE, + [Species.ARON]: Abilities.EARTH_EATER, + [Species.MEDITITE]: Abilities.MINDS_EYE, + [Species.ELECTRIKE]: Abilities.ELECTRIC_SURGE, + [Species.PLUSLE]: Abilities.POWER_SPOT, + [Species.MINUN]: Abilities.POWER_SPOT, + [Species.VOLBEAT]: Abilities.HONEY_GATHER, + [Species.ILLUMISE]: Abilities.HONEY_GATHER, + [Species.GULPIN]: Abilities.EARTH_EATER, + [Species.CARVANHA]: Abilities.SHEER_FORCE, + [Species.WAILMER]: Abilities.LEVITATE, + [Species.NUMEL]: Abilities.FUR_COAT, + [Species.TORKOAL]: Abilities.ANALYTIC, + [Species.SPOINK]: Abilities.PSYCHIC_SURGE, + [Species.SPINDA]: Abilities.SIMPLE, + [Species.TRAPINCH]: Abilities.ADAPTABILITY, + [Species.CACNEA]: Abilities.SAND_RUSH, + [Species.SWABLU]: Abilities.ADAPTABILITY, + [Species.ZANGOOSE]: Abilities.POISON_HEAL, + [Species.SEVIPER]: Abilities.MULTISCALE, + [Species.LUNATONE]: Abilities.SHADOW_SHIELD, + [Species.SOLROCK]: Abilities.DROUGHT, + [Species.BARBOACH]: Abilities.SIMPLE, + [Species.CORPHISH]: Abilities.TOUGH_CLAWS, + [Species.BALTOY]: Abilities.WELL_BAKED_BODY, + [Species.LILEEP]: Abilities.SEED_SOWER, + [Species.ANORITH]: Abilities.WATER_ABSORB, + [Species.FEEBAS]: Abilities.MAGIC_GUARD, + [Species.CASTFORM]: Abilities.ADAPTABILITY, + [Species.KECLEON]: Abilities.ADAPTABILITY, + [Species.SHUPPET]: Abilities.SHADOW_SHIELD, + [Species.DUSKULL]: Abilities.UNNERVE, + [Species.TROPIUS]: Abilities.RIPEN, + [Species.ABSOL]: Abilities.SHARPNESS, + [Species.WYNAUT]: Abilities.STURDY, + [Species.SNORUNT]: Abilities.SNOW_WARNING, + [Species.SPHEAL]: Abilities.UNAWARE, + [Species.CLAMPERL]: Abilities.DRIZZLE, + [Species.RELICANTH]: Abilities.PRIMORDIAL_SEA, + [Species.LUVDISC]: Abilities.MULTISCALE, + [Species.BAGON]: Abilities.DRAGONS_MAW, + [Species.BELDUM]: Abilities.LEVITATE, + [Species.REGIROCK]: Abilities.SAND_STREAM, + [Species.REGICE]: Abilities.SNOW_WARNING, + [Species.REGISTEEL]: Abilities.FILTER, + [Species.LATIAS]: Abilities.PRISM_ARMOR, + [Species.LATIOS]: Abilities.TINTED_LENS, + [Species.KYOGRE]: Abilities.MOLD_BREAKER, + [Species.GROUDON]: Abilities.TURBOBLAZE, + [Species.RAYQUAZA]: Abilities.UNNERVE, + [Species.JIRACHI]: Abilities.COMATOSE, + [Species.DEOXYS]: Abilities.PROTEAN, + [Species.TURTWIG]: Abilities.THICK_FAT, + [Species.CHIMCHAR]: Abilities.BEAST_BOOST, + [Species.PIPLUP]: Abilities.DRIZZLE, + [Species.STARLY]: Abilities.ROCK_HEAD, + [Species.BIDOOF]: Abilities.SAP_SIPPER, + [Species.KRICKETOT]: Abilities.SHARPNESS, + [Species.SHINX]: Abilities.SPEED_BOOST, + [Species.BUDEW]: Abilities.GRASSY_SURGE, + [Species.CRANIDOS]: Abilities.ROCK_HEAD, + [Species.SHIELDON]: Abilities.EARTH_EATER, + [Species.BURMY]: Abilities.STURDY, + [Species.COMBEE]: Abilities.INTIMIDATE, + [Species.PACHIRISU]: Abilities.HONEY_GATHER, + [Species.BUIZEL]: Abilities.MOXIE, + [Species.CHERUBI]: Abilities.ORICHALCUM_PULSE, + [Species.SHELLOS]: Abilities.REGENERATOR, + [Species.DRIFLOON]: Abilities.MAGIC_GUARD, + [Species.BUNEARY]: Abilities.ADAPTABILITY, + [Species.GLAMEOW]: Abilities.INTIMIDATE, + [Species.CHINGLING]: Abilities.PUNK_ROCK, + [Species.STUNKY]: Abilities.NEUTRALIZING_GAS, + [Species.BRONZOR]: Abilities.BULLETPROOF, + [Species.BONSLY]: Abilities.SAP_SIPPER, + [Species.MIME_JR]: Abilities.OPPORTUNIST, + [Species.HAPPINY]: Abilities.FUR_COAT, + [Species.CHATOT]: Abilities.PUNK_ROCK, + [Species.SPIRITOMB]: Abilities.VESSEL_OF_RUIN, + [Species.GIBLE]: Abilities.SAND_STREAM, + [Species.MUNCHLAX]: Abilities.RIPEN, + [Species.RIOLU]: Abilities.MINDS_EYE, + [Species.HIPPOPOTAS]: Abilities.UNAWARE, + [Species.SKORUPI]: Abilities.SUPER_LUCK, + [Species.CROAGUNK]: Abilities.MOXIE, + [Species.CARNIVINE]: Abilities.ARENA_TRAP, + [Species.FINNEON]: Abilities.WATER_BUBBLE, + [Species.MANTYKE]: Abilities.UNAWARE, + [Species.SNOVER]: Abilities.THICK_FAT, + [Species.ROTOM]: Abilities.HADRON_ENGINE, + [Species.UXIE]: Abilities.UNAWARE, + [Species.MESPRIT]: Abilities.MOODY, + [Species.AZELF]: Abilities.NEUROFORCE, + [Species.DIALGA]: Abilities.LEVITATE, + [Species.PALKIA]: Abilities.SPEED_BOOST, + [Species.HEATRAN]: Abilities.EARTH_EATER, + [Species.REGIGIGAS]: Abilities.SCRAPPY, + [Species.GIRATINA]: Abilities.SHADOW_SHIELD, + [Species.CRESSELIA]: Abilities.SHADOW_SHIELD, + [Species.PHIONE]: Abilities.SIMPLE, + [Species.MANAPHY]: Abilities.PRIMORDIAL_SEA, + [Species.DARKRAI]: Abilities.UNNERVE, + [Species.SHAYMIN]: Abilities.WIND_RIDER, + [Species.ARCEUS]: Abilities.ADAPTABILITY, + [Species.VICTINI]: Abilities.SHEER_FORCE, + [Species.SNIVY]: Abilities.MULTISCALE, + [Species.TEPIG]: Abilities.ROCK_HEAD, + [Species.OSHAWOTT]: Abilities.INTREPID_SWORD, + [Species.PATRAT]: Abilities.NO_GUARD, + [Species.LILLIPUP]: Abilities.FUR_COAT, + [Species.PURRLOIN]: Abilities.PICKUP, + [Species.PANSAGE]: Abilities.WELL_BAKED_BODY, + [Species.PANSEAR]: Abilities.WATER_ABSORB, + [Species.PANPOUR]: Abilities.SAP_SIPPER, + [Species.MUNNA]: Abilities.NEUTRALIZING_GAS, + [Species.PIDOVE]: Abilities.SNIPER, + [Species.BLITZLE]: Abilities.ELECTRIC_SURGE, + [Species.ROGGENROLA]: Abilities.SOLID_ROCK, + [Species.WOOBAT]: Abilities.OPPORTUNIST, + [Species.DRILBUR]: Abilities.SAND_STREAM, + [Species.AUDINO]: Abilities.FRIEND_GUARD, + [Species.TIMBURR]: Abilities.ROCKY_PAYLOAD, + [Species.TYMPOLE]: Abilities.POISON_HEAL, + [Species.THROH]: Abilities.STAMINA, + [Species.SAWK]: Abilities.SCRAPPY, + [Species.SEWADDLE]: Abilities.SHARPNESS, + [Species.VENIPEDE]: Abilities.STAMINA, + [Species.COTTONEE]: Abilities.FLUFFY, + [Species.PETILIL]: Abilities.SIMPLE, + [Species.BASCULIN]: Abilities.SUPREME_OVERLORD, + [Species.SANDILE]: Abilities.TOUGH_CLAWS, + [Species.DARUMAKA]: Abilities.GORILLA_TACTICS, + [Species.MARACTUS]: Abilities.WELL_BAKED_BODY, + [Species.DWEBBLE]: Abilities.ROCKY_PAYLOAD, + [Species.SCRAGGY]: Abilities.PROTEAN, + [Species.SIGILYPH]: Abilities.FLARE_BOOST, + [Species.YAMASK]: Abilities.PURIFYING_SALT, + [Species.TIRTOUGA]: Abilities.WATER_ABSORB, + [Species.ARCHEN]: Abilities.MULTISCALE, + [Species.TRUBBISH]: Abilities.NEUTRALIZING_GAS, + [Species.ZORUA]: Abilities.DARK_AURA, + [Species.MINCCINO]: Abilities.FUR_COAT, + [Species.GOTHITA]: Abilities.UNNERVE, + [Species.SOLOSIS]: Abilities.PSYCHIC_SURGE, + [Species.DUCKLETT]: Abilities.DRIZZLE, + [Species.VANILLITE]: Abilities.SLUSH_RUSH, + [Species.DEERLING]: Abilities.FUR_COAT, + [Species.EMOLGA]: Abilities.TRANSISTOR, + [Species.KARRABLAST]: Abilities.QUICK_DRAW, + [Species.FOONGUS]: Abilities.THICK_FAT, + [Species.FRILLISH]: Abilities.POISON_HEAL, + [Species.ALOMOMOLA]: Abilities.MULTISCALE, + [Species.JOLTIK]: Abilities.TRANSISTOR, + [Species.FERROSEED]: Abilities.ROUGH_SKIN, + [Species.KLINK]: Abilities.STEELY_SPIRIT, + [Species.TYNAMO]: Abilities.POISON_HEAL, + [Species.ELGYEM]: Abilities.PRISM_ARMOR, + [Species.LITWICK]: Abilities.SOUL_HEART, + [Species.AXEW]: Abilities.DRAGONS_MAW, + [Species.CUBCHOO]: Abilities.TOUGH_CLAWS, + [Species.CRYOGONAL]: Abilities.SNOW_WARNING, + [Species.SHELMET]: Abilities.PROTEAN, + [Species.STUNFISK]: Abilities.STORM_DRAIN, + [Species.MIENFOO]: Abilities.NO_GUARD, + [Species.DRUDDIGON]: Abilities.INTIMIDATE, + [Species.GOLETT]: Abilities.SHADOW_SHIELD, + [Species.PAWNIARD]: Abilities.SWORD_OF_RUIN, + [Species.BOUFFALANT]: Abilities.ROCK_HEAD, + [Species.RUFFLET]: Abilities.SPEED_BOOST, + [Species.VULLABY]: Abilities.THICK_FAT, + [Species.HEATMOR]: Abilities.CONTRARY, + [Species.DURANT]: Abilities.COMPOUND_EYES, + [Species.DEINO]: Abilities.PARENTAL_BOND, + [Species.LARVESTA]: Abilities.DROUGHT, + [Species.COBALION]: Abilities.INTREPID_SWORD, + [Species.TERRAKION]: Abilities.ROCKY_PAYLOAD, + [Species.VIRIZION]: Abilities.SHARPNESS, + [Species.TORNADUS]: Abilities.DRIZZLE, + [Species.THUNDURUS]: Abilities.DRIZZLE, + [Species.RESHIRAM]: Abilities.ORICHALCUM_PULSE, + [Species.ZEKROM]: Abilities.HADRON_ENGINE, + [Species.LANDORUS]: Abilities.STORM_DRAIN, + [Species.KYUREM]: Abilities.SNOW_WARNING, + [Species.KELDEO]: Abilities.GRIM_NEIGH, + [Species.MELOETTA]: Abilities.MINDS_EYE, + [Species.GENESECT]: Abilities.PROTEAN, + [Species.CHESPIN]: Abilities.DAUNTLESS_SHIELD, + [Species.FENNEKIN]: Abilities.PSYCHIC_SURGE, + [Species.FROAKIE]: Abilities.STAKEOUT, + [Species.BUNNELBY]: Abilities.GUTS, + [Species.FLETCHLING]: Abilities.MAGIC_GUARD, + [Species.SCATTERBUG]: Abilities.PRANKSTER, + [Species.LITLEO]: Abilities.BEAST_BOOST, + [Species.FLABEBE]: Abilities.GRASSY_SURGE, + [Species.SKIDDO]: Abilities.SEED_SOWER, + [Species.PANCHAM]: Abilities.FUR_COAT, + [Species.FURFROU]: Abilities.FLUFFY, + [Species.ESPURR]: Abilities.FUR_COAT, + [Species.HONEDGE]: Abilities.SHARPNESS, + [Species.SPRITZEE]: Abilities.FUR_COAT, + [Species.SWIRLIX]: Abilities.WELL_BAKED_BODY, + [Species.INKAY]: Abilities.UNNERVE, + [Species.BINACLE]: Abilities.SAP_SIPPER, + [Species.SKRELP]: Abilities.DRAGONS_MAW, + [Species.CLAUNCHER]: Abilities.SWIFT_SWIM, + [Species.HELIOPTILE]: Abilities.PROTEAN, + [Species.TYRUNT]: Abilities.RECKLESS, + [Species.AMAURA]: Abilities.ICE_SCALES, + [Species.HAWLUCHA]: Abilities.MOXIE, + [Species.DEDENNE]: Abilities.PIXILATE, + [Species.CARBINK]: Abilities.SOLID_ROCK, + [Species.GOOMY]: Abilities.REGENERATOR, + [Species.KLEFKI]: Abilities.LEVITATE, + [Species.PHANTUMP]: Abilities.SHADOW_TAG, + [Species.PUMPKABOO]: Abilities.WELL_BAKED_BODY, + [Species.BERGMITE]: Abilities.ICE_SCALES, + [Species.NOIBAT]: Abilities.PUNK_ROCK, + [Species.XERNEAS]: Abilities.HARVEST, + [Species.YVELTAL]: Abilities.SOUL_HEART, + [Species.ZYGARDE]: Abilities.HUGE_POWER, + [Species.DIANCIE]: Abilities.LEVITATE, + [Species.HOOPA]: Abilities.OPPORTUNIST, + [Species.VOLCANION]: Abilities.FILTER, + [Species.ROWLET]: Abilities.SNIPER, + [Species.LITTEN]: Abilities.OPPORTUNIST, + [Species.POPPLIO]: Abilities.PUNK_ROCK, + [Species.PIKIPEK]: Abilities.TECHNICIAN, + [Species.YUNGOOS]: Abilities.TOUGH_CLAWS, + [Species.GRUBBIN]: Abilities.SPEED_BOOST, + [Species.CRABRAWLER]: Abilities.WATER_BUBBLE, + [Species.ORICORIO]: Abilities.ADAPTABILITY, + [Species.CUTIEFLY]: Abilities.TINTED_LENS, + [Species.ROCKRUFF]: Abilities.ROCKY_PAYLOAD, + [Species.WISHIWASHI]: Abilities.REGENERATOR, + [Species.MAREANIE]: Abilities.TOXIC_DEBRIS, + [Species.MUDBRAY]: Abilities.CUD_CHEW, + [Species.DEWPIDER]: Abilities.TINTED_LENS, + [Species.FOMANTIS]: Abilities.SHARPNESS, + [Species.MORELULL]: Abilities.TRIAGE, + [Species.SALANDIT]: Abilities.DRAGONS_MAW, + [Species.STUFFUL]: Abilities.SCRAPPY, + [Species.BOUNSWEET]: Abilities.MOXIE, + [Species.COMFEY]: Abilities.FRIEND_GUARD, + [Species.ORANGURU]: Abilities.POWER_SPOT, + [Species.PASSIMIAN]: Abilities.LIBERO, + [Species.WIMPOD]: Abilities.REGENERATOR, + [Species.SANDYGAST]: Abilities.SAND_SPIT, + [Species.PYUKUMUKU]: Abilities.PURIFYING_SALT, + [Species.TYPE_NULL]: Abilities.ADAPTABILITY, + [Species.MINIOR]: Abilities.STURDY, + [Species.KOMALA]: Abilities.GUTS, + [Species.TURTONATOR]: Abilities.DAUNTLESS_SHIELD, + [Species.TOGEDEMARU]: Abilities.ROUGH_SKIN, + [Species.MIMIKYU]: Abilities.TOUGH_CLAWS, + [Species.BRUXISH]: Abilities.MULTISCALE, + [Species.DRAMPA]: Abilities.THICK_FAT, + [Species.DHELMISE]: Abilities.WATER_BUBBLE, + [Species.JANGMO_O]: Abilities.DAUNTLESS_SHIELD, + [Species.TAPU_KOKO]: Abilities.TRANSISTOR, + [Species.TAPU_LELE]: Abilities.SHEER_FORCE, + [Species.TAPU_BULU]: Abilities.TRIAGE, + [Species.TAPU_FINI]: Abilities.FAIRY_AURA, + [Species.COSMOG]: Abilities.BEAST_BOOST, + [Species.NIHILEGO]: Abilities.LEVITATE, + [Species.BUZZWOLE]: Abilities.MOXIE, + [Species.PHEROMOSA]: Abilities.TINTED_LENS, + [Species.XURKITREE]: Abilities.TRANSISTOR, + [Species.CELESTEELA]: Abilities.HEATPROOF, + [Species.KARTANA]: Abilities.SHARPNESS, + [Species.GUZZLORD]: Abilities.POISON_HEAL, + [Species.NECROZMA]: Abilities.BEAST_BOOST, + [Species.MAGEARNA]: Abilities.STEELY_SPIRIT, + [Species.MARSHADOW]: Abilities.IRON_FIST, + [Species.POIPOLE]: Abilities.SHEER_FORCE, + [Species.STAKATAKA]: Abilities.SOLID_ROCK, + [Species.BLACEPHALON]: Abilities.MAGIC_GUARD, + [Species.ZERAORA]: Abilities.TOUGH_CLAWS, + [Species.MELTAN]: Abilities.STEELY_SPIRIT, + [Species.GROOKEY]: Abilities.GRASS_PELT, + [Species.SCORBUNNY]: Abilities.NO_GUARD, + [Species.SOBBLE]: Abilities.SUPER_LUCK, + [Species.SKWOVET]: Abilities.HARVEST, + [Species.ROOKIDEE]: Abilities.IRON_BARBS, + [Species.BLIPBUG]: Abilities.PSYCHIC_SURGE, + [Species.NICKIT]: Abilities.MAGICIAN, + [Species.GOSSIFLEUR]: Abilities.GRASSY_SURGE, + [Species.WOOLOO]: Abilities.SIMPLE, + [Species.CHEWTLE]: Abilities.ROCKY_PAYLOAD, + [Species.YAMPER]: Abilities.SHEER_FORCE, + [Species.ROLYCOLY]: Abilities.SOLID_ROCK, + [Species.APPLIN]: Abilities.DRAGONS_MAW, + [Species.SILICOBRA]: Abilities.SAND_RUSH, + [Species.CRAMORANT]: Abilities.LIGHTNING_ROD, + [Species.ARROKUDA]: Abilities.INTIMIDATE, + [Species.TOXEL]: Abilities.ELECTRIC_SURGE, + [Species.SIZZLIPEDE]: Abilities.SPEED_BOOST, + [Species.CLOBBOPUS]: Abilities.WATER_BUBBLE, + [Species.SINISTEA]: Abilities.SHADOW_SHIELD, + [Species.HATENNA]: Abilities.FAIRY_AURA, + [Species.IMPIDIMP]: Abilities.FUR_COAT, + [Species.MILCERY]: Abilities.REGENERATOR, + [Species.FALINKS]: Abilities.PARENTAL_BOND, + [Species.PINCURCHIN]: Abilities.ELECTROMORPHOSIS, + [Species.SNOM]: Abilities.SNOW_WARNING, + [Species.STONJOURNER]: Abilities.STURDY, + [Species.EISCUE]: Abilities.ICE_SCALES, + [Species.INDEEDEE]: Abilities.FRIEND_GUARD, + [Species.MORPEKO]: Abilities.MOODY, + [Species.CUFANT]: Abilities.EARTH_EATER, + [Species.DRACOZOLT]: Abilities.NO_GUARD, + [Species.ARCTOZOLT]: Abilities.TRANSISTOR, + [Species.DRACOVISH]: Abilities.SWIFT_SWIM, + [Species.ARCTOVISH]: Abilities.STRONG_JAW, + [Species.DURALUDON]: Abilities.STEELWORKER, + [Species.DREEPY]: Abilities.PARENTAL_BOND, + [Species.ZACIAN]: Abilities.UNNERVE, + [Species.ZAMAZENTA]: Abilities.UNNERVE, + [Species.ETERNATUS]: Abilities.NEUTRALIZING_GAS, + [Species.KUBFU]: Abilities.IRON_FIST, + [Species.ZARUDE]: Abilities.TOUGH_CLAWS, + [Species.REGIELEKI]: Abilities.ELECTRIC_SURGE, + [Species.REGIDRAGO]: Abilities.MULTISCALE, + [Species.GLASTRIER]: Abilities.FILTER, + [Species.SPECTRIER]: Abilities.SHADOW_SHIELD, + [Species.CALYREX]: Abilities.HARVEST, + [Species.ENAMORUS]: Abilities.FAIRY_AURA, + [Species.SPRIGATITO]: Abilities.MAGICIAN, + [Species.FUECOCO]: Abilities.PUNK_ROCK, + [Species.QUAXLY]: Abilities.OPPORTUNIST, + [Species.LECHONK]: Abilities.SIMPLE, + [Species.TAROUNTULA]: Abilities.HONEY_GATHER, + [Species.NYMBLE]: Abilities.GUTS, + [Species.PAWMI]: Abilities.TRANSISTOR, + [Species.TANDEMAUS]: Abilities.SCRAPPY, + [Species.FIDOUGH]: Abilities.WATER_ABSORB, + [Species.SMOLIV]: Abilities.RIPEN, + [Species.SQUAWKABILLY]: Abilities.MOXIE, + [Species.NACLI]: Abilities.SOLID_ROCK, + [Species.CHARCADET]: Abilities.PRISM_ARMOR, + [Species.TADBULB]: Abilities.STAMINA, + [Species.WATTREL]: Abilities.SHEER_FORCE, + [Species.MASCHIFF]: Abilities.STRONG_JAW, + [Species.SHROODLE]: Abilities.CORROSION, + [Species.BRAMBLIN]: Abilities.SHADOW_SHIELD, + [Species.TOEDSCOOL]: Abilities.PRANKSTER, + [Species.KLAWF]: Abilities.WATER_ABSORB, + [Species.CAPSAKID]: Abilities.PARENTAL_BOND, + [Species.RELLOR]: Abilities.PRANKSTER, + [Species.FLITTLE]: Abilities.DAZZLING, + [Species.TINKATINK]: Abilities.STEELWORKER, + [Species.WIGLETT]: Abilities.STURDY, + [Species.BOMBIRDIER]: Abilities.UNBURDEN, + [Species.FINIZEN]: Abilities.IRON_FIST, + [Species.VAROOM]: Abilities.LEVITATE, + [Species.CYCLIZAR]: Abilities.PROTEAN, + [Species.ORTHWORM]: Abilities.REGENERATOR, + [Species.GLIMMET]: Abilities.LEVITATE, + [Species.GREAVARD]: Abilities.FUR_COAT, + [Species.FLAMIGO]: Abilities.MOXIE, + [Species.CETODDLE]: Abilities.ICE_SCALES, + [Species.VELUZA]: Abilities.SUPER_LUCK, + [Species.DONDOZO]: Abilities.PARENTAL_BOND, + [Species.TATSUGIRI]: Abilities.ADAPTABILITY, + [Species.GREAT_TUSK]: Abilities.INTIMIDATE, + [Species.SCREAM_TAIL]: Abilities.UNAWARE, + [Species.BRUTE_BONNET]: Abilities.CHLOROPHYLL, + [Species.FLUTTER_MANE]: Abilities.DAZZLING, + [Species.SLITHER_WING]: Abilities.SCRAPPY, + [Species.SANDY_SHOCKS]: Abilities.EARTH_EATER, + [Species.IRON_TREADS]: Abilities.STEELY_SPIRIT, + [Species.IRON_BUNDLE]: Abilities.SNOW_WARNING, + [Species.IRON_HANDS]: Abilities.IRON_FIST, + [Species.IRON_JUGULIS]: Abilities.LIGHTNING_ROD, + [Species.IRON_MOTH]: Abilities.LEVITATE, + [Species.IRON_THORNS]: Abilities.SAND_STREAM, + [Species.FRIGIBAX]: Abilities.SNOW_WARNING, + [Species.GIMMIGHOUL]: Abilities.HONEY_GATHER, + [Species.WO_CHIEN]: Abilities.VESSEL_OF_RUIN, + [Species.CHIEN_PAO]: Abilities.INTIMIDATE, + [Species.TING_LU]: Abilities.STAMINA, + [Species.CHI_YU]: Abilities.BERSERK, + [Species.ROARING_MOON]: Abilities.TOUGH_CLAWS, + [Species.IRON_VALIANT]: Abilities.ADAPTABILITY, + [Species.KORAIDON]: Abilities.OPPORTUNIST, + [Species.MIRAIDON]: Abilities.OPPORTUNIST, + [Species.WALKING_WAKE]: Abilities.BEAST_BOOST, + [Species.IRON_LEAVES]: Abilities.SHARPNESS, + [Species.POLTCHAGEIST]: Abilities.TRIAGE, + [Species.OKIDOGI]: Abilities.FUR_COAT, + [Species.MUNKIDORI]: Abilities.NEUROFORCE, + [Species.FEZANDIPITI]: Abilities.LEVITATE, + [Species.OGERPON]: Abilities.OPPORTUNIST, + [Species.GOUGING_FIRE]: Abilities.BEAST_BOOST, + [Species.RAGING_BOLT]: Abilities.BEAST_BOOST, + [Species.IRON_BOULDER]: Abilities.SHARPNESS, + [Species.IRON_CROWN]: Abilities.SHARPNESS, + [Species.TERAPAGOS]: Abilities.SOUL_HEART, + [Species.PECHARUNT]: Abilities.TOXIC_CHAIN, + [Species.ALOLA_RATTATA]: Abilities.ADAPTABILITY, + [Species.ALOLA_SANDSHREW]: Abilities.ICE_SCALES, + [Species.ALOLA_VULPIX]: Abilities.SHEER_FORCE, + [Species.ALOLA_DIGLETT]: Abilities.STURDY, + [Species.ALOLA_MEOWTH]: Abilities.DARK_AURA, + [Species.ALOLA_GEODUDE]: Abilities.DRY_SKIN, + [Species.ALOLA_GRIMER]: Abilities.TOXIC_DEBRIS, + [Species.ETERNAL_FLOETTE]: Abilities.MAGIC_GUARD, + [Species.GALAR_MEOWTH]: Abilities.STEELWORKER, + [Species.GALAR_PONYTA]: Abilities.MOXIE, + [Species.GALAR_SLOWPOKE]: Abilities.UNAWARE, + [Species.GALAR_FARFETCHD]: Abilities.INTREPID_SWORD, + [Species.GALAR_ARTICUNO]: Abilities.SERENE_GRACE, + [Species.GALAR_ZAPDOS]: Abilities.TOUGH_CLAWS, + [Species.GALAR_MOLTRES]: Abilities.DARK_AURA, + [Species.GALAR_CORSOLA]: Abilities.SHADOW_SHIELD, + [Species.GALAR_ZIGZAGOON]: Abilities.POISON_HEAL, + [Species.GALAR_DARUMAKA]: Abilities.FLASH_FIRE, + [Species.GALAR_YAMASK]: Abilities.TABLETS_OF_RUIN, + [Species.GALAR_STUNFISK]: Abilities.ARENA_TRAP, + [Species.HISUI_GROWLITHE]: Abilities.RECKLESS, + [Species.HISUI_VOLTORB]: Abilities.TRANSISTOR, + [Species.HISUI_QWILFISH]: Abilities.MERCILESS, + [Species.HISUI_SNEASEL]: Abilities.SCRAPPY, + [Species.HISUI_ZORUA]: Abilities.ADAPTABILITY, + [Species.PALDEA_TAUROS]: Abilities.ADAPTABILITY, + [Species.PALDEA_WOOPER]: Abilities.THICK_FAT, + [Species.BLOODMOON_URSALUNA]: Abilities.BERSERK +}; diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts index 43fbc11571d..5117f800086 100644 --- a/src/data/balance/starters.ts +++ b/src/data/balance/starters.ts @@ -1,8 +1,12 @@ -import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; export const POKERUS_STARTER_COUNT = 5; +/** + * Function to get the cumulative friendship threshold at which a candy is earned + * @param starterCost The cost of the starter, found in {@linkcode speciesStarterCosts} + * @returns aforementioned threshold + */ export function getStarterValueFriendshipCap(starterCost: number): number { switch (starterCost) { case 1: @@ -27,7 +31,7 @@ export function getStarterValueFriendshipCap(starterCost: number): number { } } -export const speciesStarters = { +export const speciesStarterCosts = { [Species.BULBASAUR]: 3, [Species.CHARMANDER]: 3, [Species.SQUIRTLE]: 3, @@ -625,578 +629,6 @@ export const speciesStarters = { [Species.BLOODMOON_URSALUNA]: 6, }; -export const starterPassiveAbilities = { - [Species.BULBASAUR]: Abilities.GRASSY_SURGE, - [Species.CHARMANDER]: Abilities.BEAST_BOOST, - [Species.SQUIRTLE]: Abilities.STURDY, - [Species.CATERPIE]: Abilities.MAGICIAN, - [Species.WEEDLE]: Abilities.TINTED_LENS, - [Species.PIDGEY]: Abilities.SHEER_FORCE, - [Species.RATTATA]: Abilities.STRONG_JAW, - [Species.SPEAROW]: Abilities.MOXIE, - [Species.EKANS]: Abilities.REGENERATOR, - [Species.SANDSHREW]: Abilities.TOUGH_CLAWS, - [Species.NIDORAN_F]: Abilities.FLARE_BOOST, - [Species.NIDORAN_M]: Abilities.GUTS, - [Species.VULPIX]: Abilities.FUR_COAT, - [Species.ZUBAT]: Abilities.INTIMIDATE, - [Species.ODDISH]: Abilities.TRIAGE, - [Species.PARAS]: Abilities.TRIAGE, - [Species.VENONAT]: Abilities.SIMPLE, - [Species.DIGLETT]: Abilities.STURDY, - [Species.MEOWTH]: Abilities.TOUGH_CLAWS, - [Species.PSYDUCK]: Abilities.SIMPLE, - [Species.MANKEY]: Abilities.IRON_FIST, - [Species.GROWLITHE]: Abilities.SPEED_BOOST, - [Species.POLIWAG]: Abilities.NO_GUARD, - [Species.ABRA]: Abilities.PSYCHIC_SURGE, - [Species.MACHOP]: Abilities.QUICK_FEET, - [Species.BELLSPROUT]: Abilities.FLOWER_GIFT, - [Species.TENTACOOL]: Abilities.TOXIC_CHAIN, - [Species.GEODUDE]: Abilities.DRY_SKIN, - [Species.PONYTA]: Abilities.MAGIC_GUARD, - [Species.SLOWPOKE]: Abilities.UNAWARE, - [Species.MAGNEMITE]: Abilities.LEVITATE, - [Species.FARFETCHD]: Abilities.SNIPER, - [Species.DODUO]: Abilities.PARENTAL_BOND, - [Species.SEEL]: Abilities.WATER_BUBBLE, - [Species.GRIMER]: Abilities.WATER_ABSORB, - [Species.SHELLDER]: Abilities.ICE_SCALES, - [Species.GASTLY]: Abilities.SHADOW_SHIELD, - [Species.ONIX]: Abilities.ROCKY_PAYLOAD, - [Species.DROWZEE]: Abilities.MAGICIAN, - [Species.KRABBY]: Abilities.THERMAL_EXCHANGE, - [Species.VOLTORB]: Abilities.TRANSISTOR, - [Species.EXEGGCUTE]: Abilities.RIPEN, - [Species.CUBONE]: Abilities.PARENTAL_BOND, - [Species.LICKITUNG]: Abilities.CHEEK_POUCH, - [Species.KOFFING]: Abilities.PARENTAL_BOND, - [Species.RHYHORN]: Abilities.FILTER, - [Species.TANGELA]: Abilities.SEED_SOWER, - [Species.KANGASKHAN]: Abilities.GUTS, - [Species.HORSEA]: Abilities.DRAGONS_MAW, - [Species.GOLDEEN]: Abilities.MULTISCALE, - [Species.STARYU]: Abilities.REGENERATOR, - [Species.SCYTHER]: Abilities.TINTED_LENS, - [Species.PINSIR]: Abilities.TINTED_LENS, - [Species.TAUROS]: Abilities.STAMINA, - [Species.MAGIKARP]: Abilities.MULTISCALE, - [Species.LAPRAS]: Abilities.LIGHTNING_ROD, - [Species.DITTO]: Abilities.ADAPTABILITY, - [Species.EEVEE]: Abilities.PICKUP, - [Species.PORYGON]: Abilities.PROTEAN, - [Species.OMANYTE]: Abilities.STURDY, - [Species.KABUTO]: Abilities.TOUGH_CLAWS, - [Species.AERODACTYL]: Abilities.ORICHALCUM_PULSE, - [Species.ARTICUNO]: Abilities.SNOW_WARNING, - [Species.ZAPDOS]: Abilities.DRIZZLE, - [Species.MOLTRES]: Abilities.DROUGHT, - [Species.DRATINI]: Abilities.AERILATE, - [Species.MEWTWO]: Abilities.NEUROFORCE, - [Species.MEW]: Abilities.PROTEAN, - [Species.CHIKORITA]: Abilities.THICK_FAT, - [Species.CYNDAQUIL]: Abilities.DROUGHT, - [Species.TOTODILE]: Abilities.TOUGH_CLAWS, - [Species.SENTRET]: Abilities.PICKUP, - [Species.HOOTHOOT]: Abilities.AERILATE, - [Species.LEDYBA]: Abilities.PRANKSTER, - [Species.SPINARAK]: Abilities.PRANKSTER, - [Species.CHINCHOU]: Abilities.WATER_BUBBLE, - [Species.PICHU]: Abilities.ELECTRIC_SURGE, - [Species.CLEFFA]: Abilities.ANALYTIC, - [Species.IGGLYBUFF]: Abilities.HUGE_POWER, - [Species.TOGEPI]: Abilities.PIXILATE, - [Species.NATU]: Abilities.TINTED_LENS, - [Species.MAREEP]: Abilities.ELECTROMORPHOSIS, - [Species.HOPPIP]: Abilities.FLUFFY, - [Species.AIPOM]: Abilities.SCRAPPY, - [Species.SUNKERN]: Abilities.DROUGHT, - [Species.YANMA]: Abilities.SHEER_FORCE, - [Species.WOOPER]: Abilities.COMATOSE, - [Species.MURKROW]: Abilities.DARK_AURA, - [Species.MISDREAVUS]: Abilities.BEADS_OF_RUIN, - [Species.UNOWN]: Abilities.PICKUP, - [Species.GIRAFARIG]: Abilities.PARENTAL_BOND, - [Species.PINECO]: Abilities.IRON_BARBS, - [Species.DUNSPARCE]: Abilities.UNAWARE, - [Species.GLIGAR]: Abilities.TOXIC_BOOST, - [Species.SNUBBULL]: Abilities.PIXILATE, - [Species.QWILFISH]: Abilities.TOXIC_DEBRIS, - [Species.SHUCKLE]: Abilities.HARVEST, - [Species.HERACROSS]: Abilities.TECHNICIAN, - [Species.SNEASEL]: Abilities.TOUGH_CLAWS, - [Species.TEDDIURSA]: Abilities.THICK_FAT, - [Species.SLUGMA]: Abilities.DESOLATE_LAND, - [Species.SWINUB]: Abilities.SLUSH_RUSH, - [Species.CORSOLA]: Abilities.STORM_DRAIN, - [Species.REMORAID]: Abilities.SIMPLE, - [Species.DELIBIRD]: Abilities.HUGE_POWER, - [Species.SKARMORY]: Abilities.LIGHTNING_ROD, - [Species.HOUNDOUR]: Abilities.DROUGHT, - [Species.PHANPY]: Abilities.SPEED_BOOST, - [Species.STANTLER]: Abilities.SPEED_BOOST, - [Species.SMEARGLE]: Abilities.PRANKSTER, - [Species.TYROGUE]: Abilities.MOXIE, - [Species.SMOOCHUM]: Abilities.PSYCHIC_SURGE, - [Species.ELEKID]: Abilities.SHEER_FORCE, - [Species.MAGBY]: Abilities.CONTRARY, - [Species.MILTANK]: Abilities.STAMINA, - [Species.RAIKOU]: Abilities.TRANSISTOR, - [Species.ENTEI]: Abilities.MOXIE, - [Species.SUICUNE]: Abilities.UNAWARE, - [Species.LARVITAR]: Abilities.SAND_RUSH, - [Species.LUGIA]: Abilities.DELTA_STREAM, - [Species.HO_OH]: Abilities.MAGIC_GUARD, - [Species.CELEBI]: Abilities.PSYCHIC_SURGE, - [Species.TREECKO]: Abilities.TINTED_LENS, - [Species.TORCHIC]: Abilities.RECKLESS, - [Species.MUDKIP]: Abilities.DRIZZLE, - [Species.POOCHYENA]: Abilities.TOUGH_CLAWS, - [Species.ZIGZAGOON]: Abilities.RUN_AWAY, - [Species.WURMPLE]: Abilities.SIMPLE, - [Species.LOTAD]: Abilities.DRIZZLE, - [Species.SEEDOT]: Abilities.SHARPNESS, - [Species.TAILLOW]: Abilities.AERILATE, - [Species.WINGULL]: Abilities.SWIFT_SWIM, - [Species.RALTS]: Abilities.PSYCHIC_SURGE, - [Species.SURSKIT]: Abilities.WATER_BUBBLE, - [Species.SHROOMISH]: Abilities.GUTS, - [Species.SLAKOTH]: Abilities.GUTS, - [Species.NINCADA]: Abilities.MAGIC_GUARD, - [Species.WHISMUR]: Abilities.PUNK_ROCK, - [Species.MAKUHITA]: Abilities.STAMINA, - [Species.AZURILL]: Abilities.MISTY_SURGE, - [Species.NOSEPASS]: Abilities.LEVITATE, - [Species.SKITTY]: Abilities.SCRAPPY, - [Species.SABLEYE]: Abilities.UNNERVE, - [Species.MAWILE]: Abilities.UNNERVE, - [Species.ARON]: Abilities.EARTH_EATER, - [Species.MEDITITE]: Abilities.MINDS_EYE, - [Species.ELECTRIKE]: Abilities.ELECTRIC_SURGE, - [Species.PLUSLE]: Abilities.POWER_SPOT, - [Species.MINUN]: Abilities.POWER_SPOT, - [Species.VOLBEAT]: Abilities.HONEY_GATHER, - [Species.ILLUMISE]: Abilities.HONEY_GATHER, - [Species.GULPIN]: Abilities.EARTH_EATER, - [Species.CARVANHA]: Abilities.SHEER_FORCE, - [Species.WAILMER]: Abilities.LEVITATE, - [Species.NUMEL]: Abilities.FUR_COAT, - [Species.TORKOAL]: Abilities.ANALYTIC, - [Species.SPOINK]: Abilities.PSYCHIC_SURGE, - [Species.SPINDA]: Abilities.SIMPLE, - [Species.TRAPINCH]: Abilities.ADAPTABILITY, - [Species.CACNEA]: Abilities.SAND_RUSH, - [Species.SWABLU]: Abilities.ADAPTABILITY, - [Species.ZANGOOSE]: Abilities.POISON_HEAL, - [Species.SEVIPER]: Abilities.MULTISCALE, - [Species.LUNATONE]: Abilities.SHADOW_SHIELD, - [Species.SOLROCK]: Abilities.DROUGHT, - [Species.BARBOACH]: Abilities.SIMPLE, - [Species.CORPHISH]: Abilities.TOUGH_CLAWS, - [Species.BALTOY]: Abilities.WELL_BAKED_BODY, - [Species.LILEEP]: Abilities.SEED_SOWER, - [Species.ANORITH]: Abilities.WATER_ABSORB, - [Species.FEEBAS]: Abilities.MAGIC_GUARD, - [Species.CASTFORM]: Abilities.ADAPTABILITY, - [Species.KECLEON]: Abilities.ADAPTABILITY, - [Species.SHUPPET]: Abilities.SHADOW_SHIELD, - [Species.DUSKULL]: Abilities.UNNERVE, - [Species.TROPIUS]: Abilities.RIPEN, - [Species.ABSOL]: Abilities.SHARPNESS, - [Species.WYNAUT]: Abilities.STURDY, - [Species.SNORUNT]: Abilities.SNOW_WARNING, - [Species.SPHEAL]: Abilities.UNAWARE, - [Species.CLAMPERL]: Abilities.DRIZZLE, - [Species.RELICANTH]: Abilities.PRIMORDIAL_SEA, - [Species.LUVDISC]: Abilities.MULTISCALE, - [Species.BAGON]: Abilities.DRAGONS_MAW, - [Species.BELDUM]: Abilities.LEVITATE, - [Species.REGIROCK]: Abilities.SAND_STREAM, - [Species.REGICE]: Abilities.SNOW_WARNING, - [Species.REGISTEEL]: Abilities.FILTER, - [Species.LATIAS]: Abilities.PRISM_ARMOR, - [Species.LATIOS]: Abilities.TINTED_LENS, - [Species.KYOGRE]: Abilities.MOLD_BREAKER, - [Species.GROUDON]: Abilities.TURBOBLAZE, - [Species.RAYQUAZA]: Abilities.UNNERVE, - [Species.JIRACHI]: Abilities.COMATOSE, - [Species.DEOXYS]: Abilities.PROTEAN, - [Species.TURTWIG]: Abilities.THICK_FAT, - [Species.CHIMCHAR]: Abilities.BEAST_BOOST, - [Species.PIPLUP]: Abilities.DRIZZLE, - [Species.STARLY]: Abilities.ROCK_HEAD, - [Species.BIDOOF]: Abilities.SAP_SIPPER, - [Species.KRICKETOT]: Abilities.SHARPNESS, - [Species.SHINX]: Abilities.SPEED_BOOST, - [Species.BUDEW]: Abilities.GRASSY_SURGE, - [Species.CRANIDOS]: Abilities.ROCK_HEAD, - [Species.SHIELDON]: Abilities.EARTH_EATER, - [Species.BURMY]: Abilities.STURDY, - [Species.COMBEE]: Abilities.INTIMIDATE, - [Species.PACHIRISU]: Abilities.HONEY_GATHER, - [Species.BUIZEL]: Abilities.MOXIE, - [Species.CHERUBI]: Abilities.ORICHALCUM_PULSE, - [Species.SHELLOS]: Abilities.REGENERATOR, - [Species.DRIFLOON]: Abilities.MAGIC_GUARD, - [Species.BUNEARY]: Abilities.ADAPTABILITY, - [Species.GLAMEOW]: Abilities.INTIMIDATE, - [Species.CHINGLING]: Abilities.PUNK_ROCK, - [Species.STUNKY]: Abilities.NEUTRALIZING_GAS, - [Species.BRONZOR]: Abilities.BULLETPROOF, - [Species.BONSLY]: Abilities.SAP_SIPPER, - [Species.MIME_JR]: Abilities.OPPORTUNIST, - [Species.HAPPINY]: Abilities.FUR_COAT, - [Species.CHATOT]: Abilities.PUNK_ROCK, - [Species.SPIRITOMB]: Abilities.VESSEL_OF_RUIN, - [Species.GIBLE]: Abilities.SAND_STREAM, - [Species.MUNCHLAX]: Abilities.RIPEN, - [Species.RIOLU]: Abilities.MINDS_EYE, - [Species.HIPPOPOTAS]: Abilities.UNAWARE, - [Species.SKORUPI]: Abilities.SUPER_LUCK, - [Species.CROAGUNK]: Abilities.MOXIE, - [Species.CARNIVINE]: Abilities.ARENA_TRAP, - [Species.FINNEON]: Abilities.WATER_BUBBLE, - [Species.MANTYKE]: Abilities.UNAWARE, - [Species.SNOVER]: Abilities.THICK_FAT, - [Species.ROTOM]: Abilities.HADRON_ENGINE, - [Species.UXIE]: Abilities.UNAWARE, - [Species.MESPRIT]: Abilities.MOODY, - [Species.AZELF]: Abilities.NEUROFORCE, - [Species.DIALGA]: Abilities.LEVITATE, - [Species.PALKIA]: Abilities.SPEED_BOOST, - [Species.HEATRAN]: Abilities.EARTH_EATER, - [Species.REGIGIGAS]: Abilities.SCRAPPY, - [Species.GIRATINA]: Abilities.SHADOW_SHIELD, - [Species.CRESSELIA]: Abilities.SHADOW_SHIELD, - [Species.PHIONE]: Abilities.SIMPLE, - [Species.MANAPHY]: Abilities.PRIMORDIAL_SEA, - [Species.DARKRAI]: Abilities.UNNERVE, - [Species.SHAYMIN]: Abilities.WIND_RIDER, - [Species.ARCEUS]: Abilities.ADAPTABILITY, - [Species.VICTINI]: Abilities.SHEER_FORCE, - [Species.SNIVY]: Abilities.MULTISCALE, - [Species.TEPIG]: Abilities.ROCK_HEAD, - [Species.OSHAWOTT]: Abilities.INTREPID_SWORD, - [Species.PATRAT]: Abilities.NO_GUARD, - [Species.LILLIPUP]: Abilities.FUR_COAT, - [Species.PURRLOIN]: Abilities.PICKUP, - [Species.PANSAGE]: Abilities.WELL_BAKED_BODY, - [Species.PANSEAR]: Abilities.WATER_ABSORB, - [Species.PANPOUR]: Abilities.SAP_SIPPER, - [Species.MUNNA]: Abilities.NEUTRALIZING_GAS, - [Species.PIDOVE]: Abilities.SNIPER, - [Species.BLITZLE]: Abilities.ELECTRIC_SURGE, - [Species.ROGGENROLA]: Abilities.SOLID_ROCK, - [Species.WOOBAT]: Abilities.OPPORTUNIST, - [Species.DRILBUR]: Abilities.SAND_STREAM, - [Species.AUDINO]: Abilities.FRIEND_GUARD, - [Species.TIMBURR]: Abilities.ROCKY_PAYLOAD, - [Species.TYMPOLE]: Abilities.POISON_HEAL, - [Species.THROH]: Abilities.STAMINA, - [Species.SAWK]: Abilities.SCRAPPY, - [Species.SEWADDLE]: Abilities.SHARPNESS, - [Species.VENIPEDE]: Abilities.STAMINA, - [Species.COTTONEE]: Abilities.FLUFFY, - [Species.PETILIL]: Abilities.SIMPLE, - [Species.BASCULIN]: Abilities.SUPREME_OVERLORD, - [Species.SANDILE]: Abilities.TOUGH_CLAWS, - [Species.DARUMAKA]: Abilities.GORILLA_TACTICS, - [Species.MARACTUS]: Abilities.WELL_BAKED_BODY, - [Species.DWEBBLE]: Abilities.ROCKY_PAYLOAD, - [Species.SCRAGGY]: Abilities.PROTEAN, - [Species.SIGILYPH]: Abilities.FLARE_BOOST, - [Species.YAMASK]: Abilities.PURIFYING_SALT, - [Species.TIRTOUGA]: Abilities.WATER_ABSORB, - [Species.ARCHEN]: Abilities.MULTISCALE, - [Species.TRUBBISH]: Abilities.NEUTRALIZING_GAS, - [Species.ZORUA]: Abilities.DARK_AURA, - [Species.MINCCINO]: Abilities.FUR_COAT, - [Species.GOTHITA]: Abilities.UNNERVE, - [Species.SOLOSIS]: Abilities.PSYCHIC_SURGE, - [Species.DUCKLETT]: Abilities.DRIZZLE, - [Species.VANILLITE]: Abilities.SLUSH_RUSH, - [Species.DEERLING]: Abilities.FUR_COAT, - [Species.EMOLGA]: Abilities.TRANSISTOR, - [Species.KARRABLAST]: Abilities.QUICK_DRAW, - [Species.FOONGUS]: Abilities.THICK_FAT, - [Species.FRILLISH]: Abilities.POISON_HEAL, - [Species.ALOMOMOLA]: Abilities.MULTISCALE, - [Species.JOLTIK]: Abilities.TRANSISTOR, - [Species.FERROSEED]: Abilities.ROUGH_SKIN, - [Species.KLINK]: Abilities.STEELY_SPIRIT, - [Species.TYNAMO]: Abilities.POISON_HEAL, - [Species.ELGYEM]: Abilities.PRISM_ARMOR, - [Species.LITWICK]: Abilities.SOUL_HEART, - [Species.AXEW]: Abilities.DRAGONS_MAW, - [Species.CUBCHOO]: Abilities.TOUGH_CLAWS, - [Species.CRYOGONAL]: Abilities.SNOW_WARNING, - [Species.SHELMET]: Abilities.PROTEAN, - [Species.STUNFISK]: Abilities.STORM_DRAIN, - [Species.MIENFOO]: Abilities.NO_GUARD, - [Species.DRUDDIGON]: Abilities.INTIMIDATE, - [Species.GOLETT]: Abilities.SHADOW_SHIELD, - [Species.PAWNIARD]: Abilities.SWORD_OF_RUIN, - [Species.BOUFFALANT]: Abilities.ROCK_HEAD, - [Species.RUFFLET]: Abilities.SPEED_BOOST, - [Species.VULLABY]: Abilities.THICK_FAT, - [Species.HEATMOR]: Abilities.CONTRARY, - [Species.DURANT]: Abilities.COMPOUND_EYES, - [Species.DEINO]: Abilities.PARENTAL_BOND, - [Species.LARVESTA]: Abilities.DROUGHT, - [Species.COBALION]: Abilities.INTREPID_SWORD, - [Species.TERRAKION]: Abilities.ROCKY_PAYLOAD, - [Species.VIRIZION]: Abilities.SHARPNESS, - [Species.TORNADUS]: Abilities.DRIZZLE, - [Species.THUNDURUS]: Abilities.DRIZZLE, - [Species.RESHIRAM]: Abilities.ORICHALCUM_PULSE, - [Species.ZEKROM]: Abilities.HADRON_ENGINE, - [Species.LANDORUS]: Abilities.STORM_DRAIN, - [Species.KYUREM]: Abilities.SNOW_WARNING, - [Species.KELDEO]: Abilities.GRIM_NEIGH, - [Species.MELOETTA]: Abilities.MINDS_EYE, - [Species.GENESECT]: Abilities.PROTEAN, - [Species.CHESPIN]: Abilities.DAUNTLESS_SHIELD, - [Species.FENNEKIN]: Abilities.PSYCHIC_SURGE, - [Species.FROAKIE]: Abilities.STAKEOUT, - [Species.BUNNELBY]: Abilities.GUTS, - [Species.FLETCHLING]: Abilities.MAGIC_GUARD, - [Species.SCATTERBUG]: Abilities.PRANKSTER, - [Species.LITLEO]: Abilities.BEAST_BOOST, - [Species.FLABEBE]: Abilities.GRASSY_SURGE, - [Species.SKIDDO]: Abilities.SEED_SOWER, - [Species.PANCHAM]: Abilities.FUR_COAT, - [Species.FURFROU]: Abilities.FLUFFY, - [Species.ESPURR]: Abilities.FUR_COAT, - [Species.HONEDGE]: Abilities.SHARPNESS, - [Species.SPRITZEE]: Abilities.FUR_COAT, - [Species.SWIRLIX]: Abilities.WELL_BAKED_BODY, - [Species.INKAY]: Abilities.UNNERVE, - [Species.BINACLE]: Abilities.SAP_SIPPER, - [Species.SKRELP]: Abilities.DRAGONS_MAW, - [Species.CLAUNCHER]: Abilities.SWIFT_SWIM, - [Species.HELIOPTILE]: Abilities.PROTEAN, - [Species.TYRUNT]: Abilities.RECKLESS, - [Species.AMAURA]: Abilities.ICE_SCALES, - [Species.HAWLUCHA]: Abilities.MOXIE, - [Species.DEDENNE]: Abilities.PIXILATE, - [Species.CARBINK]: Abilities.SOLID_ROCK, - [Species.GOOMY]: Abilities.REGENERATOR, - [Species.KLEFKI]: Abilities.LEVITATE, - [Species.PHANTUMP]: Abilities.SHADOW_TAG, - [Species.PUMPKABOO]: Abilities.WELL_BAKED_BODY, - [Species.BERGMITE]: Abilities.ICE_SCALES, - [Species.NOIBAT]: Abilities.PUNK_ROCK, - [Species.XERNEAS]: Abilities.HARVEST, - [Species.YVELTAL]: Abilities.SOUL_HEART, - [Species.ZYGARDE]: Abilities.HUGE_POWER, - [Species.DIANCIE]: Abilities.LEVITATE, - [Species.HOOPA]: Abilities.OPPORTUNIST, - [Species.VOLCANION]: Abilities.FILTER, - [Species.ROWLET]: Abilities.SNIPER, - [Species.LITTEN]: Abilities.OPPORTUNIST, - [Species.POPPLIO]: Abilities.PUNK_ROCK, - [Species.PIKIPEK]: Abilities.TECHNICIAN, - [Species.YUNGOOS]: Abilities.TOUGH_CLAWS, - [Species.GRUBBIN]: Abilities.SPEED_BOOST, - [Species.CRABRAWLER]: Abilities.WATER_BUBBLE, - [Species.ORICORIO]: Abilities.ADAPTABILITY, - [Species.CUTIEFLY]: Abilities.TINTED_LENS, - [Species.ROCKRUFF]: Abilities.ROCKY_PAYLOAD, - [Species.WISHIWASHI]: Abilities.REGENERATOR, - [Species.MAREANIE]: Abilities.TOXIC_DEBRIS, - [Species.MUDBRAY]: Abilities.CUD_CHEW, - [Species.DEWPIDER]: Abilities.TINTED_LENS, - [Species.FOMANTIS]: Abilities.SHARPNESS, - [Species.MORELULL]: Abilities.TRIAGE, - [Species.SALANDIT]: Abilities.DRAGONS_MAW, - [Species.STUFFUL]: Abilities.SCRAPPY, - [Species.BOUNSWEET]: Abilities.MOXIE, - [Species.COMFEY]: Abilities.FRIEND_GUARD, - [Species.ORANGURU]: Abilities.POWER_SPOT, - [Species.PASSIMIAN]: Abilities.LIBERO, - [Species.WIMPOD]: Abilities.REGENERATOR, - [Species.SANDYGAST]: Abilities.SAND_SPIT, - [Species.PYUKUMUKU]: Abilities.PURIFYING_SALT, - [Species.TYPE_NULL]: Abilities.ADAPTABILITY, - [Species.MINIOR]: Abilities.STURDY, - [Species.KOMALA]: Abilities.GUTS, - [Species.TURTONATOR]: Abilities.DAUNTLESS_SHIELD, - [Species.TOGEDEMARU]: Abilities.ROUGH_SKIN, - [Species.MIMIKYU]: Abilities.TOUGH_CLAWS, - [Species.BRUXISH]: Abilities.MULTISCALE, - [Species.DRAMPA]: Abilities.THICK_FAT, - [Species.DHELMISE]: Abilities.WATER_BUBBLE, - [Species.JANGMO_O]: Abilities.DAUNTLESS_SHIELD, - [Species.TAPU_KOKO]: Abilities.TRANSISTOR, - [Species.TAPU_LELE]: Abilities.SHEER_FORCE, - [Species.TAPU_BULU]: Abilities.TRIAGE, - [Species.TAPU_FINI]: Abilities.FAIRY_AURA, - [Species.COSMOG]: Abilities.BEAST_BOOST, - [Species.NIHILEGO]: Abilities.LEVITATE, - [Species.BUZZWOLE]: Abilities.MOXIE, - [Species.PHEROMOSA]: Abilities.TINTED_LENS, - [Species.XURKITREE]: Abilities.TRANSISTOR, - [Species.CELESTEELA]: Abilities.HEATPROOF, - [Species.KARTANA]: Abilities.SHARPNESS, - [Species.GUZZLORD]: Abilities.POISON_HEAL, - [Species.NECROZMA]: Abilities.BEAST_BOOST, - [Species.MAGEARNA]: Abilities.STEELY_SPIRIT, - [Species.MARSHADOW]: Abilities.IRON_FIST, - [Species.POIPOLE]: Abilities.SHEER_FORCE, - [Species.STAKATAKA]: Abilities.SOLID_ROCK, - [Species.BLACEPHALON]: Abilities.MAGIC_GUARD, - [Species.ZERAORA]: Abilities.TOUGH_CLAWS, - [Species.MELTAN]: Abilities.STEELY_SPIRIT, - [Species.GROOKEY]: Abilities.GRASS_PELT, - [Species.SCORBUNNY]: Abilities.NO_GUARD, - [Species.SOBBLE]: Abilities.SUPER_LUCK, - [Species.SKWOVET]: Abilities.HARVEST, - [Species.ROOKIDEE]: Abilities.IRON_BARBS, - [Species.BLIPBUG]: Abilities.PSYCHIC_SURGE, - [Species.NICKIT]: Abilities.MAGICIAN, - [Species.GOSSIFLEUR]: Abilities.GRASSY_SURGE, - [Species.WOOLOO]: Abilities.SIMPLE, - [Species.CHEWTLE]: Abilities.ROCKY_PAYLOAD, - [Species.YAMPER]: Abilities.SHEER_FORCE, - [Species.ROLYCOLY]: Abilities.SOLID_ROCK, - [Species.APPLIN]: Abilities.DRAGONS_MAW, - [Species.SILICOBRA]: Abilities.SAND_RUSH, - [Species.CRAMORANT]: Abilities.LIGHTNING_ROD, - [Species.ARROKUDA]: Abilities.INTIMIDATE, - [Species.TOXEL]: Abilities.ELECTRIC_SURGE, - [Species.SIZZLIPEDE]: Abilities.SPEED_BOOST, - [Species.CLOBBOPUS]: Abilities.WATER_BUBBLE, - [Species.SINISTEA]: Abilities.SHADOW_SHIELD, - [Species.HATENNA]: Abilities.FAIRY_AURA, - [Species.IMPIDIMP]: Abilities.FUR_COAT, - [Species.MILCERY]: Abilities.REGENERATOR, - [Species.FALINKS]: Abilities.PARENTAL_BOND, - [Species.PINCURCHIN]: Abilities.ELECTROMORPHOSIS, - [Species.SNOM]: Abilities.SNOW_WARNING, - [Species.STONJOURNER]: Abilities.STURDY, - [Species.EISCUE]: Abilities.ICE_SCALES, - [Species.INDEEDEE]: Abilities.FRIEND_GUARD, - [Species.MORPEKO]: Abilities.MOODY, - [Species.CUFANT]: Abilities.EARTH_EATER, - [Species.DRACOZOLT]: Abilities.NO_GUARD, - [Species.ARCTOZOLT]: Abilities.TRANSISTOR, - [Species.DRACOVISH]: Abilities.SWIFT_SWIM, - [Species.ARCTOVISH]: Abilities.STRONG_JAW, - [Species.DURALUDON]: Abilities.STEELWORKER, - [Species.DREEPY]: Abilities.PARENTAL_BOND, - [Species.ZACIAN]: Abilities.UNNERVE, - [Species.ZAMAZENTA]: Abilities.UNNERVE, - [Species.ETERNATUS]: Abilities.NEUTRALIZING_GAS, - [Species.KUBFU]: Abilities.IRON_FIST, - [Species.ZARUDE]: Abilities.TOUGH_CLAWS, - [Species.REGIELEKI]: Abilities.ELECTRIC_SURGE, - [Species.REGIDRAGO]: Abilities.MULTISCALE, - [Species.GLASTRIER]: Abilities.FILTER, - [Species.SPECTRIER]: Abilities.SHADOW_SHIELD, - [Species.CALYREX]: Abilities.HARVEST, - [Species.ENAMORUS]: Abilities.FAIRY_AURA, - [Species.SPRIGATITO]: Abilities.MAGICIAN, - [Species.FUECOCO]: Abilities.PUNK_ROCK, - [Species.QUAXLY]: Abilities.OPPORTUNIST, - [Species.LECHONK]: Abilities.SIMPLE, - [Species.TAROUNTULA]: Abilities.HONEY_GATHER, - [Species.NYMBLE]: Abilities.GUTS, - [Species.PAWMI]: Abilities.TRANSISTOR, - [Species.TANDEMAUS]: Abilities.SCRAPPY, - [Species.FIDOUGH]: Abilities.WATER_ABSORB, - [Species.SMOLIV]: Abilities.RIPEN, - [Species.SQUAWKABILLY]: Abilities.MOXIE, - [Species.NACLI]: Abilities.SOLID_ROCK, - [Species.CHARCADET]: Abilities.PRISM_ARMOR, - [Species.TADBULB]: Abilities.STAMINA, - [Species.WATTREL]: Abilities.SHEER_FORCE, - [Species.MASCHIFF]: Abilities.STRONG_JAW, - [Species.SHROODLE]: Abilities.CORROSION, - [Species.BRAMBLIN]: Abilities.SHADOW_SHIELD, - [Species.TOEDSCOOL]: Abilities.PRANKSTER, - [Species.KLAWF]: Abilities.WATER_ABSORB, - [Species.CAPSAKID]: Abilities.PARENTAL_BOND, - [Species.RELLOR]: Abilities.PRANKSTER, - [Species.FLITTLE]: Abilities.DAZZLING, - [Species.TINKATINK]: Abilities.STEELWORKER, - [Species.WIGLETT]: Abilities.STURDY, - [Species.BOMBIRDIER]: Abilities.UNBURDEN, - [Species.FINIZEN]: Abilities.IRON_FIST, - [Species.VAROOM]: Abilities.LEVITATE, - [Species.CYCLIZAR]: Abilities.PROTEAN, - [Species.ORTHWORM]: Abilities.REGENERATOR, - [Species.GLIMMET]: Abilities.LEVITATE, - [Species.GREAVARD]: Abilities.FUR_COAT, - [Species.FLAMIGO]: Abilities.MOXIE, - [Species.CETODDLE]: Abilities.ICE_SCALES, - [Species.VELUZA]: Abilities.SUPER_LUCK, - [Species.DONDOZO]: Abilities.PARENTAL_BOND, - [Species.TATSUGIRI]: Abilities.ADAPTABILITY, - [Species.GREAT_TUSK]: Abilities.INTIMIDATE, - [Species.SCREAM_TAIL]: Abilities.UNAWARE, - [Species.BRUTE_BONNET]: Abilities.CHLOROPHYLL, - [Species.FLUTTER_MANE]: Abilities.DAZZLING, - [Species.SLITHER_WING]: Abilities.SCRAPPY, - [Species.SANDY_SHOCKS]: Abilities.EARTH_EATER, - [Species.IRON_TREADS]: Abilities.STEELY_SPIRIT, - [Species.IRON_BUNDLE]: Abilities.SNOW_WARNING, - [Species.IRON_HANDS]: Abilities.IRON_FIST, - [Species.IRON_JUGULIS]: Abilities.LIGHTNING_ROD, - [Species.IRON_MOTH]: Abilities.LEVITATE, - [Species.IRON_THORNS]: Abilities.SAND_STREAM, - [Species.FRIGIBAX]: Abilities.SNOW_WARNING, - [Species.GIMMIGHOUL]: Abilities.HONEY_GATHER, - [Species.WO_CHIEN]: Abilities.VESSEL_OF_RUIN, - [Species.CHIEN_PAO]: Abilities.INTIMIDATE, - [Species.TING_LU]: Abilities.STAMINA, - [Species.CHI_YU]: Abilities.BERSERK, - [Species.ROARING_MOON]: Abilities.TOUGH_CLAWS, - [Species.IRON_VALIANT]: Abilities.ADAPTABILITY, - [Species.KORAIDON]: Abilities.OPPORTUNIST, - [Species.MIRAIDON]: Abilities.OPPORTUNIST, - [Species.WALKING_WAKE]: Abilities.BEAST_BOOST, - [Species.IRON_LEAVES]: Abilities.SHARPNESS, - [Species.POLTCHAGEIST]: Abilities.TRIAGE, - [Species.OKIDOGI]: Abilities.FUR_COAT, - [Species.MUNKIDORI]: Abilities.NEUROFORCE, - [Species.FEZANDIPITI]: Abilities.LEVITATE, - [Species.OGERPON]: Abilities.OPPORTUNIST, - [Species.GOUGING_FIRE]: Abilities.BEAST_BOOST, - [Species.RAGING_BOLT]: Abilities.BEAST_BOOST, - [Species.IRON_BOULDER]: Abilities.SHARPNESS, - [Species.IRON_CROWN]: Abilities.SHARPNESS, - [Species.TERAPAGOS]: Abilities.SOUL_HEART, - [Species.PECHARUNT]: Abilities.TOXIC_CHAIN, - [Species.ALOLA_RATTATA]: Abilities.ADAPTABILITY, - [Species.ALOLA_SANDSHREW]: Abilities.ICE_SCALES, - [Species.ALOLA_VULPIX]: Abilities.SHEER_FORCE, - [Species.ALOLA_DIGLETT]: Abilities.STURDY, - [Species.ALOLA_MEOWTH]: Abilities.DARK_AURA, - [Species.ALOLA_GEODUDE]: Abilities.DRY_SKIN, - [Species.ALOLA_GRIMER]: Abilities.TOXIC_DEBRIS, - [Species.ETERNAL_FLOETTE]: Abilities.MAGIC_GUARD, - [Species.GALAR_MEOWTH]: Abilities.STEELWORKER, - [Species.GALAR_PONYTA]: Abilities.MOXIE, - [Species.GALAR_SLOWPOKE]: Abilities.UNAWARE, - [Species.GALAR_FARFETCHD]: Abilities.INTREPID_SWORD, - [Species.GALAR_ARTICUNO]: Abilities.SERENE_GRACE, - [Species.GALAR_ZAPDOS]: Abilities.TOUGH_CLAWS, - [Species.GALAR_MOLTRES]: Abilities.DARK_AURA, - [Species.GALAR_CORSOLA]: Abilities.SHADOW_SHIELD, - [Species.GALAR_ZIGZAGOON]: Abilities.POISON_HEAL, - [Species.GALAR_DARUMAKA]: Abilities.FLASH_FIRE, - [Species.GALAR_YAMASK]: Abilities.TABLETS_OF_RUIN, - [Species.GALAR_STUNFISK]: Abilities.ARENA_TRAP, - [Species.HISUI_GROWLITHE]: Abilities.RECKLESS, - [Species.HISUI_VOLTORB]: Abilities.TRANSISTOR, - [Species.HISUI_QWILFISH]: Abilities.MERCILESS, - [Species.HISUI_SNEASEL]: Abilities.SCRAPPY, - [Species.HISUI_ZORUA]: Abilities.ADAPTABILITY, - [Species.PALDEA_TAUROS]: Abilities.ADAPTABILITY, - [Species.PALDEA_WOOPER]: Abilities.THICK_FAT, - [Species.BLOODMOON_URSALUNA]: Abilities.BERSERK -}; - const starterCandyCosts: { passive: number; costReduction: [number, number]; egg: number; }[] = [ { passive: 40, costReduction: [25, 60], egg: 30 }, // 1 Cost { passive: 40, costReduction: [25, 60], egg: 30 }, // 2 Cost @@ -1210,14 +642,29 @@ const starterCandyCosts: { passive: number; costReduction: [number, number]; egg { passive: 10, costReduction: [5, 15], egg: 10 }, // 10 Cost ]; +/** + * Getter for {@linkcode starterCandyCosts} for passive unlock candy cost based on initial point cost + * @param starterCost the default point cost of the starter found in {@linkcode speciesStarterCosts} + * @returns the candy cost for passive unlock + */ export function getPassiveCandyCount(starterCost: number): number { return starterCandyCosts[starterCost - 1].passive; } +/** + * Getter for {@linkcode starterCandyCosts} for value reduction unlock candy cost based on initial point cost + * @param starterCost the default point cost of the starter found in {@linkcode speciesStarterCosts} + * @returns respective candy cost for the two cost reductions as an array 2 numbers + */ export function getValueReductionCandyCounts(starterCost: number): [number, number] { return starterCandyCosts[starterCost - 1].costReduction; } +/** + * Getter for {@linkcode starterCandyCosts} for egg purchase candy cost based on initial point cost + * @param starterCost the default point cost of the starter found in {@linkcode speciesStarterCosts} + * @returns the candy cost for the purchasable egg + */ export function getSameSpeciesEggCandyCounts(starterCost: number): number { return starterCandyCosts[starterCost - 1].egg; } diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 00753f300d1..e3ee818cee9 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -2,7 +2,7 @@ import * as Utils from "#app/utils"; import i18next from "i18next"; import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data"; import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import Pokemon, { PokemonMove } from "#app/field/pokemon"; import { BattleType, FixedBattleConfig } from "#app/battle"; import Trainer, { TrainerVariant } from "#app/field/trainer"; @@ -638,7 +638,7 @@ export class FreshStartChallenge extends Challenge { applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean { if (defaultStarterSpecies.includes(species)) { - cost.value = speciesStarters[species]; + cost.value = speciesStarterCosts[species]; return true; } return false; @@ -720,7 +720,7 @@ export class LowerStarterMaxCostChallenge extends Challenge { } applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder): boolean { - if (speciesStarters[pokemon.speciesId] > DEFAULT_PARTY_MAX_COST - this.value) { + if (speciesStarterCosts[pokemon.speciesId] > DEFAULT_PARTY_MAX_COST - this.value) { valid.value = false; return true; } diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts index 12536644bf0..0decab63f4f 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -5,7 +5,7 @@ import { PlayerPokemon } from "#app/field/pokemon"; import { Starter } from "#app/ui/starter-select-ui-handler"; import * as Utils from "#app/utils"; import PokemonSpecies, { PokemonSpeciesForm, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; export interface DailyRunConfig { seed: integer; @@ -47,9 +47,9 @@ export function getDailyRunStarters(scene: BattleScene, seed: string): Starter[] for (let c = 0; c < starterCosts.length; c++) { const cost = starterCosts[c]; - const costSpecies = Object.keys(speciesStarters) + const costSpecies = Object.keys(speciesStarterCosts) .map(s => parseInt(s) as Species) - .filter(s => speciesStarters[s] === cost); + .filter(s => speciesStarterCosts[s] === cost); const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies)); const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel)); diff --git a/src/data/egg.ts b/src/data/egg.ts index bffc343c5a7..eacadf7a08c 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -1,6 +1,6 @@ import BattleScene from "#app/battle-scene"; import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import { VariantTier } from "#enums/variant-tier"; import * as Utils from "#app/utils"; import Overrides from "#app/overrides"; @@ -398,8 +398,8 @@ export class Egg { const ignoredSpecies = [Species.PHIONE, Species.MANAPHY, Species.ETERNATUS]; - let speciesPool = Object.keys(speciesStarters) - .filter(s => speciesStarters[s] >= minStarterValue && speciesStarters[s] <= maxStarterValue) + let speciesPool = Object.keys(speciesStarterCosts) + .filter(s => speciesStarterCosts[s] >= minStarterValue && speciesStarterCosts[s] <= maxStarterValue) .map(s => parseInt(s) as Species) .filter(s => !pokemonPrevolutions.hasOwnProperty(s) && getPokemonSpecies(s).isObtainable() && ignoredSpecies.indexOf(s) === -1); @@ -430,7 +430,7 @@ export class Egg { let totalWeight = 0; const speciesWeights : number[] = []; for (const speciesId of speciesPool) { - let weight = Math.floor((((maxStarterValue - speciesStarters[speciesId]) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); + let weight = Math.floor((((maxStarterValue - speciesStarterCosts[speciesId]) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); const species = getPokemonSpecies(speciesId); if (species.isRegional()) { weight = Math.floor(weight / 2); @@ -533,7 +533,7 @@ export class Egg { } private getEggTierFromSpeciesStarterValue(): EggTier { - const speciesStartValue = speciesStarters[this.species]; + const speciesStartValue = speciesStarterCosts[this.species]; if (speciesStartValue >= 1 && speciesStartValue <= 3) { return EggTier.COMMON; } @@ -556,7 +556,7 @@ export class Egg { } export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timestamp: number): Species { - const legendarySpecies = Object.entries(speciesStarters) + const legendarySpecies = Object.entries(speciesStarterCosts) .filter(s => s[1] >= 8 && s[1] <= 9) .map(s => parseInt(s[0])) .filter(s => getPokemonSpecies(s).isObtainable()); @@ -583,7 +583,7 @@ export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timesta * @returns The egg tier of a given pokemon species */ export function getEggTierForSpecies(pokemonSpecies :PokemonSpecies): EggTier { - const speciesBaseValue = speciesStarters[pokemonSpecies.getRootSpeciesId()]; + const speciesBaseValue = speciesStarterCosts[pokemonSpecies.getRootSpeciesId()]; if (speciesBaseValue <= 3) { return EggTier.COMMON; } else if (speciesBaseValue <= 5) { diff --git a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts index d9e0fd3d0a2..9db317e4728 100644 --- a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts +++ b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts @@ -9,7 +9,7 @@ import { AbilityRequirement, CombinationPokemonRequirement, MoveRequirement } fr import { getHighestStatTotalPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { EXTORTION_ABILITIES, EXTORTION_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; @@ -72,7 +72,7 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = const pokemon = getHighestStatTotalPlayerPokemon(scene, true, true); const baseSpecies = pokemon.getSpeciesForm().getRootSpeciesId(); - const starterValue: number = speciesStarters[baseSpecies] ?? 1; + const starterValue: number = speciesStarterCosts[baseSpecies] ?? 1; const multiplier = Math.max(MONEY_MAXIMUM_MULTIPLIER / 10 * starterValue, MONEY_MINIMUM_MULTIPLIER); const price = scene.getWaveMoneyAmount(multiplier); diff --git a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts index 2a8d750bc9f..dd11ac18711 100644 --- a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts @@ -11,7 +11,7 @@ import { TrainerType } from "#enums/trainer-type"; import i18next from "i18next"; import { Species } from "#enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import { Nature } from "#enums/nature"; import { Moves } from "#enums/moves"; import { PlayerPokemon } from "#app/field/pokemon"; @@ -455,8 +455,8 @@ function calculateEggRewardsForPokemon(pokemon: PlayerPokemon): [number, number] const rootSpecies = pokemon.species.getRootSpeciesId(); let pointsFromStarterTier = 0; // 2 points for every 1 below 7 that the pokemon's starter tier is (max 12, min 0) - if (speciesStarters.hasOwnProperty(rootSpecies)) { - const starterTier = speciesStarters[rootSpecies]; + if (speciesStarterCosts.hasOwnProperty(rootSpecies)) { + const starterTier = speciesStarterCosts[rootSpecies]; pointsFromStarterTier = Math.min(Math.max(Math.floor(7 - starterTier) * 2, 0), 12); } diff --git a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts index 68ba14b3a8d..4a8af33f4e7 100644 --- a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts @@ -6,7 +6,7 @@ import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-enc import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { catchPokemon, getRandomSpeciesByStarterTier, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import { Species } from "#enums/species"; import { PokeballType } from "#app/data/pokeball"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; @@ -89,7 +89,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = isPokemon: true }); - const starterTier = speciesStarters[species.speciesId]; + const starterTier = speciesStarterCosts[species.speciesId]; // Prices decrease by starter tier less than 5, but only reduces cost by half at max let priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER * (Math.max(starterTier, 2.5) / 5); if (pokemon.shiny) { diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 9cb197afdb1..5f530503840 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -1,7 +1,7 @@ import { Ability, allAbilities } from "#app/data/ability"; import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getNatureName, Nature } from "#app/data/nature"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { AbilityAttr } from "#app/system/game-data"; @@ -326,7 +326,7 @@ export const TrainingSessionEncounter: MysteryEncounter = // Only update the fusion's dex data if the Pokemon is already caught in dex (ignore rentals) const rootFusionSpecies = playerPokemon.fusionSpecies?.getRootSpeciesId(); if (!isNullOrUndefined(rootFusionSpecies) - && speciesStarters.hasOwnProperty(rootFusionSpecies) + && speciesStarterCosts.hasOwnProperty(rootFusionSpecies) && !!scene.gameData.dexData[rootFusionSpecies].caughtAttr) { scene.gameData.starterData[rootFusionSpecies].abilityAttr |= playerPokemon.fusionAbilityIndex !== 1 || playerPokemon.fusionSpecies?.ability2 ? 1 << playerPokemon.fusionAbilityIndex diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 6f9336924f8..fc459c78e37 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -13,7 +13,7 @@ import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; import { Species } from "#enums/species"; import { Type } from "#app/data/type"; import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import { getEncounterText, queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; @@ -207,8 +207,8 @@ export function getRandomSpeciesByStarterTier(starterTiers: number | [number, nu let min = Array.isArray(starterTiers) ? starterTiers[0] : starterTiers; let max = Array.isArray(starterTiers) ? starterTiers[1] : starterTiers; - let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarters) - .map(s => [parseInt(s) as Species, speciesStarters[s] as number]) + let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarterCosts) + .map(s => [parseInt(s) as Species, speciesStarterCosts[s] as number]) .filter(s => { const pokemonSpecies = getPokemonSpecies(s[0]); return pokemonSpecies && (!excludedSpecies || !excludedSpecies.includes(s[0])) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 18de14014a9..b0fae98d286 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -16,7 +16,7 @@ import { Type } from "#app/data/type"; import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import { Stat } from "#enums/stat"; import { Variant, VariantSet, variantColorCache, variantData } from "#app/data/variant"; -import { speciesStarters, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; +import { speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; export enum Region { NORMAL, @@ -173,7 +173,7 @@ export abstract class PokemonSpeciesForm { */ getRootSpeciesId(forStarter: boolean = false): Species { let ret = this.speciesId; - while (pokemonPrevolutions.hasOwnProperty(ret) && (!forStarter || !speciesStarters.hasOwnProperty(ret))) { + while (pokemonPrevolutions.hasOwnProperty(ret) && (!forStarter || !speciesStarterCosts.hasOwnProperty(ret))) { ret = pokemonPrevolutions[ret]; } return ret; @@ -967,7 +967,7 @@ export function getPokerusStarters(scene: BattleScene): PokemonSpecies[] { date.setUTCHours(0, 0, 0, 0); scene.executeWithSeedOffset(() => { while (pokerusStarters.length < POKERUS_STARTER_COUNT) { - const randomSpeciesId = parseInt(Utils.randSeedItem(Object.keys(speciesStarters)), 10); + const randomSpeciesId = parseInt(Utils.randSeedItem(Object.keys(speciesStarterCosts)), 10); const species = getPokemonSpecies(randomSpeciesId); if (!pokerusStarters.includes(species)) { pokerusStarters.push(species); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 6e01fea6392..b7a50a602f3 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -5,7 +5,8 @@ import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "#app/ui/battle-info"; import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget } from "#app/data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; -import { getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "#app/data/balance/starters"; +import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; +import { starterPassiveAbilities } from "#app/data/balance/passives"; import { Constructor, isNullOrUndefined, randSeedInt } from "#app/utils"; import * as Utils from "#app/utils"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "#app/data/type"; @@ -4048,7 +4049,7 @@ export class PlayerPokemon extends Pokemon { starterData.forEach((sd: StarterDataEntry, i: integer) => { const speciesId = !i ? starterSpeciesId : fusionStarterSpeciesId as Species; sd.friendship = (sd.friendship || 0) + starterAmount.value; - if (sd.friendship >= getStarterValueFriendshipCap(speciesStarters[speciesId])) { + if (sd.friendship >= getStarterValueFriendshipCap(speciesStarterCosts[speciesId])) { this.scene.gameData.addStarterCandy(getPokemonSpecies(speciesId), 1); sd.friendship = 0; } diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index bb17b241198..5e5031c1d06 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -2,7 +2,7 @@ import BattleScene from "#app/battle-scene"; import { TurnCommand, BattleType } from "#app/battle"; import { TrappedTag, EncoreTag } from "#app/data/battler-tags"; import { MoveTargetSet, getMoveTargets } from "#app/data/move"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import { Abilities } from "#app/enums/abilities"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { Biome } from "#app/enums/biome"; @@ -126,7 +126,7 @@ export class CommandPhase extends FieldPhase { } break; case Command.BALL: - const notInDex = (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1); + const notInDex = (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1); if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || this.scene.gameMode.isFreshStartChallenge() || notInDex )) { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.MESSAGE); diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 13542e609cb..b597a1b9aad 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -3,7 +3,7 @@ import BattleScene, { bypassLogin, PokeballCounts } from "#app/battle-scene"; import Pokemon, { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; import PokemonSpecies, { allSpecies, getPokemonSpecies, noStarterFormKeys } from "#app/data/pokemon-species"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import * as Utils from "#app/utils"; import Overrides from "#app/overrides"; import PokemonData from "#app/system/pokemon-data"; @@ -1538,7 +1538,7 @@ export class GameData { private initStarterData(): void { const starterData: StarterData = {}; - const starterSpeciesIds = Object.keys(speciesStarters).map(k => parseInt(k) as Species); + const starterSpeciesIds = Object.keys(speciesStarterCosts).map(k => parseInt(k) as Species); for (const speciesId of starterSpeciesIds) { starterData[speciesId] = { @@ -1618,7 +1618,7 @@ export class GameData { dexEntry.caughtAttr |= dexAttr; // Unlock ability - if (speciesStarters.hasOwnProperty(species.speciesId)) { + if (speciesStarterCosts.hasOwnProperty(species.speciesId)) { this.starterData[species.speciesId].abilityAttr |= pokemon.abilityIndex !== 1 || pokemon.species.ability2 ? 1 << pokemon.abilityIndex : AbilityAttr.ABILITY_HIDDEN; @@ -1674,7 +1674,7 @@ export class GameData { } }; - if (newCatch && speciesStarters.hasOwnProperty(species.speciesId)) { + if (newCatch && speciesStarterCosts.hasOwnProperty(species.speciesId)) { if (!showMessage) { resolve(true); return; @@ -1802,7 +1802,7 @@ export class GameData { } getStarterCount(dexEntryPredicate: (entry: DexEntry) => boolean): integer { - const starterKeys = Object.keys(speciesStarters); + const starterKeys = Object.keys(speciesStarterCosts); let starterCount = 0; for (const s of starterKeys) { const starterDexEntry = this.dexData[s]; @@ -1876,7 +1876,7 @@ export class GameData { } getSpeciesStarterValue(speciesId: Species): number { - const baseValue = speciesStarters[speciesId]; + const baseValue = speciesStarterCosts[speciesId]; let value = baseValue; const decrementValue = (value: number) => { diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index dceed6daf72..154862ddc7c 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -7,7 +7,7 @@ import BattleScene from "#app/battle-scene"; import { StatusEffect } from "#app/data/status-effect"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import { Type } from "#app/data/type"; import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, getRandomPlayerPokemon, getRandomSpeciesByStarterTier, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getEncounterText, queueEncounterMessage, showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -210,7 +210,7 @@ describe("Mystery Encounter Utils", () => { const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(result); - expect(speciesStarters[result]).toBe(5); + expect(speciesStarterCosts[result]).toBe(5); }); it("gets species for a starter tier range", () => { @@ -218,8 +218,8 @@ describe("Mystery Encounter Utils", () => { const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(result); - expect(speciesStarters[result]).toBeGreaterThanOrEqual(5); - expect(speciesStarters[result]).toBeLessThanOrEqual(8); + expect(speciesStarterCosts[result]).toBeGreaterThanOrEqual(5); + expect(speciesStarterCosts[result]).toBeLessThanOrEqual(8); }); it("excludes species from search", () => { diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index 0c0e7862b9c..69abdf85e9e 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -6,7 +6,7 @@ import UiHandler from "#app/ui/ui-handler"; import { addWindow } from "#app/ui/ui-theme"; import * as Utils from "#app/utils"; import { DexAttr, GameData } from "#app/system/game-data"; -import { speciesStarters } from "#app/data/balance/starters"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import { Button } from "#enums/buttons"; import i18next from "i18next"; import { UiTheme } from "#enums/ui-theme"; @@ -34,14 +34,14 @@ const displayStats: DisplayStats = { label_key: "starters", sourceFunc: gameData => { const starterCount = gameData.getStarterCount(d => !!d.caughtAttr); - return `${starterCount} (${Math.floor((starterCount / Object.keys(speciesStarters).length) * 1000) / 10}%)`; + return `${starterCount} (${Math.floor((starterCount / Object.keys(speciesStarterCosts).length) * 1000) / 10}%)`; } }, shinyStartersUnlocked: { label_key: "shinyStarters", sourceFunc: gameData => { const starterCount = gameData.getStarterCount(d => !!(d.caughtAttr & DexAttr.SHINY)); - return `${starterCount} (${Math.floor((starterCount / Object.keys(speciesStarters).length) * 1000) / 10}%)`; + return `${starterCount} (${Math.floor((starterCount / Object.keys(speciesStarterCosts).length) * 1000) / 10}%)`; } }, dexSeen: { diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 55e7de40b66..342a54904b8 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -14,7 +14,8 @@ import { Nature, getNatureName } from "#app/data/nature"; import { pokemonFormChanges } from "#app/data/pokemon-forms"; import { LevelMoves, pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import PokemonSpecies, { allSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data/pokemon-species"; -import { getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; +import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; +import { starterPassiveAbilities } from "#app/data/balance/passives"; import { Type } from "#app/data/type"; import { GameModes } from "#app/game-mode"; import { AbilityAttr, DexAttr, DexAttrProps, DexEntry, StarterMoveset, StarterAttributes, StarterPreferences, StarterPrefs } from "#app/system/game-data"; @@ -635,7 +636,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { starterBoxContainer.add(this.cursorObj); for (const species of allSpecies) { - if (!speciesStarters.hasOwnProperty(species.speciesId) || !species.isObtainable()) { + if (!speciesStarterCosts.hasOwnProperty(species.speciesId) || !species.isObtainable()) { continue; } @@ -1089,7 +1090,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Get this species ID's starter data const starterData = this.scene.gameData.starterData[speciesId]; - return starterData.candyCount >= getPassiveCandyCount(speciesStarters[speciesId]) + return starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[speciesId]) && !(starterData.passiveAttr & PassiveAttr.UNLOCKED); } @@ -1102,7 +1103,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Get this species ID's starter data const starterData = this.scene.gameData.starterData[speciesId]; - return starterData.candyCount >= getValueReductionCandyCounts(speciesStarters[speciesId])[starterData.valueReduction] + return starterData.candyCount >= getValueReductionCandyCounts(speciesStarterCosts[speciesId])[starterData.valueReduction] && starterData.valueReduction < valueReductionMax; } @@ -1115,7 +1116,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Get this species ID's starter data const starterData = this.scene.gameData.starterData[speciesId]; - return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarters[speciesId]); + return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarterCosts[speciesId]); } /** @@ -1709,7 +1710,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Unlock passive option if (!(passiveAttr & PassiveAttr.UNLOCKED)) { - const passiveCost = getPassiveCandyCount(speciesStarters[this.lastSpecies.speciesId]); + const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.lastSpecies.speciesId]); options.push({ label: `x${passiveCost} ${i18next.t("starterSelectUiHandler:unlockPassive")} (${allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]].name})`, handler: () => { @@ -1745,7 +1746,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Reduce cost option const valueReduction = starterData.valueReduction; if (valueReduction < valueReductionMax) { - const reductionCost = getValueReductionCandyCounts(speciesStarters[this.lastSpecies.speciesId])[valueReduction]; + const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.lastSpecies.speciesId])[valueReduction]; options.push({ label: `x${reductionCost} ${i18next.t("starterSelectUiHandler:reduceCost")}`, handler: () => { @@ -1779,7 +1780,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } // Same species egg menu option. - const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarters[this.lastSpecies.speciesId]); + const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarterCosts[this.lastSpecies.speciesId]); options.push({ label: `x${sameSpeciesEggCost} ${i18next.t("starterSelectUiHandler:sameSpeciesEgg")}`, handler: () => { @@ -2700,7 +2701,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { currentFriendship = 0; } - const friendshipCap = getStarterValueFriendshipCap(speciesStarters[speciesId]); + const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[speciesId]); return { currentFriendship, friendshipCap }; } @@ -3333,7 +3334,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { updateStarterValueLabel(starter: StarterContainer): void { const speciesId = starter.species.speciesId; - const baseStarterValue = speciesStarters[speciesId]; + const baseStarterValue = speciesStarterCosts[speciesId]; const starterValue = this.scene.gameData.getSpeciesStarterValue(speciesId); starter.cost = starterValue; let valueStr = starterValue.toString(); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 49d3583a7fb..28c3ccdb2e4 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -3,7 +3,7 @@ import { Mode } from "#app/ui/ui"; import UiHandler from "#app/ui/ui-handler"; import * as Utils from "#app/utils"; import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; -import { getStarterValueFriendshipCap, speciesStarters } from "#app/data/balance/starters"; +import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; import { argbFromRgba } from "@material/material-color-utilities"; import { Type, getTypeRgb } from "#app/data/type"; import { TextStyle, addBBCodeTextObject, addTextObject, getBBCodeFrag } from "#app/ui/text"; @@ -333,7 +333,7 @@ export default class SummaryUiHandler extends UiHandler { currentFriendship = 0; } - const friendshipCap = getStarterValueFriendshipCap(speciesStarters[this.pokemon.species.getRootSpeciesId()]); + const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[this.pokemon.species.getRootSpeciesId()]); const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); if (this.candyShadow.visible) {