diff --git a/index.css b/index.css index 49e570bdccc..62ad6266d30 100644 --- a/index.css +++ b/index.css @@ -68,6 +68,10 @@ input:-internal-autofill-selected { background-clip: text; } +input:-webkit-autofill { + -webkit-text-fill-color: #a1a1a1; +} + /* Need adjust input font-size */ input { font-size: 3.2rem; diff --git a/public/images/statuses_ca-ES.png b/public/images/statuses_ca-ES.png index d372b989be9..fe05e243f7a 100644 Binary files a/public/images/statuses_ca-ES.png and b/public/images/statuses_ca-ES.png differ diff --git a/public/images/types_ca-ES.json b/public/images/types_ca-ES.json new file mode 100644 index 00000000000..fa3abaaf259 --- /dev/null +++ b/public/images/types_ca-ES.json @@ -0,0 +1,440 @@ +{ + "textures": [ + { + "image": "types_ca-ES.png", + "format": "RGBA8888", + "size": { + "w": 32, + "h": 280 + }, + "scale": 1, + "frames": [ + { + "filename": "unknown", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + } + }, + { + "filename": "bug", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 14, + "w": 32, + "h": 14 + } + }, + { + "filename": "dark", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 28, + "w": 32, + "h": 14 + } + }, + { + "filename": "dragon", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 42, + "w": 32, + "h": 14 + } + }, + { + "filename": "electric", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 56, + "w": 32, + "h": 14 + } + }, + { + "filename": "fairy", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 70, + "w": 32, + "h": 14 + } + }, + { + "filename": "fighting", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 84, + "w": 32, + "h": 14 + } + }, + { + "filename": "fire", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 98, + "w": 32, + "h": 14 + } + }, + { + "filename": "flying", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 112, + "w": 32, + "h": 14 + } + }, + { + "filename": "ghost", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 126, + "w": 32, + "h": 14 + } + }, + { + "filename": "grass", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 140, + "w": 32, + "h": 14 + } + }, + { + "filename": "ground", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 154, + "w": 32, + "h": 14 + } + }, + { + "filename": "ice", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 168, + "w": 32, + "h": 14 + } + }, + { + "filename": "normal", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 182, + "w": 32, + "h": 14 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 196, + "w": 32, + "h": 14 + } + }, + { + "filename": "psychic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 210, + "w": 32, + "h": 14 + } + }, + { + "filename": "rock", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 224, + "w": 32, + "h": 14 + } + }, + { + "filename": "steel", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 238, + "w": 32, + "h": 14 + } + }, + { + "filename": "water", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 252, + "w": 32, + "h": 14 + } + }, + { + "filename": "stellar", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 266, + "w": 32, + "h": 14 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f14cf47d9a8f1d40c8e03aa6ba00fff3:6fc4227b57a95d429a1faad4280f7ec8:5961efbfbf4c56b8745347e7a663a32f$" + } +} diff --git a/public/images/types_ca-ES.png b/public/images/types_ca-ES.png new file mode 100644 index 00000000000..e85c84ed9c9 Binary files /dev/null and b/public/images/types_ca-ES.png differ diff --git a/public/locales b/public/locales index 0e5c6096ba2..cd4057af258 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 0e5c6096ba26f6b87aed1aab3fe9b0b23f6cbb7b +Subproject commit cd4057af258b659ba2c1ed2778bb2793fa1f6141 diff --git a/src/data/balance/biomes.ts b/src/data/balance/biomes.ts index a4e051d80c9..3dff1722af6 100644 --- a/src/data/balance/biomes.ts +++ b/src/data/balance/biomes.ts @@ -1659,7 +1659,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { }, [Biome.GRASS]: { [BiomePoolTier.COMMON]: [ TrainerType.BREEDER, TrainerType.SCHOOL_KID ], - [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.POKEFAN ], [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -1680,9 +1680,9 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.METROPOLIS]: { - [BiomePoolTier.COMMON]: [ TrainerType.CLERK, TrainerType.CYCLIST, TrainerType.OFFICER, TrainerType.WAITER, TrainerType.BEAUTY ], + [BiomePoolTier.COMMON]: [ TrainerType.BEAUTY, TrainerType.CLERK, TrainerType.CYCLIST, TrainerType.OFFICER, TrainerType.WAITER ], [BiomePoolTier.UNCOMMON]: [ TrainerType.BREEDER, TrainerType.DEPOT_AGENT, TrainerType.GUITARIST ], - [BiomePoolTier.RARE]: [ TrainerType.ARTIST ], + [BiomePoolTier.RARE]: [ TrainerType.ARTIST, TrainerType.RICH_KID ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], [BiomePoolTier.BOSS]: [ TrainerType.WHITNEY, TrainerType.NORMAN, TrainerType.IONO, TrainerType.LARRY ], @@ -1702,7 +1702,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.SEA]: { - [BiomePoolTier.COMMON]: [ TrainerType.SWIMMER, TrainerType.SAILOR ], + [BiomePoolTier.COMMON]: [ TrainerType.SAILOR, TrainerType.SWIMMER ], [BiomePoolTier.UNCOMMON]: [], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], @@ -1758,7 +1758,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { }, [Biome.MOUNTAIN]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.BLACK_BELT, TrainerType.HIKER ], - [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.PILOT ], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -1790,7 +1790,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.DESERT]: { - [BiomePoolTier.COMMON]: [ TrainerType.SCIENTIST, TrainerType.BACKPACKER ], + [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.SCIENTIST ], [BiomePoolTier.UNCOMMON]: [], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], @@ -1812,8 +1812,8 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.MEADOW]: { - [BiomePoolTier.COMMON]: [ TrainerType.PARASOL_LADY, TrainerType.BEAUTY ], - [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.BREEDER, TrainerType.BAKER ], + [BiomePoolTier.COMMON]: [ TrainerType.BEAUTY, TrainerType.MUSICIAN, TrainerType.PARASOL_LADY ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.ACE_TRAINER, TrainerType.BAKER, TrainerType.BREEDER, TrainerType.POKEFAN ], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -1967,7 +1967,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { }, [Biome.SLUM]: { [BiomePoolTier.COMMON]: [ TrainerType.BIKER, TrainerType.OFFICER, TrainerType.ROUGHNECK ], - [BiomePoolTier.UNCOMMON]: [ TrainerType.BAKER ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.BAKER, TrainerType.HOOLIGANS ], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -1988,8 +1988,8 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.BOSS_ULTRA_RARE]: [] }, [Biome.ISLAND]: { - [BiomePoolTier.COMMON]: [], - [BiomePoolTier.UNCOMMON]: [], + [BiomePoolTier.COMMON]: [ TrainerType.RICH_KID ], + [BiomePoolTier.UNCOMMON]: [ TrainerType.RICH ], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], @@ -7178,7 +7178,8 @@ export function initBiomes() { [ Biome.METROPOLIS, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] - ]], + ] + ], [ TrainerType.BIKER, [ [ Biome.SLUM, BiomePoolTier.COMMON ] ] @@ -7208,7 +7209,8 @@ export function initBiomes() { ], [ TrainerType.CLERK, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ] - ]], + ] + ], [ TrainerType.CYCLIST, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.METROPOLIS, BiomePoolTier.COMMON ] @@ -7217,18 +7219,23 @@ export function initBiomes() { [ TrainerType.DANCER, []], [ TrainerType.DEPOT_AGENT, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ] - ]], + ] + ], [ TrainerType.DOCTOR, []], + [ TrainerType.FIREBREATHER, [ + [ Biome.VOLCANO, BiomePoolTier.COMMON ] + ] + ], [ TrainerType.FISHERMAN, [ [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ TrainerType.RICH, []], [ TrainerType.GUITARIST, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ]], + ] + ], [ TrainerType.HARLEQUIN, []], [ TrainerType.HIKER, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], @@ -7236,13 +7243,24 @@ export function initBiomes() { [ Biome.BADLANDS, BiomePoolTier.COMMON ] ] ], - [ TrainerType.HOOLIGANS, []], + [ TrainerType.HOOLIGANS, [ + [ Biome.SLUM, BiomePoolTier.UNCOMMON ] + ] + ], [ TrainerType.HOOPSTER, []], [ TrainerType.INFIELDER, []], [ TrainerType.JANITOR, []], [ TrainerType.LINEBACKER, []], [ TrainerType.MAID, []], - [ TrainerType.MUSICIAN, []], + [ TrainerType.MUSICIAN, [ + [ Biome.MEADOW, BiomePoolTier.COMMON ] + ] + ], + [ TrainerType.HEX_MANIAC, [ + [ Biome.RUINS, BiomePoolTier.UNCOMMON ], + [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] + ] + ], [ TrainerType.NURSERY_AIDE, []], [ TrainerType.OFFICER, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ], @@ -7256,8 +7274,15 @@ export function initBiomes() { [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ TrainerType.PILOT, []], - [ TrainerType.POKEFAN, []], + [ TrainerType.PILOT, [ + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ] + ] + ], + [ TrainerType.POKEFAN, [ + [ Biome.GRASS, BiomePoolTier.UNCOMMON ], + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ] + ] + ], [ TrainerType.PRESCHOOLER, []], [ TrainerType.PSYCHIC, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], @@ -7270,11 +7295,24 @@ export function initBiomes() { [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ TrainerType.RICH_KID, []], + [ TrainerType.RICH, [ + [ Biome.ISLAND, BiomePoolTier.UNCOMMON ] + ] + ], + [ TrainerType.RICH_KID, [ + [ Biome.METROPOLIS, BiomePoolTier.RARE ], + [ Biome.ISLAND, BiomePoolTier.COMMON ] + ] + ], [ TrainerType.ROUGHNECK, [ [ Biome.SLUM, BiomePoolTier.COMMON ] ] ], + [ TrainerType.SAILOR, [ + [ Biome.SEA, BiomePoolTier.COMMON ], + [ Biome.BEACH, BiomePoolTier.COMMON ] + ] + ], [ TrainerType.SCIENTIST, [ [ Biome.DESERT, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.COMMON ] @@ -7317,20 +7355,6 @@ export function initBiomes() { [ Biome.TOWN, BiomePoolTier.COMMON ] ] ], - [ TrainerType.HEX_MANIAC, [ - [ Biome.RUINS, BiomePoolTier.UNCOMMON ], - [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] - ] - ], - [ TrainerType.FIREBREATHER, [ - [ Biome.VOLCANO, BiomePoolTier.COMMON ] - ] - ], - [ TrainerType.SAILOR, [ - [ Biome.SEA, BiomePoolTier.COMMON ], - [ Biome.BEACH, BiomePoolTier.COMMON ] - ] - ], [ TrainerType.BROCK, [ [ Biome.CAVE, BiomePoolTier.BOSS ] ] diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 208e269bd9c..0e755d54e15 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -312,6 +312,113 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { victory: ["dialogue:sailor.victory.1", "dialogue:sailor.victory.2", "dialogue:sailor.victory.3"], }, ], + [TrainerType.CLERK]: [ + { + encounter: ["dialogue:clerk.encounter.1", "dialogue:clerk.encounter.2", "dialogue:clerk.encounter.3"], + victory: ["dialogue:clerk.victory.1", "dialogue:clerk.victory.2", "dialogue:clerk.victory.3"], + }, + { + encounter: [ + "dialogue:clerk_female.encounter.1", + "dialogue:clerk_female.encounter.2", + "dialogue:clerk_female.encounter.3", + ], + victory: [ + "dialogue:clerk_female.victory.1", + "dialogue:clerk_female.victory.2", + "dialogue:clerk_female.victory.3", + ], + }, + ], + [TrainerType.HOOLIGANS]: [ + { + encounter: ["dialogue:hooligans.encounter.1", "dialogue:hooligans.encounter.2"], + victory: ["dialogue:hooligans.victory.1", "dialogue:hooligans.victory.2"], + }, + ], + [TrainerType.MUSICIAN]: [ + { + encounter: [ + "dialogue:musician.encounter.1", + "dialogue:musician.encounter.2", + "dialogue:musician.encounter.3", + "dialogue:musician.encounter.4", + ], + victory: ["dialogue:musician.victory.1", "dialogue:musician.victory.2", "dialogue:musician.victory.3"], + }, + ], + [TrainerType.PILOT]: [ + { + encounter: [ + "dialogue:pilot.encounter.1", + "dialogue:pilot.encounter.2", + "dialogue:pilot.encounter.3", + "dialogue:pilot.encounter.4", + ], + victory: [ + "dialogue:pilot.victory.1", + "dialogue:pilot.victory.2", + "dialogue:pilot.victory.3", + "dialogue:pilot.victory.4", + ], + }, + ], + [TrainerType.POKEFAN]: [ + { + encounter: ["dialogue:pokefan.encounter.1", "dialogue:pokefan.encounter.2", "dialogue:pokefan.encounter.3"], + victory: ["dialogue:pokefan.victory.1", "dialogue:pokefan.victory.2", "dialogue:pokefan.victory.3"], + }, + { + encounter: [ + "dialogue:pokefan_female.encounter.1", + "dialogue:pokefan_female.encounter.2", + "dialogue:pokefan_female.encounter.3", + ], + victory: [ + "dialogue:pokefan_female.victory.1", + "dialogue:pokefan_female.victory.2", + "dialogue:pokefan_female.victory.3", + ], + }, + ], + [TrainerType.RICH]: [ + { + encounter: ["dialogue:rich.encounter.1", "dialogue:rich.encounter.2", "dialogue:rich.encounter.3"], + victory: ["dialogue:rich.victory.1", "dialogue:rich.victory.2", "dialogue:rich.victory.3"], + }, + { + encounter: [ + "dialogue:rich_female.encounter.1", + "dialogue:rich_female.encounter.2", + "dialogue:rich_female.encounter.3", + ], + victory: ["dialogue:rich_female.victory.1", "dialogue:rich_female.victory.2", "dialogue:rich_female.victory.3"], + }, + ], + [TrainerType.RICH_KID]: [ + { + encounter: ["dialogue:rich_kid.encounter.1", "dialogue:rich_kid.encounter.2", "dialogue:rich_kid.encounter.3"], + victory: [ + "dialogue:rich_kid.victory.1", + "dialogue:rich_kid.victory.2", + "dialogue:rich_kid.victory.3", + "dialogue:rich_kid.victory.4", + ], + }, + { + encounter: [ + "dialogue:rich_kid_female.encounter.1", + "dialogue:rich_kid_female.encounter.2", + "dialogue:rich_kid_female.encounter.3", + ], + victory: [ + "dialogue:rich_kid_female.victory.1", + "dialogue:rich_kid_female.victory.2", + "dialogue:rich_kid_female.victory.3", + "dialogue:rich_kid_female.victory.4", + ], + }, + ], [TrainerType.ROCKET_GRUNT]: [ { encounter: [ diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 275078dbace..a4787e819b8 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -741,6 +741,26 @@ export async function catchPokemon( false, ); }, + () => { + const attributes = { + shiny: pokemon.shiny, + variant: pokemon.variant, + form: pokemon.formIndex, + female: pokemon.gender === Gender.FEMALE, + }; + globalScene.ui.setOverlayMode( + Mode.POKEDEX_PAGE, + pokemon.species, + pokemon.formIndex, + attributes, + null, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + promptRelease(); + }); + }, + ); + }, () => { globalScene.ui.setMode( Mode.PARTY, diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index ffe5cdfe04c..0417e7abc32 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -2141,7 +2141,15 @@ export const trainerConfigs: TrainerConfigs = { }), [TrainerType.HOOLIGANS]: new TrainerConfig(++t) .setDoubleOnly() + .setMoneyMultiplier(1.5) .setEncounterBgm(TrainerType.ROUGHNECK) + .setPartyTemplateFunc(() => + getWavePartyTemplate( + trainerPartyTemplates.TWO_WEAK, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.ONE_AVG_ONE_STRONG, + ), + ) .setSpeciesFilter(s => s.isOfType(PokemonType.POISON) || s.isOfType(PokemonType.DARK)), [TrainerType.HOOPSTER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.INFIELDER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), @@ -2149,7 +2157,14 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.LINEBACKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.MAID]: new TrainerConfig(++t).setMoneyMultiplier(1.6).setEncounterBgm(TrainerType.RICH), [TrainerType.MUSICIAN]: new TrainerConfig(++t) - .setEncounterBgm(TrainerType.ROUGHNECK) + .setMoneyMultiplier(1.1) + .setEncounterBgm(TrainerType.POKEFAN) + .setPartyTemplates( + trainerPartyTemplates.FOUR_WEAKER, + trainerPartyTemplates.THREE_WEAK, + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + trainerPartyTemplates.TWO_AVG, + ) .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SING)), [TrainerType.HEX_MANIAC]: new TrainerConfig(++t) .setMoneyMultiplier(1.5) @@ -2214,7 +2229,14 @@ export const trainerConfigs: TrainerConfigs = { ) || s.getLevelMoves().some(plm => plm[1] === Moves.RAIN_DANCE), ), // Mons with rain abilities or who learn Rain Dance by level [TrainerType.PILOT]: new TrainerConfig(++t) + .setMoneyMultiplier(1.75) .setEncounterBgm(TrainerType.CLERK) + .setPartyTemplates( + trainerPartyTemplates.THREE_WEAK, + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.THREE_AVG, + ) .setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1), [TrainerType.POKEFAN]: new TrainerConfig(++t) .setMoneyMultiplier(1.4) @@ -2230,7 +2252,8 @@ export const trainerConfigs: TrainerConfigs = { trainerPartyTemplates.FOUR_WEAK_SAME, trainerPartyTemplates.FIVE_WEAK, trainerPartyTemplates.SIX_WEAKER_SAME, - ), + ) + .setSpeciesFilter(s => tmSpecies[Moves.HELPING_HAND].indexOf(s.speciesId) > -1), [TrainerType.PRESCHOOLER]: new TrainerConfig(++t) .setMoneyMultiplier(0.2) .setEncounterBgm(TrainerType.YOUNGSTER) @@ -2352,16 +2375,29 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.SUPER_RARE]: [Species.LARVESTA], }), [TrainerType.RICH]: new TrainerConfig(++t) - .setMoneyMultiplier(5) + .setMoneyMultiplier(3.25) .setName("Gentleman") .setHasGenders("Madame") - .setHasDouble("Rich Couple"), + .setHasDouble("Rich Couple") + .setPartyTemplates( + trainerPartyTemplates.THREE_WEAK, + trainerPartyTemplates.FOUR_WEAK, + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + trainerPartyTemplates.THREE_AVG, + ) + .setSpeciesFilter(s => s.isOfType(PokemonType.NORMAL) || s.isOfType(PokemonType.ELECTRIC)), [TrainerType.RICH_KID]: new TrainerConfig(++t) - .setMoneyMultiplier(3.75) + .setMoneyMultiplier(2.5) .setName("Rich Boy") .setHasGenders("Lady") .setHasDouble("Rich Kids") - .setEncounterBgm(TrainerType.RICH), + .setEncounterBgm(TrainerType.RICH) + .setPartyTemplates( + trainerPartyTemplates.FOUR_WEAKER, + trainerPartyTemplates.THREE_WEAK_SAME, + trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, + ) + .setSpeciesFilter(s => s.baseTotal <= 460), [TrainerType.ROUGHNECK]: new TrainerConfig(++t) .setMoneyMultiplier(1.4) .setEncounterBgm(TrainerType.ROUGHNECK) diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 295dc318db4..7f05634db48 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -250,7 +250,7 @@ export class LoadingScene extends SceneBase { this.loadAtlas("statuses", ""); this.loadAtlas("types", ""); } - const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"]; + const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN", "zh-TW", "ca-ES"]; if (lang && availableLangs.includes(lang)) { this.loadImage(`pkmnday2025event-${lang}`, "events"); } else { diff --git a/src/phases/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts index 6b905c2a07f..6e2a2d29af4 100644 --- a/src/phases/attempt-capture-phase.ts +++ b/src/phases/attempt-capture-phase.ts @@ -24,6 +24,7 @@ import type { PokeballType } from "#enums/pokeball"; import { StatusEffect } from "#enums/status-effect"; import i18next from "i18next"; import { globalScene } from "#app/global-scene"; +import { Gender } from "#app/data/gender"; export class AttemptCapturePhase extends PokemonPhase { private pokeballType: PokeballType; @@ -321,6 +322,26 @@ export class AttemptCapturePhase extends PokemonPhase { false, ); }, + () => { + const attributes = { + shiny: pokemon.shiny, + variant: pokemon.variant, + form: pokemon.formIndex, + female: pokemon.gender === Gender.FEMALE, + }; + globalScene.ui.setOverlayMode( + Mode.POKEDEX_PAGE, + pokemon.species, + pokemon.formIndex, + attributes, + null, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + promptRelease(); + }); + }, + ); + }, () => { globalScene.ui.setMode( Mode.PARTY, diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index 1a7279d371c..b2b1d3eb298 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -948,10 +948,10 @@ export function setSetting(setting: string, value: number): boolean { label: "日本語", handler: () => changeLocaleHandler("ja"), }, - // { - // label: "Català", - // handler: () => changeLocaleHandler("ca-ES") - // }, + { + label: "Català", + handler: () => changeLocaleHandler("ca-ES") + }, { label: i18next.t("settings:back"), handler: () => cancelHandler(), diff --git a/src/ui/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index a8710b0ab01..eb7018051b7 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -21,11 +21,12 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { show(args: any[]): boolean { if ( - args.length === 4 && + args.length === 5 && args[0] instanceof Function && args[1] instanceof Function && args[2] instanceof Function && - args[3] === "fullParty" + args[3] instanceof Function && + args[4] === "fullParty" ) { const config: OptionSelectConfig = { options: [ @@ -37,29 +38,36 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { }, }, { - label: i18next.t("menu:yes"), + label: i18next.t("partyUiHandler:POKEDEX"), handler: () => { args[1](); return true; }, }, { - label: i18next.t("menu:no"), + label: i18next.t("menu:yes"), handler: () => { args[2](); return true; }, }, + { + label: i18next.t("menu:no"), + handler: () => { + args[3](); + return true; + }, + }, ], - delay: args.length >= 8 && args[7] !== null ? (args[7] as number) : 0, + delay: args.length >= 9 && args[8] !== null ? (args[8] as number) : 0, }; super.show([config]); - this.switchCheck = args.length >= 5 && args[4] !== null && (args[4] as boolean); + this.switchCheck = args.length >= 6 && args[5] !== null && (args[5] as boolean); - const xOffset = args.length >= 6 && args[5] !== null ? (args[5] as number) : 0; - const yOffset = args.length >= 7 && args[6] !== null ? (args[6] as number) : 0; + const xOffset = args.length >= 7 && args[6] !== null ? (args[6] as number) : 0; + const yOffset = args.length >= 8 && args[7] !== null ? (args[7] as number) : 0; this.optionSelectContainer.setPosition(globalScene.game.canvas.width / 6 - 1 + xOffset, -48 + yOffset); diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 86460a24fdc..8f96f1e44c2 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -261,6 +261,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private unlockedVariants: boolean[]; private canUseCandies: boolean; + private exitCallback; constructor() { super(Mode.POKEDEX_PAGE); @@ -681,6 +682,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.filteredIndices = args[2] ?? null; this.starterSetup(); + if (args[4] instanceof Function) { + this.exitCallback = args[4]; + } + this.moveInfoOverlay.clear(); // clear this when removing a menu; the cancel button doesn't seem to trigger this automatically on controllers this.infoOverlay.clear(); @@ -1106,7 +1111,15 @@ export default class PokedexPageUiHandler extends MessageUiHandler { }); this.blockInput = false; } else { - ui.revertMode(); + ui.revertMode() + .then(() => { + console.log("exitCallback", this.exitCallback); + if (this.exitCallback instanceof Function) { + const exitCallback = this.exitCallback; + this.exitCallback = null; + exitCallback(); + } + }); success = true; } } else { diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 64c743ec88d..56201f38748 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -458,7 +458,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { makeRoomForConfirmUi(speedMultiplier = 1, fromCatch = false): Promise { const xPosition = fromCatch - ? this.initialX - this.infoWindowWidth - 65 + ? this.initialX - this.infoWindowWidth - 67 : this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth; return new Promise(resolve => { globalScene.tweens.add({ diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 8265ad827bc..91940d3af76 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -150,7 +150,7 @@ const languageSettings: { [key: string]: LanguageSetting } = { instructionTextSize: "38px", }, "ca-ES": { - starterInfoTextSize: "56px", + starterInfoTextSize: "52px", instructionTextSize: "38px", }, }; diff --git a/src/utils.ts b/src/utils.ts index 7d3dea0247e..fbca8410feb 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -464,6 +464,7 @@ export function hasAllLocalizedSprites(lang?: string): boolean { case "pt-BR": case "ko": case "ja": + case "ca-ES": return true; default: return false;