From 7199aee9adc98bbc3cc927516aba985c4a1180a0 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:09:25 +0100 Subject: [PATCH 01/24] [UI/UX] Fix showing form names and types (#5302) * Correctly displaying form names * Fixed bug which displayed wrong form types * Handling unobtainable forms * F button does not show up if there is only one obtainable form --- src/data/pokemon-species.ts | 13 ++++++++----- src/ui/pokedex-page-ui-handler.ts | 2 +- src/ui/pokedex-ui-handler.ts | 8 ++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 041632b183d..43b719878bb 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1003,19 +1003,22 @@ export class PokemonForm extends PokemonSpeciesForm { public formName: string; public formKey: string; public formSpriteKey: string | null; + public isUnobtainable: boolean; // This is a collection of form keys that have in-run form changes, but should still be separately selectable from the start screen private starterSelectableKeys: string[] = [ "10", "50", "10-pc", "50-pc", "red", "orange", "yellow", "green", "blue", "indigo", "violet" ]; constructor(formName: string, formKey: string, type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, - catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false + catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false, + isUnobtainable: boolean = false ) { super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, catchRate, baseFriendship, baseExp, genderDiffs, (isStarterSelectable || !formKey)); this.formName = formName; this.formKey = formKey; this.formSpriteKey = formSpriteKey; + this.isUnobtainable = isUnobtainable; } getFormSpriteKey(_formIndex?: number) { @@ -1812,7 +1815,7 @@ export function initSpecies() { new PokemonForm("Dragon", "dragon", Type.DRAGON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), new PokemonForm("Dark", "dark", Type.DARK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), new PokemonForm("Fairy", "fairy", Type.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, false, true), ), new PokemonSpecies(Species.VICTINI, 5, false, false, true, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.SNIVY, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.6, 8.1, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -2366,7 +2369,7 @@ export function initSpecies() { ), new PokemonSpecies(Species.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, true), - new PokemonForm("Zenith", "zenith", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300) + new PokemonForm("Zenith", "zenith", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true) ), new PokemonSpecies(Species.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.6, 1.8, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, Type.DRAGON, 3.6, 150, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false), @@ -2465,11 +2468,11 @@ export function initSpecies() { new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", Type.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.SINISTEA, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.MEDIUM_FAST, null, false, false, new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), + new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true, true), ), new PokemonSpecies(Species.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, GrowthRate.MEDIUM_FAST, null, false, false, new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), + new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true, true), ), new PokemonSpecies(Species.HATENNA, 8, false, false, false, "Calm Pokémon", Type.PSYCHIC, null, 0.4, 3.4, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 265, 42, 30, 45, 56, 53, 39, 235, 50, 53, GrowthRate.SLOW, 0, false), new PokemonSpecies(Species.HATTREM, 8, false, false, false, "Serene Pokémon", Type.PSYCHIC, null, 0.6, 4.8, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 683045d7814..e3386033030 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -1583,7 +1583,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.species.forms[newFormIndex].isStarterSelectable || globalScene.dexForDevs) { // TODO: are those bangs correct? break; } - } while (newFormIndex !== props.formIndex); + } while (newFormIndex !== props.formIndex || this.species.forms[newFormIndex].isUnobtainable); starterAttributes.form = newFormIndex; // store the selected form this.savedStarterAttributes.form = starterAttributes.form; this.formIndex = newFormIndex; diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 791b80d8da2..153c132d45a 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1698,7 +1698,7 @@ export default class PokedexUiHandler extends MessageUiHandler { openFormTray(species: PokemonSpecies): boolean { - this.trayForms = species.forms; + this.trayForms = species.forms.filter(f => !f.isUnobtainable); this.trayNumIcons = this.trayForms.length; this.trayRows = Math.floor(this.trayNumIcons / 9) + (this.trayNumIcons % 9 === 0 ? 0 : 1); @@ -1949,19 +1949,19 @@ export default class PokedexUiHandler extends MessageUiHandler { } if (isFormCaught || isFormSeen || globalScene.dexForDevs) { - this.pokemonFormText.setText("Form Text"); + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex, false)); } else { this.pokemonFormText.setText(""); } if (isFormCaught || isFormSeen || globalScene.dexForDevs) { - const speciesForm = getPokemonSpeciesForm(species.speciesId, 0); // TODO: always selecting the first form + const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex ?? 0); // TODO: always selecting the first form this.setTypeIcons(speciesForm.type1, speciesForm.type2); } else { this.setTypeIcons(null, null); } - if (species?.forms?.length > 1) { + if (species?.forms?.filter(f => !f.isUnobtainable).length > 1) { if (!this.showingTray) { this.showFormTrayIconElement.setVisible(true); this.showFormTrayLabel.setVisible(true); From 595413edd702ff2b64ddf2b02d6f8ed21320a011 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:14:22 -0500 Subject: [PATCH 02/24] [i18n] Update locale submodules (Feb 12 21:30 UTC) (#5308) --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index bfcd7f91c39..f46dcdb423c 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit bfcd7f91c39630f155839872c8f66fd0a89e12ac +Subproject commit f46dcdb423c24137a25d9f6078cc6be68502801a From be0f3b2ab3d57fdbe8fede812a2e8cb66e5e5b28 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Thu, 13 Feb 2025 04:14:22 +0100 Subject: [PATCH 03/24] [Bug][UI/UX] Dex bug fixes 12 feb (#5307) * Fixed bug when setting tint of eggs for egg move filter * Form text is properly hidden when going to filters * Displaying level up moves of alternate forms * Offsetting form cycle button when uncaught text is shown * Pokedex buttons now appear on mobile touchpad * Hotfix to prevent "Normal" form to showing the text * Preventing filter texts from showing gibberish * Moving cursor to input text when pressing on filter * Introducing method to get full obtainable unlocks for a given species * Filtering obtainable unlocks in dex * Buying eggs in dex does not crash the game * Shiny icon does not overlap with luck text for evolutions * Shiny is maintained correctly when cycling through different pages * Displacing text elements to avoid overlap for localized form names * Checking starter caughtAttr in addition to pokemon caughtAttr --- index.css | 12 +++---- src/data/pokemon-species.ts | 60 ++++++++++++++++++++++++++++++- src/ui/filter-text.ts | 2 +- src/ui/pokedex-page-ui-handler.ts | 48 ++++++++++++++----------- src/ui/pokedex-scan-ui-handler.ts | 7 +++- src/ui/pokedex-ui-handler.ts | 45 ++++++++++++++--------- 6 files changed, 127 insertions(+), 47 deletions(-) diff --git a/index.css b/index.css index 2ec106516d2..d32d9da9bb1 100644 --- a/index.css +++ b/index.css @@ -164,13 +164,13 @@ input:-internal-autofill-selected { } /* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */ -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadOpenFilters, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleForm, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleShiny, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE']) #apadOpenFilters, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleForm, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleShiny, #touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleAbility, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleGender, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleVariant { +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleAbility, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE']) #apadCycleGender, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX']) #apadCycleVariant { display: none; } diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 43b719878bb..5883bac3fc8 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -7,7 +7,7 @@ import i18next from "i18next"; import type { AnySound } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; import type { GameMode } from "#app/game-mode"; -import type { StarterMoveset } from "#app/system/game-data"; +import { DexAttr, type 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"; @@ -32,6 +32,37 @@ export enum Region { PALDEA } +// TODO: this is horrible and will need to be removed once a refactor/cleanup of forms is executed. +export const normalForm: Species[] = [ + Species.PIKACHU, + Species.RAICHU, + Species.EEVEE, + Species.JOLTEON, + Species.FLAREON, + Species.VAPOREON, + Species.ESPEON, + Species.UMBREON, + Species.LEAFEON, + Species.GLACEON, + Species.SYLVEON, + Species.PICHU, + Species.ROTOM, + Species.DIALGA, + Species.PALKIA, + Species.KYUREM, + Species.GENESECT, + Species.FROAKIE, + Species.FROGADIER, + Species.GRENINJA, + Species.ROCKRUFF, + Species.NECROZMA, + Species.MAGEARNA, + Species.MARSHADOW, + Species.CRAMORANT, + Species.ZARUDE, + Species.CALYREX +]; + /** * Gets the {@linkcode PokemonSpecies} object associated with the {@linkcode Species} enum given * @param species The species to fetch @@ -997,6 +1028,33 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali ? this.forms[formIndex || 0].getFormSpriteKey() : ""; } + + /** + * Generates a {@linkcode bigint} corresponding to the maximum unlocks possible for this species, + * taking into account if the species has a male/female gender, and which variants are implemented. + * @returns {@linkcode bigint} Maximum unlocks, can be compared with {@linkcode DexEntry.caughtAttr}. + */ + getFullUnlocksData(): bigint { + let caughtAttr: bigint = 0n; + caughtAttr += DexAttr.NON_SHINY; + caughtAttr += DexAttr.SHINY; + if (this.malePercent !== null) { + if (this.malePercent > 0) { + caughtAttr += DexAttr.MALE; + } + if (this.malePercent < 100) { + caughtAttr += DexAttr.FEMALE; + } + } + caughtAttr += DexAttr.DEFAULT_VARIANT; + if (this.hasVariants()) { + caughtAttr += DexAttr.VARIANT_2; + caughtAttr += DexAttr.VARIANT_3; + } + caughtAttr += DexAttr.DEFAULT_FORM; + + return caughtAttr; + } } export class PokemonForm extends PokemonSpeciesForm { diff --git a/src/ui/filter-text.ts b/src/ui/filter-text.ts index f961fc9b385..f69cf113f05 100644 --- a/src/ui/filter-text.ts +++ b/src/ui/filter-text.ts @@ -133,7 +133,7 @@ export class FilterText extends Phaser.GameObjects.Container { const handler = ui.getHandler() as AwaitableUiHandler; handler.tutorialActive = true; // Switch to the dialog test window - this.selections[index].setText(String(i18next.t(dialogueName))); + this.selections[index].setText( dialogueName === "" ? this.defaultText : String(i18next.t(dialogueName))); ui.revertMode(); this.onChange(); }, diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index e3386033030..8b5a5bd12f1 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -16,7 +16,7 @@ import { pokemonFormChanges } from "#app/data/pokemon-forms"; import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import type PokemonSpecies from "#app/data/pokemon-species"; -import { allSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpeciesForm, normalForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; import { starterPassiveAbilities } from "#app/data/balance/passives"; import { Type } from "#enums/type"; @@ -383,7 +383,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setScale(0.8); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); - this.pokemonShinyIcon = globalScene.add.sprite(14, 76, "shiny_icons"); + this.pokemonShinyIcon = globalScene.add.sprite(14, 117, "shiny_icons"); this.pokemonShinyIcon.setOrigin(0.15, 0.2); this.pokemonShinyIcon.setScale(1); this.pokemonCaughtHatchedContainer.add(this.pokemonShinyIcon); @@ -601,7 +601,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const form = species.forms[formIndex]; // If this form has a specific set of moves, we get them. - this.levelMoves = (formIndex > 0 && pokemonFormLevelMoves.hasOwnProperty(formIndex)) ? pokemonFormLevelMoves[species.speciesId][formIndex] : pokemonSpeciesLevelMoves[species.speciesId]; + this.levelMoves = (formIndex > 0 && pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) ? pokemonFormLevelMoves[species.speciesId][formIndex] : pokemonSpeciesLevelMoves[species.speciesId]; this.ability1 = form.ability1; this.ability2 = (form.ability2 === form.ability1) ? undefined : form.ability2; this.abilityHidden = (form.abilityHidden === form.ability1) ? undefined : form.abilityHidden; @@ -741,14 +741,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler { return biomes; } - isCaught(otherSpeciesDexEntry?: DexEntry): bigint { + isCaught(otherSpecies?: PokemonSpecies): bigint { if (globalScene.dexForDevs) { return 255n; } - const dexEntry = otherSpeciesDexEntry ? otherSpeciesDexEntry : this.speciesStarterDexEntry; + const species = otherSpecies ? otherSpecies : this.species; + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const starterDexEntry = globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)]; - return dexEntry?.caughtAttr ?? 0n; + return (dexEntry?.caughtAttr ?? 0n) & (starterDexEntry?.caughtAttr ?? 0n) & species.getFullUnlocksData(); } /** * Check whether a given form is caught for a given species. @@ -765,11 +767,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } const species = otherSpecies ? otherSpecies : this.species; const formIndex = otherFormIndex !== undefined ? otherFormIndex : this.formIndex; - const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const caughtAttr = this.isCaught(species); - const isFormCaught = dexEntry ? - (dexEntry.caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n - : false; + const isFormCaught = (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n; return isFormCaught; } @@ -783,8 +783,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { */ initStarterPrefs(): StarterAttributes { const starterAttributes : StarterAttributes | null = this.species ? { ...this.savedStarterAttributes } : null; - const dexEntry = globalScene.gameData.dexData[this.species.speciesId]; - const caughtAttr = this.isCaught(dexEntry); + const caughtAttr = this.isCaught(); // no preferences or Pokemon wasn't caught, return empty attribute if (!starterAttributes || !caughtAttr) { @@ -1235,7 +1234,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { case MenuOptions.BIOMES: - if (!(this.isCaught() || this.speciesStarterDexEntry?.seenAttr)) { + if (!(isCaught || this.speciesStarterDexEntry?.seenAttr)) { error = true; } else { this.blockInput = true; @@ -1372,8 +1371,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { }); this.evolutions.map(evo => { const evoSpecies = allSpecies.find(species => species.speciesId === evo.speciesId); - const evoSpeciesStarterDexEntry = evoSpecies ? globalScene.gameData.dexData[evoSpecies.speciesId] : undefined; - const isCaughtEvo = this.isCaught(evoSpeciesStarterDexEntry) ? true : false; + const isCaughtEvo = this.isCaught(evoSpecies) ? true : false; // Attempts to find the formIndex of the evolved species const newFormKey = evo.evoFormKey ? evo.evoFormKey : (this.species.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""); const matchingForm = evoSpecies?.forms.find(form => form.formKey === newFormKey); @@ -1535,6 +1533,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonShinyIcon.setVisible(true); starterAttributes.shiny = true; + this.savedStarterAttributes.shiny = starterAttributes.shiny; } else { let newVariant = props.variant; do { @@ -1688,7 +1687,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); - const egg = new Egg({ scene: globalScene, species: this.species.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG }); + const egg = new Egg({ scene: globalScene, species: this.starterId, sourceType: EggSourceType.SAME_SPECIES_EGG }); egg.addEggToGameData(); globalScene.gameData.saveSystem().then(success => { @@ -1856,6 +1855,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.canCycleGender) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Gender, gamepadType, this.genderIconElement, this.genderLabel); } + } else { + // Making space for "Uncaught" text + this.instructionRowY += 8; } if (this.canCycleForm) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Form, gamepadType, this.formIconElement, this.formLabel); @@ -2093,7 +2095,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (species) { const dexEntry = globalScene.gameData.dexData[species.speciesId]; - const caughtAttr = this.isCaught(dexEntry); + const caughtAttr = this.isCaught(species); if (!caughtAttr) { const props = this.starterAttributes; @@ -2240,13 +2242,11 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCandyContainer.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { - this.pokemonShinyIcon.setY(135); this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); this.pokemonHatchedIcon.setVisible(false); this.pokemonHatchedCountText.setVisible(false); this.pokemonFormText.setY(36); } else { - this.pokemonShinyIcon.setY(117); this.pokemonHatchedIcon.setVisible(true); this.pokemonHatchedCountText.setVisible(true); this.pokemonFormText.setY(42); @@ -2276,7 +2276,12 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (isFormCaught || isFormSeen) { const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? this.setTypeIcons(speciesForm.type1, speciesForm.type2); - this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex)); + // TODO: change this once forms are refactored + if (normalForm.includes(species.speciesId) && !formIndex) { + this.pokemonFormText.setText(""); + } else { + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex)); + } this.pokemonFormText.setVisible(true); if (!isFormCaught) { this.pokemonFormText.setY(18); @@ -2321,7 +2326,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { */ getCurrentDexProps(speciesId: number): bigint { let props = 0n; - const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr; + const species = allSpecies.find(sp => sp.speciesId === speciesId); + const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & (species?.getFullUnlocksData() ?? 0n); /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props diff --git a/src/ui/pokedex-scan-ui-handler.ts b/src/ui/pokedex-scan-ui-handler.ts index 0fc7171842a..3920c866486 100644 --- a/src/ui/pokedex-scan-ui-handler.ts +++ b/src/ui/pokedex-scan-ui-handler.ts @@ -115,6 +115,10 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { this.reduceKeys(); + setTimeout(() => { + input.setFocus(); // Focus after a short delay to avoid unwanted input + }, 50); + input.on("keydown", (inputObject, evt: KeyboardEvent) => { if ([ "escape", "space" ].some((v) => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && ui.getMode() === Mode.AUTO_COMPLETE) { // Delete autocomplete list and recovery focus. @@ -169,7 +173,8 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { this.submitAction = (_) => { if (ui.getMode() === Mode.POKEDEX_SCAN) { this.sanitizeInputs(); - const sanitizedName = btoa(unescape(encodeURIComponent(this.inputs[0].text))); + const outputName = this.reducedKeys.includes(this.inputs[0].text) ? this.inputs[0].text : ""; + const sanitizedName = btoa(unescape(encodeURIComponent(outputName))); config.buttonActions[0](sanitizedName); return true; } diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 153c132d45a..940223528fb 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -7,7 +7,7 @@ import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import type { PokemonForm } from "#app/data/pokemon-species"; import type PokemonSpecies from "#app/data/pokemon-species"; -import { allSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpeciesForm, getPokerusStarters, normalForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; import { catchableSpecies } from "#app/data/balance/biomes"; import { Type } from "#enums/type"; @@ -411,15 +411,15 @@ export default class PokedexUiHandler extends MessageUiHandler { this.iconAnimHandler = new PokemonIconAnimHandler(); this.iconAnimHandler.setup(); - this.pokemonNumberText = addTextObject(6, 140, "", TextStyle.SUMMARY); + this.pokemonNumberText = addTextObject(6, 141, "", TextStyle.SUMMARY); this.pokemonNumberText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNumberText); - this.pokemonNameText = addTextObject(6, 127, "", TextStyle.SUMMARY); + this.pokemonNameText = addTextObject(6, 128, "", TextStyle.SUMMARY); this.pokemonNameText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNameText); - this.pokemonFormText = addTextObject(6, 122, "", TextStyle.PARTY, { fontSize: textSettings.instructionTextSize }); + this.pokemonFormText = addTextObject(6, 121, "", TextStyle.PARTY, { fontSize: textSettings.instructionTextSize }); this.pokemonFormText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonFormText); @@ -565,7 +565,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.starterPreferences[species.speciesId] = this.initStarterPrefs(species); - if (dexEntry.caughtAttr || globalScene.dexForDevs) { + if ((dexEntry.caughtAttr & species.getFullUnlocksData()) || globalScene.dexForDevs) { icon.clearTint(); } else if (dexEntry.seenAttr) { icon.setTint(0x808080); @@ -606,7 +606,7 @@ export default class PokedexUiHandler extends MessageUiHandler { return {}; } - const caughtAttr = dexEntry.caughtAttr; + const caughtAttr = dexEntry.caughtAttr & species.getFullUnlocksData(); const hasShiny = caughtAttr & DexAttr.SHINY; const hasNonShiny = caughtAttr & DexAttr.NON_SHINY; @@ -1255,7 +1255,9 @@ export default class PokedexUiHandler extends MessageUiHandler { // First, ensure you have the caught attributes for the species else default to bigint 0 // TODO: This might be removed depending on how accessible we want the pokedex function to be - const caughtAttr = globalScene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0); + const caughtAttr = (globalScene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0)) & + (globalScene.gameData.dexData[this.getStarterSpeciesId(container.species.speciesId)]?.caughtAttr || BigInt(0)) & + container.species.getFullUnlocksData(); const starterData = globalScene.gameData.starterData[starterId]; const isStarterProgressable = speciesEggMoves.hasOwnProperty(starterId); @@ -1292,7 +1294,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (fitsEggMove1 && !fitsLevelMove1) { container.eggMove1Icon.setVisible(true); const em1 = eggMoves.findIndex(name => name === selectedMove1); - if ((starterData[starterId].eggMoves & (1 << em1)) === 0) { + if ((starterData.eggMoves & (1 << em1)) === 0) { container.eggMove1Icon.setTint(0x808080); } else { container.eggMove1Icon.clearTint(); @@ -1303,7 +1305,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (fitsEggMove2 && !fitsLevelMove2) { container.eggMove2Icon.setVisible(true); const em2 = eggMoves.findIndex(name => name === selectedMove2); - if ((starterData[starterId].eggMoves & (1 << em2)) === 0) { + if ((starterData.eggMoves & (1 << em2)) === 0) { container.eggMove2Icon.setTint(0x808080); } else { container.eggMove2Icon.clearTint(); @@ -1580,11 +1582,12 @@ export default class PokedexUiHandler extends MessageUiHandler { } const speciesId = container.species.speciesId; + const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & container.species.getFullUnlocksData(); this.updateStarterValueLabel(container); container.label.setVisible(true); - const speciesVariants = speciesId && globalScene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY - ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(globalScene.gameData.dexData[speciesId].caughtAttr & v)) + const speciesVariants = speciesId && caughtAttr & DexAttr.SHINY + ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(caughtAttr & v)) : []; for (let v = 0; v < 3; v++) { const hasVariant = speciesVariants.length > v; @@ -1595,7 +1598,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } container.starterPassiveBgs.setVisible(!!globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].passiveAttr); - container.hiddenAbilityIcon.setVisible(!!globalScene.gameData.dexData[speciesId].caughtAttr && !!(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].abilityAttr & 4)); + container.hiddenAbilityIcon.setVisible(!!caughtAttr && !!(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].abilityAttr & 4)); container.classicWinIcon.setVisible(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].classicWinCount > 0); container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); @@ -1729,7 +1732,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.trayContainers = []; this.trayForms.map((f, index) => { - const isFormCaught = dexEntry ? (dexEntry.caughtAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; + const isFormCaught = dexEntry ? (dexEntry.caughtAttr & species.getFullUnlocksData() & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; const formContainer = new PokedexMonContainer(species, { formIndex: f.formIndex, female: props.female, shiny: props.shiny, variant: props.variant }); this.iconAnimHandler.addOrUpdate(formContainer.icon, PokemonIconAnimMode.NONE); @@ -1866,6 +1869,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } else { this.pokemonNumberText.setText(species ? i18next.t("pokedexUiHandler:pokemonNumber") + padInt(species.speciesId, 4) : ""); this.pokemonNameText.setText(species ? "???" : ""); + this.pokemonFormText.setText(""); this.type1Icon.setVisible(false); this.type2Icon.setVisible(false); if (species) { @@ -1899,8 +1903,9 @@ export default class PokedexUiHandler extends MessageUiHandler { if (species) { const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const caughtAttr = dexEntry.caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)].caughtAttr & species.getFullUnlocksData(); - if (!dexEntry.caughtAttr) { + if (!caughtAttr) { const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId))); if (shiny === undefined) { @@ -1917,7 +1922,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } } - const isFormCaught = dexEntry ? (dexEntry.caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + const isFormCaught = dexEntry ? (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; const assetLoadCancelled = new BooleanHolder(false); @@ -1949,7 +1954,12 @@ export default class PokedexUiHandler extends MessageUiHandler { } if (isFormCaught || isFormSeen || globalScene.dexForDevs) { - this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex, false)); + // TODO: change this once forms are refactored + if (normalForm.includes(species.speciesId) && !formIndex) { + this.pokemonFormText.setText(""); + } else { + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex, false)); + } } else { this.pokemonFormText.setText(""); } @@ -2054,7 +2064,8 @@ export default class PokedexUiHandler extends MessageUiHandler { */ getCurrentDexProps(speciesId: number): bigint { let props = 0n; - const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr; + const species = allSpecies.find(sp => sp.speciesId === speciesId); + const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & (species?.getFullUnlocksData() ?? 0n); /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props From f1283ad1c8c8e4681a1c7db09b6eca54957bad14 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Thu, 13 Feb 2025 22:11:40 +0100 Subject: [PATCH 04/24] [UI/UX] Valentine 2025 Event Banners (#5310) * Valentine 2025 Event Banners --- .../images/events/valentines2025event-de.png | Bin 3267 -> 20550 bytes .../images/events/valentines2025event-en.png | Bin 3267 -> 20537 bytes .../events/valentines2025event-es-ES.png | Bin 3267 -> 20570 bytes .../images/events/valentines2025event-fr.png | Bin 3267 -> 22433 bytes .../images/events/valentines2025event-it.png | Bin 3267 -> 20372 bytes .../images/events/valentines2025event-ja.png | Bin 3267 -> 27437 bytes .../images/events/valentines2025event-ko.png | Bin 3267 -> 25791 bytes .../events/valentines2025event-pt-BR.png | Bin 3267 -> 21243 bytes .../events/valentines2025event-zh-CN.png | Bin 3267 -> 24584 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/events/valentines2025event-de.png b/public/images/events/valentines2025event-de.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..8dd41924a774f7175e47d526d174b5e99d50f329 100644 GIT binary patch literal 20550 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 Z@>j3vnmn{tQ39Rx=jrO_vd$@?2>=XxLvjEB literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-en.png b/public/images/events/valentines2025event-en.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..dc36dad33943be6145ee187cc3205ff1c739897f 100644 GIT binary patch literal 20537 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 F1OPEhqUrzu literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-es-ES.png b/public/images/events/valentines2025event-es-ES.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..0915299b7bdce6c51f3981035b27580fcb2c43b8 100644 GIT binary patch literal 20570 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 b#|ixBUtw$Dz{GV3d~~3vtDnm{r-UW|3Lu^j literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-fr.png b/public/images/events/valentines2025event-fr.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..dbaf23101ed15bb449f5e1bbc24bcd017269280e 100644 GIT binary patch literal 22433 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%0DB$D!)baVBcO z*KZ~E>{%>FiDZYKd5rzk<}wHE)}P*-v8}nwg5$>s%XhoZ`O&XcMLKlzo^e)wwpjV* z>mvt%=L4nsPL!ZcN`{qFr}~(y>K(-F)J2Qf^QgdXTX<7JL4 k;Lp&Os}(PQBRLnVpj3Ss`8DPV5)<7cE+?IaCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-it.png b/public/images/events/valentines2025event-it.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..b10eb8083beaf5fa321eabad9e64d77cbcd830f7 100644 GIT binary patch literal 20372 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 BH`M?D literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-ja.png b/public/images/events/valentines2025event-ja.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..7e9fe5ad3d4b32541215d9cf8ba766299e2ed11f 100644 GIT binary patch literal 27437 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

v!V-wL<9tE9CA@ASTs_1#fvp3 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 HtKk0uK!Vgt literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-ko.png b/public/images/events/valentines2025event-ko.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..558a402fc7764d11b01d5a13b4c836df2e2c8ae0 100644 GIT binary patch literal 25791 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 literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-pt-BR.png b/public/images/events/valentines2025event-pt-BR.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..45fa40f30fc9476a65f8d2ff134e4264c8dedb44 100644 GIT binary patch literal 21243 zcmcG#1z42b`Y-$psURR2NSB3l4IwEl0uqXJ4n2%?Gb5;gv;hJVf)YwM5(9#O0@9t* z-960AdC+(Jy7#yD+5dB$?|5C{Fwc6{y4St#{@p9|u7)xN89f;Q02Hb!3fcfb1bzfc zP7#2=pE!Jd2mW{Zp^CmM0Fa+M`GEilZ!Q7A8A?0d2W}74??_l8;JoHm2n!gm7yRML zyMUyO*F$ql2bdeH1k4Ve9gzs`g4ezgA}{m$%3p8)bFy&BV1st zBD_!@O95d)R#9;y0Dt&MvjjNkB>~DVl4_*g{|9;uc&iX&R zd-CL;HU;yt`wv4;p8OvAP(t1XX6}Y?(M2E}{~eFcQ2`-!NXy#GtcVrs-k_D!#enpR=A&Wd+VCBx(*7u@ZxVw1}JYSXv2-@R*Ckz+W&?D{&D^ zK`Uz^khdpiEdfpgl4O3OT~h13uG%)L_|pBukY{LdBGeXDA<4k{!(J+UDi|g2dduBzjn!^z;te~-ARdRQ2 zD22JQUNwh5yveF=Zs*FXV{7MR2XkfnQ!IW?akAe3;S_xTg&rlvJE{h(3aWCf3Yt2s z8glBI+H&Bh|Frgh9DcG6--(g@#R9(nz@(p+N>ubAzqX+*piTm}wr!5SWwf~LM{~G3suy*q_cY(>-fCBnoOv)ep{TI>^ zP989qKZt*5?gC1H8z?MN?A9*e$^TY=RyR-{9zJxmv;3(Id>&3#e|eMNTx9=`>$sYG z{O=hA6%Y{Nw-6HNv4)BKbfi!o3zz_uN0{FV$`7*=hJio-VDP_VkdUARzra6C-Tyg* z{yI8KTXQEH7#Jn+{ayPTXAnn#RZP#lbPMFd1ep_XD$e$Xxcq6YDQ>vMnG=Rbnlf0%4AQa<_kJ46Tn z_#NcKoIss*0Yi9gvzp|adcN<~n#?4lLIrCoO*D%3a(c8GcojBq^A15vhzlKy!WUY(q_38&>6cDxv0Xa%J)Eo- z_2d0Pqq3jXsfYLnnaeqOW4`-&OCQ#jdM4JRDWX3&rrvt2^dV<9Xke5gbsd#%@nC%OhyfVper>cd zX1@}#MBf3o9Atld_SPx3$GV*EM~a*syiT^2lCf&uN^Uw4HCoRk7Bc94gVG~o4PU^< z$4VT7CRFSm;C_s^C-Wc-YjYc2VQA5BcH%XgZKnXXpA(5FxDuHyJtGB55I!P1dq1W% zAP+|l93a9b-WuWOI$gZEHGTK40=q0Sbi)&e74g7Y^~^_r_tTH=OR*s7O~P2lx}#4_ zZ?SQn4#2}>x_QEbHI9Mi0;7nUdM)MF+^>S`P6lQ5h|3X%#VMj2Q)#ij9iL9gB1&y$ zzhyG6Hb*c}Od|LkyFR2V5q>C4`RFMrL?8?9@9ZrV3ax7$kQ$$T05vWJRF`kXPr|)D zHtUVhcUor)xjRC}d_@6(9`HNfI-WH4R@$jIx@Hnl!?rY8sO&-dkoyy1g(pI1BQGmR z`Ze9H4<~H?P?KU8?LdU+&`-=-@7_o%YZs&lCV(eBDA{yBH&x0)P*jW z;n-O^=YiPv`iW`$G5dLW>!`&{)e#{J_uZ#iL5bzH7ml(01&>O}65gPYo>+!R2cxM#|PeN#5; z5^19Z{AAUsY_?%X|0!=G*Vn*|Op@))kmB_AV}({b!|y3vBr`I^_A_)^)7#Y#jBDQ7 zoF+HG_k>7fZEBHy{P-_S(Qf$sQR@yyw9xJtiZ$7DXoEt@eXhvHhyXy*a7V7)ABWRr zeScuuti#gY;=6hGU~;rA$e=R6!mD#e0uig;g`a#HVmU_}-(1Nl!#y!F1*?p?BU?SGZ-`rOS#A>0@jMA!i1S#J8tExREyVrglGWp$dr!inv*xDMVDqkvZFjxbz8FlZMV zlsR|wNJaVv!NVvSP2k>M%YZTDVi;8I0gM9R#!zfs5TJL1C||$$hS>d;*EXBtajet; za@F+3lYsA$v+tUOIDlWqr}wNPI}j+@JQ#Ac0`jPwyCV#mX3v~pze1r!23NTE|5;?0 zL3Ms6l%AA-e^598xjNw}vpi=Lgw-lVs*6N^;*R=5kgM4Ntx9wQY3Rsha4`eXxPbA} zZrIv4|k#PMNCI|)N(`ISgN0_^xKwYv-FEz*ugLlo~C|O3)$JPMt zo{aonxc&AMqSbTYB)L%{q!Z60Fy+#m3~$I4PN}|vx_V#*OSn8TW@HcM2~RBPlo4lB){8)7dt&B};K0?I%?AZG`_;ihQ^oB?y2KY1qL7o1F5<7`qi<5C zdhfm!f*k8lpL>h_^c3~*>y>G0V@wBb&~_}gk_7eB*hJH($r8zKL=h5+Bd;HyP*f-& z4{@M9qa?6uI?Y15(ZwW!qqmCX8JVl#ld_jYsd5?K=dZ1_XF}Zz(|cPYCVS}HaE+2x zMOgN{zxiVK`+|84ZFfITM1O7GzWi@b@K}U^wPG50`$p!Ml`9nB0Muo~MV~TxGO~VH z%W`&z)-M|^*jO@)YTJ#|#|8G|3Rm0Bw%glB?p_C{_egczdrC)o*6%*C3P$zCRbt;e zeWnF{r2H|p-{uCh)LT`pAzOz?nejx{Ht`bKTnLJ}#xw)SRaZC_L&t3;ARY1xv7e`y6vmFs_ z!^f!&fmU129m8>AsFJQ%{{Fi7P!3JbVWl((P26kI4GSxTV{atvZ^NEL4G7_*B+Yl0 z#s~q>8E%Y!v+3T80y&lKtbp0CZ^KXHRxi4Dk_zpsxa-G?FSN%ad&BXCv{5{M1&4Xg zx~{t@QD(KTHf$ee(aU3J9q~PDS7%C)U-vA1^*ZSuf&NX&%|CG|zY9KdJ(N(T`g09) z>aenLEYG!g;ubmnZJSoyeyghzcrus6js?oQ9&r|*W_$H^ZOe%QSQ{HTzfxp}uPR%o z#8EN{yvuQ-IT;w7Lw0a5d$FcJ1FMW(jrDFYP%c@F?6Vlk!By?t42x-<=b(G!L$Q-v z%B|uLsK57Vc(ae3$Q*%4j^hnm7O|FV)x>oeQ7P?>F@{Vd7RHa3#DO#9-56{s@|^hX zX2|1y(WN3pyu%;v4?j~g`9za3)jNY4H7eAoTJEQ3GVa{=rL2eh_}$Q!iC;2m;3TSW z@1|g~vQ)|>F-+t%On?~|(-hd^=~Ki|ha+(IrPLAWHizp%ugUeZ2`<$MvCN(!*sk>4{!Ji}XFEU^#zD|ITHK56+U;9O9_~ zkar-B_91hpP@sO6iJ`tjzx|BVrc^_zfqEmt)WR{)DV7eP)ouA$V!u%Z`|igE1yY+m6DND12Jqwj1MYslQ$)en zJjcq}OO(?feS*n71%F!)g(P)Md7;(kD*!zoo)X0owUqo+^Tb^^oAuz}2Y3(V+>I9^ ztr>eVcC+n3Y-APNAm1>0T;^-p4OzDMz?t=ob0q9&N>m=H(a`u=9^};1bn3QsytSH0 zP~zGF8o25qNneLTe6nZF(Jv;eJSD5^2)^!mF@R=ebDbg=>(Ga+U-cA=?B=;b&pJJm zL>DH{Qw&Y+DgJ}Rwp(U``zp!M6D~jZ-$8g52^{C>_iy818fZr}XfR!dk(?@wX5FiL z95R%5pLIwNa(8(DaGuF0I!o_MDW|bJ;2q$I5kXGCE~RzgJRR_XIgpTN+1RRk$Oxxw z2L?5NTd5S2mSHcA2Eo6bC46q>2v#rJb}R#3TifeVKGka)kHu|bP8U%C5*(;_uS#V0RJ0AYR2YFkmy%{v~*(QGDQ-( z?M$2oVS#-E+04s;qoZ@=j5erYfQ&W6#Y!W<-Cuo;p(u?WLa~jAZC} zNX5=}9&nX!Ey%+8BsQ2%KYz3w`KpxLzAzapW3{afFpz2x@b6jZH8IHDz?ouW zcu?wf!NnQnb;E_ThRt<|IDWbo)|3>p64H(K+`SHH9yh4AD3Z8+0bJK=ZI6qP$AvZ| z7#82zP&42Dl*lto?@N*O;ehSxgv^Mh?qy2WigZZsq6YOZsz5jY)K+LSlqJ~X&;fso zof^fJSHQgdRcc@Ib+Q~B-jksRb@ZxLn5ILIt2Bz0R#EBH#BNS^taiV5)glk|`=;{N zRXEgCjreAB&s>4|H41t+$Bphixoa+Li>$L(Imm>*ZgNl2Rv_Q)Tp(0bk z0Thwc<&bd?qfY;59!Eh^Ok5T%Ph*v-tgInGBq@t}TOOPLeX(=Aaq6s`*= z9BjcQrG>_m2s>wJCK{wY=|sSbNJ>i$X?ZxYNSQykCDa_w3|)Dbc9G`rWz4O4TN-pM znMY)1yIfFYpYo9Of&%Ylsr~Ma&KH7IPgi_jSJXEmxj}nPv6QxiJyBLpnfJEGPPe;g zxnTOsje*J7{Cj>ZP+WizN-j1%p_oLUz~DKjiXdgY2t?R!zj!A!Ye0h1>;vvr@gAT3 z{xCObYO|6v%=)bJilE+JjuwJJEXy!=UXG#>Y&52v0u;^|0H z=AH|vi;QzZTa5_M#$z%2dc#jXWCr?I;86qFT#Ik_v(Nq7g8GDY=>DCwwYM(D>Qt@v z(J~hwN9Rn55VuGPE#hY1-|zj%OUWp9*N*l>GTGh_Ikb*mr#xQgS^&?56-Ld(1{?oE~aW_UftWA(o z#inyu(T`)^he*I|w4w{JHpLJE9kpc_51&=sY!dv0R{;nyj5@vYZ(rU(+i}#!b4mEM zY)QR-B?2T=y3S+KS7Kxi8mQLwp+WC^GS^Xo7)>eIj67B8`7T?>HwQaH9Ty$xTso{f z>nH9cxs16Nr!mhq6@SdsOzAJ#jGu%xL|4;Khk8az4^Sb!TA$Dw8>9tqs=RXr&o$ib zdz(W>d$o0fBVusl_$3-wm32|O=4`O<@GWAgwz-9GwZU|B_{V3pt)EE(3c1=RQCIZ4 zkW6;Wv4>52ku4r9Mf|WWzW0SR!Di%Rj5%Z% zBi)4u`g*A`OXyp!?T^lVCM(?0KE!y>wZ*rj3{Ak>?zMD~U)J~E!(p$V|Ayt;gv3{( zZ3kSh3p0$5rpFwh=s=@ISVp%u)P;jdq1rWBijY(;6#u9|fN|$txm9#6mhGzsT6NTH zaqxI?Fxz$EedfFXZvptV7S(2Ps_a=*@ zd(c-t@FN3$IGlf%kgvPZ7ayXqOWT$J`0OELzkW`7o-@mx2Vq@wZkEC86ktt9$~%&7 z=DXBJ+t0p_gF4SdCp?)>IonNkeFLcT#^+u#o|{{=>0cD_rh8ed0@W{fYIvb3O;~_CX#X{bAPan#u#n0k#>QO|#mmNA=_>!KEt|0Z@3*qgpKvRmB zh8znsW(>`iiNzF5hSXmdZoqY=^FCJrjxF38?BRHhQ*)>{-hMMhAU`x8@T%WZZ;NqM`_SHh0rK;n=AX zx$PBvd|v#f^t*u$EgO&cx zltbgC%M?<2@a;K0>7#{dD^1!9!M=Re8&jk#0oO;A_g6>C5h-K`%HLGz!6Ui#?anq~ zUGD`dz;E-av6hHQq zqC>AG-@1`cuV$tjOc4L~j-SK@&=x=NIA#!>AOgC5by z7;az|*u$mx%EOy*$IQX%5s`$0FLBCoQs;*`xEROd3&l#%^y~F@9pglx)SmbNws#p> zFRq1~)c69j>&(Eo;gI%>Q8GX1ChiTF!3|B3Dg{aV7W-(Z+^XJg z!nAZu$MhmR#d*T^kSj4`5XP{zpD98$*D#vOP_%|TwfXT7P#ZkdGW(qNiQx?*wD+wa zuYmU)4rfN)pIqUn&5*=`38ww|Z~gi63y32(wF2x(@WP{rp(Em}Y9S*HMHMvlW)v~=H zC;7c9N8sRN@dZ^XHH6-@)b(NH{y4=XJ#b6qqOG3Z#Cx@E?cz?NWi08Q-sf~l#x?ha zP64lv#>W1YQXC*}(sarlFiyah=RydZB2{#y@{#^!XKNE7_?$@3Gia52*K^-B?*ev` zk0Is_8r@&ebKjHpKa=x)+Z$Q0Hl<5ZiM4ff)I#N(FbWrT6jhVjP5kqC+prgh3)}fA(`*_|0 zFq|4jXW`nP1vGO&?i`mWwj!OH6I)WMOl2{8tL>nF#~@Kg9!PVOv72w95*DeL+kR`J za|$!fkXXN6;TbM$U}fe=bUtAF`AP^gX>=tnZD%Apk;xkX!FHbD@(-707?9u~59Z}b@(iI;`e=cb1HGZMR)ORuilz2rBgu+LC!UDuZ zZ8$?40cIbsik5uW@YeW~F!HbrK9Wbn9OFnGP6~jgZbSUty>ZTW&>sia9`{~#KeB6R zgMNs~d?sj%*Ob{_5z@@(8eZueC_4{-@w`4n_$t=tYQANQKhrROsj zvN$L>I-24V2~KvqMfc__fsbU4!R|pm()hSP4}omCpl8HbeaBCF=X+AsZmQIB8~T#u zL2J?KVdc9c&fw9JN>|S_9HGTP;3WnETf>t-M;?-yEfT~tI{VAXTG$JA6 zh&;&IQ7{iw=XD0OUb>gzw0r%}jjZ6m?G>{Q;JomNC&OW}c*1Hzv+eI2NM90n$FHM& zaL4t8X0o;0rzB*aFSMW^Pej^*@WUo^uQQ5U2}t(#F}~~C z{0M)3uaUy~4H$S*-guQ~iXVMUZlLrqj(5xf3o&afpyqgbZ#XP`Yhz1!Zxv(NW!;mh znJ5jn-w@oy1FOTOh7$!hJ*%1fZhc5`X{iYx)k%(%MAoyf9{&j5FDcEbzj=k@r)iem zCPYcXTXX^?1qLUpktan4@^||qNy)HK!s;3eN*9A#3LT7Rx__+Ss>H{(V|nHD2e<&1 z`#dJZW^*>0Y^JMFSG@ABcn#h^-k>&zf`9w)_23Oc;ruIuL)|WJ_!wfIgZ*%Qid6As zna|XK7M8dRr>3ljcXz-i*jJNYp^W}=O18>lRl;M%s6;=>^V=%8YsMr|>|}k=(XjY> zikR(0t^CEtl`?pZ)8K7tm;9x*Z0>zH>}v}sGtq+4`v9xZW4~mm_Ir5MC#%e<%TD~$ zjFO#2FIOk)2}Rsj-<_9m6D#TF1x{8elC%|CGtv4me5eb)AN9+l#8zSqrKSL_F4u4F zjIts06rH<7mouZm8fL!ghZJ`lOV>2$L8T2oY%g)krmc-k0c#)XB>19PJ>2?!GzaV> z0H2Oe*9R?^xxSuy$0f0B4;ZWugn*XXRQ>ec>qEcM;=}Yge4#mpXt%U#k%Cp!LZn;B zZZt?AEC)VkcAfvet$%h)R43EOb1X;jK)ySbLus<>KqUjiwWchbR**kf zJ1docM2ZS;gq$SWfw$bH)Tgi>di^fdVkmv8L4_1Ozl%Kgdtuo$sa--CbvI_VP=*lV zuOc(@!`Pfx(*%9U3mGnmseT->A$&5F!%(niBn_f2bTQo)mr~;kc_Z#-TVQh#;~y&*$nQpr8Em8!_c@}5I zs$TYcX&He>czSSSnjwBA$cR0cz(odx-1&r9_ zxc0T%^#%z0G4Okjh>M{Gm9cfoZj*d|b6=NbR`1^aXln z74-Zz!NazF6MmkUcpHuZs!gz9o*wA{7@YPz-j*RAVMxSTZcZU%S7rRR^kIzb_X3&4 zHFE-%3Y!D&i<^@53=VFk3$DE>=5wkp2>h-~%vV#Q?>W3HYP265g=ZZZIu7AdnVL4; zKR)qgX(G2ysfMys0p6M&mm7#)p@AG@%(7X#sXvy@_>)^Pqk_tK%VGP|iTj=B80yVP z_`M1~GGC?!qcF=cJ5y#iqk^RNsEWYL(m3~yYuZNLrsB{j7yL*$f$*|Zs-+y5 zBs67U$%~TfjemGya*zt(Bq~eHGhkS7BEYxoPvvvUDkfi+xI9g!`V4dp?u*@$;yLPx z&{ytHb*YiV`?Wi!9CG9*v>P5#}m_=U?c-@6e0v#o@1{|gd2WdbcP>_hx3` zvB8G7CL=FsO>7?uU=N-eAHE-A=HpZ!MArdYcXgE;<>PTpl7t30sfb)ED)m z;ID-W)Ha85ZaP@_z{3%T1hfZokkFQFe5p6(t3VErMQVAWP+Y z+G?x_Fxz;HtiAiih5kf#KtFZEJ(#J7uf$=?B2}abqT(UuwIS;-)e}tHG$wwO8$?QF z)yZ0@m7N#qJWke~(1gcfG5!gMlP?YphZXL{fQ6W?&E@b#S|hJ}^|3N00oS&6y|OtB zpLLYI4jLg;aFN&d{9Y*}V{ct)>h$w%Glh%+28TVrBmMLFSvK0@ZgPi;-VN z#Blyc1%|wy)vn}QARapf&_JT?YoGs^2a{(?{TFX! z=2noNpl`bYRsfADCNst~#kp;rR-_~bV*_j@rfERtlq^kb%n-JiQnMBErTBK{V#)RO zf_~bZQ*5U#k_aw$P^|3&TRYzPtwbH?2vD4|;l~$z#>S-xr9bSYyoBXyM_m#p@%Un# z&Ow+K7bd~m58A>_1qZx=Gwmw+JWHEF8GYid^>h2tIO=|>DhW4UPZ`Y>FJZDptm&f5 zogb|_)dyX%oy@sMYQkn+dGpa>JYYlsVgi8Mm^4w{#IBQUtrI-&PG^M>LHsg1Q5UY% z8oy8!d=|EcW&oiR85*umXP_RbfzHOZitSgD`j;TtxEuhQj?1re>cgwzp4O8kOOTUL zNtNiZ7aM6~jc8IrOy}aUUjukUk>9c@6BRy5VB(B|rc?BtPqW>VYa>N@9YIbs=Y}Gf zN88!ruY&s`?)oz34Cr{$l4nNI$E8wPGuGu|M|43K+%6fn>Z9mSyK34oiC7VD++K2f zX(kKOFFCP8k0S4Hlh=3=dq*^F84=%Abl<#Aw3)#6*e>i^5wmP0O@!$VE^A>3|9L1g z`3!nR>ix6~WQvj0F8MOoIE0OCSes+u=U_>?@ z0=1ZyT}8M_tq(EExB1S-&fD{=$l+p9NEZI!YbWk|b34()`75Tx54$Mho{qzQSM)#A zL-?107FT#a*jAJ3Nd>Iu`dx+NPxeEveBOtp%@Mmcu~x#fx834mME?^5APGTO4tg+s><{A$%HGcyjNl0(|bgrT~1e z)z#9->LRzRp{o7mJ@hZ6$2#6;h)>oxrNB+PjG^|f8UL#4|LpxyBCf7TuYq`Fi z21VyNw_t+_*BbPR^b*3;Cl(v?t;#^ev|>RSu)b3zI5>U3k!v={WILKfdYOgj>xj^5 z*fkDh6Z-x_`zzqc_*^JrAt2UKMpWZ;N9e%(^G^_0ZfN`MI(iU>RVqRLsBWcaO2%+V z)GTa1Z=HxGR=H0+T2;>tSR zN#l0$hkta0m=LC>oNlA9Q@d&u*y$*95^=mFPD)Ykm8;>o{Z{`!ogEp zd>I*`g?c{A##ek#b>QdF{#FqQ`nzOBc_6MZ850Xl!;*VnK>8BeChzBWIiubZlCaYD zL_2g9M1TV~j5W(&a^u{N86dh^j&gvzT7aOagPqwiW?h|Anh%G9y z9fg<5ng*2N% z&YR2+3iLV0$Cw`F9DO@ty*Oj^p5tf-M4kzJVH4e5ToiZi^i7+)7Z9CgeDv0kL(H9I{mCG2 zB^CGVZJpKkFKbJ0?^M1abZJL4!_yj zzOwKEkI)*?#)0Oe(PQ^)!nN*D!0!w2D5z=Cy*~! zdbo6EoV?K3h2_DwR~f@sBNVbI-mUnWHobLdMh*8 zD&Kjo*EEi*{TwOd8J7+bKS+7DLyC)2UzP9R3Lv6#t13%?3K zDJ5*;ccS~-Yw@^rOW9agqNh#~V0E`eiDaGFnRA0*e=1(RG)@v-8rYP~qqb9dOvv$G zvpVqLFr3r7v&QH3{O5lUiOeOd>u{^wxih^ zAXI^&Y)lOe3u<^MK{S4hE}&#@T?jMLjxa?s)eY6$Hf~_`xSZJOj6J&OIGv7Fqhyg2 zJbWFphgiZ6_}SdHMLRAt$~mQt2Z5b>N&x%A<+LjR6z=oBJMyfylhp=#r~7KnHi&L~ z4S249kgIr#t?`}4PJlX(10E90GTt*Pj>HiFOgBBGcRDr7pjV2(np-3MxqT)G?%16v zQy~g6^(}H5dwMO!k7jX{eDl;=s+IBWnWj5caelR>G==(Q4XP;3IVq%jfn@A%_=Y+k zw#GS<(mTMXEq@1Vjh?Eh9GD_c!J++-kd6i_bM7o zO+^_l#@Q1-KWuKyI3j;O(i}_MlEkM1Lh4|7f!0rS{KS@A%_02VfvQ|HkrK&t6HM$r z#>KsbRc&=Ytt2Tl!^98VN%U?nnS|Lcn%G`RYp6(6Sn;9{9p(`TACV^LXbtUUz(q_O zdvR6_#EgvZRtx(HS_>ygP!CP93~z$2eOgX7L>Lp9%|{ME+Dr?wG$$Y-yow-J zw2tSgY$)O2oAx%DQa&5iSsr`#DB1aqKn$W%yS7<-_00#4WU>ePt)EF*{D4%4fxMQK zC&<}XJnuC$SVSo6^80h{d?g*ZjdD3M1P1P|!mu9{E*YeSFr`OxBQHa9xJ`Y6y_F7wWe_jsgzP<&VE!Ac{iO`>0 zY)wgrBqw#umxHNl1Yu)wj)-xwAZlS~_Ki293G!_{DAfj!8DJ=b-Ru5r6wBfH?BDTnWCGFw&)D$hm#&`bAPRB33GWe$N5p{qx+_1_c?`As(y4p)r9AH(n7Z zKA{9zRm@W_96|e~N0l_@&1qx31z5e%k?%nR%Xra_@_rSSv(ARBA$5<6G41qc^+577 zT2nhtm30UthKyQA-ree4rQe7}&s~gH^7+dTgl_yuUF^wx_2A=!m5LtQrdok>l^d5P z3~;78#GIQOTTx`7bhG790i|FrggCZI@t-o)5mFfOaF4`a|4C6Ll_y_)xGq7@Ka*2| z#0MN!TU=w}^UB*F9|^jpc!$H?IGkMcG;e1!9C-^W-%nHNC;Il*XDz8vg%4NkEGJ%v z8hM2yc<}kz!jzsm-?g+Zs9ezeI@oOKy^7muWDdZ~m2}1Vxh5}~t z8JCf~5qT_*d8ES;> z6g+GcxmuyY@WRE+lw(NU$9%YI=ehlYJE00|PjqDh&uD+wk^|i$D={-*uY(zQy?jdK z0%!lS36gCfJw-mA z$ngm!3@I|wZ>G7h%_& zI&3T{Xrf=qW^@0?Ec_+_Ryg@wVj!V3uP;2=^;Vy`ZYa|XCZ3b@s2dzQXn4HK)5dh; zDvvGkZy&x{g_dMVacbTW{6`@kYclHHO8;=pNk0l@1|QxIS^(S)ML|DZw#7=_{t zfC#;09g~S0vIWoc&D7PiE9eZ;W6u+}dXu>Gj(w3d_BiN+);s;kRD3W{xL|i{zQSdI&i{3OVwTXxV@JX zF!6`CHbwAd{P2USg6$8-u}_RB-^7aVr$wseF-NqG4ZQwV!;s{z+>y(dNu`YhDj-j$ zfTQr)0UXzp#wRBgu0f7;r}4TlNZT+YrF+7+PrkghtJmAXs4!59o^=>sg{Y+huty{q z5K0kS9~B^84e`%r03p{T(nT({HOK~A?OBPv>731I-)L%-M8V6z#6ef>}AEVWc#!48`lec zH!ZlXvw*3Ww0G-hwBlNFe7Y9hzXwEQk5ym?X2buMCN@iqe|CJlMjpek8u}YW^Cz3dN)MYH=6goDPJy zv&p!9s*|%Pswc!v@hdu-lzS~Jcn%+T75;|wtqdrOA(6HTF+7i-w{FQldu zL03&Dg8q&jyR4Vbb#T0XL0Xr$)~ZvhWRUFE>Nz{h)cj!E3~WhOh3-vlAACP)m%gVV z>J}YAmqhOf&v3NUaPQuE;i~0E0iYJpW4B`Bk6?w|_IW%6(a<6iv$5ijLR0cQ=>xz5 zw=6xKI}^$7X{PtfyTgK;4sG9R1x+U;?;8w*w=;MMSXEw5{)CEFP4l{{bw(Wk;WVs+ z-xT0NCHTj!3Gf=vU2eYorZ=n2f3+HipF)|1otV=8!QP{-2mRZXr6l>=+po9R)tc{{ zm%njF-M)8dT)CAUhym|!8ADlw!RA#%BH4m35QR+I+_8(K{G~`RGZvO7J#%W6dUfI& zWoj|W;whB3JJ`~!Pg>XbtC9KJOX4iws>q^3PZ^ezPVQdbdMbACYTL6pQWV%U0O|BP z^aL2abv>IQxgvNfFyzoS1~Fe_jaG^Luy|?}VV6*nm&~MR9Rk%o2c%U3n2VJVKGL>u zX$qyW*$IfUxWRA4U{aQ2+QHI?<;)1? zS2-^0EMX7Jd)E`BO7-M8a<|bLo8IEFU!xAIEYbd$(%w{lw=ytV7Bdt_ZK|D#EF5EDBTs zlaHFo%Jv6vW6G5yn6n)jjI%v1?FsixE-8jmPP-%2Ti$+QCmVG+GtzOF!FF6r4C(@y80AIf`>g5wf)2RsW2!KmO1_wE3>>sx8?4WM6ObT6ylvJrjd1oCONBa zfPI5h=SR~ABo8>2A&wQL$Vb2L6P(IFg-XQS^kZfC>t>HCl;AFpExa!W!u_er7Vo4) z;nd|hP+h=K_r^}IJ{fKLf!u+@r1LPOgbKGy+E#pkxeG>UPp>W-zpiqo_;rovvu7v*|Cp`pkASxhGlm?6P4#LpQOKr8&x>uWZjx4Up! zQ9jb<+DXgMim3(TiILy&!0|Fc2gjtD)ILr zg+RlY#|<_pQf^p$X1fMnHo(vZ{<@_r30}mKsaPU8ud^V6yXWO!g7=CAah3@E)xn%I zs0NIWfl!Q*EQolAT1|JU_!=XD^;Oiw2bA@y>EX(H5c~>C|K5PI10R*0uZ7`h)_7#w z5T1UY9(Yj$w)g}DFvrL7c|PkseX)HUnrM2KylnThwOY-%>;PN;Wna&0(ZnrQO)ajB z>jB60*MMY0bVgQ^4(}4lWG6?|hUB`AszTr(vhz2QCM7VDJtYx?rq`{2o6Hu!X6rh7n+?b@xqtG21buj#?J^v^ z@>I`68htJNng{fYSRrPaZ;1-kgta`o>tHaw7awa^c^sRL8!(*?IFr>ho~6{PgX|@$qG?(&`1zWP6wq*Q9Euz_7fmUi01yL2sE*$6AJ^4{6l4`#-i)9*8RxD zZ@koicRAQIC$kE<8T z?~LuBj$#2-Y9*4ZLy15y^4Q82IX`VpP_g|ypP*vlshZ`3izV7lBM67|7{^;+E^NJ_ z$M3#BS1m8w>CzJ`1&}cH2wCZ@mzQ?6)o#-Qb4KnSS}b=~(TCwTB%DtgnT>uo@CLb~ zAJ+urmY@swZ3i!S*7uGPOEHWaUm1|RU$PBed1RB>GE=(bHd^Nqi@*;cZuu(sYm#|N znQ3987B2J;tLGnMck*Q&Y1Y>?1pikRS0Byv8pnSV;mAv+IySM0y4_jRE5*#hdch=z zD@5I1v`bS`#5R#q9qGyuR;}WS;w|KdsfJ?dM-qC5byxh-)6|lBlpjB{RQKDes#mS&T+nWQktriVz4?w6YN4Zrgi} zIcB5VXg%o}zn^y#z8>g=dnHdco5j6@-!1Ky4Mi@lI`Nm)rYOSD$T(L)ufCI{l{#sj z$=ZC_KOs4dCf^HbXzFu3><@8pi?z>cn+?dvI@4~kqHEylqd9Vls`BNq;S<)G?lB?oq6;Q?nq z55wvtX_zOIYKk)IgJ(7vB-7Pbv_>3qt=w8Xc=la+cc$L)w{N?kfQNNEv+`iJ*aqs^ zLo=z@(4ZEVi6Aj!Ml)6*GU&0_e6WK!;~(+a{&Vlj7m7E+{7I@H*6V)cZ#+s@fT5c4 zMC~Lc2Wb9VG4w)X%t;yh@BqEGUnW8Px<4-kYX(^cD%Y2!Y51^p_Lp!Ko21*6x-Xlr zNslZ70jeP7dN^s~`Bwba6hgB~P;L+--FQJEm~jVcjRR4?Av9 zF%j*Bcq44TSp&{D78qKep3{a_lNeG8csC4^s0u`1I`ERaGYc(gyW39|IE&)G)Zff1 z`;)m-FKd5q>jkcGU28Xt9&Ik%U|uiaz6taTwp3q-!{^JRe2mxSXi1oh5>Tm-ZI0{- z*LEuTB49Tc+d(i*ogi*MS#i&VP09sw8Tya8HPhNj&Qj=-RIpK)R|G<5pHmGYu7~tj zp0?;9yI$mg5SktF7xk=oVZ45Q39;+ABWw8qT?>NW4qUu3Ghb!|`i_>Fe&a+i5Xb~r zK8$&--vNe{NC4hpj;5MVWTcI*A4Ecat}si%j~p$kM0$7@D4a6qQunP=ZrYB{k5|%S z3gx;f^v^GH<3=%7(PV*P;=zbr)fM*85%)a;!Y5uMS%ygi z`&W)+R>Hm;b1JdCKX%vN1z(ez0c8za^U1gd@pBqveZm(O=EYiNw0%bo(H>_*g4UDt zj1wav5WjL1K9S!GDa~9~aRw$C9x^5?@0HeA;*yGD7GmY%=GLK@8BHyfjnAB}DjT5E zLyax61E&%njGablTNjLDwtb#eBakp*c4bBO8aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T diff --git a/public/images/events/valentines2025event-zh-CN.png b/public/images/events/valentines2025event-zh-CN.png index 0ec3bfe704ba2a2e3882ae80fbcbaa71d14b1069..13256da720cfbb0e57ed3c3fb3d60eaa075126c8 100644 GIT binary patch literal 24584 zcmcG#2UJtr_Ak6c6%Y|oP>_zG(tDF8T|g8;dM6YqL0agE9YKnqR1pLO>Ae%MAc*wd ziy$2mYA7Me+j!3Pocn+GzI(s%zLzlw$=-9XwdP#2{N|i1&u`t-q@`x21^|FoTT9IV z0LZ|PK*b3X@coHvTNe0_%2UhK8vtk+j{hJ)@|*ME2ds;siI0h%uADv0UC7n}W(O7W zclSJg7PzM5?`doA3iaWzgF3l*C~#rwo47b!92B^WCG|w~JXN92E?R+J&^v)Q4ebM6 z?PVRfloUCx`OAR=xI=wxIsDz-JiO)n6}WzlD+hi)zAVhe@r%UARe?+8ctQ>ny;~fr zFfS;Fq>z-Ly{Lp3hqSDasFaATn1ld_n24yfu!yv& z_P^;oeZAa%P3~YX40VILLp^-FL0Zw@w4Tl|ADFi@?B5Li`}RLg0E$*m@An-4axL!e zzo+o_QTGGc_){SNlG@uaz!NHL0QH9Xdf7wO{lH~%|AQNE9|P!L^87Cz2g!dw?BnA2 zZ=OBA^G{4c{ayYI>G7T4q@HrBUQk;fn3o|8=JpTWx%Ceza;U0uTsC&`aDc(RuN-sm zCplEj)(5Ja;e~{|I99$d&{+U!%-0+w}Oio1d zpGZL+cChua{g1>B_HvFeFLzsT2VC53ouI;=9!^{wzxP#673K!>0w)GnC;n>{dU|r& z9^O8-9`;aeH3cq^1tAv~2RUhbQ87nbaj2k#ti6Pwl!Sz=pp2}PsGz-wjH8`{q=>zw z81x^{tHJDjk5%pX`9G}A0cH=5@z<=fQnpYjQ9C<9M?3IMLPWwr&`ttsCuk??=pZdF zA|oYg@A!|=^u1g_!?$(&`>4mOasWpZm$sFXbdZq}l(Chy6|{GdkQB6)g@SKTX$M(J zdoc$`aZt9$do2eJ11`z-*t!(BME|^Ka;$T1zJFYl783zq!lK9Tf8IC!5BLANZRFts zidc+`<5*k%km?=Kae-o$l9Uve{PX%P7k{XmiJA*29q&IDA|fX7_j{&)zb7Md>>B=( znjzHRN7pt0>gD~X&$({v^yeoxm%r`lFPfXS?%?F}u`ib1M$X5C@!Gn3$}cD6%|Cf= zbZb5}eg4V&#jw(avhw+u91hOEYs9aokEibH z|DEo5WZ`3H_y?=P|3(#$4)p$C%lhSn>r zCoU`K2$lR5Fr@_TprTTsF*`_!KpiBY;NL$4{I3Kg4!Shaf4H>&?*jUB>+GFvJ)EE* z8W8@!U_}HfChI6BBPu8%DI+c@DlQ=|Xe$OfI7b;3_}2zwplgPg$}5 zkGuaLHvCv8ek;ho7nuXp%jIwT|92hxy#$V5+V=m?eE(6~{=4w=hwT4Z+x{PJ(J#mJ zhno@ppC0Is?`nU@QRCPye*qb}f8}fbTm1u(jT{(B|3hpQagel=6c>Sl!PHhj!bhTGCv*F>FrCZc2L^58o4%9*@Za*lw;!zO(QAE5+X=*vS zdUYpPad6y6Unxx~J?C)1Jm;p7?_R*v{8?SuGWm=PQd@z5CfqqTAJGAK zkrj_`?OG#C-=(rVQ_|q{g%^mns+L@+ua#l8?m)3B4{v3H*Gsqff!32K!C%)KR-J1_ zO&9w0+K<%knY33*D^jO#KW7EW=Hv7sXD1Y-ev#GsDlzfeM4Y~Ug7fj|*vzx5O0h}x zWUB2+rEfYeiY8iIjC2_IWaD*T!hg8e%f755Cner}gW(EmJTYikt~GwIbM)2E(lUgE zn2T)4p11<=_}553>3!Ldo8C^O&IX$=G3$OzyOf^OF)5IfEciIGQ_A4z*K9Xgfg4!V z^7vF4&HZ9UW z;-HF?6>g8xw32N)L+?fN&zT9Oc#$K;D(7DtPfnVb989gUaEwzR zaLnQL6K&k#P_~}Nwe!Gbd5Vw2#R6MX@wE{&js!75rXk*0^{vd&h>iL3ASInKmOErswwAagSuHYqjkrvPfD|+5L}q& zWJ@;+ftae-v}ivgUEr&hB9~|mib-g=H7WkUr(aCz<%FQ?I%4Z*8$faL{0oz0RPIv5 zlyE3;2S;}oFIo3~N971$PQj+}&%NnNjTx~&Ozy+|+tl8!psvgx%Jhq+d6@Z?cIanW z^%tvNTc2*u-W=Zv8Z8nX9}!s6MaswmK$-6wmVUf09q?;wI0Mu^z2dI_V%0j({KB?x zQ~Zf>DJ@r zDA2tG=SP-`%R`()t|uVlt7J1GLH#F3g;LK%)K-%&nS~lE>!ipzb2Di^g0l)r^R@@q zxr}NkBDlz1iMFqCGg8u(%MbkdY56p;(cZlOb6O&2six3&V#)DTIxmJtl9U?`>`Xw@ z;;DmYJ~B8TZ*h@!%C}-7QQ(*(mLs(@4<$pzXO(0alrt-dGuU#+PU;eS?&=oV$@qS_ zQa`EkFOAk>yKPMVjc4szONVup3TRquXQZ=5x0~I6&N|nqopkM>=9Kzp`~CTaFV+xp zuRog>X<6?VFmAbWP!j}ng!u9zJ4w@n&NZAuMy_30bSrr?hD%}tez}J0TPN}Xn}zhacSt_ktuMR2@%hO% zD&%Waz}WR-HnX%bt4!IudS$OOo1``V0GZ2`k)6=U(H6()wMPRqT%#0!c`|bDDgUYJD+ia` z*t=`Rb8pgv@;J~ep-eB;D0O-SWz~imh`Km_j+b0!i7ZJ1c$VKw`TV!g8JUKZ(@S0ZSW7AOWAr@s{A;n!oU+()pQ_r$>Pc= z13~te5nkNn1-u0qkS&&NjkbcWok4_{!(9(0^E#@JiTaBH=2iM3LOO?T9syYgum^77&50@HGv;yvLkbKJ1Qw#;H3^e=~7zy@%R(9Pr@sQxnaSdnbX^x5|j z3?&R}lqd4#?>&_K=2kV~dgwdF_7= zxfV{;zQx~MchI_|kj{q7{&nh}MyT0M=sAvrY5Y_U%W)8UMiy)w28W!J3lr8EtdzU9k$>wi1IT|U~F%h#Ac(xCCvYv zuAmf)hN{=OX1a9Wz(RCH5%D`e3{ta{@nFi8vtUK(=T2Jlgdzsj#5G3B9isEr?fl|I zWyi&T*h^T??+|$V1FGR$njq!gV+F3`op&}FsX#voYP4ua$3d=LJE8=NYUcCEPTj+y zJ>a(yz#eVwg^wk@rROGEoNDnijmnk zuw4uFEmpqyl)-YsdLfLT%?NvCR#U4=ZpF%KxP*I3Rd8}k`fod=&T7Nexdi4(4eS{u zo>jQmsF z#)ws&<0wS;TF^a>dTo#}=0xl{Ff<3EhO+U`@aXs&+d}R!pH_=fw<3c4>S0pY!1l{< z<@KPNqDp~phd}aEW?FGHu??RBX_(qw3|qoKVr!)Q*d=cjc7QIN3te5$4x!XcQc||eqDOwaIQt^VBSwi`?#GRB+iZlnQvlPc ztn}eysd@BKbpHIB#fWlqZ*l(+=iB)jsg4`2*@tvsJQ!|MN(wPMNSP1i|G3dWm|3OZ zu6wJ0HhvITP!gXG5@aKN7i<<{nW{%KrK6qpCF<#$ITj+;dMdu1@us@k9Mjv$O$gTw zB2|Aet-tYpF{+(@oiauj`M?s#d3&9x#CUBPHC1X)nXyfM%5Z49)K)XoG=Q&FaVhwb zMMK&h*T1}Ym>eB)h#)DYge;P}@yi@%wPM+TPaTk+kt0CJbw6>ll{tkX$vs|gy~%@o z+PnowL@WxZT_yRtL1l6ToY@oRC$%^j5>Rs;`Lqhu?3m6eGJ9oL?>3zN*sRk^Vq&x@ znt=!Eqls)t@xYMoaZsim@F(wcs#P7J$mUr> z&~=p4P&=&r@p22p5vf;tAZ`eic-0la-t-Y(~J-{-})s2Lo~(T zqkv!ANdq)qvC+*mr;!&vDDnIetOkaPQWs)i`xF1R@mWP?Gu&_B&bPtd=9oOc> zhZiZbR&$5`Hr_XtecZ2;=rYLiBa`^35~1P+e73ts{FK+EQ9apY?d}tceBux*vcbH+gG3v>mKjB)0FOtT|HFVb{ZPqjozYg zJ3QH&fArLn)5M9y!BIkFS5_^p-VoAv60I;m4BT#QT>p#`z83Dx{@I*`iS)xn6XYX? zGIFDGII!uU$gy*Zc53yC4D-jx5&9mhnC+`~%s<~F@}^X~sa3Em;~0OAQAO@*)1NsB z;Q~GO`Am&LW8IBa%Jc_lGpq*dKn!&mww%xsY36lEKy>Fca zhHKb``4{J0R2-`wjI8`>(^yJfaHpIE#kr8>LgG6NY zP%ms?U6lTuHRjT{#_cr7MDU4+U1TM@qkdMly+KKHHe44-7V(0$4y8m^5^?_)2<_6^F9#LCC5bH{XE^9wByAomQiAs^YJR% ztPR+v7~+$Ylb^1GXdT?2#6Tq%6N`r>)gA{thCzCdh@WXVl4g7pLcUaKYdeSL$;F#E zG54>lghe+?gfgA!XJQ#D%k^7bLKH64ZG6J50yI7DVdUxP3Mw zbA30F%=nNgRk6}J#eh|-NAjUW?S9sXfcS6J|M?2pWf`&MW!bi(51Pk;WFR)`!>o@v z!4AC+!QAM0IP`pxF6qriY2T-xm?;tw3T1~^%zke=>j)X>2z}*Q!s-C}!=V!3d7N5K z_-$h#0)%~5HU8O8it(TqhAj0iKdw^9(lIDqKeH;n9z2P2g=$w6q)5#3HD8`b8&sLmaw4pL*PUN%Y+4 ze7*d*Km>NW^5_FnisdyTU1-e8Xg8^{qVcUR6nBVPz_5jBy=bI0755+OdjL?dAH>6~ z+xUAr>KX|qzOJXOke93yPbwFT5og(BzTq#7 z-{rU~(NL?-O@Q>1awL&foxrX25;_MTeu>3*b9n#Gok1vfk9ZvHzMQ$M?ngv-v9$}0 zHJzT&kO<9f<2EAhV(a9T`d7RuK#;OMHjE$7p+O$#PzJg?L|8$T@6rsteI{l96!>t> z-K@h(a!qDhYQ=oO^=P*e+04RWPFAkb4_Fc?a1ZTVcw5Mlea zlouIA=yojop{-qb9HIMcco<61Ww1wN%}(yE$H@>^b0TmH$G6PO`eQD+;gA4LHALF+p?JLW5R%}Oe5#}?Dmsf{p$hsy0lGs5A66`w2VAd9Oo#JFM+g5JFuI2mgW24CK1|7#|@l40yupsAq=@FTEKF zB#Fdaa5(il0e(e^98&^0i8ar{)XRs&$Mq60BLqgIc{>G{+)%LD_5(oCyqcq$Vg=lkB^m(I4IAS%ei}lFG&9dtROt(isu4|% zdC_ej0}wjt-MnR|K&bM*@zzN4=JI)`=Y-)KO&lQ%m4s4r%w|>e(jxIPE}C4QWT`ik z5;+%@Pt-~~=(;oIT8Lf^B-VB5)9nvK&VwEqxD#on%zP&#jo5#CYE_Cjtp(H*rWqQg z9uc?vk$RC>(vepLrnJDJYIU)T$FaRyfhp}1RRjk3t@r%l(5JnB)r2>nq@VWT#{p5}p-o?wqoOdfjSu?F`5s&r`_a15Nn}uVAubBo`VJ7KY z1-GqIrhs0;aaDFt zY4kR3{?4WKLZ^sr0iU0LuI)s-^Wv=dsa0 zexdCNRuIc{tDoq7OiNikPg*m88y>;xtySk1b_9>SAcq_HHrkH2UQ89B~8 zDXw|C#MX97yurqtw7EkW2l|FAXfI*d{b&NWw}=XAt`snZjOnCTA|@B%>>(FE%GwKK ztJ>?Du5X0`xAE>|nnWkBH`0Rs-Q`y@ImbW-eZxbSdjXBL;^8f0w}X?tr8vET!QTHQYAUdvPl{lmza zsc`wWU`?C zkaI)prd0~vYVo&V?fnw+PWekz`Q3hN%;9$8I)V=IBGhi_9KiEk$^R0W zC41YD(>i3y+lNmr6hfHFz2?QQn1XI-hc9oizCwlR?z!t`d)He51;T zjrILb0V>65B>P}^2kPS4&-L_W41n`po?2BpYBef8-=zm!Vi z7p!bZQ==}*dW9ruH(1w=pLAfJbRg%Njm>bVs9;U>i&|!7%R$7x0+4Y?lY!@pw!%x- z2*vP%&f)^zgB)}gROG5H_OV+$WXC15tmqF^NVOBS9a1N>rP~Z4H%^+*vyT@Kb{JAp z>$H%JT7J_NeP6=VrQv6F>-ubLBL=-=8b5-MJQa#8Su$~2r#$^RkaQ=IBQLpzS9eoC#=qyR3)yGE*U*rMC};^&^tvNRU<7oz*raF z6(|W5?zyVrFj&}JgP>6F5p%+!lF&#|y5gSAcR&qo68S<`?ybsS>2C80NCx|HskDu) zLynF2SA3jrJ^~!^>A3u-Sc&*lCAAS2x+`=iMLONCPq&$cw$^~@O+a?F`c;zUFhn7KRWM_fCIh`H$or|6 zxaHyL%dKLq5~9BFX3yKYy?r|L%FN^@5f=ql+YILcnQUAIQE1t#r?d=kSvk^C)!zO1 zJ6h*iT@B5~$^y0-lVpXC!~Z}bsm&K?)hAydjApd3GG-vR_pa=S{uLu!YUeRfQ z(^Xz${Fn-#qMAAIzDepiT8|+$sq?vl#GwzH0ILu-f1Vm}FVfWX-n) z)_LlCqfZr?Ztr#OzF2J9%-b8Q8r$5w1Jl@Z^}U03ZE^bBotI`2A`kCDv|lxK(s6{1F$eEB9A2Ez z=u!vabrUg~oaJ=y0?3@&T=fCOp}s=2klcwr@munzKK)J7r6oU=3IywDF$!XaV@h7b zU8G+}Ttq=<#GLNEgf>rx|Xm zq>1#44~ulc_J(;oSdpui64GcU@c)#@? zrgHyuk^J60Yj(0;!Y-pYyRv#4I_fBRLH>5;#0MVLJ;g&4 ztXazEx4qdkD%gZqzw!1vrF3)F&?PrlASRtqTo2MUxz}#{>@?h+b!xoBJ`L-~>8UMC ziYvLTARZ=!k^!=*nky|FeR0Hgrz}1_svkQ z$PsD1qRAsQZUS`L;q?0SQL3=W?=+7~<3voyxh2YDaK_BY^u#Jg3Vkm`)pY24_1%fI z(5qF@NsU+jx1T&3o|eS9HZaw1pXc@MU?- zp61QSbuP4-CH-Zx(rt4JE2O{gV~Z0*gifhLGeaAhi6g*l7qh$Irskwpqx9(0SkuRg zKrCFsa9@v`23PvBasKRQvzwrrUup6T@Zvl6#%2W!02o6%)Zf1Kb~3BeU}mz_`TUHw zYbX&X)mTHMkmVj%=|{b}z9q$SpM=6?qUQ3BBhKc1k0nmO5L$@XTbDlJ_ti2}fixo_ zLau0Vc1F>a)si0#hOz!b-SkxF| zGuMfp_fYA)_az%R`p-1xu&TawCuOV&8&0P52=o{r>&M~p^!2SUGF9Z6e!Al?eYcL& zA6C!{FU{Mj_-ukp%&m`jvQ1&}>a${EDAHzqI{VPoXS&0Fw99w^-b+wVVd@MWxt}BV zHWhp3&B$sHaMvjK;=DujdDxY)XCke42qjwh zw9K*LY0Fru83PnwfLgEqix0ZU?Psm-uzrFi*r_640AfzQjEdbrud`TBARfKBotLo^ zCwo`Qgd1G8S8@--KYHD_ndMZEm#?%gv_d!2$SDn0ED!mpOiI8EXxyuO>(EF`y{&P* z%KVH>xW>T!!ibcS;8Pj+oMO5_i8J72QSb3=hnEY-*=W);!^f&Q@8S6nZ`n7BI5zPn zOR&sJcMugcFM67H(?BK~4}H~UadDfZS#&67q>TnK+O41FY1lZp)A7--^jfo z*F>E^*t5s>68HofNtN3gr9;Ne{nAd({P+QuGQJ8LA51}i1FFY^q$S|d0<~e{%K&#= znLUsWHp#79S)tnd1)uLq= z&I8@uc<xtJNgFnVdYCcvrVjK&8Sjcf{VjRa*3BVyK|qmHxnai0mO)GUgf! z61lyrcLbmlU3s04<04lt@wf=}@~U!MX1AdxF#?PE-15B`xG26O1&m0Z#p;3yL+9LB z1!DWc+4UxOQ{hrdo9So$4RCc_waQ=3h~~7A(rCb!7kV7STml_ zR{UtGCyHxu_@O|(_u$|#x0z&`;+!ZD$NK_XMaDl%J4l(j9dpWJi=8ZYT>RafX;{?$ zFf}TPDt%g#p7@l_DHrR#Dud8%P>e5N@vQ&4P*=!u+LavmR6xuG;e5@{63u@jZd2~M-lpy}x^8(4cug~i409FY zH&rWU352{o2#{%CHN3h&ohs+6lJS~wXZ+buux#ABxo1$`By@=Qv2x1~1ZpZcX*FDR zp$Ny24*{uzPpdl_u3TYN)H{WAh-o0{r$aKWjE7-`)e85`Dbj_|)|q&~>8(E(mm;k! z6DuA=IN1eu&5vY(P@j1arWRZOtu4I>>5&Dlm#`yO0S7_Vrxp`=Mmm`8R(86aPcN8# zp(ETYsy=HYwms<(fKkAt#(g};R&N&_q7e`v{TSnSBgR|5VDZ-CTa!fwc{nC;6uT8z z3CA=BY+FUu7SnnsJbqcO^IBy&;139K2_^_&GMq`exDNVXElRWIFk%S>`{_bQ6~nps zN9M67xx>>hToNG5-~BW_xm@zbWF2vP;u5v>S$JWlW)-Plq;+-gE`m9at_mJ!eZgk3 z$_U`K6X24>RicFmkWbm0_0GhHRgV3H`K9Y6SeOQ}-O{Oj{xm9hJ3cZBMH^v7`w?t- z$t4_mpDDUPUq40U*6#w#K6Dz!g!>4JO7@Qyl*-&q+rABS#v~qY79!3zm?&uDZB8Bx4n-0Sk^m}K~8=Hq|j!FE}e=xsMJdVYIhy}&NU#CajxzV#Fo%Ib#k z7{^|j+3A00lpn7U=tG*0xR-@vdd)5NY_t*I-y9mj_w-FrYZNO|9J@YgTq^nF?g`b zJ?%T^&%6MpUh>*ex%k)5pMY48TnXb9HY0U?0vGp_(RTR9eIoj18r1g3xDLJLbL$Gv z=e5Irv?dpX>+Ea}O!)?-3p6gDi=BlVFkM zb}0eKFe27t5SJIM`ZSIJFAY2nOCo~LWwK?@FX>L-hqQF9J=QvkqCGY&P@p`nPnx0-HM*VVLe*XLupS7tAbPfiE zue=dk&!2TG;yOTPB60Igq=_>3gFj41l)$H0Htsha!MB~>!_nyaniJ0r*buSQ6~oCycfm^(X_bSe3!R!j{mDI8;@cN>um_f}9w&B+klVFrrrc*|5j=3VtQGtap`+$Hw z7G6ub^pcX2tgKwjB&VuSqfN|o&|uj-{nqufpQITZBwe|G;ZUz)_? z0n>Eww)^O8WR}#d0>;aJf9#v-{!Kyjv61s2N^SxjyGXs2As*NGm76b>r937|9QB^S z<_NIW(31F95-x*zk(kN5g=Q4ZrQgikp|z+ zQXdiDQ14t?T^h89c}Cl$O(8o^$)3E69fu{nl6YNiUU|>RXiz0#5~Z_oxLORkEa<-M z-Ly7Qt24zcet55Sd&|zzfaTg;W`zXyWKK=Z$ox|N-J$_w_vSEuz|fferX?l*+mD;_ z_?>1Cx?1YK?o|1vc%>%{b!^4sui~o)qz`gYp*{6`7ruVIB-P%TED0MbIDk*H#!iAW zn;Y~s*Q15Bily8qc-KZs&qyak|=aQvL zLQm>Yp?O;0wgX^ZF?kXw|j!ex0)!f}9I8~p1yO8QrCi%9n zp3IB-$rJTPimzY4ZpAmxQ!bX=*xKxS&;Qg)>Lk6O?2ot`{CX*pu))0bQKz)sCGI`a z^Pz)F@Tr3!-3JFhSt>-wlP@;KQPIMIF!*z z8Mq=k5=FzhC}Unj7!gM|JFwt!3q2fN(MDz^B4LSWb2oI03dvrrFZE1iO-u3}+ET97 zZ7u_^L(8sm^&k;EFS>%4wo>Yc=mFFifyIWgvr5SA(uC&A0#^q@Vrt{1XCO_V zQ93rRcW&KsGTnN?&>q)yJv=;I=SH%Bj`gh=?C#gNH#BYNKK??fo{%5v z*XqoT?FspGC|QQpMoifSP3`86`n8QE@qjw?;<$DFbPN$MesAD4By*qtR22$;gBvO3=2tZNS+5?nr^uat(%JFIjA!_MZo^{H zDaV$ws1wB&^SxF38isU&J#WgZPy#Fx>yWRL;nnQzi>WZ+mA2L=Ecqpke4>^yKTO?>C)-qar)DA z7p1fqW~x}Gikr&{{y`&rwA|l)L{8|sHdoOY5>(G_w?6j09-VAvXn0n9z@Jz>4eT$? z(Y~vj1ReC0Sr!m4XkF`e@Eue->qvIWbeHl4M~k>ymX?AH&)>J-EigG?158tIfbkZ? za7*5AO~knez?^<3m*nMRtZ)i!%GTA5NjErY+_2~ z^{L5A@R?Cm_u1l?CPFTK6)KgmizakZ z<=}nQ*3Yo5?~gorzVKv|NEJYB_t29-)U_=wHO(KSSWIoJ_w!lXuMMLlqP8A9o| zzPK*GothJj{VL283NW;>_2P+}vQCiWM%`m;I+L;XMmtUJye6>bb=Pg_wT>s1$5#C5Zj&7 zkH+`QuIZRpxDBIaa;GtP)4nXl*$-f5LHG)$y!O+fICog?6(&2h7YK%e8IWaVr@S~^ zFz&G7B1kB3X@gtXCSeNI9g~)0DhY{UfgNlaf%t_QnVftN043k(2%fg74%(|m1kZ2+ z-f4&`{j~BkR@S;toyR7{o0G}%jP4fE$wCsDwzXf2wkuUG+dfJKOkC(^Bp@fEP6Y>crCwP9&jX#lZlEg1h5KSQ zlmyIDitv*_&!n)Y+ft>#JaOxAE(2R_`s1Gk9fi!oOOLRmiQ|%HDe#>Bmxc6TQr|ZC1=x{Yoj_s_ zEnQ$m(ie5tBUNTyK23_=kU31JMTdSkc))zV@LaUNSNF#`8EJ|ll9+UdMO5wFS_wPR!4oK%UsAvSCQC0J6`B-fM z*@CdJPIOxh#A&!12GdTAmohSXmi76?MZ19|Ya!FJ3D@9_kMKdsXP}q<-j?l0#b+MA z5-(^D?VN-)(te*mFS<1bZNH0M9oO`Dn_t8hba2jC?~RNK;njVHq=u3bt)g$=ZqEV! z^*nFV3X5TS4PU7n)&iFMw!IzOzno!6*nzuvckkfR0`En+y>#j~SMD5s&x6rOaJn8dq#$xwKT=4Yl~&?R7pz`-pQNCkgXkcPexZWsShfhqqZaWFj^wvxYhu(kJ7 z|Mn{daCXP&WPW*vEF%euW@*gceQS#S95i-o4DGDsu!`n zhMaGYM}aBGUQQMVv3=9GGSHXzeKCs_3(%QTEpo0$%6?EVJ|`bo$GTbT0VSHd-+UcC@>1 zZML!#F~r8`Z^+_6i~=fec;iO`$)uFWh_fRFj*X1CoKWR9)$l~I0#11tKF+(X#pQ)j zuRDv&we{DZQ@y+S>c*5%D6og|aG66>YE6|bQ^wROGv~s*M|;vBH5;0$FS`Pd#^`Q^ z8sO!Mlhz)Y#GeB!hS+1|)MNGNUwpu!O(EHA(~fsp)P_l7bwTxgKNfuip7&P$B8W8>w6@eAjO0iJ_z__6aR&}y2XBjquIYIHLBjzn?VdZ+E zd3B$XN}aEKuU}YKD_kxI(eze9KVE76$zINp112~)r^a#;%pndQUEzJbI)oW#;j?(B z8SPQHrc`M^Qg8%j=bqzL`tt=)Wo(Olcu$^DJDWlsWTed3yffo#P$s46(`smb{JcV) z>B%he>G%5Q>h8w!%51ehJ&Bt#seUh=2iB8@nYhsJuV8u$K}zssi`GH1DY!1h_ls>n zmD}jmy}XI3tvc_;o2_v4M6Ea9f%o291u6NyQZQ<<%9|-AhotH|DwfD^IefjiX!ElM z)Jf(%=QE%Nwy3?J0xF3DPGHIBOia)2<2XRVrLVv!zsjo0y5F%A%qww!BrKaX_2?IVyA2qXU-=#x} zOpL3FN!+%uD0qg-%6i@?`m@hJ^J@EaV7-N?8ySgk zXY=zp5R}?4m!0b~z+M$7plM7{x-_FWgLUr9G6iGHo|DTmePyL!mm*F;+l2j(90~WB zYPfw}kRNyIg4oZe+QY)8Wk+T0#bme4#thP4aZJWU;k_mjQ#|TE)sv#!Y*fbl-6l$g zh6WRtRAD0}0VWQYJI?Jqe5n)DnSX7V`j^J@aYh9Fh=0iFJr$D%(gh|+c)lNc6G@|T>N@;o1aXRa6Xb| zw*+S}Xn*Qub%cX&Ym-E!FH`SgLJX^`>->s2EIK2DE473_4uXk#{l-RE+{Eoh5bR<{ z>>ai~(b~}lc@f8y$J$#%v=IY0NWO$0S60tRLejBm3=P<^>AS^NH0fDcR|J~+K-@lW z*|{R=ia}K?DwTmX6#d5g*E>`@0tjEFr-SS34oeL44%T5X#pNtE*Wn^uH}Qy->(lCD z8e(cb;j4Cd(^{F1P=gHzaTh7Zq!Gy{h;kY4t(^ z*f&o|fNvY9Pv+)ox9f8Mu#T6*4UJ#^Vs*>J#L$H3iYt3Z^t(xH6f|e!MBIF{(H;U0 zb;geyUe+WKov@1=bERPm*m(~AaEx+-r-_JJ)~xXFsXx3gUOs-{P@=y!Lnw* z_PQMA=e10emMhy@!40{YDdUx1h~ZS})`|8fx>%KK6r^3N4Aqe)e$NT|g6P-Fais;T zB;?b+V?i8a4Y>uB!!y;Dy+%it`=0%bz+}CTMzc7F6^XaHZHNWKXuDL`a~Gme4{1!0 z+eD3RXEHU}Rd2AyB%OK14>N^7T-|+bk`=413znC%%+V8-cL;+JJfDw(qKEN#rR#XH zb)c-ddbVU@Aae~a&upz%qs7> z`sqHc&Re_de1mgkF9mh8~|H0YXiBNdrkoXaD35vUyx~2>@wS% zxDvup9sy*G8uJz=6z}jTJ@WKjtRA-OmpmwxcgLE*&d2R8-gi zW>i5Lcg{=0M!kkD@5D(ff+_se>Z$eB&`b;ePfgghfIcvls#yD}IYwE%JRlo7CWEVmEKhj1&{~+?7Qv1<>MJwu=b$EO*;UMAEy8KCI3E*SdJb!|q z^|Du3jsJb-swesJLYAEFXWEy1f9y&Vs_fodXJBKpo?Oz2FSghX1rz!GSIJVYLcNk+ z+ehc|n{!|> zgQpe>W`tMt-@KkfgW^eAsaXD4pIIjI zc*S%C1;!5P# zOTHm7*8Yk@VEy=A;Q6W$T?YrhV8S43ZwTSZ1ft|>sQm=bj8fB40ytPu(7~3BB+)C_ zNjsXbsKi&N3w-}B_st~oq9huFu>Q%)1%F9U+V1d%>|FJ| zrcIv&UGLrVVM(GO(`8xt5c%DQ&V%LP^~Ku5&Fd2(#-9>wV?SR!oXNT3;i&VuTi!)? zZM1|6?CcrrPU3%^)qT$w7eD#(LtyW+Z)a#^?gSO)7-uI^hGM3|r#< z#AdrlTpU7HI592}no=hm*zmu)IQMv_+y9S$hAc@$EIEb{i71sEmYb+Zs3u}0p$$>a zHlhPLMsZ6;a;nB848ss1q6rf*x5(KX#%#0g_i^|8-re8t-}^lFxK8iudSCDB^?Zrp zIM7#`TiRJbr8~&`VptK>q2<9I*47p;G=XVd=Q}=aDe9w*;b92I6G`iH0UQGX}F)Akh zPLIL#+_&9mcX#-Y7Cxr>e(xI{hb*f)JBn-(A8)e-7PF{UOOk1QZR)4p&iox!+k~AX zA>oL~@uDKhf~=!{e+4@2SXy@%JtK*5qfa57jdHp67ZVJZ+kPY)+VT3tS4`C|+uUky z^RK8l0zOYYI#~sl;WCi^PY^-7yI_OXY9sWXX5FoRtWcE}aI zF>nCyke{^DKHjlr+i;0P1z$Wz%D`9Jgf|&yPUJq$8j^Us@~RrtVu;1H!1fuhU{cU` z?!Q?{6KUJS2cp&whwK9QQ!h(8&_m>2BMC-2F1*&s-qy!w=ser`A*C9rl(;z$c})j4 zl}?@UYOoEZ1q6rTdLJyL#g3}N$74&e8vu+r{clbqu+@WQ1s|??uB{nbPp!8;W zJ$faf&ev~5oLap035j&3FQod_GxdEtnk_?seZu`6H~X5cEP@ErLsPmxr5iM<(@k7I z66AbOp7-fEDq}3s!8=}gG$s4FO1&@p)WE*(V?WKw!|7as)n#Cy50g28%A1g8^tOZ;-fnur#VA?vDotJHn(j28I6HUYqFm~3 zhDzTAo-_hcJjMrRg92t-L-^hlTNnAp7i87n&<}7C+MZ*B?pJ%;s&SzkqmMa^zHr|L zW+UnL!=-7AD1%X+!$Mj5Grk>r#jDKi*&8(}3uIMD`ANOdL$A%XowEF8X2w2gxYX?S z2hI2H@)o4V%w{~B%ZjS?Md3A%WTW=Q!>*lHSeAaypYs;*9xp*%8fhnFxZo+5;*jno zbDB%6pY=UGKOtghdEjKN0KT5cM;;_Sd&SHXm;}7c{$?)6r8{d3&;1e>S+dkO^~}w0 zJKi38#R1E!g5ZO$sGI?ib2{yMd+&DU0?`k$3zi|!meTW48E%1lW1zC?g7z^DWH;QQ zfr}5!>SAU?R1=;d`1sZ3R=B;tyN(N*b?)yKkD%;JruotnOWAT$Lq$Zb2bQB!*7GZ~ zrZpB>0x3~YcqtPi&R*yr=w)>}^e=sPjG?TCcCNF>-xZf;oi>60QM}9s@r{=6SdcH$ z>xU+SY~E%Eu>g7690dw9t>%%+Sm1M}8ViMvU89Xbzg&zdhc+0V$l6pEG&KL>H>E#8 zyqqp*Xa`*cwXITiPsp=Zn>p}9X~{=k);uqua^!_XUE!@gZtol8!Y{v-l~TOM$3!egL>2o5 zvKC6%iePV!gngwzi$53skxcOBv4-h#2&c-`JW%|5Y$Om5ywl+Oc7wJR)Vft~yR)Vx z@T2TZlp20u^%!u;}&Wwk`$Cf`Rp*WXHoP~&Mc=mz1 z9!t?JOM)s?C^^Qn`vvTM9dS*e7I8BiCjNeZcy;-es+-1OTjLE5&i)Oc+lcTag;@QWM%VDJXST`*qK|#k= zM+pqo67UaM53ODpek0Jzy}z2SYV6iKh%DQAyWnA*mI9oPJ;@ef$qoxOJX^tnFb7;` zfeHN5M*fQ9<*le4QKznN=wl5FeGi6*QdTCmaI(OGwsfeCs6H-3eGCI_9dzALpu)#Z zl10BPg*jTafOV$xsK&tgYBvk36B8El%kw8NAKhc~KgA1@t}XHT#lJorzlL|`n0HX# zN(@-yL>rj^Gpc0kwHa0}XQ)z`7cwc={ICV)gS{QEOI^!w!aVSL?n2=cpQqA=tFQ6J zetx*}Ae^=qb}Oh;%V4rmt{qwmN`i%do4One1)@O{2;b0O+O$-i*Q>zzHbBNJ4yDISMAW6{enwq%`7&7h{cS*^)wn~!8h(=}HU!$! zqBY=!bH(9*VO;O%LBKI>7Fh`nF-h-{>XSUM}dK6&jc*E}xc zDa#IFp{&8~(IzORuW7ffK@;leVRiaeiO5|XSM&==HE-W+gNmHZ(SHyt<%gfoAjQP9x9Ob|9HPBlkpCsP0Bb$SbRZ%EP-iZ5{&#EsMdb_KjyUdFRN|wb31WQ3` zzquCj4Sq9UQ6|@5R(<9BC+L@V?A)=T!K&al2thcpE2-ZqPbwv8?&zZ%hI_p66om$g(`dTn`9jWHV0Z19a9+&TZ*5?W2s%bS= zF*4J=L5~)OGus}ps4!_FFC(%s{5caJBIAa1VHV0TE%z^dz@Yr_AbGh${f^&i@Euqf5_4#m0Fa@DHta;uI^g6vu$Ni}3o zO8l!w@#!D9bc%otKj<>E-tOnfow#RW-4IY}xBC*flgM6TQ@l)~)&Mi`x(OPSp!j0T z4$cs<#pD@c@Ays)N{LxHG$$!VUT7Y2b2=s`Txno~zwtPK%}7$Qwa$W6G>SbSreIpi zfFFpr^S#6&yasJ$Qi6w`g#|=mz~W~eZo6WuxRFbF5KB&|youbN+V)44&&LlhS&D-soC5A$ z@$MYuw$Fh#K8LM|+t9@E_`u*qpCebCY@+KRc6}DyKCKE9@WrsvcGYxXDsoAbeklD} zr8h4bLmXx!LdKC@r$Rs!HEH)8R7Z$?`?r*G=OF(-6sC_~uq{uDO*jy-7zsSe3Js}crk*#mMwmuy53UwU_4(BY`DV&r-yVJcJ!bQQ4bD1R2(F+sQj zb^U{Uj=EN#{~Y*!h~oxKCg18aJpA_{RHFyB0@RmJ{Me_Rv-qq0K7IuRx#Ot<2PVh7 z7Sl`$JhBrg{~|$SK7rq_FP!UHzS|NEsDEP=_=W$svB?2p$NdB!urLFP9XjrFJJ|@G zKt@f?A5oODfDb!>2{qZt_pb>Pj>lXn6lKrC!qf^1FQP!X}%MDTabjqx?fx>5z z`=f@>as}C}iXLu%*_~3&h3MBrVS_!!Ay2N{LXx{$6QpCjx?`r@zF_%>Y)hDvx>PA! zs=fJQSVJyLp>G6VkyRH!D`anLR*f?n22Dr~|Lk#NPj2wTeYPcvgIf%Z@;=m-IxLv|JZBeDQuxmvLRoBw&-#eM~bV) zpH+xvD}$=u*pGhh?%@7$Uhr*%mWX9})XA{TK?syk-hp^+6_%95XhR*l;v zvnp%X)Ww!|EBG8*DWxP{2@Nm@_uQ*_188c zI$<8PJF(63)76&4-zWSS{Oc#vly{OvD}7QzeMF+{u_0TcFbe&ekQUUXP&|G;RMbpK zxS~glEPBJJqozBW&YbOGad+W{X?5~Hzk50sOmsTQUs!?xv-;SD3T7xx9@sJeX0dXE zlh0dq$@ZVH5sMSSm{#oEQp9#9K;T_Trw%$AGw-xQ(5$IjK;K0`2i<%;mOF>>BZrU7 z*7L%)07H|v3Sq5$$0N2d+x_0x2DC$C86uhvS~4>^n~9MJX3GS!I=XQH@5%|xFcub< zR;Z9KHO(Cd({si29{eFmdN$|k)?Czlhm?0HSh-}g6nAdyDdq?l^x!X7UbikXj*W!3 za%RyGnMxb3`~4BYQPuDF+l~cG-!_*}bC}jdCyqXQ%QoQ742I(2-&AAO8A{8D> z{PgJ+j9)yrw=Z@L?_JdGiCvy#IcE?N=jqMSRoK4ms$dfyjIj>5YGZ%9*|gP1P^S2;4XYLT1V^BBZ|*{&8_ zM030hyB4oL3xeO{+r8#_AFQ2#+q9l<;acHw3h;h@Df&$9)6pYhO>6c^xmsHrU3Tux z^#5(alH0}aYX1^#kaqTwuHGdp_pjoej!ml9WnX?Q*q8U}*SU278)_MZlO zA=ZpoWF_nuqW@K(Zaf!^DV`PigW2x2e=V?P81ty7pA?b?|@+@l0} zzmjmV1om+1fbD;`MXfTc(=au=FSBhfa?VQexK^VI22M7 zY!?VB^H81k%`73Z#OWMWa+joGRd;T6&D3l`!Gi7{{lI?QMOqIOR*X21HNK)o3Z1{} zO8fe*PQkRc@19TV8C-V&#>b#8MdZhC!@s*npbb*aH^hVFB@8ut?k4UpHy3-FhyVW^ zLtmp;ivLFHuN>ni|FsX3dL~ToZ-RK&>jzfSkRON#asRRz<3`r^5C|XqS8_MK`cIpm KGb=H5js8Dn0t&VO literal 3267 zcmeHKdrVVj6#q(jE1;-xjv{Wmp>aCR630_1A`9M-whI~`j95*`tY}LC6_iI2+?aC$ zxy>Z8Jj$FBhdibgAp(W@U=0!K5Rfc2x9{GuKz7lpa~*$* z*eRr0gVUw}{FW+tVU9sX#A>>vI{|i^J?>RpbxGgH!4Ld^kdIV|BtPctyZB*If;{>R zq49R5H`3lTlNO}U^1;U@*jA7Ui=Pbx09LNrh9W(3^7>?c3ePq&T$UL`&-X!TaS`jL zuP;vYDR(SvKtUAan&+$2FP6+>>V^9gIfs+A>GbKGbPir}Z5%b8BBG`9)00ftOW7U+ zT_D$7gB!tN9-u6Zs9cSb4=Y5H-#+_x^ij_XAN4d=%w^FVDb3LuQ(n4>2u&y73erjW zsb?USv&*-Pg|eI5{-;=)s}ZmhVX$O=+U`AK0Sm2>v9biDA6yeeVZf2HsEct%8#=S-_-E=gCH347AOg@5BjXU-Mlz*tk}b zBLYeT{(A&UJ{&8O{QYgic^;&uV$HJiK5_I$%7O~#XKrwmc!+>w1&N|WW5FK4%B_)D zG)5ESE7Fc6e5{GQ!kUEwfEKOAu*^7exUL2#UR|G5JD?!QxN8ZB+Fr-TTf7cQZF>S8 z=+n8n2N)6^x9BQl*y6psSTCe;Q3dS=LcQ$#HI#ffRwVi5*PFKb_WRt$FOw@|h~7wK z>UN!Wk5ni-U!P_Lsis6@+6B?~O@kJVQM8M@Th!W6#hq>bV^9Flq7~@Z8q|$v6J%Hy zw@2nS1S1tg#yxqA>ZG%LBA-)ha;!>pg&-@HC;_v&6;b^HHa?fQbsz|7+-gKYl?=^G zwo^DtJ{&7E`P>|VxK<>VZRWdoKR5@&MvN#8N&T%QCXKgKs?iDp*W`!?fR)?dKxs^A zpRz#KdLj7uv3Lz^qd2r^6I*9xnfe#r_$_%A+v@?0v==gN-i=eUg_yrI$++@_jzvG< z**wPBz(>`!DjxAlcc?xUX5@>P_nD^*&gLDK9XQu;HQ< z>ZfXp_{L(cyTM=$q1NOdz5rIPJe|^*_lLbe$6JnA1T*gtN6G#Xrh*eDxnV7h s@Q95x4tEN)SPeBoX?cqO|3sM;RJp8EG?=c$nBP(GFL|NmA%`>m0)^P=#{d8T From d629bf12ab584162113db9c3e0ca2ded061de889 Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 13 Feb 2025 16:20:13 -0500 Subject: [PATCH 05/24] [Misc][Balance] Organizing Evil Teams (#5303) * Organized all evil teams * Improved Giovanni and other Evil Team Leaders * Experienced endless pain --- src/data/trainer-config.ts | 259 +++++++++++++++++++++++-------------- 1 file changed, 162 insertions(+), 97 deletions(-) diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 016a2c9bca6..564518845dc 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -581,107 +581,107 @@ export class TrainerConfig { switch (team) { case "rocket": { return { - [TrainerPoolTier.COMMON]: [ Species.RATTATA, Species.KOFFING, Species.EKANS, Species.ZUBAT, Species.MAGIKARP, Species.HOUNDOUR, Species.ONIX, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.DROWZEE, Species.VILEPLUME ], - [TrainerPoolTier.UNCOMMON]: [ Species.PORYGON, Species.MANKEY, Species.MAGNEMITE, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO, Species.MAGBY, Species.ELEKID ], - [TrainerPoolTier.RARE]: [ Species.DRATINI, Species.LARVITAR ] + [TrainerPoolTier.COMMON]: [ Species.RATICATE, Species.ARBOK, Species.VILEPLUME, Species.ARCANINE, Species.GENGAR, Species.HYPNO, Species.ELECTRODE, Species.EXEGGUTOR, Species.CUBONE, Species.KOFFING, Species.GYARADOS, Species.CROBAT, Species.STEELIX, Species.HOUNDOOM, Species.HONCHKROW ], + [TrainerPoolTier.UNCOMMON]: [ Species.OMASTAR, Species.KABUTOPS, Species.MAGNEZONE, Species.ELECTIVIRE, Species.MAGMORTAR, Species.PORYGON_Z, Species.ANNIHILAPE, Species.ALOLA_SANDSLASH, Species.ALOLA_PERSIAN, Species.ALOLA_GOLEM, Species.ALOLA_MUK, Species.PALDEA_TAUROS ], + [TrainerPoolTier.RARE]: [ Species.DRAGONITE, Species.TYRANITAR ] }; } case "magma": { return { - [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.BALTOY, Species.ROLYCOLY, Species.GLIGAR, Species.TORKOAL, Species.HOUNDOUR, Species.MAGBY ], - [TrainerPoolTier.UNCOMMON]: [ Species.TRAPINCH, Species.SILICOBRA, Species.RHYHORN, Species.ANORITH, Species.LILEEP, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ], - [TrainerPoolTier.RARE]: [ Species.CAPSAKID, Species.CHARCADET ] + [TrainerPoolTier.COMMON]: [ Species.ARCANINE, Species.MAGCARGO, Species.HOUNDOOM, Species.TORKOAL, Species.SOLROCK, Species.CLAYDOL, Species.HIPPOWDON, Species.MAGMORTAR, Species.GLISCOR, Species.COALOSSAL ], + [TrainerPoolTier.UNCOMMON]: [ Species.AGGRON, Species.FLYGON, Species.CRADILY, Species.ARMALDO, Species.RHYPERIOR, Species.TURTONATOR, Species.SANDACONDA, Species.TOEDSCRUEL, Species.HISUI_ARCANINE ], + [TrainerPoolTier.RARE]: [ Species.CHARCADET, Species.SCOVILLAIN ] }; } case "aqua": { return { - [TrainerPoolTier.COMMON]: [ Species.CORPHISH, Species.SPHEAL, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.LOTAD, Species.WAILMER, Species.REMORAID, Species.BARBOACH ], - [TrainerPoolTier.UNCOMMON]: [ Species.MANTYKE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.DHELMISE, Species.CLOBBOPUS, Species.FEEBAS, Species.PALDEA_WOOPER, Species.HORSEA, Species.SKRELP ], - [TrainerPoolTier.RARE]: [ Species.DONDOZO, Species.BASCULEGION ] + [TrainerPoolTier.COMMON]: [ Species.TENTACRUEL, Species.LANTURN, Species.AZUMARILL, Species.QUAGSIRE, Species.OCTILLERY, Species.LUDICOLO, Species.PELIPPER, Species.WAILORD, Species.WHISCASH, Species.CRAWDAUNT, Species.WALREIN, Species.CLAMPERL ], + [TrainerPoolTier.UNCOMMON]: [ Species.QUAGSIRE, Species.MANTINE, Species.KINGDRA, Species.MILOTIC, Species.DRAGALGE, Species.DHELMISE, Species.BARRASKEWDA, Species.GRAPPLOCT, Species.OVERQWIL ], + [TrainerPoolTier.RARE]: [ Species.BASCULEGION, Species.DONDOZO ] }; } case "galactic": { return { - [TrainerPoolTier.COMMON]: [ Species.BRONZOR, Species.SWINUB, Species.YANMA, Species.LICKITUNG, Species.TANGELA, Species.MAGBY, Species.ELEKID, Species.SKORUPI, Species.ZUBAT, Species.MURKROW, Species.MAGIKARP, Species.VOLTORB ], - [TrainerPoolTier.UNCOMMON]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.DUSKULL, Species.ROTOM, Species.HISUI_VOLTORB, Species.GLIGAR, Species.ABRA ], - [TrainerPoolTier.RARE]: [ Species.URSALUNA, Species.HISUI_LILLIGANT, Species.SPIRITOMB, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ Species.ELECTRODE, Species.GYARADOS, Species.CROBAT, Species.HONCHKROW, Species.BRONZONG, Species.DRAPION, Species.LICKILICKY, Species.TANGROWTH, Species.ELECTIVIRE, Species.MAGMORTAR, Species.YANMEGA, Species.MAMOSWINE ], + [TrainerPoolTier.UNCOMMON]: [ Species.ALAKAZAM, Species.WEAVILE, Species.GLISCOR, Species.DUSKNOIR, Species.ROTOM, Species.OVERQWIL, Species.HISUI_ARCANINE, Species.HISUI_ELECTRODE ], + [TrainerPoolTier.RARE]: [ Species.SPIRITOMB, Species.URSALUNA, Species.SNEASLER, Species.HISUI_LILLIGANT ] }; } case "plasma": { return { - [TrainerPoolTier.COMMON]: [ Species.YAMASK, Species.ROGGENROLA, Species.JOLTIK, Species.TYMPOLE, Species.FRILLISH, Species.FERROSEED, Species.SANDILE, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.CUBCHOO, Species.VANILLITE ], - [TrainerPoolTier.UNCOMMON]: [ Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK, Species.TYNAMO, Species.GALAR_DARUMAKA, Species.GOLETT, Species.MIENFOO, Species.DURANT, Species.SIGILYPH ], - [TrainerPoolTier.RARE]: [ Species.HISUI_ZORUA, Species.AXEW, Species.DEINO, Species.HISUI_BRAVIARY ] + [TrainerPoolTier.COMMON]: [ Species.GIGALITH, Species.CONKELDURR, Species.SEISMITOAD, Species.KROOKODILE, Species.DARMANITAN, Species.COFAGRIGUS, Species.VANILLUXE, Species.AMOONGUSS, Species.JELLICENT, Species.GALVANTULA, Species.FERROTHORN, Species.BEARTIC ], + [TrainerPoolTier.UNCOMMON]: [ Species.EXCADRILL, Species.SIGILYPH, Species.ZOROARK, Species.KLINKLANG, Species.EELEKTROSS, Species.MIENSHAO, Species.GOLURK, Species.BISHARP, Species.MANDIBUZZ, Species.DURANT, Species.GALAR_DARMANITAN ], + [TrainerPoolTier.RARE]: [ Species.HAXORUS, Species.HYDREIGON, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY ] }; } case "plasma_2": { return { - [TrainerPoolTier.COMMON]: [ Species.MAGNEMITE, Species.GRIMER, Species.VOLTORB, Species.PORYGON, Species.BRONZOR, Species.MUNNA, Species.SOLOSIS, Species.JOLTIK, Species.FERROSEED, Species.TYNAMO, Species.ELGYEM ], - [TrainerPoolTier.UNCOMMON]: [ Species.BELDUM, Species.ROTOM, Species.TIRTOUGA, Species.ARCHEN, Species.GOLETT, Species.DURANT, Species.GRUBBIN, Species.BLIPBUG, Species.VAROOM, Species.ALOLA_GRIMER, Species.HISUI_VOLTORB ], - [TrainerPoolTier.RARE]: [ Species.ELEKID, Species.MAGBY, Species.PAWNIARD, Species.DURALUDON ] + [TrainerPoolTier.COMMON]: [ Species.MUK, Species.ELECTRODE, Species.BRONZONG, Species.MAGNEZONE, Species.PORYGON_Z, Species.MUSHARNA, Species.REUNICLUS, Species.GALVANTULA, Species.FERROTHORN, Species.EELEKTROSS, Species.BEHEEYEM ], + [TrainerPoolTier.UNCOMMON]: [ Species.METAGROSS, Species.ROTOM, Species.CARRACOSTA, Species.ARCHEOPS, Species.GOLURK, Species.DURANT, Species.VIKAVOLT, Species.ORBEETLE, Species.REVAVROOM, Species.ALOLA_MUK, Species.HISUI_ELECTRODE ], + [TrainerPoolTier.RARE]: [ Species.ELECTIVIRE, Species.MAGMORTAR, Species.BISHARP, Species.ARCHALUDON ] }; } case "flare": { return { - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.FOONGUS, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKORUPI, Species.PURRLOIN, Species.CLAWITZER, Species.PANCHAM, Species.ESPURR, Species.BUNNELBY ], - [TrainerPoolTier.UNCOMMON]: [ Species.LITWICK, Species.SNEASEL, Species.PUMPKABOO, Species.PHANTUMP, Species.HONEDGE, Species.BINACLE, Species.HOUNDOUR, Species.SKRELP, Species.SLIGGOO ], - [TrainerPoolTier.RARE]: [ Species.NOIBAT, Species.HISUI_AVALUGG, Species.HISUI_SLIGGOO ] + [TrainerPoolTier.COMMON]: [ Species.MANECTRIC, Species.DRAPION, Species.LIEPARD, Species.AMOONGUSS, Species.DIGGERSBY, Species.TALONFLAME, Species.PYROAR, Species.PANGORO, Species.MEOWSTIC, Species.MALAMAR, Species.CLAWITZER, Species.HELIOLISK ], + [TrainerPoolTier.UNCOMMON]: [ Species.HOUNDOOM, Species.WEAVILE, Species.CHANDELURE, Species.AEGISLASH, Species.BARBARACLE, Species.DRAGALGE, Species.GOODRA, Species.TREVENANT, Species.GOURGEIST ], + [TrainerPoolTier.RARE]: [ Species.NOIVERN, Species.HISUI_GOODRA, Species.HISUI_AVALUGG ] }; } case "aether": { return { - [TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU, Species.BLIPBUG, Species.GIRAFARIG, Species.ORANGURU ], - [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.MEDITITE, Species.BELDUM, Species.HATENNA, Species.INKAY, Species.RALTS, Species.GALAR_MR_MIME ], - [TrainerPoolTier.RARE]: [ Species.ARMAROUGE, Species.HISUI_BRAVIARY, Species.PORYGON ] + [TrainerPoolTier.COMMON]: [ Species.ALAKAZAM, Species.SLOWBRO, Species.EXEGGUTOR, Species.XATU, Species.CLAYDOL, Species.BEHEEYEM, Species.ORANGURU, Species.BRUXISH, Species.ORBEETLE, Species.FARIGIRAF, Species.ALOLA_RAICHU ], + [TrainerPoolTier.UNCOMMON]: [ Species.KIRLIA, Species.MEDICHAM, Species.METAGROSS, Species.MALAMAR, Species.HATTERENE, Species.MR_RIME, Species.GALAR_SLOWKING ], + [TrainerPoolTier.RARE]: [ Species.PORYGON_Z, Species.ARMAROUGE, Species.HISUI_BRAVIARY ] }; } case "skull": { return { - [TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.FOMANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING, Species.STUNKY, Species.CROAGUNK, Species.NIDORAN_F ], - [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.SKORUPI, Species.PALDEA_WOOPER, Species.VULLABY, Species.HISUI_QWILFISH, Species.GLIMMET ], - [TrainerPoolTier.RARE]: [ Species.SKRELP, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ Species.NIDOQUEEN, Species.GENGAR, Species.KOFFING, Species.CROBAT, Species.ROSERADE, Species.SKUNTANK, Species.TOXICROAK, Species.SCOLIPEDE, Species.TOXAPEX, Species.LURANTIS, Species.ALOLA_MUK ], + [TrainerPoolTier.UNCOMMON]: [ Species.DRAPION, Species.MANDIBUZZ, Species.OVERQWIL, Species.GLIMMORA, Species.CLODSIRE, Species.GALAR_SLOWBRO ], + [TrainerPoolTier.RARE]: [ Species.DRAGALGE, Species.SNEASLER ] }; } case "macro": { return { - [TrainerPoolTier.COMMON]: [ Species.HATENNA, Species.FEEBAS, Species.BOUNSWEET, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS, Species.VULPIX, Species.FRILLISH, Species.ODDISH, Species.SINISTEA ], - [TrainerPoolTier.UNCOMMON]: [ Species.VULLABY, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.APPLIN ], - [TrainerPoolTier.RARE]: [ Species.TINKATINK, Species.HISUI_LILLIGANT ] + [TrainerPoolTier.COMMON]: [ Species.NINETALES, Species.BELLOSSOM, Species.MILOTIC, Species.FROSLASS, Species.GOTHITELLE, Species.JELLICENT, Species.SALAZZLE, Species.TSAREENA, Species.POLTEAGEIST, Species.HATTERENE, Species.GALAR_RAPIDASH ], + [TrainerPoolTier.UNCOMMON]: [ Species.TOGEKISS, Species.MANDIBUZZ, Species.TOXAPEX, Species.APPLETUN, Species.CURSOLA, Species.ALOLA_NINETALES ], + [TrainerPoolTier.RARE]: [ Species.TINKATON, Species.HISUI_LILLIGANT ] }; } case "star_1": { return { - [TrainerPoolTier.COMMON]: [ Species.MURKROW, Species.SEEDOT, Species.CACNEA, Species.STUNKY, Species.SANDILE, Species.NYMBLE, Species.MASCHIFF, Species.GALAR_ZIGZAGOON ], - [TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.SNEASEL, Species.CORPHISH, Species.ZORUA, Species.INKAY, Species.BOMBIRDIER ], - [TrainerPoolTier.RARE]: [ Species.DEINO, Species.SPRIGATITO ] + [TrainerPoolTier.COMMON]: [ Species.SHIFTRY, Species.CACTURNE, Species.HONCHKROW, Species.SKUNTANK, Species.KROOKODILE, Species.OBSTAGOON, Species.LOKIX, Species.MABOSSTIFF ], + [TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.CRAWDAUNT, Species.WEAVILE, Species.ZOROARK, Species.MALAMAR, Species.BOMBIRDIER ], + [TrainerPoolTier.RARE]: [ Species.HYDREIGON, Species.MEOWSCARADA ] }; } case "star_2": { return { - [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.HOUNDOUR, Species.NUMEL, Species.LITWICK, Species.FLETCHLING, Species.LITLEO, Species.ROLYCOLY, Species.CAPSAKID ], - [TrainerPoolTier.UNCOMMON]: [ Species.PONYTA, Species.FLAREON, Species.MAGBY, Species.TORKOAL, Species.SALANDIT, Species.TURTONATOR ], - [TrainerPoolTier.RARE]: [ Species.LARVESTA, Species.FUECOCO ] + [TrainerPoolTier.COMMON]: [ Species.ARCANINE, Species.HOUNDOOM, Species.CAMERUPT, Species.CHANDELURE, Species.TALONFLAME, Species.PYROAR, Species.COALOSSAL, Species.SCOVILLAIN ], + [TrainerPoolTier.UNCOMMON]: [ Species.RAPIDASH, Species.FLAREON, Species.TORKOAL, Species.MAGMORTAR, Species.SALAZZLE, Species.TURTONATOR ], + [TrainerPoolTier.RARE]: [ Species.VOLCARONA, Species.SKELEDIRGE ] }; } case "star_3": { return { - [TrainerPoolTier.COMMON]: [ Species.ZUBAT, Species.GRIMER, Species.STUNKY, Species.FOONGUS, Species.MAREANIE, Species.TOXEL, Species.SHROODLE, Species.PALDEA_WOOPER ], - [TrainerPoolTier.UNCOMMON]: [ Species.GASTLY, Species.SEVIPER, Species.SKRELP, Species.ALOLA_GRIMER, Species.GALAR_SLOWPOKE, Species.HISUI_QWILFISH ], - [TrainerPoolTier.RARE]: [ Species.GLIMMET, Species.BULBASAUR ] + [TrainerPoolTier.COMMON]: [ Species.MUK, Species.CROBAT, Species.SKUNTANK, Species.AMOONGUSS, Species.TOXAPEX, Species.TOXTRICITY, Species.GRAFAIAI, Species.CLODSIRE ], + [TrainerPoolTier.UNCOMMON]: [ Species.GENGAR, Species.SEVIPER, Species.DRAGALGE, Species.OVERQWIL, Species.ALOLA_MUK, Species.GALAR_SLOWBRO ], + [TrainerPoolTier.RARE]: [ Species.GLIMMORA, Species.VENUSAUR ] }; } case "star_4": { return { - [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.IGGLYBUFF, Species.AZURILL, Species.COTTONEE, Species.FLABEBE, Species.HATENNA, Species.IMPIDIMP, Species.TINKATINK ], - [TrainerPoolTier.UNCOMMON]: [ Species.TOGEPI, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_VULPIX ], - [TrainerPoolTier.RARE]: [ Species.GALAR_PONYTA, Species.POPPLIO ] + [TrainerPoolTier.COMMON]: [ Species.CLEFABLE, Species.WIGGLYTUFF, Species.AZUMARILL, Species.WHIMSICOTT, Species.FLORGES, Species.HATTERENE, Species.GRIMMSNARL, Species.TINKATON ], + [TrainerPoolTier.UNCOMMON]: [ Species.TOGEKISS, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_NINETALES ], + [TrainerPoolTier.RARE]: [ Species.GALAR_RAPIDASH, Species.PRIMARINA ] }; } case "star_5": { return { - [TrainerPoolTier.COMMON]: [ Species.SHROOMISH, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.SCRAGGY, Species.MIENFOO, Species.PAWMI, Species.PALDEA_TAUROS ], - [TrainerPoolTier.UNCOMMON]: [ Species.RIOLU, Species.TIMBURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ], - [TrainerPoolTier.RARE]: [ Species.JANGMO_O, Species.QUAXLY ] + [TrainerPoolTier.COMMON]: [ Species.BRELOOM, Species.HARIYAMA, Species.MEDICHAM, Species.TOXICROAK, Species.SCRAFTY, Species.MIENSHAO, Species.PAWMOT, Species.PALDEA_TAUROS ], + [TrainerPoolTier.UNCOMMON]: [ Species.LUCARIO, Species.CONKELDURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ], + [TrainerPoolTier.RARE]: [ Species.KOMMO_O, Species.QUAQUAVAL ] }; } } @@ -1500,9 +1500,9 @@ export const trainerConfigs: TrainerConfigs = { ), [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH, Species.SLOWPOKE ], - [TrainerPoolTier.UNCOMMON]: [ Species.GYARADOS, Species.LICKITUNG, Species.TAUROS, Species.MANKEY, Species.SCYTHER, Species.ELEKID, Species.MAGBY, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.MAGNEMITE ], - [TrainerPoolTier.RARE]: [ Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO ], + [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.ODDISH, Species.GEODUDE, Species.SLOWPOKE, Species.GRIMER, Species.KOFFING ], + [TrainerPoolTier.UNCOMMON]: [ Species.MANKEY, Species.GROWLITHE, Species.MAGNEMITE, Species.GASTLY, Species.VOLTORB, Species.EXEGGCUTE, Species.CUBONE, Species.LICKITUNG, Species.SCYTHER, Species.TAUROS, Species.GYARADOS, Species.MURKROW, Species.ELEKID, Species.MAGBY ], + [TrainerPoolTier.RARE]: [ Species.PORYGON, Species.OMANYTE, Species.KABUTO, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GEODUDE, Species.ALOLA_GRIMER, Species.PALDEA_TAUROS ], [TrainerPoolTier.SUPER_RARE]: [ Species.DRATINI, Species.LARVITAR ] }), [TrainerType.ARCHER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.HOUNDOOM ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), @@ -1511,71 +1511,71 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.PETREL]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.WEEZING ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.GROWLITHE, Species.BALTOY ], - [TrainerPoolTier.UNCOMMON]: [ Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR, Species.RHYHORN, Species.HEATMOR ], - [TrainerPoolTier.RARE]: [ Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ], - [TrainerPoolTier.SUPER_RARE]: [ Species.CAPSAKID, Species.CHARCADET ] + [TrainerPoolTier.COMMON]: [ Species.DIGLETT, Species.GROWLITHE, Species.SLUGMA, Species.MAGBY, Species.POOCHYENA, Species.ZIGZAGOON, Species.NUMEL, Species.TORKOAL, Species.BALTOY ], + [TrainerPoolTier.UNCOMMON]: [ Species.RHYHORN, Species.GLIGAR, Species.PHANPY, Species.SOLROCK, Species.HIPPOPOTAS, Species.HEATMOR, Species.ROLYCOLY, Species.SILICOBRA ], + [TrainerPoolTier.RARE]: [ Species.ARON, Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.TURTONATOR, Species.TOEDSCOOL, Species.HISUI_GROWLITHE ], + [TrainerPoolTier.SUPER_RARE]: [ Species.CHARCADET, Species.CAPSAKID ] }), [TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL, Species.REMORAID, Species.QWILFISH, Species.BARBOACH ], - [TrainerPoolTier.UNCOMMON]: [ Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.CLOBBOPUS, Species.HORSEA ], - [TrainerPoolTier.RARE]: [ Species.MANTYKE, Species.DHELMISE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.PALDEA_WOOPER, Species.SKRELP ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DONDOZO, Species.BASCULEGION ] + [TrainerPoolTier.COMMON]: [ Species.QWILFISH, Species.REMORAID, Species.ZIGZAGOON, Species.LOTAD, Species.CARVANHA, Species.WAILMER, Species.BARBOACH, Species.CORPHISH, Species.SPHEAL ], + [TrainerPoolTier.UNCOMMON]: [ Species.TENTACOOL, Species.HORSEA, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.AZURILL, Species.CLAMPERL, Species.CLOBBOPUS ], + [TrainerPoolTier.RARE]: [ Species.MANTYKE, Species.SKRELP, Species.DHELMISE, Species.ARROKUDA, Species.HISUI_QWILFISH, Species.PALDEA_WOOPER ], + [TrainerPoolTier.SUPER_RARE]: [ Species.BASCULEGION, Species.DONDOZO ] }), [TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.SHELLY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin_female", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY, Species.CARNIVINE ], - [TrainerPoolTier.UNCOMMON]: [ Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.ZUBAT, Species.YANMA, Species.SKORUPI, Species.GLIGAR, Species.SWINUB ], - [TrainerPoolTier.RARE]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL ], - [TrainerPoolTier.SUPER_RARE]: [ Species.ROTOM, Species.SPIRITOMB, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ Species.WURMPLE, Species.SHINX, Species.BURMY, Species.DRIFLOON, Species.GLAMEOW, Species.STUNKY, Species.BRONZOR, Species.CROAGUNK, Species.CARNIVINE ], + [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.YANMA, Species.GLIGAR, Species.SWINUB, Species.SKORUPI ], + [TrainerPoolTier.RARE]: [ Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL, Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH ], + [TrainerPoolTier.SUPER_RARE]: [ Species.SPIRITOMB, Species.ROTOM, Species.HISUI_SNEASEL ] }), [TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.SKUNTANK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.PURUGLY ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [ Species.TOXICROAK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH, Species.TYMPOLE ], - [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.JOLTIK, Species.CUBCHOO, Species.KLINK ], - [TrainerPoolTier.RARE]: [ Species.PAWNIARD, Species.RUFFLET, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.MIENFOO, Species.DURANT, Species.BOUFFALANT ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DRUDDIGON, Species.HISUI_ZORUA, Species.AXEW, Species.DEINO ] + [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.WOOBAT, Species.TYMPOLE, Species.SANDILE, Species.SCRAGGY, Species.TRUBBISH, Species.VANILLITE ], + [TrainerPoolTier.UNCOMMON]: [ Species.TIMBURR, Species.VENIPEDE, Species.DARUMAKA, Species.FOONGUS, Species.FRILLISH, Species.JOLTIK, Species.KLINK, Species.CUBCHOO, Species.GOLETT ], + [TrainerPoolTier.RARE]: [ Species.DRILBUR, Species.ZORUA, Species.MIENFOO, Species.PAWNIARD, Species.BOUFFALANT, Species.RUFFLET, Species.VULLABY, Species.DURANT ], + [TrainerPoolTier.SUPER_RARE]: [ Species.AXEW, Species.DRUDDIGON, Species.DEINO, Species.HISUI_ZORUA ] }), [TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [ Species.CRYOGONAL ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.COLRESS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_boss", "plasma_2", [ Species.KLINKLANG ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_colress").setMixedBattleBgm("battle_colress").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK, Species.SCATTERBUG, Species.ESPURR ], - [TrainerPoolTier.UNCOMMON]: [ Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.PANCHAM, Species.PURRLOIN, Species.POOCHYENA, Species.BINACLE, Species.CLAUNCHER, Species.PUMPKABOO, Species.PHANTUMP, Species.FOONGUS ], - [TrainerPoolTier.RARE]: [ Species.LITWICK, Species.SNEASEL, Species.PAWNIARD, Species.SLIGGOO ], + [TrainerPoolTier.COMMON]: [ Species.PONYTA, Species.HOUNDOUR, Species.SKORUPI, Species.CROAGUNK, Species.SCRAGGY, Species.FLETCHLING, Species.SCATTERBUG, Species.LITLEO, Species.ESPURR, Species.INKAY ], + [TrainerPoolTier.UNCOMMON]: [ Species.POOCHYENA, Species.ELECTRIKE, Species.PURRLOIN, Species.FOONGUS, Species.PANCHAM, Species.BINACLE, Species.SKRELP, Species.CLAUNCHER, Species.HELIOPTILE, Species.PHANTUMP, Species.PUMPKABOO ], + [TrainerPoolTier.RARE]: [ Species.SNEASEL, Species.LITWICK, Species.PAWNIARD, Species.SLIGGOO ], [TrainerPoolTier.SUPER_RARE]: [ Species.NOIBAT, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG ] }), [TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [ Species.LIEPARD ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [ Species.MALAMAR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.ALOLA_EXEGGUTOR, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.ALOLA_RAICHU, Species.BOUNSWEET, Species.LILLIPUP, Species.KOMALA, Species.MORELULL, Species.COMFEY, Species.TOGEDEMARU ], - [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.BRUXISH, Species.MINIOR, Species.WISHIWASHI, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.CRABRAWLER, Species.CUTIEFLY, Species.ORICORIO, Species.MUDBRAY, Species.PYUKUMUKU, Species.ALOLA_MAROWAK ], - [TrainerPoolTier.RARE]: [ Species.GALAR_CORSOLA, Species.TURTONATOR, Species.MIMIKYU, Species.MAGNEMITE, Species.DRAMPA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.JANGMO_O, Species.PORYGON ] + [TrainerPoolTier.COMMON]: [ Species.CORSOLA, Species.LILLIPUP, Species.PIKIPEK, Species.YUNGOOS, Species.ROCKRUFF, Species.MORELULL, Species.BOUNSWEET, Species.COMFEY, Species.KOMALA, Species.TOGEDEMARU, Species.ALOLA_RAICHU, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.ALOLA_EXEGGUTOR ], + [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.CRABRAWLER, Species.ORICORIO, Species.CUTIEFLY, Species.WISHIWASHI, Species.MUDBRAY, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.PYUKUMUKU, Species.MINIOR, Species.BRUXISH, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.ALOLA_MAROWAK ], + [TrainerPoolTier.RARE]: [ Species.MAGNEMITE, Species.TURTONATOR, Species.MIMIKYU, Species.DRAMPA, Species.GALAR_CORSOLA ], + [TrainerPoolTier.SUPER_RARE]: [ Species.PORYGON, Species.JANGMO_O ] }), [TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [ Species.HYPNO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.EKANS, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH, Species.DROWZEE ], - [TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.HOUNDOUR, Species.ALOLA_MAROWAK, Species.GASTLY, Species.PANCHAM, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY ], - [TrainerPoolTier.RARE]: [ Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.WISHIWASHI, Species.NYMBLE ], + [TrainerPoolTier.COMMON]: [ Species.EKANS, Species.DROWZEE, Species.KOFFING, Species.SPINARAK, Species.SCRAGGY, Species.TRUBBISH, Species.MAREANIE, Species.SALANDIT, Species.ALOLA_RATTATA, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER ], + [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.GASTLY, Species.HOUNDOUR, Species.SABLEYE, Species.VENIPEDE, Species.SANDILE, Species.VULLABY, Species.PANCHAM, Species.FOMANTIS, Species.ALOLA_MAROWAK ], + [TrainerPoolTier.RARE]: [ Species.PAWNIARD, Species.WISHIWASHI, Species.SANDYGAST, Species.MIMIKYU, Species.DHELMISE, Species.NYMBLE ], [TrainerPoolTier.SUPER_RARE]: [ Species.GRUBBIN, Species.DEWPIDER ] }), [TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [ Species.SALAZZLE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.MACRO_GRUNT]: new TrainerConfig(++t).setHasGenders("Macro Grunt Female").setHasDouble("Macro Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_macro_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CUFANT, Species.GALAR_MEOWTH, Species.KLINK, Species.ROOKIDEE, Species.CRAMORANT, Species.GALAR_ZIGZAGOON, Species.SKWOVET, Species.STEELIX, Species.MAWILE, Species.FERROSEED ], - [TrainerPoolTier.UNCOMMON]: [ Species.DRILBUR, Species.MAGNEMITE, Species.HATENNA, Species.ARROKUDA, Species.APPLIN, Species.GALAR_PONYTA, Species.GALAR_YAMASK, Species.SINISTEA, Species.RIOLU ], - [TrainerPoolTier.RARE]: [ Species.FALINKS, Species.BELDUM, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.HONEDGE, Species.SCIZOR, Species.GALAR_DARUMAKA ], + [TrainerPoolTier.COMMON]: [ Species.STEELIX, Species.MAWILE, Species.FERROSEED, Species.KLINK, Species.SKWOVET, Species.ROOKIDEE, Species.CRAMORANT, Species.CUFANT, Species.GALAR_MEOWTH, Species.GALAR_ZIGZAGOON ], + [TrainerPoolTier.UNCOMMON]: [ Species.MAGNEMITE, Species.RIOLU, Species.DRILBUR, Species.APPLIN, Species.ARROKUDA, Species.SINISTEA, Species.HATENNA, Species.GALAR_PONYTA, Species.GALAR_YAMASK ], + [TrainerPoolTier.RARE]: [ Species.SCIZOR, Species.BELDUM, Species.HONEDGE, Species.FALINKS, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.GALAR_DARUMAKA ], [TrainerPoolTier.SUPER_RARE]: [ Species.DURALUDON, Species.DREEPY ] }), [TrainerType.OLEANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("macro_admin", "macro", [ Species.GARBODOR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_oleana").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), @@ -2225,7 +2225,11 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DUGTRIO, Species.ALOLA_DUGTRIO ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HONCHKROW ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.NIDOQUEEN, Species.NIDOKING ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RHYPERIOR ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2234,20 +2238,32 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); })), [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.IRON_THORNS ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GARCHOMP, Species.EXCADRILL ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GASTRODON, Species.SEISMITOAD ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GASTRODON, Species.SEISMITOAD ], TrainerSlot.TRAINER, true, p => { if (p.species.speciesId === Species.GASTRODON) { p.abilityIndex = 0; // Storm Drain } else if (p.species.speciesId === Species.SEISMITOAD) { p.abilityIndex = 2; // Water Absorb } })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GARCHOMP, Species.EXCADRILL ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + if (p.species.speciesId === Species.GARCHOMP) { + p.abilityIndex = 2; // Rough Skin + } else if (p.species.speciesId === Species.EXCADRILL) { + p.abilityIndex = 0; // Sand Rush + } + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2295,7 +2311,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.abilityIndex = 0; // Chlorophyll })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2384,7 +2403,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MAGNEZONE ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.UXIE, Species.MESPRIT, Species.AZELF ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.UXIE, Species.MESPRIT, Species.AZELF ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; @@ -2425,7 +2447,10 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 0; })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.IRON_MOTH ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2448,7 +2473,14 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.DRAGALGE) { + p.abilityIndex = 2; // Adaptability + } else if (p.species.speciesId === Species.CLAWITZER) { + p.abilityIndex = 0; // Mega Launcher + } + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALLADE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 1; // Sharpness @@ -2467,7 +2499,14 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.DRAGALGE) { + p.abilityIndex = 2; // Adaptability + } else if (p.species.speciesId === Species.CLAWITZER) { + p.abilityIndex = 0; // Mega Launcher + } + })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.HISUI_GOODRA ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.IRON_VALIANT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2477,7 +2516,7 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Gyardos + p.formIndex = 1; // Mega Gyarados p.generateName(); p.gender = Gender.MALE; })) @@ -2597,11 +2636,26 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; })), [TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESCAVALIER, Species.FERROTHORN ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KLINKLANG, Species.PERRSERKER ])) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESCAVALIER, Species.FERROTHORN ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KLINKLANG, Species.PERRSERKER ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2614,13 +2668,21 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOZOLT, Species.DRACOVISH ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.abilityIndex = 1; //Strong Jaw Dracovish, Hustle Dracozolt + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Strong Jaw Dracovish, Hustle Dracozolt + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ])) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2666,7 +2728,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.formIndex = Utils.randSeedInt(5, 1); // Heat, Wash, Frost, Fan, or Mow })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RAIKOU, Species.ENTEI, Species.SUICUNE ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RAIKOU, Species.ENTEI, Species.SUICUNE ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = Utils.randSeedInt(5, 1); // Random Starmobile form p.generateAndPopulateMoveset(); From 6acd15970e10e31fa03b5e35400fe498c765d487 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 13 Feb 2025 15:20:54 -0600 Subject: [PATCH 06/24] [Ability][Bug] Remove partial designation from Quark Drive and Protosynthesis #5315 --- src/data/ability.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 347054d2447..e5b674d4fb4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6285,15 +6285,13 @@ export function initAbilities() { .attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.PROTOSYNTHESIS, 0, WeatherType.SUNNY, WeatherType.HARSH_SUN) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.QUARK_DRIVE, 9) .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), PostSummonAddBattlerTagAbAttr, BattlerTagType.QUARK_DRIVE, 0, true) .attr(PostTerrainChangeAddBattlerTagAttr, BattlerTagType.QUARK_DRIVE, 0, TerrainType.ELECTRIC) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.GOOD_AS_GOLD, 9) .attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.category === MoveCategory.STATUS && ![ MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES, MoveTarget.USER_SIDE ].includes(move.moveTarget)) .ignorable(), From dcd1636338ae025f9a593bbec6cc8ec8bde38c69 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:28:59 -0600 Subject: [PATCH 07/24] [i18n] Update locales submodule (#5318) --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index f46dcdb423c..f917baa1bb2 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit f46dcdb423c24137a25d9f6078cc6be68502801a +Subproject commit f917baa1bb2fc5071587b7894ce7b4898cc64f36 From 3fd5414f5cc2182b6b5521d80e357c5da2b525ff Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:37:54 -0600 Subject: [PATCH 08/24] [Misc] Increment version number (#5317) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4398037822a..270b72afda8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pokemon-rogue-battle", - "version": "1.5.4", + "version": "1.6.0", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index 94d580a3ec9..3861d5fb4ca 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.5.4", + "version": "1.6.0", "type": "module", "scripts": { "start": "vite", From 5ad8f189501a0afea2cc458eeacecaadae5c192c Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 14 Feb 2025 02:13:28 +0100 Subject: [PATCH 09/24] getFullUnlockedData now properly accounts for forms --- src/data/pokemon-species.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 5883bac3fc8..8473f7788e3 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1051,7 +1051,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali caughtAttr += DexAttr.VARIANT_2; caughtAttr += DexAttr.VARIANT_3; } - caughtAttr += DexAttr.DEFAULT_FORM; + + // Summing successive bigints for each obtainable form + caughtAttr += this.forms + .map((f, index) => f.isUnobtainable ? 0n : 128n * 2n ** BigInt(index)) + .reduce((acc, val) => acc + val, 0n); return caughtAttr; } From 7611061378f61e21381719a33f21266f3e02774d Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 14 Feb 2025 02:15:24 +0100 Subject: [PATCH 10/24] Updating version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 270b72afda8..1bf7649704b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pokemon-rogue-battle", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index 3861d5fb4ca..4e43b835189 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.6.0", + "version": "1.6.1", "type": "module", "scripts": { "start": "vite", From 8f498f1197df29673b25e2f9116589feae59065b Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 14 Feb 2025 03:03:14 +0100 Subject: [PATCH 11/24] Counting default form in caughtAttr for mons that don't have alternative forms --- src/data/pokemon-species.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 8473f7788e3..4349cee2cbf 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1053,9 +1053,9 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } // Summing successive bigints for each obtainable form - caughtAttr += this.forms - .map((f, index) => f.isUnobtainable ? 0n : 128n * 2n ** BigInt(index)) - .reduce((acc, val) => acc + val, 0n); + caughtAttr += this?.forms?.length > 1 ? + this.forms.map((f, index) => f.isUnobtainable ? 0n : 128n * 2n ** BigInt(index)).reduce((acc, val) => acc + val, 0n) : + DexAttr.DEFAULT_FORM; return caughtAttr; } From d159901ea1464911af612cd950c0eb4c5b671b84 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 14 Feb 2025 03:03:58 +0100 Subject: [PATCH 12/24] Updated version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1bf7649704b..b3ce2c3b415 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pokemon-rogue-battle", - "version": "1.6.1", + "version": "1.6.2", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index 4e43b835189..bbbb0f56f6b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.6.1", + "version": "1.6.2", "type": "module", "scripts": { "start": "vite", From 77fbcc70ef7c0c56c6b75f8e252ecd46c442e8f1 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 14 Feb 2025 18:40:13 +1100 Subject: [PATCH 13/24] [Bug][Hotfix] Fix fusion with dual type + monotype with shared primary type. (#5322) * Fix fusion with dual type + monotype with shared primary type. * Update version number * Add test case --- package-lock.json | 4 ++-- package.json | 2 +- src/field/pokemon.ts | 6 ++++++ src/test/field/pokemon.test.ts | 11 +++++++++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3ce2c3b415..2ae45b1e2c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.6.2", + "version": "1.6.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.5.4", + "version": "1.6.3", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index bbbb0f56f6b..495815be15d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.6.2", + "version": "1.6.3", "type": "module", "scripts": { "start": "vite", diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 82674fb8b46..b1e48df5c61 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1322,6 +1322,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } else if (fusionType1 !== types[0]) { secondType = fusionType1; } + + + if (secondType === Type.UNKNOWN && Utils.isNullOrUndefined(fusionType2)) { // If second pokemon was monotype and shared its primary type + secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== Type.UNKNOWN) + ? this.customPokemonData.types[1] : (speciesForm.type2 ?? Type.UNKNOWN); + } } else { // If not a fusion, just get the second type from the species, checking for permanent changes from ME secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== Type.UNKNOWN) diff --git a/src/test/field/pokemon.test.ts b/src/test/field/pokemon.test.ts index 0a1ddac9e90..0c282b44f49 100644 --- a/src/test/field/pokemon.test.ts +++ b/src/test/field/pokemon.test.ts @@ -150,6 +150,17 @@ describe("Spec - Pokemon", () => { expect(types[1]).toBe(Type.DARK); }); + it("Fusing mons with two and one types", async () => { + game.override.starterSpecies(Species.NUMEL); + game.override.starterFusionSpecies(Species.CHARMANDER); + await game.classicMode.startBattle(); + const pokemon = scene.getPlayerParty()[0]; + + const types = pokemon.getTypes(); + expect(types[0]).toBe(Type.FIRE); + expect(types[1]).toBe(Type.GROUND); + }); + it("Fusing two mons with two types", async () => { game.override.starterSpecies(Species.NATU); game.override.starterFusionSpecies(Species.HOUNDOUR); From 7b9d1d6570a9560909acad59a8b47c263eb1d7ad Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Fri, 14 Feb 2025 21:51:41 -0500 Subject: [PATCH 14/24] [Hotfix] Fix crash involving female Pyroar fusions with exp sprites (#5331) * Fix crash involving female Pyroar fusions with exp sprites * Update locales submodule --- package-lock.json | 4 +-- package.json | 2 +- public/images/pokemon/668-female.json | 41 -------------------------- public/images/pokemon/668-female.png | Bin 898 -> 0 bytes public/locales | 2 +- src/field/pokemon.ts | 9 ++++-- 6 files changed, 11 insertions(+), 47 deletions(-) delete mode 100644 public/images/pokemon/668-female.json delete mode 100644 public/images/pokemon/668-female.png diff --git a/package-lock.json b/package-lock.json index 2ae45b1e2c2..ce1feb7db41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.6.3", + "version": "1.6.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.6.3", + "version": "1.6.4", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 495815be15d..c9b5798af76 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.6.3", + "version": "1.6.4", "type": "module", "scripts": { "start": "vite", diff --git a/public/images/pokemon/668-female.json b/public/images/pokemon/668-female.json deleted file mode 100644 index 13d67c90194..00000000000 --- a/public/images/pokemon/668-female.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "668-female.png", - "format": "RGBA8888", - "size": { - "w": 72, - "h": 72 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 63, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3f88e039152d4a967a218cb721938610:e6991ce9c3bad348cbc05ebf9b440302:d99ed0e84a0695b54e479aa98271aba1$" - } -} diff --git a/public/images/pokemon/668-female.png b/public/images/pokemon/668-female.png deleted file mode 100644 index c8f4e205491a3c9298afb167fad34989f8374085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmV-|1AY97P)9ipC~f?H~&!QiD!hish$88UPV zX(u5MN3Tnl78^R0QcSc72YT@Sk_7y}^xnye&XO&Ec#yfDzW0!f$u4>Rk(|gR-)KI>MZL8`JY?jNP&BPpk z6|3KFQ6lfn-Xc{mT6Lf2H;>h)Axik%pjItc)tU~_I*I3uq1tV~#v*s8`={!Q&I&?M zEt~!CDA|j+TdhG$g9vL!E*a^euWJRRMZ~jg`J-=0@=t+I%akdP8K*>eQUBYPZAT?F7FrJ>ozcaRU5 zxHTzg-8A_bJ&aN_4fI8G8h0oG=;o!VGS})bQdotb6mO_W5BVh`EjEaFjJ^68!pF@y zKNr|r^idL66vPgq{YMaac5iN$<`D}J=>Z}Z6{ct!1w6o=b}OCL4pIuFMFEdl+^sYR z+98=pSuV1y;Cw~{1+qn`+l0J9bs9_RNhuf9PQ$q!iV|7s*{n8=1qqF6k#^>JMOf;& zYLMrk8KPFnA^@cd9}x*V^st8{KK6IMJ@!Ts9iW;x2@fGMA0TB>K^!zYh?0GDriQ5Y z8x%IkUQq`n7I8dvkr(!m{cmaZMzm80P=bitw=s+_cc?Jepa4b?W7MDxsDmhxQna^w zC5S`gxPlIm0H+S(D*z79$it~aR6+?BIT<1;G`{iCFewBmM58JZ8*DnI@Qs{Qj2#F6 Y0boY}eU9#KL;wH)07*qoM6N<$f?NrLjQ{`u diff --git a/public/locales b/public/locales index f917baa1bb2..58dda14ee83 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit f917baa1bb2fc5071587b7894ce7b4898cc64f36 +Subproject commit 58dda14ee834204c4bd5ece47694a3c068df4b0e diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index b1e48df5c61..5c6fbb34aea 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4042,6 +4042,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + if (fusionPixelColors.length === 0) { // ERROR HANDLING IS NOT OPTIONAL BUDDY + console.log("Failed to create fusion palette"); + return; + } + let paletteColors: Map; let fusionPaletteColors: Map; @@ -4055,8 +4060,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { Math.random = originalRandom; - paletteColors = paletteColors!; // tell TS compiler that paletteColors is defined! - fusionPaletteColors = fusionPaletteColors!; // TS compiler that fusionPaletteColors is defined! + paletteColors = paletteColors!; // erroneously tell TS compiler that paletteColors is defined! + fusionPaletteColors = fusionPaletteColors!; // mischievously misinform TS compiler that fusionPaletteColors is defined! const [ palette, fusionPalette ] = [ paletteColors, fusionPaletteColors ] .map(paletteColors => { let keys = Array.from(paletteColors.keys()).sort((a: number, b: number) => paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1); From 8555ef7cb78ae7b0ef2dcc19dcbca694070fecc0 Mon Sep 17 00:00:00 2001 From: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Date: Sat, 15 Feb 2025 05:51:28 +0100 Subject: [PATCH 15/24] [QOL] Make the name and formName readable for bigger sprites in pokedex (#5328) * Make the name, formName and type readable (bring it infront of larger sprites that would block it) * Dont to type Icons otherwise they will overlay on the "want to go back" text * Update src/ui/pokedex-ui-handler.ts --- src/ui/pokedex-ui-handler.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 940223528fb..9b54266b3ca 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -537,6 +537,8 @@ export default class PokedexUiHandler extends MessageUiHandler { this.starterSelectContainer.bringToTop(this.filterBarContainer); this.initTutorialOverlay(this.starterSelectContainer); this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); + this.starterSelectContainer.bringToTop(this.pokemonNameText); + this.starterSelectContainer.bringToTop(this.pokemonFormText); } show(args: any[]): boolean { From 4d5f9cecf102d429513d78f0f5208fc981e5982b Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Sat, 15 Feb 2025 20:32:07 -0600 Subject: [PATCH 16/24] Fix Zenith Marshadow missing a party icon (#5301) --- public/images/pokemon/icons/7/802-zenith.png | Bin 0 -> 396 bytes public/images/pokemon/icons/7/802s-zenith.png | Bin 0 -> 396 bytes public/images/pokemon_icons_7.json | 5950 +++++++++-------- public/images/pokemon_icons_7.png | Bin 51140 -> 51451 bytes 4 files changed, 2996 insertions(+), 2954 deletions(-) create mode 100644 public/images/pokemon/icons/7/802-zenith.png create mode 100644 public/images/pokemon/icons/7/802s-zenith.png diff --git a/public/images/pokemon/icons/7/802-zenith.png b/public/images/pokemon/icons/7/802-zenith.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0fee2d6096fd8d6e0c6135bfd47d71a6eff0c2 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`r2~9ITpb)7zJFKQx7;Cn{oI6vhz}n$E+jZKG!y{k^Jd4`11ZjuAiv=M zP{0uEUm*k%EbxddW?P6+uW^joTG!tv6?>RECv37kFe-<*}cAQ)W! fU~OE}+FFK`J#t5WE3bV6^e}^`tDnm{r-UW|T_T?L literal 0 HcmV?d00001 diff --git a/public/images/pokemon/icons/7/802s-zenith.png b/public/images/pokemon/icons/7/802s-zenith.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0fee2d6096fd8d6e0c6135bfd47d71a6eff0c2 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3-obnb*7rQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`r2~9ITpb)7zJFKQx7;Cn{oI6vhz}n$E+jZKG!y{k^Jd4`11ZjuAiv=M zP{0uEUm*k%EbxddW?P6+uW^joTG!tv6?>RECv37kFe-<*}cAQ)W! fU~OE}+FFK`J#t5WE3bV6^e}^`tDnm{r-UW|T_T?L literal 0 HcmV?d00001 diff --git a/public/images/pokemon_icons_7.json b/public/images/pokemon_icons_7.json index 0523a232d79..03eeba88a70 100644 --- a/public/images/pokemon_icons_7.json +++ b/public/images/pokemon_icons_7.json @@ -5,7 +5,7 @@ "format": "RGBA8888", "size": { "w": 502, - "h": 323 + "h": 325 }, "scale": 1, "frames": [ @@ -324,48 +324,6 @@ "h": 29 } }, - { - "filename": "795", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 293, - "w": 28, - "h": 30 - } - }, - { - "filename": "795s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 28, - "y": 293, - "w": 28, - "h": 30 - } - }, { "filename": "798s", "rotated": false, @@ -381,8 +339,8 @@ "h": 29 }, "frame": { - "x": 112, - "y": 0, + "x": 0, + "y": 293, "w": 31, "h": 29 } @@ -402,7 +360,7 @@ "h": 28 }, "frame": { - "x": 143, + "x": 112, "y": 0, "w": 30, "h": 28 @@ -423,8 +381,8 @@ "h": 28 }, "frame": { - "x": 173, - "y": 0, + "x": 108, + "y": 28, "w": 30, "h": 28 } @@ -444,7 +402,7 @@ "h": 28 }, "frame": { - "x": 203, + "x": 142, "y": 0, "w": 29, "h": 28 @@ -465,8 +423,8 @@ "h": 28 }, "frame": { - "x": 232, - "y": 0, + "x": 138, + "y": 28, "w": 29, "h": 28 } @@ -486,7 +444,7 @@ "h": 27 }, "frame": { - "x": 261, + "x": 171, "y": 0, "w": 29, "h": 27 @@ -507,7 +465,7 @@ "h": 27 }, "frame": { - "x": 290, + "x": 200, "y": 0, "w": 29, "h": 27 @@ -528,7 +486,7 @@ "h": 27 }, "frame": { - "x": 319, + "x": 229, "y": 0, "w": 28, "h": 27 @@ -549,7 +507,7 @@ "h": 27 }, "frame": { - "x": 347, + "x": 257, "y": 0, "w": 28, "h": 27 @@ -570,7 +528,7 @@ "h": 23 }, "frame": { - "x": 375, + "x": 285, "y": 0, "w": 32, "h": 23 @@ -591,14 +549,14 @@ "h": 23 }, "frame": { - "x": 407, + "x": 317, "y": 0, "w": 32, "h": 23 } }, { - "filename": "800", + "filename": "795", "rotated": false, "trimmed": true, "sourceSize": { @@ -619,7 +577,7 @@ } }, { - "filename": "800s", + "filename": "795s", "rotated": false, "trimmed": true, "sourceSize": { @@ -639,6 +597,48 @@ "h": 30 } }, + { + "filename": "800", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 32, + "y": 145, + "w": 28, + "h": 30 + } + }, + { + "filename": "800s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 32, + "y": 175, + "w": 28, + "h": 30 + } + }, { "filename": "805", "rotated": false, @@ -654,8 +654,8 @@ "h": 30 }, "frame": { - "x": 32, - "y": 145, + "x": 31, + "y": 205, "w": 28, "h": 30 } @@ -674,31 +674,10 @@ "w": 28, "h": 30 }, - "frame": { - "x": 32, - "y": 175, - "w": 28, - "h": 30 - } - }, - { - "filename": "773", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, "frame": { "x": 31, - "y": 205, - "w": 26, + "y": 235, + "w": 28, "h": 30 } }, @@ -718,32 +697,11 @@ }, "frame": { "x": 31, - "y": 235, + "y": 265, "w": 26, "h": 30 } }, - { - "filename": "792", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 31, - "y": 265, - "w": 28, - "h": 28 - } - }, { "filename": "773-dark", "rotated": false, @@ -759,8 +717,8 @@ "h": 30 }, "frame": { - "x": 56, - "y": 293, + "x": 31, + "y": 295, "w": 26, "h": 30 } @@ -780,7 +738,7 @@ "h": 25 }, "frame": { - "x": 439, + "x": 349, "y": 0, "w": 30, "h": 25 @@ -801,12 +759,75 @@ "h": 25 }, "frame": { - "x": 469, + "x": 379, "y": 0, "w": 30, "h": 25 } }, + { + "filename": "785", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 28, + "h": 26 + }, + "frame": { + "x": 409, + "y": 0, + "w": 28, + "h": 26 + } + }, + { + "filename": "785s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 28, + "h": 26 + }, + "frame": { + "x": 437, + "y": 0, + "w": 28, + "h": 26 + } + }, + { + "filename": "792", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 465, + "y": 0, + "w": 28, + "h": 28 + } + }, { "filename": "792s", "rotated": false, @@ -822,8 +843,8 @@ "h": 28 }, "frame": { - "x": 108, - "y": 29, + "x": 70, + "y": 57, "w": 28, "h": 28 } @@ -843,8 +864,8 @@ "h": 30 }, "frame": { - "x": 70, - "y": 57, + "x": 62, + "y": 85, "w": 26, "h": 30 } @@ -864,8 +885,8 @@ "h": 30 }, "frame": { - "x": 96, - "y": 57, + "x": 62, + "y": 115, "w": 26, "h": 30 } @@ -885,8 +906,8 @@ "h": 30 }, "frame": { - "x": 62, - "y": 87, + "x": 60, + "y": 145, "w": 26, "h": 30 } @@ -906,8 +927,8 @@ "h": 30 }, "frame": { - "x": 88, - "y": 87, + "x": 60, + "y": 175, "w": 26, "h": 30 } @@ -927,8 +948,8 @@ "h": 30 }, "frame": { - "x": 62, - "y": 117, + "x": 59, + "y": 205, "w": 26, "h": 30 } @@ -948,8 +969,8 @@ "h": 30 }, "frame": { - "x": 88, - "y": 117, + "x": 59, + "y": 235, "w": 26, "h": 30 } @@ -969,8 +990,8 @@ "h": 30 }, "frame": { - "x": 60, - "y": 147, + "x": 57, + "y": 265, "w": 26, "h": 30 } @@ -990,12 +1011,54 @@ "h": 30 }, "frame": { - "x": 86, - "y": 147, + "x": 57, + "y": 295, "w": 26, "h": 30 } }, + { + "filename": "764", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 25, + "h": 30 + }, + "frame": { + "x": 88, + "y": 85, + "w": 25, + "h": 30 + } + }, + { + "filename": "764s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 25, + "h": 30 + }, + "frame": { + "x": 88, + "y": 115, + "w": 25, + "h": 30 + } + }, { "filename": "773-ground", "rotated": false, @@ -1011,8 +1074,8 @@ "h": 30 }, "frame": { - "x": 60, - "y": 177, + "x": 86, + "y": 145, "w": 26, "h": 30 } @@ -1033,7 +1096,7 @@ }, "frame": { "x": 86, - "y": 177, + "y": 175, "w": 26, "h": 30 } @@ -1053,8 +1116,8 @@ "h": 30 }, "frame": { - "x": 57, - "y": 207, + "x": 85, + "y": 205, "w": 26, "h": 30 } @@ -1074,54 +1137,12 @@ "h": 30 }, "frame": { - "x": 83, - "y": 207, + "x": 85, + "y": 235, "w": 26, "h": 30 } }, - { - "filename": "2026", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 26, - "h": 28 - }, - "frame": { - "x": 57, - "y": 237, - "w": 26, - "h": 28 - } - }, - { - "filename": "772", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 59, - "y": 265, - "w": 25, - "h": 28 - } - }, { "filename": "773-rock", "rotated": false, @@ -1136,53 +1157,11 @@ "w": 26, "h": 30 }, - "frame": { - "x": 82, - "y": 293, - "w": 26, - "h": 30 - } - }, - { - "filename": "2026s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 26, - "h": 28 - }, "frame": { "x": 83, - "y": 237, - "w": 26, - "h": 28 - } - }, - { - "filename": "772s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 84, "y": 265, - "w": 25, - "h": 28 + "w": 26, + "h": 30 } }, { @@ -1200,14 +1179,14 @@ "h": 30 }, "frame": { - "x": 108, - "y": 293, + "x": 83, + "y": 295, "w": 26, "h": 30 } }, { - "filename": "764", + "filename": "772", "rotated": false, "trimmed": true, "sourceSize": { @@ -1215,16 +1194,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 0, + "x": 8, + "y": 2, "w": 25, - "h": 30 + "h": 28 }, "frame": { - "x": 122, + "x": 98, "y": 57, "w": 25, - "h": 30 + "h": 28 } }, { @@ -1242,14 +1221,14 @@ "h": 30 }, "frame": { - "x": 114, - "y": 87, + "x": 123, + "y": 56, "w": 26, "h": 30 } }, { - "filename": "773s", + "filename": "773", "rotated": false, "trimmed": true, "sourceSize": { @@ -1263,8 +1242,8 @@ "h": 30 }, "frame": { - "x": 114, - "y": 117, + "x": 149, + "y": 56, "w": 26, "h": 30 } @@ -1284,8 +1263,8 @@ "h": 30 }, "frame": { - "x": 112, - "y": 147, + "x": 113, + "y": 86, "w": 26, "h": 30 } @@ -1305,8 +1284,8 @@ "h": 30 }, "frame": { - "x": 112, - "y": 177, + "x": 139, + "y": 86, "w": 26, "h": 30 } @@ -1326,8 +1305,8 @@ "h": 30 }, "frame": { - "x": 109, - "y": 207, + "x": 113, + "y": 116, "w": 26, "h": 30 } @@ -1347,33 +1326,12 @@ "h": 30 }, "frame": { - "x": 109, - "y": 237, + "x": 139, + "y": 116, "w": 26, "h": 30 } }, - { - "filename": "785", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 109, - "y": 267, - "w": 28, - "h": 26 - } - }, { "filename": "773s-fairy", "rotated": false, @@ -1389,33 +1347,12 @@ "h": 30 }, "frame": { - "x": 134, - "y": 293, + "x": 112, + "y": 146, "w": 26, "h": 30 } }, - { - "filename": "801", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 136, - "y": 29, - "w": 20, - "h": 28 - } - }, { "filename": "773s-fighting", "rotated": false, @@ -1431,8 +1368,8 @@ "h": 30 }, "frame": { - "x": 156, - "y": 28, + "x": 138, + "y": 146, "w": 26, "h": 30 } @@ -1452,8 +1389,8 @@ "h": 30 }, "frame": { - "x": 182, - "y": 28, + "x": 112, + "y": 176, "w": 26, "h": 30 } @@ -1473,8 +1410,8 @@ "h": 30 }, "frame": { - "x": 208, - "y": 28, + "x": 138, + "y": 176, "w": 26, "h": 30 } @@ -1494,8 +1431,8 @@ "h": 30 }, "frame": { - "x": 234, - "y": 28, + "x": 111, + "y": 206, "w": 26, "h": 30 } @@ -1515,8 +1452,8 @@ "h": 30 }, "frame": { - "x": 147, - "y": 58, + "x": 137, + "y": 206, "w": 26, "h": 30 } @@ -1536,8 +1473,8 @@ "h": 30 }, "frame": { - "x": 173, - "y": 58, + "x": 111, + "y": 236, "w": 26, "h": 30 } @@ -1557,8 +1494,8 @@ "h": 30 }, "frame": { - "x": 199, - "y": 58, + "x": 137, + "y": 236, "w": 26, "h": 30 } @@ -1578,12 +1515,33 @@ "h": 30 }, "frame": { - "x": 225, - "y": 58, + "x": 109, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "794", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 109, + "y": 296, + "w": 25, + "h": 29 + } + }, { "filename": "773s-psychic", "rotated": false, @@ -1599,12 +1557,54 @@ "h": 30 }, "frame": { - "x": 140, - "y": 88, + "x": 135, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "794s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 134, + "y": 296, + "w": 25, + "h": 29 + } + }, + { + "filename": "796", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 159, + "y": 296, + "w": 18, + "h": 29 + } + }, { "filename": "773s-rock", "rotated": false, @@ -1620,12 +1620,54 @@ "h": 30 }, "frame": { - "x": 166, - "y": 88, + "x": 161, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "796s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 177, + "y": 296, + "w": 18, + "h": 29 + } + }, + { + "filename": "772s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 167, + "y": 28, + "w": 25, + "h": 28 + } + }, { "filename": "773s-steel", "rotated": false, @@ -1642,7 +1684,7 @@ }, "frame": { "x": 192, - "y": 88, + "y": 27, "w": 26, "h": 30 } @@ -1663,13 +1705,13 @@ }, "frame": { "x": 218, - "y": 88, + "y": 27, "w": 26, "h": 30 } }, { - "filename": "764s", + "filename": "773s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1677,123 +1719,18 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 7, "y": 0, - "w": 25, + "w": 26, "h": 30 }, "frame": { - "x": 140, - "y": 118, - "w": 25, + "x": 244, + "y": 27, + "w": 26, "h": 30 } }, - { - "filename": "785s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 165, - "y": 118, - "w": 28, - "h": 26 - } - }, - { - "filename": "2075", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 29, - "h": 24 - }, - "frame": { - "x": 193, - "y": 118, - "w": 29, - "h": 24 - } - }, - { - "filename": "794", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 138, - "y": 148, - "w": 25, - "h": 29 - } - }, - { - "filename": "794s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 138, - "y": 177, - "w": 25, - "h": 29 - } - }, - { - "filename": "726", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 222, - "y": 118, - "w": 23, - "h": 24 - } - }, { "filename": "2103", "rotated": false, @@ -1809,12 +1746,75 @@ "h": 30 }, "frame": { - "x": 251, - "y": 58, + "x": 270, + "y": 27, "w": 21, "h": 30 } }, + { + "filename": "2026", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 26, + "h": 28 + }, + "frame": { + "x": 291, + "y": 23, + "w": 26, + "h": 28 + } + }, + { + "filename": "2026s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 26, + "h": 28 + }, + "frame": { + "x": 317, + "y": 23, + "w": 26, + "h": 28 + } + }, + { + "filename": "2075", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 29, + "h": 24 + }, + "frame": { + "x": 343, + "y": 25, + "w": 29, + "h": 24 + } + }, { "filename": "2075s", "rotated": false, @@ -1830,180 +1830,12 @@ "h": 24 }, "frame": { - "x": 244, - "y": 88, + "x": 372, + "y": 25, "w": 29, "h": 24 } }, - { - "filename": "748", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 245, - "y": 112, - "w": 26, - "h": 25 - } - }, - { - "filename": "2103s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 21, - "h": 30 - }, - "frame": { - "x": 260, - "y": 28, - "w": 21, - "h": 30 - } - }, - { - "filename": "748s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 281, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "2089", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 307, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "2089s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 333, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "724", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 359, - "y": 27, - "w": 19, - "h": 25 - } - }, - { - "filename": "745-dusk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 25 - }, - "frame": { - "x": 378, - "y": 23, - "w": 25, - "h": 25 - } - }, - { - "filename": "745s-dusk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 25 - }, - "frame": { - "x": 403, - "y": 23, - "w": 25, - "h": 25 - } - }, { "filename": "746-school", "rotated": false, @@ -2019,8 +1851,8 @@ "h": 22 }, "frame": { - "x": 428, - "y": 25, + "x": 401, + "y": 26, "w": 28, "h": 22 } @@ -2040,14 +1872,14 @@ "h": 22 }, "frame": { - "x": 456, - "y": 25, + "x": 429, + "y": 26, "w": 28, "h": 22 } }, { - "filename": "796", + "filename": "760", "rotated": false, "trimmed": true, "sourceSize": { @@ -2055,20 +1887,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 + "x": 13, + "y": 4, + "w": 17, + "h": 24 }, "frame": { - "x": 484, - "y": 25, - "w": 18, - "h": 29 + "x": 175, + "y": 56, + "w": 17, + "h": 24 } }, { - "filename": "796s", + "filename": "748", "rotated": false, "trimmed": true, "sourceSize": { @@ -2076,16 +1908,121 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 + "x": 7, + "y": 5, + "w": 26, + "h": 25 }, "frame": { - "x": 272, - "y": 58, - "w": 18, - "h": 29 + "x": 192, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "748s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 25 + }, + "frame": { + "x": 218, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "2089", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 244, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "745-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 270, + "y": 57, + "w": 25, + "h": 25 + } + }, + { + "filename": "2089s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 295, + "y": 51, + "w": 26, + "h": 25 + } + }, + { + "filename": "745s-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 321, + "y": 51, + "w": 25, + "h": 25 } }, { @@ -2103,8 +2040,8 @@ "h": 26 }, "frame": { - "x": 290, - "y": 52, + "x": 346, + "y": 49, "w": 24, "h": 26 } @@ -2124,159 +2061,12 @@ "h": 26 }, "frame": { - "x": 314, - "y": 52, + "x": 370, + "y": 49, "w": 24, "h": 26 } }, - { - "filename": "750", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 338, - "y": 52, - "w": 25, - "h": 24 - } - }, - { - "filename": "724s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 273, - "y": 87, - "w": 19, - "h": 25 - } - }, - { - "filename": "776", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 271, - "y": 112, - "w": 23, - "h": 26 - } - }, - { - "filename": "750s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 292, - "y": 78, - "w": 25, - "h": 24 - } - }, - { - "filename": "726s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 317, - "y": 78, - "w": 23, - "h": 24 - } - }, - { - "filename": "776s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 340, - "y": 76, - "w": 23, - "h": 26 - } - }, - { - "filename": "801-original", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 363, - "y": 52, - "w": 20, - "h": 28 - } - }, { "filename": "765", "rotated": false, @@ -2292,14 +2082,56 @@ "h": 21 }, "frame": { - "x": 383, - "y": 48, + "x": 457, + "y": 28, "w": 28, "h": 21 } }, { - "filename": "727", + "filename": "760s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 485, + "y": 28, + "w": 17, + "h": 24 + } + }, + { + "filename": "2103s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 21, + "h": 30 + }, + "frame": { + "x": 165, + "y": 86, + "w": 21, + "h": 30 + } + }, + { + "filename": "783", "rotated": false, "trimmed": true, "sourceSize": { @@ -2308,14 +2140,56 @@ }, "spriteSourceSize": { "x": 9, + "y": 3, + "w": 21, + "h": 27 + }, + "frame": { + "x": 165, + "y": 116, + "w": 21, + "h": 27 + } + }, + { + "filename": "750", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, "y": 4, - "w": 23, + "w": 25, "h": 24 }, "frame": { - "x": 363, - "y": 80, - "w": 23, + "x": 186, + "y": 82, + "w": 25, + "h": 24 + } + }, + { + "filename": "750s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 211, + "y": 82, + "w": 25, "h": 24 } }, @@ -2334,159 +2208,12 @@ "h": 21 }, "frame": { - "x": 294, - "y": 102, + "x": 186, + "y": 106, "w": 28, "h": 21 } }, - { - "filename": "725", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 322, - "y": 102, - "w": 25, - "h": 21 - } - }, - { - "filename": "780", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 294, - "y": 123, - "w": 27, - "h": 19 - } - }, - { - "filename": "780s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 321, - "y": 123, - "w": 27, - "h": 19 - } - }, - { - "filename": "723", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 411, - "y": 48, - "w": 17, - "h": 22 - } - }, - { - "filename": "745", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 428, - "y": 47, - "w": 25, - "h": 23 - } - }, - { - "filename": "745s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 453, - "y": 47, - "w": 25, - "h": 23 - } - }, - { - "filename": "768", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 54, - "w": 24, - "h": 23 - } - }, { "filename": "2028", "rotated": false, @@ -2502,8 +2229,8 @@ "h": 24 }, "frame": { - "x": 386, - "y": 69, + "x": 236, + "y": 82, "w": 25, "h": 24 } @@ -2523,56 +2250,14 @@ "h": 24 }, "frame": { - "x": 411, - "y": 70, + "x": 261, + "y": 82, "w": 25, "h": 24 } }, { - "filename": "727s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 436, - "y": 70, - "w": 23, - "h": 24 - } - }, - { - "filename": "781", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 459, - "y": 70, - "w": 19, - "h": 25 - } - }, - { - "filename": "768s", + "filename": "725", "rotated": false, "trimmed": true, "sourceSize": { @@ -2581,15 +2266,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 5, - "w": 24, - "h": 23 + "y": 7, + "w": 25, + "h": 21 }, "frame": { - "x": 478, - "y": 77, - "w": 24, - "h": 23 + "x": 214, + "y": 106, + "w": 25, + "h": 21 } }, { @@ -2607,14 +2292,14 @@ "h": 21 }, "frame": { - "x": 386, - "y": 93, + "x": 239, + "y": 106, "w": 25, "h": 21 } }, { - "filename": "2020", + "filename": "726", "rotated": false, "trimmed": true, "sourceSize": { @@ -2623,40 +2308,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 411, - "y": 94, - "w": 25, - "h": 22 - } - }, - { - "filename": "729", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, + "y": 4, "w": 23, "h": 24 }, "frame": { - "x": 436, - "y": 94, + "x": 264, + "y": 106, "w": 23, "h": 24 } }, { - "filename": "781s", + "filename": "780", "rotated": false, "trimmed": true, "sourceSize": { @@ -2664,62 +2328,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 459, - "y": 95, - "w": 19, - "h": 25 - } - }, - { - "filename": "2105", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 100, - "w": 24, - "h": 23 - } - }, - { - "filename": "761", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, + "x": 7, + "y": 7, + "w": 27, "h": 19 }, "frame": { - "x": 347, - "y": 102, - "w": 16, + "x": 186, + "y": 127, + "w": 27, "h": 19 } }, { - "filename": "729s", + "filename": "780s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2727,184 +2349,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 363, - "y": 104, - "w": 23, - "h": 24 - } - }, - { - "filename": "734", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 386, - "y": 114, - "w": 25, - "h": 16 - } - }, - { - "filename": "734s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 411, - "y": 116, - "w": 25, - "h": 16 - } - }, - { - "filename": "733", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, + "x": 7, "y": 7, - "w": 23, - "h": 21 + "w": 27, + "h": 19 }, "frame": { - "x": 436, - "y": 118, - "w": 23, - "h": 21 - } - }, - { - "filename": "732", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 459, - "y": 120, - "w": 19, - "h": 22 - } - }, - { - "filename": "2105s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 123, - "w": 24, - "h": 23 - } - }, - { - "filename": "2050", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 348, - "y": 121, - "w": 15, - "h": 18 - } - }, - { - "filename": "733s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 363, - "y": 128, - "w": 23, - "h": 21 - } - }, - { - "filename": "2020s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 386, - "y": 130, - "w": 25, - "h": 22 + "x": 213, + "y": 127, + "w": 27, + "h": 19 } }, { @@ -2922,14 +2376,14 @@ "h": 22 }, "frame": { - "x": 411, - "y": 132, + "x": 240, + "y": 127, "w": 24, "h": 22 } }, { - "filename": "758s", + "filename": "726s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2937,104 +2391,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 24, - "h": 22 + "x": 8, + "y": 4, + "w": 23, + "h": 24 }, "frame": { - "x": 435, - "y": 139, - "w": 24, - "h": 22 + "x": 264, + "y": 130, + "w": 23, + "h": 24 } }, { - "filename": "732s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 459, - "y": 142, - "w": 19, - "h": 22 - } - }, - { - "filename": "2053", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 478, - "y": 146, - "w": 24, - "h": 22 - } - }, - { - "filename": "801s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 135, - "y": 207, - "w": 20, - "h": 28 - } - }, - { - "filename": "801s-original", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 135, - "y": 235, - "w": 20, - "h": 28 - } - }, - { - "filename": "783", + "filename": "727", "rotated": false, "trimmed": true, "sourceSize": { @@ -3043,15 +2413,78 @@ }, "spriteSourceSize": { "x": 9, - "y": 3, - "w": 21, - "h": 27 + "y": 4, + "w": 23, + "h": 24 }, "frame": { - "x": 137, - "y": 263, - "w": 21, - "h": 27 + "x": 286, + "y": 82, + "w": 23, + "h": 24 + } + }, + { + "filename": "776", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 287, + "y": 106, + "w": 23, + "h": 26 + } + }, + { + "filename": "727s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 287, + "y": 132, + "w": 23, + "h": 24 + } + }, + { + "filename": "776s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 309, + "y": 76, + "w": 23, + "h": 26 } }, { @@ -3069,8 +2502,8 @@ "h": 27 }, "frame": { - "x": 155, - "y": 206, + "x": 310, + "y": 102, "w": 21, "h": 27 } @@ -3090,8 +2523,8 @@ "h": 26 }, "frame": { - "x": 155, - "y": 233, + "x": 310, + "y": 129, "w": 22, "h": 26 } @@ -3111,8 +2544,8 @@ "h": 26 }, "frame": { - "x": 158, - "y": 259, + "x": 332, + "y": 76, "w": 22, "h": 26 } @@ -3132,12 +2565,306 @@ "h": 26 }, "frame": { - "x": 160, - "y": 285, + "x": 331, + "y": 102, "w": 22, "h": 26 } }, + { + "filename": "745", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 354, + "y": 75, + "w": 25, + "h": 23 + } + }, + { + "filename": "788s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 332, + "y": 128, + "w": 22, + "h": 26 + } + }, + { + "filename": "724", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 19, + "h": 25 + }, + "frame": { + "x": 379, + "y": 75, + "w": 19, + "h": 25 + } + }, + { + "filename": "724s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 19, + "h": 25 + }, + "frame": { + "x": 394, + "y": 49, + "w": 19, + "h": 25 + } + }, + { + "filename": "745s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 413, + "y": 48, + "w": 25, + "h": 23 + } + }, + { + "filename": "781", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 19, + "h": 25 + }, + "frame": { + "x": 438, + "y": 48, + "w": 19, + "h": 25 + } + }, + { + "filename": "729", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 457, + "y": 49, + "w": 23, + "h": 24 + } + }, + { + "filename": "806", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 480, + "y": 52, + "w": 22, + "h": 25 + } + }, + { + "filename": "801-original", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 398, + "y": 74, + "w": 20, + "h": 28 + } + }, + { + "filename": "801", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 418, + "y": 71, + "w": 20, + "h": 28 + } + }, + { + "filename": "803", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 438, + "y": 73, + "w": 23, + "h": 25 + } + }, + { + "filename": "781s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 19, + "h": 25 + }, + "frame": { + "x": 461, + "y": 73, + "w": 19, + "h": 25 + } + }, + { + "filename": "806s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 480, + "y": 77, + "w": 22, + "h": 25 + } + }, + { + "filename": "734", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 354, + "y": 98, + "w": 25, + "h": 16 + } + }, { "filename": "767", "rotated": false, @@ -3153,14 +2880,35 @@ "h": 14 }, "frame": { - "x": 245, - "y": 137, + "x": 353, + "y": 114, "w": 24, "h": 14 } }, { - "filename": "767s", + "filename": "803s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 354, + "y": 128, + "w": 23, + "h": 25 + } + }, + { + "filename": "732", "rotated": false, "trimmed": true, "sourceSize": { @@ -3169,15 +2917,603 @@ }, "spriteSourceSize": { "x": 10, - "y": 11, - "w": 24, - "h": 14 + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 269, - "y": 138, + "x": 379, + "y": 100, + "w": 19, + "h": 22 + } + }, + { + "filename": "801s-original", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 377, + "y": 122, + "w": 20, + "h": 28 + } + }, + { + "filename": "729s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 398, + "y": 102, + "w": 23, + "h": 24 + } + }, + { + "filename": "768", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, "w": 24, - "h": 14 + "h": 23 + }, + "frame": { + "x": 397, + "y": 126, + "w": 24, + "h": 23 + } + }, + { + "filename": "801s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 421, + "y": 99, + "w": 20, + "h": 28 + } + }, + { + "filename": "768s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 441, + "y": 98, + "w": 24, + "h": 23 + } + }, + { + "filename": "735", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 421, + "y": 127, + "w": 20, + "h": 24 + } + }, + { + "filename": "770", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 441, + "y": 121, + "w": 23, + "h": 24 + } + }, + { + "filename": "2050", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 465, + "y": 98, + "w": 15, + "h": 18 + } + }, + { + "filename": "756", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 102, + "w": 22, + "h": 24 + } + }, + { + "filename": "2050s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 465, + "y": 116, + "w": 15, + "h": 18 + } + }, + { + "filename": "756s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 126, + "w": 22, + "h": 24 + } + }, + { + "filename": "761", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 464, + "y": 134, + "w": 16, + "h": 19 + } + }, + { + "filename": "802-zenith", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 150, + "w": 22, + "h": 24 + } + }, + { + "filename": "733", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 441, + "y": 145, + "w": 23, + "h": 21 + } + }, + { + "filename": "761s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 464, + "y": 153, + "w": 16, + "h": 19 + } + }, + { + "filename": "745-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 165, + "y": 143, + "w": 21, + "h": 24 + } + }, + { + "filename": "2020", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 186, + "y": 146, + "w": 25, + "h": 22 + } + }, + { + "filename": "2020s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 211, + "y": 146, + "w": 25, + "h": 22 + } + }, + { + "filename": "802", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 164, + "y": 167, + "w": 22, + "h": 24 + } + }, + { + "filename": "2105", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 186, + "y": 168, + "w": 24, + "h": 23 + } + }, + { + "filename": "2105s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 210, + "y": 168, + "w": 24, + "h": 23 + } + }, + { + "filename": "734s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 164, + "y": 191, + "w": 25, + "h": 16 + } + }, + { + "filename": "770s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 163, + "y": 207, + "w": 23, + "h": 24 + } + }, + { + "filename": "2051", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 163, + "y": 231, + "w": 23, + "h": 24 + } + }, + { + "filename": "758s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 189, + "y": 191, + "w": 24, + "h": 22 + } + }, + { + "filename": "2051s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 186, + "y": 213, + "w": 23, + "h": 24 + } + }, + { + "filename": "745s-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 213, + "y": 191, + "w": 21, + "h": 24 + } + }, + { + "filename": "2053", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 209, + "y": 215, + "w": 24, + "h": 22 } }, { @@ -3195,8 +3531,8 @@ "h": 22 }, "frame": { - "x": 293, - "y": 142, + "x": 186, + "y": 237, "w": 24, "h": 22 } @@ -3216,14 +3552,14 @@ "h": 22 }, "frame": { - "x": 317, - "y": 142, + "x": 210, + "y": 237, "w": 23, "h": 22 } }, { - "filename": "769s", + "filename": "802s-zenith", "rotated": false, "trimmed": true, "sourceSize": { @@ -3231,125 +3567,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 340, - "y": 142, - "w": 23, - "h": 22 - } - }, - { - "filename": "752", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 363, - "y": 149, - "w": 23, - "h": 18 - } - }, - { - "filename": "2074", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 24, - "h": 15 - }, - "frame": { - "x": 386, - "y": 152, - "w": 24, - "h": 15 - } - }, - { - "filename": "2074s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 24, - "h": 15 - }, - "frame": { - "x": 410, - "y": 154, - "w": 24, - "h": 15 - } - }, - { - "filename": "752s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 434, - "y": 161, - "w": 23, - "h": 18 - } - }, - { - "filename": "745-midnight", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, + "x": 13, "y": 4, - "w": 21, + "w": 22, "h": 24 }, "frame": { - "x": 457, - "y": 164, - "w": 21, + "x": 187, + "y": 259, + "w": 22, "h": 24 } }, { - "filename": "770", + "filename": "802s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3357,20 +3588,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 13, "y": 4, - "w": 23, + "w": 22, "h": 24 }, "frame": { - "x": 478, - "y": 168, - "w": 23, + "x": 209, + "y": 259, + "w": 22, "h": 24 } }, { - "filename": "722", + "filename": "746", "rotated": false, "trimmed": true, "sourceSize": { @@ -3379,19 +3610,40 @@ }, "spriteSourceSize": { "x": 12, - "y": 8, - "w": 17, - "h": 18 + "y": 11, + "w": 18, + "h": 13 }, "frame": { - "x": 163, - "y": 188, - "w": 17, - "h": 18 + "x": 187, + "y": 283, + "w": 18, + "h": 13 } }, { - "filename": "735", + "filename": "733s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 236, + "y": 149, + "w": 23, + "h": 21 + } + }, + { + "filename": "807", "rotated": false, "trimmed": true, "sourceSize": { @@ -3401,308 +3653,14 @@ "spriteSourceSize": { "x": 11, "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 163, - "y": 164, - "w": 20, - "h": 24 - } - }, - { - "filename": "789", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 165, - "y": 144, - "w": 23, - "h": 20 - } - }, - { - "filename": "788s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, "w": 22, - "h": 26 + "h": 24 }, "frame": { - "x": 176, - "y": 206, + "x": 234, + "y": 170, "w": 22, - "h": 26 - } - }, - { - "filename": "803", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 177, - "y": 232, - "w": 23, - "h": 25 - } - }, - { - "filename": "786", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 180, - "y": 257, - "w": 20, - "h": 25 - } - }, - { - "filename": "786s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 182, - "y": 282, - "w": 20, - "h": 25 - } - }, - { - "filename": "778-busted", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 182, - "y": 307, - "w": 21, - "h": 16 - } - }, - { - "filename": "757", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 18 - }, - "frame": { - "x": 180, - "y": 188, - "w": 19, - "h": 18 - } - }, - { - "filename": "735s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, "h": 24 - }, - "frame": { - "x": 183, - "y": 164, - "w": 20, - "h": 24 - } - }, - { - "filename": "728", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 188, - "y": 144, - "w": 17, - "h": 20 - } - }, - { - "filename": "770s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 205, - "y": 142, - "w": 23, - "h": 24 - } - }, - { - "filename": "760", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 228, - "y": 142, - "w": 17, - "h": 24 - } - }, - { - "filename": "803s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 203, - "y": 166, - "w": 23, - "h": 25 - } - }, - { - "filename": "806", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 226, - "y": 166, - "w": 22, - "h": 25 - } - }, - { - "filename": "789s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 199, - "y": 191, - "w": 23, - "h": 20 } }, { @@ -3720,14 +3678,14 @@ "h": 21 }, "frame": { - "x": 198, - "y": 211, + "x": 234, + "y": 194, "w": 22, "h": 21 } }, { - "filename": "806s", + "filename": "807s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3735,125 +3693,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 200, - "y": 232, - "w": 22, - "h": 25 - } - }, - { - "filename": "756", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 200, - "y": 257, - "w": 22, - "h": 24 - } - }, - { - "filename": "745s-midnight", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, + "x": 11, "y": 4, - "w": 21, + "w": 22, "h": 24 }, "frame": { - "x": 202, - "y": 281, - "w": 21, - "h": 24 - } - }, - { - "filename": "2027", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 203, - "y": 305, - "w": 21, - "h": 18 - } - }, - { - "filename": "2051", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 222, - "y": 191, - "w": 23, - "h": 24 - } - }, - { - "filename": "778s-busted", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 220, + "x": 233, "y": 215, - "w": 21, - "h": 16 + "w": 22, + "h": 24 } }, { - "filename": "756s", + "filename": "738s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3862,19 +3715,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 5, + "y": 6, "w": 22, - "h": 24 + "h": 21 }, "frame": { - "x": 222, - "y": 231, + "x": 233, + "y": 239, "w": 22, - "h": 24 + "h": 21 } }, { - "filename": "802", + "filename": "769s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3882,16 +3735,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 + "x": 8, + "y": 6, + "w": 23, + "h": 22 }, "frame": { - "x": 222, - "y": 255, - "w": 22, - "h": 24 + "x": 231, + "y": 260, + "w": 23, + "h": 22 + } + }, + { + "filename": "767s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 205, + "y": 283, + "w": 24, + "h": 14 } }, { @@ -3909,8 +3783,71 @@ "h": 24 }, "frame": { - "x": 223, - "y": 279, + "x": 195, + "y": 297, + "w": 21, + "h": 24 + } + }, + { + "filename": "735s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 216, + "y": 297, + "w": 20, + "h": 24 + } + }, + { + "filename": "752", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 259, + "y": 154, + "w": 23, + "h": 18 + } + }, + { + "filename": "763s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 256, + "y": 172, "w": 21, "h": 24 } @@ -3930,134 +3867,8 @@ "h": 20 }, "frame": { - "x": 224, - "y": 303, - "w": 22, - "h": 20 - } - }, - { - "filename": "746", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 245, - "y": 151, - "w": 18, - "h": 13 - } - }, - { - "filename": "760s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 248, - "y": 164, - "w": 17, - "h": 24 - } - }, - { - "filename": "2051s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 265, - "y": 152, - "w": 23, - "h": 24 - } - }, - { - "filename": "738s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 265, - "y": 176, - "w": 22, - "h": 21 - } - }, - { - "filename": "743", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 245, - "y": 191, - "w": 20, - "h": 22 - } - }, - { - "filename": "747s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 265, - "y": 197, + "x": 256, + "y": 196, "w": 22, "h": 20 } @@ -4077,8 +3888,8 @@ "h": 23 }, "frame": { - "x": 288, - "y": 164, + "x": 255, + "y": 216, "w": 22, "h": 23 } @@ -4098,77 +3909,14 @@ "h": 23 }, "frame": { - "x": 310, - "y": 164, + "x": 255, + "y": 239, "w": 22, "h": 23 } }, { - "filename": "802s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 287, - "y": 187, - "w": 22, - "h": 24 - } - }, - { - "filename": "807", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 309, - "y": 187, - "w": 22, - "h": 24 - } - }, - { - "filename": "807s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 332, - "y": 164, - "w": 22, - "h": 24 - } - }, - { - "filename": "749", + "filename": "789", "rotated": false, "trimmed": true, "sourceSize": { @@ -4177,19 +3925,61 @@ }, "spriteSourceSize": { "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 254, + "y": 262, + "w": 23, + "h": 20 + } + }, + { + "filename": "752s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 282, + "y": 156, + "w": 23, + "h": 18 + } + }, + { + "filename": "743", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, "y": 5, - "w": 21, - "h": 23 + "w": 20, + "h": 22 }, "frame": { - "x": 331, - "y": 188, - "w": 21, - "h": 23 + "x": 277, + "y": 174, + "w": 20, + "h": 22 } }, { - "filename": "2037", + "filename": "732s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4198,61 +3988,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 7, - "w": 22, - "h": 21 + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 354, - "y": 167, - "w": 22, - "h": 21 + "x": 278, + "y": 196, + "w": 19, + "h": 22 } }, { - "filename": "749s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 352, - "y": 188, - "w": 21, - "h": 23 - } - }, - { - "filename": "2037s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 376, - "y": 167, - "w": 22, - "h": 21 - } - }, - { - "filename": "763s", + "filename": "786", "rotated": false, "trimmed": true, "sourceSize": { @@ -4261,15 +4009,57 @@ }, "spriteSourceSize": { "x": 11, - "y": 4, - "w": 21, - "h": 24 + "y": 3, + "w": 20, + "h": 25 }, "frame": { - "x": 373, - "y": 188, - "w": 21, - "h": 24 + "x": 277, + "y": 218, + "w": 20, + "h": 25 + } + }, + { + "filename": "786s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 20, + "h": 25 + }, + "frame": { + "x": 277, + "y": 243, + "w": 20, + "h": 25 + } + }, + { + "filename": "739", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 277, + "y": 268, + "w": 20, + "h": 21 } }, { @@ -4287,54 +4077,12 @@ "h": 24 }, "frame": { - "x": 394, - "y": 188, + "x": 297, + "y": 174, "w": 13, "h": 24 } }, - { - "filename": "790", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 398, - "y": 169, - "w": 21, - "h": 19 - } - }, - { - "filename": "2050s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 419, - "y": 169, - "w": 15, - "h": 18 - } - }, { "filename": "755s", "rotated": false, @@ -4350,8 +4098,8 @@ "h": 24 }, "frame": { - "x": 407, - "y": 188, + "x": 297, + "y": 198, "w": 13, "h": 24 } @@ -4371,180 +4119,12 @@ "h": 24 }, "frame": { - "x": 420, - "y": 187, + "x": 297, + "y": 222, "w": 21, "h": 24 } }, - { - "filename": "761s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 441, - "y": 179, - "w": 16, - "h": 19 - } - }, - { - "filename": "775", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 457, - "y": 188, - "w": 21, - "h": 20 - } - }, - { - "filename": "775s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 478, - "y": 192, - "w": 21, - "h": 20 - } - }, - { - "filename": "751", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 441, - "y": 198, - "w": 14, - "h": 20 - } - }, - { - "filename": "779", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 420, - "y": 211, - "w": 21, - "h": 20 - } - }, - { - "filename": "779s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 455, - "y": 208, - "w": 21, - "h": 20 - } - }, - { - "filename": "751s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 441, - "y": 218, - "w": 14, - "h": 20 - } - }, - { - "filename": "790s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 476, - "y": 212, - "w": 21, - "h": 19 - } - }, { "filename": "793s", "rotated": false, @@ -4560,14 +4140,161 @@ "h": 24 }, "frame": { - "x": 455, - "y": 228, + "x": 297, + "y": 246, "w": 21, "h": 24 } }, { - "filename": "2019", + "filename": "747s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 297, + "y": 270, + "w": 22, + "h": 20 + } + }, + { + "filename": "2074", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 13, + "w": 24, + "h": 15 + }, + "frame": { + "x": 231, + "y": 282, + "w": 24, + "h": 15 + } + }, + { + "filename": "2037", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 255, + "y": 282, + "w": 22, + "h": 21 + } + }, + { + "filename": "744", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 236, + "y": 297, + "w": 19, + "h": 22 + } + }, + { + "filename": "743s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 255, + "y": 303, + "w": 20, + "h": 22 + } + }, + { + "filename": "754", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 275, + "y": 303, + "w": 20, + "h": 22 + } + }, + { + "filename": "746s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 277, + "y": 290, + "w": 18, + "h": 13 + } + }, + { + "filename": "749", "rotated": false, "trimmed": true, "sourceSize": { @@ -4578,17 +4305,101 @@ "x": 10, "y": 5, "w": 21, - "h": 21 + "h": 23 }, "frame": { - "x": 476, - "y": 231, + "x": 295, + "y": 290, "w": 21, - "h": 21 + "h": 23 } }, { - "filename": "2019s", + "filename": "722", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 305, + "y": 156, + "w": 17, + "h": 18 + } + }, + { + "filename": "741-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 310, + "y": 174, + "w": 17, + "h": 23 + } + }, + { + "filename": "741s-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 310, + "y": 197, + "w": 17, + "h": 23 + } + }, + { + "filename": "737", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 18, + "h": 19 + }, + "frame": { + "x": 322, + "y": 155, + "w": 18, + "h": 19 + } + }, + { + "filename": "749s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4599,55 +4410,13 @@ "x": 10, "y": 5, "w": 21, - "h": 21 + "h": 23 }, "frame": { - "x": 287, - "y": 211, + "x": 327, + "y": 174, "w": 21, - "h": 21 - } - }, - { - "filename": "2052", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 308, - "y": 211, - "w": 21, - "h": 21 - } - }, - { - "filename": "2052s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 329, - "y": 211, - "w": 21, - "h": 21 + "h": 23 } }, { @@ -4665,8 +4434,8 @@ "h": 23 }, "frame": { - "x": 350, - "y": 211, + "x": 327, + "y": 197, "w": 21, "h": 23 } @@ -4686,75 +4455,12 @@ "h": 23 }, "frame": { - "x": 371, - "y": 212, + "x": 318, + "y": 220, "w": 21, "h": 23 } }, - { - "filename": "743s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 392, - "y": 212, - "w": 20, - "h": 22 - } - }, - { - "filename": "739", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 245, - "y": 213, - "w": 20, - "h": 21 - } - }, - { - "filename": "754", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 244, - "y": 234, - "w": 20, - "h": 22 - } - }, { "filename": "754s", "rotated": false, @@ -4770,12 +4476,33 @@ "h": 22 }, "frame": { - "x": 244, - "y": 256, + "x": 318, + "y": 243, "w": 20, "h": 22 } }, + { + "filename": "728", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 340, + "y": 154, + "w": 17, + "h": 20 + } + }, { "filename": "739s", "rotated": false, @@ -4791,14 +4518,14 @@ "h": 21 }, "frame": { - "x": 244, - "y": 278, + "x": 357, + "y": 153, "w": 20, "h": 21 } }, { - "filename": "2027s", + "filename": "789s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4807,19 +4534,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 10, - "w": 21, - "h": 18 + "y": 6, + "w": 23, + "h": 20 }, "frame": { - "x": 265, - "y": 217, - "w": 21, - "h": 18 + "x": 348, + "y": 174, + "w": 23, + "h": 20 } }, { - "filename": "744", + "filename": "2037s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4827,16 +4554,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 + "x": 10, + "y": 7, + "w": 22, + "h": 21 }, "frame": { - "x": 264, - "y": 235, - "w": 19, - "h": 22 + "x": 348, + "y": 194, + "w": 22, + "h": 21 } }, { @@ -4854,33 +4581,12 @@ "h": 22 }, "frame": { - "x": 264, - "y": 257, + "x": 377, + "y": 150, "w": 19, "h": 22 } }, - { - "filename": "741-pompom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 20 - }, - "frame": { - "x": 264, - "y": 279, - "w": 20, - "h": 20 - } - }, { "filename": "762", "rotated": false, @@ -4896,8 +4602,8 @@ "h": 23 }, "frame": { - "x": 246, - "y": 299, + "x": 319, + "y": 265, "w": 18, "h": 23 } @@ -4917,54 +4623,12 @@ "h": 23 }, "frame": { - "x": 264, - "y": 299, + "x": 339, + "y": 220, "w": 18, "h": 23 } }, - { - "filename": "741-sensu", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 283, - "y": 235, - "w": 17, - "h": 23 - } - }, - { - "filename": "728s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 283, - "y": 258, - "w": 17, - "h": 20 - } - }, { "filename": "741-pau", "rotated": false, @@ -4980,8 +4644,8 @@ "h": 22 }, "frame": { - "x": 300, - "y": 232, + "x": 338, + "y": 243, "w": 18, "h": 22 } @@ -5001,35 +4665,14 @@ "h": 22 }, "frame": { - "x": 318, - "y": 232, + "x": 337, + "y": 265, "w": 18, "h": 22 } }, { - "filename": "741s-pompom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 20 - }, - "frame": { - "x": 300, - "y": 254, - "w": 20, - "h": 20 - } - }, - { - "filename": "723s", + "filename": "723", "rotated": false, "trimmed": true, "sourceSize": { @@ -5043,14 +4686,14 @@ "h": 22 }, "frame": { - "x": 284, - "y": 278, + "x": 357, + "y": 215, "w": 17, "h": 22 } }, { - "filename": "741s-sensu", + "filename": "2074s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5058,20 +4701,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 + "x": 8, + "y": 13, + "w": 24, + "h": 15 }, "frame": { - "x": 282, - "y": 300, - "w": 17, - "h": 23 + "x": 397, + "y": 149, + "w": 24, + "h": 15 } }, { - "filename": "731", + "filename": "741-pompom", "rotated": false, "trimmed": true, "sourceSize": { @@ -5079,16 +4722,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, + "x": 10, + "y": 7, + "w": 20, + "h": 20 + }, + "frame": { + "x": 421, + "y": 151, + "w": 20, + "h": 20 + } + }, + { + "filename": "775", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, "y": 6, - "w": 17, - "h": 22 + "w": 21, + "h": 20 }, "frame": { - "x": 320, - "y": 254, - "w": 17, - "h": 22 + "x": 396, + "y": 164, + "w": 21, + "h": 20 } }, { @@ -5106,14 +4770,119 @@ "h": 20 }, "frame": { - "x": 301, - "y": 274, + "x": 377, + "y": 172, "w": 19, "h": 20 } }, { - "filename": "722s", + "filename": "775s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 21, + "h": 20 + }, + "frame": { + "x": 417, + "y": 171, + "w": 21, + "h": 20 + } + }, + { + "filename": "778-busted", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 396, + "y": 184, + "w": 21, + "h": 16 + } + }, + { + "filename": "778s-busted", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 417, + "y": 191, + "w": 21, + "h": 16 + } + }, + { + "filename": "779", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 441, + "y": 166, + "w": 21, + "h": 20 + } + }, + { + "filename": "2019", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 438, + "y": 186, + "w": 21, + "h": 21 + } + }, + { + "filename": "737s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5123,18 +4892,18 @@ "spriteSourceSize": { "x": 12, "y": 8, - "w": 17, - "h": 18 + "w": 18, + "h": 19 }, "frame": { - "x": 320, - "y": 276, - "w": 17, - "h": 18 + "x": 462, + "y": 172, + "w": 18, + "h": 19 } }, { - "filename": "753", + "filename": "779s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5142,20 +4911,125 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 480, + "y": 174, + "w": 21, + "h": 20 + } + }, + { + "filename": "790", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, "h": 19 }, "frame": { - "x": 336, - "y": 232, - "w": 14, + "x": 459, + "y": 191, + "w": 21, "h": 19 } }, { - "filename": "2088", + "filename": "790s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 480, + "y": 194, + "w": 21, + "h": 19 + } + }, + { + "filename": "2019s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 370, + "y": 194, + "w": 21, + "h": 21 + } + }, + { + "filename": "723s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 374, + "y": 215, + "w": 17, + "h": 22 + } + }, + { + "filename": "2052", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 391, + "y": 200, + "w": 21, + "h": 21 + } + }, + { + "filename": "2027", "rotated": false, "trimmed": true, "sourceSize": { @@ -5169,14 +5043,56 @@ "h": 18 }, "frame": { - "x": 350, - "y": 234, + "x": 391, + "y": 221, "w": 21, "h": 18 } }, { - "filename": "2088s", + "filename": "2052s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 412, + "y": 207, + "w": 21, + "h": 21 + } + }, + { + "filename": "741s-pompom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 20 + }, + "frame": { + "x": 433, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "filename": "2027s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5190,8 +5106,8 @@ "h": 18 }, "frame": { - "x": 371, - "y": 235, + "x": 412, + "y": 228, "w": 21, "h": 18 } @@ -5211,12 +5127,75 @@ "h": 20 }, "frame": { - "x": 392, - "y": 234, + "x": 433, + "y": 227, "w": 19, "h": 20 } }, + { + "filename": "2088", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 453, + "y": 210, + "w": 21, + "h": 18 + } + }, + { + "filename": "2088s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 452, + "y": 228, + "w": 21, + "h": 18 + } + }, + { + "filename": "757", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 18 + }, + "frame": { + "x": 474, + "y": 213, + "w": 19, + "h": 18 + } + }, { "filename": "757s", "rotated": false, @@ -5232,12 +5211,54 @@ "h": 18 }, "frame": { - "x": 301, - "y": 294, + "x": 473, + "y": 231, "w": 19, "h": 18 } }, + { + "filename": "731", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 316, + "y": 290, + "w": 17, + "h": 22 + } + }, + { + "filename": "771", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 316, + "y": 312, + "w": 18, + "h": 13 + } + }, { "filename": "731s", "rotated": false, @@ -5253,12 +5274,33 @@ "h": 22 }, "frame": { - "x": 320, - "y": 294, + "x": 333, + "y": 288, "w": 17, "h": 22 } }, + { + "filename": "736", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 334, + "y": 310, + "w": 17, + "h": 13 + } + }, { "filename": "778-disguised", "rotated": false, @@ -5274,8 +5316,8 @@ "h": 22 }, "frame": { - "x": 337, - "y": 252, + "x": 350, + "y": 287, "w": 17, "h": 22 } @@ -5295,54 +5337,12 @@ "h": 22 }, "frame": { - "x": 354, - "y": 252, + "x": 355, + "y": 265, "w": 17, "h": 22 } }, - { - "filename": "737", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 337, - "y": 274, - "w": 18, - "h": 19 - } - }, - { - "filename": "737s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 371, - "y": 253, - "w": 18, - "h": 19 - } - }, { "filename": "741", "rotated": false, @@ -5358,12 +5358,96 @@ "h": 19 }, "frame": { - "x": 337, - "y": 293, + "x": 356, + "y": 246, "w": 17, "h": 19 } }, + { + "filename": "728s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 373, + "y": 237, + "w": 17, + "h": 20 + } + }, + { + "filename": "722s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 390, + "y": 239, + "w": 17, + "h": 18 + } + }, + { + "filename": "736s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 351, + "y": 309, + "w": 17, + "h": 13 + } + }, + { + "filename": "771s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 373, + "y": 257, + "w": 18, + "h": 13 + } + }, { "filename": "741s", "rotated": false, @@ -5379,8 +5463,8 @@ "h": 19 }, "frame": { - "x": 355, - "y": 274, + "x": 372, + "y": 270, "w": 17, "h": 19 } @@ -5400,12 +5484,33 @@ "h": 19 }, "frame": { - "x": 354, - "y": 293, + "x": 367, + "y": 289, "w": 17, "h": 19 } }, + { + "filename": "808", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 368, + "y": 308, + "w": 17, + "h": 17 + } + }, { "filename": "759s", "rotated": false, @@ -5421,96 +5526,12 @@ "h": 19 }, "frame": { - "x": 372, - "y": 272, + "x": 391, + "y": 257, "w": 17, "h": 19 } }, - { - "filename": "777", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 389, - "y": 254, - "w": 17, - "h": 19 - } - }, - { - "filename": "774", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 389, - "y": 273, - "w": 17, - "h": 18 - } - }, - { - "filename": "774s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 389, - "y": 273, - "w": 17, - "h": 18 - } - }, - { - "filename": "753s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 406, - "y": 254, - "w": 14, - "h": 19 - } - }, { "filename": "774-blue", "rotated": false, @@ -5526,35 +5547,14 @@ "h": 18 }, "frame": { - "x": 406, - "y": 273, + "x": 389, + "y": 276, "w": 17, "h": 18 } }, { - "filename": "746s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 423, - "y": 231, - "w": 18, - "h": 13 - } - }, - { - "filename": "777s", + "filename": "777", "rotated": false, "trimmed": true, "sourceSize": { @@ -5568,54 +5568,12 @@ "h": 19 }, "frame": { - "x": 420, - "y": 244, + "x": 408, + "y": 246, "w": 17, "h": 19 } }, - { - "filename": "771", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 437, - "y": 244, - "w": 18, - "h": 13 - } - }, - { - "filename": "771s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 437, - "y": 257, - "w": 18, - "h": 13 - } - }, { "filename": "774-green", "rotated": false, @@ -5631,12 +5589,33 @@ "h": 18 }, "frame": { - "x": 455, - "y": 252, + "x": 408, + "y": 265, "w": 17, "h": 18 } }, + { + "filename": "777s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 425, + "y": 247, + "w": 17, + "h": 19 + } + }, { "filename": "774-indigo", "rotated": false, @@ -5652,14 +5631,14 @@ "h": 18 }, "frame": { - "x": 472, - "y": 252, + "x": 425, + "y": 266, "w": 17, "h": 18 } }, { - "filename": "736", + "filename": "751", "rotated": false, "trimmed": true, "sourceSize": { @@ -5667,37 +5646,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 + "x": 13, + "y": 8, + "w": 14, + "h": 20 }, "frame": { - "x": 372, - "y": 291, - "w": 17, - "h": 13 - } - }, - { - "filename": "736s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 - }, - "frame": { - "x": 389, - "y": 291, - "w": 17, - "h": 13 + "x": 442, + "y": 247, + "w": 14, + "h": 20 } }, { @@ -5715,8 +5673,8 @@ "h": 18 }, "frame": { - "x": 406, - "y": 291, + "x": 456, + "y": 246, "w": 17, "h": 18 } @@ -5736,12 +5694,33 @@ "h": 18 }, "frame": { - "x": 371, - "y": 304, + "x": 473, + "y": 249, "w": 17, "h": 18 } }, + { + "filename": "751s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 442, + "y": 267, + "w": 14, + "h": 20 + } + }, { "filename": "774-violet", "rotated": false, @@ -5757,8 +5736,8 @@ "h": 18 }, "frame": { - "x": 388, - "y": 304, + "x": 456, + "y": 264, "w": 17, "h": 18 } @@ -5778,8 +5757,29 @@ "h": 18 }, "frame": { - "x": 423, - "y": 270, + "x": 473, + "y": 267, + "w": 17, + "h": 18 + } + }, + { + "filename": "774", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 406, + "y": 283, "w": 17, "h": 18 } @@ -5800,32 +5800,11 @@ }, "frame": { "x": 423, - "y": 288, + "y": 284, "w": 17, "h": 18 } }, - { - "filename": "808", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 423, - "y": 306, - "w": 17, - "h": 17 - } - }, { "filename": "774s-green", "rotated": false, @@ -5842,11 +5821,32 @@ }, "frame": { "x": 440, - "y": 270, + "y": 287, "w": 17, "h": 18 } }, + { + "filename": "753", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 457, + "y": 282, + "w": 14, + "h": 19 + } + }, { "filename": "774s-indigo", "rotated": false, @@ -5862,14 +5862,14 @@ "h": 18 }, "frame": { - "x": 440, - "y": 288, + "x": 471, + "y": 285, "w": 17, "h": 18 } }, { - "filename": "808s", + "filename": "753s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5877,16 +5877,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 + "x": 14, + "y": 8, + "w": 14, + "h": 19 }, "frame": { - "x": 440, - "y": 306, - "w": 17, - "h": 17 + "x": 488, + "y": 285, + "w": 14, + "h": 19 } }, { @@ -5904,8 +5904,8 @@ "h": 18 }, "frame": { - "x": 457, - "y": 270, + "x": 385, + "y": 294, "w": 17, "h": 18 } @@ -5925,8 +5925,8 @@ "h": 18 }, "frame": { - "x": 457, - "y": 288, + "x": 402, + "y": 301, "w": 17, "h": 18 } @@ -5946,8 +5946,8 @@ "h": 18 }, "frame": { - "x": 474, - "y": 270, + "x": 419, + "y": 302, "w": 17, "h": 18 } @@ -5967,11 +5967,53 @@ "h": 18 }, "frame": { - "x": 474, - "y": 288, + "x": 436, + "y": 305, "w": 17, "h": 18 } + }, + { + "filename": "774s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 453, + "y": 305, + "w": 17, + "h": 18 + } + }, + { + "filename": "808s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 470, + "y": 303, + "w": 17, + "h": 17 + } } ] } @@ -5979,6 +6021,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a4de8d1c4f7d4f58c929b8b5479e03f1:3c8ac308e19a7f9420a4df8a78188490:2e7c5873ead8fd8fce82a0b3fcc86b42$" + "smartupdate": "$TexturePacker:SmartUpdate:5861cb99c3db0943f1ccef3b0e1b4683:26656a692718930d92be5b6aba391ced:2e7c5873ead8fd8fce82a0b3fcc86b42$" } } diff --git a/public/images/pokemon_icons_7.png b/public/images/pokemon_icons_7.png index c9a396ed5c60981ba160c14a52f169a6257bb2a5..5e6421360fdbbcfce36acf687bd3395ea46656c1 100644 GIT binary patch literal 51451 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 Date: Sun, 16 Feb 2025 05:34:10 +0100 Subject: [PATCH 17/24] [Bug][UI/UX] Setting proper labels in cost reduction dropdown filter #5316 --- src/ui/pokedex-ui-handler.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 9b54266b3ca..5180d7bd956 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -336,6 +336,8 @@ export default class PokedexUiHandler extends MessageUiHandler { const costReductionLabels = [ new DropDownLabel(i18next.t("filterBar:costReduction"), undefined, DropDownState.OFF), new DropDownLabel(i18next.t("filterBar:costReductionUnlocked"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockedOne"), undefined, DropDownState.ONE), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockedTwo"), undefined, DropDownState.TWO), new DropDownLabel(i18next.t("filterBar:costReductionUnlockable"), undefined, DropDownState.UNLOCKABLE), new DropDownLabel(i18next.t("filterBar:costReductionLocked"), undefined, DropDownState.EXCLUDE), ]; From ef11527b9acc12a49f679873d1cf40e5020f463b Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sun, 16 Feb 2025 16:07:07 -0500 Subject: [PATCH 18/24] Remove outdated Victini check for monogen challenge (#5309) --- src/data/challenge.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 10fb9c55d3d..b6d123ce933 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -456,8 +456,8 @@ export class SingleGenerationChallenge extends Challenge { } applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { - const baseGeneration = pokemon.species.speciesId === Species.VICTINI ? 5 : getPokemonSpecies(pokemon.species.speciesId).generation; - const fusionGeneration = pokemon.isFusion() ? pokemon.fusionSpecies?.speciesId === Species.VICTINI ? 5 : getPokemonSpecies(pokemon.fusionSpecies!.speciesId).generation : 0; // TODO: is the bang on fusionSpecies correct? + const baseGeneration = getPokemonSpecies(pokemon.species.speciesId).generation; + const fusionGeneration = pokemon.isFusion() ? getPokemonSpecies(pokemon.fusionSpecies!.speciesId).generation : 0; // TODO: is the bang on fusionSpecies correct? if (pokemon.isPlayer() && (baseGeneration !== this.value || (pokemon.isFusion() && fusionGeneration !== this.value))) { valid.value = false; return true; From 4bc617bd5fbb5a3ba57336ffb2d996963b4e8771 Mon Sep 17 00:00:00 2001 From: Kenneth West <45572572+KennethWest@users.noreply.github.com> Date: Sun, 16 Feb 2025 16:18:19 -0500 Subject: [PATCH 19/24] Fix [BUG] #5081 Wrong visual text when using priority moves on Psychic Terrain (#5091) * Fix [BUG] #5081 Wrong visual text when using priority moves on Psychic Terrain * Apply suggestions from code review for global scene change --- src/phases/move-phase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 9d32189edb5..73468dc1690 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -354,7 +354,7 @@ export class MovePhase extends BattlePhase { if (failureMessage) { failedText = failureMessage; } else if (failedDueToTerrain) { - failedText = getTerrainBlockMessage(this.pokemon, globalScene.arena.getTerrainType()); + failedText = getTerrainBlockMessage(targets[0], globalScene.arena.getTerrainType()); } this.showFailedText(failedText); From 90d32b886c772107b79945c513a0b603bcd824a5 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Mon, 17 Feb 2025 08:20:50 +1100 Subject: [PATCH 20/24] [Feature] Tera Rework (#5233) * Commit old stashed changes * Complete basic implementation of Tera * Fix effectiveness test * Make tera retain until forced recall or faint, regain on biome change * Experimental sparkle fix * Fix champion teras * Attempted fix for double battles tera UI bug * Fix the fix * Fix linting and test issues * Fix more tests * Change int type * Implement tera for ME trainers * Cleanup species inclusivity check * Make tera instant recharge if terapagos in party * Make useless tera shards not generate * Implement stellar tera damage boost * Improve tera selection UI * Tidy up animation and localisation * Improve tera button sprite * Fix Lance tera * Make tera instant recharge during E4 in classic modes. * Fix formatting in the tera common animation The animation was also not playing due to `frameTimedEvents` being missing as well. * Make tera effect start after animation * Implement save migration * Update version number for migration code --------- Co-authored-by: Madmadness65 Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> --- public/battle-anims/common-terastallize.json | 774 ++++++++++++++++++ public/images/battle_anims/terastallize.png | Bin 0 -> 2092 bytes public/images/ui/button_tera.json | 158 ++++ public/images/ui/button_tera.png | Bin 0 -> 6700 bytes public/images/ui/legacy/button_tera.json | 158 ++++ public/images/ui/legacy/button_tera.png | Bin 0 -> 6700 bytes src/battle-scene.ts | 25 +- src/battle.ts | 2 + src/data/ability.ts | 48 +- src/data/battle-anims.ts | 1 + src/data/battler-tags.ts | 2 +- src/data/move.ts | 66 +- .../global-trade-system-encounter.ts | 4 +- .../the-expert-pokemon-breeder-encounter.ts | 9 +- .../utils/encounter-phase-utils.ts | 10 + .../encounter-transformation-sequence.ts | 2 +- src/data/pokemon-forms.ts | 45 +- src/data/trainer-config.ts | 252 +++--- src/field/arena.ts | 2 + src/field/pokemon-sprite-sparkle-handler.ts | 3 + src/field/pokemon.ts | 109 ++- src/field/trainer.ts | 20 +- src/loading-scene.ts | 1 + src/modifier/modifier-type.ts | 79 +- src/modifier/modifier.ts | 104 +-- src/phases/command-phase.ts | 3 + src/phases/enemy-command-phase.ts | 4 + src/phases/evolution-phase.ts | 2 +- src/phases/faint-phase.ts | 2 + src/phases/move-effect-phase.ts | 6 + src/phases/party-heal-phase.ts | 1 + src/phases/quiet-form-change-phase.ts | 8 +- src/phases/tera-phase.ts | 51 ++ src/phases/turn-start-phase.ts | 15 + src/pipelines/sprite.ts | 2 +- src/system/arena-data.ts | 2 + src/system/game-data.ts | 2 + src/system/pokemon-data.ts | 9 + .../version_migration/version_converter.ts | 15 + .../version_migration/versions/v1_7_0.ts | 49 ++ src/test/abilities/libero.test.ts | 4 +- src/test/abilities/protean.test.ts | 4 +- src/test/moves/effectiveness.test.ts | 9 +- src/test/moves/freeze_dry.test.ts | 10 +- src/test/moves/tar_shot.test.ts | 7 +- src/test/moves/tera_blast.test.ts | 27 +- src/test/moves/tera_starstorm.test.ts | 11 +- src/ui/battle-info.ts | 6 +- src/ui/command-ui-handler.ts | 64 +- src/ui/fight-ui-handler.ts | 4 +- src/ui/run-info-ui-handler.ts | 23 - src/ui/summary-ui-handler.ts | 3 +- 52 files changed, 1784 insertions(+), 433 deletions(-) create mode 100644 public/battle-anims/common-terastallize.json create mode 100644 public/images/battle_anims/terastallize.png create mode 100644 public/images/ui/button_tera.json create mode 100644 public/images/ui/button_tera.png create mode 100644 public/images/ui/legacy/button_tera.json create mode 100644 public/images/ui/legacy/button_tera.png create mode 100644 src/phases/tera-phase.ts create mode 100644 src/system/version_migration/versions/v1_7_0.ts diff --git a/public/battle-anims/common-terastallize.json b/public/battle-anims/common-terastallize.json new file mode 100644 index 00000000000..3843464dbde --- /dev/null +++ b/public/battle-anims/common-terastallize.json @@ -0,0 +1,774 @@ +{ + "graphic": "terastallize", + "frames": [ + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 150, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 225, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 70, + "zoomY": 70, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 70, + "zoomY": 70, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 90, + "zoomY": 90, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 90, + "zoomY": 90, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 200, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 100, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 100, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 60, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 60, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 60, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 255, + 255, + 255, + 255 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 255, + 255, + 255, + 0 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 255, + 255, + 255, + 255 + ], + "locked": true, + "priority": 1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ] + ], + "frameTimedEvents": {}, + "position": 4, + "hue": 0 +} \ No newline at end of file diff --git a/public/images/battle_anims/terastallize.png b/public/images/battle_anims/terastallize.png new file mode 100644 index 0000000000000000000000000000000000000000..78fbb7ec33506e0318de050424d429e8bc428314 GIT binary patch literal 2092 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 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/button_tera.json b/public/images/ui/legacy/button_tera.json new file mode 100644 index 00000000000..7b64db66ae6 --- /dev/null +++ b/public/images/ui/legacy/button_tera.json @@ -0,0 +1,158 @@ +{ "frames": { + "unknown": { + "frame": { "x": 0, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "bug": { + "frame": { "x": 18, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "dark": { + "frame": { "x": 36, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "dragon": { + "frame": { "x": 54, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "electric": { + "frame": { "x": 72, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fairy": { + "frame": { "x": 0, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fighting": { + "frame": { "x": 18, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fire": { + "frame": { "x": 36, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "flying": { + "frame": { "x": 54, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ghost": { + "frame": { "x": 72, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "grass": { + "frame": { "x": 0, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ground": { + "frame": { "x": 18, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ice": { + "frame": { "x": 36, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "normal": { + "frame": { "x": 54, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "poison": { + "frame": { "x": 72, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "psychic": { + "frame": { "x": 0, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "rock": { + "frame": { "x": 18, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "steel": { + "frame": { "x": 36, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "water": { + "frame": { "x": 54, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "stellar": { + "frame": { "x": 72, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "button_tera.png", + "format": "RGBA8888", + "size": { "w": 90, "h": 84 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Sprite Sheet", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } +} diff --git a/public/images/ui/legacy/button_tera.png b/public/images/ui/legacy/button_tera.png new file mode 100644 index 0000000000000000000000000000000000000000..c9672bafa39be1077386d05e922bdc2683dc53d1 GIT binary patch literal 6700 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 literal 0 HcmV?d00001 diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 3f285c274af..4033f44eacb 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -9,7 +9,7 @@ import type { Constructor } from "#app/utils"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import * as Utils from "#app/utils"; import type { Modifier, ModifierPredicate, TurnHeldItemTransferModifier } from "./modifier/modifier"; -import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, ExpBalanceModifier, ExpShareModifier, FusePokemonModifier, HealingBoosterModifier, ModifierBar, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, RememberMoveModifier, TerastallizeModifier } from "./modifier/modifier"; +import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, ExpBalanceModifier, ExpShareModifier, FusePokemonModifier, HealingBoosterModifier, ModifierBar, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, RememberMoveModifier } from "./modifier/modifier"; import { PokeballType } from "#enums/pokeball"; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "#app/data/battle-anims"; import type { Phase } from "#app/phase"; @@ -1373,7 +1373,11 @@ export default class BattleScene extends SceneBase { for (const pokemon of this.getPlayerParty()) { pokemon.resetBattleData(); + pokemon.resetTera(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); + if (pokemon.hasSpecies(Species.TERAPAGOS) || (this.gameMode.isClassic && this.currentBattle.waveIndex > 180 && this.currentBattle.waveIndex <= 190)) { + this.arena.playerTerasUsed = 0; + } } if (!this.trainer.visible) { @@ -1658,7 +1662,7 @@ export default class BattleScene extends SceneBase { } initPokemonSprite(sprite: Phaser.GameObjects.Sprite, pokemon?: Pokemon, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { - sprite.setPipeline(this.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: hasShadow, ignoreOverride: ignoreOverride, teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined }); + sprite.setPipeline(this.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: hasShadow, ignoreOverride: ignoreOverride, teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined, isTerastallized: pokemon ? pokemon.isTerastallized : false }); this.spriteSparkleHandler.add(sprite); return sprite; } @@ -2589,11 +2593,8 @@ export default class BattleScene extends SceneBase { const modifiersToRemove: PersistentModifier[] = []; const modifierPromises: Promise[] = []; if (modifier instanceof PersistentModifier) { - if (modifier instanceof TerastallizeModifier) { - modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId))); - } if ((modifier as PersistentModifier).add(this.modifiers, !!virtual)) { - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + if (modifier instanceof PokemonFormChangeItemModifier) { const pokemon = this.getPokemonById(modifier.pokemonId); if (pokemon) { success = modifier.apply(pokemon, true); @@ -2670,11 +2671,8 @@ export default class BattleScene extends SceneBase { addEnemyModifier(modifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { return new Promise(resolve => { const modifiersToRemove: PersistentModifier[] = []; - if (modifier instanceof TerastallizeModifier) { - modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId, false))); - } if ((modifier as PersistentModifier).add(this.enemyModifiers, false)) { - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + if (modifier instanceof PokemonFormChangeItemModifier) { const pokemon = this.getPokemonById(modifier.pokemonId); if (pokemon) { modifier.apply(pokemon, true); @@ -2798,6 +2796,8 @@ export default class BattleScene extends SceneBase { for (const modifier of modifiers) { this.addEnemyModifier(modifier, true, true); } + + this.currentBattle.trainer.genAI(party); } party.forEach((enemyPokemon: EnemyPokemon, i: number) => { @@ -2929,7 +2929,7 @@ export default class BattleScene extends SceneBase { const modifierIndex = modifiers.indexOf(modifier); if (modifierIndex > -1) { modifiers.splice(modifierIndex, 1); - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + if (modifier instanceof PokemonFormChangeItemModifier) { const pokemon = this.getPokemonById(modifier.pokemonId); if (pokemon) { modifier.apply(pokemon, false); @@ -3130,7 +3130,8 @@ export default class BattleScene extends SceneBase { name: p.name, form: p.getFormKey(), types: p.getTypes().map((type) => Type[type]), - teraType: p.getTeraType() !== Type.UNKNOWN ? Type[p.getTeraType()] : "", + teraType: Type[p.getTeraType()], + isTerastallized: p.isTerastallized, level: p.level, currentHP: p.hp, maxHP: p.getMaxHp(), diff --git a/src/battle.ts b/src/battle.ts index 7ede7b2982e..807ac215ea8 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -92,6 +92,7 @@ export default class Battle { public started: boolean = false; public enemySwitchCounter: number = 0; public turn: number = 0; + public preTurnCommands: TurnCommands; public turnCommands: TurnCommands; public playerParticipantIds: Set = new Set(); public battleScore: number = 0; @@ -180,6 +181,7 @@ export default class Battle { incrementTurn(): void { this.turn++; this.turnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [ bt, null ])); + this.preTurnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [ bt, null ])); this.battleSeedState = null; } diff --git a/src/data/ability.ts b/src/data/ability.ts index e5b674d4fb4..6ba5f685acd 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -239,37 +239,25 @@ export class PostBattleInitFormChangeAbAttr extends PostBattleInitAbAttr { } } -export class PostBattleInitStatStageChangeAbAttr extends PostBattleInitAbAttr { +export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { private stats: BattleStat[]; private stages: number; - private selfTarget: boolean; - constructor(stats: BattleStat[], stages: number, selfTarget?: boolean) { + constructor(stats: BattleStat[], stages: number) { super(); this.stats = stats; this.stages = stages; - this.selfTarget = !!selfTarget; } - applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { const statStageChangePhases: StatStageChangePhase[] = []; if (!simulated) { - if (this.selfTarget) { - statStageChangePhases.push(new StatStageChangePhase(pokemon.getBattlerIndex(), true, this.stats, this.stages)); - } else { - for (const opponent of pokemon.getOpponents()) { - statStageChangePhases.push(new StatStageChangePhase(opponent.getBattlerIndex(), false, this.stats, this.stages)); - } - } + statStageChangePhases.push(new StatStageChangePhase(pokemon.getBattlerIndex(), true, this.stats, this.stages)); for (const statStageChangePhase of statStageChangePhases) { - if (!this.selfTarget && !statStageChangePhase.getPokemon()?.summonData) { - globalScene.pushPhase(statStageChangePhase); - } else { // TODO: This causes the ability bar to be shown at the wrong time - globalScene.unshiftPhase(statStageChangePhase); - } + globalScene.unshiftPhase(statStageChangePhase); } } @@ -1307,7 +1295,7 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { if ( - !pokemon.isTerastallized() && + !pokemon.isTerastallized && move.id !== Moves.STRUGGLE && /** * Skip moves that call other moves because these moves generate a following move that will trigger this ability attribute @@ -4788,7 +4776,7 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { } override apply(pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, _args: any[]): boolean { - if (pokemon.isTerastallized()) { + if (pokemon.isTerastallized) { return false; } const currentTerrain = globalScene.arena.getTerrainType(); @@ -6201,7 +6189,7 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) .attr(NoFusionAbilityAbAttr) - .condition((pokemon) => !pokemon.isTerastallized()), + .condition((pokemon) => !pokemon.isTerastallized), new Ability(Abilities.QUICK_DRAW, 8) .attr(BypassSpeedChanceAbAttr, 30), new Ability(Abilities.UNSEEN_FIST, 8) @@ -6353,29 +6341,25 @@ export function initAbilities() { new Ability(Abilities.TOXIC_CHAIN, 9) .attr(PostAttackApplyStatusEffectAbAttr, false, 30, StatusEffect.TOXIC), new Ability(Abilities.EMBODY_ASPECT_TEAL, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.SPD ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.SPD ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.EMBODY_ASPECT_WELLSPRING, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.SPDEF ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.SPDEF ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.EMBODY_ASPECT_HEARTHFLAME, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.ATK ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.ATK ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.EMBODY_ASPECT_CORNERSTONE, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.DEF ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.DEF ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.TERA_SHIFT, 9) .attr(PostSummonFormChangeAbAttr, p => p.getFormKey() ? 0 : 1) .attr(UncopiableAbilityAbAttr) diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 99e9e82d4a6..a179f3a3e9b 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -56,6 +56,7 @@ export enum ChargeAnim { export enum CommonAnim { USE_ITEM = 2000, HEALTH_UP, + TERASTALLIZE, POISON = 2010, TOXIC, PARALYSIS, diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 91ab10aecfa..b97be756048 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2485,7 +2485,7 @@ export class TarShotTag extends BattlerTag { * @returns whether the tag is applied */ override canAdd(pokemon: Pokemon): boolean { - return !pokemon.isTerastallized(); + return !pokemon.isTerastallized; } override onAdd(pokemon: Pokemon): void { diff --git a/src/data/move.ts b/src/data/move.ts index cc22f582790..7e504e87667 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -791,7 +791,7 @@ export default class Move implements Localizable { applyPreAttackAbAttrs(MoveTypeChangeAbAttr, source, target, this, true, null, typeChangeMovePowerMultiplier); const sourceTeraType = source.getTeraType(); - if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === this.type && power.value < 60 && this.priority <= 0 && !this.hasAttr(MultiHitAttr) && !globalScene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { + if (source.isTerastallized && sourceTeraType === this.type && power.value < 60 && this.priority <= 0 && !this.hasAttr(MultiHitAttr) && !globalScene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { power.value = 60; } @@ -4634,7 +4634,7 @@ export class TeraMoveCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const category = (args[0] as Utils.NumberHolder); - if (user.isTerastallized() && user.getEffectiveStat(Stat.ATK, target, move, true, true, false, false, true) > + if (user.isTerastallized && user.getEffectiveStat(Stat.ATK, target, move, true, true, false, false, true) > user.getEffectiveStat(Stat.SPATK, target, move, true, true, false, false, true)) { category.value = MoveCategory.PHYSICAL; return true; @@ -4662,7 +4662,7 @@ export class TeraBlastPowerAttr extends VariablePowerAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const power = args[0] as Utils.NumberHolder; - if (user.isTerastallized() && user.getTeraType() === Type.STELLAR) { + if (user.isTerastallized && user.getTeraType() === Type.STELLAR) { power.value = 100; return true; } @@ -4720,30 +4720,6 @@ export class VariableMoveTypeAttr extends MoveAttr { } } -/** - * Attribute used for Tera Starstorm that changes the move type to Stellar - * @extends VariableMoveTypeAttr - */ -export class TeraStarstormTypeAttr extends VariableMoveTypeAttr { - /** - * - * @param user the {@linkcode Pokemon} using the move - * @param target n/a - * @param move n/a - * @param args[0] {@linkcode Utils.NumberHolder} the move type - * @returns `true` if the move type is changed to {@linkcode Type.STELLAR}, `false` otherwise - */ - override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (user.isTerastallized() && (user.hasFusionSpecies(Species.TERAPAGOS) || user.species.speciesId === Species.TERAPAGOS)) { - const moveType = args[0] as Utils.NumberHolder; - - moveType.value = Type.STELLAR; - return true; - } - return false; - } -} - export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveType = args[0]; @@ -5009,7 +4985,7 @@ export class TeraBlastTypeAttr extends VariableMoveTypeAttr { return false; } - if (user.isTerastallized()) { + if (user.isTerastallized) { moveType.value = user.getTeraType(); // changes move type to tera type return true; } @@ -5018,6 +4994,30 @@ export class TeraBlastTypeAttr extends VariableMoveTypeAttr { } } +/** + * Attribute used for Tera Starstorm that changes the move type to Stellar + * @extends VariableMoveTypeAttr + */ +export class TeraStarstormTypeAttr extends VariableMoveTypeAttr { + /** + * + * @param user the {@linkcode Pokemon} using the move + * @param target n/a + * @param move n/a + * @param args[0] {@linkcode Utils.NumberHolder} the move type + * @returns `true` if the move type is changed to {@linkcode Type.STELLAR}, `false` otherwise + */ + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (user.isTerastallized && user.hasSpecies(Species.TERAPAGOS)) { + const moveType = args[0] as Utils.NumberHolder; + + moveType.value = Type.STELLAR; + return true; + } + return false; + } +} + export class MatchUserTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveType = args[0]; @@ -6345,7 +6345,7 @@ export class RemoveTypeAttr extends MoveEffectAttr { return false; } - if (user.isTerastallized() && user.getTeraType() === this.removedType) { // active tera types cannot be removed + if (user.isTerastallized && user.getTeraType() === this.removedType) { // active tera types cannot be removed return false; } @@ -6525,7 +6525,7 @@ export class ChangeTypeAttr extends MoveEffectAttr { } getCondition(): MoveConditionFunc { - return (user, target, move) => !target.isTerastallized() && !target.hasAbility(Abilities.MULTITYPE) && !target.hasAbility(Abilities.RKS_SYSTEM) && !(target.getTypes().length === 1 && target.getTypes()[0] === this.type); + return (user, target, move) => !target.isTerastallized && !target.hasAbility(Abilities.MULTITYPE) && !target.hasAbility(Abilities.RKS_SYSTEM) && !(target.getTypes().length === 1 && target.getTypes()[0] === this.type); } } @@ -6548,7 +6548,7 @@ export class AddTypeAttr extends MoveEffectAttr { } getCondition(): MoveConditionFunc { - return (user, target, move) => !target.isTerastallized() && !target.getTypes().includes(this.type); + return (user, target, move) => !target.isTerastallized && !target.getTypes().includes(this.type); } } @@ -11076,7 +11076,7 @@ export function initMoves() { .attr(TeraMoveCategoryAttr) .attr(TeraBlastTypeAttr) .attr(TeraBlastPowerAttr) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR) }), + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized && user.isOfType(Type.STELLAR) }), new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9) .attr(ProtectAttr, BattlerTagType.SILK_TRAP) .condition(failIfLastCondition), @@ -11271,7 +11271,7 @@ export function initMoves() { new AttackMove(Moves.TERA_STARSTORM, Type.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(TeraMoveCategoryAttr) .attr(TeraStarstormTypeAttr) - .attr(VariableTargetAttr, (user, target, move) => (user.hasFusionSpecies(Species.TERAPAGOS) || user.species.speciesId === Species.TERAPAGOS) && user.isTerastallized() ? MoveTarget.ALL_NEAR_ENEMIES : MoveTarget.NEAR_OTHER) + .attr(VariableTargetAttr, (user, target, move) => user.hasSpecies(Species.TERAPAGOS) && user.isTerastallized ? MoveTarget.ALL_NEAR_ENEMIES : MoveTarget.NEAR_OTHER) .partial(), /** Does not ignore abilities that affect stats, relevant in determining the move's category {@see TeraMoveCategoryAttr} */ new AttackMove(Moves.FICKLE_BEAM, Type.DRAGON, MoveCategory.SPECIAL, 80, 100, 5, 30, 0, 9) .attr(PreMoveMessageAttr, doublePowerChanceMessageFunc) diff --git a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts index 65bbab16603..f494aaf2c28 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -594,7 +594,7 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()) }); + sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()), isTerastallized: tradedPokemon.isTerastallized }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", tradedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", tradedPokemon.shiny); @@ -615,7 +615,7 @@ function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: P console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()) }); + sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()), isTerastallized: tradedPokemon.isTerastallized }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", receivedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", receivedPokemon.shiny); 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 2f5843e39d2..a4e80c158bb 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 @@ -1,5 +1,5 @@ import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { generateModifierType, handleMysteryEncounterBattleFailed, initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { handleMysteryEncounterBattleFailed, initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { trainerConfigs } from "#app/data/trainer-config"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { globalScene } from "#app/global-scene"; @@ -23,7 +23,6 @@ import { EggSourceType } from "#enums/egg-source-types"; import { EggTier } from "#enums/egg-type"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type"; import { Type } from "#enums/type"; import { getPokeballTintColor } from "#app/data/pokeball"; @@ -387,11 +386,7 @@ function getPartyConfig(): EnemyPartyConfig { nature: Nature.ADAMANT, moveSet: [ Moves.METEOR_MASH, Moves.FIRE_PUNCH, Moves.ICE_PUNCH, Moves.THUNDER_PUNCH ], ivs: [ 31, 31, 31, 31, 31, 31 ], - modifierConfigs: [ - { - modifier: generateModifierType(modifierTypes.TERA_SHARD, [ Type.STEEL ]) as PokemonHeldItemModifierType, - } - ] + tera: Type.STEEL, } ] }; diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 351b969b1a8..d745da5ecb3 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -46,6 +46,7 @@ import type { Variant } from "#app/data/variant"; import { StatusEffect } from "#enums/status-effect"; import { globalScene } from "#app/global-scene"; import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Type } from "#app/enums/type"; /** * Animates exclamation sprite over trainer's head at start of encounter @@ -98,6 +99,7 @@ export interface EnemyPokemonConfig { modifierConfigs?: HeldModifierConfig[]; tags?: BattlerTagType[]; dataSource?: PokemonData; + tera?: Type; aiType?: AiType; } @@ -329,6 +331,14 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): tags.forEach(tag => enemyPokemon.addTag(tag)); } + // Set tera + if (config.tera && config.tera !== Type.UNKNOWN) { + enemyPokemon.teraType = config.tera; + if (battle.trainer) { + battle.trainer.config.setInstantTera(e); + } + } + // mysteryEncounterBattleEffects will only be used IFF MYSTERY_ENCOUNTER_POST_SUMMON tag is applied if (config.mysteryEncounterBattleEffects) { enemyPokemon.mysteryEncounterBattleEffects = config.mysteryEncounterBattleEffects; diff --git a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts index d4ae3496b0c..0cb2a695de8 100644 --- a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts +++ b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts @@ -61,7 +61,7 @@ export function doPokemonTransformationSequence(previousPokemon: PlayerPokemon, console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(previousPokemon.getTeraType()) }); + sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(previousPokemon.getTeraType()), isTerastallized: previousPokemon.isTerastallized }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", previousPokemon.getSpriteKey()); sprite.setPipelineData("shiny", previousPokemon.shiny); diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 0226aef79d1..46dfbfecae2 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -1,8 +1,7 @@ -import { PokemonFormChangeItemModifier, TerastallizeModifier } from "../modifier/modifier"; +import { PokemonFormChangeItemModifier } from "../modifier/modifier"; import type Pokemon from "../field/pokemon"; import { StatusEffect } from "#enums/status-effect"; import { MoveCategory, allMoves } from "./move"; -import { Type } from "#enums/type"; import type { Constructor, nil } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -399,23 +398,7 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger { * @extends SpeciesFormChangeTrigger */ export class SpeciesFormChangeTeraTrigger extends SpeciesFormChangeTrigger { - /** The Tera type that triggers the form change */ - private teraType: Type; - - constructor(teraType: Type) { - super(); - this.teraType = teraType; - this.description = i18next.t("pokemonEvolutions:Forms.tera", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); - } - - /** - * Checks if the associated Pokémon has the required Tera Shard that matches with the associated Tera type. - * @param {Pokemon} pokemon the Pokémon that is trying to do the form change - * @returns `true` if the Pokémon can change forms, `false` otherwise - */ - canChange(pokemon: Pokemon): boolean { - return !!globalScene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id && m.teraType === this.teraType); - } + description = i18next.t("pokemonEvolutions:Forms.tera" ); } /** @@ -425,10 +408,6 @@ export class SpeciesFormChangeTeraTrigger extends SpeciesFormChangeTrigger { */ export class SpeciesFormChangeLapseTeraTrigger extends SpeciesFormChangeTrigger { description = i18next.t("pokemonEvolutions:Forms.teraLapse"); - - canChange(pokemon: Pokemon): boolean { - return !!globalScene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id); - } } /** @@ -992,19 +971,19 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.OGERPON, "teal-mask", "wellspring-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.WELLSPRING_MASK)), new SpeciesFormChange(Species.OGERPON, "teal-mask", "hearthflame-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.HEARTHFLAME_MASK)), new SpeciesFormChange(Species.OGERPON, "teal-mask", "cornerstone-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.CORNERSTONE_MASK)), - new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeTeraTrigger(Type.GRASS)), - new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.GRASS)), - new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeTeraTrigger(Type.WATER)), - new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.WATER)), - new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeTeraTrigger(Type.FIRE)), - new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.FIRE)), - new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeTeraTrigger(Type.ROCK)), - new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.ROCK)) + new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeLapseTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeLapseTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeLapseTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeLapseTeraTrigger(), true) ], [Species.TERAPAGOS]: [ new SpeciesFormChange(Species.TERAPAGOS, "", "terastal", new SpeciesFormChangeAbilityTrigger(), true), - new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeTeraTrigger(Type.STELLAR)), - new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.STELLAR)) + new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeLapseTeraTrigger(), true) ], [Species.GALAR_DARMANITAN]: [ new SpeciesFormChange(Species.GALAR_DARMANITAN, "", "zen", new SpeciesFormChangeAbilityTrigger(), true), diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 564518845dc..9cbec400a87 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -175,11 +175,51 @@ export const trainerPartyTemplates = { type PartyTemplateFunc = () => TrainerPartyTemplate; type PartyMemberFunc = (level: number, strength: PartyMemberStrength) => EnemyPokemon; type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[]; +type GenAIFunc = (party: EnemyPokemon[]) => void; export interface PartyMemberFuncs { [key: number]: PartyMemberFunc } +export enum TeraAIMode { + NO_TERA, + INSTANT_TERA, + SMART_TERA +} + +/** + * Stores data and helper functions about a trainers AI options. + */ +export class TrainerAI { + public teraMode: TeraAIMode = TeraAIMode.NO_TERA; + public instantTeras: number[]; + + /** + * @param canTerastallize Whether this trainer is allowed to tera + */ + constructor(teraMode: TeraAIMode = TeraAIMode.NO_TERA) { + this.teraMode = teraMode; + this.instantTeras = []; + } + + /** + * Checks if a trainer can tera + * @returns Whether this trainer can currently tera + */ + public canTerastallize() { + return this.teraMode !== TeraAIMode.NO_TERA; + } + + /** + * Sets a pokemon on this AI to just instantly tera on first move used + * @param index The index of the pokemon to instantly tera + */ + public setInstantTera(index: number) { + this.teraMode = TeraAIMode.INSTANT_TERA; + this.instantTeras.push(index); + } +} + export class TrainerConfig { public trainerType: TrainerType; public trainerTypeDouble: TrainerType; @@ -203,6 +243,7 @@ export class TrainerConfig { public doubleEncounterBgm: string; public victoryBgm: string; public genModifiersFunc: GenModifiersFunc; + public genAIFuncs: GenAIFunc[] = []; public modifierRewardFuncs: ModifierTypeFunc[] = []; public partyTemplates: TrainerPartyTemplate[]; public partyTemplateFunc: PartyTemplateFunc; @@ -212,6 +253,7 @@ export class TrainerConfig { public speciesFilter: PokemonSpeciesFilter; public specialtyTypes: Type[] = []; public hasVoucher: boolean = false; + public trainerAI: TrainerAI; public encounterMessages: string[] = []; public victoryMessages: string[] = []; @@ -227,6 +269,7 @@ export class TrainerConfig { constructor(trainerType: TrainerType, allowLegendaries?: boolean) { this.trainerType = trainerType; + this.trainerAI = new TrainerAI(); this.name = Utils.toReadableString(TrainerType[this.getDerivedType()]); this.battleBgm = "battle_trainer"; this.mixedBattleBgm = "battle_trainer"; @@ -550,6 +593,47 @@ export class TrainerConfig { return this; } + /** + * Sets random pokemon from the trainers team to instant tera. Uses their specialty types is they have one. + * @param count The amount of pokemon to have instant tera + * @returns this + */ + setRandomTeraModifiers(count: () => integer): TrainerConfig { + this.genAIFuncs.push((party: EnemyPokemon[]) => { + const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); + for (let t = 0; t < Math.min(count(), party.length); t++) { + const randomIndex = Utils.randSeedItem(partyMemberIndexes); + partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); + if (this.specialtyTypes?.length) { + party[randomIndex].teraType = Utils.randSeedItem(this.specialtyTypes); + } + this.trainerAI.setInstantTera(randomIndex); + } + }); + return this; + } + + /** + * Sets a specific pokemon to instant tera + * @param index The index within the team to have instant tera + * @returns this + */ + setInstantTera(index: number): TrainerConfig { + this.trainerAI.setInstantTera(index); + return this; + } + + // function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: Type[]): PersistentModifier[] { + // const ret: PersistentModifier[] = []; + // const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); + // for (let t = 0; t < Math.min(count, party.length); t++) { + // const randomIndex = Utils.randSeedItem(partyMemberIndexes); + // partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); + // ret.push(modifierTypes.TERA_SHARD().generateType([], [ Utils.randSeedItem(types ? types : party[randomIndex].getTypes()) ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); // TODO: is the bang correct? + // } + // return ret; + // } + setEventModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { this.eventRewardFuncs = modifierTypeFuncs.map(func => () => { const modifierTypeFunc = func(); @@ -851,10 +935,7 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_gym"); this.setVictoryBgm("victory_gym"); - this.setGenModifiersFunc(party => { - const waveIndex = globalScene.currentBattle.waveIndex; - return getRandomTeraModifiers(party, waveIndex >= 100 ? 1 : 0, specialtyTypes.length ? specialtyTypes : undefined); - }); + this.setRandomTeraModifiers(() => globalScene.currentBattle.waveIndex >= 100 ? 1 : 0); return this; } @@ -910,7 +991,7 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_elite"); this.setVictoryBgm("victory_gym"); - this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 1, specialtyTypes.length ? specialtyTypes : undefined)); + this.setRandomTeraModifiers(() => 1); return this; } @@ -1197,16 +1278,6 @@ function getSpeciesFilterRandomPartyMemberFunc( }; } -function getRandomTeraModifiers(party: EnemyPokemon[], count: number, types?: Type[]): PersistentModifier[] { - const ret: PersistentModifier[] = []; - const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); - for (let t = 0; t < Math.min(count, party.length); t++) { - const randomIndex = Utils.randSeedItem(partyMemberIndexes); - partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); - ret.push(modifierTypes.TERA_SHARD().generateType([], [ Utils.randSeedItem(types ? types : party[randomIndex].getTypes()) ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); // TODO: is the bang correct? - } - return ret; -} type SignatureSpecies = { [key in string]: (Species | Species[])[]; @@ -1747,10 +1818,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.RED]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PIKACHU ], TrainerSlot.TRAINER, true, p => { p.formIndex = 8; // G-Max Pikachu @@ -1774,10 +1842,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS, Species.KINGDRA ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AERODACTYL ])) @@ -1787,16 +1852,15 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CHARIZARD ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.GARCHOMP, Species.KOMMO_O ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.GARCHOMP, Species.KOMMO_O ], TrainerSlot.TRAINER, true, p => { + p.teraType = p.species.type1; + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DRAGONITE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SKARMORY ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CRADILY, Species.ARMALDO ])) @@ -1814,10 +1878,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { p.abilityIndex = 1; // Drizzle @@ -1840,10 +1901,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(false).setBattleBgm("battle_sinnoh_champion").setMixedBattleBgm("battle_sinnoh_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SPIRITOMB ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1853,7 +1911,9 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MILOTIC, Species.ROSERADE, Species.HISUI_ARCANINE ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MILOTIC, Species.ROSERADE, Species.HISUI_ARCANINE ], TrainerSlot.TRAINER, true, p => { + p.teraType = p.species.type1; + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TOGEKISS ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.setBoss(true, 2); @@ -1864,10 +1924,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.FEMALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(true).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder").setMixedBattleBgm("battle_champion_alder") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BOUFFALANT, Species.BRAVIARY ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HISUI_LILLIGANT, Species.HISUI_ZOROARK, Species.BASCULEGION ], TrainerSlot.TRAINER, true, p => { @@ -1882,16 +1939,15 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CHANDELURE, Species.KROOKODILE, Species.REUNICLUS, Species.CONKELDURR ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CHANDELURE, Species.KROOKODILE, Species.REUNICLUS, Species.CONKELDURR ], TrainerSlot.TRAINER, true, p => { + p.teraType = p.species.speciesId === Species.KROOKODILE ? Type.DARK : p.species.type1; + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.VOLCARONA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const pokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ pokemon.species.speciesId === Species.KROOKODILE ? pokemon.species.type2 : pokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(pokemon) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(false).setBattleBgm("battle_champion_iris").setMixedBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.DRUDDIGON ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ARCHEOPS ])) @@ -1899,7 +1955,9 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.HYDREIGON, Species.ARCHALUDON ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.HYDREIGON, Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { + p.teraType = Type.DRAGON; + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.LAPRAS ], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // G-Max Lapras p.generateAndPopulateMoveset(); @@ -1911,10 +1969,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ Type.DRAGON ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_kalos_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.HAWLUCHA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1927,6 +1982,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TYRANTRUM, Species.AURORUS ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 2; // Rock Head Tyrantrum, Snow Warning Aurorus + p.teraType = p.species.speciesId === Species.TYRANTRUM ? Type.DRAGON : Type.ICE; })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GOODRA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1938,10 +1994,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.FEMALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type2 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.KUKUI]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_champion_kukui") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1965,11 +2018,9 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.INCINEROAR, Species.HISUI_DECIDUEYE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; + p.teraType = p.species.speciesId === Species.INCINEROAR ? Type.DARK : Type.FIGHTING; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[5]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type2 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(5), [TrainerType.HAU]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_alola_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALOLA_RAICHU ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1982,6 +2033,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TAPU_LELE, Species.TAPU_BULU ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; + p.teraType = p.species.type1; })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ZYGARDE ], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // Zygarde 10% forme, Aura Break @@ -1993,10 +2045,7 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); p.gender = p.species.speciesId === Species.PRIMARINA ? Gender.FEMALE : Gender.MALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.LEON]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_galar_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AEGISLASH ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2017,10 +2066,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[3]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(3), [TrainerType.MUSTARD]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_mustard") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2033,6 +2079,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; + p.teraType = Type.PSYCHIC; })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALAR_DARMANITAN ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2050,10 +2097,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; p.pokeball = PokeballType.ULTRA_BALL; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[2]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type2 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(2), [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_champion_geeta") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GLIMMORA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2070,11 +2114,9 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KINGAMBIT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 1; // Supreme Overlord + p.teraType = Type.FLYING; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[5]; - return [ modifierTypes.TERA_SHARD().generateType([], [ Type.FLYING ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(5), [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_champion_nemona") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => { p.formIndex = 0; // Midday form @@ -2086,16 +2128,15 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.MASTER_BALL; })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GHOLDENGO ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ARMAROUGE, Species.CERULEDGE ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ARMAROUGE, Species.CERULEDGE ], TrainerSlot.TRAINER, true, p => { + p.teraType = p.species.speciesId === Species.ARMAROUGE ? Type.PSYCHIC : Type.GHOST; + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type2 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_champion_kieran") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.POLIWRATH, Species.POLITOED ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2117,7 +2158,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.OGERPON ], TrainerSlot.TRAINER, true, p => { - p.formIndex = Utils.randSeedInt(4, 4); // Random Ogerpon Tera Mask + p.formIndex = Utils.randSeedInt(4); // Random Ogerpon Tera Mask p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.IVY_CUDGEL)) { // Check if Ivy Cudgel is in the moveset, if not, replace the first move with Ivy Cudgel. @@ -2129,17 +2170,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setGenModifiersFunc(party => { - const starter = party[4]; - let teraShardType: Type; - const pokemonType2 = starter.species.forms[starter.formIndex].type2; - if (starter.formIndex === 4 || Utils.isNullOrUndefined(pokemonType2)) { - teraShardType = starter.species.type1; - } else { - teraShardType = pokemonType2; - } - return [ modifierTypes.TERA_SHARD().generateType([], [ teraShardType ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; - }), + .setInstantTera(4), [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL) .setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE) @@ -2162,19 +2193,20 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesFilter(species => species.baseTotal >= 540), [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setMixedBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, - (p => p.abilityIndex = 0))) + (p => { + p.abilityIndex = 0; + p.teraType = p.species.type1; + }))) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540) - .setGenModifiersFunc(party => { - const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ starter.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; // TODO: is the bang correct? - }), + .setInstantTera(0), [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.abilityIndex = 0; + p.teraType = p.species.type1; })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) @@ -2185,15 +2217,13 @@ export const trainerConfigs: TrainerConfigs = { p.shiny = true; p.variant = 1; })) - .setGenModifiersFunc(party => { - const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ starter.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; //TODO: is the bang correct? - }), + .setInstantTera(0), [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); p.abilityIndex = 0; + p.teraType = p.species.type1; p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true, @@ -2212,10 +2242,7 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 1; // Mega Rayquaza p.generateName(); })) - .setGenModifiersFunc(party => { - const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ starter.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; // TODO: is the bang correct? - }), + .setInstantTera(0), [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PERSIAN ], TrainerSlot.TRAINER, true, p => { @@ -2713,10 +2740,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.generateName(); })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; //TODO: is the bang correct? - }), + .setInstantTera(4), [TrainerType.PENNY_2]: new TrainerConfig(++t).setName("Cassiopeia").initForEvilTeamLeader("Star Boss", [], true).setMixedBattleBgm("battle_star_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SYLVEON ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -2749,10 +2773,12 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setGenModifiersFunc(party => { - const teraPokemon = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; //TODO: is the bang correct? - }), + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.ZAMAZENTA ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })) + .setInstantTera(0), [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer([], true) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); diff --git a/src/field/arena.ts b/src/field/arena.ts index 5ee065d71dc..60ee4b5b03c 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -44,6 +44,7 @@ export class Arena { public bgm: string; public ignoreAbilities: boolean; public ignoringEffectSource: BattlerIndex | null; + public playerTerasUsed: number; /** * Saves the number of times a party pokemon faints during a arena encounter. * {@linkcode globalScene.currentBattle.enemyFaints} is the corresponding faint counter for the enemy (this resets every wave). @@ -63,6 +64,7 @@ export class Arena { this.bgm = bgm; this.trainerPool = biomeTrainerPools[biome]; this.updatePoolsForTimeOfDay(); + this.playerTerasUsed = 0; this.playerFaints = playerFaints; } diff --git a/src/field/pokemon-sprite-sparkle-handler.ts b/src/field/pokemon-sprite-sparkle-handler.ts index 074933f0f00..d1803cc036e 100644 --- a/src/field/pokemon-sprite-sparkle-handler.ts +++ b/src/field/pokemon-sprite-sparkle-handler.ts @@ -27,6 +27,9 @@ export default class PokemonSpriteSparkleHandler { if (!s.visible || (s.parentContainer instanceof Pokemon && !s.parentContainer.parentContainer)) { continue; } + if (!(s.parentContainer instanceof Pokemon) || !(s.parentContainer as Pokemon).isTerastallized) { + continue; + } const pokemon = s.parentContainer instanceof Pokemon ? s.parentContainer as Pokemon : null; const parent = (pokemon || s).parentContainer; const texture = s.texture; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 5c6fbb34aea..dfce632ab06 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -52,7 +52,7 @@ import { getTypeDamageMultiplier, getTypeRgb } from "#app/data/type"; import { Type } from "#enums/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, PokemonMultiHitModifier } from "#app/modifier/modifier"; +import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier, PokemonMultiHitModifier } from "#app/modifier/modifier"; import { PokeballType } from "#enums/pokeball"; import { Gender } from "#app/data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; @@ -79,7 +79,7 @@ import { DexAttr } from "#app/system/game-data"; import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; import { getNatureStatMultiplier } from "#app/data/nature"; import type { SpeciesFormChange } from "#app/data/pokemon-forms"; -import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "#app/data/pokemon-forms"; +import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeLapseTeraTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "#app/data/pokemon-forms"; import { TerrainType } from "#app/data/terrain"; import type { TrainerSlot } from "#app/data/trainer-config"; import Overrides from "#app/overrides"; @@ -163,6 +163,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public pokerus: boolean; public switchOutStatus: boolean; public evoCounter: number; + public teraType: Type; + public isTerastallized: boolean; + public stellarTypesBoosted: Type[]; public fusionSpecies: PokemonSpecies | null; public fusionFormIndex: number; @@ -172,6 +175,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public fusionGender: Gender; public fusionLuck: number; public fusionCustomPokemonData: CustomPokemonData | null; + public fusionTeraType: Type; private summonDataPrimer: PokemonSummonData | null; @@ -269,8 +273,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.fusionGender = dataSource.fusionGender; this.fusionLuck = dataSource.fusionLuck; this.fusionCustomPokemonData = dataSource.fusionCustomPokemonData; + this.fusionTeraType = dataSource.fusionTeraType; this.usedTMs = dataSource.usedTMs ?? []; this.customPokemonData = new CustomPokemonData(dataSource.customPokemonData); + this.teraType = dataSource.teraType; + this.isTerastallized = dataSource.isTerastallized; + this.stellarTypesBoosted = dataSource.stellarTypesBoosted ?? []; } else { this.id = Utils.randSeedInt(4294967296); this.ivs = ivs || Utils.getIvsFromId(this.id); @@ -319,6 +327,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0); this.fusionLuck = this.luck; + + this.teraType = Utils.randSeedItem(this.getTypes(false, false, true)); + this.isTerastallized = false; + this.stellarTypesBoosted = []; } this.generateName(); @@ -355,7 +367,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const getSprite = (hasShadow?: boolean) => { const ret = globalScene.addPokemonSprite(this, 0, 0, `pkmn__${this.isPlayer() ? "back__" : ""}sub`, undefined, true); ret.setOrigin(0.5, 1); - ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, teraColor: getTypeRgb(this.getTeraType()) }); + ret.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, teraColor: getTypeRgb(this.getTeraType()), isTerastallized: this.isTerastallized }); return ret; }; @@ -723,7 +735,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } updateSpritePipelineData(): void { - [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType())); + [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => { + s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType()); + s.pipelineData["isTerastallized"] = this.isTerastallized; + }); this.updateInfo(true); } @@ -1208,6 +1223,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.fusionSpecies?.speciesId === species; } + /** + * Checks if the {@linkcode Pokemon} has is the specified {@linkcode Species} or is fused with it. + * @param species the pokemon {@linkcode Species} to check + * @returns `true` if the pokemon is the species or is fused with it, `false` otherwise + */ + hasSpecies(species: Species): boolean { + return this.species.speciesId === species || this.fusionSpecies?.speciesId === species; + } + abstract isBoss(): boolean; getMoveset(ignoreOverride?: boolean): (PokemonMove | null)[] { @@ -1284,9 +1308,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public getTypes(includeTeraType = false, forDefend: boolean = false, ignoreOverride: boolean = false): Type[] { const types: Type[] = []; - if (includeTeraType) { + if (includeTeraType && this.isTerastallized) { const teraType = this.getTeraType(); - if (teraType !== Type.UNKNOWN) { + if (this.isTerastallized && !(forDefend && teraType === Type.STELLAR)) { // Stellar tera uses its original types defensively types.push(teraType); if (forDefend) { return types; @@ -1590,23 +1614,31 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * @returns the pokemon's current tera {@linkcode Type}, or `Type.UNKNOWN` if the pokemon is not terastallized + * @returns the pokemon's current tera {@linkcode Type} */ - public getTeraType(): Type { - // I don't think this should be possible anymore, please report if you encounter this. --NightKev - if (globalScene === undefined) { - console.warn("Pokemon.getTeraType(): Global scene is not defined!"); - return Type.UNKNOWN; + getTeraType(): Type { + if (this.hasSpecies(Species.TERAPAGOS)) { + return Type.STELLAR; + } else if (this.hasSpecies(Species.OGERPON)) { + const ogerponForm = this.species.speciesId === Species.OGERPON ? this.formIndex : this.fusionFormIndex; + switch (ogerponForm) { + case 0: + case 4: + return Type.GRASS; + case 1: + case 5: + return Type.WATER; + case 2: + case 6: + return Type.FIRE; + case 3: + case 7: + return Type.ROCK; + } + } else if (this.hasSpecies(Species.SHEDINJA)) { + return Type.BUG; } - const teraModifier = globalScene.findModifier(m => - m instanceof TerastallizeModifier - && m.pokemonId === this.id - && m.getBattlesLeft() > 0, this.isPlayer()) as TerastallizeModifier; - return teraModifier?.teraType ?? Type.UNKNOWN; - } - - public isTerastallized(): boolean { - return this.getTeraType() !== Type.UNKNOWN; + return this.teraType; } public isGrounded(): boolean { @@ -1748,7 +1780,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { */ getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true, move?: Move): TypeDamageMultiplier { if (moveType === Type.STELLAR) { - return this.isTerastallized() ? 2 : 1; + return this.isTerastallized ? 2 : 1; } const types = this.getTypes(true, true); const arena = globalScene.arena; @@ -2785,11 +2817,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const matchesSourceType = sourceTypes.includes(moveType); /** A damage multiplier for when the attack is of the attacker's type and/or Tera type. */ const stabMultiplier = new Utils.NumberHolder(1); - if (matchesSourceType) { - stabMultiplier.value += 0.5; - } - applyMoveAttrs(CombinedPledgeStabBoostAttr, source, this, move, stabMultiplier); - if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === moveType) { + if (matchesSourceType && moveType !== Type.STELLAR) { stabMultiplier.value += 0.5; } @@ -2797,6 +2825,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyAbAttrs(StabBoostAbAttr, source, null, simulated, stabMultiplier); } + applyMoveAttrs(CombinedPledgeStabBoostAttr, source, this, move, stabMultiplier); + + if (source.isTerastallized && sourceTeraType === moveType && moveType !== Type.STELLAR) { + stabMultiplier.value += 0.5; + } + + if (source.isTerastallized && source.teraType === Type.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { + if (matchesSourceType) { + stabMultiplier.value += 0.5; + } else { + stabMultiplier.value += 0.2; + } + } + stabMultiplier.value = Math.min(stabMultiplier.value, 2.25); /** Halves damage if the attacker is using a physical attack while burned */ @@ -3837,6 +3879,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + resetTera(): void { + const wasTerastallized = this.isTerastallized; + this.isTerastallized = false; + this.stellarTypesBoosted = []; + if (wasTerastallized) { + this.updateSpritePipelineData(); + globalScene.triggerPokemonFormChange(this, SpeciesFormChangeLapseTeraTrigger); + } + } + resetTurnData(): void { this.turnData = new PokemonTurnData(); } @@ -4600,6 +4652,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionVariant = this.fusionVariant; newPokemon.fusionGender = this.fusionGender; newPokemon.fusionLuck = this.fusionLuck; + newPokemon.fusionTeraType = this.teraType; newPokemon.usedTMs = this.usedTMs; globalScene.getPlayerParty().push(newPokemon); @@ -4751,6 +4804,7 @@ export class EnemyPokemon extends Pokemon { public aiType: AiType; public bossSegments: number; public bossSegmentIndex: number; + public initialTeamIndex: number; /** To indicate if the instance was populated with a dataSource -> e.g. loaded & populated from session data */ public readonly isPopulatedFromDataSource: boolean; @@ -4760,6 +4814,7 @@ export class EnemyPokemon extends Pokemon { undefined, dataSource ? dataSource.nature : undefined, dataSource); this.trainerSlot = trainerSlot; + this.initialTeamIndex = globalScene.currentBattle?.enemyParty.length ?? 0; this.isPopulatedFromDataSource = !!dataSource; // if a dataSource is provided, then it was populated from dataSource if (boss) { this.setBoss(boss, dataSource?.bossSegments); diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 65bca641163..5bce08afae6 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -11,7 +11,8 @@ import { TrainerSlot, trainerConfigs, trainerPartyTemplates, - signatureSpecies + signatureSpecies, + TeraAIMode } from "#app/data/trainer-config"; import type { EnemyPokemon } from "#app/field/pokemon"; import * as Utils from "#app/utils"; @@ -36,6 +37,7 @@ export default class Trainer extends Phaser.GameObjects.Container { public partyTemplateIndex: number; public name: string; public partnerName: string; + public originalIndexes: { [key: number]: number } = {}; constructor(trainerType: TrainerType, variant: TrainerVariant, partyTemplateIndex?: number, name?: string, partnerName?: string, trainerConfigOverride?: TrainerConfig) { super(globalScene, -72, 80); @@ -546,6 +548,13 @@ export default class Trainer extends Phaser.GameObjects.Container { return []; } + genAI(party: EnemyPokemon[]) { + if (this.config.genAIFuncs) { + this.config.genAIFuncs.forEach(f => f(party)); + } + console.log("Generated AI funcs"); + } + loadAssets(): Promise { return this.config.loadAssets(this.variant); } @@ -667,4 +676,13 @@ export default class Trainer extends Phaser.GameObjects.Container { } }); } + + shouldTera(pokemon: EnemyPokemon): boolean { + if (this.config.trainerAI.teraMode === TeraAIMode.INSTANT_TERA) { + if (!pokemon.isTerastallized && this.config.trainerAI.instantTeras.includes(pokemon.initialTeamIndex)) { + return true; + } + } + return false; + } } diff --git a/src/loading-scene.ts b/src/loading-scene.ts index e8f817c1c39..fc685fc2332 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -103,6 +103,7 @@ export class LoadingScene extends SceneBase { this.loadImage("icon_tera", "ui"); this.loadImage("type_tera", "ui"); this.loadAtlas("type_bgs", "ui"); + this.loadAtlas("button_tera", "ui"); this.loadImage("mystery_egg", "ui"); this.loadImage("normal_memory", "ui"); diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index da2ab49e9fc..35ed75d8c6e 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -11,7 +11,7 @@ import { Type } from "#enums/type"; import type { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; -import { AddPokeballModifier, AddVoucherModifier, AttackTypeBoosterModifier, BaseStatModifier, BerryModifier, BoostBugSpawnModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, CritBoosterModifier, DamageMoneyRewardModifier, DoubleBattleChanceBoosterModifier, EnemyAttackStatusEffectChanceModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, EvolutionItemModifier, EvolutionStatBoosterModifier, EvoTrackerModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, GigantamaxAccessModifier, HealingBoosterModifier, HealShopCostModifier, HiddenAbilityRateBoosterModifier, HitHealModifier, IvScannerModifier, LevelIncrementBoosterModifier, LockModifierTiersModifier, MapModifier, MegaEvolutionAccessModifier, MoneyInterestModifier, MoneyMultiplierModifier, MoneyRewardModifier, MultipleParticipantExpBonusModifier, PokemonAllMovePpRestoreModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, PokemonInstantReviveModifier, PokemonLevelIncrementModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PokemonNatureChangeModifier, PokemonNatureWeightModifier, PokemonPpRestoreModifier, PokemonPpUpModifier, PokemonStatusHealModifier, PreserveBerryModifier, RememberMoveModifier, ResetNegativeStatStageModifier, ShinyRateBoosterModifier, SpeciesCritBoosterModifier, SpeciesStatBoosterModifier, SurviveDamageModifier, SwitchEffectTransferModifier, TempCritBoosterModifier, TempStatStageBoosterModifier, TerastallizeAccessModifier, TerastallizeModifier, TmModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier, type EnemyPersistentModifier, type Modifier, type PersistentModifier, TempExtraModifierModifier, CriticalCatchChanceBoosterModifier } from "#app/modifier/modifier"; +import { AddPokeballModifier, AddVoucherModifier, AttackTypeBoosterModifier, BaseStatModifier, BerryModifier, BoostBugSpawnModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, CritBoosterModifier, DamageMoneyRewardModifier, DoubleBattleChanceBoosterModifier, EnemyAttackStatusEffectChanceModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, EvolutionItemModifier, EvolutionStatBoosterModifier, EvoTrackerModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, GigantamaxAccessModifier, HealingBoosterModifier, HealShopCostModifier, HiddenAbilityRateBoosterModifier, HitHealModifier, IvScannerModifier, LevelIncrementBoosterModifier, LockModifierTiersModifier, MapModifier, MegaEvolutionAccessModifier, MoneyInterestModifier, MoneyMultiplierModifier, MoneyRewardModifier, MultipleParticipantExpBonusModifier, PokemonAllMovePpRestoreModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, PokemonInstantReviveModifier, PokemonLevelIncrementModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PokemonNatureChangeModifier, PokemonNatureWeightModifier, PokemonPpRestoreModifier, PokemonPpUpModifier, PokemonStatusHealModifier, PreserveBerryModifier, RememberMoveModifier, ResetNegativeStatStageModifier, ShinyRateBoosterModifier, SpeciesCritBoosterModifier, SpeciesStatBoosterModifier, SurviveDamageModifier, SwitchEffectTransferModifier, TempCritBoosterModifier, TempStatStageBoosterModifier, TerastallizeAccessModifier, TerrastalizeModifier, TmModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier, type EnemyPersistentModifier, type Modifier, type PersistentModifier, TempExtraModifierModifier, CriticalCatchChanceBoosterModifier } from "#app/modifier/modifier"; import { ModifierTier } from "#app/modifier/modifier-tier"; import Overrides from "#app/overrides"; import { Unlockables } from "#app/system/unlockables"; @@ -19,7 +19,7 @@ import { getVoucherTypeIcon, getVoucherTypeName, VoucherType } from "#app/system import type { PokemonMoveSelectFilter, PokemonSelectFilter } from "#app/ui/party-ui-handler"; import PartyUiHandler from "#app/ui/party-ui-handler"; import { getModifierTierTextTint } from "#app/ui/text"; -import { formatMoney, getEnumKeys, getEnumValues, isNullOrUndefined, NumberHolder, padInt, randSeedInt, randSeedItem } from "#app/utils"; +import { formatMoney, getEnumKeys, getEnumValues, isNullOrUndefined, NumberHolder, padInt, randSeedInt } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; @@ -275,6 +275,36 @@ export class PokemonHeldItemModifierType extends PokemonModifierType { } } + +export class TerastallizeModifierType extends PokemonModifierType { + private teraType: Type; + + constructor(teraType: Type) { + super("", `${Type[teraType].toLowerCase()}_tera_shard`, (type, args) => new TerrastalizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), + (pokemon: PlayerPokemon) => { + if ([ pokemon.species.speciesId, pokemon.fusionSpecies?.speciesId ].filter(s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA).length > 0) { + return PartyUiHandler.NoEffectMessage; + } + return null; + }, + "tera_shard"); + + this.teraType = teraType; + } + + get name(): string { + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); + } + + getDescription(): string { + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); + } + + getPregenArgs(): any[] { + return [ this.teraType ]; + } +} + export class PokemonHpRestoreModifierType extends PokemonModifierType { protected restorePoints: number; protected restorePercent: number; @@ -1192,28 +1222,6 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { } } -export class TerastallizeModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { - private teraType: Type; - - constructor(teraType: Type) { - super("", `${Type[teraType].toLowerCase()}_tera_shard`, (type, args) => new TerastallizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), "tera_shard"); - - this.teraType = teraType; - } - - get name(): string { - return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); - } - - getDescription(): string { - return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); - } - - getPregenArgs(): any[] { - return [ this.teraType ]; - } -} - export class ContactHeldItemTransferChanceModifierType extends PokemonHeldItemModifierType { private chancePercent: number; @@ -1469,14 +1477,21 @@ export const modifierTypes = { if (!globalScene.getModifiers(TerastallizeAccessModifier).length) { return null; } - let type: Type; - if (!randSeedInt(3)) { - const partyMemberTypes = party.map(p => p.getTypes(false, false, true)).flat(); - type = randSeedItem(partyMemberTypes); - } else { - type = randSeedInt(64) ? randSeedInt(18) as Type : Type.STELLAR; + const teraTypes: Type[] = []; + party.forEach(p => { + if (!(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA))) { + teraTypes.push(p.teraType); + } + }); + let excludedType = Type.UNKNOWN; + if (teraTypes.length > 0 && teraTypes.filter(t => t === teraTypes[0]).length === teraTypes.length) { + excludedType = teraTypes[0]; } - return new TerastallizeModifierType(type); + let shardType = randSeedInt(64) ? randSeedInt(18) as Type : Type.STELLAR; + while (shardType === excludedType) { + shardType = randSeedInt(64) ? randSeedInt(18) as Type : Type.STELLAR; + } + return new TerastallizeModifierType(shardType); }), BERRY: () => new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { @@ -1719,7 +1734,7 @@ const modifierPool: ModifierPool = { return Math.min(Math.ceil(highestPartyLevel / 20), 4); }, 4), new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), - new WeightedModifierType(modifierTypes.TERA_SHARD, 1), + new WeightedModifierType(modifierTypes.TERA_SHARD, (party: Pokemon[]) => party.filter(p => !(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA))).length > 0 ? 1 : 0), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => { if (party.filter(p => !p.fusionSpecies).length > 1) { if (globalScene.gameMode.isSplicedOnly) { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index d955385ecee..fe61eadaccd 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -3,16 +3,16 @@ import { getBerryEffectFunc, getBerryPredicate } from "#app/data/berry"; import { getLevelTotalExp } from "#app/data/exp"; import { allMoves } from "#app/data/move"; import { MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball"; -import { type FormChangeItem, SpeciesFormChangeItemTrigger, SpeciesFormChangeLapseTeraTrigger, SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; +import { type FormChangeItem, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectHealText } from "#app/data/status-effect"; -import Pokemon, { type PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import Overrides from "#app/overrides"; import { EvolutionPhase } from "#app/phases/evolution-phase"; import { LearnMovePhase, LearnMoveType } from "#app/phases/learn-move-phase"; import { LevelUpPhase } from "#app/phases/level-up-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; -import { achvs } from "#app/system/achv"; import type { VoucherType } from "#app/system/voucher"; import { Command } from "#app/ui/command-ui-handler"; import { addTextObject, TextStyle } from "#app/ui/text"; @@ -25,7 +25,7 @@ import type { PokeballType } from "#enums/pokeball"; import { Species } from "#enums/species"; import { type PermanentStat, type TempBattleStat, BATTLE_STATS, Stat, TEMP_BATTLE_STATS } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import { Type } from "#enums/type"; +import type { Type } from "#enums/type"; import i18next from "i18next"; import { type DoubleBattleChanceBoosterModifierType, type EvolutionItemModifierType, type FormChangeItemModifierType, type ModifierOverride, type ModifierType, type PokemonBaseStatTotalModifierType, type PokemonExpBoosterModifierType, type PokemonFriendshipBoosterModifierType, type PokemonMoveAccuracyBoosterModifierType, type PokemonMultiHitModifierType, type TerastallizeModifierType, type TmModifierType, getModifierType, ModifierPoolType, ModifierTypeGenerator, modifierTypes, PokemonHeldItemModifierType } from "./modifier-type"; import { Color, ShadowColor } from "#enums/color"; @@ -786,72 +786,6 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi } } -export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { - public override type: TerastallizeModifierType; - public teraType: Type; - public isTransferable: boolean = false; - - constructor(type: TerastallizeModifierType, pokemonId: number, teraType: Type, battlesLeft?: number, stackCount?: number) { - super(type, pokemonId, battlesLeft || 10, stackCount); - - this.teraType = teraType; - } - - matchType(modifier: Modifier): boolean { - if (modifier instanceof TerastallizeModifier && modifier.teraType === this.teraType) { - return true; - } - return false; - } - - clone(): TerastallizeModifier { - return new TerastallizeModifier(this.type, this.pokemonId, this.teraType, this.battlesLeft, this.stackCount); - } - - getArgs(): any[] { - return [ this.pokemonId, this.teraType, this.battlesLeft ]; - } - - /** - * Applies the {@linkcode TerastallizeModifier} to the specified {@linkcode Pokemon}. - * @param pokemon the {@linkcode Pokemon} to be terastallized - * @returns always `true` - */ - override apply(pokemon: Pokemon): boolean { - if (pokemon.isPlayer()) { - globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeTeraTrigger); - globalScene.validateAchv(achvs.TERASTALLIZE); - if (this.teraType === Type.STELLAR) { - globalScene.validateAchv(achvs.STELLAR_TERASTALLIZE); - } - } - pokemon.updateSpritePipelineData(); - return true; - } - - /** - * Triggers {@linkcode LapsingPokemonHeldItemModifier.lapse} and if it returns `0` a form change is triggered. - * @param pokemon THe {@linkcode Pokemon} to be terastallized - * @returns the result of {@linkcode LapsingPokemonHeldItemModifier.lapse} - */ - public override lapse(pokemon: Pokemon): boolean { - const ret = super.lapse(pokemon); - if (!ret) { - globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeLapseTeraTrigger); - pokemon.updateSpritePipelineData(); - } - return ret; - } - - getScoreMultiplier(): number { - return 1.25; - } - - getMaxHeldItemCount(pokemon: Pokemon): number { - return 1; - } -} - /** * Modifier used for held items, specifically vitamins like Carbos, Hp Up, etc., that * increase the value of a given {@linkcode PermanentStat}. @@ -2022,6 +1956,36 @@ export abstract class ConsumablePokemonModifier extends ConsumableModifier { } } +export class TerrastalizeModifier extends ConsumablePokemonModifier { + public override type: TerastallizeModifierType; + public teraType: Type; + + constructor(type: TerastallizeModifierType, pokemonId: number, teraType: Type) { + super(type, pokemonId); + + this.teraType = teraType; + } + + /** + * Checks if {@linkcode TerrastalizeModifier} should be applied + * @param playerPokemon The {@linkcode PlayerPokemon} that consumes the item + * @returns `true` if the {@linkcode TerrastalizeModifier} should be applied + */ + override shouldApply(playerPokemon?: PlayerPokemon): boolean { + return super.shouldApply(playerPokemon) && [ playerPokemon?.species.speciesId, playerPokemon?.fusionSpecies?.speciesId ].filter(s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA).length === 0; + } + + /** + * Applies {@linkcode TerrastalizeModifier} + * @param pokemon The {@linkcode PlayerPokemon} that consumes the item + * @returns `true` if hp was restored + */ + override apply(pokemon: Pokemon): boolean { + pokemon.teraType = this.teraType; + return true; + } +} + export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { private restorePoints: number; private restorePercent: number; diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 632344be335..411022a84b4 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -118,6 +118,7 @@ export class CommandPhase extends FieldPhase { let success: boolean = false; switch (command) { + case Command.TERA: case Command.FIGHT: let useStruggle = false; const turnMove: TurnMove | undefined = (args.length === 2 ? (args[1] as TurnMove) : undefined); @@ -137,6 +138,7 @@ export class CommandPhase extends FieldPhase { } const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: args[0] }, args: args }; + const preTurnCommand: TurnCommand = { command: command, targets: [ this.fieldIndex ], skip: command === Command.FIGHT }; const moveTargets: MoveTargetSet = turnMove === undefined ? getMoveTargets(playerPokemon, moveId) : { targets: turnMove.targets, multiple: turnMove.targets.length > 1 }; if (!moveId) { turnCommand.targets = [ this.fieldIndex ]; @@ -152,6 +154,7 @@ export class CommandPhase extends FieldPhase { } else { globalScene.unshiftPhase(new SelectTargetPhase(this.fieldIndex)); } + globalScene.currentBattle.preTurnCommands[this.fieldIndex] = preTurnCommand; globalScene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; success = true; } else if (cursor < playerPokemon.getMoveset().length) { diff --git a/src/phases/enemy-command-phase.ts b/src/phases/enemy-command-phase.ts index e76518bb71e..429674e7786 100644 --- a/src/phases/enemy-command-phase.ts +++ b/src/phases/enemy-command-phase.ts @@ -81,6 +81,10 @@ export class EnemyCommandPhase extends FieldPhase { /** Select a move to use (and a target to use it against, if applicable) */ const nextMove = enemyPokemon.getNextMove(); + if (trainer && trainer.shouldTera(enemyPokemon)) { + globalScene.currentBattle.preTurnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { command: Command.TERA }; + } + globalScene.currentBattle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { command: Command.FIGHT, move: nextMove, skip: this.skipTurn }; diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index 12d2923ec36..ea857cac8ba 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -116,7 +116,7 @@ export class EvolutionPhase extends Phase { console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); + sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()), isTerastallized: this.pokemon.isTerastallized }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); sprite.setPipelineData("shiny", this.pokemon.shiny); diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 340c5362087..f354bc8031e 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -108,6 +108,8 @@ export class FaintPhase extends PokemonPhase { globalScene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true); globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + pokemon.resetTera(); + if (pokemon.turnData?.attacksReceived?.length) { const lastAttack = pokemon.turnData.attacksReceived[0]; applyPostFaintAbAttrs(PostFaintAbAttr, pokemon, globalScene.getPokemonById(lastAttack.sourceId)!, new PokemonMove(lastAttack.move).getMove(), lastAttack.result); // TODO: is this bang correct? diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 35fe446fc43..65d8d95cde6 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -450,6 +450,12 @@ export class MoveEffectPhase extends PokemonPhase { target.lapseTag(BattlerTagType.SUBSTITUTE); } }); + + const moveType = user.getMoveType(move, true); + if (move.category !== MoveCategory.STATUS && !user.stellarTypesBoosted.includes(moveType)) { + user.stellarTypesBoosted.push(moveType); + } + this.end(); }); }); diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts index 2c1a6c33163..c87c5d00be5 100644 --- a/src/phases/party-heal-phase.ts +++ b/src/phases/party-heal-phase.ts @@ -36,5 +36,6 @@ export class PartyHealPhase extends BattlePhase { globalScene.ui.fadeIn(500).then(() => this.end()); }); }); + globalScene.arena.playerTerasUsed = 0; } } diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts index 185156a20c7..6cd1129d318 100644 --- a/src/phases/quiet-form-change-phase.ts +++ b/src/phases/quiet-form-change-phase.ts @@ -1,7 +1,7 @@ import { globalScene } from "#app/global-scene"; import { SemiInvulnerableTag } from "#app/data/battler-tags"; import type { SpeciesFormChange } from "#app/data/pokemon-forms"; -import { getSpeciesFormChangeMessage } from "#app/data/pokemon-forms"; +import { getSpeciesFormChangeMessage, SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; import { getTypeRgb } from "#app/data/type"; import { BattleSpec } from "#app/enums/battle-spec"; import { BattlerTagType } from "#app/enums/battler-tag-type"; @@ -11,6 +11,7 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { BattlePhase } from "./battle-phase"; import { MovePhase } from "./move-phase"; import { PokemonHealPhase } from "./pokemon-heal-phase"; +import { applyAbAttrs, PostTeraFormChangeStatChangeAbAttr } from "#app/data/ability"; export class QuietFormChangePhase extends BattlePhase { protected pokemon: Pokemon; @@ -51,7 +52,7 @@ export class QuietFormChangePhase extends BattlePhase { } catch (err: unknown) { console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); + sprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()), isTerastallized: this.pokemon.isTerastallized }); [ "spriteColors", "fusionSpriteColors" ].map(k => { if (this.pokemon.summonData?.speciesForm) { k += "Base"; @@ -145,6 +146,9 @@ export class QuietFormChangePhase extends BattlePhase { movePhase.cancel(); } } + if (this.formChange.trigger instanceof SpeciesFormChangeTeraTrigger) { + applyAbAttrs(PostTeraFormChangeStatChangeAbAttr, this.pokemon, null); + } super.end(); } diff --git a/src/phases/tera-phase.ts b/src/phases/tera-phase.ts new file mode 100644 index 00000000000..f4b72d39192 --- /dev/null +++ b/src/phases/tera-phase.ts @@ -0,0 +1,51 @@ +import type Pokemon from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { BattlePhase } from "./battle-phase"; +import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; +import { Type } from "#app/enums/type"; +import { achvs } from "#app/system/achv"; +import { SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; +import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; + +export class TeraPhase extends BattlePhase { + public pokemon: Pokemon; + + constructor(pokemon: Pokemon) { + super(); + + this.pokemon = pokemon; + } + + start() { + super.start(); + + console.log(this.pokemon.name, "terastallized to", Type[this.pokemon.teraType].toString()); + + globalScene.queueMessage(i18next.t("battle:pokemonTerastallized", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), type: i18next.t(`pokemonInfo:Type.${Type[this.pokemon.teraType]}`) })); + new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(false, () => { + this.end(); + }); + } + + + end() { + this.pokemon.isTerastallized = true; + this.pokemon.updateSpritePipelineData(); + + if (this.pokemon.isPlayer()) { + globalScene.arena.playerTerasUsed += 1; + } + + globalScene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangeTeraTrigger); + + if (this.pokemon.isPlayer()) { + globalScene.validateAchv(achvs.TERASTALLIZE); + if (this.pokemon.teraType === Type.STELLAR) { + globalScene.validateAchv(achvs.STELLAR_TERASTALLIZE); + } + } + + super.end(); + } +} diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index c64d7ddf526..c6d145e1a4c 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -21,6 +21,7 @@ import { BattlerIndex } from "#app/battle"; import { TrickRoomTag } from "#app/data/arena-tag"; import { SwitchType } from "#enums/switch-type"; import { globalScene } from "#app/global-scene"; +import { TeraPhase } from "./tera-phase"; export class TurnStartPhase extends FieldPhase { constructor() { @@ -139,6 +140,20 @@ export class TurnStartPhase extends FieldPhase { let orderIndex = 0; + for (const o of this.getSpeedOrder()) { + const pokemon = field[o]; + const preTurnCommand = globalScene.currentBattle.preTurnCommands[o]; + + if (preTurnCommand?.skip) { + continue; + } + + switch (preTurnCommand?.command) { + case Command.TERA: + globalScene.pushPhase(new TeraPhase(pokemon)); + } + } + for (const o of moveOrder) { const pokemon = field[o]; diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index 67639d6450a..90c0e65d25c 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -351,7 +351,7 @@ export default class SpritePipeline extends FieldSpritePipeline { const data = sprite.pipelineData; const tone = data["tone"] as number[]; - const teraColor = data["teraColor"] as number[] ?? [ 0, 0, 0 ]; + const teraColor = (data["isTerastallized"] as boolean) ? (data["teraColor"] as number[] ?? [ 0, 0, 0 ]) : [ 0, 0, 0 ]; const hasShadow = data["hasShadow"] as boolean; const yShadowOffset = data["yShadowOffset"] as number; const ignoreFieldPos = data["ignoreFieldPos"] as boolean; diff --git a/src/system/arena-data.ts b/src/system/arena-data.ts index 98ab611ff3c..518acb55c89 100644 --- a/src/system/arena-data.ts +++ b/src/system/arena-data.ts @@ -10,12 +10,14 @@ export default class ArenaData { public weather: Weather | null; public terrain: Terrain | null; public tags: ArenaTag[]; + public playerTerasUsed: number; constructor(source: Arena | any) { const sourceArena = source instanceof Arena ? source as Arena : null; this.biome = sourceArena ? sourceArena.biomeType : source.biome; this.weather = sourceArena ? sourceArena.weather : source.weather ? new Weather(source.weather.weatherType, source.weather.turnsLeft) : null; this.terrain = sourceArena ? sourceArena.terrain : source.terrain ? new Terrain(source.terrain.terrainType, source.terrain.turnsLeft) : null; + this.playerTerasUsed = (sourceArena ? sourceArena.playerTerasUsed : source.playerTerasUsed) ?? 0; this.tags = []; if (source.tags) { diff --git a/src/system/game-data.ts b/src/system/game-data.ts index c16fab9db04..63d79d47fba 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1087,6 +1087,8 @@ export class GameData { globalScene.arena.terrain = sessionData.arena.terrain; globalScene.arena.eventTarget.dispatchEvent(new TerrainChangedEvent(TerrainType.NONE, globalScene.arena.terrain?.terrainType!, globalScene.arena.terrain?.turnsLeft!)); // TODO: is this bang correct? + globalScene.arena.playerTerasUsed = sessionData.arena.playerTerasUsed; + globalScene.arena.tags = sessionData.arena.tags; if (globalScene.arena.tags) { for (const tag of globalScene.arena.tags) { diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 6459bb5033d..20507860e4e 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -13,6 +13,7 @@ import type { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import type { Species } from "#enums/species"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; +import type { Type } from "#app/enums/type"; export default class PokemonData { public id: number; @@ -45,6 +46,9 @@ export default class PokemonData { public pokerus: boolean; public usedTMs: Moves[]; public evoCounter: number; + public teraType: Type; + public isTerastallized: boolean; + public stellarTypesBoosted: Type[]; public fusionSpecies: Species; public fusionFormIndex: number; @@ -53,6 +57,7 @@ export default class PokemonData { public fusionVariant: Variant; public fusionGender: Gender; public fusionLuck: number; + public fusionTeraType: Type; public boss: boolean; public bossSegments?: number; @@ -103,6 +108,9 @@ export default class PokemonData { this.evoCounter = source.evoCounter ?? 0; } this.pokerus = !!source.pokerus; + this.teraType = source.teraType as Type; + this.isTerastallized = source.isTerastallized || false; + this.stellarTypesBoosted = source.stellarTypesBoosted || []; this.fusionSpecies = sourcePokemon ? sourcePokemon.fusionSpecies?.speciesId : source.fusionSpecies; this.fusionFormIndex = source.fusionFormIndex; @@ -112,6 +120,7 @@ export default class PokemonData { this.fusionGender = source.fusionGender; this.fusionLuck = source.fusionLuck !== undefined ? source.fusionLuck : (source.fusionShiny ? source.fusionVariant + 1 : 0); this.fusionCustomPokemonData = new CustomPokemonData(source.fusionCustomPokemonData); + this.fusionTeraType = (source.fusionTeraType ?? 0) as Type; this.usedTMs = source.usedTMs ?? []; this.customPokemonData = new CustomPokemonData(source.customPokemonData); diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index aee84805143..95537461768 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -7,6 +7,9 @@ import * as v1_0_4 from "./versions/v1_0_4"; // --- v1.1.0 PATCHES --- // import * as v1_1_0 from "./versions/v1_1_0"; +// --- v1.7.0 PATCHES --- // +import * as v1_7_0 from "./versions/v1_7_0"; + const LATEST_VERSION = version.split(".").map(value => parseInt(value)); /** @@ -138,6 +141,10 @@ class SessionVersionConverter extends VersionConverter { console.log("Applying v1.1.0 session data migration!"); this.callMigrators(data, v1_1_0.sessionMigrators); } + if (curMinor < 7) { + console.log("Applying v1.7.0 session data migration!"); + this.callMigrators(data, v1_7_0.sessionMigrators); + } } console.log(`Session data successfully migrated to v${version}!`); @@ -164,6 +171,10 @@ class SystemVersionConverter extends VersionConverter { console.log("Applying v1.1.0 system data migraton!"); this.callMigrators(data, v1_1_0.systemMigrators); } + if (curMinor < 7) { + console.log("Applying v1.7.0 session data migration!"); + this.callMigrators(data, v1_7_0.systemMigrators); + } } console.log(`System data successfully migrated to v${version}!`); @@ -190,6 +201,10 @@ class SettingsVersionConverter extends VersionConverter { console.log("Applying v1.1.0 settings data migraton!"); this.callMigrators(data, v1_1_0.settingsMigrators); } + if (curMinor < 7) { + console.log("Applying v1.7.0 session data migration!"); + this.callMigrators(data, v1_7_0.settingsMigrators); + } } console.log(`System data successfully migrated to v${version}!`); diff --git a/src/system/version_migration/versions/v1_7_0.ts b/src/system/version_migration/versions/v1_7_0.ts new file mode 100644 index 00000000000..2acb9d8151a --- /dev/null +++ b/src/system/version_migration/versions/v1_7_0.ts @@ -0,0 +1,49 @@ +import { getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import type { SessionSaveData } from "#app/system/game-data"; +import * as Utils from "#app/utils"; + +export const systemMigrators = [] as const; + +export const settingsMigrators = [] as const; + +export const sessionMigrators = [ + function migrateTera(data: SessionSaveData) { + for (let i = 0; i < data.modifiers.length;) { + if (data.modifiers[i].className === "TerastallizeModifier") { + data.party.forEach((p) => { + if (p.id === data.modifiers[i].args[0]) { + p.teraType = data.modifiers[i].args[1]; + } + }); + data.modifiers.splice(i, 1); + } else { + i++; + } + } + + for (let i = 0; i < data.enemyModifiers.length;) { + if (data.enemyModifiers[i].className === "TerastallizeModifier") { + data.enemyParty.forEach((p) => { + if (p.id === data.enemyModifiers[i].args[0]) { + p.teraType = data.enemyModifiers[i].args[1]; + } + }); + data.enemyModifiers.splice(i, 1); + } else { + i++; + } + } + + data.party.forEach(p => { + if (Utils.isNullOrUndefined(p.teraType)) { + p.teraType = getPokemonSpeciesForm(p.species, p.formIndex).type1; + } + }); + + data.enemyParty.forEach(p => { + if (Utils.isNullOrUndefined(p.teraType)) { + p.teraType = getPokemonSpeciesForm(p.species, p.formIndex).type1; + } + }); + } +] as const; diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index 42627da51a3..f6e85979c69 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -11,7 +11,7 @@ import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; describe("Abilities - Libero", () => { @@ -258,7 +258,7 @@ describe("Abilities - Libero", () => { const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - vi.spyOn(leadPokemon, "isTerastallized").mockReturnValue(true); + leadPokemon.isTerastallized = true; game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index 787834f8a9d..c7d04b9e1c8 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -11,7 +11,7 @@ import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; describe("Abilities - Protean", () => { @@ -258,7 +258,7 @@ describe("Abilities - Protean", () => { const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); - vi.spyOn(leadPokemon, "isTerastallized").mockReturnValue(true); + leadPokemon.isTerastallized = true; game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/src/test/moves/effectiveness.test.ts b/src/test/moves/effectiveness.test.ts index c78416b1237..09c94c740cc 100644 --- a/src/test/moves/effectiveness.test.ts +++ b/src/test/moves/effectiveness.test.ts @@ -6,7 +6,6 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Messages from "#app/messages"; -import { TerastallizeModifier, overrideHeldItems } from "#app/modifier/modifier"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; @@ -15,15 +14,14 @@ function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Sp expected: number, targetAbility: Abilities = Abilities.BALL_FETCH, teraType?: Type): void { // Suppress getPokemonNameWithAffix because it calls on a null battle spec vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue(""); - game.override - .enemyAbility(targetAbility) - .enemyHeldItems([{ name:"TERA_SHARD", type: teraType }]); + game.override.enemyAbility(targetAbility); const user = game.scene.addPlayerPokemon(getPokemonSpecies(Species.SNORLAX), 5); const target = game.scene.addEnemyPokemon(getPokemonSpecies(targetSpecies), 5, TrainerSlot.NONE); if (teraType !== undefined) { - overrideHeldItems(target, false); + target.teraType = teraType; + target.isTerastallized = true; } expect(target.getMoveEffectiveness(user, allMoves[move])).toBe(expected); @@ -40,7 +38,6 @@ describe("Moves - Type Effectiveness", () => { type: Phaser.HEADLESS, }); game = new GameManager(phaserGame); - TerastallizeModifier.prototype.apply = (args) => true; game.override.ability(Abilities.BALL_FETCH); }); diff --git a/src/test/moves/freeze_dry.test.ts b/src/test/moves/freeze_dry.test.ts index 9206a103a35..f207e297191 100644 --- a/src/test/moves/freeze_dry.test.ts +++ b/src/test/moves/freeze_dry.test.ts @@ -117,11 +117,12 @@ describe("Moves - Freeze-Dry", () => { }); it("should deal 2x damage to steel type terastallized into water", async () => { - game.override.enemySpecies(Species.SKARMORY) - .enemyHeldItems([{ name: "TERA_SHARD", type: Type.WATER }]); + game.override.enemySpecies(Species.SKARMORY); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; + enemy.teraType = Type.WATER; + enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); @@ -132,11 +133,12 @@ describe("Moves - Freeze-Dry", () => { }); it("should deal 0.5x damage to water type terastallized into fire", async () => { - game.override.enemySpecies(Species.PELIPPER) - .enemyHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]); + game.override.enemySpecies(Species.PELIPPER); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; + enemy.teraType = Type.FIRE; + enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); diff --git a/src/test/moves/tar_shot.test.ts b/src/test/moves/tar_shot.test.ts index 5fb70abc19c..66f540e4f9f 100644 --- a/src/test/moves/tar_shot.test.ts +++ b/src/test/moves/tar_shot.test.ts @@ -83,10 +83,12 @@ describe("Moves - Tar Shot", () => { }); it("does not double the effectiveness of Fire-type moves against a Pokémon that is Terastallized", async () => { - game.override.enemyHeldItems([{ name: "TERA_SHARD", type: Type.GRASS }]).enemySpecies(Species.SPRIGATITO); + game.override.enemySpecies(Species.SPRIGATITO); await game.classicMode.startBattle([ Species.PIKACHU ]); const enemy = game.scene.getEnemyPokemon()!; + enemy.teraType = Type.GRASS; + enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); @@ -119,7 +121,8 @@ describe("Moves - Tar Shot", () => { await game.toNextTurn(); - game.override.enemyHeldItems([{ name: "TERA_SHARD", type: Type.GRASS }]); + enemy.teraType = Type.GRASS; + enemy.isTerastallized = true; game.move.select(Moves.FIRE_PUNCH); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); diff --git a/src/test/moves/tera_blast.test.ts b/src/test/moves/tera_blast.test.ts index 34d171b47bb..08e401ef9d1 100644 --- a/src/test/moves/tera_blast.test.ts +++ b/src/test/moves/tera_blast.test.ts @@ -35,7 +35,6 @@ describe("Moves - Tera Blast", () => { .starterSpecies(Species.FEEBAS) .moveset([ Moves.TERA_BLAST ]) .ability(Abilities.BALL_FETCH) - .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]) .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.STURDY) @@ -45,13 +44,15 @@ describe("Moves - Tera Blast", () => { }); it("changes type to match user's tera type", async () => { - game.override - .enemySpecies(Species.FURRET) - .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIGHTING }]); + game.override.enemySpecies(Species.FURRET); await game.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; vi.spyOn(enemyPokemon, "apply"); + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = Type.FIGHTING; + playerPokemon.isTerastallized = true; + game.move.select(Moves.TERA_BLAST); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); await game.phaseInterceptor.to("MoveEffectPhase"); @@ -60,10 +61,12 @@ describe("Moves - Tera Blast", () => { }, 20000); it("increases power if user is Stellar tera type", async () => { - game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); - await game.startBattle(); + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = Type.STELLAR; + playerPokemon.isTerastallized = true; + game.move.select(Moves.TERA_BLAST); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); await game.phaseInterceptor.to("MoveEffectPhase"); @@ -72,13 +75,15 @@ describe("Moves - Tera Blast", () => { }, 20000); it("is super effective against terastallized targets if user is Stellar tera type", async () => { - game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); - await game.startBattle(); + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = Type.STELLAR; + playerPokemon.isTerastallized = true; + const enemyPokemon = game.scene.getEnemyPokemon()!; vi.spyOn(enemyPokemon, "apply"); - vi.spyOn(enemyPokemon, "isTerastallized").mockReturnValue(true); + enemyPokemon.isTerastallized = true; game.move.select(Moves.TERA_BLAST); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); @@ -93,6 +98,7 @@ describe("Moves - Tera Blast", () => { const playerPokemon = game.scene.getPlayerPokemon()!; playerPokemon.stats[Stat.ATK] = 100; playerPokemon.stats[Stat.SPATK] = 1; + playerPokemon.isTerastallized = true; vi.spyOn(teraBlastAttr, "apply"); @@ -169,10 +175,11 @@ describe("Moves - Tera Blast", () => { it("causes stat drops if user is Stellar tera type", async () => { - game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); await game.startBattle(); const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = Type.STELLAR; + playerPokemon.isTerastallized = true; game.move.select(Moves.TERA_BLAST); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); diff --git a/src/test/moves/tera_starstorm.test.ts b/src/test/moves/tera_starstorm.test.ts index 22dd5b3c4d1..1e934b88c86 100644 --- a/src/test/moves/tera_starstorm.test.ts +++ b/src/test/moves/tera_starstorm.test.ts @@ -29,8 +29,7 @@ describe("Moves - Tera Starstorm", () => { .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .enemyLevel(30) - .enemySpecies(Species.MAGIKARP) - .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]); + .enemySpecies(Species.MAGIKARP); }); it("changes type to Stellar when used by Terapagos in its Stellar Form", async () => { @@ -38,19 +37,22 @@ describe("Moves - Tera Starstorm", () => { await game.classicMode.startBattle([ Species.TERAPAGOS ]); const terapagos = game.scene.getPlayerPokemon()!; + terapagos.isTerastallized = true; vi.spyOn(terapagos, "getMoveType"); game.move.select(Moves.TERA_STARSTORM); await game.phaseInterceptor.to("TurnEndPhase"); - expect(terapagos.isTerastallized()).toBe(true); expect(terapagos.getMoveType).toHaveReturnedWith(Type.STELLAR); }); it("targets both opponents in a double battle when used by Terapagos in its Stellar Form", async () => { await game.classicMode.startBattle([ Species.MAGIKARP, Species.TERAPAGOS ]); + const terapagos = game.scene.getPlayerParty()[1]; + terapagos.isTerastallized = true; + game.move.select(Moves.TERA_STARSTORM, 0, BattlerIndex.ENEMY); game.move.select(Moves.TERA_STARSTORM, 1); @@ -82,6 +84,8 @@ describe("Moves - Tera Starstorm", () => { fusionedMon.fusionGender = magikarp.gender; fusionedMon.fusionLuck = magikarp.luck; + fusionedMon.isTerastallized = true; + vi.spyOn(fusionedMon, "getMoveType"); game.move.select(Moves.TERA_STARSTORM, 0); @@ -90,7 +94,6 @@ describe("Moves - Tera Starstorm", () => { // Fusion and terastallized expect(fusionedMon.isFusion()).toBe(true); - expect(fusionedMon.isTerastallized()).toBe(true); // Move effects should be applied expect(fusionedMon.getMoveType).toHaveReturnedWith(Type.STELLAR); expect(game.scene.getEnemyField().every(pokemon => pokemon.isFullHp())).toBe(false); diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index fa8767f5eb0..ab7f76daf0b 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -324,9 +324,9 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.lastTeraType = pokemon.getTeraType(); this.teraIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1, 2); - this.teraIcon.setVisible(this.lastTeraType !== Type.UNKNOWN); + this.teraIcon.setVisible(pokemon.isTerastallized); this.teraIcon.on("pointerover", () => { - if (this.lastTeraType !== Type.UNKNOWN) { + if (pokemon.isTerastallized) { globalScene.ui.showTooltip("", i18next.t("fightUiHandler:teraHover", { type: i18next.t(`pokemonInfo:Type.${Type[this.lastTeraType]}`) })); } }); @@ -542,7 +542,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.genderText.setPositionRelative(this.nameText, this.nameText.displayWidth, 0); } - const teraType = pokemon.getTeraType(); + const teraType = pokemon.isTerastallized ? pokemon.getTeraType() : Type.UNKNOWN; const teraTypeUpdated = this.lastTeraType !== teraType; if (teraTypeUpdated) { diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index de75f29ff6f..f23cc78c9f7 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -7,18 +7,24 @@ import { Button } from "#enums/buttons"; import { getPokemonNameWithAffix } from "#app/messages"; import { CommandPhase } from "#app/phases/command-phase"; import { globalScene } from "#app/global-scene"; +import { TerastallizeAccessModifier } from "#app/modifier/modifier"; +import { Type } from "#app/enums/type"; +import { getTypeRgb } from "#app/data/type"; export enum Command { FIGHT = 0, BALL, POKEMON, - RUN + RUN, + TERA } export default class CommandUiHandler extends UiHandler { private commandsContainer: Phaser.GameObjects.Container; private cursorObj: Phaser.GameObjects.Image | null; + private teraButton: Phaser.GameObjects.Sprite; + protected fieldIndex: number = 0; protected cursor2: number = 0; @@ -40,6 +46,13 @@ export default class CommandUiHandler extends UiHandler { this.commandsContainer.setVisible(false); ui.add(this.commandsContainer); + this.teraButton = globalScene.add.sprite(-32, 15, "button_tera"); + this.teraButton.setName("terrastallize-button"); + this.teraButton.setScale(1.3); + this.teraButton.setFrame("fire"); + this.teraButton.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true, teraColor: getTypeRgb(Type.FIRE), isTerastallized: false }); + this.commandsContainer.add(this.teraButton); + for (let c = 0; c < commands.length; c++) { const commandText = addTextObject(c % 2 === 0 ? 0 : 55.8, c < 2 ? 0 : 16, commands[c], TextStyle.WINDOW); commandText.setName(commands[c]); @@ -62,11 +75,22 @@ export default class CommandUiHandler extends UiHandler { commandPhase = globalScene.getStandbyPhase() as CommandPhase; } + if (this.canTera()) { + this.teraButton.setVisible(true); + this.teraButton.setFrame(Type[globalScene.getField()[this.fieldIndex].getTeraType()].toLowerCase()); + } else { + this.teraButton.setVisible(false); + if (this.cursor === Command.TERA) { + this.setCursor(Command.FIGHT); + } + } + this.toggleTeraButton(); + const messageHandler = this.getUi().getMessageHandler(); messageHandler.bg.setVisible(true); messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); - messageHandler.message.setWordWrapWidth(1110); + messageHandler.message.setWordWrapWidth(this.canTera() ? 910 : 1110); messageHandler.showText(i18next.t("commandUiHandler:actionMessage", { pokemonName: getPokemonNameWithAffix(commandPhase.getPokemon()) }), 0); if (this.getCursor() === Command.POKEMON) { this.setCursor(Command.FIGHT); @@ -108,6 +132,10 @@ export default class CommandUiHandler extends UiHandler { (globalScene.getCurrentPhase() as CommandPhase).handleCommand(Command.RUN, 0); success = true; break; + case Command.TERA: + ui.setMode(Mode.FIGHT, (globalScene.getCurrentPhase() as CommandPhase).getFieldIndex(), Command.TERA); + success = true; + break; } } else { (globalScene.getCurrentPhase() as CommandPhase).cancel(); @@ -115,23 +143,29 @@ export default class CommandUiHandler extends UiHandler { } else { switch (button) { case Button.UP: - if (cursor >= 2) { + if (cursor === Command.POKEMON || cursor === Command.RUN) { success = this.setCursor(cursor - 2); } break; case Button.DOWN: - if (cursor < 2) { + if (cursor === Command.FIGHT || cursor === Command.BALL) { success = this.setCursor(cursor + 2); } break; case Button.LEFT: - if (cursor % 2 === 1) { + if (cursor === Command.BALL || cursor === Command.RUN) { success = this.setCursor(cursor - 1); + } else if ((cursor === Command.FIGHT || cursor === Command.POKEMON) && this.canTera()) { + success = this.setCursor(Command.TERA); + this.toggleTeraButton(); } break; case Button.RIGHT: - if (cursor % 2 === 0) { + if (cursor === Command.FIGHT || cursor === Command.POKEMON) { success = this.setCursor(cursor + 1); + } else if (cursor === Command.TERA) { + success = this.setCursor(Command.FIGHT); + this.toggleTeraButton(); } break; } @@ -144,6 +178,17 @@ export default class CommandUiHandler extends UiHandler { return success; } + canTera(): boolean { + const hasTeraMod = !!globalScene.getModifiers(TerastallizeAccessModifier).length; + const currentTeras = globalScene.arena.playerTerasUsed; + const plannedTera = globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA && this.fieldIndex > 0 ? 1 : 0; + return hasTeraMod && (currentTeras + plannedTera) < 1; + } + + toggleTeraButton() { + this.teraButton.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true, teraColor: getTypeRgb(globalScene.getField()[this.fieldIndex].getTeraType()), isTerastallized: this.getCursor() === Command.TERA }); + } + getCursor(): number { return !this.fieldIndex ? this.cursor : this.cursor2; } @@ -163,7 +208,12 @@ export default class CommandUiHandler extends UiHandler { this.commandsContainer.add(this.cursorObj); } - this.cursorObj.setPosition(-5 + (cursor % 2 === 1 ? 56 : 0), 8 + (cursor >= 2 ? 16 : 0)); + if (cursor === Command.TERA) { + this.cursorObj.setVisible(false); + } else { + this.cursorObj.setPosition(-5 + (cursor % 2 === 1 ? 56 : 0), 8 + (cursor >= 2 ? 16 : 0)); + this.cursorObj.setVisible(true); + } return changed; } diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 72fb90066e7..1c1dceb24a5 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -33,6 +33,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { private moveInfoOverlay : MoveInfoOverlay; protected fieldIndex: number = 0; + protected fromCommand: Command = Command.FIGHT; protected cursor2: number = 0; constructor() { @@ -114,6 +115,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { super.show(args); this.fieldIndex = args.length ? args[0] as number : 0; + this.fromCommand = args.length > 1 ? args[1] as Command : Command.FIGHT; const messageHandler = this.getUi().getMessageHandler(); messageHandler.bg.setVisible(false); @@ -140,7 +142,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { if (button === Button.CANCEL || button === Button.ACTION) { if (button === Button.ACTION) { - if ((globalScene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, cursor, false)) { + if ((globalScene.getCurrentPhase() as CommandPhase).handleCommand(this.fromCommand, cursor, false)) { success = true; } else { ui.playError(); diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 02bcba17a73..bf07374e21a 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -420,17 +420,6 @@ export default class RunInfoUiHandler extends UiHandler { private parseTrainerDefeat(enemyContainer: Phaser.GameObjects.Container) { // Loads and adds trainer sprites to the UI this.showTrainerSprites(enemyContainer); - // Determining which Terastallize Modifier belongs to which Pokemon - // Creates a dictionary {PokemonId: TeraShardType} - const teraPokemon = {}; - this.runInfo.enemyModifiers.forEach((m) => { - const modifier = m.toModifier(this.modifiersModule[m.className]); - if (modifier instanceof Modifier.TerastallizeModifier) { - const teraDetails = modifier?.getArgs(); - const pkmnId = teraDetails[0]; - teraPokemon[pkmnId] = teraDetails[1]; - } - }); // Creates the Pokemon icons + level information and adds it to enemyContainer // 2 Rows x 3 Columns @@ -444,18 +433,6 @@ export default class RunInfoUiHandler extends UiHandler { enemyData["player"] = true; const enemy = enemyData.toPokemon(); const enemyIcon = globalScene.addPokemonIcon(enemy, 0, 0, 0, 0); - // Applying Terastallizing Type tint to Pokemon icon - // If the Pokemon is a fusion, it has two sprites and so, the tint has to be applied to each icon separately - const enemySprite1 = enemyIcon.list[0] as Phaser.GameObjects.Sprite; - const enemySprite2 = (enemyIcon.list.length > 1) ? enemyIcon.list[1] as Phaser.GameObjects.Sprite : undefined; - if (teraPokemon[enemyData.id]) { - const teraTint = getTypeRgb(teraPokemon[enemyData.id]); - const teraColor = new Phaser.Display.Color(teraTint[0], teraTint[1], teraTint[2]); - enemySprite1.setTint(teraColor.color); - if (enemySprite2) { - enemySprite2.setTint(teraColor.color); - } - } enemyIcon.setPosition(39 * (e % 3) + 5, (35 * pokemonRowHeight)); const enemyLevel = addTextObject(43 * (e % 3), (27 * (pokemonRowHeight + 1)), `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, isBoss ? TextStyle.PARTY_RED : TextStyle.PARTY, { fontSize: "54px" }); enemyLevel.setShadow(0, 0, undefined); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index cf5d40bc006..1526ae982e5 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -334,6 +334,7 @@ export default class SummaryUiHandler extends UiHandler { console.error(`Failed to play animation for ${spriteKey}`, err); } this.pokemonSprite.setPipelineData("teraColor", getTypeRgb(this.pokemon.getTeraType())); + this.pokemonSprite.setPipelineData("isTerastallized", this.pokemon.isTerastallized); this.pokemonSprite.setPipelineData("ignoreTimeTint", true); this.pokemonSprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); this.pokemonSprite.setPipelineData("shiny", this.pokemon.shiny); @@ -782,7 +783,7 @@ export default class SummaryUiHandler extends UiHandler { if (types.length > 1) { profileContainer.add(getTypeIcon(1, types[1])); } - if (this.pokemon?.isTerastallized()) { + if (this.pokemon?.isTerastallized) { profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); } From 4361aa089ba5af9f2ac0e3400e50937475b09c84 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 16 Feb 2025 17:31:46 -0600 Subject: [PATCH 21/24] [Refactor] Replace integer holder with number holder (#5350) * Replace integer holder with number holder * Remove duplicate NumberHolder --------- Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> --- src/battle-scene.ts | 4 +- src/battle.ts | 2 +- src/data/ability.ts | 10 ++--- src/data/challenge.ts | 32 ++++++++-------- src/data/move.ts | 38 +++++++++---------- .../encounters/safari-zone-encounter.ts | 4 +- .../encounters/weird-dream-encounter.ts | 4 +- src/field/pokemon.ts | 14 +++---- src/modifier/modifier-type.ts | 4 +- src/phases/money-reward-phase.ts | 2 +- src/phases/pokemon-heal-phase.ts | 2 +- src/phases/select-modifier-phase.ts | 2 +- src/test/achievements/achievement.test.ts | 4 +- src/ui/modifier-select-ui-handler.ts | 4 +- src/utils.ts | 7 ---- 15 files changed, 64 insertions(+), 69 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 4033f44eacb..c7e3d4bc928 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1212,7 +1212,7 @@ export default class BattleScene extends SceneBase { } getDoubleBattleChance(newWaveIndex: number, playerField: PlayerPokemon[]) { - const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); + const doubleChance = new Utils.NumberHolder(newWaveIndex % 10 === 0 ? 32 : 8); this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance)); return Math.max(doubleChance.value, 1); @@ -2628,7 +2628,7 @@ export default class BattleScene extends SceneBase { const args: unknown[] = []; if (modifier instanceof PokemonHpRestoreModifier) { if (!(modifier as PokemonHpRestoreModifier).fainted) { - const hpRestoreMultiplier = new Utils.IntegerHolder(1); + const hpRestoreMultiplier = new Utils.NumberHolder(1); this.applyModifiers(HealingBoosterModifier, true, hpRestoreMultiplier); args.push(hpRestoreMultiplier.value); } else { diff --git a/src/battle.ts b/src/battle.ts index 807ac215ea8..242954a3729 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -203,7 +203,7 @@ export default class Battle { } pickUpScatteredMoney(): void { - const moneyAmount = new Utils.IntegerHolder(globalScene.currentBattle.moneyScattered); + const moneyAmount = new Utils.NumberHolder(globalScene.currentBattle.moneyScattered); globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); if (globalScene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { diff --git a/src/data/ability.ts b/src/data/ability.ts index 6ba5f685acd..bf3b04e1f63 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -3115,7 +3115,7 @@ export class ChangeMovePriorityAbAttr extends AbAttr { return false; } - (args[1] as Utils.IntegerHolder).value += this.changeAmount; + (args[1] as Utils.NumberHolder).value += this.changeAmount; return true; } } @@ -3957,7 +3957,7 @@ export class StatStageChangeMultiplierAbAttr extends AbAttr { } override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value *= this.multiplier; + (args[0] as Utils.NumberHolder).value *= this.multiplier; return true; } @@ -4058,7 +4058,7 @@ export class HealFromBerryUseAbAttr extends AbAttr { export class RunSuccessAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = 256; + (args[0] as Utils.NumberHolder).value = 256; return true; } @@ -4128,7 +4128,7 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { export class MaxMultiHitAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = 0; + (args[0] as Utils.NumberHolder).value = 0; return true; } @@ -4259,7 +4259,7 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { export class RedirectMoveAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.canRedirect(args[0] as Moves)) { - const target = args[1] as Utils.IntegerHolder; + const target = args[1] as Utils.NumberHolder; const newTarget = pokemon.getBattlerIndex(); if (target.value !== newTarget) { target.value = newTarget; diff --git a/src/data/challenge.ts b/src/data/challenge.ts index b6d123ce933..c6e85be2389 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -349,23 +349,23 @@ export abstract class Challenge { /** * An apply function for AI_LEVEL challenges. Derived classes should alter this. - * @param level {@link Utils.IntegerHolder} The generated level. + * @param level {@link Utils.NumberHolder} The generated level. * @param levelCap {@link Number} The current level cap. * @param isTrainer {@link Boolean} Whether this is a trainer pokemon. * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. * @returns {@link boolean} Whether this function did anything. */ - applyLevelChange(level: Utils.IntegerHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean { + applyLevelChange(level: Utils.NumberHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean { return false; } /** * An apply function for AI_MOVE_SLOTS challenges. Derived classes should alter this. * @param pokemon {@link Pokemon} The pokemon that is being considered. - * @param moveSlots {@link Utils.IntegerHolder} The amount of move slots. + * @param moveSlots {@link Utils.NumberHolder} The amount of move slots. * @returns {@link boolean} Whether this function did anything. */ - applyMoveSlot(pokemon: Pokemon, moveSlots: Utils.IntegerHolder): boolean { + applyMoveSlot(pokemon: Pokemon, moveSlots: Utils.NumberHolder): boolean { return false; } @@ -393,10 +393,10 @@ export abstract class Challenge { * @param pokemon {@link Pokemon} What pokemon would learn the move. * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. * @param move {@link Moves} The move in question. - * @param level {@link Utils.IntegerHolder} The level threshold for access. + * @param level {@link Utils.NumberHolder} The level threshold for access. * @returns {@link boolean} Whether this function did anything. */ - applyMoveAccessLevel(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean { + applyMoveAccessLevel(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.NumberHolder): boolean { return false; } @@ -405,10 +405,10 @@ export abstract class Challenge { * @param pokemon {@link Pokemon} What pokemon would learn the move. * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. * @param move {@link Moves} The move in question. - * @param weight {@link Utils.IntegerHolder} The base weight of the move + * @param weight {@link Utils.NumberHolder} The base weight of the move * @returns {@link boolean} Whether this function did anything. */ - applyMoveWeight(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean { + applyMoveWeight(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.NumberHolder): boolean { return false; } @@ -913,22 +913,22 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * Apply all challenges that modify what level AI are. * @param gameMode {@link GameMode} The current gameMode * @param challengeType {@link ChallengeType} ChallengeType.AI_LEVEL - * @param level {@link Utils.IntegerHolder} The generated level of the pokemon. + * @param level {@link Utils.NumberHolder} The generated level of the pokemon. * @param levelCap {@link Number} The maximum level cap for the current wave. * @param isTrainer {@link Boolean} Whether this is a trainer pokemon. * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_LEVEL, level: Utils.IntegerHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean; +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_LEVEL, level: Utils.NumberHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean; /** * Apply all challenges that modify how many move slots the AI has. * @param gameMode {@link GameMode} The current gameMode * @param challengeType {@link ChallengeType} ChallengeType.AI_MOVE_SLOTS * @param pokemon {@link Pokemon} The pokemon being considered. - * @param moveSlots {@link Utils.IntegerHolder} The amount of move slots. + * @param moveSlots {@link Utils.NumberHolder} The amount of move slots. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_MOVE_SLOTS, pokemon: Pokemon, moveSlots: Utils.IntegerHolder): boolean; +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_MOVE_SLOTS, pokemon: Pokemon, moveSlots: Utils.NumberHolder): boolean; /** * Apply all challenges that modify whether a pokemon has its passive. * @param gameMode {@link GameMode} The current gameMode @@ -952,10 +952,10 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param pokemon {@link Pokemon} What pokemon would learn the move. * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. * @param move {@link Moves} The move in question. - * @param level {@link Utils.IntegerHolder} The level threshold for access. + * @param level {@link Utils.NumberHolder} The level threshold for access. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_ACCESS, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean; +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_ACCESS, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.NumberHolder): boolean; /** * Apply all challenges that modify what weight a pokemon gives to move generation * @param gameMode {@link GameMode} The current gameMode @@ -963,10 +963,10 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param pokemon {@link Pokemon} What pokemon would learn the move. * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. * @param move {@link Moves} The move in question. - * @param weight {@link Utils.IntegerHolder} The weight of the move. + * @param weight {@link Utils.NumberHolder} The weight of the move. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_WEIGHT, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, weight: Utils.IntegerHolder): boolean; +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_WEIGHT, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, weight: Utils.NumberHolder): boolean; export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.FLIP_STAT, pokemon: Pokemon, baseStats: number[]): boolean; diff --git a/src/data/move.ts b/src/data/move.ts index 7e504e87667..60c5690ae44 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -908,7 +908,7 @@ export class AttackMove extends Move { attackScore = Math.pow(effectiveness - 1, 2) * effectiveness < 1 ? -2 : 2; if (attackScore) { if (this.category === MoveCategory.PHYSICAL) { - const atk = new Utils.IntegerHolder(user.getEffectiveStat(Stat.ATK, target)); + const atk = new Utils.NumberHolder(user.getEffectiveStat(Stat.ATK, target)); applyMoveAttrs(VariableAtkAttr, user, target, move, atk); if (atk.value > user.getEffectiveStat(Stat.SPATK, target)) { const statRatio = user.getEffectiveStat(Stat.SPATK, target) / atk.value; @@ -919,7 +919,7 @@ export class AttackMove extends Move { } } } else { - const spAtk = new Utils.IntegerHolder(user.getEffectiveStat(Stat.SPATK, target)); + const spAtk = new Utils.NumberHolder(user.getEffectiveStat(Stat.SPATK, target)); applyMoveAttrs(VariableAtkAttr, user, target, move, spAtk); if (spAtk.value > user.getEffectiveStat(Stat.ATK, target)) { const statRatio = user.getEffectiveStat(Stat.ATK, target) / spAtk.value; @@ -1337,7 +1337,7 @@ export class IgnoreOpponentStatStagesAttr extends MoveAttr { export class HighCritAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value++; + (args[0] as Utils.NumberHolder).value++; return true; } @@ -1369,7 +1369,7 @@ export class FixedDamageAttr extends MoveAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = this.getDamage(user, target, move); + (args[0] as Utils.NumberHolder).value = this.getDamage(user, target, move); return true; } @@ -1385,7 +1385,7 @@ export class UserHpDamageAttr extends FixedDamageAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = user.hp; + (args[0] as Utils.NumberHolder).value = user.hp; return true; } @@ -1437,7 +1437,7 @@ export class MatchHpAttr extends FixedDamageAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = target.hp - user.hp; + (args[0] as Utils.NumberHolder).value = target.hp - user.hp; return true; } @@ -1467,7 +1467,7 @@ export class CounterDamageAttr extends FixedDamageAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const damage = user.turnData.attacksReceived.filter(ar => this.moveFilter(allMoves[ar.move])).reduce((total: number, ar: AttackMoveResult) => total + ar.damage, 0); - (args[0] as Utils.IntegerHolder).value = Utils.toDmgValue(damage * this.multiplier); + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue(damage * this.multiplier); return true; } @@ -1499,7 +1499,7 @@ export class RandomLevelDamageAttr extends FixedDamageAttr { export class ModifiedDamageAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const initialDamage = args[0] as Utils.IntegerHolder; + const initialDamage = args[0] as Utils.NumberHolder; initialDamage.value = this.getModifiedDamage(user, target, move, initialDamage.value); return true; @@ -2164,7 +2164,7 @@ export class IncrementMovePriorityAttr extends MoveAttr { * @param user {@linkcode Pokemon} using this move * @param target {@linkcode Pokemon} target of this move * @param move {@linkcode Move} being used - * @param args [0] {@linkcode Utils.IntegerHolder} for move priority. + * @param args [0] {@linkcode Utils.NumberHolder} for move priority. * @returns true if function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -2172,7 +2172,7 @@ export class IncrementMovePriorityAttr extends MoveAttr { return false; } - (args[0] as Utils.IntegerHolder).value += this.increaseAmount; + (args[0] as Utils.NumberHolder).value += this.increaseAmount; return true; } } @@ -2210,7 +2210,7 @@ export class MultiHitAttr extends MoveAttr { * @param user {@linkcode Pokemon} that used the attack * @param target {@linkcode Pokemon} targeted by the attack * @param move {@linkcode Move} being used - * @param args [0] {@linkcode Utils.IntegerHolder} storing the hit count of the attack + * @param args [0] {@linkcode Utils.NumberHolder} storing the hit count of the attack * @returns True */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -2277,7 +2277,7 @@ export class ChangeMultiHitTypeAttr extends MoveAttr { export class WaterShurikenMultiHitTypeAttr extends ChangeMultiHitTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (user.species.speciesId === Species.GRENINJA && user.hasAbility(Abilities.BATTLE_BOND) && user.formIndex === 2) { - (args[0] as Utils.IntegerHolder).value = MultiHitType._3; + (args[0] as Utils.NumberHolder).value = MultiHitType._3; return true; } return false; @@ -4118,7 +4118,7 @@ export class PresentPowerAttr extends VariablePowerAttr { export class WaterShurikenPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (user.species.speciesId === Species.GRENINJA && user.hasAbility(Abilities.BATTLE_BOND) && user.formIndex === 2) { - (args[0] as Utils.IntegerHolder).value = 20; + (args[0] as Utils.NumberHolder).value = 20; return true; } return false; @@ -4140,7 +4140,7 @@ export class SpitUpPowerAttr extends VariablePowerAttr { const stockpilingTag = user.getTag(StockpilingTag); if (stockpilingTag && stockpilingTag.stockpiledCount > 0) { - const power = args[0] as Utils.IntegerHolder; + const power = args[0] as Utils.NumberHolder; power.value = this.multiplier * stockpilingTag.stockpiledCount; return true; } @@ -4449,7 +4449,7 @@ export class VariableAtkAttr extends MoveAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - //const atk = args[0] as Utils.IntegerHolder; + //const atk = args[0] as Utils.NumberHolder; return false; } } @@ -4459,7 +4459,7 @@ export class TargetAtkUserAtkAttr extends VariableAtkAttr { super(); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = target.getEffectiveStat(Stat.ATK, target); + (args[0] as Utils.NumberHolder).value = target.getEffectiveStat(Stat.ATK, target); return true; } } @@ -4470,7 +4470,7 @@ export class DefAtkAttr extends VariableAtkAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = user.getEffectiveStat(Stat.DEF, target); + (args[0] as Utils.NumberHolder).value = user.getEffectiveStat(Stat.DEF, target); return true; } } @@ -4481,7 +4481,7 @@ export class VariableDefAttr extends MoveAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - //const def = args[0] as Utils.IntegerHolder; + //const def = args[0] as Utils.NumberHolder; return false; } } @@ -4492,7 +4492,7 @@ export class DefDefAttr extends VariableDefAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = target.getEffectiveStat(Stat.DEF, user); + (args[0] as Utils.NumberHolder).value = target.getEffectiveStat(Stat.DEF, user); return true; } } diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index aa497e3c8fc..130c55c361e 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -10,7 +10,7 @@ import { HiddenAbilityRateBoosterModifier, IvScannerModifier } from "#app/modifi import type { EnemyPokemon } from "#app/field/pokemon"; import { PokeballType } from "#enums/pokeball"; import { PlayerGender } from "#enums/player-gender"; -import { IntegerHolder, randSeedInt } from "#app/utils"; +import { NumberHolder, randSeedInt } from "#app/utils"; import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; @@ -279,7 +279,7 @@ async function summonSafariPokemon() { if (pokemon.species.abilityHidden) { const hiddenIndex = pokemon.species.ability2 ? 2 : 1; if (pokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new IntegerHolder(256); + const hiddenAbilityChance = new NumberHolder(256); globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index e047a7a4f01..f7c70cb7052 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -12,7 +12,7 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode import type { PlayerPokemon } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { PokemonMove } from "#app/field/pokemon"; -import { IntegerHolder, isNullOrUndefined, randSeedInt, randSeedShuffle } from "#app/utils"; +import { NumberHolder, isNullOrUndefined, randSeedInt, randSeedShuffle } from "#app/utils"; import type PokemonSpecies from "#app/data/pokemon-species"; import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; @@ -452,7 +452,7 @@ async function postProcessTransformedPokemon(previousPokemon: PlayerPokemon, new if (newPokemon.species.abilityHidden) { const hiddenIndex = newPokemon.species.ability2 ? 2 : 1; if (newPokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new IntegerHolder(256); + const hiddenAbilityChance = new NumberHolder(256); globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index dfce632ab06..1377f11187b 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -204,7 +204,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { throw `Cannot create a player Pokemon for species '${species.getName(formIndex)}'`; } - const hiddenAbilityChance = new Utils.IntegerHolder(BASE_HIDDEN_ABILITY_CHANCE); + const hiddenAbilityChance = new Utils.NumberHolder(BASE_HIDDEN_ABILITY_CHANCE); if (!this.hasTrainer()) { globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); } @@ -960,7 +960,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns the final critical-hit stage value */ getCritStage(source: Pokemon, move: Move): number { - const critStage = new Utils.IntegerHolder(0); + const critStage = new Utils.NumberHolder(0); applyMoveAttrs(HighCritAttr, source, this, move, critStage); globalScene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critStage); globalScene.applyModifiers(TempCritBoosterModifier, source.isPlayer(), critStage); @@ -1074,7 +1074,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const baseStats = this.calculateBaseStats(); // Using base stats, calculate and store stats one by one for (const s of PERMANENT_STATS) { - const statHolder = new Utils.IntegerHolder(Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01)); + const statHolder = new Utils.NumberHolder(Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01)); if (s === Stat.HP) { statHolder.value = statHolder.value + this.level + 10; globalScene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, s, statHolder); @@ -2567,7 +2567,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @return the stat stage multiplier to be used for effective stat calculation */ getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true, ignoreHeldItems: boolean = false): number { - const statStage = new Utils.IntegerHolder(this.getStatStage(stat)); + const statStage = new Utils.NumberHolder(this.getStatStage(stat)); const ignoreStatStage = new Utils.BooleanHolder(false); if (opponent) { @@ -2617,8 +2617,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return 1; } - const userAccStage = new Utils.IntegerHolder(this.getStatStage(Stat.ACC)); - const targetEvaStage = new Utils.IntegerHolder(target.getStatStage(Stat.EVA)); + const userAccStage = new Utils.NumberHolder(this.getStatStage(Stat.ACC)); + const targetEvaStage = new Utils.NumberHolder(target.getStatStage(Stat.EVA)); const ignoreAccStatStage = new Utils.BooleanHolder(false); const ignoreEvaStatStage = new Utils.BooleanHolder(false); @@ -2797,7 +2797,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** Doubles damage if this Pokemon's last move was Glaive Rush */ - const glaiveRushMultiplier = new Utils.IntegerHolder(1); + const glaiveRushMultiplier = new Utils.NumberHolder(1); if (this.getTag(BattlerTagType.RECEIVE_DOUBLE_DAMAGE)) { glaiveRushMultiplier.value = 2; } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 35ed75d8c6e..30ad287fd98 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1186,11 +1186,11 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { if (p.species.speciesId === Species.NECROZMA) { // technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break... - let foundULTRA_Z = false, foundN_LUNA = false, foundN_SOLAR = false; formChangeItemTriggers.forEach((fc, _i) => { + console.log("Checking ", fc.item); switch (fc.item) { case FormChangeItem.ULTRANECROZIUM_Z: foundULTRA_Z = true; @@ -1206,6 +1206,8 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { if (foundULTRA_Z && foundN_LUNA && foundN_SOLAR) { // all three items are present -> user hasn't acquired any of the N_*ARIZERs -> block ULTRANECROZIUM_Z acquisition. formChangeItemTriggers = formChangeItemTriggers.filter(fc => fc.item !== FormChangeItem.ULTRANECROZIUM_Z); + } else { + console.log("DID NOT FIND "); } } return formChangeItemTriggers; diff --git a/src/phases/money-reward-phase.ts b/src/phases/money-reward-phase.ts index 70f0019227c..f460f89a72a 100644 --- a/src/phases/money-reward-phase.ts +++ b/src/phases/money-reward-phase.ts @@ -15,7 +15,7 @@ export class MoneyRewardPhase extends BattlePhase { } start() { - const moneyAmount = new Utils.IntegerHolder(globalScene.getWaveMoneyAmount(this.moneyMultiplier)); + const moneyAmount = new Utils.NumberHolder(globalScene.getWaveMoneyAmount(this.moneyMultiplier)); globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); diff --git a/src/phases/pokemon-heal-phase.ts b/src/phases/pokemon-heal-phase.ts index a544d47df70..6d0621b8f48 100644 --- a/src/phases/pokemon-heal-phase.ts +++ b/src/phases/pokemon-heal-phase.ts @@ -62,7 +62,7 @@ export class PokemonHealPhase extends CommonAnimPhase { this.message = null; return super.end(); } else if (healOrDamage) { - const hpRestoreMultiplier = new Utils.IntegerHolder(1); + const hpRestoreMultiplier = new Utils.NumberHolder(1); if (!this.revive) { globalScene.applyModifiers(HealingBoosterModifier, this.player, hpRestoreMultiplier); } diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index 3b9a0a0405c..a3a2fa1aa24 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -45,7 +45,7 @@ export class SelectModifierPhase extends BattlePhase { if (!this.isCopy) { regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); } - const modifierCount = new Utils.IntegerHolder(3); + const modifierCount = new Utils.NumberHolder(3); if (this.isPlayer()) { globalScene.applyModifiers(ExtraModifierModifier, true, modifierCount); globalScene.applyModifiers(TempExtraModifierModifier, true, modifierCount); diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index b515c6bafa8..2d1cc50603e 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -1,6 +1,6 @@ import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; -import { IntegerHolder, NumberHolder } from "#app/utils"; +import { NumberHolder } from "#app/utils"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -174,7 +174,7 @@ describe("LevelAchv", () => { it("should validate the achievement based on the level", () => { const levelAchv = new LevelAchv("", "Test Level Achievement", 100, "level_icon", 10); - const integerHolder = new IntegerHolder(50); + const integerHolder = new NumberHolder(50); expect(levelAchv.validate([ integerHolder ])).toBe(false); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index a3508532631..76d02c191bb 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -14,7 +14,7 @@ import * as Utils from "./../utils"; import Overrides from "#app/overrides"; import i18next from "i18next"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; -import { IntegerHolder } from "./../utils"; +import { NumberHolder } from "./../utils"; import Phaser from "phaser"; import type { PokeballType } from "#enums/pokeball"; @@ -191,7 +191,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const typeOptions = args[1] as ModifierTypeOption[]; const removeHealShop = globalScene.gameMode.hasNoShop; - const baseShopCost = new IntegerHolder(globalScene.getWaveMoneyAmount(1)); + const baseShopCost = new NumberHolder(globalScene.getWaveMoneyAmount(1)); globalScene.applyModifier(HealShopCostModifier, true, baseShopCost); const shopTypeOptions = !removeHealShop ? getPlayerShopModifierTypeOptionsForWave(globalScene.currentBattle.waveIndex, baseShopCost.value) diff --git a/src/utils.ts b/src/utils.ts index a906ee76391..56df3f3f48e 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -342,13 +342,6 @@ export class NumberHolder { } } -/** @deprecated Use {@linkcode NumberHolder} */ -export class IntegerHolder extends NumberHolder { - constructor(value: number) { - super(value); - } -} - export class FixedInt { public readonly value: number; From 0913c77140de9eb2df2dc3323f99719e809da427 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Mon, 17 Feb 2025 11:07:09 +1100 Subject: [PATCH 22/24] Update version number for migration code (#5354) --- package-lock.json | 4 ++-- package.json | 2 +- src/system/version_migration/version_converter.ts | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce1feb7db41..739ce18496d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.6.4", + "version": "1.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.6.4", + "version": "1.7.0", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index c9b5798af76..5a191b3ec99 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.6.4", + "version": "1.7.0", "type": "module", "scripts": { "start": "vite", diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index 95537461768..98d340d03aa 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -172,7 +172,7 @@ class SystemVersionConverter extends VersionConverter { this.callMigrators(data, v1_1_0.systemMigrators); } if (curMinor < 7) { - console.log("Applying v1.7.0 session data migration!"); + console.log("Applying v1.7.0 system data migration!"); this.callMigrators(data, v1_7_0.systemMigrators); } } @@ -202,11 +202,11 @@ class SettingsVersionConverter extends VersionConverter { this.callMigrators(data, v1_1_0.settingsMigrators); } if (curMinor < 7) { - console.log("Applying v1.7.0 session data migration!"); + console.log("Applying v1.7.0 settings data migration!"); this.callMigrators(data, v1_7_0.settingsMigrators); } } - console.log(`System data successfully migrated to v${version}!`); + console.log(`Settings data successfully migrated to v${version}!`); } } From e1327c1d2d87d85f4baa494220ee63cdf31b4b9c Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Sun, 16 Feb 2025 19:40:11 -0600 Subject: [PATCH 23/24] [Balance] Guarantee Tera Orb as a reward from Rival 4, Remove it from Classic Item Pool (#5353) * Add Tera Orb to Rival * Remove Tera Orb from Classic Rewards --- src/data/trainer-config.ts | 1 + src/modifier/modifier-type.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 9cbec400a87..d9aab528e72 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -2192,6 +2192,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540), [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setMixedBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4) + .setModifierRewardFuncs(() => modifierTypes.TERA_ORB) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, (p => { p.abilityIndex = 0; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 30ad287fd98..336cbe67ccc 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1859,7 +1859,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.IV_SCANNER, skipInLastClassicWaveOrDefault(4)), new WeightedModifierType(modifierTypes.EXP_CHARM, skipInLastClassicWaveOrDefault(8)), new WeightedModifierType(modifierTypes.EXP_SHARE, skipInLastClassicWaveOrDefault(10)), - new WeightedModifierType(modifierTypes.TERA_ORB, () => Math.min(Math.max(Math.floor(globalScene.currentBattle.waveIndex / 50) * 2, 1), 4), 4), + new WeightedModifierType(modifierTypes.TERA_ORB, () => !globalScene.gameMode.isClassic ? Math.min(Math.max(Math.floor(globalScene.currentBattle.waveIndex / 50) * 2, 1), 4) : 0, 4), new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.WIDE_LENS, 7), ].map(m => { From db2235405710da32ba7d051bbf7ff22cbf3d58dd Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Mon, 17 Feb 2025 05:30:27 +0100 Subject: [PATCH 24/24] Update starter-select-ui-handler.ts Spnaish text size (#5356) --- src/ui/starter-select-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 65c159c62a8..b919679be00 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -88,7 +88,7 @@ const languageSettings: { [key: string]: LanguageSetting } = { starterInfoXPos: 33, }, "es-ES":{ - starterInfoTextSize: "56px", + starterInfoTextSize: "52px", instructionTextSize: "35px", }, "fr":{