diff --git a/src/@types/api/pokerogue-account-api.ts b/src/@types/api/pokerogue-account-api.ts index 7bcdc766664..779592483fb 100644 --- a/src/@types/api/pokerogue-account-api.ts +++ b/src/@types/api/pokerogue-account-api.ts @@ -15,3 +15,10 @@ export interface AccountRegisterRequest { username: string; password: string; } + +export interface AccountChangePwRequest { + password: string; +} +export interface AccountChangePwResponse { + success: boolean; +} diff --git a/src/data/balance/biomes.ts b/src/data/balance/biomes.ts index 1298e80c362..d8297636393 100644 --- a/src/data/balance/biomes.ts +++ b/src/data/balance/biomes.ts @@ -1641,10 +1641,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [] }, [BiomeId.PLAINS]: { [BiomePoolTier.COMMON]: [ TrainerType.BREEDER, TrainerType.TWINS ], @@ -1652,10 +1649,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.CILAN, TrainerType.CHILI, TrainerType.CRESS, TrainerType.CHEREN ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.CILAN, TrainerType.CHILI, TrainerType.CRESS, TrainerType.CHEREN ] }, [BiomeId.GRASS]: { [BiomePoolTier.COMMON]: [ TrainerType.BREEDER, TrainerType.SCHOOL_KID ], @@ -1663,10 +1657,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.ERIKA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.ERIKA ] }, [BiomeId.TALL_GRASS]: { [BiomePoolTier.COMMON]: [], @@ -1674,10 +1665,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.GARDENIA, TrainerType.VIOLA, TrainerType.BRASSIUS ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.GARDENIA, TrainerType.VIOLA, TrainerType.BRASSIUS ] }, [BiomeId.METROPOLIS]: { [BiomePoolTier.COMMON]: [ TrainerType.BEAUTY, TrainerType.CLERK, TrainerType.CYCLIST, TrainerType.OFFICER, TrainerType.WAITER ], @@ -1685,10 +1673,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.ARTIST, TrainerType.RICH_KID ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.WHITNEY, TrainerType.NORMAN, TrainerType.IONO, TrainerType.LARRY ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.WHITNEY, TrainerType.NORMAN, TrainerType.IONO, TrainerType.LARRY ] }, [BiomeId.FOREST]: { [BiomePoolTier.COMMON]: [ TrainerType.RANGER ], @@ -1696,10 +1681,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.BUGSY, TrainerType.BURGH, TrainerType.KATY ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.BUGSY, TrainerType.BURGH, TrainerType.KATY ] }, [BiomeId.SEA]: { [BiomePoolTier.COMMON]: [ TrainerType.SAILOR, TrainerType.SWIMMER ], @@ -1707,10 +1689,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.MARLON ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.MARLON ] }, [BiomeId.SWAMP]: { [BiomePoolTier.COMMON]: [ TrainerType.PARASOL_LADY ], @@ -1718,10 +1697,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.JANINE, TrainerType.ROXIE ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.JANINE, TrainerType.ROXIE ] }, [BiomeId.BEACH]: { [BiomePoolTier.COMMON]: [ TrainerType.FISHERMAN, TrainerType.SAILOR ], @@ -1729,10 +1705,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.MISTY, TrainerType.KOFU ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.MISTY, TrainerType.KOFU ] }, [BiomeId.LAKE]: { [BiomePoolTier.COMMON]: [ TrainerType.BREEDER, TrainerType.FISHERMAN, TrainerType.PARASOL_LADY ], @@ -1740,21 +1713,15 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.CRASHER_WAKE ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.CRASHER_WAKE ] }, [BiomeId.SEABED]: { - [BiomePoolTier.COMMON]: [], + [BiomePoolTier.COMMON]: [ TrainerType.SWIMMER ], [BiomePoolTier.UNCOMMON]: [], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.JUAN ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.JUAN ] }, [BiomeId.MOUNTAIN]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.BLACK_BELT, TrainerType.HIKER ], @@ -1762,10 +1729,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.FALKNER, TrainerType.WINONA, TrainerType.SKYLA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.FALKNER, TrainerType.WINONA, TrainerType.SKYLA ] }, [BiomeId.BADLANDS]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.HIKER ], @@ -1773,10 +1737,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.CLAY, TrainerType.GRANT ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.CLAY, TrainerType.GRANT ] }, [BiomeId.CAVE]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.HIKER ], @@ -1784,10 +1745,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.BROCK, TrainerType.ROXANNE, TrainerType.ROARK ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.BROCK, TrainerType.ROXANNE, TrainerType.ROARK ] }, [BiomeId.DESERT]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.SCIENTIST ], @@ -1795,10 +1753,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.GORDIE ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.GORDIE ] }, [BiomeId.ICE_CAVE]: { [BiomePoolTier.COMMON]: [ TrainerType.SNOW_WORKER ], @@ -1806,10 +1761,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.PRYCE, TrainerType.BRYCEN, TrainerType.WULFRIC, TrainerType.GRUSHA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.PRYCE, TrainerType.BRYCEN, TrainerType.WULFRIC, TrainerType.GRUSHA ] }, [BiomeId.MEADOW]: { [BiomePoolTier.COMMON]: [ TrainerType.BEAUTY, TrainerType.MUSICIAN, TrainerType.PARASOL_LADY ], @@ -1817,10 +1769,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.LENORA, TrainerType.MILO ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.LENORA, TrainerType.MILO ] }, [BiomeId.POWER_PLANT]: { [BiomePoolTier.COMMON]: [ TrainerType.GUITARIST, TrainerType.WORKER ], @@ -1828,10 +1777,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.VOLKNER, TrainerType.ELESA, TrainerType.CLEMONT ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.VOLKNER, TrainerType.ELESA, TrainerType.CLEMONT ] }, [BiomeId.VOLCANO]: { [BiomePoolTier.COMMON]: [ TrainerType.FIREBREATHER ], @@ -1839,10 +1785,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.BLAINE, TrainerType.FLANNERY, TrainerType.KABU ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.BLAINE, TrainerType.FLANNERY, TrainerType.KABU ] }, [BiomeId.GRAVEYARD]: { [BiomePoolTier.COMMON]: [ TrainerType.PSYCHIC ], @@ -1850,10 +1793,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.MORTY, TrainerType.ALLISTER, TrainerType.RYME ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.MORTY, TrainerType.ALLISTER, TrainerType.RYME ] }, [BiomeId.DOJO]: { [BiomePoolTier.COMMON]: [ TrainerType.BLACK_BELT ], @@ -1861,10 +1801,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.BRAWLY, TrainerType.MAYLENE, TrainerType.KORRINA, TrainerType.BEA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.BRAWLY, TrainerType.MAYLENE, TrainerType.KORRINA, TrainerType.BEA ] }, [BiomeId.FACTORY]: { [BiomePoolTier.COMMON]: [ TrainerType.WORKER ], @@ -1872,10 +1809,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.JASMINE, TrainerType.BYRON ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.JASMINE, TrainerType.BYRON ] }, [BiomeId.RUINS]: { [BiomePoolTier.COMMON]: [ TrainerType.PSYCHIC, TrainerType.SCIENTIST ], @@ -1883,10 +1817,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.SABRINA, TrainerType.TATE, TrainerType.LIZA, TrainerType.TULIP ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.SABRINA, TrainerType.TATE, TrainerType.LIZA, TrainerType.TULIP ] }, [BiomeId.WASTELAND]: { [BiomePoolTier.COMMON]: [ TrainerType.VETERAN ], @@ -1894,10 +1825,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.CLAIR, TrainerType.DRAYDEN, TrainerType.RAIHAN ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.CLAIR, TrainerType.DRAYDEN, TrainerType.RAIHAN ] }, [BiomeId.ABYSS]: { [BiomePoolTier.COMMON]: [], @@ -1905,10 +1833,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.MARNIE ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.MARNIE ] }, [BiomeId.SPACE]: { [BiomePoolTier.COMMON]: [], @@ -1916,10 +1841,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.OLYMPIA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.OLYMPIA ] }, [BiomeId.CONSTRUCTION_SITE]: { [BiomePoolTier.COMMON]: [ TrainerType.OFFICER, TrainerType.WORKER ], @@ -1927,10 +1849,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.LT_SURGE, TrainerType.CHUCK, TrainerType.WATTSON ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.LT_SURGE, TrainerType.CHUCK, TrainerType.WATTSON ] }, [BiomeId.JUNGLE]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.RANGER ], @@ -1938,10 +1857,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.RAMOS ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.RAMOS ] }, [BiomeId.FAIRY_CAVE]: { [BiomePoolTier.COMMON]: [ TrainerType.BEAUTY ], @@ -1949,10 +1865,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.VALERIE, TrainerType.OPAL, TrainerType.BEDE ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.VALERIE, TrainerType.OPAL, TrainerType.BEDE ] }, [BiomeId.TEMPLE]: { [BiomePoolTier.COMMON]: [], @@ -1960,10 +1873,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.FANTINA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.FANTINA ] }, [BiomeId.SLUM]: { [BiomePoolTier.COMMON]: [ TrainerType.BIKER, TrainerType.OFFICER, TrainerType.ROUGHNECK ], @@ -1971,10 +1881,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.PIERS ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.PIERS ] }, [BiomeId.SNOWY_FOREST]: { [BiomePoolTier.COMMON]: [ TrainerType.SNOW_WORKER ], @@ -1982,10 +1889,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.CANDICE, TrainerType.MELONY ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.CANDICE, TrainerType.MELONY ] }, [BiomeId.ISLAND]: { [BiomePoolTier.COMMON]: [ TrainerType.RICH_KID ], @@ -1993,21 +1897,15 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.NESSA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.NESSA ] }, [BiomeId.LABORATORY]: { - [BiomePoolTier.COMMON]: [], + [BiomePoolTier.COMMON]: [ TrainerType.SCIENTIST ], [BiomePoolTier.UNCOMMON]: [], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.GIOVANNI ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.GIOVANNI ] }, [BiomeId.END]: { [BiomePoolTier.COMMON]: [], @@ -2015,13 +1913,9 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [] } }; - export function initBiomes() { const pokemonBiomes = [ [ SpeciesId.BULBASAUR, PokemonType.GRASS, PokemonType.POISON, [ diff --git a/src/enums/ui-mode.ts b/src/enums/ui-mode.ts index dcf6bd2a238..bc93e747be2 100644 --- a/src/enums/ui-mode.ts +++ b/src/enums/ui-mode.ts @@ -43,5 +43,6 @@ export enum UiMode { TEST_DIALOGUE, AUTO_COMPLETE, ADMIN, - MYSTERY_ENCOUNTER + MYSTERY_ENCOUNTER, + CHANGE_PASSWORD_FORM, } diff --git a/src/field/arena.ts b/src/field/arena.ts index 484450cc5df..ed2f1df9b12 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -145,7 +145,7 @@ export class Arena { ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; console.log(BiomePoolTier[tier]); - while (!this.pokemonPool[tier].length) { + while (!this.pokemonPool[tier]?.length) { console.log(`Downgraded rarity tier from ${BiomePoolTier[tier]} to ${BiomePoolTier[tier - 1]}`); tier--; } diff --git a/src/plugins/api/pokerogue-account-api.ts b/src/plugins/api/pokerogue-account-api.ts index 03f522e8dac..22f86413618 100644 --- a/src/plugins/api/pokerogue-account-api.ts +++ b/src/plugins/api/pokerogue-account-api.ts @@ -1,6 +1,7 @@ import { ApiBase } from "#api/api-base"; import { SESSION_ID_COOKIE_NAME } from "#app/constants"; import type { + AccountChangePwRequest, AccountInfoResponse, AccountLoginRequest, AccountLoginResponse, @@ -95,4 +96,19 @@ export class PokerogueAccountApi extends ApiBase { removeCookie(SESSION_ID_COOKIE_NAME); // we are always clearing the cookie. } + + public async changePassword(changePwData: AccountChangePwRequest) { + try { + const response = await this.doPost("/account/changepw", changePwData, "form-urlencoded"); + if (response.ok) { + return null; + } + console.warn("Change password failed!", response.status, response.statusText); + return response.text(); + } catch (err) { + console.warn("Change password failed!", err); + } + + return "Unknown error!"; + } } diff --git a/src/ui/change-password-form-ui-handler.ts b/src/ui/change-password-form-ui-handler.ts new file mode 100644 index 00000000000..eccc67ffb04 --- /dev/null +++ b/src/ui/change-password-form-ui-handler.ts @@ -0,0 +1,124 @@ +import { globalScene } from "#app/global-scene"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import { UiMode } from "#enums/ui-mode"; +import type { InputFieldConfig } from "#ui/form-modal-ui-handler"; +import { FormModalUiHandler } from "#ui/form-modal-ui-handler"; +import type { ModalConfig } from "#ui/modal-ui-handler"; +import i18next from "i18next"; + +export class ChangePasswordFormUiHandler extends FormModalUiHandler { + private readonly ERR_PASSWORD: string = "invalid password"; + private readonly ERR_ACCOUNT_EXIST: string = "account doesn't exist"; + private readonly ERR_PASSWORD_MISMATCH: string = "password doesn't match"; + + constructor(mode: UiMode | null = null) { + super(mode); + } + + setup(): void { + super.setup(); + } + + override getModalTitle(_config?: ModalConfig): string { + return i18next.t("menu:changePassword"); + } + + override getWidth(_config?: ModalConfig): number { + return 160; + } + + override getMargin(_config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; + } + + override getButtonLabels(_config?: ModalConfig): string[] { + return [i18next.t("settings:buttonSubmit"), i18next.t("menu:cancel")]; + } + + override getReadableErrorMessage(error: string): string { + const colonIndex = error?.indexOf(":"); + if (colonIndex > 0) { + error = error.slice(0, colonIndex); + } + switch (error) { + case this.ERR_PASSWORD: + return i18next.t("menu:invalidRegisterPassword"); + case this.ERR_ACCOUNT_EXIST: + return i18next.t("menu:accountNonExistent"); + case this.ERR_PASSWORD_MISMATCH: + return i18next.t("menu:passwordNotMatchingConfirmPassword"); + } + + return super.getReadableErrorMessage(error); + } + + override getInputFieldConfigs(): InputFieldConfig[] { + const inputFieldConfigs: InputFieldConfig[] = []; + inputFieldConfigs.push({ + label: i18next.t("menu:password"), + isPassword: true, + }); + inputFieldConfigs.push({ + label: i18next.t("menu:confirmPassword"), + isPassword: true, + }); + return inputFieldConfigs; + } + + override show(args: [ModalConfig, ...any]): boolean { + if (super.show(args)) { + const config = args[0]; + const originalSubmitAction = this.submitAction; + this.submitAction = () => { + if (globalScene.tweens.getTweensOf(this.modalContainer).length === 0) { + // Prevent overlapping overrides on action modification + this.submitAction = originalSubmitAction; + this.sanitizeInputs(); + globalScene.ui.setMode(UiMode.LOADING, { buttonActions: [] }); + const onFail = (error: string | null) => { + globalScene.ui.setMode(UiMode.CHANGE_PASSWORD_FORM, Object.assign(config, { errorMessage: error?.trim() })); + globalScene.ui.playError(); + }; + const [passwordInput, confirmPasswordInput] = this.inputs; + if (!passwordInput?.text) { + return onFail(this.getReadableErrorMessage("invalid password")); + } + if (passwordInput.text !== confirmPasswordInput.text) { + return onFail(this.ERR_PASSWORD_MISMATCH); + } + + pokerogueApi.account.changePassword({ password: passwordInput.text }).then(error => { + if (!error && originalSubmitAction) { + globalScene.ui.playSelect(); + originalSubmitAction(); + // Only clear inputs if the action was successful + for (const input of this.inputs) { + input.setText(""); + } + } else { + onFail(error); + } + }); + } + }; + // Upon pressing cancel, the inputs should be cleared + const originalCancelAction = this.cancelAction; + this.cancelAction = () => { + globalScene.ui.playSelect(); + for (const input of this.inputs) { + input.setText(""); + } + originalCancelAction?.(); + }; + + return true; + } + + return false; + } + + override clear() { + super.clear(); + this.setMouseCursorStyle("default"); //reset cursor + } +} diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 203d98a86c7..5c547465de9 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -19,6 +19,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { protected inputs: InputText[]; protected errorMessage: Phaser.GameObjects.Text; protected submitAction: Function | null; + protected cancelAction: (() => void) | null; protected tween: Phaser.Tweens.Tween; protected formLabels: Phaser.GameObjects.Text[]; @@ -126,22 +127,37 @@ export abstract class FormModalUiHandler extends ModalUiHandler { }); } - show(args: any[]): boolean { + override show(args: any[]): boolean { if (super.show(args)) { this.inputContainers.map(ic => ic.setVisible(true)); const config = args[0] as FormModalConfig; this.submitAction = config.buttonActions.length ? config.buttonActions[0] : null; + this.cancelAction = config.buttonActions[1] ?? null; - if (this.buttonBgs.length) { - this.buttonBgs[0].off("pointerdown"); - this.buttonBgs[0].on("pointerdown", () => { - if (this.submitAction && globalScene.tweens.getTweensOf(this.modalContainer).length === 0) { - this.submitAction(); + // #region: Override button pointerDown + // Override the pointerDown event for the buttonBgs to call the `submitAction` and `cancelAction` + // properties that we set above, allowing their behavior to change after this method terminates + // Some subclasses use this to add behavior to the submit and cancel action + + this.buttonBgs[0].off("pointerdown"); + this.buttonBgs[0].on("pointerdown", () => { + if (this.submitAction && globalScene.tweens.getTweensOf(this.modalContainer).length === 0) { + this.submitAction(); + } + }); + const cancelBg = this.buttonBgs[1]; + if (cancelBg) { + cancelBg.off("pointerdown"); + cancelBg.on("pointerdown", () => { + // The seemingly redundant cancelAction check is intentionally left in as a defensive programming measure + if (this.cancelAction && globalScene.tweens.getTweensOf(this.modalContainer).length === 0) { + this.cancelAction(); } }); } + //#endregion: Override pointerDown events this.modalContainer.y += 24; this.modalContainer.setAlpha(0); diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index fa65cccab2f..30bf9eeff75 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -311,6 +311,17 @@ export class MenuUiHandler extends MessageUiHandler { }, keepOpen: true, }, + { + // Note: i18n key is under `menu`, not `menuUiHandler` to avoid duplication + label: i18next.t("menu:changePassword"), + handler: () => { + ui.setOverlayMode(UiMode.CHANGE_PASSWORD_FORM, { + buttonActions: [() => ui.revertMode(), () => ui.revertMode()], + }); + return true; + }, + keepOpen: true, + }, { label: i18next.t("menuUiHandler:consentPreferences"), handler: () => { diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 228d80968b9..4d1456eec51 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -7,7 +7,7 @@ import { UiHandler } from "#ui/ui-handler"; import { addWindow, WindowVariant } from "#ui/ui-theme"; export interface ModalConfig { - buttonActions: Function[]; + buttonActions: ((...args: any[]) => any)[]; } export abstract class ModalUiHandler extends UiHandler { diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 4c8f0613122..847294dcfc6 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -13,6 +13,7 @@ import { BallUiHandler } from "#ui/ball-ui-handler"; import { BattleMessageUiHandler } from "#ui/battle-message-ui-handler"; import type { BgmBar } from "#ui/bgm-bar"; import { GameChallengesUiHandler } from "#ui/challenges-select-ui-handler"; +import { ChangePasswordFormUiHandler } from "#ui/change-password-form-ui-handler"; import { CommandUiHandler } from "#ui/command-ui-handler"; import { ConfirmUiHandler } from "#ui/confirm-ui-handler"; import { EggGachaUiHandler } from "#ui/egg-gacha-ui-handler"; @@ -102,6 +103,7 @@ const noTransitionModes = [ UiMode.ADMIN, UiMode.MYSTERY_ENCOUNTER, UiMode.RUN_INFO, + UiMode.CHANGE_PASSWORD_FORM, ]; export class UI extends Phaser.GameObjects.Container { @@ -172,6 +174,7 @@ export class UI extends Phaser.GameObjects.Container { new AutoCompleteUiHandler(), new AdminUiHandler(), new MysteryEncounterUiHandler(), + new ChangePasswordFormUiHandler(), ]; }