From e6c06d57be18ef893aa19f5efab81bb67379638f Mon Sep 17 00:00:00 2001 From: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> Date: Sun, 20 Oct 2024 23:55:07 +0200 Subject: [PATCH] [P All][Bug] Various ME bugfixes (copy) (#4695) * Mystery Encounter bugfixes * more ME bug fixes * update allowed pokemon in ME requirements * some unit test cleanup and general tidying * fix null exception on isBattleMysteryEncounter * clean up tsdocs and fix pokemon hasAbility check * fix double battle crash in challenge mode with a single eligible pokemon * apply suggestions from PR#4619's code reviews * revert fix for Keldeo crashes + implement fix suggestion from PR #4619 * fix session migration for PokemonCustomData * prevent test failure due to keldeo fix --------- Co-authored-by: ImperialSympathizer --- public/images/items.json | 10 +-- public/images/items.png | Bin 58664 -> 58527 bytes public/images/items/black_sludge.png | Bin 1026 -> 285 bytes src/battle-scene.ts | 37 ++++++-- ...pokemon-data.ts => custom-pokemon-data.ts} | 9 +- .../an-offer-you-cant-refuse-encounter.ts | 4 +- .../encounters/bug-type-superfan-encounter.ts | 13 ++- .../encounters/clowning-around-encounter.ts | 28 +++--- .../encounters/dancing-lessons-encounter.ts | 2 +- .../encounters/fight-or-flight-encounter.ts | 2 +- .../encounters/part-timer-encounter.ts | 2 +- .../shady-vitamin-dealer-encounter.ts | 2 +- .../slumbering-snorlax-encounter.ts | 6 +- .../the-expert-pokemon-breeder-encounter.ts | 28 +++--- .../encounters/the-strong-stuff-encounter.ts | 4 +- .../encounters/uncommon-breed-encounter.ts | 2 +- .../encounters/weird-dream-encounter.ts | 8 +- .../mystery-encounter-requirements.ts | 35 +++++--- .../mystery-encounters/mystery-encounter.ts | 2 +- .../utils/encounter-phase-utils.ts | 10 +-- src/field/pokemon.ts | 80 ++++++++++++------ src/modifier/modifier-type.ts | 4 +- src/modifier/modifier.ts | 2 +- src/phases/encounter-phase.ts | 10 ++- src/phases/mystery-encounter-phases.ts | 2 +- src/system/pokemon-data.ts | 19 +++-- .../version_migration/version_converter.ts | 15 ++++ .../version_migration/versions/v1_1_0.ts | 32 +++++++ .../bug-type-superfan-encounter.test.ts | 7 +- .../clowning-around-encounter.test.ts | 16 ++-- .../the-strong-stuff-encounter.test.ts | 4 +- .../encounters/weird-dream-encounter.test.ts | 2 +- 32 files changed, 263 insertions(+), 134 deletions(-) rename src/data/{mystery-encounters/mystery-encounter-pokemon-data.ts => custom-pokemon-data.ts} (68%) create mode 100644 src/system/version_migration/versions/v1_1_0.ts diff --git a/public/images/items.json b/public/images/items.json index 779823d1293..05d021b6a06 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -3416,12 +3416,12 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 24, - "h": 24 + "w": 32, + "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 2, + "x": 5, + "y": 7, "w": 22, "h": 19 }, @@ -8415,6 +8415,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:934ea4080bad980d4fea720cc771f133:ed564bc47b79b15a763de57045178e88:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:9ef21166268f7487fc9ff8d0f9b996e4:82658ac7bdd4c2b417e1f59168179262:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 5f032b30cfb048c2d0cf71ec1e6ad3f051d832c9..8aaa0281c0088a4b0ded764af22c3d5456ce167f 100644 GIT binary patch literal 58527 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 literal 58664 zcmV*IKxe;+P)eEYJmOHfSv^xDv^OF=z7#$;!jQa|^)+x^qh z(?mh?`uBf(eqUf?_A4yn#q{8Yb-RK(_nD51kB$BN#I@t;o~yUGi*ks@@cH5J`n_Im zZE@4Una}n8yvqCJ!e+S4*KU@t<@){jSy=tT^Ppdp^wh5A&rWWR_Vwtazm+20;Po$_2u#ke!$(TBD2{$GJ|ic_wpqCBXi z2FdS$vh1K9c)RJ|Kv#uschagP*0Y zoWMI;Y32IToN^V0UugZv5pUc4eq_?1kXp^R3|BpEFlNMaoNVQ!MQmvdpo|<-Nye$A zT*ZeXMD;(~Cwj*OK^xwLo+5`&X7H_NSce}QEP=I#S z)wc1~7a}+xXBJnc<9G4$2C%3z}F!<~Kqn&?QZH1X8h4sf9ld~)>77d+IGz=p4fYlcj79vL=C{E~G`dX9GvQ7mB?p`%%0000AbW%=J0RR90 zd;kCbC7a7)pnCuS010qNS#tmY4#WTe4#WYKD-Ig~03ZNKL_t(|+U&gvd=*u;@1JvW zccpKI%+m=R2!sq^7$On~7@LqV6U@+`Kp;xO7%(8iRU(Rf@&W>y76L;01~q^X1Ohl9 zjev~^3W%Tx7g~sd3Q?clwiT83{psPq)*h<%uBwy7sqcOF^VZ35QkCJPzV%yc?X_3! z^7H$D_J6DC`VC*Zn)rJwMhKxF@RKmF*BdCFIR1qE&HPui@;bk7Vc)fu{=XmhbL7U4 z_?^E0nByKdHRFlf+-iMh{+_SDPP?Hy{(+`Vx?fX6OaCwX$5K*;6S5;E#Xr(}-@?ijGxP=JyYicdos9CvVVFmiIklQ1hUzneF|e(P)dpV#yA50y0ekwYc< zO|9VCF&y4@>;PUxMCJt_BI$de11>P*yZy+0gDYB=*!NF#c*56lzgAUP<@1EkUY70i z=T`Mz!$9ma5}$z>_J|!At5obF(L3V#N?Hi7Z!%J@&?#> z`Q6<5wZuz2(@XM84sB{GDLHhgsYPI92fzYcJN%Q93<80mDuxO^1lo8Nsldoi;C0VE z*PW2*I{usAF9lvUU~J#DdBCg6d7s`9cxC(exf8%^mGizEJ%QJ1AHVZy;N<{JKYaMZ zHETXRd{}Se9yce2784sQ=_@a6z<^++=ESS1d28d>;Qbi9>+E+nZ8~)M5ZL8I&CNGk ziUA}dg32p9+mx3VQAGywcWOvs|8*V<%_H;#n6B47G3SXV=IEBA zR|Tf)d#bXks}c9?bFDllE2y{gZuReh}cR)gt!+3NGFSD&};+Y6@a z?;);uJCwzxhcmzqmoC=*boq$++T#XDu~b*v!6sSv>oXaT1u?zp4wi4Jq-sQLn0z^N)LYfn{SR+g$SpcMu$DJ%?m zg{k@iTEJ=5lqs`U_3qP0)fdnLPOBf@UbcGC`SYs2fEIAt`}W(wD_(Vo1dj|ETUuIL z4ezB3;sW8LuI?$d>;WvHu}oTAW3dJ=kX4t7U|quUth{vn&>{4BbLQk9BIN6@x0V?% zno|RPyhRpU9W~C~@Tn`IdwhTZ4s+#-5di{S&(E6}XZ!lyw zdqJP^%FmJQ=NEw?v$93!BX26d^X+&vWcFTs{E9gF$9kT=Q`gt589R3S-5*zGWGpxl zxZCAgtjl{csF`~ZODv-m!-2&nnY<`20A}T-*VaN>v9sh5W*0ZFzqR$I@gi>|-`INN zMpIKwO$`8Re(>hkC39+PbszGQq8FDJrW|O9OXbC~c|v4)-E;l?b&wd?_4JCt_uYrU z^d3FtVAw)rb+>eB;_*Y^%EGXP$o6FY^;=~hlDhwXV1~SEJj%Wg$M(Ung~(?2`A+@0 zhaWzVVGEI!oiDqo?0frd$_kOa7ysutWnWB2#+_dOPd-@#|8B_GPu6_02K*k%$lSAF zK}N<{uepcuij83w0#8GQynt68@QPgF$ZJM^e#wyL%lSa8r1^4l+6|#QP*&X#fK^vl z$B=C-$*(PGa+cQ)CtgfpUdT5TUZg+R0x~j8me=*`>E{vGbt

?z@lBAUfj?z?JaC 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 diff --git a/public/images/items/black_sludge.png b/public/images/items/black_sludge.png index 39684a403108232447925646dd56e61186de91c0..37aa31de43eaa5314563d42550b2fc912c1a4210 100644 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10LMXr|#1%--S+b?Odrfh1 zx0hFxf`UTZnx~V1qKqX$e!&b5&u*jvIklcHjv*Dd-cEMxVs_*?a%|F{|N8F}72Ch0 z*iCp5)pV$BSKXZryU%a@wP4MehToe0a=of8?ui-)?*3-$W_;rpDLg~+Oy4}-)iPfE z$-E4QSsur3VBF9WyhCiZBtyVCu8tzN)puSC_$&^3y5kU|f$gXIvT(NAy`NIzYwipE ZW0)Dp%oLNzu)Ha0{(J4HS} zS3f{kKR{VPK370NT0lZnLPAhNLRmvZT0}!yL_}0XL|sHhTSY@(MMPaiMqEZjPDV#y zMo3vkNmEBeU`Iw)M@CpjNMT1wTS!G@NJd~tM^H#dS4c-$NJv#lM`1}vV@XI|Nl8^n zNm)rrU`a`0NlIKwNMcG#WlBp@N=sBqO;t-tV@pj@OHNo!OJYn*WK2w4Oig1=PGwC_ zXH8I8PE1x#Ok++>R8CK3PflV_Qe96|TTo9{QBqrGXMJdBc4=yWYHNaOYlLfRd~Ium zZES;WZFy~Ngl%tpZfu5bY>IAegl=w!Zf}KeZHI4diEnR+Z*Ychaei=diE(d+a&L=r zZ;f(qkaBQ`a&U=qaf5PleR6Vta&wGxafx$ri*#|2ba9e&a*lL!h;(#|b#sk%bB}d& ziFI~}b#{t&c8GR&jdysCcz20-d60W~k$ZcKet(yLfSG@Rm4Jbof`XfZgO!7WoP&g# zgn^=jgq?(ikc5Ssg@l`hg_VVcmxYF$g@}}fhn|LqpoWN=hlQSphMI?mqlbu}hlrtv ziJ6CrmxzU=h=!hshnk6or-_M|iHV?ziK2>#qKb)}iix0#ikgawql$~6i;J0yi=B&$ zq>PKAjEtU)jiZf@rHziKj*F>|jH8Z^rjC!OkBym+jirx{p^%ZIl98yBl&X`Itdy0m zm6orUm#~&_Lxr7i+QEB~r zPKXBfybUXo)DjaFmRaf;#+2riE%t)C$~yn}o*4_)M>rOy7iL$)P2z$3gPnt~dF_#f w4PnbC?W$sQMhO%fejYAXRskL+HU|0u0CSsUMn*K#UjP6A07*qoM6N<$g7)&aN&o-= diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 0d482a5f1a5..096a84dde3d 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -86,7 +86,7 @@ import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-ph import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; -import { allMysteryEncounters, ANTI_VARIANCE_WEIGHT_MODIFIER, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT, mysteryEncountersByBiome, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; +import { allMysteryEncounters, ANTI_VARIANCE_WEIGHT_MODIFIER, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT, mysteryEncountersByBiome } from "#app/data/mystery-encounters/mystery-encounters"; import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-encounter-save-data"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -1207,12 +1207,10 @@ export default class BattleScene extends SceneBase { // Check for mystery encounter // Can only occur in place of a standard (non-boss) wild battle, waves 10-180 - if (this.isWaveMysteryEncounter(newBattleType, newWaveIndex, mysteryEncounterType) || newBattleType === BattleType.MYSTERY_ENCOUNTER) { + if (this.isWaveMysteryEncounter(newBattleType, newWaveIndex) || newBattleType === BattleType.MYSTERY_ENCOUNTER) { newBattleType = BattleType.MYSTERY_ENCOUNTER; - // Reset base spawn weight + // Reset to base spawn weight this.mysteryEncounterSaveData.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; - } else if (newBattleType === BattleType.WILD) { - this.mysteryEncounterSaveData.encounterSpawnChance += WEIGHT_INCREMENT_ON_SPAWN_MISS; } } @@ -2364,6 +2362,19 @@ export default class BattleScene extends SceneBase { return false; } + /** + * Will search for a specific phase in {@linkcode phaseQueuePrepend} via filter, and remove the first result if a match is found. + * @param phaseFilter filter function + */ + tryRemoveUnshiftedPhase(phaseFilter: (phase: Phase) => boolean): boolean { + const phaseIndex = this.phaseQueuePrepend.findIndex(phaseFilter); + if (phaseIndex > -1) { + this.phaseQueuePrepend.splice(phaseIndex, 1); + return true; + } + return false; + } + /** * Tries to add the input phase to index before target phase in the phaseQueue, else simply calls unshiftPhase() * @param phase {@linkcode Phase} the phase to be added @@ -3125,18 +3136,26 @@ export default class BattleScene extends SceneBase { } } + /** + * Returns if a wave COULD spawn a {@linkcode MysteryEncounter}. + * Even if returns `true`, does not guarantee that a wave will actually be a ME. + * That check is made in {@linkcode BattleScene.isWaveMysteryEncounter} instead. + */ + isMysteryEncounterValidForWave(battleType: BattleType, waveIndex: number): boolean { + const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); + return this.gameMode.hasMysteryEncounters && battleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave; + } + /** * Determines whether a wave should randomly generate a {@linkcode MysteryEncounter}. * Currently, the only modes that MEs are allowed in are Classic and Challenge. * Additionally, MEs cannot spawn outside of waves 10-180 in those modes - * * @param newBattleType * @param waveIndex - * @param sessionDataEncounterType */ - private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number, sessionDataEncounterType?: MysteryEncounterType): boolean { + private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number): boolean { const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); - if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave) { + if (this.isMysteryEncounterValidForWave(newBattleType, waveIndex)) { // Base spawn weight is BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT/256, and increases by WEIGHT_INCREMENT_ON_SPAWN_MISS/256 for each missed attempt at spawning an encounter on a valid floor const sessionEncounterRate = this.mysteryEncounterSaveData.encounterSpawnChance; const encounteredEvents = this.mysteryEncounterSaveData.encounteredEvents; diff --git a/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts b/src/data/custom-pokemon-data.ts similarity index 68% rename from src/data/mystery-encounters/mystery-encounter-pokemon-data.ts rename to src/data/custom-pokemon-data.ts index fc6ce313d41..2e94123fc84 100644 --- a/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts +++ b/src/data/custom-pokemon-data.ts @@ -1,18 +1,20 @@ import { Abilities } from "#enums/abilities"; import { Type } from "#app/data/type"; import { isNullOrUndefined } from "#app/utils"; +import { Nature } from "#enums/nature"; /** * Data that can customize a Pokemon in non-standard ways from its Species - * Currently only used by Mystery Encounters, may need to be renamed if it becomes more widely used + * Currently only used by Mystery Encounters and Mints. */ -export class MysteryEncounterPokemonData { +export class CustomPokemonData { public spriteScale: number; public ability: Abilities | -1; public passive: Abilities | -1; + public nature: Nature | -1; public types: Type[]; - constructor(data?: MysteryEncounterPokemonData | Partial) { + constructor(data?: CustomPokemonData | Partial) { if (!isNullOrUndefined(data)) { Object.assign(this, data); } @@ -20,6 +22,7 @@ export class MysteryEncounterPokemonData { this.spriteScale = this.spriteScale ?? -1; this.ability = this.ability ?? -1; this.passive = this.passive ?? -1; + this.nature = this.nature ?? -1; this.types = this.types ?? []; } } diff --git a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts index ab892ae00f2..8dc4eca25bf 100644 --- a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts +++ b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts @@ -133,8 +133,8 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) .withPrimaryPokemonRequirement(new CombinationPokemonRequirement( - new MoveRequirement(EXTORTION_MOVES), - new AbilityRequirement(EXTORTION_ABILITIES)) + new MoveRequirement(EXTORTION_MOVES, true), + new AbilityRequirement(EXTORTION_ABILITIES, true)) ) .withDialogue({ buttonLabel: `${namespace}:option.2.label`, diff --git a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts index b5d47cf6912..d316ab14cde 100644 --- a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts +++ b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts @@ -42,6 +42,8 @@ import { AttackTypeBoosterModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, + GigantamaxAccessModifier, + MegaEvolutionAccessModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; import i18next from "i18next"; @@ -356,10 +358,17 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = }, ]; } else { - // If player has any evolution/form change items that are valid for their party, will spawn one of those items in addition to a Master Ball - const modifierOptions: ModifierTypeOption[] = [ generateModifierTypeOption(scene, modifierTypes.MASTER_BALL)!, generateModifierTypeOption(scene, modifierTypes.MAX_LURE)! ]; + // If the player has any evolution/form change items that are valid for their party, + // spawn one of those items in addition to Dynamax Band, Mega Band, and Master Ball + const modifierOptions: ModifierTypeOption[] = [ generateModifierTypeOption(scene, modifierTypes.MASTER_BALL)! ]; const specialOptions: ModifierTypeOption[] = []; + if (!scene.findModifier(m => m instanceof MegaEvolutionAccessModifier)) { + modifierOptions.push(generateModifierTypeOption(scene, modifierTypes.MEGA_BRACELET)!); + } + if (!scene.findModifier(m => m instanceof GigantamaxAccessModifier)) { + modifierOptions.push(generateModifierTypeOption(scene, modifierTypes.DYNAMAX_BAND)!); + } const nonRareEvolutionModifier = generateModifierTypeOption(scene, modifierTypes.EVOLUTION_ITEM); if (nonRareEvolutionModifier) { specialOptions.push(nonRareEvolutionModifier); diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index be52ab42c9d..57c8aa7a561 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -28,7 +28,7 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#enums/moves"; import { EncounterBattleAnim } from "#app/data/battle-anims"; import { MoveCategory } from "#app/data/move"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { EncounterAnim } from "#enums/encounter-anims"; import { Challenges } from "#enums/challenges"; @@ -133,7 +133,7 @@ export const ClowningAroundEncounter: MysteryEncounter = }, { // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter species: getPokemonSpecies(Species.BLACEPHALON), - mysteryEncounterPokemonData: new MysteryEncounterPokemonData({ ability: ability, types: [ randSeedInt(18), randSeedInt(18) ]}), + customPokemonData: new CustomPokemonData({ ability: ability, types: [ randSeedInt(18), randSeedInt(18) ]}), isBoss: true, moveSet: [ Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN ] }, @@ -353,15 +353,15 @@ export const ClowningAroundEncounter: MysteryEncounter = newTypes.push(secondType); // Apply the type changes (to both base and fusion, if pokemon is fused) - if (!pokemon.mysteryEncounterPokemonData) { - pokemon.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(); + if (!pokemon.customPokemonData) { + pokemon.customPokemonData = new CustomPokemonData(); } - pokemon.mysteryEncounterPokemonData.types = newTypes; + pokemon.customPokemonData.types = newTypes; if (pokemon.isFusion()) { - if (!pokemon.fusionMysteryEncounterPokemonData) { - pokemon.fusionMysteryEncounterPokemonData = new MysteryEncounterPokemonData(); + if (!pokemon.fusionCustomPokemonData) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(); } - pokemon.fusionMysteryEncounterPokemonData.types = newTypes; + pokemon.fusionCustomPokemonData.types = newTypes; } } }) @@ -426,15 +426,15 @@ function onYesAbilitySwap(scene: BattleScene, resolve) { // Do ability swap const encounter = scene.currentBattle.mysteryEncounter!; if (pokemon.isFusion()) { - if (!pokemon.fusionMysteryEncounterPokemonData) { - pokemon.fusionMysteryEncounterPokemonData = new MysteryEncounterPokemonData(); + if (!pokemon.fusionCustomPokemonData) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(); } - pokemon.fusionMysteryEncounterPokemonData.ability = encounter.misc.ability; + pokemon.fusionCustomPokemonData.ability = encounter.misc.ability; } else { - if (!pokemon.mysteryEncounterPokemonData) { - pokemon.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(); + if (!pokemon.customPokemonData) { + pokemon.customPokemonData = new CustomPokemonData(); } - pokemon.mysteryEncounterPokemonData.ability = encounter.misc.ability; + pokemon.customPokemonData.ability = encounter.misc.ability; } encounter.setDialogueToken("chosenPokemon", pokemon.getNameToRender()); scene.ui.setMode(Mode.MESSAGE).then(() => resolve(true)); diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index d7f71194f48..55d7ce0e92d 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -236,7 +236,7 @@ export const DancingLessonsEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(DANCING_MOVES)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically + .withPrimaryPokemonRequirement(new MoveRequirement(DANCING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}:option.3.label`, buttonTooltip: `${namespace}:option.3.tooltip`, diff --git a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts index 380662ca817..889868519d2 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -145,7 +145,7 @@ export const FightOrFlightEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}:option.2.label`, buttonTooltip: `${namespace}:option.2.tooltip`, diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts index 17a3a366569..092d2ab2673 100644 --- a/src/data/mystery-encounters/encounters/part-timer-encounter.ts +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -227,7 +227,7 @@ export const PartTimerEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically + .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}:option.3.label`, buttonTooltip: `${namespace}:option.3.tooltip`, diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts index 5b609a2b1c3..d30c97b27de 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -138,7 +138,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = newNature = randSeedInt(25) as Nature; } - chosenPokemon.nature = newNature; + chosenPokemon.customPokemonData.nature = newNature; encounter.setDialogueToken("newNature", getNatureName(newNature)); queueEncounterMessage(scene, `${namespace}:cheap_side_effects`); setEncounterExp(scene, [ chosenPokemon.id ], 100); diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index 3a4bf465a78..8ea19e1225b 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -18,7 +18,7 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode import { PartyHealPhase } from "#app/phases/party-heal-phase"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { BerryType } from "#enums/berry-type"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; /** i18n namespace for the encounter */ const namespace = "mysteryEncounters/slumberingSnorlax"; @@ -72,7 +72,7 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = stackCount: 2 }, ], - mysteryEncounterPokemonData: new MysteryEncounterPokemonData({ spriteScale: 1.25 }), + customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), aiType: AiType.SMART // Required to ensure Snorlax uses Sleep Talk while it is asleep }; const config: EnemyPartyConfig = { @@ -143,7 +143,7 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) .withDialogue({ buttonLabel: `${namespace}:option.3.label`, buttonTooltip: `${namespace}:option.3.tooltip`, 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 945e7ee188d..9c10d33d019 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 @@ -25,6 +25,7 @@ import { achvs } from "#app/system/achv"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { Type } from "#app/data/type"; import { getPokeballTintColor } from "#app/data/pokeball"; +import { PokemonHeldItemModifier } from "#app/modifier/modifier"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounters/theExpertPokemonBreeder"; @@ -163,7 +164,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = if (pokemon2CommonEggs > 0) { const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon2CommonEggs, rarity: i18next.t("egg:defaultTier") }); pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon1CommonEggs", eggsText); + encounter.setDialogueToken("pokemon2CommonEggs", eggsText); } encounter.options[1].dialogue!.buttonTooltip = pokemon2Tooltip; @@ -221,7 +222,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.misc.chosenPokemon = pokemon1; encounter.setDialogueToken("chosenPokemon", pokemon1.getNameToRender()); const eggOptions = getEggOptions(scene, pokemon1CommonEggs, pokemon1RareEggs); - setEncounterRewards(scene, { fillRemaining: true }, eggOptions); + setEncounterRewards(scene, { fillRemaining: true }, eggOptions, () => doPostEncounterCleanup(scene)); // Remove all Pokemon from the party except the chosen Pokemon removePokemonFromPartyAndStoreHeldItems(scene, encounter, pokemon1); @@ -247,9 +248,6 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.onGameOver = onGameOver; await initBattleWithEnemyConfig(scene, config); }) - .withPostOptionPhase(async (scene: BattleScene) => { - await doPostEncounterCleanup(scene); - }) .build() ) .withOption( @@ -273,7 +271,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.misc.chosenPokemon = pokemon2; encounter.setDialogueToken("chosenPokemon", pokemon2.getNameToRender()); const eggOptions = getEggOptions(scene, pokemon2CommonEggs, pokemon2RareEggs); - setEncounterRewards(scene, { fillRemaining: true }, eggOptions); + setEncounterRewards(scene, { fillRemaining: true }, eggOptions, () => doPostEncounterCleanup(scene)); // Remove all Pokemon from the party except the chosen Pokemon removePokemonFromPartyAndStoreHeldItems(scene, encounter, pokemon2); @@ -299,9 +297,6 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.onGameOver = onGameOver; await initBattleWithEnemyConfig(scene, config); }) - .withPostOptionPhase(async (scene: BattleScene) => { - await doPostEncounterCleanup(scene); - }) .build() ) .withOption( @@ -325,7 +320,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.misc.chosenPokemon = pokemon3; encounter.setDialogueToken("chosenPokemon", pokemon3.getNameToRender()); const eggOptions = getEggOptions(scene, pokemon3CommonEggs, pokemon3RareEggs); - setEncounterRewards(scene, { fillRemaining: true }, eggOptions); + setEncounterRewards(scene, { fillRemaining: true }, eggOptions, () => doPostEncounterCleanup(scene)); // Remove all Pokemon from the party except the chosen Pokemon removePokemonFromPartyAndStoreHeldItems(scene, encounter, pokemon3); @@ -351,9 +346,6 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.onGameOver = onGameOver; await initBattleWithEnemyConfig(scene, config); }) - .withPostOptionPhase(async (scene: BattleScene) => { - await doPostEncounterCleanup(scene); - }) .build() ) .withOutroDialogue([ @@ -521,19 +513,19 @@ function checkAchievement(scene: BattleScene) { } } -async function restorePartyAndHeldItems(scene: BattleScene) { +function restorePartyAndHeldItems(scene: BattleScene) { const encounter = scene.currentBattle.mysteryEncounter!; // Restore original party scene.getParty().push(...encounter.misc.originalParty); // Restore held items const originalHeldItems = encounter.misc.originalPartyHeldItems; - originalHeldItems.forEach(pokemonHeldItemsList => { + originalHeldItems.forEach((pokemonHeldItemsList: PokemonHeldItemModifier[]) => { pokemonHeldItemsList.forEach(heldItem => { scene.addModifier(heldItem, true, false, false, true); }); }); - await scene.updateModifiers(true); + scene.updateModifiers(true); } function onGameOver(scene: BattleScene) { @@ -609,13 +601,13 @@ function onGameOver(scene: BattleScene) { return false; } -async function doPostEncounterCleanup(scene: BattleScene) { +function doPostEncounterCleanup(scene: BattleScene) { const encounter = scene.currentBattle.mysteryEncounter!; if (!encounter.misc.encounterFailed) { // Give achievement if in Space biome checkAchievement(scene); // Give 20 friendship to the chosen pokemon encounter.misc.chosenPokemon.addFriendship(FRIENDSHIP_ADDED); - await restorePartyAndHeldItems(scene); + restorePartyAndHeldItems(scene); } } diff --git a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts index 03cf86d06a5..397d2af9522 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -14,7 +14,7 @@ import { BattlerIndex } from "#app/battle"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { Stat } from "#enums/stat"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; @@ -79,7 +79,7 @@ export const TheStrongStuffEncounter: MysteryEncounter = species: getPokemonSpecies(Species.SHUCKLE), isBoss: true, bossSegments: 5, - mysteryEncounterPokemonData: new MysteryEncounterPokemonData({ spriteScale: 1.25 }), + customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), nature: Nature.BOLD, moveSet: [ Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER ], modifierConfigs: [ diff --git a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts index 13594f273d9..b7ce3bab48c 100644 --- a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts +++ b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts @@ -210,7 +210,7 @@ export const UncommonBreedEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}:option.3.label`, buttonTooltip: `${namespace}:option.3.tooltip`, diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index 6e2f8352480..b97a22dbe51 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 { IntegerHolder, isNullOrUndefined, randSeedInt, randSeedShuffle } from " import PokemonSpecies, { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; import { HiddenAbilityRateBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; import { achvs } from "#app/system/achv"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; @@ -379,10 +379,10 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon newType = randSeedInt(18) as Type; } newTypes.push(newType); - if (!newPokemon.mysteryEncounterPokemonData) { - newPokemon.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(); + if (!newPokemon.customPokemonData) { + newPokemon.customPokemonData = new CustomPokemonData(); } - newPokemon.mysteryEncounterPokemonData.types = newTypes; + newPokemon.customPokemonData.types = newTypes; for (const item of transformation.heldItems) { item.pokemonId = newPokemon.id; diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 86e04e80807..a57cedc8fa3 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -15,6 +15,7 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { AttackTypeBoosterModifier } from "#app/modifier/modifier"; import { AttackTypeBoosterModifierType } from "#app/modifier/modifier-type"; import { SpeciesFormKey } from "#enums/species-form-key"; +import { allAbilities } from "#app/data/ability"; export interface EncounterRequirement { meetsRequirement(scene: BattleScene): boolean; // Boolean to see if a requirement is met @@ -476,9 +477,11 @@ export class MoveRequirement extends EncounterPokemonRequirement { requiredMoves: Moves[] = []; minNumberOfPokemon: number; invertQuery: boolean; + excludeDisallowedPokemon: boolean; - constructor(moves: Moves | Moves[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(moves: Moves | Moves[], excludeDisallowedPokemon: boolean, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); + this.excludeDisallowedPokemon = excludeDisallowedPokemon; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; this.requiredMoves = Array.isArray(moves) ? moves : [ moves ]; @@ -494,10 +497,15 @@ export class MoveRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move?.moveId === reqMove).length > 0).length > 0); + // get the Pokemon with at least one move in the required moves list + return partyPokemon.filter((pokemon) => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) + && pokemon.moveset.some((move) => move?.moveId && this.requiredMoves.includes(move.moveId))); } else { // for an inverted query, we only want to get the pokemon that don't have ANY of the listed moves - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move?.moveId === reqMove).length === 0).length === 0); + return partyPokemon.filter((pokemon) => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) + && !pokemon.moveset.some((move) => move?.moveId && this.requiredMoves.includes(move.moveId))); } } @@ -559,9 +567,11 @@ export class AbilityRequirement extends EncounterPokemonRequirement { requiredAbilities: Abilities[]; minNumberOfPokemon: number; invertQuery: boolean; + excludeDisallowedPokemon: boolean; - constructor(abilities: Abilities | Abilities[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(abilities: Abilities | Abilities[], excludeDisallowedPokemon: boolean, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); + this.excludeDisallowedPokemon = excludeDisallowedPokemon; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; this.requiredAbilities = Array.isArray(abilities) ? abilities : [ abilities ]; @@ -577,16 +587,21 @@ export class AbilityRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredAbilities.some((ability) => pokemon.getAbility().id === ability)); + return partyPokemon.filter((pokemon) => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) + && this.requiredAbilities.some((ability) => pokemon.hasAbility(ability, false))); } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed abilitiess - return partyPokemon.filter((pokemon) => this.requiredAbilities.filter((ability) => pokemon.getAbility().id === ability).length === 0); + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed abilities + return partyPokemon.filter((pokemon) => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) + && this.requiredAbilities.filter((ability) => pokemon.hasAbility(ability, false)).length === 0); } } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - if (pokemon?.getAbility().id && this.requiredAbilities.some(a => pokemon.getAbility().id === a)) { - return [ "ability", pokemon.getAbility().name ]; + override getDialogueToken(_scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + const matchingAbility = this.requiredAbilities.find(a => pokemon?.hasAbility(a, false)); + if (!isNullOrUndefined(matchingAbility)) { + return [ "ability", allAbilities[matchingAbility].name ]; } return [ "ability", "" ]; } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 7e175957e21..ee9eb159e10 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -325,7 +325,7 @@ export default class MysteryEncounter implements IMysteryEncounter { if (activeMon.length > 0) { this.primaryPokemon = activeMon[0]; } else { - this.primaryPokemon = scene.getParty().filter(p => !p.isFainted())[0]; + this.primaryPokemon = scene.getParty().filter(p => p.isAllowedInBattle())[0]; } return true; } diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 485b955f998..5cd2fbffd5f 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -27,7 +27,7 @@ import { Status, StatusEffect } from "#app/data/status-effect"; import { TrainerConfig, trainerConfigs, TrainerSlot } from "#app/data/trainer-config"; import PokemonSpecies from "#app/data/pokemon-species"; import { Egg, IEggOptions } from "#app/data/egg"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import HeldModifierConfig from "#app/interfaces/held-modifier-config"; import { MovePhase } from "#app/phases/move-phase"; import { EggLapsePhase } from "#app/phases/egg-lapse-phase"; @@ -71,7 +71,7 @@ export interface EnemyPokemonConfig { nickname?: string; bossSegments?: number; bossSegmentModifier?: number; // Additive to the determined segment number - mysteryEncounterPokemonData?: MysteryEncounterPokemonData; + customPokemonData?: CustomPokemonData; formIndex?: number; abilityIndex?: number; level?: number; @@ -145,7 +145,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: newTrainer.setVisible(false); scene.field.add(newTrainer); scene.currentBattle.trainer = newTrainer; - loadEnemyAssets.push(newTrainer.loadAssets()); + loadEnemyAssets.push(newTrainer.loadAssets().then(() => newTrainer.initSprite())); battle.enemyLevels = scene.currentBattle.trainer.getPartyLevels(scene.currentBattle.waveIndex); } else { @@ -250,8 +250,8 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: } // Set custom mystery encounter data fields (such as sprite scale, custom abilities, types, etc.) - if (!isNullOrUndefined(config.mysteryEncounterPokemonData)) { - enemyPokemon.mysteryEncounterPokemonData = config.mysteryEncounterPokemonData; + if (!isNullOrUndefined(config.customPokemonData)) { + enemyPokemon.customPokemonData = config.customPokemonData; } // Set Boss diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 0afbbf105e2..7f2b4ec015d 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -62,7 +62,7 @@ import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-ph import { Challenges } from "#enums/challenges"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { SwitchType } from "#enums/switch-type"; import { SpeciesFormKey } from "#enums/species-form-key"; import { BASE_HIDDEN_ABILITY_CHANCE, BASE_SHINY_CHANCE, SHINY_EPIC_CHANCE, SHINY_VARIANT_CHANCE } from "#app/data/balance/rates"; @@ -114,7 +114,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public fusionVariant: Variant; public fusionGender: Gender; public fusionLuck: integer; - public fusionMysteryEncounterPokemonData: MysteryEncounterPokemonData | null; + public fusionCustomPokemonData: CustomPokemonData | null; private summonDataPrimer: PokemonSummonData | null; @@ -122,7 +122,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public battleData: PokemonBattleData; public battleSummonData: PokemonBattleSummonData; public turnData: PokemonTurnData; - public mysteryEncounterPokemonData: MysteryEncounterPokemonData; + public customPokemonData: CustomPokemonData; /** Used by Mystery Encounters to execute pokemon-specific logic (such as stat boosts) at start of battle */ public mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void; @@ -193,7 +193,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.nature = dataSource.nature || 0 as Nature; this.nickname = dataSource.nickname; - this.natureOverride = dataSource.natureOverride !== undefined ? dataSource.natureOverride : -1; this.moveset = dataSource.moveset; this.status = dataSource.status!; // TODO: is this bang correct? this.friendship = dataSource.friendship !== undefined ? dataSource.friendship : this.species.baseFriendship; @@ -212,9 +211,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.fusionVariant = dataSource.fusionVariant || 0; this.fusionGender = dataSource.fusionGender; this.fusionLuck = dataSource.fusionLuck; - this.fusionMysteryEncounterPokemonData = dataSource.fusionMysteryEncounterPokemonData; + this.fusionCustomPokemonData = dataSource.fusionCustomPokemonData; this.usedTMs = dataSource.usedTMs ?? []; - this.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(dataSource.mysteryEncounterPokemonData); + this.customPokemonData = new CustomPokemonData(dataSource.customPokemonData); } else { this.id = Utils.randSeedInt(4294967296); this.ivs = ivs || Utils.getIvsFromId(this.id); @@ -235,7 +234,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.variant = this.shiny ? this.generateVariant() : 0; } - this.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(); + this.customPokemonData = new CustomPokemonData(); if (nature !== undefined) { this.setNature(nature); @@ -243,8 +242,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.generateNature(); } - this.natureOverride = -1; - this.friendship = species.baseFriendship; this.metLevel = level; this.metBiome = scene.currentBattle ? scene.arena.biomeType : -1; @@ -593,8 +590,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const formKey = this.getFormKey(); if (this.isMax() === true || formKey === "segin-starmobile" || formKey === "schedar-starmobile" || formKey === "navi-starmobile" || formKey === "ruchbah-starmobile" || formKey === "caph-starmobile") { return 1.5; - } else if (this.mysteryEncounterPokemonData.spriteScale > 0) { - return this.mysteryEncounterPokemonData.spriteScale; + } else if (this.customPokemonData.spriteScale > 0) { + return this.customPokemonData.spriteScale; } return 1; } @@ -1023,7 +1020,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getNature(): Nature { - return this.natureOverride !== -1 ? this.natureOverride : this.nature; + return this.customPokemonData.nature !== -1 ? this.customPokemonData.nature : this.nature; } setNature(nature: Nature): void { @@ -1198,15 +1195,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!types.length || !includeTeraType) { if (!ignoreOverride && this.summonData?.types && this.summonData.types.length > 0) { this.summonData.types.forEach(t => types.push(t)); - } else if (this.mysteryEncounterPokemonData.types && this.mysteryEncounterPokemonData.types.length > 0) { + } else if (this.customPokemonData.types && this.customPokemonData.types.length > 0) { // "Permanent" override for a Pokemon's normal types, currently only used by Mystery Encounters - types.push(this.mysteryEncounterPokemonData.types[0]); + types.push(this.customPokemonData.types[0]); // Fusing a Pokemon onto something with "permanently changed" types will still apply the fusion's types as normal const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOverride); if (fusionSpeciesForm) { // Check if the fusion Pokemon also had "permanently changed" types - const fusionMETypes = this.fusionMysteryEncounterPokemonData?.types; + const fusionMETypes = this.fusionCustomPokemonData?.types; if (fusionMETypes && fusionMETypes.length >= 2 && fusionMETypes[1] !== types[0]) { types.push(fusionMETypes[1]); } else if (fusionMETypes && fusionMETypes.length === 1 && fusionMETypes[0] !== types[0]) { @@ -1218,8 +1215,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - if (types.length === 1 && this.mysteryEncounterPokemonData.types.length >= 2) { - types.push(this.mysteryEncounterPokemonData.types[1]); + if (types.length === 1 && this.customPokemonData.types.length >= 2) { + types.push(this.customPokemonData.types[1]); } } else { const speciesForm = this.getSpeciesForm(ignoreOverride); @@ -1230,7 +1227,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (fusionSpeciesForm) { // Check if the fusion Pokemon also had "permanently changed" types // Otherwise, use standard fusion type logic - const fusionMETypes = this.fusionMysteryEncounterPokemonData?.types; + const fusionMETypes = this.fusionCustomPokemonData?.types; if (fusionMETypes && fusionMETypes.length >= 2 && fusionMETypes[1] !== types[0]) { types.push(fusionMETypes[1]); } else if (fusionMETypes && fusionMETypes.length === 1 && fusionMETypes[0] !== types[0]) { @@ -1262,6 +1259,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + // If both types are the same (can happen in weird custom typing scenarios), reduce to single type + if (types.length > 1 && types[0] === types[1]) { + types.splice(0, 1); + } + return types; } @@ -1288,14 +1290,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return allAbilities[Overrides.OPP_ABILITY_OVERRIDE]; } if (this.isFusion()) { - if (!isNullOrUndefined(this.fusionMysteryEncounterPokemonData?.ability) && this.fusionMysteryEncounterPokemonData.ability !== -1) { - return allAbilities[this.fusionMysteryEncounterPokemonData.ability]; + if (!isNullOrUndefined(this.fusionCustomPokemonData?.ability) && this.fusionCustomPokemonData.ability !== -1) { + return allAbilities[this.fusionCustomPokemonData.ability]; } else { return allAbilities[this.getFusionSpeciesForm(ignoreOverride).getAbility(this.fusionAbilityIndex)]; } } - if (!isNullOrUndefined(this.mysteryEncounterPokemonData.ability) && this.mysteryEncounterPokemonData.ability !== -1) { - return allAbilities[this.mysteryEncounterPokemonData.ability]; + if (!isNullOrUndefined(this.customPokemonData.ability) && this.customPokemonData.ability !== -1) { + return allAbilities[this.customPokemonData.ability]; } let abilityId = this.getSpeciesForm(ignoreOverride).getAbility(this.abilityIndex); if (abilityId === Abilities.NONE) { @@ -1318,8 +1320,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE && !this.isPlayer()) { return allAbilities[Overrides.OPP_PASSIVE_ABILITY_OVERRIDE]; } - if (!isNullOrUndefined(this.mysteryEncounterPokemonData.passive) && this.mysteryEncounterPokemonData.passive !== -1) { - return allAbilities[this.mysteryEncounterPokemonData.passive]; + if (!isNullOrUndefined(this.customPokemonData.passive) && this.customPokemonData.passive !== -1) { + return allAbilities[this.customPokemonData.passive]; } let starterSpeciesId = this.species.speciesId; @@ -2018,7 +2020,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.fusionVariant = 0; this.fusionGender = 0; this.fusionLuck = 0; - this.fusionMysteryEncounterPokemonData = null; + this.fusionCustomPokemonData = null; this.generateName(); this.calculateStats(); @@ -2187,7 +2189,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.moveset.push(new PokemonMove(movePool[index][0], 0, 0)); } - this.scene.triggerPokemonFormChange(this, SpeciesFormChangeMoveLearnedTrigger); + // Trigger FormChange, except for enemy Pokemon during Mystery Encounters, to avoid crashes + if (this.isPlayer() || !this.scene.currentBattle?.isBattleMysteryEncounter() || !this.scene.currentBattle?.mysteryEncounter) { + this.scene.triggerPokemonFormChange(this, SpeciesFormChangeMoveLearnedTrigger); + } } trySelectMove(moveIndex: integer, ignorePp?: boolean): boolean { @@ -4292,12 +4297,33 @@ export class PlayerPokemon extends Pokemon { changeForm(formChange: SpeciesFormChange): Promise { return new Promise(resolve => { + const previousFormIndex = this.formIndex; this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); this.generateName(); const abilityCount = this.getSpeciesForm().getAbilityCount(); if (this.abilityIndex >= abilityCount) { // Shouldn't happen this.abilityIndex = abilityCount - 1; } + + // In cases where a form change updates the type of a Pokemon from its previous form (Arceus, Silvally, Castform, etc.), + // persist that type change in customPokemonData if necessary + const baseForm = this.species.forms[previousFormIndex]; + const baseFormTypes = [ baseForm.type1, baseForm.type2 ]; + if (this.customPokemonData.types.length > 0) { + if (this.getSpeciesForm().type1 !== baseFormTypes[0]) { + this.customPokemonData.types[0] = this.getSpeciesForm().type1; + } + + const type2 = this.getSpeciesForm().type2; + if (!isNullOrUndefined(type2) && type2 !== baseFormTypes[1]) { + if (this.customPokemonData.types.length > 1) { + this.customPokemonData.types[1] = type2; + } else { + this.customPokemonData.types.push(type2); + } + } + } + this.compatibleTms.splice(0, this.compatibleTms.length); this.generateCompatibleTms(); const updateAndResolve = () => { @@ -4334,7 +4360,7 @@ export class PlayerPokemon extends Pokemon { this.fusionVariant = pokemon.variant; this.fusionGender = pokemon.gender; this.fusionLuck = pokemon.luck; - this.fusionMysteryEncounterPokemonData = pokemon.mysteryEncounterPokemonData; + this.fusionCustomPokemonData = pokemon.customPokemonData; if ((pokemon.pauseEvolutions) || (this.pauseEvolutions)) { this.pauseEvolutions = true; } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 674c5f47c88..8e7853a41bb 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1126,7 +1126,7 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { } class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { - constructor(rare: boolean) { + constructor(isRareFormChangeItem: boolean) { super((party: Pokemon[], pregenArgs?: any[]) => { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) { return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); @@ -1167,7 +1167,7 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { } return formChangeItemTriggers; }).flat()) - ].flat().flatMap(fc => fc.item).filter(i => (i && i < 100) === rare); + ].flat().flatMap(fc => fc.item).filter(i => (i && i < 100) === isRareFormChangeItem); // convert it into a set to remove duplicate values, which can appear when the same species with a potential form change is in the party. if (!formChangeItemPool.length) { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 2cd96496f45..b699c2483c9 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -2181,7 +2181,7 @@ export class PokemonNatureChangeModifier extends ConsumablePokemonModifier { * @returns */ override apply(playerPokemon: PlayerPokemon): boolean { - playerPokemon.natureOverride = this.nature; + playerPokemon.customPokemonData.nature = this.nature; let speciesId = playerPokemon.species.speciesId; playerPokemon.scene.gameData.dexData[speciesId].natureAttr |= 1 << (this.nature + 1); diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 84f07f3ee94..b7071c4cc6f 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -35,6 +35,7 @@ import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-d import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { getGoldenBugNetSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { Biome } from "#enums/biome"; +import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; export class EncounterPhase extends BattlePhase { private loaded: boolean; @@ -68,7 +69,7 @@ export class EncounterPhase extends BattlePhase { this.scene.executeWithSeedOffset(() => { const currentSessionEncounterType = battle.mysteryEncounterType; battle.mysteryEncounter = this.scene.getMysteryEncounter(currentSessionEncounterType); - }, battle.waveIndex << 4); + }, battle.waveIndex * 16); } const mysteryEncounter = battle.mysteryEncounter; if (mysteryEncounter) { @@ -251,6 +252,13 @@ export class EncounterPhase extends BattlePhase { this.scene.updateModifiers(true); }*/ + const { battleType, waveIndex } = this.scene.currentBattle; + if (this.scene.isMysteryEncounterValidForWave(battleType, waveIndex) && !this.scene.currentBattle.isBattleMysteryEncounter()) { + // Increment ME spawn chance if an ME could have spawned but did not + // Only do this AFTER session has been saved to avoid duplicating increments + this.scene.mysteryEncounterSaveData.encounterSpawnChance += WEIGHT_INCREMENT_ON_SPAWN_MISS; + } + for (const pokemon of this.scene.getParty()) { if (pokemon) { pokemon.resetBattleData(); diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 0166b2d6abd..49e78fa5369 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -402,7 +402,7 @@ export class MysteryEncounterBattlePhase extends Phase { } } - const availablePartyMembers = scene.getParty().filter(p => !p.isFainted()); + const availablePartyMembers = scene.getParty().filter(p => p.isAllowedInBattle()); if (!availablePartyMembers[0].isOnField()) { scene.pushPhase(new SummonPhase(scene, 0)); diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 8240b6bcf84..cddc5798872 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -12,7 +12,7 @@ import { loadBattlerTag } from "../data/battler-tags"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; export default class PokemonData { public id: integer; @@ -33,7 +33,6 @@ export default class PokemonData { public stats: integer[]; public ivs: integer[]; public nature: Nature; - public natureOverride: Nature | -1; public moveset: (PokemonMove | null)[]; public status: Status | null; public friendship: integer; @@ -54,14 +53,20 @@ export default class PokemonData { public fusionVariant: Variant; public fusionGender: Gender; public fusionLuck: integer; - public fusionMysteryEncounterPokemonData: MysteryEncounterPokemonData; public boss: boolean; public bossSegments?: integer; public summonData: PokemonSummonData; + /** Data that can customize a Pokemon in non-standard ways from its Species */ - public mysteryEncounterPokemonData: MysteryEncounterPokemonData; + public customPokemonData: CustomPokemonData; + public fusionCustomPokemonData: CustomPokemonData; + + // Deprecated attributes, needed for now to allow SessionData migration (see PR#4619 comments) + public natureOverride: Nature | -1; + public mysteryEncounterPokemonData: CustomPokemonData | null; + public fusionMysteryEncounterPokemonData: CustomPokemonData | null; constructor(source: Pokemon | any, forHistory: boolean = false) { const sourcePokemon = source instanceof Pokemon ? source : null; @@ -107,9 +112,13 @@ export default class PokemonData { this.fusionVariant = source.fusionVariant; this.fusionGender = source.fusionGender; this.fusionLuck = source.fusionLuck !== undefined ? source.fusionLuck : (source.fusionShiny ? source.fusionVariant + 1 : 0); + this.fusionCustomPokemonData = new CustomPokemonData(source.fusionCustomPokemonData); this.usedTMs = source.usedTMs ?? []; - this.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(source.mysteryEncounterPokemonData); + this.customPokemonData = new CustomPokemonData(source.customPokemonData); + + this.mysteryEncounterPokemonData = new CustomPokemonData(source.mysteryEncounterPokemonData); + this.fusionMysteryEncounterPokemonData = new CustomPokemonData(source.fusionMysteryEncounterPokemonData); if (!forHistory) { this.boss = (source instanceof EnemyPokemon && !!source.bossSegments) || (!this.player && !!source.boss); diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index f93e09b7a90..e96afb5cbd4 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -4,6 +4,9 @@ import { version } from "../../../package.json"; // --- v1.0.4 (and below) PATCHES --- // import * as v1_0_4 from "./versions/v1_0_4"; +// --- v1.1.0 PATCHES --- // +import * as v1_1_0 from "./versions/v1_1_0"; + const LATEST_VERSION = version.split(".").map(value => parseInt(value)); /** @@ -131,6 +134,10 @@ class SessionVersionConverter extends VersionConverter { this.callMigrators(data, v1_0_4.sessionMigrators); } } + if (curMinor <= 1) { + console.log("Applying v1.1.0 session data migration!"); + this.callMigrators(data, v1_1_0.sessionMigrators); + } } console.log(`Session data successfully migrated to v${version}!`); @@ -153,6 +160,10 @@ class SystemVersionConverter extends VersionConverter { this.callMigrators(data, v1_0_4.systemMigrators); } } + if (curMinor <= 1) { + console.log("Applying v1.1.0 system data migraton!"); + this.callMigrators(data, v1_1_0.systemMigrators); + } } console.log(`System data successfully migrated to v${version}!`); @@ -175,6 +186,10 @@ class SettingsVersionConverter extends VersionConverter { this.callMigrators(data, v1_0_4.settingsMigrators); } } + if (curMinor <= 1) { + console.log("Applying v1.1.0 settings data migraton!"); + this.callMigrators(data, v1_1_0.settingsMigrators); + } } console.log(`System data successfully migrated to v${version}!`); diff --git a/src/system/version_migration/versions/v1_1_0.ts b/src/system/version_migration/versions/v1_1_0.ts new file mode 100644 index 00000000000..aac554c4531 --- /dev/null +++ b/src/system/version_migration/versions/v1_1_0.ts @@ -0,0 +1,32 @@ +import { SessionSaveData } from "../../game-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; + +export const systemMigrators = [] as const; + +export const settingsMigrators = [] as const; + +export const sessionMigrators = [ + /** + * Converts old Pokemon natureOverride and mysteryEncounterData + * to use the new conjoined {@linkcode Pokemon.customPokemonData} structure instead. + * @param data {@linkcode SessionSaveData} + */ + function migrateCustomPokemonDataAndNatureOverrides(data: SessionSaveData) { + // Fix Pokemon nature overrides and custom data migration + data.party.forEach(pokemon => { + if (pokemon["mysteryEncounterPokemonData"]) { + pokemon.customPokemonData = new CustomPokemonData(pokemon["mysteryEncounterPokemonData"]); + pokemon["mysteryEncounterPokemonData"] = null; + } + if (pokemon["fusionMysteryEncounterPokemonData"]) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(pokemon["fusionMysteryEncounterPokemonData"]); + pokemon["fusionMysteryEncounterPokemonData"] = null; + } + pokemon.customPokemonData = pokemon.customPokemonData ?? new CustomPokemonData(); + if (pokemon["natureOverride"] && pokemon["natureOverride"] >= 0) { + pokemon.customPokemonData.nature = pokemon["natureOverride"]; + pokemon["natureOverride"] = -1; + } + }); + } +] as const; diff --git a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts b/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts index 0dc02e03c6d..e0f37c7e045 100644 --- a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts @@ -476,10 +476,11 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(3); + expect(modifierSelectHandler.options.length).toEqual(4); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MASTER_BALL"); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MAX_LURE"); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toBe("FORM_CHANGE_ITEM"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MEGA_BRACELET"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toBe("DYNAMAX_BAND"); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toBe("FORM_CHANGE_ITEM"); }); it("should leave encounter without battle", async () => { diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts index b92a4d96adc..82ed558e6db 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -118,11 +118,11 @@ describe("Clowning Around - Mystery Encounter", () => { }); expect(config.pokemonConfigs?.[1]).toEqual({ species: getPokemonSpecies(Species.BLACEPHALON), - mysteryEncounterPokemonData: expect.anything(), + customPokemonData: expect.anything(), isBoss: true, moveSet: [ Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN ] }); - expect(config.pokemonConfigs?.[1].mysteryEncounterPokemonData?.types.length).toBe(2); + expect(config.pokemonConfigs?.[1].customPokemonData?.types.length).toBe(2); expect([ Abilities.STURDY, Abilities.PICKUP, @@ -139,8 +139,8 @@ describe("Clowning Around - Mystery Encounter", () => { Abilities.MAGICIAN, Abilities.SHEER_FORCE, Abilities.PRANKSTER - ]).toContain(config.pokemonConfigs?.[1].mysteryEncounterPokemonData?.ability); - expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs?.[1].mysteryEncounterPokemonData?.ability); + ]).toContain(config.pokemonConfigs?.[1].customPokemonData?.ability); + expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs?.[1].customPokemonData?.ability); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); expect(onInitResult).toBe(true); @@ -219,7 +219,7 @@ describe("Clowning Around - Mystery Encounter", () => { await game.phaseInterceptor.to(NewBattlePhase, false); const leadPokemon = scene.getParty()[0]; - expect(leadPokemon.mysteryEncounterPokemonData?.ability).toBe(abilityToTrain); + expect(leadPokemon.customPokemonData?.ability).toBe(abilityToTrain); }); }); @@ -340,9 +340,9 @@ describe("Clowning Around - Mystery Encounter", () => { scene.getParty()[2].moveset = []; await runMysteryEncounterToEnd(game, 3); - const leadTypesAfter = scene.getParty()[0].mysteryEncounterPokemonData?.types; - const secondaryTypesAfter = scene.getParty()[1].mysteryEncounterPokemonData?.types; - const thirdTypesAfter = scene.getParty()[2].mysteryEncounterPokemonData?.types; + const leadTypesAfter = scene.getParty()[0].customPokemonData?.types; + const secondaryTypesAfter = scene.getParty()[1].customPokemonData?.types; + const thirdTypesAfter = scene.getParty()[2].customPokemonData?.types; expect(leadTypesAfter.length).toBe(2); expect(leadTypesAfter[0]).toBe(Type.WATER); diff --git a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts b/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts index f64124790b7..4d95ff31d36 100644 --- a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -21,7 +21,7 @@ import { BerryModifier, PokemonBaseStatTotalModifier } from "#app/modifier/modif import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; @@ -109,7 +109,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { species: getPokemonSpecies(Species.SHUCKLE), isBoss: true, bossSegments: 5, - mysteryEncounterPokemonData: new MysteryEncounterPokemonData({ spriteScale: 1.25 }), + customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), nature: Nature.BOLD, moveSet: [ Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER ], modifierConfigs: expect.any(Array), diff --git a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts index f4d055c69aa..0d463655a52 100644 --- a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -122,7 +122,7 @@ describe("Weird Dream - Mystery Encounter", () => { for (let i = 0; i < pokemonAfter.length; i++) { const newPokemon = pokemonAfter[i]; expect(newPokemon.getSpeciesForm().speciesId).not.toBe(pokemonPrior[i].getSpeciesForm().speciesId); - expect(newPokemon.mysteryEncounterPokemonData?.types.length).toBe(2); + expect(newPokemon.customPokemonData?.types.length).toBe(2); } const plus90To110 = bstDiff.filter(bst => bst > 80);