From 8a2900ad2906dae3501a0f4cb70a35260aa5112b Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Wed, 2 Oct 2024 09:20:19 -0400 Subject: [PATCH] [Refactor] Move some relevant files, tables etc to new balance folder (#4510) * Move biomes.ts * Move starter costs, passives, friendship, starter-candy to starters.ts * Change relative imports to absolute imports * Add docstrings, passives.ts * Constants in rates.ts for egg pity, egg tier rates, hatch waves, variant chances --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/battle-scene.ts | 4 +- src/data/{ => balance}/biomes.ts | 6 +- src/data/{ => balance}/egg-moves.ts | 4 +- src/data/balance/passives.ts | 574 ++++++++ src/data/{ => balance}/pokemon-evolutions.ts | 14 +- src/data/{ => balance}/pokemon-level-moves.ts | 0 src/data/balance/rates.ts | 53 + src/data/balance/starters.ts | 671 +++++++++ src/data/{ => balance}/tms.ts | 2 +- src/data/challenge.ts | 21 +- src/data/daily-run.ts | 15 +- src/data/egg.ts | 69 +- .../an-offer-you-cant-refuse-encounter.ts | 5 +- .../the-expert-pokemon-breeder-encounter.ts | 7 +- .../the-pokemon-salesman-encounter.ts | 5 +- .../encounters/training-session-encounter.ts | 4 +- .../mystery-encounter-requirements.ts | 12 +- .../mystery-encounters/mystery-encounters.ts | 2 +- .../utils/encounter-phase-utils.ts | 2 +- .../utils/encounter-pokemon-utils.ts | 7 +- src/data/pokemon-species.ts | 1288 +---------------- src/data/trainer-config.ts | 34 +- src/field/arena.ts | 30 +- src/field/pokemon.ts | 77 +- src/field/trainer.ts | 20 +- src/loading-scene.ts | 26 +- src/modifier/modifier-type.ts | 36 +- src/modifier/modifier.ts | 37 +- src/phases/command-phase.ts | 4 +- src/phases/evolution-phase.ts | 24 +- src/phases/game-over-phase.ts | 2 +- src/phases/select-biome-phase.ts | 2 +- src/system/achv.ts | 2 +- src/system/game-data.ts | 75 +- src/test/evolution.test.ts | 2 +- .../uncommon-breed-encounter.test.ts | 2 +- .../mystery-encounter-utils.test.ts | 9 +- src/test/vitest.setup.ts | 6 +- src/ui/game-stats-ui-handler.ts | 24 +- src/ui/party-ui-handler.ts | 32 +- src/ui/pokemon-hatch-info-container.ts | 18 +- src/ui/starter-select-ui-handler.ts | 112 +- src/ui/summary-ui-handler.ts | 44 +- 43 files changed, 1729 insertions(+), 1654 deletions(-) rename src/data/{ => balance}/biomes.ts (99%) rename src/data/{ => balance}/egg-moves.ts (99%) create mode 100644 src/data/balance/passives.ts rename src/data/{ => balance}/pokemon-evolutions.ts (99%) rename src/data/{ => balance}/pokemon-level-moves.ts (100%) create mode 100644 src/data/balance/rates.ts create mode 100644 src/data/balance/starters.ts rename src/data/{ => balance}/tms.ts (99%) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index c5283b091d4b..df852126bc23 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -25,7 +25,7 @@ import { trainerConfigs, TrainerSlot } from "./data/trainer-config"; import Trainer, { TrainerVariant } from "./field/trainer"; import TrainerData from "./system/trainer-data"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { pokemonPrevolutions } from "./data/pokemon-evolutions"; +import { pokemonPrevolutions } from "./data/balance/pokemon-evolutions"; import PokeballTray from "./ui/pokeball-tray"; import InvertPostFX from "./pipelines/invert"; import { Achv, achvs, ModifierAchv, MoneyAchv } from "./system/achv"; @@ -42,7 +42,7 @@ import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler" import CharSprite from "./ui/char-sprite"; import DamageNumberHandler from "./field/damage-number-handler"; import PokemonInfoContainer from "./ui/pokemon-info-container"; -import { biomeDepths, getBiomeName } from "./data/biomes"; +import { biomeDepths, getBiomeName } from "./data/balance/biomes"; import { SceneBase } from "./scene-base"; import CandyBar from "./ui/candy-bar"; import { Variant, variantData } from "./data/variant"; diff --git a/src/data/biomes.ts b/src/data/balance/biomes.ts similarity index 99% rename from src/data/biomes.ts rename to src/data/balance/biomes.ts index 0e37cc94ff5d..f35bd56b3a4d 100644 --- a/src/data/biomes.ts +++ b/src/data/balance/biomes.ts @@ -1,6 +1,6 @@ -import { Type } from "./type"; -import * as Utils from "../utils"; -import { pokemonEvolutions, SpeciesFormEvolution } from "./pokemon-evolutions"; +import { Type } from "#app/data/type"; +import * as Utils from "#app/utils"; +import { pokemonEvolutions, SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; import i18next from "i18next"; import { Biome } from "#enums/biome"; import { Species } from "#enums/species"; diff --git a/src/data/egg-moves.ts b/src/data/balance/egg-moves.ts similarity index 99% rename from src/data/egg-moves.ts rename to src/data/balance/egg-moves.ts index 741b707af2fa..8df92e179d90 100644 --- a/src/data/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -1,5 +1,5 @@ -import { allMoves } from "./move"; -import * as Utils from "../utils"; +import { allMoves } from "#app/data/move"; +import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts new file mode 100644 index 000000000000..6fb0e80e085e --- /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/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts similarity index 99% rename from src/data/pokemon-evolutions.ts rename to src/data/balance/pokemon-evolutions.ts index fc1dfffb1ec9..c838f6b2c497 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -1,11 +1,11 @@ -import { Gender } from "./gender"; -import { PokeballType } from "./pokeball"; -import Pokemon from "../field/pokemon"; +import { Gender } from "#app/data/gender"; +import { PokeballType } from "#app/data/pokeball"; +import Pokemon from "#app/field/pokemon"; import { Stat } from "#enums/stat"; -import { Type } from "./type"; -import * as Utils from "../utils"; -import { WeatherType } from "./weather"; -import { Nature } from "./nature"; +import { Type } from "#app/data/type"; +import * as Utils from "#app/utils"; +import { WeatherType } from "#app/data/weather"; +import { Nature } from "#app/data/nature"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/data/pokemon-level-moves.ts b/src/data/balance/pokemon-level-moves.ts similarity index 100% rename from src/data/pokemon-level-moves.ts rename to src/data/balance/pokemon-level-moves.ts diff --git a/src/data/balance/rates.ts b/src/data/balance/rates.ts new file mode 100644 index 000000000000..c5eaf40e6080 --- /dev/null +++ b/src/data/balance/rates.ts @@ -0,0 +1,53 @@ +/** + * Rates for shinies and other random properties are defined in this file. + * CHANCE is defined as x/65536 + * RATE is defined as 1/x + */ + +// #region Encounterable properties +/** `64/65536 -> 1/1024` */ +export const BASE_SHINY_CHANCE = 64; + +/** `256/65536 -> 1/256` */ +export const BASE_HIDDEN_ABILITY_CHANCE = 256; + +// #region Egg properties + +// Threshold x at which a gacha egg is determined to be a certain tier +// Specifically, the tier is determined by the highest threshold a random value between 0-255 meets or exceeds +// Legendary Up Gacha raises these thresholds by 1, thereby giving Legendary eggs 2/256 chance +export const GACHA_DEFAULT_COMMON_EGG_THRESHOLD = 52; // Default 204/256 chance, 203/256 chance in Legendary Up Gacha +export const GACHA_DEFAULT_RARE_EGG_THRESHOLD = 8; // Default 44/256 chance +export const GACHA_DEFAULT_EPIC_EGG_THRESHOLD = 1; // Default 7/256 chance, leaving Legendary as 1/256 chance +export const GACHA_LEGENDARY_UP_THRESHOLD_OFFSET = 1; // The offset to threshold for Legendary Up gacha eggs. +x/256 Legendary Egg chance, -x/256 Common Egg chance + +// The number of eggs without finding a certain tier egg it takes for egg pity to kick in and that tier to be forced +// These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered. +export const EGG_PITY_LEGENDARY_THRESHOLD = 412; +export const EGG_PITY_EPIC_THRESHOLD = 59; +export const EGG_PITY_RARE_THRESHOLD = 9; + +// Waves to hatch an egg of a given tier +export const HATCH_WAVES_COMMON_EGG = 10; +export const HATCH_WAVES_RARE_EGG = 25; +export const HATCH_WAVES_EPIC_EGG = 50; +export const HATCH_WAVES_LEGENDARY_EGG = 100; +export const HATCH_WAVES_MANAPHY_EGG = 50; + +// Rates for specific random properties in 1/x +export const GACHA_DEFAULT_SHINY_RATE = 128; +export const GACHA_SHINY_UP_SHINY_RATE = 64; +export const SAME_SPECIES_EGG_SHINY_RATE = 12; +export const SAME_SPECIES_EGG_HA_RATE = 8; +export const MANAPHY_EGG_MANAPHY_RATE = 8; +export const GACHA_EGG_HA_RATE = 192; + +// 1/x for legendary eggs, 1/x*2 for epic eggs, 1/x*4 for rare eggs, and 1/x*8 for common eggs +export const GACHA_DEFAULT_RARE_EGGMOVE_RATE = 6; +export const SAME_SPECIES_EGG_RARE_EGGMOVE_RATE = 3; +export const GACHA_MOVE_UP_RARE_EGGMOVE_RATE = 3; + +// #region Variant properties +// The chance x/10 of a shiny being a variant, then of being specifically an epic variant +export const SHINY_VARIANT_CHANCE = 4; +export const SHINY_EPIC_CHANCE = 1; diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts new file mode 100644 index 000000000000..5117f8000860 --- /dev/null +++ b/src/data/balance/starters.ts @@ -0,0 +1,671 @@ +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: + return 20; + case 2: + return 40; + case 3: + return 60; + case 4: + return 100; + case 5: + return 140; + case 6: + return 200; + case 7: + return 280; + case 8: + case 9: + return 450; + default: + return 600; + } +} + +export const speciesStarterCosts = { + [Species.BULBASAUR]: 3, + [Species.CHARMANDER]: 3, + [Species.SQUIRTLE]: 3, + [Species.CATERPIE]: 2, + [Species.WEEDLE]: 1, + [Species.PIDGEY]: 1, + [Species.RATTATA]: 1, + [Species.SPEAROW]: 1, + [Species.EKANS]: 2, + [Species.PIKACHU]: 3, + [Species.SANDSHREW]: 2, + [Species.NIDORAN_F]: 3, + [Species.NIDORAN_M]: 3, + [Species.CLEFAIRY]: 3, + [Species.VULPIX]: 3, + [Species.JIGGLYPUFF]: 2, + [Species.ZUBAT]: 3, + [Species.ODDISH]: 3, + [Species.PARAS]: 2, + [Species.VENONAT]: 2, + [Species.DIGLETT]: 2, + [Species.MEOWTH]: 3, + [Species.PSYDUCK]: 2, + [Species.MANKEY]: 4, + [Species.GROWLITHE]: 4, + [Species.POLIWAG]: 2, + [Species.ABRA]: 4, + [Species.MACHOP]: 3, + [Species.BELLSPROUT]: 2, + [Species.TENTACOOL]: 3, + [Species.GEODUDE]: 3, + [Species.PONYTA]: 2, + [Species.SLOWPOKE]: 3, + [Species.MAGNEMITE]: 4, + [Species.FARFETCHD]: 2, + [Species.DODUO]: 3, + [Species.SEEL]: 1, + [Species.GRIMER]: 2, + [Species.SHELLDER]: 5, + [Species.GASTLY]: 4, + [Species.ONIX]: 3, + [Species.DROWZEE]: 2, + [Species.KRABBY]: 3, + [Species.VOLTORB]: 2, + [Species.EXEGGCUTE]: 3, + [Species.CUBONE]: 3, + [Species.HITMONLEE]: 4, + [Species.HITMONCHAN]: 4, + [Species.LICKITUNG]: 3, + [Species.KOFFING]: 2, + [Species.RHYHORN]: 3, + [Species.CHANSEY]: 3, + [Species.TANGELA]: 3, + [Species.KANGASKHAN]: 4, + [Species.HORSEA]: 3, + [Species.GOLDEEN]: 2, + [Species.STARYU]: 3, + [Species.MR_MIME]: 3, + [Species.SCYTHER]: 5, + [Species.JYNX]: 4, + [Species.ELECTABUZZ]: 4, + [Species.MAGMAR]: 4, + [Species.PINSIR]: 4, + [Species.TAUROS]: 4, + [Species.MAGIKARP]: 4, + [Species.LAPRAS]: 4, + [Species.DITTO]: 2, + [Species.EEVEE]: 3, + [Species.PORYGON]: 4, + [Species.OMANYTE]: 3, + [Species.KABUTO]: 3, + [Species.AERODACTYL]: 5, + [Species.SNORLAX]: 5, + [Species.ARTICUNO]: 6, + [Species.ZAPDOS]: 6, + [Species.MOLTRES]: 6, + [Species.DRATINI]: 4, + [Species.MEWTWO]: 8, + [Species.MEW]: 6, + + [Species.CHIKORITA]: 2, + [Species.CYNDAQUIL]: 3, + [Species.TOTODILE]: 3, + [Species.SENTRET]: 1, + [Species.HOOTHOOT]: 2, + [Species.LEDYBA]: 1, + [Species.SPINARAK]: 1, + [Species.CHINCHOU]: 2, + [Species.PICHU]: 2, + [Species.CLEFFA]: 2, + [Species.IGGLYBUFF]: 1, + [Species.TOGEPI]: 3, + [Species.NATU]: 2, + [Species.MAREEP]: 2, + [Species.MARILL]: 4, + [Species.SUDOWOODO]: 3, + [Species.HOPPIP]: 2, + [Species.AIPOM]: 2, + [Species.SUNKERN]: 1, + [Species.YANMA]: 3, + [Species.WOOPER]: 2, + [Species.MURKROW]: 3, + [Species.MISDREAVUS]: 2, + [Species.UNOWN]: 1, + [Species.WOBBUFFET]: 2, + [Species.GIRAFARIG]: 3, + [Species.PINECO]: 2, + [Species.DUNSPARCE]: 3, + [Species.GLIGAR]: 3, + [Species.SNUBBULL]: 2, + [Species.QWILFISH]: 3, + [Species.SHUCKLE]: 3, + [Species.HERACROSS]: 5, + [Species.SNEASEL]: 4, + [Species.TEDDIURSA]: 4, + [Species.SLUGMA]: 2, + [Species.SWINUB]: 3, + [Species.CORSOLA]: 2, + [Species.REMORAID]: 2, + [Species.DELIBIRD]: 2, + [Species.MANTINE]: 3, + [Species.SKARMORY]: 4, + [Species.HOUNDOUR]: 3, + [Species.PHANPY]: 3, + [Species.STANTLER]: 3, + [Species.SMEARGLE]: 1, + [Species.TYROGUE]: 3, + [Species.SMOOCHUM]: 3, + [Species.ELEKID]: 3, + [Species.MAGBY]: 3, + [Species.MILTANK]: 4, + [Species.RAIKOU]: 6, + [Species.ENTEI]: 6, + [Species.SUICUNE]: 6, + [Species.LARVITAR]: 4, + [Species.LUGIA]: 8, + [Species.HO_OH]: 8, + [Species.CELEBI]: 6, + + [Species.TREECKO]: 3, + [Species.TORCHIC]: 4, + [Species.MUDKIP]: 3, + [Species.POOCHYENA]: 2, + [Species.ZIGZAGOON]: 2, + [Species.WURMPLE]: 1, + [Species.LOTAD]: 3, + [Species.SEEDOT]: 2, + [Species.TAILLOW]: 3, + [Species.WINGULL]: 2, + [Species.RALTS]: 3, + [Species.SURSKIT]: 2, + [Species.SHROOMISH]: 3, + [Species.SLAKOTH]: 4, + [Species.NINCADA]: 4, + [Species.WHISMUR]: 2, + [Species.MAKUHITA]: 3, + [Species.AZURILL]: 4, + [Species.NOSEPASS]: 2, + [Species.SKITTY]: 1, + [Species.SABLEYE]: 2, + [Species.MAWILE]: 3, + [Species.ARON]: 3, + [Species.MEDITITE]: 3, + [Species.ELECTRIKE]: 2, + [Species.PLUSLE]: 2, + [Species.MINUN]: 2, + [Species.VOLBEAT]: 2, + [Species.ILLUMISE]: 2, + [Species.ROSELIA]: 3, + [Species.GULPIN]: 1, + [Species.CARVANHA]: 3, + [Species.WAILMER]: 2, + [Species.NUMEL]: 2, + [Species.TORKOAL]: 3, + [Species.SPOINK]: 2, + [Species.SPINDA]: 1, + [Species.TRAPINCH]: 3, + [Species.CACNEA]: 2, + [Species.SWABLU]: 2, + [Species.ZANGOOSE]: 4, + [Species.SEVIPER]: 3, + [Species.LUNATONE]: 3, + [Species.SOLROCK]: 3, + [Species.BARBOACH]: 2, + [Species.CORPHISH]: 3, + [Species.BALTOY]: 2, + [Species.LILEEP]: 3, + [Species.ANORITH]: 3, + [Species.FEEBAS]: 4, + [Species.CASTFORM]: 1, + [Species.KECLEON]: 2, + [Species.SHUPPET]: 2, + [Species.DUSKULL]: 3, + [Species.TROPIUS]: 3, + [Species.CHIMECHO]: 3, + [Species.ABSOL]: 4, + [Species.WYNAUT]: 2, + [Species.SNORUNT]: 2, + [Species.SPHEAL]: 2, + [Species.CLAMPERL]: 3, + [Species.RELICANTH]: 3, + [Species.LUVDISC]: 1, + [Species.BAGON]: 4, + [Species.BELDUM]: 4, + [Species.REGIROCK]: 6, + [Species.REGICE]: 6, + [Species.REGISTEEL]: 6, + [Species.LATIAS]: 7, + [Species.LATIOS]: 7, + [Species.KYOGRE]: 9, + [Species.GROUDON]: 9, + [Species.RAYQUAZA]: 9, + [Species.JIRACHI]: 7, + [Species.DEOXYS]: 7, + + [Species.TURTWIG]: 3, + [Species.CHIMCHAR]: 3, + [Species.PIPLUP]: 3, + [Species.STARLY]: 3, + [Species.BIDOOF]: 2, + [Species.KRICKETOT]: 1, + [Species.SHINX]: 2, + [Species.BUDEW]: 3, + [Species.CRANIDOS]: 3, + [Species.SHIELDON]: 3, + [Species.BURMY]: 2, + [Species.COMBEE]: 2, + [Species.PACHIRISU]: 2, + [Species.BUIZEL]: 2, + [Species.CHERUBI]: 1, + [Species.SHELLOS]: 3, + [Species.DRIFLOON]: 2, + [Species.BUNEARY]: 2, + [Species.GLAMEOW]: 2, + [Species.CHINGLING]: 2, + [Species.STUNKY]: 2, + [Species.BRONZOR]: 3, + [Species.BONSLY]: 2, + [Species.MIME_JR]: 2, + [Species.HAPPINY]: 2, + [Species.CHATOT]: 2, + [Species.SPIRITOMB]: 4, + [Species.GIBLE]: 4, + [Species.MUNCHLAX]: 4, + [Species.RIOLU]: 3, + [Species.HIPPOPOTAS]: 3, + [Species.SKORUPI]: 3, + [Species.CROAGUNK]: 2, + [Species.CARNIVINE]: 2, + [Species.FINNEON]: 1, + [Species.MANTYKE]: 2, + [Species.SNOVER]: 2, + [Species.ROTOM]: 5, + [Species.UXIE]: 6, + [Species.MESPRIT]: 6, + [Species.AZELF]: 6, + [Species.DIALGA]: 8, + [Species.PALKIA]: 8, + [Species.HEATRAN]: 6, + [Species.REGIGIGAS]: 7, + [Species.GIRATINA]: 8, + [Species.CRESSELIA]: 6, + [Species.PHIONE]: 4, + [Species.MANAPHY]: 7, + [Species.DARKRAI]: 7, + [Species.SHAYMIN]: 6, + [Species.ARCEUS]: 9, + + [Species.VICTINI]: 7, + [Species.SNIVY]: 3, + [Species.TEPIG]: 3, + [Species.OSHAWOTT]: 3, + [Species.PATRAT]: 1, + [Species.LILLIPUP]: 3, + [Species.PURRLOIN]: 2, + [Species.PANSAGE]: 2, + [Species.PANSEAR]: 2, + [Species.PANPOUR]: 2, + [Species.MUNNA]: 2, + [Species.PIDOVE]: 1, + [Species.BLITZLE]: 2, + [Species.ROGGENROLA]: 3, + [Species.WOOBAT]: 3, + [Species.DRILBUR]: 4, + [Species.AUDINO]: 3, + [Species.TIMBURR]: 4, + [Species.TYMPOLE]: 3, + [Species.THROH]: 4, + [Species.SAWK]: 4, + [Species.SEWADDLE]: 2, + [Species.VENIPEDE]: 3, + [Species.COTTONEE]: 3, + [Species.PETILIL]: 3, + [Species.BASCULIN]: 4, + [Species.SANDILE]: 4, + [Species.DARUMAKA]: 4, + [Species.MARACTUS]: 2, + [Species.DWEBBLE]: 2, + [Species.SCRAGGY]: 3, + [Species.SIGILYPH]: 4, + [Species.YAMASK]: 3, + [Species.TIRTOUGA]: 3, + [Species.ARCHEN]: 3, + [Species.TRUBBISH]: 2, + [Species.ZORUA]: 3, + [Species.MINCCINO]: 3, + [Species.GOTHITA]: 3, + [Species.SOLOSIS]: 3, + [Species.DUCKLETT]: 2, + [Species.VANILLITE]: 3, + [Species.DEERLING]: 2, + [Species.EMOLGA]: 2, + [Species.KARRABLAST]: 3, + [Species.FOONGUS]: 2, + [Species.FRILLISH]: 3, + [Species.ALOMOMOLA]: 4, + [Species.JOLTIK]: 3, + [Species.FERROSEED]: 3, + [Species.KLINK]: 3, + [Species.TYNAMO]: 2, + [Species.ELGYEM]: 2, + [Species.LITWICK]: 3, + [Species.AXEW]: 4, + [Species.CUBCHOO]: 2, + [Species.CRYOGONAL]: 4, + [Species.SHELMET]: 2, + [Species.STUNFISK]: 3, + [Species.MIENFOO]: 3, + [Species.DRUDDIGON]: 4, + [Species.GOLETT]: 3, + [Species.PAWNIARD]: 4, + [Species.BOUFFALANT]: 4, + [Species.RUFFLET]: 3, + [Species.VULLABY]: 3, + [Species.HEATMOR]: 3, + [Species.DURANT]: 4, + [Species.DEINO]: 4, + [Species.LARVESTA]: 4, + [Species.COBALION]: 6, + [Species.TERRAKION]: 6, + [Species.VIRIZION]: 6, + [Species.TORNADUS]: 7, + [Species.THUNDURUS]: 7, + [Species.RESHIRAM]: 8, + [Species.ZEKROM]: 8, + [Species.LANDORUS]: 7, + [Species.KYUREM]: 8, + [Species.KELDEO]: 6, + [Species.MELOETTA]: 7, + [Species.GENESECT]: 6, + + [Species.CHESPIN]: 3, + [Species.FENNEKIN]: 3, + [Species.FROAKIE]: 4, + [Species.BUNNELBY]: 3, + [Species.FLETCHLING]: 3, + [Species.SCATTERBUG]: 2, + [Species.LITLEO]: 2, + [Species.FLABEBE]: 3, + [Species.SKIDDO]: 2, + [Species.PANCHAM]: 3, + [Species.FURFROU]: 3, + [Species.ESPURR]: 2, + [Species.HONEDGE]: 4, + [Species.SPRITZEE]: 2, + [Species.SWIRLIX]: 3, + [Species.INKAY]: 3, + [Species.BINACLE]: 3, + [Species.SKRELP]: 2, + [Species.CLAUNCHER]: 3, + [Species.HELIOPTILE]: 3, + [Species.TYRUNT]: 3, + [Species.AMAURA]: 3, + [Species.HAWLUCHA]: 4, + [Species.DEDENNE]: 2, + [Species.CARBINK]: 2, + [Species.GOOMY]: 4, + [Species.KLEFKI]: 3, + [Species.PHANTUMP]: 2, + [Species.PUMPKABOO]: 2, + [Species.BERGMITE]: 3, + [Species.NOIBAT]: 3, + [Species.XERNEAS]: 8, + [Species.YVELTAL]: 8, + [Species.ZYGARDE]: 8, + [Species.DIANCIE]: 7, + [Species.HOOPA]: 7, + [Species.VOLCANION]: 6, + [Species.ETERNAL_FLOETTE]: 4, + + [Species.ROWLET]: 3, + [Species.LITTEN]: 3, + [Species.POPPLIO]: 4, + [Species.PIKIPEK]: 2, + [Species.YUNGOOS]: 2, + [Species.GRUBBIN]: 3, + [Species.CRABRAWLER]: 3, + [Species.ORICORIO]: 3, + [Species.CUTIEFLY]: 3, + [Species.ROCKRUFF]: 3, + [Species.WISHIWASHI]: 2, + [Species.MAREANIE]: 2, + [Species.MUDBRAY]: 3, + [Species.DEWPIDER]: 3, + [Species.FOMANTIS]: 2, + [Species.MORELULL]: 2, + [Species.SALANDIT]: 3, + [Species.STUFFUL]: 3, + [Species.BOUNSWEET]: 3, + [Species.COMFEY]: 4, + [Species.ORANGURU]: 4, + [Species.PASSIMIAN]: 4, + [Species.WIMPOD]: 3, + [Species.SANDYGAST]: 3, + [Species.PYUKUMUKU]: 2, + [Species.TYPE_NULL]: 5, + [Species.MINIOR]: 4, + [Species.KOMALA]: 3, + [Species.TURTONATOR]: 4, + [Species.TOGEDEMARU]: 3, + [Species.MIMIKYU]: 4, + [Species.BRUXISH]: 4, + [Species.DRAMPA]: 4, + [Species.DHELMISE]: 4, + [Species.JANGMO_O]: 4, + [Species.TAPU_KOKO]: 6, + [Species.TAPU_LELE]: 6, + [Species.TAPU_BULU]: 6, + [Species.TAPU_FINI]: 6, + [Species.COSMOG]: 7, + [Species.NIHILEGO]: 6, + [Species.BUZZWOLE]: 6, + [Species.PHEROMOSA]: 7, + [Species.XURKITREE]: 6, + [Species.CELESTEELA]: 6, + [Species.KARTANA]: 7, + [Species.GUZZLORD]: 6, + [Species.NECROZMA]: 8, + [Species.MAGEARNA]: 7, + [Species.MARSHADOW]: 7, + [Species.POIPOLE]: 7, + [Species.STAKATAKA]: 6, + [Species.BLACEPHALON]: 7, + [Species.ZERAORA]: 6, + [Species.MELTAN]: 6, + [Species.ALOLA_RATTATA]: 1, + [Species.ALOLA_SANDSHREW]: 2, + [Species.ALOLA_VULPIX]: 3, + [Species.ALOLA_DIGLETT]: 2, + [Species.ALOLA_MEOWTH]: 3, + [Species.ALOLA_GEODUDE]: 3, + [Species.ALOLA_GRIMER]: 3, + + [Species.GROOKEY]: 3, + [Species.SCORBUNNY]: 4, + [Species.SOBBLE]: 3, + [Species.SKWOVET]: 2, + [Species.ROOKIDEE]: 3, + [Species.BLIPBUG]: 2, + [Species.NICKIT]: 1, + [Species.GOSSIFLEUR]: 2, + [Species.WOOLOO]: 2, + [Species.CHEWTLE]: 3, + [Species.YAMPER]: 2, + [Species.ROLYCOLY]: 3, + [Species.APPLIN]: 3, + [Species.SILICOBRA]: 3, + [Species.CRAMORANT]: 3, + [Species.ARROKUDA]: 3, + [Species.TOXEL]: 3, + [Species.SIZZLIPEDE]: 3, + [Species.CLOBBOPUS]: 2, + [Species.SINISTEA]: 3, + [Species.HATENNA]: 3, + [Species.IMPIDIMP]: 3, + [Species.MILCERY]: 3, + [Species.FALINKS]: 4, + [Species.PINCURCHIN]: 3, + [Species.SNOM]: 3, + [Species.STONJOURNER]: 3, + [Species.EISCUE]: 3, + [Species.INDEEDEE]: 4, + [Species.MORPEKO]: 3, + [Species.CUFANT]: 3, + [Species.DRACOZOLT]: 5, + [Species.ARCTOZOLT]: 4, + [Species.DRACOVISH]: 5, + [Species.ARCTOVISH]: 4, + [Species.DURALUDON]: 5, + [Species.DREEPY]: 4, + [Species.ZACIAN]: 9, + [Species.ZAMAZENTA]: 8, + [Species.ETERNATUS]: 10, + [Species.KUBFU]: 6, + [Species.ZARUDE]: 6, + [Species.REGIELEKI]: 6, + [Species.REGIDRAGO]: 6, + [Species.GLASTRIER]: 6, + [Species.SPECTRIER]: 7, + [Species.CALYREX]: 8, + [Species.GALAR_MEOWTH]: 3, + [Species.GALAR_PONYTA]: 2, + [Species.GALAR_SLOWPOKE]: 3, + [Species.GALAR_FARFETCHD]: 3, + [Species.GALAR_CORSOLA]: 3, + [Species.GALAR_ZIGZAGOON]: 3, + [Species.GALAR_DARUMAKA]: 4, + [Species.GALAR_YAMASK]: 3, + [Species.GALAR_STUNFISK]: 2, + [Species.GALAR_MR_MIME]: 3, + [Species.GALAR_ARTICUNO]: 6, + [Species.GALAR_ZAPDOS]: 6, + [Species.GALAR_MOLTRES]: 6, + [Species.HISUI_GROWLITHE]: 4, + [Species.HISUI_VOLTORB]: 3, + [Species.HISUI_QWILFISH]: 4, + [Species.HISUI_SNEASEL]: 5, + [Species.HISUI_ZORUA]: 3, + [Species.ENAMORUS]: 7, + + [Species.SPRIGATITO]: 4, + [Species.FUECOCO]: 4, + [Species.QUAXLY]: 4, + [Species.LECHONK]: 2, + [Species.TAROUNTULA]: 1, + [Species.NYMBLE]: 3, + [Species.PAWMI]: 3, + [Species.TANDEMAUS]: 4, + [Species.FIDOUGH]: 2, + [Species.SMOLIV]: 3, + [Species.SQUAWKABILLY]: 2, + [Species.NACLI]: 4, + [Species.CHARCADET]: 4, + [Species.TADBULB]: 3, + [Species.WATTREL]: 3, + [Species.MASCHIFF]: 3, + [Species.SHROODLE]: 2, + [Species.BRAMBLIN]: 3, + [Species.TOEDSCOOL]: 3, + [Species.KLAWF]: 3, + [Species.CAPSAKID]: 3, + [Species.RELLOR]: 2, + [Species.FLITTLE]: 3, + [Species.TINKATINK]: 4, + [Species.WIGLETT]: 2, + [Species.BOMBIRDIER]: 3, + [Species.FINIZEN]: 3, + [Species.VAROOM]: 4, + [Species.CYCLIZAR]: 4, + [Species.ORTHWORM]: 4, + [Species.GLIMMET]: 4, + [Species.GREAVARD]: 3, + [Species.FLAMIGO]: 4, + [Species.CETODDLE]: 3, + [Species.VELUZA]: 4, + [Species.DONDOZO]: 4, + [Species.TATSUGIRI]: 4, + [Species.GREAT_TUSK]: 6, + [Species.SCREAM_TAIL]: 6, + [Species.BRUTE_BONNET]: 6, + [Species.FLUTTER_MANE]: 7, + [Species.SLITHER_WING]: 6, + [Species.SANDY_SHOCKS]: 6, + [Species.IRON_TREADS]: 6, + [Species.IRON_BUNDLE]: 6, + [Species.IRON_HANDS]: 6, + [Species.IRON_JUGULIS]: 6, + [Species.IRON_MOTH]: 6, + [Species.IRON_THORNS]: 6, + [Species.FRIGIBAX]: 4, + [Species.GIMMIGHOUL]: 4, + [Species.WO_CHIEN]: 6, + [Species.CHIEN_PAO]: 7, + [Species.TING_LU]: 6, + [Species.CHI_YU]: 7, + [Species.ROARING_MOON]: 6, + [Species.IRON_VALIANT]: 6, + [Species.KORAIDON]: 9, + [Species.MIRAIDON]: 9, + [Species.WALKING_WAKE]: 6, + [Species.IRON_LEAVES]: 6, + [Species.POLTCHAGEIST]: 4, + [Species.OKIDOGI]: 6, + [Species.MUNKIDORI]: 6, + [Species.FEZANDIPITI]: 6, + [Species.OGERPON]: 7, + [Species.GOUGING_FIRE]: 7, + [Species.RAGING_BOLT]: 6, + [Species.IRON_BOULDER]: 7, + [Species.IRON_CROWN]: 6, + [Species.TERAPAGOS]: 8, + [Species.PECHARUNT]: 6, + [Species.PALDEA_TAUROS]: 5, + [Species.PALDEA_WOOPER]: 3, + [Species.BLOODMOON_URSALUNA]: 6, +}; + +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 + { passive: 35, costReduction: [20, 50], egg: 25 }, // 3 Cost + { passive: 30, costReduction: [15, 40], egg: 20 }, // 4 Cost + { passive: 25, costReduction: [12, 35], egg: 18 }, // 5 Cost + { passive: 20, costReduction: [10, 30], egg: 15 }, // 6 Cost + { passive: 15, costReduction: [8, 20], egg: 12 }, // 7 Cost + { passive: 10, costReduction: [5, 15], egg: 10 }, // 8 Cost + { passive: 10, costReduction: [5, 15], egg: 10 }, // 9 Cost + { 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/tms.ts b/src/data/balance/tms.ts similarity index 99% rename from src/data/tms.ts rename to src/data/balance/tms.ts index 9dea6d74a869..e08b677c30c1 100644 --- a/src/data/tms.ts +++ b/src/data/balance/tms.ts @@ -1,4 +1,4 @@ -import { ModifierTier } from "../modifier/modifier-tier"; +import { ModifierTier } from "#app/modifier/modifier-tier"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 4cdaef7b1b36..e3ee818cee95 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -1,20 +1,21 @@ -import * as Utils from "../utils"; +import * as Utils from "#app/utils"; import i18next from "i18next"; import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data"; -import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species"; +import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +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"; import { GameMode } from "#app/game-mode"; -import { Type } from "./type"; +import { Type } from "#app/data/type"; import { Challenges } from "#enums/challenges"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; -import { Nature } from "./nature"; -import { Moves } from "#app/enums/moves"; -import { TypeColor, TypeShadow } from "#app/enums/color"; -import { pokemonEvolutions } from "./pokemon-evolutions"; -import { pokemonFormChanges } from "./pokemon-forms"; +import { Nature } from "#app/data/nature"; +import { Moves } from "#enums/moves"; +import { TypeColor, TypeShadow } from "#enums/color"; +import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; +import { pokemonFormChanges } from "#app/data/pokemon-forms"; /** A constant for the default max cost of the starting party before a run */ const DEFAULT_PARTY_MAX_COST = 10; @@ -637,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; @@ -719,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 370b13ea3a39..0decab63f4f2 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -1,10 +1,11 @@ import { PartyMemberStrength } from "#enums/party-member-strength"; import { Species } from "#enums/species"; -import BattleScene from "../battle-scene"; -import { PlayerPokemon } from "../field/pokemon"; -import { Starter } from "../ui/starter-select-ui-handler"; -import * as Utils from "../utils"; -import PokemonSpecies, { PokemonSpeciesForm, getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species"; +import BattleScene from "#app/battle-scene"; +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 { speciesStarterCosts } from "#app/data/balance/starters"; export interface DailyRunConfig { seed: integer; @@ -46,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 b37240a20283..c83554f2a19d 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -1,30 +1,19 @@ -import BattleScene from "../battle-scene"; -import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./pokemon-species"; -import { VariantTier } from "../enums/variant-tier"; -import * as Utils from "../utils"; +import BattleScene from "#app/battle-scene"; +import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; +import { speciesStarterCosts } from "#app/data/balance/starters"; +import { VariantTier } from "#enums/variant-tier"; +import * as Utils from "#app/utils"; import Overrides from "#app/overrides"; -import { pokemonPrevolutions } from "./pokemon-evolutions"; +import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; import { PlayerPokemon } from "#app/field/pokemon"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; import { Species } from "#enums/species"; -import { EggSourceType } from "#app/enums/egg-source-types"; +import { EggSourceType } from "#enums/egg-source-types"; +import { MANAPHY_EGG_MANAPHY_RATE, SAME_SPECIES_EGG_HA_RATE, GACHA_EGG_HA_RATE, GACHA_DEFAULT_RARE_EGGMOVE_RATE, SAME_SPECIES_EGG_RARE_EGGMOVE_RATE, GACHA_MOVE_UP_RARE_EGGMOVE_RATE, GACHA_DEFAULT_SHINY_RATE, GACHA_SHINY_UP_SHINY_RATE, SAME_SPECIES_EGG_SHINY_RATE, EGG_PITY_LEGENDARY_THRESHOLD, EGG_PITY_EPIC_THRESHOLD, EGG_PITY_RARE_THRESHOLD, SHINY_VARIANT_CHANCE, SHINY_EPIC_CHANCE, GACHA_DEFAULT_COMMON_EGG_THRESHOLD, GACHA_DEFAULT_RARE_EGG_THRESHOLD, GACHA_DEFAULT_EPIC_EGG_THRESHOLD, GACHA_LEGENDARY_UP_THRESHOLD_OFFSET, HATCH_WAVES_MANAPHY_EGG, HATCH_WAVES_COMMON_EGG, HATCH_WAVES_RARE_EGG, HATCH_WAVES_EPIC_EGG, HATCH_WAVES_LEGENDARY_EGG } from "#app/data/balance/rates"; export const EGG_SEED = 1073741824; -// Rates for specific random properties in 1/x -const DEFAULT_SHINY_RATE = 128; -const GACHA_SHINY_UP_SHINY_RATE = 64; -const SAME_SPECIES_EGG_SHINY_RATE = 12; -const SAME_SPECIES_EGG_HA_RATE = 8; -const MANAPHY_EGG_MANAPHY_RATE = 8; -const GACHA_EGG_HA_RATE = 192; - -// 1/x for legendary eggs, 1/x*2 for epic eggs, 1/x*4 for rare eggs, and 1/x*8 for common eggs -const DEFAULT_RARE_EGGMOVE_RATE = 6; -const SAME_SPECIES_EGG_RARE_EGGMOVE_RATE = 3; -const GACHA_MOVE_UP_RARE_EGGMOVE_RATE = 3; - /** Egg options to override egg properties */ export interface IEggOptions { /** Id. Used to check if egg type will be manaphy (id % 204 === 0) */ @@ -323,7 +312,7 @@ export class Egg { //// private rollEggMoveIndex() { - let baseChance = DEFAULT_RARE_EGGMOVE_RATE; + let baseChance = GACHA_DEFAULT_RARE_EGGMOVE_RATE; switch (this._sourceType) { case EggSourceType.SAME_SPECIES_EGG: baseChance = SAME_SPECIES_EGG_RARE_EGGMOVE_RATE; @@ -341,24 +330,24 @@ export class Egg { private getEggTierDefaultHatchWaves(eggTier?: EggTier): number { if (this._species === Species.PHIONE || this._species === Species.MANAPHY) { - return 50; + return HATCH_WAVES_MANAPHY_EGG; } switch (eggTier ?? this._tier) { case EggTier.COMMON: - return 10; + return HATCH_WAVES_COMMON_EGG; case EggTier.GREAT: - return 25; + return HATCH_WAVES_RARE_EGG; case EggTier.ULTRA: - return 50; + return HATCH_WAVES_EPIC_EGG; } - return 100; + return HATCH_WAVES_LEGENDARY_EGG; } private rollEggTier(): EggTier { - const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? 1 : 0; + const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? GACHA_LEGENDARY_UP_THRESHOLD_OFFSET : 0; const tierValue = Utils.randInt(256); - return tierValue >= 52 + tierValueOffset ? EggTier.COMMON : tierValue >= 8 + tierValueOffset ? EggTier.GREAT : tierValue >= 1 + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER; + return tierValue >= GACHA_DEFAULT_COMMON_EGG_THRESHOLD + tierValueOffset ? EggTier.COMMON : tierValue >= GACHA_DEFAULT_RARE_EGG_THRESHOLD + tierValueOffset ? EggTier.GREAT : tierValue >= GACHA_DEFAULT_EPIC_EGG_THRESHOLD + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER; } private rollSpecies(scene: BattleScene): Species | null { @@ -409,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); @@ -441,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); @@ -475,7 +464,7 @@ export class Egg { * @returns True if the egg is shiny **/ private rollShiny(): boolean { - let shinyChance = DEFAULT_SHINY_RATE; + let shinyChance = GACHA_DEFAULT_SHINY_RATE; switch (this._sourceType) { case EggSourceType.GACHA_SHINY: shinyChance = GACHA_SHINY_UP_SHINY_RATE; @@ -498,9 +487,9 @@ export class Egg { } const rand = Utils.randSeedInt(10); - if (rand >= 4) { + if (rand >= SHINY_VARIANT_CHANCE) { return VariantTier.STANDARD; // 6/10 - } else if (rand >= 1) { + } else if (rand >= SHINY_EPIC_CHANCE) { return VariantTier.RARE; // 3/10 } else { return VariantTier.EPIC; // 1/10 @@ -508,16 +497,16 @@ export class Egg { } private checkForPityTierOverrides(scene: BattleScene): void { - const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? 1 : 0; + const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? GACHA_LEGENDARY_UP_THRESHOLD_OFFSET : 0; scene.gameData.eggPity[EggTier.GREAT] += 1; scene.gameData.eggPity[EggTier.ULTRA] += 1; scene.gameData.eggPity[EggTier.MASTER] += 1 + tierValueOffset; // These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered. - if (scene.gameData.eggPity[EggTier.MASTER] >= 412 && this._tier === EggTier.COMMON) { + if (scene.gameData.eggPity[EggTier.MASTER] >= EGG_PITY_LEGENDARY_THRESHOLD && this._tier === EggTier.COMMON) { this._tier = EggTier.MASTER; - } else if (scene.gameData.eggPity[EggTier.ULTRA] >= 59 && this._tier === EggTier.COMMON) { + } else if (scene.gameData.eggPity[EggTier.ULTRA] >= EGG_PITY_EPIC_THRESHOLD && this._tier === EggTier.COMMON) { this._tier = EggTier.ULTRA; - } else if (scene.gameData.eggPity[EggTier.GREAT] >= 9 && this._tier === EggTier.COMMON) { + } else if (scene.gameData.eggPity[EggTier.GREAT] >= EGG_PITY_RARE_THRESHOLD && this._tier === EggTier.COMMON) { this._tier = EggTier.GREAT; } scene.gameData.eggPity[this._tier] = 0; @@ -544,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; } @@ -567,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()); @@ -594,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 1de83374db23..e445a8f481db 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 @@ -8,7 +8,8 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/myst import { AbilityRequirement, CombinationPokemonRequirement, MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; 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, speciesStarters } from "#app/data/pokemon-species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +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"; @@ -71,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 24e777d8c885..e4c0fdc2d98c 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 @@ -10,7 +10,8 @@ import { Biome } from "#enums/biome"; import { TrainerType } from "#enums/trainer-type"; import i18next from "i18next"; import { Species } from "#enums/species"; -import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { speciesStarterCosts } from "#app/data/balance/starters"; import { Nature } from "#enums/nature"; import { Moves } from "#enums/moves"; import { PlayerPokemon } from "#app/field/pokemon"; @@ -454,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 4e199493c245..5486c130a28a 100644 --- a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts @@ -5,7 +5,8 @@ import BattleScene from "#app/battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; 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, speciesStarters } from "#app/data/pokemon-species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +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"; @@ -88,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 107e73c2fb79..ff993f339cb0 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/pokemon-species"; +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/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 5fa2a7066a51..6069e1abcfbf 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -5,12 +5,12 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; -import { Nature } from "../nature"; -import { EvolutionItem, pokemonEvolutions } from "../pokemon-evolutions"; -import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeItemTrigger } from "../pokemon-forms"; -import { StatusEffect } from "../status-effect"; -import { Type } from "../type"; -import { WeatherType } from "../weather"; +import { Nature } from "#app/data/nature"; +import { EvolutionItem, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; +import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; +import { StatusEffect } from "#app/data/status-effect"; +import { Type } from "#app/data/type"; +import { WeatherType } from "#app/data/weather"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { AttackTypeBoosterModifier } from "#app/modifier/modifier"; import { AttackTypeBoosterModifierType } from "#app/modifier/modifier-type"; diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 0ce4a5c2506a..14fd5d7d6d16 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -32,7 +32,7 @@ import { FunAndGamesEncounter } from "#app/data/mystery-encounters/encounters/fu import { UncommonBreedEncounter } from "#app/data/mystery-encounters/encounters/uncommon-breed-encounter"; import { GlobalTradeSystemEncounter } from "#app/data/mystery-encounters/encounters/global-trade-system-encounter"; import { TheExpertPokemonBreederEncounter } from "#app/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter"; -import { getBiomeName } from "#app/data/biomes"; +import { getBiomeName } from "#app/data/balance/biomes"; /** * Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index ca02c8bdfd6c..18adaa4f6f4c 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -1,5 +1,5 @@ import Battle, { BattlerIndex, BattleType } from "#app/battle"; -import { biomeLinks, BiomePoolTier } from "#app/data/biomes"; +import { biomeLinks, BiomePoolTier } from "#app/data/balance/biomes"; import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import { AVERAGE_ENCOUNTERS_PER_RUN_TARGET, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index fb67305c78df..fc459c78e37f 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -12,7 +12,8 @@ import { Mode } from "#app/ui/ui"; import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; import { Species } from "#enums/species"; import { Type } from "#app/data/type"; -import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; +import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; +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"; @@ -206,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 ae1be63e4a07..b710c40e1d56 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -4,18 +4,19 @@ import { PartyMemberStrength } from "#enums/party-member-strength"; import { Species } from "#enums/species"; import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; import i18next from "i18next"; -import BattleScene, { AnySound } from "../battle-scene"; -import { GameMode } from "../game-mode"; -import { StarterMoveset } from "../system/game-data"; -import * as Utils from "../utils"; -import { uncatchableSpecies } from "./biomes"; -import { speciesEggMoves } from "./egg-moves"; -import { GrowthRate } from "./exp"; -import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions"; -import { Type } from "./type"; -import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves"; +import BattleScene, { AnySound } from "#app/battle-scene"; +import { GameMode } from "#app/game-mode"; +import { StarterMoveset } from "#app/system/game-data"; +import * as Utils from "#app/utils"; +import { uncatchableSpecies } from "#app/data/balance/biomes"; +import { speciesEggMoves } from "#app/data/balance/egg-moves"; +import { GrowthRate } from "#app/data/exp"; +import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +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 "./variant"; +import { Variant, VariantSet, variantColorCache, variantData } from "#app/data/variant"; +import { speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; import { SpeciesFormKey } from "#enums/species-form-key"; export enum Region { @@ -173,7 +174,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; @@ -929,6 +930,40 @@ export class PokemonForm extends PokemonSpeciesForm { } } +export const noStarterFormKeys: string[] = [ + SpeciesFormKey.MEGA, + SpeciesFormKey.MEGA_X, + SpeciesFormKey.MEGA_Y, + SpeciesFormKey.PRIMAL, + SpeciesFormKey.ORIGIN, + SpeciesFormKey.THERIAN, + SpeciesFormKey.GIGANTAMAX, + SpeciesFormKey.GIGANTAMAX_RAPID, + SpeciesFormKey.GIGANTAMAX_SINGLE, + SpeciesFormKey.ETERNAMAX +].map(k => k.toString()); + +/** +* Method to get the daily list of starters with Pokerus. +* @param scene {@linkcode BattleScene} used as part of RNG +* @returns A list of starters with Pokerus +*/ +export function getPokerusStarters(scene: BattleScene): PokemonSpecies[] { + const pokerusStarters: PokemonSpecies[] = []; + const date = new Date(); + date.setUTCHours(0, 0, 0, 0); + scene.executeWithSeedOffset(() => { + while (pokerusStarters.length < POKERUS_STARTER_COUNT) { + const randomSpeciesId = parseInt(Utils.randSeedItem(Object.keys(speciesStarterCosts)), 10); + const species = getPokemonSpecies(randomSpeciesId); + if (!pokerusStarters.includes(species)) { + pokerusStarters.push(species); + } + } + }, 0, date.getTime().toString()); + return pokerusStarters; +} + export const allSpecies: PokemonSpecies[] = []; export function initSpecies() { @@ -2714,1235 +2749,6 @@ export function initSpecies() { ); } -export const speciesStarters = { - [Species.BULBASAUR]: 3, - [Species.CHARMANDER]: 3, - [Species.SQUIRTLE]: 3, - [Species.CATERPIE]: 2, - [Species.WEEDLE]: 1, - [Species.PIDGEY]: 1, - [Species.RATTATA]: 1, - [Species.SPEAROW]: 1, - [Species.EKANS]: 2, - [Species.PIKACHU]: 3, - [Species.SANDSHREW]: 2, - [Species.NIDORAN_F]: 3, - [Species.NIDORAN_M]: 3, - [Species.CLEFAIRY]: 3, - [Species.VULPIX]: 3, - [Species.JIGGLYPUFF]: 2, - [Species.ZUBAT]: 3, - [Species.ODDISH]: 3, - [Species.PARAS]: 2, - [Species.VENONAT]: 2, - [Species.DIGLETT]: 2, - [Species.MEOWTH]: 3, - [Species.PSYDUCK]: 2, - [Species.MANKEY]: 4, - [Species.GROWLITHE]: 4, - [Species.POLIWAG]: 2, - [Species.ABRA]: 4, - [Species.MACHOP]: 3, - [Species.BELLSPROUT]: 2, - [Species.TENTACOOL]: 3, - [Species.GEODUDE]: 3, - [Species.PONYTA]: 2, - [Species.SLOWPOKE]: 3, - [Species.MAGNEMITE]: 4, - [Species.FARFETCHD]: 2, - [Species.DODUO]: 3, - [Species.SEEL]: 1, - [Species.GRIMER]: 2, - [Species.SHELLDER]: 5, - [Species.GASTLY]: 4, - [Species.ONIX]: 3, - [Species.DROWZEE]: 2, - [Species.KRABBY]: 3, - [Species.VOLTORB]: 2, - [Species.EXEGGCUTE]: 3, - [Species.CUBONE]: 3, - [Species.HITMONLEE]: 4, - [Species.HITMONCHAN]: 4, - [Species.LICKITUNG]: 3, - [Species.KOFFING]: 2, - [Species.RHYHORN]: 3, - [Species.CHANSEY]: 3, - [Species.TANGELA]: 3, - [Species.KANGASKHAN]: 4, - [Species.HORSEA]: 3, - [Species.GOLDEEN]: 2, - [Species.STARYU]: 3, - [Species.MR_MIME]: 3, - [Species.SCYTHER]: 5, - [Species.JYNX]: 4, - [Species.ELECTABUZZ]: 4, - [Species.MAGMAR]: 4, - [Species.PINSIR]: 4, - [Species.TAUROS]: 4, - [Species.MAGIKARP]: 4, - [Species.LAPRAS]: 4, - [Species.DITTO]: 2, - [Species.EEVEE]: 3, - [Species.PORYGON]: 4, - [Species.OMANYTE]: 3, - [Species.KABUTO]: 3, - [Species.AERODACTYL]: 5, - [Species.SNORLAX]: 5, - [Species.ARTICUNO]: 6, - [Species.ZAPDOS]: 6, - [Species.MOLTRES]: 6, - [Species.DRATINI]: 4, - [Species.MEWTWO]: 8, - [Species.MEW]: 6, - - [Species.CHIKORITA]: 2, - [Species.CYNDAQUIL]: 3, - [Species.TOTODILE]: 3, - [Species.SENTRET]: 1, - [Species.HOOTHOOT]: 2, - [Species.LEDYBA]: 1, - [Species.SPINARAK]: 1, - [Species.CHINCHOU]: 2, - [Species.PICHU]: 2, - [Species.CLEFFA]: 2, - [Species.IGGLYBUFF]: 1, - [Species.TOGEPI]: 3, - [Species.NATU]: 2, - [Species.MAREEP]: 2, - [Species.MARILL]: 4, - [Species.SUDOWOODO]: 3, - [Species.HOPPIP]: 2, - [Species.AIPOM]: 2, - [Species.SUNKERN]: 1, - [Species.YANMA]: 3, - [Species.WOOPER]: 2, - [Species.MURKROW]: 3, - [Species.MISDREAVUS]: 2, - [Species.UNOWN]: 1, - [Species.WOBBUFFET]: 2, - [Species.GIRAFARIG]: 3, - [Species.PINECO]: 2, - [Species.DUNSPARCE]: 3, - [Species.GLIGAR]: 3, - [Species.SNUBBULL]: 2, - [Species.QWILFISH]: 3, - [Species.SHUCKLE]: 3, - [Species.HERACROSS]: 5, - [Species.SNEASEL]: 4, - [Species.TEDDIURSA]: 4, - [Species.SLUGMA]: 2, - [Species.SWINUB]: 3, - [Species.CORSOLA]: 2, - [Species.REMORAID]: 2, - [Species.DELIBIRD]: 2, - [Species.MANTINE]: 3, - [Species.SKARMORY]: 4, - [Species.HOUNDOUR]: 3, - [Species.PHANPY]: 3, - [Species.STANTLER]: 3, - [Species.SMEARGLE]: 1, - [Species.TYROGUE]: 3, - [Species.SMOOCHUM]: 3, - [Species.ELEKID]: 3, - [Species.MAGBY]: 3, - [Species.MILTANK]: 4, - [Species.RAIKOU]: 6, - [Species.ENTEI]: 6, - [Species.SUICUNE]: 6, - [Species.LARVITAR]: 4, - [Species.LUGIA]: 8, - [Species.HO_OH]: 8, - [Species.CELEBI]: 6, - - [Species.TREECKO]: 3, - [Species.TORCHIC]: 4, - [Species.MUDKIP]: 3, - [Species.POOCHYENA]: 2, - [Species.ZIGZAGOON]: 2, - [Species.WURMPLE]: 1, - [Species.LOTAD]: 3, - [Species.SEEDOT]: 2, - [Species.TAILLOW]: 3, - [Species.WINGULL]: 2, - [Species.RALTS]: 3, - [Species.SURSKIT]: 2, - [Species.SHROOMISH]: 3, - [Species.SLAKOTH]: 4, - [Species.NINCADA]: 4, - [Species.WHISMUR]: 2, - [Species.MAKUHITA]: 3, - [Species.AZURILL]: 4, - [Species.NOSEPASS]: 2, - [Species.SKITTY]: 1, - [Species.SABLEYE]: 2, - [Species.MAWILE]: 3, - [Species.ARON]: 3, - [Species.MEDITITE]: 3, - [Species.ELECTRIKE]: 2, - [Species.PLUSLE]: 2, - [Species.MINUN]: 2, - [Species.VOLBEAT]: 2, - [Species.ILLUMISE]: 2, - [Species.ROSELIA]: 3, - [Species.GULPIN]: 1, - [Species.CARVANHA]: 3, - [Species.WAILMER]: 2, - [Species.NUMEL]: 2, - [Species.TORKOAL]: 3, - [Species.SPOINK]: 2, - [Species.SPINDA]: 1, - [Species.TRAPINCH]: 3, - [Species.CACNEA]: 2, - [Species.SWABLU]: 2, - [Species.ZANGOOSE]: 4, - [Species.SEVIPER]: 3, - [Species.LUNATONE]: 3, - [Species.SOLROCK]: 3, - [Species.BARBOACH]: 2, - [Species.CORPHISH]: 3, - [Species.BALTOY]: 2, - [Species.LILEEP]: 3, - [Species.ANORITH]: 3, - [Species.FEEBAS]: 4, - [Species.CASTFORM]: 1, - [Species.KECLEON]: 2, - [Species.SHUPPET]: 2, - [Species.DUSKULL]: 3, - [Species.TROPIUS]: 3, - [Species.CHIMECHO]: 3, - [Species.ABSOL]: 4, - [Species.WYNAUT]: 2, - [Species.SNORUNT]: 2, - [Species.SPHEAL]: 2, - [Species.CLAMPERL]: 3, - [Species.RELICANTH]: 3, - [Species.LUVDISC]: 1, - [Species.BAGON]: 4, - [Species.BELDUM]: 4, - [Species.REGIROCK]: 6, - [Species.REGICE]: 6, - [Species.REGISTEEL]: 6, - [Species.LATIAS]: 7, - [Species.LATIOS]: 7, - [Species.KYOGRE]: 9, - [Species.GROUDON]: 9, - [Species.RAYQUAZA]: 9, - [Species.JIRACHI]: 7, - [Species.DEOXYS]: 7, - - [Species.TURTWIG]: 3, - [Species.CHIMCHAR]: 3, - [Species.PIPLUP]: 3, - [Species.STARLY]: 3, - [Species.BIDOOF]: 2, - [Species.KRICKETOT]: 1, - [Species.SHINX]: 2, - [Species.BUDEW]: 3, - [Species.CRANIDOS]: 3, - [Species.SHIELDON]: 3, - [Species.BURMY]: 2, - [Species.COMBEE]: 2, - [Species.PACHIRISU]: 2, - [Species.BUIZEL]: 2, - [Species.CHERUBI]: 1, - [Species.SHELLOS]: 3, - [Species.DRIFLOON]: 2, - [Species.BUNEARY]: 2, - [Species.GLAMEOW]: 2, - [Species.CHINGLING]: 2, - [Species.STUNKY]: 2, - [Species.BRONZOR]: 3, - [Species.BONSLY]: 2, - [Species.MIME_JR]: 2, - [Species.HAPPINY]: 2, - [Species.CHATOT]: 2, - [Species.SPIRITOMB]: 4, - [Species.GIBLE]: 4, - [Species.MUNCHLAX]: 4, - [Species.RIOLU]: 3, - [Species.HIPPOPOTAS]: 3, - [Species.SKORUPI]: 3, - [Species.CROAGUNK]: 2, - [Species.CARNIVINE]: 2, - [Species.FINNEON]: 1, - [Species.MANTYKE]: 2, - [Species.SNOVER]: 2, - [Species.ROTOM]: 5, - [Species.UXIE]: 6, - [Species.MESPRIT]: 6, - [Species.AZELF]: 6, - [Species.DIALGA]: 8, - [Species.PALKIA]: 8, - [Species.HEATRAN]: 6, - [Species.REGIGIGAS]: 7, - [Species.GIRATINA]: 8, - [Species.CRESSELIA]: 6, - [Species.PHIONE]: 4, - [Species.MANAPHY]: 7, - [Species.DARKRAI]: 7, - [Species.SHAYMIN]: 6, - [Species.ARCEUS]: 9, - - [Species.VICTINI]: 7, - [Species.SNIVY]: 3, - [Species.TEPIG]: 3, - [Species.OSHAWOTT]: 3, - [Species.PATRAT]: 1, - [Species.LILLIPUP]: 3, - [Species.PURRLOIN]: 2, - [Species.PANSAGE]: 2, - [Species.PANSEAR]: 2, - [Species.PANPOUR]: 2, - [Species.MUNNA]: 2, - [Species.PIDOVE]: 1, - [Species.BLITZLE]: 2, - [Species.ROGGENROLA]: 3, - [Species.WOOBAT]: 3, - [Species.DRILBUR]: 4, - [Species.AUDINO]: 3, - [Species.TIMBURR]: 4, - [Species.TYMPOLE]: 3, - [Species.THROH]: 4, - [Species.SAWK]: 4, - [Species.SEWADDLE]: 2, - [Species.VENIPEDE]: 3, - [Species.COTTONEE]: 3, - [Species.PETILIL]: 3, - [Species.BASCULIN]: 4, - [Species.SANDILE]: 4, - [Species.DARUMAKA]: 4, - [Species.MARACTUS]: 2, - [Species.DWEBBLE]: 2, - [Species.SCRAGGY]: 3, - [Species.SIGILYPH]: 4, - [Species.YAMASK]: 3, - [Species.TIRTOUGA]: 3, - [Species.ARCHEN]: 3, - [Species.TRUBBISH]: 2, - [Species.ZORUA]: 3, - [Species.MINCCINO]: 3, - [Species.GOTHITA]: 3, - [Species.SOLOSIS]: 3, - [Species.DUCKLETT]: 2, - [Species.VANILLITE]: 3, - [Species.DEERLING]: 2, - [Species.EMOLGA]: 2, - [Species.KARRABLAST]: 3, - [Species.FOONGUS]: 2, - [Species.FRILLISH]: 3, - [Species.ALOMOMOLA]: 4, - [Species.JOLTIK]: 3, - [Species.FERROSEED]: 3, - [Species.KLINK]: 3, - [Species.TYNAMO]: 2, - [Species.ELGYEM]: 2, - [Species.LITWICK]: 3, - [Species.AXEW]: 4, - [Species.CUBCHOO]: 2, - [Species.CRYOGONAL]: 4, - [Species.SHELMET]: 2, - [Species.STUNFISK]: 3, - [Species.MIENFOO]: 3, - [Species.DRUDDIGON]: 4, - [Species.GOLETT]: 3, - [Species.PAWNIARD]: 4, - [Species.BOUFFALANT]: 4, - [Species.RUFFLET]: 3, - [Species.VULLABY]: 3, - [Species.HEATMOR]: 3, - [Species.DURANT]: 4, - [Species.DEINO]: 4, - [Species.LARVESTA]: 4, - [Species.COBALION]: 6, - [Species.TERRAKION]: 6, - [Species.VIRIZION]: 6, - [Species.TORNADUS]: 7, - [Species.THUNDURUS]: 7, - [Species.RESHIRAM]: 8, - [Species.ZEKROM]: 8, - [Species.LANDORUS]: 7, - [Species.KYUREM]: 8, - [Species.KELDEO]: 6, - [Species.MELOETTA]: 7, - [Species.GENESECT]: 6, - - [Species.CHESPIN]: 3, - [Species.FENNEKIN]: 3, - [Species.FROAKIE]: 4, - [Species.BUNNELBY]: 3, - [Species.FLETCHLING]: 3, - [Species.SCATTERBUG]: 2, - [Species.LITLEO]: 2, - [Species.FLABEBE]: 3, - [Species.SKIDDO]: 2, - [Species.PANCHAM]: 3, - [Species.FURFROU]: 3, - [Species.ESPURR]: 2, - [Species.HONEDGE]: 4, - [Species.SPRITZEE]: 2, - [Species.SWIRLIX]: 3, - [Species.INKAY]: 3, - [Species.BINACLE]: 3, - [Species.SKRELP]: 2, - [Species.CLAUNCHER]: 3, - [Species.HELIOPTILE]: 3, - [Species.TYRUNT]: 3, - [Species.AMAURA]: 3, - [Species.HAWLUCHA]: 4, - [Species.DEDENNE]: 2, - [Species.CARBINK]: 2, - [Species.GOOMY]: 4, - [Species.KLEFKI]: 3, - [Species.PHANTUMP]: 2, - [Species.PUMPKABOO]: 2, - [Species.BERGMITE]: 3, - [Species.NOIBAT]: 3, - [Species.XERNEAS]: 8, - [Species.YVELTAL]: 8, - [Species.ZYGARDE]: 8, - [Species.DIANCIE]: 7, - [Species.HOOPA]: 7, - [Species.VOLCANION]: 6, - [Species.ETERNAL_FLOETTE]: 4, - - [Species.ROWLET]: 3, - [Species.LITTEN]: 3, - [Species.POPPLIO]: 4, - [Species.PIKIPEK]: 2, - [Species.YUNGOOS]: 2, - [Species.GRUBBIN]: 3, - [Species.CRABRAWLER]: 3, - [Species.ORICORIO]: 3, - [Species.CUTIEFLY]: 3, - [Species.ROCKRUFF]: 3, - [Species.WISHIWASHI]: 2, - [Species.MAREANIE]: 2, - [Species.MUDBRAY]: 3, - [Species.DEWPIDER]: 3, - [Species.FOMANTIS]: 2, - [Species.MORELULL]: 2, - [Species.SALANDIT]: 3, - [Species.STUFFUL]: 3, - [Species.BOUNSWEET]: 3, - [Species.COMFEY]: 4, - [Species.ORANGURU]: 4, - [Species.PASSIMIAN]: 4, - [Species.WIMPOD]: 3, - [Species.SANDYGAST]: 3, - [Species.PYUKUMUKU]: 2, - [Species.TYPE_NULL]: 5, - [Species.MINIOR]: 4, - [Species.KOMALA]: 3, - [Species.TURTONATOR]: 4, - [Species.TOGEDEMARU]: 3, - [Species.MIMIKYU]: 4, - [Species.BRUXISH]: 4, - [Species.DRAMPA]: 4, - [Species.DHELMISE]: 4, - [Species.JANGMO_O]: 4, - [Species.TAPU_KOKO]: 6, - [Species.TAPU_LELE]: 6, - [Species.TAPU_BULU]: 6, - [Species.TAPU_FINI]: 6, - [Species.COSMOG]: 7, - [Species.NIHILEGO]: 6, - [Species.BUZZWOLE]: 6, - [Species.PHEROMOSA]: 7, - [Species.XURKITREE]: 6, - [Species.CELESTEELA]: 6, - [Species.KARTANA]: 7, - [Species.GUZZLORD]: 6, - [Species.NECROZMA]: 8, - [Species.MAGEARNA]: 7, - [Species.MARSHADOW]: 7, - [Species.POIPOLE]: 7, - [Species.STAKATAKA]: 6, - [Species.BLACEPHALON]: 7, - [Species.ZERAORA]: 6, - [Species.MELTAN]: 6, - [Species.ALOLA_RATTATA]: 1, - [Species.ALOLA_SANDSHREW]: 2, - [Species.ALOLA_VULPIX]: 3, - [Species.ALOLA_DIGLETT]: 2, - [Species.ALOLA_MEOWTH]: 3, - [Species.ALOLA_GEODUDE]: 3, - [Species.ALOLA_GRIMER]: 3, - - [Species.GROOKEY]: 3, - [Species.SCORBUNNY]: 4, - [Species.SOBBLE]: 3, - [Species.SKWOVET]: 2, - [Species.ROOKIDEE]: 3, - [Species.BLIPBUG]: 2, - [Species.NICKIT]: 1, - [Species.GOSSIFLEUR]: 2, - [Species.WOOLOO]: 2, - [Species.CHEWTLE]: 3, - [Species.YAMPER]: 2, - [Species.ROLYCOLY]: 3, - [Species.APPLIN]: 3, - [Species.SILICOBRA]: 3, - [Species.CRAMORANT]: 3, - [Species.ARROKUDA]: 3, - [Species.TOXEL]: 3, - [Species.SIZZLIPEDE]: 3, - [Species.CLOBBOPUS]: 2, - [Species.SINISTEA]: 3, - [Species.HATENNA]: 3, - [Species.IMPIDIMP]: 3, - [Species.MILCERY]: 3, - [Species.FALINKS]: 4, - [Species.PINCURCHIN]: 3, - [Species.SNOM]: 3, - [Species.STONJOURNER]: 3, - [Species.EISCUE]: 3, - [Species.INDEEDEE]: 4, - [Species.MORPEKO]: 3, - [Species.CUFANT]: 3, - [Species.DRACOZOLT]: 5, - [Species.ARCTOZOLT]: 4, - [Species.DRACOVISH]: 5, - [Species.ARCTOVISH]: 4, - [Species.DURALUDON]: 5, - [Species.DREEPY]: 4, - [Species.ZACIAN]: 9, - [Species.ZAMAZENTA]: 8, - [Species.ETERNATUS]: 10, - [Species.KUBFU]: 6, - [Species.ZARUDE]: 6, - [Species.REGIELEKI]: 6, - [Species.REGIDRAGO]: 6, - [Species.GLASTRIER]: 6, - [Species.SPECTRIER]: 7, - [Species.CALYREX]: 8, - [Species.GALAR_MEOWTH]: 3, - [Species.GALAR_PONYTA]: 2, - [Species.GALAR_SLOWPOKE]: 3, - [Species.GALAR_FARFETCHD]: 3, - [Species.GALAR_CORSOLA]: 3, - [Species.GALAR_ZIGZAGOON]: 3, - [Species.GALAR_DARUMAKA]: 4, - [Species.GALAR_YAMASK]: 3, - [Species.GALAR_STUNFISK]: 2, - [Species.GALAR_MR_MIME]: 3, - [Species.GALAR_ARTICUNO]: 6, - [Species.GALAR_ZAPDOS]: 6, - [Species.GALAR_MOLTRES]: 6, - [Species.HISUI_GROWLITHE]: 4, - [Species.HISUI_VOLTORB]: 3, - [Species.HISUI_QWILFISH]: 4, - [Species.HISUI_SNEASEL]: 5, - [Species.HISUI_ZORUA]: 3, - [Species.ENAMORUS]: 7, - - [Species.SPRIGATITO]: 4, - [Species.FUECOCO]: 4, - [Species.QUAXLY]: 4, - [Species.LECHONK]: 2, - [Species.TAROUNTULA]: 1, - [Species.NYMBLE]: 3, - [Species.PAWMI]: 3, - [Species.TANDEMAUS]: 4, - [Species.FIDOUGH]: 2, - [Species.SMOLIV]: 3, - [Species.SQUAWKABILLY]: 2, - [Species.NACLI]: 4, - [Species.CHARCADET]: 4, - [Species.TADBULB]: 3, - [Species.WATTREL]: 3, - [Species.MASCHIFF]: 3, - [Species.SHROODLE]: 2, - [Species.BRAMBLIN]: 3, - [Species.TOEDSCOOL]: 3, - [Species.KLAWF]: 3, - [Species.CAPSAKID]: 3, - [Species.RELLOR]: 2, - [Species.FLITTLE]: 3, - [Species.TINKATINK]: 4, - [Species.WIGLETT]: 2, - [Species.BOMBIRDIER]: 3, - [Species.FINIZEN]: 3, - [Species.VAROOM]: 4, - [Species.CYCLIZAR]: 4, - [Species.ORTHWORM]: 4, - [Species.GLIMMET]: 4, - [Species.GREAVARD]: 3, - [Species.FLAMIGO]: 4, - [Species.CETODDLE]: 3, - [Species.VELUZA]: 4, - [Species.DONDOZO]: 4, - [Species.TATSUGIRI]: 4, - [Species.GREAT_TUSK]: 6, - [Species.SCREAM_TAIL]: 6, - [Species.BRUTE_BONNET]: 6, - [Species.FLUTTER_MANE]: 7, - [Species.SLITHER_WING]: 6, - [Species.SANDY_SHOCKS]: 6, - [Species.IRON_TREADS]: 6, - [Species.IRON_BUNDLE]: 6, - [Species.IRON_HANDS]: 6, - [Species.IRON_JUGULIS]: 6, - [Species.IRON_MOTH]: 6, - [Species.IRON_THORNS]: 6, - [Species.FRIGIBAX]: 4, - [Species.GIMMIGHOUL]: 4, - [Species.WO_CHIEN]: 6, - [Species.CHIEN_PAO]: 7, - [Species.TING_LU]: 6, - [Species.CHI_YU]: 7, - [Species.ROARING_MOON]: 6, - [Species.IRON_VALIANT]: 6, - [Species.KORAIDON]: 9, - [Species.MIRAIDON]: 9, - [Species.WALKING_WAKE]: 6, - [Species.IRON_LEAVES]: 6, - [Species.POLTCHAGEIST]: 4, - [Species.OKIDOGI]: 6, - [Species.MUNKIDORI]: 6, - [Species.FEZANDIPITI]: 6, - [Species.OGERPON]: 7, - [Species.GOUGING_FIRE]: 7, - [Species.RAGING_BOLT]: 6, - [Species.IRON_BOULDER]: 7, - [Species.IRON_CROWN]: 6, - [Species.TERAPAGOS]: 8, - [Species.PECHARUNT]: 6, - [Species.PALDEA_TAUROS]: 5, - [Species.PALDEA_WOOPER]: 3, - [Species.BLOODMOON_URSALUNA]: 6, -}; - -export const noStarterFormKeys: string[] = [ - SpeciesFormKey.MEGA, - SpeciesFormKey.MEGA_X, - SpeciesFormKey.MEGA_Y, - SpeciesFormKey.PRIMAL, - SpeciesFormKey.ORIGIN, - SpeciesFormKey.THERIAN, - SpeciesFormKey.GIGANTAMAX, - SpeciesFormKey.GIGANTAMAX_RAPID, - SpeciesFormKey.GIGANTAMAX_SINGLE, - SpeciesFormKey.ETERNAMAX -].map(k => k.toString()); - -export function getStarterValueFriendshipCap(value: integer): integer { - switch (value) { - case 1: - return 20; - case 2: - return 40; - case 3: - return 60; - case 4: - return 100; - case 5: - return 140; - case 6: - return 200; - case 7: - return 280; - case 8: - case 9: - return 450; - default: - return 600; - } -} - -export const POKERUS_STARTER_COUNT = 5; //adjust here! -/** -* Method to get the daily list of starters with Pokerus. -* @param scene {@linkcode BattleScene} used as part of RNG -* @returns A list of starters with Pokerus -*/ -export function getPokerusStarters(scene: BattleScene): PokemonSpecies[] { - const pokerusStarters: PokemonSpecies[] = []; - const date = new Date(); - date.setUTCHours(0, 0, 0, 0); - scene.executeWithSeedOffset(() => { - while (pokerusStarters.length < POKERUS_STARTER_COUNT) { - const randomSpeciesId = parseInt(Utils.randSeedItem(Object.keys(speciesStarters)), 10); - const species = getPokemonSpecies(randomSpeciesId); - if (!pokerusStarters.includes(species)) { - pokerusStarters.push(species); - } - } - }, 0, date.getTime().toString()); - return pokerusStarters; -} - -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 -}; - // TODO: Remove { //setTimeout(() => { diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 296e4e9b1b54..63ed596cd13b 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1,22 +1,22 @@ -import BattleScene, { startingWave } from "../battle-scene"; -import { ModifierTypeFunc, modifierTypes } from "../modifier/modifier-type"; -import { EnemyPokemon, PokemonMove } from "../field/pokemon"; -import * as Utils from "../utils"; -import { PokeballType } from "./pokeball"; -import { pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions"; -import PokemonSpecies, { getPokemonSpecies, PokemonSpeciesFilter } from "./pokemon-species"; -import { tmSpecies } from "./tms"; -import { Type } from "./type"; -import { doubleBattleDialogue } from "./dialogue"; -import { PersistentModifier } from "../modifier/modifier"; -import { TrainerVariant } from "../field/trainer"; +import BattleScene, { startingWave } from "#app/battle-scene"; +import { ModifierTypeFunc, modifierTypes } from "#app/modifier/modifier-type"; +import { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; +import * as Utils from "#app/utils"; +import { PokeballType } from "#app/data/pokeball"; +import { pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +import PokemonSpecies, { getPokemonSpecies, PokemonSpeciesFilter } from "#app/data/pokemon-species"; +import { tmSpecies } from "#app/data/balance/tms"; +import { Type } from "#app/data/type"; +import { doubleBattleDialogue } from "#app/data/dialogue"; +import { PersistentModifier } from "#app/modifier/modifier"; +import { TrainerVariant } from "#app/field/trainer"; import { getIsInitialized, initI18n } from "#app/plugins/i18n"; import i18next from "i18next"; -import {Moves} from "#enums/moves"; -import {PartyMemberStrength} from "#enums/party-member-strength"; -import {Species} from "#enums/species"; -import {TrainerType} from "#enums/trainer-type"; -import {Gender} from "./gender"; +import { Moves } from "#enums/moves"; +import { PartyMemberStrength } from "#enums/party-member-strength"; +import { Species } from "#enums/species"; +import { TrainerType } from "#enums/trainer-type"; +import { Gender } from "#app/data/gender"; /** Minimum BST for Pokemon generated onto the Elite Four's teams */ const ELITE_FOUR_MINIMUM_BST = 460; diff --git a/src/field/arena.ts b/src/field/arena.ts index dc9ad84f09d1..9d5f1eb0a4e6 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -1,26 +1,26 @@ -import BattleScene from "../battle-scene"; -import { biomePokemonPools, BiomePoolTier, BiomeTierTrainerPools, biomeTrainerPools, PokemonPools } from "../data/biomes"; +import BattleScene from "#app/battle-scene"; +import { biomePokemonPools, BiomePoolTier, BiomeTierTrainerPools, biomeTrainerPools, PokemonPools } from "#app/data/balance/biomes"; import { Constructor } from "#app/utils"; -import * as Utils from "../utils"; -import PokemonSpecies, { getPokemonSpecies } from "../data/pokemon-species"; -import { getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage, Weather, WeatherType } from "../data/weather"; -import { CommonAnim } from "../data/battle-anims"; -import { Type } from "../data/type"; -import Move from "../data/move"; -import { ArenaTag, ArenaTagSide, ArenaTrapTag, getArenaTag } from "../data/arena-tag"; -import { BattlerIndex } from "../battle"; -import { Terrain, TerrainType } from "../data/terrain"; -import { applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs, PostTerrainChangeAbAttr, PostWeatherChangeAbAttr } from "../data/ability"; -import Pokemon from "./pokemon"; +import * as Utils from "#app/utils"; +import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; +import { getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage, Weather, WeatherType } from "#app/data/weather"; +import { CommonAnim } from "#app/data/battle-anims"; +import { Type } from "#app/data/type"; +import Move from "#app/data/move"; +import { ArenaTag, ArenaTagSide, ArenaTrapTag, getArenaTag } from "#app/data/arena-tag"; +import { BattlerIndex } from "#app/battle"; +import { Terrain, TerrainType } from "#app/data/terrain"; +import { applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs, PostTerrainChangeAbAttr, PostWeatherChangeAbAttr } from "#app/data/ability"; +import Pokemon from "#app/field/pokemon"; import Overrides from "#app/overrides"; -import { TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "../events/arena"; +import { TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; import { TrainerType } from "#enums/trainer-type"; -import { Abilities } from "#app/enums/abilities"; +import { Abilities } from "#enums/abilities"; import { SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "#app/data/pokemon-forms"; import { CommonAnimPhase } from "#app/phases/common-anim-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 22df5d3a6c39..d54114962236 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1,43 +1,45 @@ import Phaser from "phaser"; -import BattleScene, { AnySound } from "../battle-scene"; +import BattleScene, { AnySound } from "#app/battle-scene"; import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; -import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../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 "../data/move"; -import { default as PokemonSpecies, PokemonSpeciesForm, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; +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, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +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 "../utils"; -import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; -import { getLevelTotalExp } from "../data/exp"; +import * as Utils from "#app/utils"; +import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "#app/data/type"; +import { getLevelTotalExp } from "#app/data/exp"; import { Stat, type PermanentStat, type BattleStat, type EffectiveStat, PERMANENT_STATS, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; -import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier } from "../modifier/modifier"; -import { PokeballType } from "../data/pokeball"; -import { Gender } from "../data/gender"; -import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; -import { Status, StatusEffect, getRandomStatus } from "../data/status-effect"; -import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions"; -import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms"; +import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier } from "#app/modifier/modifier"; +import { PokeballType } from "#app/data/pokeball"; +import { Gender } from "#app/data/gender"; +import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +import { Status, StatusEffect, getRandomStatus } from "#app/data/status-effect"; +import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; +import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "#app/data/balance/tms"; import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, SubstituteTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag, AutotomizedTag } from "../data/battler-tags"; -import { WeatherType } from "../data/weather"; -import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag"; -import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs } from "../data/ability"; -import PokemonData from "../system/pokemon-data"; -import { BattlerIndex } from "../battle"; -import { Mode } from "../ui/ui"; -import PartyUiHandler, { PartyOption, PartyUiMode } from "../ui/party-ui-handler"; +import { WeatherType } from "#app/data/weather"; +import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "#app/data/arena-tag"; +import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs } from "#app/data/ability"; +import PokemonData from "#app/system/pokemon-data"; +import { BattlerIndex } from "#app/battle"; +import { Mode } from "#app/ui/ui"; +import PartyUiHandler, { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { LevelMoves } from "../data/pokemon-level-moves"; -import { DamageAchv, achvs } from "../system/achv"; -import { DexAttr, StarterDataEntry, StarterMoveset } from "../system/game-data"; +import { LevelMoves } from "#app/data/balance/pokemon-level-moves"; +import { DamageAchv, achvs } from "#app/system/achv"; +import { DexAttr, StarterDataEntry, StarterMoveset } from "#app/system/game-data"; import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; -import { Nature, getNatureStatMultiplier } from "../data/nature"; -import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "../data/pokemon-forms"; -import { TerrainType } from "../data/terrain"; -import { TrainerSlot } from "../data/trainer-config"; +import { Nature, getNatureStatMultiplier } from "#app/data/nature"; +import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "#app/data/pokemon-forms"; +import { TerrainType } from "#app/data/terrain"; +import { TrainerSlot } from "#app/data/trainer-config"; import Overrides from "#app/overrides"; import i18next from "i18next"; -import { speciesEggMoves } from "../data/egg-moves"; -import { ModifierTier } from "../modifier/modifier-tier"; +import { speciesEggMoves } from "#app/data/balance/egg-moves"; +import { ModifierTier } from "#app/modifier/modifier-tier"; import { applyChallenges, ChallengeType } from "#app/data/challenge"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; @@ -58,17 +60,12 @@ import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; import { Challenges } from "#enums/challenges"; -import { PokemonAnimType } from "#app/enums/pokemon-anim-type"; +import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; import { SwitchType } from "#enums/switch-type"; import { SpeciesFormKey } from "#enums/species-form-key"; - -/** `64/65536 -> 1/1024` */ -const BASE_SHINY_CHANCE = 64; - -/** `1/256` */ -const BASE_HIDDEN_ABILITY_CHANCE = 256; +import { BASE_HIDDEN_ABILITY_CHANCE, BASE_SHINY_CHANCE, SHINY_EPIC_CHANCE, SHINY_VARIANT_CHANCE } from "#app/data/balance/rates"; export enum FieldPosition { CENTER, @@ -1930,9 +1927,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.executeWithSeedOffset(() => { rand.value = Utils.randSeedInt(10); }, this.id, this.scene.waveSeed); - if (rand.value >= 4) { + if (rand.value >= SHINY_VARIANT_CHANCE) { return 0; // 6/10 - } else if (rand.value >= 1) { + } else if (rand.value >= SHINY_EPIC_CHANCE) { return 1; // 3/10 } else { return 2; // 1/10 @@ -4057,7 +4054,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/field/trainer.ts b/src/field/trainer.ts index b1d0263f6044..06548e2b020c 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -1,6 +1,6 @@ -import BattleScene from "../battle-scene"; -import {pokemonPrevolutions} from "../data/pokemon-evolutions"; -import PokemonSpecies, {getPokemonSpecies} from "../data/pokemon-species"; +import BattleScene from "#app/battle-scene"; +import {pokemonPrevolutions} from "#app/data/balance/pokemon-evolutions"; +import PokemonSpecies, {getPokemonSpecies} from "#app/data/pokemon-species"; import { TrainerConfig, TrainerPartyCompoundTemplate, @@ -10,13 +10,13 @@ import { trainerConfigs, trainerPartyTemplates, signatureSpecies -} from "../data/trainer-config"; -import {EnemyPokemon} from "./pokemon"; -import * as Utils from "../utils"; -import {PersistentModifier} from "../modifier/modifier"; -import {trainerNamePools} from "../data/trainer-names"; -import {ArenaTagSide, ArenaTrapTag} from "#app/data/arena-tag"; -import {getIsInitialized, initI18n} from "#app/plugins/i18n"; +} from "#app/data/trainer-config"; +import {EnemyPokemon} from "#app/field/pokemon"; +import * as Utils from "#app/utils"; +import { PersistentModifier } from "#app/modifier/modifier"; +import { trainerNamePools } from "#app/data/trainer-names"; +import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; +import { getIsInitialized, initI18n } from "#app/plugins/i18n"; import i18next from "i18next"; import { PartyMemberStrength } from "#enums/party-member-strength"; import { Species } from "#enums/species"; diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 6e7a6735157f..e71082ca8f52 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -1,23 +1,23 @@ -import { GachaType } from "./enums/gacha-types"; -import { getBiomeHasProps } from "./field/arena"; -import CacheBustedLoaderPlugin from "./plugins/cache-busted-loader-plugin"; -import { SceneBase } from "./scene-base"; -import { WindowVariant, getWindowVariantSuffix } from "./ui/ui-theme"; -import { isMobile } from "./touch-controls"; -import * as Utils from "./utils"; -import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions"; -import { initBiomes } from "#app/data/biomes"; -import { initEggMoves } from "#app/data/egg-moves"; +import { GachaType } from "#enums/gacha-types"; +import { getBiomeHasProps } from "#app/field/arena"; +import CacheBustedLoaderPlugin from "#app/plugins/cache-busted-loader-plugin"; +import { SceneBase } from "#app/scene-base"; +import { WindowVariant, getWindowVariantSuffix } from "#app/ui/ui-theme"; +import { isMobile } from "#app/touch-controls"; +import * as Utils from "#app/utils"; +import { initPokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +import { initBiomes } from "#app/data/balance/biomes"; +import { initEggMoves } from "#app/data/balance/egg-moves"; import { initPokemonForms } from "#app/data/pokemon-forms"; import { initSpecies } from "#app/data/pokemon-species"; import { initMoves } from "#app/data/move"; import { initAbilities } from "#app/data/ability"; import { initAchievements } from "#app/system/achv"; import { initTrainerTypeDialogue } from "#app/data/dialogue"; -import { initChallenges } from "./data/challenge"; +import { initChallenges } from "#app/data/challenge"; import i18next from "i18next"; -import { initStatsKeys } from "./ui/game-stats-ui-handler"; -import { initVouchers } from "./system/voucher"; +import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; +import { initVouchers } from "#app/system/voucher"; import { Biome } from "#enums/biome"; import {initMysteryEncounters} from "#app/data/mystery-encounters/mystery-encounters"; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 7e4ef402ead1..238d2f0debf7 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1,20 +1,20 @@ -import * as Modifiers from "./modifier"; -import { MoneyMultiplierModifier } from "./modifier"; -import { allMoves, AttackMove, selfStatLowerMoves } from "../data/move"; -import { getPokeballCatchMultiplier, getPokeballName, MAX_PER_TYPE_POKEBALLS, PokeballType } from "../data/pokeball"; -import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "../field/pokemon"; -import { EvolutionItem, pokemonEvolutions } from "../data/pokemon-evolutions"; -import { tmPoolTiers, tmSpecies } from "../data/tms"; -import { Type } from "../data/type"; -import PartyUiHandler, { PokemonMoveSelectFilter, PokemonSelectFilter } from "../ui/party-ui-handler"; -import * as Utils from "../utils"; -import { getBerryEffectDescription, getBerryName } from "../data/berry"; -import { Unlockables } from "../system/unlockables"; -import { getStatusEffectDescriptor, StatusEffect } from "../data/status-effect"; -import BattleScene from "../battle-scene"; -import { getVoucherTypeIcon, getVoucherTypeName, VoucherType } from "../system/voucher"; -import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger } from "../data/pokemon-forms"; -import { ModifierTier } from "./modifier-tier"; +import * as Modifiers from "#app/modifier/modifier"; +import { MoneyMultiplierModifier } from "#app/modifier/modifier"; +import { allMoves, AttackMove, selfStatLowerMoves } from "#app/data/move"; +import { getPokeballCatchMultiplier, getPokeballName, MAX_PER_TYPE_POKEBALLS, PokeballType } from "#app/data/pokeball"; +import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { EvolutionItem, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; +import { tmPoolTiers, tmSpecies } from "#app/data/balance/tms"; +import { Type } from "#app/data/type"; +import PartyUiHandler, { PokemonMoveSelectFilter, PokemonSelectFilter } from "#app/ui/party-ui-handler"; +import * as Utils from "#app/utils"; +import { getBerryEffectDescription, getBerryName } from "#app/data/berry"; +import { Unlockables } from "#app/system/unlockables"; +import { getStatusEffectDescriptor, StatusEffect } from "#app/data/status-effect"; +import BattleScene from "#app/battle-scene"; +import { getVoucherTypeIcon, getVoucherTypeName, VoucherType } from "#app/system/voucher"; +import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; +import { ModifierTier } from "#app/modifier/modifier-tier"; import { getNatureName, getNatureStatMultiplier, Nature } from "#app/data/nature"; import i18next from "i18next"; import { getModifierTierTextTint } from "#app/ui/text"; @@ -25,7 +25,7 @@ import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { getPokemonNameWithAffix } from "#app/messages"; -import { PermanentStat, TEMP_BATTLE_STATS, TempBattleStat, Stat, getStatKey } from "#app/enums/stat"; +import { PermanentStat, TEMP_BATTLE_STATS, TempBattleStat, Stat, getStatKey } from "#enums/stat"; import { SpeciesFormKey } from "#enums/species-form-key"; const outputModifierData = false; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 537e2327a210..4c20b4540817 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -1,31 +1,30 @@ -import * as ModifierTypes from "./modifier-type"; -import { getModifierType, ModifierType, modifierTypes } from "./modifier-type"; -import BattleScene from "../battle-scene"; -import { getLevelTotalExp } from "../data/exp"; -import { MAX_PER_TYPE_POKEBALLS, PokeballType } from "../data/pokeball"; -import Pokemon, { PlayerPokemon } from "../field/pokemon"; -import { addTextObject, TextStyle } from "../ui/text"; -import { Type } from "../data/type"; -import { EvolutionPhase } from "../phases/evolution-phase"; -import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; -import { getPokemonNameWithAffix } from "../messages"; -import * as Utils from "../utils"; -import { getBerryEffectFunc, getBerryPredicate } from "../data/berry"; +import * as ModifierTypes from "#app/modifier/modifier-type"; +import { getModifierType, ModifierType, modifierTypes } from "#app/modifier/modifier-type"; +import BattleScene from "#app/battle-scene"; +import { getLevelTotalExp } from "#app/data/exp"; +import { MAX_PER_TYPE_POKEBALLS, PokeballType } from "#app/data/pokeball"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; +import { addTextObject, TextStyle } from "#app/ui/text"; +import { Type } from "#app/data/type"; +import { EvolutionPhase } from "#app/phases/evolution-phase"; +import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +import { getPokemonNameWithAffix } from "#app/messages"; +import * as Utils from "#app/utils"; +import { getBerryEffectFunc, getBerryPredicate } from "#app/data/berry"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; import { getStatusEffectHealText, StatusEffect } from "#app/data/status-effect"; -import { achvs } from "../system/achv"; -import { VoucherType } from "../system/voucher"; -import { FormChangeItem, SpeciesFormChangeItemTrigger, SpeciesFormChangeLapseTeraTrigger, SpeciesFormChangeTeraTrigger } from "../data/pokemon-forms"; +import { achvs } from "#app/system/achv"; +import { VoucherType } from "#app/system/voucher"; +import { FormChangeItem, SpeciesFormChangeItemTrigger, SpeciesFormChangeLapseTeraTrigger, SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; import { Nature } from "#app/data/nature"; import Overrides from "#app/overrides"; import { Command } from "#app/ui/command-ui-handler"; import { Species } from "#enums/species"; -import { BATTLE_STATS, type PermanentStat, Stat, TEMP_BATTLE_STATS, type TempBattleStat } from "#app/enums/stat"; +import { BATTLE_STATS, type PermanentStat, Stat, TEMP_BATTLE_STATS, type TempBattleStat } from "#enums/stat"; import i18next from "i18next"; - import { allMoves } from "#app/data/move"; -import { Abilities } from "#app/enums/abilities"; +import { Abilities } from "#enums/abilities"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; import { LevelUpPhase } from "#app/phases/level-up-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index a374f885d3fc..5e5031c1d067 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/pokemon-species"; +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/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index 0c3c2fa5bcf9..59b73fe9e118 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -1,17 +1,17 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { Phase } from "../phase"; -import BattleScene from "../battle-scene"; -import { SpeciesFormEvolution } from "../data/pokemon-evolutions"; -import EvolutionSceneHandler from "../ui/evolution-scene-handler"; -import * as Utils from "../utils"; -import { Mode } from "../ui/ui"; -import { cos, sin } from "../field/anims"; -import { PlayerPokemon } from "../field/pokemon"; -import { getTypeRgb } from "../data/type"; +import { Phase } from "#app/phase"; +import BattleScene from "#app/battle-scene"; +import { SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; +import EvolutionSceneHandler from "#app/ui/evolution-scene-handler"; +import * as Utils from "#app/utils"; +import { Mode } from "#app/ui/ui"; +import { cos, sin } from "#app/field/anims"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { getTypeRgb } from "#app/data/type"; import i18next from "i18next"; -import { getPokemonNameWithAffix } from "../messages"; -import { LearnMovePhase } from "./learn-move-phase"; -import { EndEvolutionPhase } from "./end-evolution-phase"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { LearnMovePhase } from "#app/phases/learn-move-phase"; +import { EndEvolutionPhase } from "#app/phases/end-evolution-phase"; export class EvolutionPhase extends Phase { protected pokemon: PlayerPokemon; diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts index 1db47e9e2897..9c444fc40f07 100644 --- a/src/phases/game-over-phase.ts +++ b/src/phases/game-over-phase.ts @@ -2,7 +2,7 @@ import { clientSessionId } from "#app/account"; import { BattleType } from "#app/battle"; import BattleScene from "#app/battle-scene"; import { getCharVariantFromDialogue } from "#app/data/dialogue"; -import { pokemonEvolutions } from "#app/data/pokemon-evolutions"; +import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; import { trainerConfigs } from "#app/data/trainer-config"; import Pokemon from "#app/field/pokemon"; diff --git a/src/phases/select-biome-phase.ts b/src/phases/select-biome-phase.ts index fe9b5b3996b7..49c6c3ac3c0f 100644 --- a/src/phases/select-biome-phase.ts +++ b/src/phases/select-biome-phase.ts @@ -1,5 +1,5 @@ import BattleScene from "#app/battle-scene"; -import { biomeLinks, getBiomeName } from "#app/data/biomes"; +import { biomeLinks, getBiomeName } from "#app/data/balance/biomes"; import { Biome } from "#app/enums/biome"; import { MoneyInterestModifier, MapModifier } from "#app/modifier/modifier"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; diff --git a/src/system/achv.ts b/src/system/achv.ts index 09ec74de50cc..a355a0270933 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -1,7 +1,7 @@ import { Modifier } from "typescript"; import BattleScene from "../battle-scene"; import { TurnHeldItemTransferModifier } from "../modifier/modifier"; -import { pokemonEvolutions } from "#app/data/pokemon-evolutions"; +import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import i18next from "i18next"; import * as Utils from "../utils"; import { PlayerGender } from "#enums/player-gender"; diff --git a/src/system/game-data.ts b/src/system/game-data.ts index af5e717c17b2..b597a1b9aad5 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1,52 +1,53 @@ import i18next from "i18next"; -import BattleScene, { bypassLogin, PokeballCounts } from "../battle-scene"; -import Pokemon, { EnemyPokemon, PlayerPokemon } from "../field/pokemon"; -import { pokemonPrevolutions } from "../data/pokemon-evolutions"; -import PokemonSpecies, { allSpecies, getPokemonSpecies, noStarterFormKeys, speciesStarters } from "../data/pokemon-species"; -import * as Utils from "../utils"; +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 { speciesStarterCosts } from "#app/data/balance/starters"; +import * as Utils from "#app/utils"; import Overrides from "#app/overrides"; -import PokemonData from "./pokemon-data"; -import PersistentModifierData from "./modifier-data"; -import ArenaData from "./arena-data"; -import { Unlockables } from "./unlockables"; -import { GameModes, getGameMode } from "../game-mode"; -import { BattleType } from "../battle"; -import TrainerData from "./trainer-data"; -import { trainerConfigs } from "../data/trainer-config"; -import { resetSettings, setSetting, SettingKeys } from "./settings/settings"; -import { achvs } from "./achv"; -import EggData from "./egg-data"; -import { Egg } from "../data/egg"; -import { vouchers, VoucherType } from "./voucher"; +import PokemonData from "#app/system/pokemon-data"; +import PersistentModifierData from "#app/system/modifier-data"; +import ArenaData from "#app/system/arena-data"; +import { Unlockables } from "#app/system/unlockables"; +import { GameModes, getGameMode } from "#app/game-mode"; +import { BattleType } from "#app/battle"; +import TrainerData from "#app/system/trainer-data"; +import { trainerConfigs } from "#app/data/trainer-config"; +import { resetSettings, setSetting, SettingKeys } from "#app/system/settings/settings"; +import { achvs } from "#app/system/achv"; +import EggData from "#app/system/egg-data"; +import { Egg } from "#app/data/egg"; +import { vouchers, VoucherType } from "#app/system/voucher"; import { AES, enc } from "crypto-js"; -import { Mode } from "../ui/ui"; -import { clientSessionId, loggedInUser, updateUserInfo } from "../account"; -import { Nature } from "../data/nature"; -import { GameStats } from "./game-stats"; -import { Tutorial } from "../tutorial"; -import { speciesEggMoves } from "../data/egg-moves"; -import { allMoves } from "../data/move"; -import { TrainerVariant } from "../field/trainer"; +import { Mode } from "#app/ui/ui"; +import { clientSessionId, loggedInUser, updateUserInfo } from "#app/account"; +import { Nature } from "#app/data/nature"; +import { GameStats } from "#app/system/game-stats"; +import { Tutorial } from "#app/tutorial"; +import { speciesEggMoves } from "#app/data/balance/egg-moves"; +import { allMoves } from "#app/data/move"; +import { TrainerVariant } from "#app/field/trainer"; import { Variant } from "#app/data/variant"; -import { setSettingGamepad, SettingGamepad, settingGamepadDefaults } from "./settings/settings-gamepad"; +import { setSettingGamepad, SettingGamepad, settingGamepadDefaults } from "#app/system/settings/settings-gamepad"; import { setSettingKeyboard, SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; -import * as Modifier from "../modifier/modifier"; +import * as Modifier from "#app/modifier/modifier"; import { StatusEffect } from "#app/data/status-effect"; -import ChallengeData from "./challenge-data"; +import ChallengeData from "#app/system/challenge-data"; import { Device } from "#enums/devices"; import { GameDataType } from "#enums/game-data-type"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { applyChallenges, ChallengeType } from "#app/data/challenge"; -import { WeatherType } from "#app/enums/weather-type"; +import { WeatherType } from "#enums/weather-type"; import { TerrainType } from "#app/data/terrain"; import { OutdatedPhase } from "#app/phases/outdated-phase"; import { ReloadSessionPhase } from "#app/phases/reload-session-phase"; import { RUN_HISTORY_LIMIT } from "#app/ui/run-history-ui-handler"; -import { applySessionDataPatches, applySettingsDataPatches, applySystemDataPatches } from "./version-converter"; -import { MysteryEncounterSaveData } from "../data/mystery-encounters/mystery-encounter-save-data"; +import { applySessionDataPatches, applySettingsDataPatches, applySystemDataPatches } from "#app/system/version-converter"; +import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-encounter-save-data"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PokerogueApiClearSessionData } from "#app/@types/pokerogue-api"; @@ -1537,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] = { @@ -1617,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; @@ -1673,7 +1674,7 @@ export class GameData { } }; - if (newCatch && speciesStarters.hasOwnProperty(species.speciesId)) { + if (newCatch && speciesStarterCosts.hasOwnProperty(species.speciesId)) { if (!showMessage) { resolve(true); return; @@ -1801,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]; @@ -1875,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/evolution.test.ts b/src/test/evolution.test.ts index 07865d7e64a7..1a5a2be996f3 100644 --- a/src/test/evolution.test.ts +++ b/src/test/evolution.test.ts @@ -1,4 +1,4 @@ -import { pokemonEvolutions, SpeciesFormEvolution, SpeciesWildEvolutionDelay } from "#app/data/pokemon-evolutions"; +import { pokemonEvolutions, SpeciesFormEvolution, SpeciesWildEvolutionDelay } from "#app/data/balance/pokemon-evolutions"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; diff --git a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index fe3106ac1149..fa3c97b56ce9 100644 --- a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -17,7 +17,7 @@ import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { CommandPhase } from "#app/phases/command-phase"; import { UncommonBreedEncounter } from "#app/data/mystery-encounters/encounters/uncommon-breed-encounter"; import { MovePhase } from "#app/phases/move-phase"; -import { speciesEggMoves } from "#app/data/egg-moves"; +import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { BerryType } from "#enums/berry-type"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index 7958294737d7..7541379be07f 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -6,7 +6,8 @@ import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; import { StatusEffect } from "#app/data/status-effect"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; -import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +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"; @@ -209,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", () => { @@ -217,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/test/vitest.setup.ts b/src/test/vitest.setup.ts index 9778204aa7b5..948180ca261b 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -2,11 +2,11 @@ import "vitest-canvas-mock"; import { initLoggedInUser } from "#app/account"; import { initAbilities } from "#app/data/ability"; -import { initBiomes } from "#app/data/biomes"; -import { initEggMoves } from "#app/data/egg-moves"; +import { initBiomes } from "#app/data/balance/biomes"; +import { initEggMoves } from "#app/data/balance/egg-moves"; import { initMoves } from "#app/data/move"; import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; -import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions"; +import { initPokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; import { initPokemonForms } from "#app/data/pokemon-forms"; import { initSpecies } from "#app/data/pokemon-species"; import { initAchievements } from "#app/system/achv"; diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index 967b3ae0dc48..69abdf85e9e6 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -1,15 +1,15 @@ import Phaser from "phaser"; -import BattleScene from "../battle-scene"; -import { TextStyle, addTextObject } from "./text"; -import { Mode } from "./ui"; -import UiHandler from "./ui-handler"; -import { addWindow } from "./ui-theme"; -import * as Utils from "../utils"; -import { DexAttr, GameData } from "../system/game-data"; -import { speciesStarters } from "../data/pokemon-species"; -import {Button} from "#enums/buttons"; +import BattleScene from "#app/battle-scene"; +import { TextStyle, addTextObject } from "#app/ui/text"; +import { Mode } from "#app/ui/ui"; +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 { speciesStarterCosts } from "#app/data/balance/starters"; +import { Button } from "#enums/buttons"; import i18next from "i18next"; -import { UiTheme } from "#app/enums/ui-theme"; +import { UiTheme } from "#enums/ui-theme"; interface DisplayStat { label_key?: string; @@ -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/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 6b6ce2aa7897..72b34731842b 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1,22 +1,22 @@ -import BattleScene from "../battle-scene"; -import Pokemon, { MoveResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; -import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "./text"; -import { Command } from "./command-ui-handler"; -import MessageUiHandler from "./message-ui-handler"; -import { Mode } from "./ui"; -import * as Utils from "../utils"; -import { PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "../modifier/modifier"; -import { allMoves, ForceSwitchOutAttr } from "../data/move"; -import { getGenderColor, getGenderSymbol } from "../data/gender"; -import { StatusEffect } from "../data/status-effect"; -import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; -import { pokemonEvolutions } from "../data/pokemon-evolutions"; -import { addWindow } from "./ui-theme"; -import { SpeciesFormChangeItemTrigger, FormChangeItem } from "../data/pokemon-forms"; +import BattleScene from "#app/battle-scene"; +import Pokemon, { MoveResult, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "#app/ui/text"; +import { Command } from "#app/ui/command-ui-handler"; +import MessageUiHandler from "#app/ui/message-ui-handler"; +import { Mode } from "#app/ui/ui"; +import * as Utils from "#app/utils"; +import { PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "#app/modifier/modifier"; +import { allMoves, ForceSwitchOutAttr } from "#app/data/move"; +import { getGenderColor, getGenderSymbol } from "#app/data/gender"; +import { StatusEffect } from "#app/data/status-effect"; +import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; +import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; +import { addWindow } from "#app/ui/ui-theme"; +import { SpeciesFormChangeItemTrigger, FormChangeItem } from "#app/data/pokemon-forms"; import { getVariantTint } from "#app/data/variant"; import {Button} from "#enums/buttons"; import { applyChallenges, ChallengeType } from "#app/data/challenge"; -import MoveInfoOverlay from "./move-info-overlay"; +import MoveInfoOverlay from "#app/ui/move-info-overlay"; import i18next from "i18next"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Moves } from "#enums/moves"; diff --git a/src/ui/pokemon-hatch-info-container.ts b/src/ui/pokemon-hatch-info-container.ts index f8a9adced367..2c3f5110f537 100644 --- a/src/ui/pokemon-hatch-info-container.ts +++ b/src/ui/pokemon-hatch-info-container.ts @@ -1,14 +1,14 @@ -import PokemonInfoContainer from "./pokemon-info-container"; -import BattleScene from "../battle-scene"; -import { Gender } from "../data/gender"; -import { Type } from "../data/type"; -import * as Utils from "../utils"; -import { TextStyle, addTextObject } from "./text"; -import { speciesEggMoves } from "#app/data/egg-moves"; +import PokemonInfoContainer from "#app/ui/pokemon-info-container"; +import BattleScene from "#app/battle-scene"; +import { Gender } from "#app/data/gender"; +import { Type } from "#app/data/type"; +import * as Utils from "#app/utils"; +import { TextStyle, addTextObject } from "#app/ui/text"; +import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { allMoves } from "#app/data/move"; -import { Species } from "#app/enums/species"; +import { Species } from "#enums/species"; import { getEggTierForSpecies } from "#app/data/egg"; -import { starterColors } from "../battle-scene"; +import { starterColors } from "#app/battle-scene"; import { argbFromRgba } from "@material/material-color-utilities"; import { EggHatchData } from "#app/data/egg-hatch-data"; import { PlayerPokemon } from "#app/field/pokemon"; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index cc1ba5ada070..38445f79e05f 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1,51 +1,54 @@ -import { BattleSceneEventType, CandyUpgradeNotificationChangedEvent } from "../events/battle-scene"; -import { pokemonPrevolutions } from "#app/data/pokemon-evolutions"; +import { BattleSceneEventType, CandyUpgradeNotificationChangedEvent } from "#app/events/battle-scene"; +import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; import { Variant, getVariantTint, getVariantIcon } from "#app/data/variant"; import { argbFromRgba } from "@material/material-color-utilities"; import i18next from "i18next"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; -import BattleScene, { starterColors } from "../battle-scene"; -import { allAbilities } from "../data/ability"; -import { speciesEggMoves } from "../data/egg-moves"; -import { GrowthRate, getGrowthRateColor } from "../data/exp"; -import { Gender, getGenderColor, getGenderSymbol } from "../data/gender"; -import { allMoves } from "../data/move"; -import { Nature, getNatureName } from "../data/nature"; -import { pokemonFormChanges } from "../data/pokemon-forms"; -import { LevelMoves, pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "../data/pokemon-level-moves"; -import PokemonSpecies, { allSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities, POKERUS_STARTER_COUNT, getPokerusStarters } from "../data/pokemon-species"; -import { Type } from "../data/type"; -import { GameModes } from "../game-mode"; -import { AbilityAttr, DexAttr, DexAttrProps, DexEntry, StarterMoveset, StarterAttributes, StarterPreferences, StarterPrefs } from "../system/game-data"; -import { Tutorial, handleTutorial } from "../tutorial"; -import * as Utils from "../utils"; -import { OptionSelectItem } from "./abstact-option-select-ui-handler"; -import MessageUiHandler from "./message-ui-handler"; -import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; -import { StatsContainer } from "./stats-container"; -import { TextStyle, addBBCodeTextObject, addTextObject } from "./text"; -import { Mode } from "./ui"; -import { addWindow } from "./ui-theme"; +import BattleScene, { starterColors } from "#app/battle-scene"; +import { allAbilities } from "#app/data/ability"; +import { speciesEggMoves } from "#app/data/balance/egg-moves"; +import { GrowthRate, getGrowthRateColor } from "#app/data/exp"; +import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender"; +import { allMoves } from "#app/data/move"; +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, 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"; +import { Tutorial, handleTutorial } from "#app/tutorial"; +import * as Utils from "#app/utils"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import MessageUiHandler from "#app/ui/message-ui-handler"; +import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; +import { StatsContainer } from "#app/ui/stats-container"; +import { TextStyle, addBBCodeTextObject, addTextObject } from "#app/ui/text"; +import { Mode } from "#app/ui/ui"; +import { addWindow } from "#app/ui/ui-theme"; import { Egg } from "#app/data/egg"; import Overrides from "#app/overrides"; import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { Passive as PassiveAttr } from "#enums/passive"; -import * as Challenge from "../data/challenge"; -import MoveInfoOverlay from "./move-info-overlay"; +import * as Challenge from "#app/data/challenge"; +import MoveInfoOverlay from "#app/ui/move-info-overlay"; import { getEggTierForSpecies } from "#app/data/egg"; import { Device } from "#enums/devices"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Button } from "#enums/buttons"; -import { EggSourceType } from "#app/enums/egg-source-types"; -import AwaitableUiHandler from "./awaitable-ui-handler"; -import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "./dropdown"; -import { StarterContainer } from "./starter-container"; -import { DropDownColumn, FilterBar } from "./filter-bar"; -import { ScrollBar } from "./scroll-bar"; +import { EggSourceType } from "#enums/egg-source-types"; +import AwaitableUiHandler from "#app/ui/awaitable-ui-handler"; +import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "#app/ui/dropdown"; +import { StarterContainer } from "#app/ui/starter-container"; +import { DropDownColumn, FilterBar } from "#app/ui/filter-bar"; +import { ScrollBar } from "#app/ui/scroll-bar"; import { SelectChallengePhase } from "#app/phases/select-challenge-phase"; import { TitlePhase } from "#app/phases/title-phase"; -import { Abilities } from "#app/enums/abilities"; +import { Abilities } from "#enums/abilities"; +import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -119,19 +122,6 @@ const languageSettings: { [key: string]: LanguageSetting } = { }, }; -const starterCandyCosts: { passive: integer, costReduction: [integer, integer], egg: integer }[] = [ - { passive: 40, costReduction: [25, 60], egg: 30 }, // 1 Cost - { passive: 40, costReduction: [25, 60], egg: 30 }, // 2 Cost - { passive: 35, costReduction: [20, 50], egg: 25 }, // 3 Cost - { passive: 30, costReduction: [15, 40], egg: 20 }, // 4 Cost - { passive: 25, costReduction: [12, 35], egg: 18 }, // 5 Cost - { passive: 20, costReduction: [10, 30], egg: 15 }, // 6 Cost - { passive: 15, costReduction: [8, 20], egg: 12 }, // 7 Cost - { passive: 10, costReduction: [5, 15], egg: 10 }, // 8 Cost - { passive: 10, costReduction: [5, 15], egg: 10 }, // 9 Cost - { passive: 10, costReduction: [5, 15], egg: 10 }, // 10 Cost -]; - const valueReductionMax = 2; // Position of UI elements @@ -142,18 +132,6 @@ const teamWindowY = 18; const teamWindowWidth = 34; const teamWindowHeight = 132; -function getPassiveCandyCount(baseValue: integer): integer { - return starterCandyCosts[baseValue - 1].passive; -} - -function getValueReductionCandyCounts(baseValue: integer): [integer, integer] { - return starterCandyCosts[baseValue - 1].costReduction; -} - -function getSameSpeciesEggCandyCounts(baseValue: integer): integer { - return starterCandyCosts[baseValue - 1].egg; -} - /** * Calculates the starter position for a Pokemon of a given UI index * @param index UI index to calculate the starter position of @@ -658,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; } @@ -1112,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); } @@ -1125,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; } @@ -1138,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]); } /** @@ -1732,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: () => { @@ -1768,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: () => { @@ -1802,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: () => { @@ -2723,7 +2701,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { currentFriendship = 0; } - const friendshipCap = getStarterValueFriendshipCap(speciesStarters[speciesId]); + const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[speciesId]); return { currentFriendship, friendshipCap }; } @@ -3356,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 e93fa0713c07..28c3ccdb2e4a 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -1,28 +1,28 @@ -import BattleScene, { starterColors } from "../battle-scene"; -import { Mode } from "./ui"; -import UiHandler from "./ui-handler"; -import * as Utils from "../utils"; -import { PlayerPokemon, PokemonMove } from "../field/pokemon"; -import { getStarterValueFriendshipCap, speciesStarters } from "../data/pokemon-species"; +import BattleScene, { starterColors } from "#app/battle-scene"; +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, speciesStarterCosts } from "#app/data/balance/starters"; import { argbFromRgba } from "@material/material-color-utilities"; -import { Type, getTypeRgb } from "../data/type"; -import { TextStyle, addBBCodeTextObject, addTextObject, getBBCodeFrag } from "./text"; -import Move, { MoveCategory } from "../data/move"; -import { getPokeballAtlasKey } from "../data/pokeball"; -import { getGenderColor, getGenderSymbol } from "../data/gender"; -import { getLevelRelExp, getLevelTotalExp } from "../data/exp"; -import { PokemonHeldItemModifier } from "../modifier/modifier"; -import { StatusEffect } from "../data/status-effect"; -import { getBiomeName } from "../data/biomes"; -import { Nature, getNatureName, getNatureStatMultiplier } from "../data/nature"; -import { loggedInUser } from "../account"; +import { Type, getTypeRgb } from "#app/data/type"; +import { TextStyle, addBBCodeTextObject, addTextObject, getBBCodeFrag } from "#app/ui/text"; +import Move, { MoveCategory } from "#app/data/move"; +import { getPokeballAtlasKey } from "#app/data/pokeball"; +import { getGenderColor, getGenderSymbol } from "#app/data/gender"; +import { getLevelRelExp, getLevelTotalExp } from "#app/data/exp"; +import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { StatusEffect } from "#app/data/status-effect"; +import { getBiomeName } from "#app/data/balance/biomes"; +import { Nature, getNatureName, getNatureStatMultiplier } from "#app/data/nature"; +import { loggedInUser } from "#app/account"; import { Variant, getVariantTint } from "#app/data/variant"; -import {Button} from "#enums/buttons"; -import { Ability } from "../data/ability"; +import { Button } from "#enums/buttons"; +import { Ability } from "#app/data/ability"; import i18next from "i18next"; -import {modifierSortFunc} from "../modifier/modifier"; +import { modifierSortFunc } from "#app/modifier/modifier"; import { PlayerGender } from "#enums/player-gender"; -import { Stat, PERMANENT_STATS, getStatKey } from "#app/enums/stat"; +import { Stat, PERMANENT_STATS, getStatKey } from "#enums/stat"; enum Page { PROFILE, @@ -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) {