From a50763cd897b431b2be80ee34026464dc0a13800 Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Fri, 25 Oct 2024 23:29:20 +0100 Subject: [PATCH 1/4] updating locales --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 87615556d8a..71390cba88f 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 87615556d8a2bd7eef7abac818f84423a8a13b03 +Subproject commit 71390cba88f4103d0d2273d59a6dd8340a4fa54f From 6418f46bf7e97ee986e26b54aaa125a930c74248 Mon Sep 17 00:00:00 2001 From: chaosgrimmon <31082757+chaosgrimmon@users.noreply.github.com> Date: Fri, 25 Oct 2024 19:02:05 -0400 Subject: [PATCH 2/4] [Sprite] Fix transparency of pixels on Fletchinder (#4720) * [Sprite] Front Fletchinder * [Sprite] Back Fletchinder * [Sprite] Shiny front Fletchinder * [Sprite] Shiny back Fletchinder --- public/images/pokemon/exp/662.png | Bin 1718 -> 1869 bytes public/images/pokemon/exp/back/662.png | Bin 1439 -> 1526 bytes public/images/pokemon/exp/back/shiny/662.png | Bin 1439 -> 1526 bytes public/images/pokemon/exp/shiny/662.png | Bin 1721 -> 1870 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/pokemon/exp/662.png b/public/images/pokemon/exp/662.png index 090e6e4c91f61b1d7b93064474bdd46e2de2f04a..e47863f724b8998808b7a4f7377497dafdfe38f4 100644 GIT binary patch delta 1812 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 br{ga%y@t7ye^)2~0000~c1m8>n zbv1fNW?nAh_J241Lso6On6`od)D%#2Q&UFn_&()gY`1SXuGLBcFx%gI4Ny<1d0W$| zOSoNetDZEX_8zSfd^Jr}041iz8qZq=Qy^lShF0o2ar7eO*1{zv_vk%^i=fpCZ{ z6b!_({ePn=lU2hknmP_qx?w;f7rxzNtf6*K(2<3Lfr=f)Sb2Ko5|vOekfI@@rDg^Y z^++&qk^$1xt=SbpM?Dk__?H(uz755?#7~JdQtiSM2Eyy~?FLIMBa+W#YncNB{`K{K zE!-s3=CiwJTX-!>hIw(1HD2D%Kh zAhfZ}YQMb#lLDW)*;w|n@ir0+eBkExmAe#ftiV12Iw-meVydhqx&R;gHI_O30Pz@F zEq_|(JOYTv$ZF>b>>=Q@L1-Wt5RZ}7&_E8@www2L2qhep|4hU{%zQteQ~49tJz~G? zq&WfaM?%Cu$4GMm-j9SxeqR&j1i4Aogdn2E50QNPN^^qTq-sJCQDcWlBS>?4L@m8O z7U#r;D#e!mYNBg?T@B@hh{|Vn6(r7yt$&tQ&#tx}ijMZ2E6fRXW2qgKs0njI)!v-t znESOPI(bNP!rU5aS))`{O^_3+RxPKe?LIzpA3&N@FSl5ZYHEUK((s|Hs6cYD<{}3OhL65t9woYzbwFQ`;s&#kzN*n)i5f^ zNuZV;FUw6gTBIk)=@YfGLxu_RbAP(tDytU@Q{(4!vsq3r)>AoMit&1}dgg?l7u{~;LdMuGEjj#zq!ds1@8RjCL%}s_WaF;hX8K%Hp-rQuA0(W^glwk_o<=s$5DR5U(8l}Kpq%;fM zopTcS%>uVbEjwO5DRB2KQ(eshH{kYpF?hHFcT??87r3J%f%dTq-0kU}1#S+7=Y-1z zuUX(m+-8AWVm4}lTX3_H6CAX_EzgM`VAkG$ePn- delta 1421 zcmV;81#_voFK+-2U$dTLFjQ$|gNLAq|58)8Cj1I7Ep*N{Nv@fc5HMU$SL?_T98Mh#Up#edAez#-(=C$LD~`p zfTjgGHd=_>^?$v?`LfCW!F-ICDgd%+nQ{W6htAs&rY_J;S~sjoBP!2mPQgc86&ZmB z(_`@SmXYbCX%Fsdqtigs!6L&KSTuTg(@KfT@~oNTq7jOg2sD_|WGYzTV$CqyOQDDs z2O7uKDnOPK*h@{7b+oT2Z?u_`>oxR3^!#;lhhhni$$yOQ*G^`xH#!OwnBkBW1t(-W z*PEdtT6)D}Sm0;-wW^G(0-2XOjv{5l1OeQ3clTul zv~vZ`QGX~{kf9@AmM*VcMJ5z1i1*>!%_BnwDDshDL9*nGM)d@CtBHch@q2^gB6Mrdx%z*`4u3gfIi54i<6wEGGDH1HG zgQn(f6i;BVz}t`e-#PEkT|w@}m0BZ_%AUYrL6u<+gf^Br?UzqrQo%Jg8_RARPb0yC z3v6z#+*Y`70=pupfao^FM7&6_;Og||k2&=OKNHP6<}?xfNVNR~)<{qxbxj375{+a6 zrGMIol3H4nY=YW*N<=vVZ0Du-%9D&vY(%s>SBRQ4USu2|^q6zY^OX zB|;N>!q(h8Thu5OU&~@o(3%_e6TN>G_hNNPDr8 z`4o8q;gTM)Y%f+6Kprsu$ z)jgfg$9XSSD^I7(+IcTlD^Dj$PvlpwDCv-()^kUWVB&9p-#j4~w+f`4erId<_Viqw0{@tq9dV+SlSTELPPyE*hyNa%RYKg-V59w+y7JGjvsDv zqXKvQaFaU~xZ{VL+^N7FJ>2B;1@0nS^8A$B6u6Uzo7|?roj%;;HU;kV;eRG~DR8Gx zL%B_XJAE3;T?*V8OLr-7Czg7FyRs(%UoUWr&?*+V>z1i{fg4)Zt`>uDSKw}+G-)w- zzY=J=SAn~n?q1+-<4L@#^#V6Ir@g=}+U?%6z%6*#$YoD_>+;&W%u{o;UVHzjr#|}l br{galONx-Ur!52k0000SiCynLft-in@%Vo6|0HB?z5687x$wXvR*B05NXXoa z=!R3qyTLFFlLZ8Sm8eXB*G4CGMeuS#C!c3^PSYxMR%vu@4+F1Qrl=kq;K8sA=rHSa zGLaEAGL29OWLxh()z@2xQ^d2wISZY22AP>qm}N#vCH3F{?*`MX(@KR{W}?%c%q;Wn zFFw1T`>K>@{tjMfsxuNg{~z3VzQF681eZ_Bvwv5etHkGjGzFbtN7IiexXFoIZ~m&G zN_h(r5}i+gX&q3j&`JzKJ%5<|1YB9qUJ5DCo#1k1t-|LM-a#jXOYVfOI+y9poNUe5 z%(vxh)+yup8+*RC^U&Ep;AhcUrN1-d0R>+Vs;=SPmy`0=2hhz=Mx_~4cLPK!?Sur; zfcjOe?p6bTQ_blV@}h~t=!Ebnxf|6@@AL9+b^29_s)sjPw%$S{b)v+;ixx72bYl8` zoyL{6JW>90wA`-6(AHonx1QjZM-XFPyx>}$PlIJJpPO~wKl=W2R*q`4V2FkV;Zekd zmo!?B@AKEdDl{LgQplKtpXlSRAQZ!8CJ$iFBZ=96Oc*z=k6Gp{)Cu0|^z&Zm3KlBW zXyq$J#v_S2FKMuUex1-&u-+8JCPZhs(TaLk>il9N#>0dLog)~D z?^z{(J)k>{7Hq3gC-{YZ-j2@E>U68AKSb8=*(WQk44X#Fl}n0v9zi5|$uTmSBMk9W zpA4w`F#x-b79n(LC=lWv4;MPl0LW`(_Ytg()(360UdgZSn1^&|1zvKDF;Z!C=Kmft zp~XfEE#esovCK=30b>MY;!d9Eibe}BGHi)|6+B8Qwh(4F0+bpps>qgD!^?!)ui`q9 zZx&c?A6-YR*pztkL>>>;(Dw>=nd#aUQjg~e~E_A=qQs;?LXtdOMa_l!+`aCgsjn;9V6x>GZC{GG*qji)g z1-pSc$dlr)=wvrqM|l@|Lo?@56Z8;5G3QYi^bkUt^Vot8dMH4g^TP!=_BOx#4(}Fd$=Jg}S@{sGe<6JYP#aKoJ_PLt zNgn~!29%o*A^K~=M~IWL3Q8G&`4H;&3gII_l#JC-TAdFeb>cpPdluCi{OX(s^?RD~ z5g;UEb#zwdJZPQx`+10xu^KvSa~@os+D1)vK7@LIM)?S>bjJM|mJeaS=hO9Rs`DZ2 z_q&Y-H15yPdYNAL℞~o8>&TJ>+IN4{d9Iwpq?Y-3{rU z^N=F+XS{3G&fml#%Xzf)H*rXE2~GV?0(_l~{Y?VE%}=!UHI(dfn z{-#czp}oJUl4t1PZz|*&B7gJQ%-=kmXNdewBlFqL-#nIQNZ+5iHxv#0&4YP{)ZYwG zlDfZnEYHx--#nCO=;&{M9?3KG^fwRW8M^wL2l5PE{Y`nEp|8Iw&olJ(H^q5|-u|XE z&(Pc7l;#Izsb)toaAqE_q#aH-{kFgai+h?+3(_9f0MCq#i{;uCS%`|f#Glc5?FVt;!i5VLE?l^9K_CABwqvb_T8_8?00000NkvXXu0mjf DmMNn4 delta 1663 zcmYk7dtB1@9>%eLnqpvzr4unzC@+PqoHcI=s2R#7FOi$Wa%M)Nm{jV^BuQn}EVQ{Z zymX+vwJ5EH}isGnEZoFBmKc|6s(r7PfJWAnEs{C z;l0r1_b9ak3l_x-8**L$ISyR|AEi_d-dtLI$rj`IR>Ja>(9!fAVq$(rUSOZkGWVaR ze$?O8n3>t_)Ju;GyBi6iWf6VZHgwCc5-ni!lIa)Ee-BncTJuVk#JP3H z#M3$HM`OLR9a_0EJs;2*9<_`i-EBbEQ8O7!;W-16RnPs)B?ZNme z`*B0<4*D>=I#-hH=oP;a|BH52WVDfoOG;ufOwAp~vWx7NI5pAZiKAs^$*ZSY+g-2s z?PxwOU1+#OV-y=>Uvyb-wLX|fJ=xkGwk9}ezVTFZ=H1o&j!3_*D=sdOK+!J28=K1y zNkz?FU0eR$EWG<=8`X)noDtjMCCRwTez@i1p$qN7-ccNzoT8u%^tq}|>E0V-u2UK# zv;ES*N)mGD;g{AZq)9WbjvpmI4gZ%BOR~P*JDa_a)yN66BJGiCZ^7X#H1}P=swh3uwV#cDP^F}#sC%?0Vl%4K# z!GaGir$zH`pB>3g=Z6Q2KNVan0TD#Lp2{44`ilA=s$_FF)0Kp%C+`UY$wXt-yTdXA z9}}EJ=qcEP?Y4#naB$s+D8KA6XqX8+OD@RfeQtYQ<``>>l(U8IIBntAiDjl!t>qwX zX$e8Fz)7+c2ttfQtgVw=I1*xom!v@oAMr%^Nz>2n720M$M-Z-iGrG4e7`VuVWz4bM ztz|H@maHdpzu$M>a{Fsa=xhMbPjN2>L4Zrmkvt+lh`Y&&1BAL;X|rcp_NRF7_^I3i z`8GCIF@5AlSQ>Yj2H|wxn@RJ3fX7be*emDf@hM;j?a?lVTaf!ZVyD*+;r6c#ul*5= z8G;&8fNQL6P!s~3E2Z%;_xn)}2(Uy!<1rm|rqMc$7jyw_{+dGRaSRgZQ-QHXRm!y! zWX@~gKeWl|Eog;3jaJ^t#uEi0a^Y+roC9#*LUY)TERQ<8F#5aFffY)s9mcl~KR0-? z!PC-?TY{Jn#zxUefu3%}$i27TA*#GAwNh-N6`^Cloy*lZxI1nq#k^=1d7auGqS@8$559ij)G}-03*Z z8QFt4PM=06>!LVL@Y^DjTCMHc#-Fv3hcF>YyBkvvw5!z~u)#NRn`}-vWT+|bFtNIt fDqe}G+t~82k(Nec(Nw+mrvV)eAo Date: Fri, 25 Oct 2024 19:34:40 -0400 Subject: [PATCH 3/4] [Beta] Stop Transform giving copied moves negative fractional `ppUp` (#4722) * [Beta] Stop Transform giving copied moves negative fractional `ppUp` * Remove some bangs/etc --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/ability.ts | 15 +++++++------ src/data/move.ts | 13 +++++++----- src/field/pokemon.ts | 33 +++++++++++++++++++---------- src/modifier/modifier-type.ts | 2 +- src/modifier/modifier.ts | 2 +- src/system/pokemon-data.ts | 2 +- src/test/abilities/imposter.test.ts | 15 ++++++++++--- src/test/moves/transform.test.ts | 17 +++++++++++---- 8 files changed, 67 insertions(+), 32 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index d761657f5cd..01e99966ff8 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2453,16 +2453,19 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { pokemon.setStatStage(s, target.getStatStage(s)); } - pokemon.summonData.moveset = target.getMoveset().map(m => { - const pp = m?.getMove().pp ?? 0; - // if PP value is less than 5, do nothing. If greater, we need to reduce the value to 5 using a negative ppUp value. - const ppUp = pp <= 5 ? 0 : (5 - pp) / Math.max(Math.floor(pp / 5), 1); - return new PokemonMove(m?.moveId ?? Moves.NONE, 0, ppUp); + pokemon.summonData.moveset = target.getMoveset().map((m) => { + if (m) { + // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. + return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); + } else { + console.warn(`Imposter: somehow iterating over a ${m} value when copying moveset!`); + return new PokemonMove(Moves.NONE); + } }); pokemon.summonData.types = target.getTypes(); promises.push(pokemon.updateInfo()); - pokemon.scene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target!.name, })); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, })); pokemon.scene.playSound("battle_anims/PRSFX- Transform"); promises.push(pokemon.loadAssets(false).then(() => { pokemon.playAnim(); diff --git a/src/data/move.ts b/src/data/move.ts index efdd4568927..9979b24cc24 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -6668,11 +6668,14 @@ export class TransformAttr extends MoveEffectAttr { user.setStatStage(s, target.getStatStage(s)); } - user.summonData.moveset = target.getMoveset().map(m => { - const pp = m?.getMove().pp ?? 0; - // if PP value is less than 5, do nothing. If greater, we need to reduce the value to 5 using a negative ppUp value. - const ppUp = pp <= 5 ? 0 : (5 - pp) / Math.max(Math.floor(pp / 5), 1); - return new PokemonMove(m?.moveId!, 0, ppUp); + user.summonData.moveset = target.getMoveset().map((m) => { + if (m) { + // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. + return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); + } else { + console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`); + return new PokemonMove(Moves.NONE); + } }); user.summonData.types = target.getTypes(); promises.push(user.updateInfo()); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index d41c1f9eefa..a708b2067a7 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4431,7 +4431,7 @@ export class PlayerPokemon extends Pokemon { this.scene.removePartyMemberModifiers(fusedPartyMemberIndex); this.scene.getParty().splice(fusedPartyMemberIndex, 1)[0]; const newPartyMemberIndex = this.scene.getParty().indexOf(this); - pokemon.getMoveset(true).map(m => this.scene.unshiftPhase(new LearnMovePhase(this.scene, newPartyMemberIndex, m!.getMove().id))); // TODO: is the bang correct? + pokemon.getMoveset(true).map((m: PokemonMove) => this.scene.unshiftPhase(new LearnMovePhase(this.scene, newPartyMemberIndex, m.getMove().id))); pokemon.destroy(); this.updateFusionPalette(); resolve(); @@ -4452,8 +4452,12 @@ export class PlayerPokemon extends Pokemon { /** Returns a deep copy of this Pokemon's moveset array */ copyMoveset(): PokemonMove[] { const newMoveset : PokemonMove[] = []; - this.moveset.forEach(move => - newMoveset.push(new PokemonMove(move!.moveId, 0, move!.ppUp, move!.virtual))); // TODO: are those bangs correct? + this.moveset.forEach((move) => { + // TODO: refactor `moveset` to not accept `null`s + if (move) { + newMoveset.push(new PokemonMove(move.moveId, 0, move.ppUp, move.virtual, move.maxPpOverride)); + } + }); return newMoveset; } @@ -5180,15 +5184,22 @@ export interface DamageCalculationResult { **/ export class PokemonMove { public moveId: Moves; - public ppUsed: integer; - public ppUp: integer; + public ppUsed: number; + public ppUp: number; public virtual: boolean; - constructor(moveId: Moves, ppUsed?: integer, ppUp?: integer, virtual?: boolean) { + /** + * If defined and nonzero, overrides the maximum PP of the move (e.g., due to move being copied by Transform). + * This also nullifies all effects of `ppUp`. + */ + public maxPpOverride?: number; + + constructor(moveId: Moves, ppUsed: number = 0, ppUp: number = 0, virtual: boolean = false, maxPpOverride?: number) { this.moveId = moveId; - this.ppUsed = ppUsed || 0; - this.ppUp = ppUp || 0; - this.virtual = !!virtual; + this.ppUsed = ppUsed; + this.ppUp = ppUp; + this.virtual = virtual; + this.maxPpOverride = maxPpOverride; } /** @@ -5225,7 +5236,7 @@ export class PokemonMove { } getMovePp(): integer { - return this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5); + return this.maxPpOverride || (this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5)); } getPpRatio(): number { @@ -5242,6 +5253,6 @@ export class PokemonMove { * @return {PokemonMove} A valid pokemonmove object */ static loadMove(source: PokemonMove | any): PokemonMove { - return new PokemonMove(source.moveId, source.ppUsed, source.ppUp, source.virtual); + return new PokemonMove(source.moveId, source.ppUsed, source.ppUp, source.virtual, source.maxPpOverride); } } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 3e475c62590..f4b59b9d882 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -384,7 +384,7 @@ export class PokemonPpUpModifierType extends PokemonMoveModifierType { (_pokemon: PlayerPokemon) => { return null; }, (pokemonMove: PokemonMove) => { - if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3) { + if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3 || pokemonMove.maxPpOverride) { return PartyUiHandler.NoEffectMessage; } return null; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 11f16f103a5..36f94b99b20 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -2166,7 +2166,7 @@ export class PokemonPpUpModifier extends ConsumablePokemonMoveModifier { override apply(playerPokemon: PlayerPokemon): boolean { const move = playerPokemon.getMoveset()[this.moveIndex]; - if (move) { + if (move && !move.maxPpOverride) { move.ppUp = Math.min(move.ppUp + this.upPoints, 3); } diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 421739a9da1..c8756e4dd7f 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -135,7 +135,7 @@ export default class PokemonData { } } } else { - this.moveset = (source.moveset || [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL) ]).filter(m => m).map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); + this.moveset = (source.moveset || [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL) ]).filter(m => m).map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp, m.virtual, m.maxPpOverride)); if (!forHistory) { this.status = source.status ? new Status(source.status.effect, source.status.toxicTurnCount, source.status.sleepTurnsRemaining) diff --git a/src/test/abilities/imposter.test.ts b/src/test/abilities/imposter.test.ts index 7aaac5ca8c4..3445b3b322c 100644 --- a/src/test/abilities/imposter.test.ts +++ b/src/test/abilities/imposter.test.ts @@ -60,18 +60,19 @@ describe("Abilities - Imposter", () => { const playerMoveset = player.getMoveset(); const enemyMoveset = player.getMoveset(); + expect(playerMoveset.length).toBe(enemyMoveset.length); for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) { - // TODO: Checks for 5 PP should be done here when that gets addressed expect(playerMoveset[i]?.moveId).toBe(enemyMoveset[i]?.moveId); } const playerTypes = player.getTypes(); const enemyTypes = enemy.getTypes(); + expect(playerTypes.length).toBe(enemyTypes.length); for (let i = 0; i < playerTypes.length && i < enemyTypes.length; i++) { expect(playerTypes[i]).toBe(enemyTypes[i]); } - }, 20000); + }); it("should copy in-battle overridden stats", async () => { game.override.enemyMoveset([ Moves.POWER_SPLIT ]); @@ -104,7 +105,15 @@ describe("Abilities - Imposter", () => { await game.phaseInterceptor.to(TurnEndPhase); player.getMoveset().forEach(move => { - expect(move!.getMovePp()).toBeLessThanOrEqual(5); + // Should set correct maximum PP without touching `ppUp` + if (move) { + if (move.moveId === Moves.SKETCH) { + expect(move.getMovePp()).toBe(1); + } else { + expect(move.getMovePp()).toBe(5); + } + expect(move.ppUp).toBe(0); + } }); }); }); diff --git a/src/test/moves/transform.test.ts b/src/test/moves/transform.test.ts index 8c0f5eda7b2..adb97b42af7 100644 --- a/src/test/moves/transform.test.ts +++ b/src/test/moves/transform.test.ts @@ -60,18 +60,19 @@ describe("Moves - Transform", () => { const playerMoveset = player.getMoveset(); const enemyMoveset = player.getMoveset(); + expect(playerMoveset.length).toBe(enemyMoveset.length); for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) { - // TODO: Checks for 5 PP should be done here when that gets addressed expect(playerMoveset[i]?.moveId).toBe(enemyMoveset[i]?.moveId); } const playerTypes = player.getTypes(); const enemyTypes = enemy.getTypes(); + expect(playerTypes.length).toBe(enemyTypes.length); for (let i = 0; i < playerTypes.length && i < enemyTypes.length; i++) { expect(playerTypes[i]).toBe(enemyTypes[i]); } - }, 20000); + }); it("should copy in-battle overridden stats", async () => { game.override.enemyMoveset([ Moves.POWER_SPLIT ]); @@ -94,7 +95,7 @@ describe("Moves - Transform", () => { expect(enemy.getStat(Stat.SPATK, false)).toBe(avgSpAtk); }); - it ("should set each move's pp to a maximum of 5", async () => { + it("should set each move's pp to a maximum of 5", async () => { game.override.enemyMoveset([ Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER ]); await game.classicMode.startBattle([ Species.DITTO ]); @@ -104,7 +105,15 @@ describe("Moves - Transform", () => { await game.phaseInterceptor.to(TurnEndPhase); player.getMoveset().forEach(move => { - expect(move!.getMovePp()).toBeLessThanOrEqual(5); + // Should set correct maximum PP without touching `ppUp` + if (move) { + if (move.moveId === Moves.SKETCH) { + expect(move.getMovePp()).toBe(1); + } else { + expect(move.getMovePp()).toBe(5); + } + expect(move.ppUp).toBe(0); + } }); }); }); From 61cf937cab471d083f78f483c6d22aefaac72e3d Mon Sep 17 00:00:00 2001 From: Smewkie <168606612+Smewkie@users.noreply.github.com> Date: Fri, 25 Oct 2024 18:38:12 -0500 Subject: [PATCH 4/4] [Balance] Ferroseed HA Ferroseed HA --- src/data/pokemon-species.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 96d1eb430fb..a93c35829ea 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1864,7 +1864,7 @@ export function initSpecies() { new PokemonSpecies(Species.ALOMOMOLA, 5, false, false, false, "Caring Pokémon", Type.WATER, null, 1.2, 31.6, Abilities.HEALER, Abilities.HYDRATION, Abilities.REGENERATOR, 470, 165, 75, 80, 40, 45, 65, 75, 70, 165, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.JOLTIK, 5, false, false, false, "Attaching Pokémon", Type.BUG, Type.ELECTRIC, 0.1, 0.6, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 319, 50, 47, 50, 57, 50, 65, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GALVANTULA, 5, false, false, false, "EleSpider Pokémon", Type.BUG, Type.ELECTRIC, 0.8, 14.3, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 472, 70, 77, 60, 97, 60, 108, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FERROSEED, 5, false, false, false, "Thorn Seed Pokémon", Type.GRASS, Type.STEEL, 0.6, 18.8, Abilities.IRON_BARBS, Abilities.NONE, Abilities.IRON_BARBS, 305, 44, 50, 91, 24, 86, 10, 255, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FERROSEED, 5, false, false, false, "Thorn Seed Pokémon", Type.GRASS, Type.STEEL, 0.6, 18.8, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 305, 44, 50, 91, 24, 86, 10, 255, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.FERROTHORN, 5, false, false, false, "Thorn Pod Pokémon", Type.GRASS, Type.STEEL, 1, 110, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 489, 74, 94, 131, 54, 116, 20, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.KLINK, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.3, 21, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 300, 40, 55, 70, 45, 60, 30, 130, 50, 60, GrowthRate.MEDIUM_SLOW, null, false), new PokemonSpecies(Species.KLANG, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.6, 51, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 440, 60, 80, 95, 70, 85, 50, 60, 50, 154, GrowthRate.MEDIUM_SLOW, null, false),