From c3045b58b6dca55cb6d95cfcac731dead6da39e0 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:06:12 +0100 Subject: [PATCH 01/83] [Localization] Localizable Lv UP pop-up bar (#5336) * Update party-exp-bar.ts localizable * Update party-exp-bar.ts --- src/ui/party-exp-bar.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ui/party-exp-bar.ts b/src/ui/party-exp-bar.ts index 75970a5908b..b9da9320fcb 100644 --- a/src/ui/party-exp-bar.ts +++ b/src/ui/party-exp-bar.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; import type Pokemon from "../field/pokemon"; import { TextStyle, addTextObject } from "./text"; +import i18next from "i18next"; export default class PartyExpBar extends Phaser.GameObjects.Container { private bg: Phaser.GameObjects.NineSlice; @@ -43,9 +44,9 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { // if we want to only display the level in the small frame if (showOnlyLevelUp) { if (newLevel > 200) { // if the level is greater than 200, we only display Lv. UP - this.expText.setText("Lv. UP"); + this.expText.setText(i18next.t("battleScene:levelUp")); } else { // otherwise we display Lv. Up and the new level - this.expText.setText(`Lv. UP: ${newLevel.toString()}`); + this.expText.setText(i18next.t("battleScene:levelUpWithLevel", { level: newLevel })); } } else { // if we want to display the exp From 3a4c8eb92e2f1972b749bbfe5e37fa62e9f80d45 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:08:48 +0100 Subject: [PATCH 02/83] [UX/UI] [Localization] Summary removed Lv and ID No. as image texts (#5361) * summary-ui-handler.ts Lv. and ID No. Text * Remove Lv and ID No. * Remove Lv and ID No. --- public/images/ui/legacy/summary_bg.png | Bin 4217 -> 2696 bytes public/images/ui/legacy/summary_profile.png | Bin 1562 -> 2589 bytes public/images/ui/summary_bg.png | Bin 2126 -> 3457 bytes public/images/ui/summary_profile.png | Bin 1673 -> 2935 bytes src/ui/summary-ui-handler.ts | 6 +++--- 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/images/ui/legacy/summary_bg.png b/public/images/ui/legacy/summary_bg.png index e4da2dd5da235dbded64b2c036088bfb6125ba9e..c482b5a1bf1d946e8f2a242bb2e03b86de6d5b60 100644 GIT binary patch literal 2696 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 BWC8#H diff --git a/public/images/ui/legacy/summary_profile.png b/public/images/ui/legacy/summary_profile.png index 1d184023ca8f77c937883b6ca5453140635bee2c..77d59dac1775bbcff8783be7657be197d81419b9 100644 GIT binary patch literal 2589 zcmbVO3s4hh9#1V!Me5^p%mLbC8|sOp$?hg0Br5@dP=XqCwhr<9JCW6{_BbN7{0>PR-1h-Tn6W z{r>;o|26yOp0JP=%iWi=SgaMHa@k(y+QF=nWlNa<atJv<_Yj#2DF)TDujYDg8vvlxsFn#J<+a zq%a0yI$WM%!ooAcBGefvYKey9?+5r=5Qe~j(I{Xs=m`q3NIA2-2y<`W206eigieui z0_+BX7{wkSh%{k!$LmbBjLd!NWvFx1^5u`142F^EZ{;g0*MfT1epJE7;7et z7TGI%ecl%HB<1L6+K7Ol*=**S1w7J}48jtL1cdk?pU-6wTq>QQQ45!#JQo;b7^ODh zMj9sxz|M%O$W&U&VLY9aU@$sp32Ht}Ou#@3Y6M{(WS2Ax)TkXeW2#9%Yh0rSF+FC$ z2%2KBumfwsC^|Tekue{Tr=qEdbR!1t#V9h> zq{f2N7&krbYK%yb2}5bp6hV^ug+%RHa2W^+0=%MeLPMIV%|C%-GL*)o96rSN=0bcf z>>U9M5N|O8i?-O42hBkhqz2cfFM|3+zzj}^@P$8vG6kbSY4n+3jT+ICCIiaI#SLgO z1{#TE4&VqP5=81r6Jwb1PB80*LV<)56pa#UEL0}tFp7CNu0dc-1xv&dlq=8(#9Wa| z$mgOWF{4I=iM1*W;)}HWh4V5}oodhP!gX*l!S_;W{Kj@GQh7}8%!_Z*BOwX_*EVFAfZw4PB+ zAmch{@4-10;9`NZ?|#y+3vgx#*l!)vhk0@-N7lqX0trB8D6QpS-DkeaHV+;y+1-~_h#pP+fIRW(YrDeUQ5FE5 ziFtp_8`*ioH_7R>W$>EAuFipZPOrXhUF{igG#_Y`uU0K=mrkq8hJ4eDr7owfo4Ks8M3t7XKP+Ds-u92Kssqh` znvU&y|HPHE?tZuLn=IRw{J$@;qb`1}^*5woPWD?Zm+tJ?SXVpQ?Hab$Z?taU6HnK5 zH(ojPhq+a^?$yQKFB0Wzc3Q)%=$xl(U4&i;!Ee}(DM+f~(k=h`+u_T%u3I1SJTkdw zioGhk!~b1r$X8y@ip{&q*%dme%IrV;&Zq1jE3ooE+xwIM9xoa`?VX!ZIP(-Y%0 z#J1iT>JpTHR~#R*a??!7t;$Sc(~+*!?Rokn>%drP%FO3Q0j0{}YvuVmTSdL@K1{vG zhw3Je-5&1=DK7b-Jz;pXHQckjQL^^sY}-wF?IX^LE&6|+Ogq@peLel9J6~s<6$Ct4 za?>w+sHxg@V_R&bW$@JT+?2F$T`v2VJnT%nxjv?PKy@tPN&4G1wvrxvTpw#*^`K-w z{MVXW)#r-}E}r-3mY#X#>gI2lDxPvvQa$)_;W?yfQ`du_Ril0TP=BI%U*P>|ZJDzv z#r^c!zQ3e7ckmjAFD%_1*cdD&iznmz9%eUw_r~vJMUl>?N1y5HyS~qSM&6$zlfT>% zj&g`}&ONd8Mc&7gZuF0tJ|(tix~}1_QPTR>$P;(5*HkX|cDelnE;KkyRvwsS{U4OD B*CGG_ literal 1562 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 Gzu{M%7iJ&; literal 2126 zcmZWrdstH07C*=d4=QxhFEccS#zKwEX-Kn@mo;IQ^x0$VDb6&ebIB~yv?2+)IK7n8 zNlo)nPJLsRjE_{T38HVT)KO_nys6UJuf5LR=i<(= ztpq!g9Rxvy5box12*R*{T!rAkv;Y0XBJje;bN2}$i1^$(Fh8v#xc zjaN;t!Z*HrV_)vC21C!;--InD?%rdKg~BYK@}9E|Q>GrZTJ3=^;+#!;Izxso_>9Dg zSq~3| zH8dO-7W9XBFz0g2h<$XPeqy4$E(0sjcN%S9579dUFC_>Q3sxGA4sH0EKArEcbW4xN z^Lx%Un}nG4q^pnSqDAW&=Upon{2|jPX;65q4LYzKF5V+7op)&W@1zryLd40&Nz9)ojz zo#vE9+b)w)DV~>tec!w z9~%AQW0GhVP7 z=&GW)$Yp1~g*V*A$WG<1Jbw7BfCyw#w$QQ2#p^;uTan z5i6#QOm1XL$z@xyZeA3G_ZkZR!BF!I&rZt6t&iuRd##G8DI0rsL>RVAib}TtvLpT~ znMmTt!vX?l!v31<=% zy(e?_$BIj`q~rupt`9XBe<``T4a)rj{^cU@D8T7Z$)6nT5pN2YKv&7fKqBlW=rXFXaDFSP+N zI)WmquxMIqSjS5I76|jZ_9{k9$kt?S!3}|vsTL7#ify~+ff_$fx zECRr#mDVze+8}%gqMdiJQq!&@$Xli4L%=}`9mTViw=v-`g}VggrK`R-I+YwFk+=NH zllz0k#fmdd1a3b-XI=7yV^eW1*KxH(z~ikgw;k-x(?+m6K!wlN2tu((P$~Iss};0{ z0(WNNUKAm0|6+`+1oM%DRQM9)Y)461FxDXiD@aA(dy~kiE8*lTRsh{f$_pP7c@HX~ z-Ld*7su^r|E%eJJk)&xqqPlQU}<8rI2o_*)k0AOPJ9lX6_F{DXewJFOY+I&1{te9MsmIg_Qz%uSEw*2+6 ze*CFruD+Z}tZZR6kIiC2iBNS5@-xa z>1CbgC?d_3{|HQTO-)A#!l7{#9%k?E?)b$L^fGGfnXLpz*nbyEx^EtkkztBEMR)7p z$Nc_LMJS1(;ArM3M60GScI+P;80y3zCAtUbZt~9-bRnzf1Ja+QrlvCAOh0@1e#@Ej z=Wjer`8)6`)ADAbPQ0#ZF0U)PkUug>T)42qPL&l-%Aj&kN$zYwY@t5d26tX33^Ft0_@;{JixNQIc diff --git a/public/images/ui/summary_profile.png b/public/images/ui/summary_profile.png index 38bb5e84dfda3cb13df2bc1cddd8a532e5a4bad2..55cc70dc4d09fb43382213ab5321a6ac53efb435 100644 GIT binary patch literal 2935 zcmb_e3se(V8V*{mYghE_X>EOBHnzA3A#Xya1WJKLl!zMwWRZZAnMsIbGHD(ppv3p# zY3Dwqe>i2AVfszl^~RZXozA&DpPPtjwUOKD1*7A zG!~D_Q^p|KvaR_lBsqVF0LssSI4~(Hk{F=}Z~_$3fJ8kiSEvC!mo&=@;A8JJg+!c% zXmYruXsRG@(U^21n-fY4qjKoX5F(vQV^gSX3XMUg(g120z~B() zFA{D|1xo;a?C*qJ~s5rACG+h+alejA=Do60UU41yt#yRjB8~ga?eG2bC0BDAnuIED(l#IHgu4 zpEV9c6hw}oh(e>ru{0l6nT=^MbvE_`)V}3!8Nfr!UR%f)4G@_M5LVpIsI!BhealP@G{=YnKnObqdNX)*C{2rfFrS> z2H}$ER62`HrITqa0gVB$!U0-Xus3|#9(qvg&W4zF=kcpctC?f&Y__+e*znI5++Pnn;Y?Z0;ROQW|hh*fn`H@^k zoUH)>guJ!QB|+Y#BDjLNY1v~U@bf&F+po(;aMB-1_Z&=(Ni;f8g+xp7X#GSnQGQ6e z8qEE1;Xf~Rj}`v?;``r)&xaJs1{G2SZ;}*}*A!@cu1Jh>aHLPu;s&r?Br?-*Vd$?|0^K)6v^+Zi{|;X)3ZJ zC;Ig9ZB54y9yqw9boJ^0rtC$%g(_UzwYcb1Kae}a>U-&YRiQk0lx;3gGH3-gQskJU z&uTU8y;#CGxAdpkCr>1-@h_}&R}5-4WN}>+cFQ%-1gpthJ$1wJiQFYL%Yfr)_!+S zf5qDB4_GENFeTX*8-9Jp+|t(8Hkm&7Y^$XBObNfr*w<1)xS9HCFT(HCR(^DKX1cfl z*VAy}Lbv`_^T?_4!oq4OYthr=TTBIkDM24lzT&yJ%ZyC>`i>hG2T*;wTrl23Hx+E2 zUEA~Obw}~Ad;3roTv5~`5u@&m>dU8xtD}S5NwtmI$;643|R zoi5n;g4w?R^~sFDl>L>w>JD}s%huzOw)59^RrVH?CUj!bciTJP zNcu}rzsoh;UG~Zs4+5^T*Z51-1_m}>dSQl9!7WWPMh3X)`ooCOYVa5)F1NP6AF_HT z?7lJ8)9$!4d3X}}SA9p{rpTh6(fi$Hmk*kbAp8ySteU%pY2e#}7LY&DMh`hL9G+Nf zSX(0IZ+Ii2GwX2sUF^j0GJI-X1lN;XWjw0=wSj-PZh%{g(br$2n?~+`{g%z|(!X^} ze)~i`dm<#ecX|e|4z>la%*@PGWPF()k=dh*db^~qulelgI{(7pL4n(Lwj;uVdeAD1 zp|#1}le^E^Xs^oI_)!luH9pi|VY{s_1wGRf?#{(*_PZYnL&8FpI0OI6gU@X)q38ac z*E(Ir8>0YQjZ2h~p)p&B@+tZBDcdr{pY`*=o^92 zNw(MM9F8t>jJeVuJ$(4EGq<2sl7Z%osrES=>RA=sF>OG#^d%FzIi>7QgD3|D%ndhP zhs+pz^XFl<_OQyXvpuZVdQZ8nCh$4Wf3}!JfhlFvOU~dOch(o6 zqAbkzm0dS&hWHa5@05I&SbL>0A=w(gr`c_DRMrxQTP(bT^(zC0M=S+@wTz{+&-Q4I zseNPVmScFSNb#01uCMt+xjuxqdWF<-pl=ujd$W(kFw$#k-$NJWtIrq$&|2cR5AMS6??U0}& zppA|j0RR9f;HZD7F-we5X|djT-{gSr7?VkI=n-E4tKV5=EPxnPAPN9zAX=`TF*DX1 z5|5rt1^}$PzJ!VJYVA1yVEwiLe^mINr!=yvt4;x1gh~343umOAVJ~jnJ-TLD=+1as z{cx8n`^$Oa>UyK<<{n5xcwFMgw+8d7^FDBlVlw`5qrAvapy6qcIHqAdvx>(J6Pn!# z`Dc0M|t z%G82%Q92PxbpDcGJk{Qwv3Y2DgODmskJ@^GN8!p}r)9wJ#0VGh8uWl5)x$TUqV?>8 zCLB>nevT+qh`XViwaH_1ZX-&!OqUW8P0fSp_gh5#b;3mrCHFGb&du1;vkh)fv35f^ zd}ytcjHn6WxwDCr3;!4vw zekeBE9`eU78O0Vdla~)3oYwnF;DWBQtrOLc3f&*iG zH}fBycGRVG4!fW5bA3-z>_Rh4l}wr@Q5Tk?r=TmZFTbhGk|&9GW3d7+ z!FF$FJUbMFQBK#&;u_HKm7Xcw97|s=Dq@n$%dLzg7U82=74V^xASHe*iA6oxqL`X( zS}|hCC{BFt=wT)ngL5eqN>G=;SNQ0qdJ-!WcrTU=`#CQQxQgnzB_9$smWvi&N|9>E zE-g6Z(VabV;>j0z(YkF|*(h_QwBOKOd>LCB_k~RwA&I$X=M^YPN8+%=dMo~_pHGDu zBbfGkenIkq0L|k*4@Goz>J@w;K5xFenYZbcuJx1$)8Rl-&){!?`oPGcsTgxI{UDxw zYNRfM>rDjL&ZZOR$Dzgv7cUuqxNMU`G5>XBid9GL(F6}=%HvQ{!c9VPak4?!F z>I=HltLGWlXJX|^V{07NZSo#jrGSM*O5R89lW7++ALUCInNBHm90=1W^~1N>B26@m zwjNOo7LIvkKzOMUE#=fQRkBje*%2P!m&JD>T&v0U9PAtmT;EKymJlmP{nw4WTv`_g pAno`r2|wyj{SRa|)5&UWT?hE$j?p`aGUNIH1RM_XXZgnF{0sV=0Wbgn diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 1526ae982e5..b952037a079 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -225,7 +225,7 @@ export default class SummaryUiHandler extends UiHandler { this.summaryContainer.add(this.championRibbon); this.championRibbon.setVisible(false); - this.levelText = addTextObject(36, -17, "", TextStyle.SUMMARY_ALT); + this.levelText = addTextObject(24, -17, "", TextStyle.SUMMARY_ALT); this.levelText.setOrigin(0, 1); this.summaryContainer.add(this.levelText); @@ -413,7 +413,7 @@ export default class SummaryUiHandler extends UiHandler { } this.pokeball.setFrame(getPokeballAtlasKey(this.pokemon.pokeball)); - this.levelText.setText(this.pokemon.level.toString()); + this.levelText.setText(`${i18next.t("pokemonSummary:lv")}${this.pokemon.level.toString()}`); this.genderText.setText(getGenderSymbol(this.pokemon.getGender(true))); this.genderText.setColor(getGenderColor(this.pokemon.getGender(true))); this.genderText.setShadowColor(getGenderColor(this.pokemon.getGender(true), true)); @@ -756,7 +756,7 @@ export default class SummaryUiHandler extends UiHandler { trainerText.setOrigin(0, 0); profileContainer.add(trainerText); - const trainerIdText = addTextObject(174, 12, globalScene.gameData.trainerId.toString(), TextStyle.SUMMARY_ALT); + const trainerIdText = addTextObject(141, 12, `${i18next.t("pokemonSummary:idNo")}${globalScene.gameData.trainerId.toString()}`, TextStyle.SUMMARY_ALT); trainerIdText.setOrigin(0, 0); profileContainer.add(trainerIdText); From 2d067ec7ce82e9559f4117cd2896b8bec3d6fa6d Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 21 Feb 2025 07:23:08 +1100 Subject: [PATCH 03/83] [UI][Enhancement] Allow tera type choice on starter select (#5366) * Allow tera type choice on starter select * Make tera type actually apply in run * Remove logging statement * Add support for alternate forms --- index.css | 2 +- index.html | 2 +- src/configs/inputs/cfg_keyboard_qwerty.ts | 6 +- src/configs/inputs/pad_dualshock.ts | 4 +- src/configs/inputs/pad_generic.ts | 4 +- src/configs/inputs/pad_procon.ts | 4 +- src/configs/inputs/pad_unlicensedSNES.ts | 4 +- src/configs/inputs/pad_xbox360.ts | 4 +- src/data/challenge.ts | 1 + src/enums/buttons.ts | 4 +- src/phases/select-starter-phase.ts | 7 ++ src/system/game-data.ts | 2 + src/system/settings/settings-gamepad.ts | 8 +- src/system/settings/settings-keyboard.ts | 16 ++-- .../settingMenu/rebinding_setting.test.ts | 8 +- src/test/utils/fakeMobile.html | 4 +- src/ui-inputs.ts | 6 +- src/ui/pokedex-ui-handler.ts | 5 +- src/ui/starter-select-ui-handler.ts | 79 +++++++++++++++++-- 19 files changed, 121 insertions(+), 49 deletions(-) diff --git a/index.css b/index.css index d32d9da9bb1..9226f968e3e 100644 --- a/index.css +++ b/index.css @@ -170,7 +170,7 @@ input:-internal-autofill-selected { #touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature, #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 { +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX']) #apadCycleTera { display: none; } diff --git a/index.html b/index.html index 390a29fb365..91367cf73ec 100644 --- a/index.html +++ b/index.html @@ -129,7 +129,7 @@
N
-
+
V
diff --git a/src/configs/inputs/cfg_keyboard_qwerty.ts b/src/configs/inputs/cfg_keyboard_qwerty.ts index 5ddc12e8784..c1b00a833c0 100644 --- a/src/configs/inputs/cfg_keyboard_qwerty.ts +++ b/src/configs/inputs/cfg_keyboard_qwerty.ts @@ -180,9 +180,9 @@ const cfg_keyboard_qwerty = { [SettingKeyboard.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingKeyboard.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingKeyboard.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingKeyboard.Button_Cycle_Variant]: Button.V, [SettingKeyboard.Button_Speed_Up]: Button.SPEED_UP, [SettingKeyboard.Button_Slow_Down]: Button.SLOW_DOWN, + [SettingKeyboard.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingKeyboard.Alt_Button_Up]: Button.UP, [SettingKeyboard.Alt_Button_Down]: Button.DOWN, [SettingKeyboard.Alt_Button_Left]: Button.LEFT, @@ -197,9 +197,9 @@ const cfg_keyboard_qwerty = { [SettingKeyboard.Alt_Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingKeyboard.Alt_Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingKeyboard.Alt_Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingKeyboard.Alt_Button_Cycle_Variant]: Button.V, [SettingKeyboard.Alt_Button_Speed_Up]: Button.SPEED_UP, [SettingKeyboard.Alt_Button_Slow_Down]: Button.SLOW_DOWN, + [SettingKeyboard.Alt_Button_Cycle_Tera]: Button.CYCLE_TERA, }, default: { KEY_ARROW_UP: SettingKeyboard.Button_Up, @@ -216,7 +216,7 @@ const cfg_keyboard_qwerty = { KEY_G: SettingKeyboard.Button_Cycle_Gender, KEY_E: SettingKeyboard.Button_Cycle_Ability, KEY_N: SettingKeyboard.Button_Cycle_Nature, - KEY_V: SettingKeyboard.Button_Cycle_Variant, + KEY_V: SettingKeyboard.Button_Cycle_Tera, KEY_PLUS: -1, KEY_MINUS: -1, KEY_A: SettingKeyboard.Alt_Button_Left, diff --git a/src/configs/inputs/pad_dualshock.ts b/src/configs/inputs/pad_dualshock.ts index 2fbdd0ddfaa..265b39fdad5 100644 --- a/src/configs/inputs/pad_dualshock.ts +++ b/src/configs/inputs/pad_dualshock.ts @@ -53,7 +53,7 @@ const pad_dualshock = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, @@ -72,7 +72,7 @@ const pad_dualshock = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/configs/inputs/pad_generic.ts b/src/configs/inputs/pad_generic.ts index 256af8f0fe3..cd91fcd8b17 100644 --- a/src/configs/inputs/pad_generic.ts +++ b/src/configs/inputs/pad_generic.ts @@ -51,7 +51,7 @@ const pad_generic = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, @@ -69,7 +69,7 @@ const pad_generic = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/configs/inputs/pad_procon.ts b/src/configs/inputs/pad_procon.ts index 98d17c4ef57..a7ae5383fbe 100644 --- a/src/configs/inputs/pad_procon.ts +++ b/src/configs/inputs/pad_procon.ts @@ -52,7 +52,7 @@ const pad_procon = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, @@ -70,7 +70,7 @@ const pad_procon = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/configs/inputs/pad_unlicensedSNES.ts b/src/configs/inputs/pad_unlicensedSNES.ts index 77e68e6a644..fbde98b3fa2 100644 --- a/src/configs/inputs/pad_unlicensedSNES.ts +++ b/src/configs/inputs/pad_unlicensedSNES.ts @@ -43,7 +43,7 @@ const pad_unlicensedSNES = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, @@ -61,7 +61,7 @@ const pad_unlicensedSNES = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/configs/inputs/pad_xbox360.ts b/src/configs/inputs/pad_xbox360.ts index 6afc452f50b..88fee731d1d 100644 --- a/src/configs/inputs/pad_xbox360.ts +++ b/src/configs/inputs/pad_xbox360.ts @@ -51,7 +51,7 @@ const pad_xbox360 = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, @@ -69,7 +69,7 @@ const pad_xbox360 = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/data/challenge.ts b/src/data/challenge.ts index c6e85be2389..30c2c9a6ce4 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -708,6 +708,7 @@ export class FreshStartChallenge extends Challenge { pokemon.variant = 0; // Not shiny pokemon.formIndex = 0; // Froakie should be base form pokemon.ivs = [ 15, 15, 15, 15, 15, 15 ]; // Default IVs of 15 for all stats (Updated to 15 from 10 in 1.2.0) + pokemon.teraType = pokemon.species.type1; // Always primary tera type return true; } diff --git a/src/enums/buttons.ts b/src/enums/buttons.ts index fe26023f8e7..f828b280d45 100644 --- a/src/enums/buttons.ts +++ b/src/enums/buttons.ts @@ -13,7 +13,7 @@ export enum Button { CYCLE_GENDER, CYCLE_ABILITY, CYCLE_NATURE, - V, + CYCLE_TERA, SPEED_UP, - SLOW_DOWN + SLOW_DOWN, } diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts index 79012901a3a..b7ad15533a6 100644 --- a/src/phases/select-starter-phase.ts +++ b/src/phases/select-starter-phase.ts @@ -12,6 +12,7 @@ import type { Starter } from "#app/ui/starter-select-ui-handler"; import { Mode } from "#app/ui/ui"; import type { Species } from "#enums/species"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +import * as Utils from "../utils"; export class SelectStarterPhase extends Phase { @@ -79,6 +80,12 @@ export class SelectStarterPhase extends Phase { starterPokemon.nickname = starter.nickname; } + if (!Utils.isNullOrUndefined(starter.teraType)) { + starterPokemon.teraType = starter.teraType; + } else { + starterPokemon.teraType = starterPokemon.species.type1; + } + if (globalScene.gameMode.isSplicedOnly || Overrides.STARTER_FUSION_OVERRIDE) { starterPokemon.generateFusionSpecies(true); } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 63d79d47fba..6b25013795f 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -55,6 +55,7 @@ import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-e import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { ArenaTrapTag } from "#app/data/arena-tag"; +import type { Type } from "#enums/type"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -229,6 +230,7 @@ export interface StarterAttributes { shiny?: boolean; favorite?: boolean; nickname?: string; + tera?: Type; } export interface StarterPreferences { diff --git a/src/system/settings/settings-gamepad.ts b/src/system/settings/settings-gamepad.ts index d26c0c9f019..840304ab1ba 100644 --- a/src/system/settings/settings-gamepad.ts +++ b/src/system/settings/settings-gamepad.ts @@ -21,7 +21,7 @@ export enum SettingGamepad { Button_Cycle_Gender = "BUTTON_CYCLE_GENDER", Button_Cycle_Ability = "BUTTON_CYCLE_ABILITY", Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", - Button_Cycle_Variant = "BUTTON_CYCLE_VARIANT", + Button_Cycle_Tera = "BUTTON_CYCLE_TERA", Button_Speed_Up = "BUTTON_SPEED_UP", Button_Slow_Down = "BUTTON_SLOW_DOWN", Button_Submit = "BUTTON_SUBMIT", @@ -45,7 +45,7 @@ export const settingGamepadOptions = { [SettingGamepad.Button_Cycle_Gender]: [ `KEY ${Button.CYCLE_GENDER.toString()}`, pressAction ], [SettingGamepad.Button_Cycle_Ability]: [ `KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction ], [SettingGamepad.Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Variant]: [ `KEY ${Button.V.toString()}`, pressAction ], + [SettingGamepad.Button_Cycle_Tera]: [ `KEY ${Button.CYCLE_TERA.toString()}`, pressAction ], [SettingGamepad.Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], [SettingGamepad.Button_Slow_Down]: [ `KEY ${Button.SLOW_DOWN.toString()}`, pressAction ], [SettingGamepad.Button_Submit]: [ `KEY ${Button.SUBMIT.toString()}`, pressAction ], @@ -67,7 +67,7 @@ export const settingGamepadDefaults = { [SettingGamepad.Button_Cycle_Gender]: 0, [SettingGamepad.Button_Cycle_Ability]: 0, [SettingGamepad.Button_Cycle_Nature]: 0, - [SettingGamepad.Button_Cycle_Variant]: 0, + [SettingGamepad.Button_Cycle_Tera]: 0, [SettingGamepad.Button_Speed_Up]: 0, [SettingGamepad.Button_Slow_Down]: 0, [SettingGamepad.Button_Submit]: 0, @@ -96,7 +96,7 @@ export function setSettingGamepad(setting: SettingGamepad, value: number): boole case SettingGamepad.Button_Cycle_Gender: case SettingGamepad.Button_Cycle_Ability: case SettingGamepad.Button_Cycle_Nature: - case SettingGamepad.Button_Cycle_Variant: + case SettingGamepad.Button_Cycle_Tera: case SettingGamepad.Button_Speed_Up: case SettingGamepad.Button_Slow_Down: case SettingGamepad.Button_Submit: diff --git a/src/system/settings/settings-keyboard.ts b/src/system/settings/settings-keyboard.ts index 95ad4ba41f1..1a7db1b10c2 100644 --- a/src/system/settings/settings-keyboard.ts +++ b/src/system/settings/settings-keyboard.ts @@ -32,8 +32,8 @@ export enum SettingKeyboard { Alt_Button_Cycle_Ability = "ALT_BUTTON_CYCLE_ABILITY", Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", Alt_Button_Cycle_Nature = "ALT_BUTTON_CYCLE_NATURE", - Button_Cycle_Variant = "BUTTON_CYCLE_VARIANT", - Alt_Button_Cycle_Variant = "ALT_BUTTON_CYCLE_VARIANT", + Button_Cycle_Tera = "BUTTON_CYCLE_TERA", + Alt_Button_Cycle_Tera = "ALT_BUTTON_CYCLE_TERA", Button_Speed_Up = "BUTTON_SPEED_UP", Alt_Button_Speed_Up = "ALT_BUTTON_SPEED_UP", Button_Slow_Down = "BUTTON_SLOW_DOWN", @@ -73,8 +73,8 @@ export const settingKeyboardOptions = { [SettingKeyboard.Alt_Button_Cycle_Ability]: [ `KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction ], [SettingKeyboard.Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], [SettingKeyboard.Alt_Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Variant]: [ `KEY ${Button.V.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Variant]: [ `KEY ${Button.V.toString()}`, pressAction ], + [SettingKeyboard.Button_Cycle_Tera]: [ `KEY ${Button.CYCLE_TERA.toString()}`, pressAction ], + [SettingKeyboard.Alt_Button_Cycle_Tera]: [ `KEY ${Button.CYCLE_TERA.toString()}`, pressAction ], [SettingKeyboard.Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], [SettingKeyboard.Alt_Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], [SettingKeyboard.Button_Slow_Down]: [ `KEY ${Button.SLOW_DOWN.toString()}`, pressAction ], @@ -112,8 +112,8 @@ export const settingKeyboardDefaults = { [SettingKeyboard.Alt_Button_Cycle_Ability]: 0, [SettingKeyboard.Button_Cycle_Nature]: 0, [SettingKeyboard.Alt_Button_Cycle_Nature]: 0, - [SettingKeyboard.Button_Cycle_Variant]: 0, - [SettingKeyboard.Alt_Button_Cycle_Variant]: 0, + [SettingKeyboard.Button_Cycle_Tera]: 0, + [SettingKeyboard.Alt_Button_Cycle_Tera]: 0, [SettingKeyboard.Button_Speed_Up]: 0, [SettingKeyboard.Alt_Button_Speed_Up]: 0, [SettingKeyboard.Button_Slow_Down]: 0, @@ -148,7 +148,7 @@ export function setSettingKeyboard(setting: SettingKeyboard, value: number): boo case SettingKeyboard.Button_Cycle_Gender: case SettingKeyboard.Button_Cycle_Ability: case SettingKeyboard.Button_Cycle_Nature: - case SettingKeyboard.Button_Cycle_Variant: + case SettingKeyboard.Button_Cycle_Tera: case SettingKeyboard.Button_Speed_Up: case SettingKeyboard.Button_Slow_Down: case SettingKeyboard.Alt_Button_Up: @@ -164,7 +164,7 @@ export function setSettingKeyboard(setting: SettingKeyboard, value: number): boo case SettingKeyboard.Alt_Button_Cycle_Gender: case SettingKeyboard.Alt_Button_Cycle_Ability: case SettingKeyboard.Alt_Button_Cycle_Nature: - case SettingKeyboard.Alt_Button_Cycle_Variant: + case SettingKeyboard.Alt_Button_Cycle_Tera: case SettingKeyboard.Alt_Button_Speed_Up: case SettingKeyboard.Alt_Button_Slow_Down: case SettingKeyboard.Alt_Button_Submit: diff --git a/src/test/settingMenu/rebinding_setting.test.ts b/src/test/settingMenu/rebinding_setting.test.ts index cae2df363d8..46a37f4e137 100644 --- a/src/test/settingMenu/rebinding_setting.test.ts +++ b/src/test/settingMenu/rebinding_setting.test.ts @@ -406,9 +406,9 @@ describe("Test Rebinding", () => { }); it("check to delete all the binds of an action", () => { - inGame.whenWePressOnKeyboard("V").weShouldTriggerTheButton("Button_Cycle_Variant"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Variant").thereShouldBeNoIcon().weWantThisBindInstead("K").confirm(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Variant").iconDisplayedIs("KEY_K").whenWeDelete().thereShouldBeNoIconAnymore(); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Variant").iconDisplayedIs("KEY_V").whenWeDelete().thereShouldBeNoIconAnymore(); + inGame.whenWePressOnKeyboard("V").weShouldTriggerTheButton("Button_Cycle_Tera"); + inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Tera").thereShouldBeNoIcon().weWantThisBindInstead("K").confirm(); + inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Tera").iconDisplayedIs("KEY_K").whenWeDelete().thereShouldBeNoIconAnymore(); + inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Tera").iconDisplayedIs("KEY_V").whenWeDelete().thereShouldBeNoIconAnymore(); }); }); diff --git a/src/test/utils/fakeMobile.html b/src/test/utils/fakeMobile.html index 4b566d592d9..263b03969d4 100644 --- a/src/test/utils/fakeMobile.html +++ b/src/test/utils/fakeMobile.html @@ -35,7 +35,7 @@
R
-
+
V
@@ -59,7 +59,7 @@
N
-
+
V
diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index e6a0ed7a69c..951aec2a3b6 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -86,7 +86,7 @@ export class UiInputs { [Button.CYCLE_GENDER]: () => this.buttonCycleOption(Button.CYCLE_GENDER), [Button.CYCLE_ABILITY]: () => this.buttonCycleOption(Button.CYCLE_ABILITY), [Button.CYCLE_NATURE]: () => this.buttonCycleOption(Button.CYCLE_NATURE), - [Button.V]: () => this.buttonCycleOption(Button.V), + [Button.CYCLE_TERA]: () => this.buttonCycleOption(Button.CYCLE_TERA), [Button.SPEED_UP]: () => this.buttonSpeedChange(), [Button.SLOW_DOWN]: () => this.buttonSpeedChange(false), }; @@ -109,7 +109,7 @@ export class UiInputs { [Button.CYCLE_GENDER]: () => undefined, [Button.CYCLE_ABILITY]: () => undefined, [Button.CYCLE_NATURE]: () => undefined, - [Button.V]: () => this.buttonInfo(false), + [Button.CYCLE_TERA]: () => undefined, [Button.SPEED_UP]: () => undefined, [Button.SLOW_DOWN]: () => undefined, }; @@ -197,7 +197,7 @@ export class UiInputs { const uiHandler = globalScene.ui?.getHandler(); if (whitelist.some(handler => uiHandler instanceof handler)) { globalScene.ui.processInput(button); - } else if (button === Button.V) { + } else if (button === Button.CYCLE_TERA) { this.buttonInfo(true); } } diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 5180d7bd956..1ba1b846224 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -919,7 +919,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } else { error = true; } - } else if (button === Button.V) { + } else if (button === Button.CYCLE_TERA) { if (!this.filterTextMode && !this.showingTray) { this.cursorObj.setVisible(false); this.setSpecies(null); @@ -1170,9 +1170,6 @@ export default class PokedexUiHandler extends MessageUiHandler { case SettingKeyboard.Button_Cycle_Shiny: iconPath = "R.png"; break; - case SettingKeyboard.Button_Cycle_Variant: - iconPath = "V.png"; - break; case SettingKeyboard.Button_Cycle_Form: iconPath = "F.png"; break; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index b919679be00..a102fc9dc08 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -56,6 +56,8 @@ import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCa import { BooleanHolder, fixedInt, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, randIntRange, rgbHexToRgba, toReadableString } from "#app/utils"; import type { Nature } from "#enums/nature"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; +import { achvs } from "#app/system/achv"; +import * as Utils from "../utils"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -68,6 +70,7 @@ export interface Starter { moveset?: StarterMoveset; pokerus: boolean; nickname?: string; + teraType?: Type; } interface LanguageSetting { @@ -212,6 +215,7 @@ interface SpeciesDetails { abilityIndex?: number, natureIndex?: number, forSeen?: boolean, // default = false + teraType?: Type, } export default class StarterSelectUiHandler extends MessageUiHandler { @@ -262,6 +266,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonShinyIcon: Phaser.GameObjects.Sprite; private pokemonPassiveDisabledIcon: Phaser.GameObjects.Sprite; private pokemonPassiveLockedIcon: Phaser.GameObjects.Sprite; + private teraIcon: Phaser.GameObjects.Sprite; private activeTooltip: "ABILITY" | "PASSIVE" | "CANDY" | undefined; private instructionsContainer: Phaser.GameObjects.Container; @@ -271,12 +276,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private abilityIconElement: Phaser.GameObjects.Sprite; private genderIconElement: Phaser.GameObjects.Sprite; private natureIconElement: Phaser.GameObjects.Sprite; + private teraIconElement: Phaser.GameObjects.Sprite; private goFilterIconElement: Phaser.GameObjects.Sprite; private shinyLabel: Phaser.GameObjects.Text; private formLabel: Phaser.GameObjects.Text; private genderLabel: Phaser.GameObjects.Text; private abilityLabel: Phaser.GameObjects.Text; private natureLabel: Phaser.GameObjects.Text; + private teraLabel: Phaser.GameObjects.Text; private goFilterLabel: Phaser.GameObjects.Text; private starterSelectMessageBox: Phaser.GameObjects.NineSlice; @@ -292,6 +299,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private dexAttrCursor: bigint = 0n; private abilityCursor: number = -1; private natureCursor: number = -1; + private teraCursor: Type = Type.UNKNOWN; private filterBarCursor: number = 0; private starterMoveset: StarterMoveset | null; private scrollCursor: number; @@ -304,6 +312,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private starterAttr: bigint[] = []; private starterAbilityIndexes: number[] = []; private starterNatures: Nature[] = []; + private starterTeras: Type[] = []; private starterMovesets: StarterMoveset[] = []; private speciesStarterDexEntry: DexEntry | null; private speciesStarterMoves: Moves[]; @@ -312,6 +321,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private canCycleGender: boolean; private canCycleAbility: boolean; private canCycleNature: boolean; + private canCycleTera: boolean; private assetLoadCancelled: BooleanHolder | null; public cursorObj: Phaser.GameObjects.Image; @@ -823,6 +833,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.pokemonEggMovesContainer); + this.teraIcon = globalScene.add.sprite(85, 63, "button_tera"); + this.teraIcon.setName("terrastallize-icon"); + this.teraIcon.setFrame("fire"); + this.starterSelectContainer.add(this.teraIcon); + // The font size should be set per language const instructionTextSize = textSettings.instructionTextSize; @@ -867,6 +882,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.natureLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleNature"), TextStyle.PARTY, { fontSize: instructionTextSize }); this.natureLabel.setName("text-nature-label"); + this.teraIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + this.teraIconElement.setName("sprite-tera-icon-element"); + this.teraIconElement.setScale(0.675); + this.teraIconElement.setOrigin(0.0, 0.0); + this.teraLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleTera"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.teraLabel.setName("text-tera-label"); + this.goFilterIconElement = new Phaser.GameObjects.Sprite(globalScene, this.filterInstructionRowX, this.filterInstructionRowY, "keyboard", "C.png"); this.goFilterIconElement.setName("sprite-goFilter-icon-element"); this.goFilterIconElement.setScale(0.675); @@ -1497,6 +1519,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const props = globalScene.gameData.getSpeciesDexAttrProps(randomSpecies, dexAttr); const abilityIndex = this.abilityCursor; const nature = this.natureCursor as unknown as Nature; + const teraType = this.teraCursor; const moveset = this.starterMoveset?.slice(0) as StarterMoveset; const starterCost = globalScene.gameData.getSpeciesStarterValue(randomSpecies.speciesId); const speciesForm = getPokemonSpeciesForm(randomSpecies.speciesId, props.formIndex); @@ -1505,7 +1528,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { .loadAssets(props.female, props.formIndex, props.shiny, props.variant, true) .then(() => { if (this.tryUpdateValue(starterCost, true)) { - this.addToParty(randomSpecies, dexAttr, abilityIndex, nature, moveset, true); + this.addToParty(randomSpecies, dexAttr, abilityIndex, nature, moveset, teraType, true); ui.playSelect(); } }); @@ -1585,7 +1608,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; cursorObj.setVisible(true); cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); - this.addToParty(this.lastSpecies, this.dexAttrCursor, this.abilityCursor, this.natureCursor as unknown as Nature, this.starterMoveset?.slice(0) as StarterMoveset); + this.addToParty(this.lastSpecies, this.dexAttrCursor, this.abilityCursor, this.natureCursor as unknown as Nature, this.starterMoveset?.slice(0) as StarterMoveset, this.teraCursor); ui.playSelect(); } else { ui.playError(); // this should be redundant as there is now a trigger for when a pokemon can't be added to party @@ -2066,7 +2089,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } while (newFormIndex !== props.formIndex); starterAttributes.form = newFormIndex; // store the selected form - this.setSpeciesDetails(this.lastSpecies, { formIndex: newFormIndex }); + starterAttributes.tera = this.lastSpecies.forms[newFormIndex].type1; + this.setSpeciesDetails(this.lastSpecies, { formIndex: newFormIndex, teraType: starterAttributes.tera }); success = true; } break; @@ -2125,6 +2149,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; } break; + case Button.CYCLE_TERA: + if (this.canCycleTera) { + const speciesForm = getPokemonSpeciesForm(this.lastSpecies.speciesId, starterAttributes.form ?? 0); + if (speciesForm.type1 === this.teraCursor && !Utils.isNullOrUndefined(speciesForm.type2)) { + starterAttributes.tera = speciesForm.type2!; + this.setSpeciesDetails(this.lastSpecies, { teraType: speciesForm.type2! }); + } else { + starterAttributes.tera = speciesForm.type1; + this.setSpeciesDetails(this.lastSpecies, { teraType: speciesForm.type1 }); + } + success = true; + } + break; case Button.UP: if (!this.starterIconsCursorObj.visible) { if (currentRow > 0) { @@ -2289,7 +2326,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return [ isDupe, removeIndex ]; } - addToParty(species: PokemonSpecies, dexAttr: bigint, abilityIndex: number, nature: Nature, moveset: StarterMoveset, randomSelection: boolean = false) { + addToParty(species: PokemonSpecies, dexAttr: bigint, abilityIndex: number, nature: Nature, moveset: StarterMoveset, teraType: Type, randomSelection: boolean = false) { const props = globalScene.gameData.getSpeciesDexAttrProps(species, dexAttr); this.starterIcons[this.starterSpecies.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); this.starterIcons[this.starterSpecies.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); @@ -2299,6 +2336,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterAttr.push(dexAttr); this.starterAbilityIndexes.push(abilityIndex); this.starterNatures.push(nature); + this.starterTeras.push(teraType); this.starterMovesets.push(moveset); if (this.speciesLoaded.get(species.speciesId) || randomSelection ) { getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(); @@ -2379,6 +2417,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { case SettingKeyboard.Button_Cycle_Nature: iconPath = "N.png"; break; + case SettingKeyboard.Button_Cycle_Tera: + iconPath = "V.png"; + break; case SettingKeyboard.Button_Stats: iconPath = "C.png"; break; @@ -2459,6 +2500,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.canCycleNature) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Nature, gamepadType, this.natureIconElement, this.natureLabel); } + if (this.canCycleTera) { + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Tera, gamepadType, this.teraIconElement, this.teraLabel); + } } // if filter mode is inactivated and gamepadType is not undefined, update the button icons @@ -2876,6 +2920,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.dexAttrCursor = species ? this.getCurrentDexProps(species.speciesId) : 0n; this.abilityCursor = species ? globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0; this.natureCursor = species ? globalScene.gameData.getSpeciesDefaultNature(species) : 0; + this.teraCursor = species ? species.type1 : Type.UNKNOWN; if (!species && globalScene.ui.getTooltip().visible) { globalScene.ui.hideTooltip(); @@ -2894,6 +2939,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // load default ability from stater save data, if set this.abilityCursor = starterAttributes.ability; } + if (starterAttributes?.tera) { + // load default tera from starter save data, if set + this.teraCursor = starterAttributes.tera; + } if (this.statsMode) { if (this.speciesStarterDexEntry?.caughtAttr) { @@ -3035,7 +3084,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { female: props.female, variant: props.variant, abilityIndex: this.starterAbilityIndexes[starterIndex], - natureIndex: this.starterNatures[starterIndex] + natureIndex: this.starterNatures[starterIndex], + teraType: this.starterTeras[starterIndex] }); } else { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); @@ -3083,6 +3133,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.setVisible(false); this.pokemonCandyContainer.setVisible(false); this.pokemonFormText.setVisible(false); + this.teraIcon.setVisible(false); const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, true, true); const defaultAbilityIndex = globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); @@ -3117,6 +3168,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.setVisible(false); this.pokemonCandyContainer.setVisible(false); this.pokemonFormText.setVisible(false); + this.teraIcon.setVisible(false); this.setSpeciesDetails(species!, { // TODO: is this bang correct? shiny: false, @@ -3131,7 +3183,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}): void { - let { shiny, formIndex, female, variant, abilityIndex, natureIndex } = options; + let { shiny, formIndex, female, variant, abilityIndex, natureIndex, teraType } = options; const forSeen: boolean = options.forSeen ?? false; const oldProps = species ? globalScene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; const oldAbilityIndex = this.abilityCursor > -1 ? this.abilityCursor : globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); @@ -3139,6 +3191,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.dexAttrCursor = 0n; this.abilityCursor = -1; this.natureCursor = -1; + this.teraCursor = Type.UNKNOWN; // We will only update the sprite if there is a change to form, shiny/variant // or gender for species with gender sprite differences const shouldUpdateSprite = (species?.genderDiffs && !isNullOrUndefined(female)) @@ -3168,6 +3221,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.dexAttrCursor |= globalScene.gameData.getFormAttr(formIndex !== undefined ? formIndex : (formIndex = oldProps!.formIndex)); // TODO: is this bang correct? this.abilityCursor = abilityIndex !== undefined ? abilityIndex : (abilityIndex = oldAbilityIndex); this.natureCursor = natureIndex !== undefined ? natureIndex : (natureIndex = oldNatureIndex); + this.teraCursor = !Utils.isNullOrUndefined(teraType) ? teraType : (teraType = species.type1); const [ isInParty, partyIndex ]: [boolean, number] = this.isInParty(species); // we use this to firstly check if the pokemon is in the party, and if so, to get the party index in order to update the icon image if (isInParty) { this.updatePartyIcon(species, partyIndex); @@ -3179,6 +3233,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveText.setVisible(false); this.pokemonPassiveDisabledIcon.setVisible(false); this.pokemonPassiveLockedIcon.setVisible(false); + this.teraIcon.setVisible(false); if (this.assetLoadCancelled) { this.assetLoadCancelled.value = true; @@ -3230,6 +3285,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterAttr[starterIndex] = this.dexAttrCursor; this.starterAbilityIndexes[starterIndex] = this.abilityCursor; this.starterNatures[starterIndex] = this.natureCursor; + this.starterTeras[starterIndex] = this.teraCursor; } const assetLoadCancelled = new BooleanHolder(false); @@ -3288,7 +3344,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.canCycleForm = species.forms.filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) .map((_, f) => dexEntry.caughtAttr & globalScene.gameData.getFormAttr(f)).filter(f => f).length > 1; this.canCycleNature = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1; - + this.canCycleTera = globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(getPokemonSpeciesForm(species.speciesId, formIndex ?? 0).type2); } if (dexEntry.caughtAttr && species.malePercent !== null) { @@ -3412,10 +3468,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonFormText.setText(formText); this.setTypeIcons(speciesForm.type1, speciesForm.type2); + + this.teraIcon.setFrame(Type[this.teraCursor].toLowerCase()); + this.teraIcon.setVisible(!this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id)); } else { this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); this.pokemonNatureText.setText(""); + this.teraIcon.setVisible(false); this.setTypeIcons(null, null); } } else { @@ -3426,6 +3486,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); this.pokemonNatureText.setText(""); + this.teraIcon.setVisible(false); this.setTypeIcons(null, null); } @@ -3479,6 +3540,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterAttr.splice(index, 1); this.starterAbilityIndexes.splice(index, 1); this.starterNatures.splice(index, 1); + this.starterTeras.splice(index, 1); this.starterMovesets.splice(index, 1); for (let s = 0; s < this.starterSpecies.length; s++) { @@ -3690,6 +3752,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { abilityIndex: thisObj.starterAbilityIndexes[i], passive: !(globalScene.gameData.starterData[starterSpecies.speciesId].passiveAttr ^ (PassiveAttr.ENABLED | PassiveAttr.UNLOCKED)), nature: thisObj.starterNatures[i] as Nature, + teraType: thisObj.starterTeras[i] as Type, moveset: thisObj.starterMovesets[i], pokerus: thisObj.pokerusSpecies.includes(starterSpecies), nickname: thisObj.starterPreferences[starterSpecies.speciesId]?.nickname, @@ -3816,6 +3879,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.abilityLabel.setVisible(false); this.natureIconElement.setVisible(false); this.natureLabel.setVisible(false); + this.teraIconElement.setVisible(false); + this.teraLabel.setVisible(false); this.goFilterIconElement.setVisible(false); this.goFilterLabel.setVisible(false); } From 073a36a33e5b357ffc06a198df1d1e7f36012844 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Fri, 21 Feb 2025 00:49:57 +0100 Subject: [PATCH 04/83] [Localization] Corrections move-touch-controls-handler local key names (#5365) * Update move-touch-controls-handler.ts * Update locales submodule --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- public/locales | 2 +- src/ui/settings/move-touch-controls-handler.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/locales b/public/locales index 58dda14ee83..ef43efffe5f 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 58dda14ee834204c4bd5ece47694a3c068df4b0e +Subproject commit ef43efffe5fe454862c350f1b9393c3ad755bcc2 diff --git a/src/ui/settings/move-touch-controls-handler.ts b/src/ui/settings/move-touch-controls-handler.ts index da7ac7f0514..48677122363 100644 --- a/src/ui/settings/move-touch-controls-handler.ts +++ b/src/ui/settings/move-touch-controls-handler.ts @@ -93,9 +93,9 @@ export default class MoveTouchControlsHandler { toolbar.innerHTML = `
-
${i18next.t("settings:reset")}
-
${i18next.t("settings:saveClose")}
-
${i18next.t("settings:cancel")}
+
${i18next.t("settings:touchReset")}
+
${i18next.t("settings:touchSaveClose")}
+
${i18next.t("settings:touchCancel")}
From ed8d162125e87f7942a39a8ab8f7684948af0140 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 21 Feb 2025 10:50:39 +1100 Subject: [PATCH 05/83] [Balance] Make stat a much larger factor in moveset gen #5383 --- src/field/pokemon.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 714f1ec7026..246f82b8164 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2348,12 +2348,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const maxPower = Math.min(movePool.reduce((v, m) => Math.max(allMoves[m[0]].power, v), 40), 90); movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].power / maxPower, 1), 0.5)) ]); - // Weight damaging moves against the lower stat + // Weight damaging moves against the lower stat. This uses a non-linear relationship. + // If the higher stat is 1 - 1.09x higher, no change. At higher stat ~1.38x lower stat, off-stat moves have half weight. + // One third weight at ~1.58x higher, one quarter weight at ~1.73x higher, one fifth at ~1.87x, and one tenth at ~2.35x higher. const atk = this.getStat(Stat.ATK); const spAtk = this.getStat(Stat.SPATK); const worseCategory: MoveCategory = atk > spAtk ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL; const statRatio = worseCategory === MoveCategory.PHYSICAL ? atk / spAtk : spAtk / atk; - movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === worseCategory ? statRatio : 1) ]); + movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === worseCategory ? Math.min(Math.pow(statRatio, 3) * 1.3, 1) : 1) ]); /** The higher this is the more the game weights towards higher level moves. At `0` all moves are equal weight. */ let weightMultiplier = 0.9; From 5072460f4c33dbec9a138a0bd7cebdf8ac60fdc0 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 20 Feb 2025 18:16:41 -0600 Subject: [PATCH 06/83] [Bug] Fix endless tokens allowing attacks to deal 0 damage (#5347) --- src/data/ability.ts | 2 +- src/modifier/modifier.ts | 2 +- src/test/battle/damage_calculation.test.ts | 24 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 940b5f0c7d7..95601dc2010 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1404,7 +1404,7 @@ export class DamageBoostAbAttr extends PreAttackAbAttr { applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { if (this.condition(pokemon, defender, move)) { const power = args[0] as Utils.NumberHolder; - power.value = Math.floor(power.value * this.damageMultiplier); + power.value = Utils.toDmgValue(power.value * this.damageMultiplier); return true; } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index fe61eadaccd..3af2aa2144f 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -3390,7 +3390,7 @@ abstract class EnemyDamageMultiplierModifier extends EnemyPersistentModifier { * @returns always `true` */ override apply(multiplier: NumberHolder): boolean { - multiplier.value = Math.floor(multiplier.value * Math.pow(this.damageMultiplier, this.getStackCount())); + multiplier.value = toDmgValue(multiplier.value * Math.pow(this.damageMultiplier, this.getStackCount())); return true; } diff --git a/src/test/battle/damage_calculation.test.ts b/src/test/battle/damage_calculation.test.ts index e6aca828156..22d072f313c 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/src/test/battle/damage_calculation.test.ts @@ -1,4 +1,6 @@ import { allMoves } from "#app/data/move"; +import type { EnemyPersistentModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; @@ -65,6 +67,28 @@ describe("Battle Mechanics - Damage Calculation", () => { expect(aggron.hp).toBe(aggron.getMaxHp() - 1); }); + it("Attacks deal 1 damage at minimum even with many tokens", async () => { + game.override + .startingLevel(1) + .enemySpecies(Species.AGGRON) + .enemyAbility(Abilities.STURDY) + .enemyLevel(10000); + + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + const dmg_redux_modifier = modifierTypes.ENEMY_DAMAGE_REDUCTION().newModifier() as EnemyPersistentModifier; + dmg_redux_modifier.stackCount = 1000; + await game.scene.addEnemyModifier(modifierTypes.ENEMY_DAMAGE_REDUCTION().newModifier() as EnemyPersistentModifier); + + const aggron = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(aggron.hp).toBe(aggron.getMaxHp() - 1); + }); + it("Fixed-damage moves ignore damage multipliers", async () => { game.override .enemySpecies(Species.DRAGONITE) From 13d91403409a44b1dbb5d3427c6040308dc94f23 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Thu, 20 Feb 2025 19:11:52 -0800 Subject: [PATCH 07/83] [Misc] Update console logging of encounter pokemon on beta/local (#5389) --- src/phases/encounter-phase.ts | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 1dd275ab130..ce85460a481 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -38,6 +38,7 @@ import { Species } from "#enums/species"; import { overrideHeldItems, overrideModifiers } from "#app/modifier/modifier"; import i18next from "i18next"; import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; +import { Nature } from "#enums/nature"; export class EncounterPhase extends BattlePhase { private loaded: boolean; @@ -156,7 +157,31 @@ export class EncounterPhase extends BattlePhase { loadEnemyAssets.push(enemyPokemon.loadAssets()); - console.log(`Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, `Species ID: ${enemyPokemon.species.speciesId}`, `Stats: ${enemyPokemon.stats}`, `Ability: ${enemyPokemon.getAbility().name}`, `Passive Ability: ${enemyPokemon.getPassiveAbility().name}`); + const stats: string[] = [ + `HP: ${enemyPokemon.stats[0]} (${enemyPokemon.ivs[0]})`, + ` Atk: ${enemyPokemon.stats[1]} (${enemyPokemon.ivs[1]})`, + ` Def: ${enemyPokemon.stats[2]} (${enemyPokemon.ivs[2]})`, + ` Spatk: ${enemyPokemon.stats[3]} (${enemyPokemon.ivs[3]})`, + ` Spdef: ${enemyPokemon.stats[4]} (${enemyPokemon.ivs[4]})`, + ` Spd: ${enemyPokemon.stats[5]} (${enemyPokemon.ivs[5]})`, + ]; + const moveset: string[] = []; + enemyPokemon.getMoveset().forEach((move) => { + moveset.push(move!.getName()); + }); + + console.log( + `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, + `| Species ID: ${enemyPokemon.species.speciesId}`, + `| Nature: ${Nature[enemyPokemon.getNature()]}`, + ); + console.log(`Stats (IVs): ${stats}`); + console.log( + `Ability: ${enemyPokemon.getAbility().name}`, + `| Passive Ability${enemyPokemon.isBoss() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, + `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}` + ); + console.log("Moveset:", moveset); return true; }); From 6a4c6f1c89e1383623cc504143ea46f3f85a1a06 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 21 Feb 2025 06:23:34 +0100 Subject: [PATCH 08/83] =?UTF-8?q?[UI/UX]=20Pok=C3=A9dex=20-=20Informative?= =?UTF-8?q?=20messages=20for=20level=20up=20moves=20#5388?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-page-ui-handler.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 8b5a5bd12f1..fa66a8bf65d 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -983,13 +983,23 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: this.levelMoves.map(m => { + const levelNumber = m[0] > 0 ? String(m[0]) : ""; const option: OptionSelectItem = { - label: String(m[0]).padEnd(4, " ") + allMoves[m[1]].name, + label: levelNumber.padEnd(4, " ") + allMoves[m[1]].name, handler: () => { return false; }, onHover: () => { this.moveInfoOverlay.show(allMoves[m[1]]); + if (m[0] === 0) { + this.showText(i18next.t("pokedexUiHandler:onlyEvolutionMove")); + } else if (m[0] === -1) { + this.showText(i18next.t("pokedexUiHandler:onlyRecallMove")); + } else if (m[0] <= 5) { + this.showText(i18next.t("pokedexUiHandler:onStarterSelectMove")); + } else { + this.showText(i18next.t("pokedexUiHandler:byLevelUpMove")); + } }, }; return option; From bec73fd8d300bab7ffa4211127704823a4f7573d Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 21 Feb 2025 17:50:44 +1100 Subject: [PATCH 09/83] [Bug][UI/UX] Remove redundant bgm bar (#5391) --- src/ui/pokedex-page-ui-handler.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index fa66a8bf65d..4d30609a020 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -45,7 +45,6 @@ import { EggSourceType } from "#enums/egg-source-types"; import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, rgbHexToRgba, toReadableString } from "#app/utils"; import type { Nature } from "#enums/nature"; -import BgmBar from "./bgm-bar"; import * as Utils from "../utils"; import { speciesTmMoves } from "#app/data/balance/tms"; import type { BiomeTierTod } from "#app/data/balance/biomes"; @@ -242,7 +241,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private menuContainer: Phaser.GameObjects.Container; private menuBg: Phaser.GameObjects.NineSlice; protected optionSelectText: Phaser.GameObjects.Text; - public bgmBar: BgmBar; private menuOptions: MenuOptions[]; protected scale: number = 0.1666666667; private menuDescriptions: string[]; @@ -480,10 +478,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.menuContainer.setName("menu"); this.menuContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); - this.bgmBar = new BgmBar(); - this.bgmBar.setup(); - ui.bgmBar = this.bgmBar; - this.menuContainer.add(this.bgmBar); this.menuContainer.setVisible(false); this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => parseInt(MenuOptions[m]) as MenuOptions); From 97aeceab58aad3a00fc010ab879f7aad68609db1 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 21 Feb 2025 09:26:50 +0100 Subject: [PATCH 10/83] =?UTF-8?q?[UI/UX]=20Pok=C3=A9dex=20-=20Move=20Pok?= =?UTF-8?q?=C3=A9dex=20option=20up=20the=20starter=20select=20screen=20men?= =?UTF-8?q?u=20#5376?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/starter-select-ui-handler.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index a102fc9dc08..80a2baf7f55 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1984,15 +1984,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { yOffset: 47 }); }; - if (!pokemonPrevolutions.hasOwnProperty(this.lastSpecies.speciesId)) { - options.push({ - label: i18next.t("starterSelectUiHandler:useCandies"), - handler: () => { - ui.setMode(Mode.STARTER_SELECT).then(() => showUseCandies()); - return true; - } - }); - } options.push({ label: i18next.t("menuUiHandler:POKEDEX"), handler: () => { @@ -2008,6 +1999,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return true; } }); + if (!pokemonPrevolutions.hasOwnProperty(this.lastSpecies.speciesId)) { + options.push({ + label: i18next.t("starterSelectUiHandler:useCandies"), + handler: () => { + ui.setMode(Mode.STARTER_SELECT).then(() => showUseCandies()); + return true; + } + }); + } options.push({ label: i18next.t("menu:cancel"), handler: () => { From e4ce822ce62df4ce93a0adc71edf26b498a0f6c1 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 21 Feb 2025 02:34:39 -0600 Subject: [PATCH 11/83] [Refactor] Remove Promises from moves and abilities (#5283) * Remove Promises from moves and abilities * Fix `PostSummonPhase` * Apply suggestions from Kev's review * More suggestions Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Cleaning up some updated functions * Remove Promise from `addEnemyModifier` + fixes to some extraneous `await`s * Test fixes * Fix missing import in revival blessing test Co-authored-by: innerthunder * Add back applyPreLeaveFieldAttrs Attribute was removed due to absence in a cherry-pick * Make applyPostApplyEffects work * Fix move-effect-phase.ts applications Some applyX methods were missed in the cherry pick commit and were still returning functions instead of running the function themselves * Mock `BattleScene.addPokemonIcon` in tests * Revival Blessing condition and tests * Incorporate Despair-Games/poketernity/pull/48 * Break up imports * Remove enemy modifier chance dead code * Remove async from applyAbAttrsInternal Stray async leftover from merge * Remove docs and comments referencing promises * Add `user.setTempAbility` to transform phase --------- Co-authored-by: innerthunder Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: PigeonBar <56974298+PigeonBar@users.noreply.github.com> --- src/battle-scene.ts | 2175 ++++++++++++----- src/data/ability.ts | 1050 ++++++-- src/data/move.ts | 658 +++-- .../the-winstrate-challenge-encounter.ts | 2 +- .../encounters/weird-dream-encounter.ts | 4 +- .../utils/encounter-pokemon-utils.ts | 4 +- src/field/pokemon.ts | 148 +- src/modifier/modifier.ts | 28 +- src/phases/add-enemy-buff-modifier-phase.ts | 3 +- src/phases/battle-end-phase.ts | 3 +- src/phases/game-over-modifier-reward-phase.ts | 22 +- src/phases/load-move-anim-phase.ts | 20 + src/phases/modifier-reward-phase.ts | 7 +- src/phases/move-anim-phase.ts | 20 + src/phases/move-charge-phase.ts | 7 +- src/phases/move-effect-phase.ts | 345 ++- src/phases/move-header-phase.ts | 5 +- src/phases/pokemon-transform-phase.ts | 77 + src/phases/post-summon-phase.ts | 10 +- src/phases/revival-blessing-phase.ts | 61 + src/phases/ribbon-modifier-reward-phase.ts | 21 +- src/phases/select-modifier-phase.ts | 35 +- src/test/abilities/unburden.test.ts | 2 +- src/test/moves/revival_blessing.test.ts | 117 + .../clowning-around-encounter.test.ts | 2 +- .../dancing-lessons-encounter.test.ts | 2 - .../encounters/delibirdy-encounter.test.ts | 30 +- .../global-trade-system-encounter.test.ts | 4 +- .../uncommon-breed-encounter.test.ts | 4 +- src/test/utils/gameWrapper.ts | 1 + src/test/utils/phaseInterceptor.ts | 18 +- 31 files changed, 3277 insertions(+), 1608 deletions(-) create mode 100644 src/phases/load-move-anim-phase.ts create mode 100644 src/phases/move-anim-phase.ts create mode 100644 src/phases/pokemon-transform-phase.ts create mode 100644 src/phases/revival-blessing-phase.ts create mode 100644 src/test/moves/revival_blessing.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index e6649d0999a..962b9c8ca91 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -8,10 +8,37 @@ import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; 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 } from "./modifier/modifier"; +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, +} from "./modifier/modifier"; import { PokeballType } from "#enums/pokeball"; -import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "#app/data/battle-anims"; +import { + initCommonAnims, + initMoveAnim, + loadCommonAnimAssets, + loadMoveAnimAssets, + populateAnims, +} from "#app/data/battle-anims"; import type { Phase } from "#app/phase"; import { initGameSpeed } from "#app/system/game-speed"; import { Arena, ArenaBase } from "#app/field/arena"; @@ -19,9 +46,29 @@ import { GameData } from "#app/system/game-data"; import { addTextObject, getTextColor, TextStyle } from "#app/ui/text"; import { allMoves } from "#app/data/move"; import { MusicPreference } from "#app/system/settings/settings"; -import { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getModifierType, getPartyLuckValue, ModifierPoolType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { + getDefaultModifierTypeForTier, + getEnemyModifierTypesForWave, + getLuckString, + getLuckTextTint, + getModifierPoolForType, + getModifierType, + getPartyLuckValue, + ModifierPoolType, + modifierTypes, + PokemonHeldItemModifierType, +} from "#app/modifier/modifier-type"; import AbilityBar from "#app/ui/ability-bar"; -import { allAbilities, applyAbAttrs, applyPostBattleInitAbAttrs, applyPostItemLostAbAttrs, BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, PostBattleInitAbAttr, PostItemLostAbAttr } from "#app/data/ability"; +import { + allAbilities, + applyAbAttrs, + applyPostBattleInitAbAttrs, + applyPostItemLostAbAttrs, + BlockItemTheftAbAttr, + DoubleBattleChanceAbAttr, + PostBattleInitAbAttr, + PostItemLostAbAttr, +} from "#app/data/ability"; import type { FixedBattleConfig } from "#app/battle"; import Battle, { BattleType } from "#app/battle"; import type { GameMode } from "#app/game-mode"; @@ -46,8 +93,16 @@ import type UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; import { addUiThemeOverrides } from "#app/ui/ui-theme"; import type PokemonData from "#app/system/pokemon-data"; import { Nature } from "#enums/nature"; -import type { SpeciesFormChange, SpeciesFormChangeTrigger } from "#app/data/pokemon-forms"; -import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger } from "#app/data/pokemon-forms"; +import type { + SpeciesFormChange, + SpeciesFormChangeTrigger, +} from "#app/data/pokemon-forms"; +import { + FormChangeItem, + pokemonFormChanges, + SpeciesFormChangeManualTrigger, + SpeciesFormChangeTimeOfDayTrigger, +} from "#app/data/pokemon-forms"; import { FormChangePhase } from "#app/phases/form-change-phase"; import { getTypeRgb } from "#app/data/type"; import { Type } from "#enums/type"; @@ -100,7 +155,14 @@ 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 } 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"; @@ -118,11 +180,11 @@ export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; const DEBUG_RNG = false; -const OPP_IVS_OVERRIDE_VALIDATED : number[] = ( - Array.isArray(Overrides.OPP_IVS_OVERRIDE) ? - Overrides.OPP_IVS_OVERRIDE : - new Array(6).fill(Overrides.OPP_IVS_OVERRIDE) -).map(iv => isNaN(iv) || iv === null || iv > 31 ? -1 : iv); +const OPP_IVS_OVERRIDE_VALIDATED: number[] = ( + Array.isArray(Overrides.OPP_IVS_OVERRIDE) + ? Overrides.OPP_IVS_OVERRIDE + : new Array(6).fill(Overrides.OPP_IVS_OVERRIDE) +).map((iv) => (isNaN(iv) || iv === null || iv > 31 ? -1 : iv)); export const startingWave = Overrides.STARTING_WAVE_OVERRIDE || 1; @@ -130,18 +192,21 @@ const expSpriteKeys: string[] = []; export let starterColors: StarterColors; interface StarterColors { - [key: string]: [string, string] + [key: string]: [string, string]; } export interface PokeballCounts { - [pb: string]: number; + [pb: string]: number; } -export type AnySound = Phaser.Sound.WebAudioSound | Phaser.Sound.HTML5AudioSound | Phaser.Sound.NoAudioSound; +export type AnySound = + | Phaser.Sound.WebAudioSound + | Phaser.Sound.HTML5AudioSound + | Phaser.Sound.NoAudioSound; export interface InfoToggle { - toggleInfo(force?: boolean): void; - isActive(): boolean; + toggleInfo(force?: boolean): void; + isActive(): boolean; } export default class BattleScene extends SceneBase { @@ -167,7 +232,8 @@ export default class BattleScene extends SceneBase { public showTimeOfDayWidget: boolean = true; public timeOfDayAnimation: EaseType = EaseType.NONE; public showLevelUpStats: boolean = true; - public enableTutorials: boolean = import.meta.env.VITE_BYPASS_TUTORIAL === "1"; + public enableTutorials: boolean = + import.meta.env.VITE_BYPASS_TUTORIAL === "1"; public enableMoveInfo: boolean = true; public enableRetries: boolean = false; public hideIvs: boolean = false; @@ -201,17 +267,17 @@ export default class BattleScene extends SceneBase { public eggSkipPreference: number = 0; /** - * Defines the experience gain display mode. - * - * @remarks - * The `expParty` can have several modes: - * - `0` - Default: The normal experience gain display, nothing changed. - * - `1` - Level Up Notification: Displays the level up in the small frame instead of a message. - * - `2` - Skip: No level up frame nor message. - * - * Modes `1` and `2` are still compatible with stats display, level up, new move, etc. - * @default 0 - Uses the default normal experience gain display. - */ + * Defines the experience gain display mode. + * + * @remarks + * The `expParty` can have several modes: + * - `0` - Default: The normal experience gain display, nothing changed. + * - `1` - Level Up Notification: Displays the level up in the small frame instead of a message. + * - `2` - Skip: No level up frame nor message. + * + * Modes `1` and `2` are still compatible with stats display, level up, new move, etc. + * @default 0 - Uses the default normal experience gain display. + */ public expParty: ExpNotification = 0; public hpBarSpeed: number = 0; public fusionPaletteSwaps: boolean = true; @@ -227,9 +293,9 @@ export default class BattleScene extends SceneBase { public battleStyle: number = BattleStyle.SWITCH; /** - * Defines whether or not to show type effectiveness hints - * - true: No hints - * - false: Show hints for moves + * Defines whether or not to show type effectiveness hints + * - true: No hints + * - false: Show hints for moves */ public typeHints: boolean = false; @@ -276,7 +342,8 @@ export default class BattleScene extends SceneBase { public pokemonInfoContainer: PokemonInfoContainer; private party: PlayerPokemon[]; /** Session save data that pertains to Mystery Encounters */ - public mysteryEncounterSaveData: MysteryEncounterSaveData = new MysteryEncounterSaveData(); + public mysteryEncounterSaveData: MysteryEncounterSaveData = + new MysteryEncounterSaveData(); /** If the previous wave was a MysteryEncounter, tracks the object with this variable. Mostly used for visual object cleanup */ public lastMysteryEncounter?: MysteryEncounter; /** Combined Biome and Wave count text */ @@ -292,7 +359,7 @@ export default class BattleScene extends SceneBase { private fieldOverlay: Phaser.GameObjects.Rectangle; private shopOverlay: Phaser.GameObjects.Rectangle; private shopOverlayShown: boolean = false; - private shopOverlayOpacity: number = .8; + private shopOverlayOpacity: number = 0.8; public modifiers: PersistentModifier[]; private enemyModifiers: PersistentModifier[]; @@ -358,19 +425,30 @@ export default class BattleScene extends SceneBase { if (variant) { atlasPath = atlasPath.replace("variant/", ""); } - this.load.atlas(key, `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.png`, `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.json`); + this.load.atlas( + key, + `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.png`, + `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.json`, + ); } /** * Load the variant assets for the given sprite and stores them in {@linkcode variantColorCache} */ - public async loadPokemonVariantAssets(spriteKey: string, fileRoot: string, variant?: Variant): Promise { - const useExpSprite = this.experimentalSprites && this.hasExpSprite(spriteKey); + public async loadPokemonVariantAssets( + spriteKey: string, + fileRoot: string, + variant?: Variant, + ): Promise { + const useExpSprite = + this.experimentalSprites && this.hasExpSprite(spriteKey); if (useExpSprite) { fileRoot = `exp/${fileRoot}`; } let variantConfig = variantData; - fileRoot.split("/").map((p) => (variantConfig ? (variantConfig = variantConfig[p]) : null)); + fileRoot + .split("/") + .map((p) => (variantConfig ? (variantConfig = variantConfig[p]) : null)); const variantSet = variantConfig as VariantSet; return new Promise((resolve) => { @@ -393,10 +471,20 @@ export default class BattleScene extends SceneBase { async preload() { if (DEBUG_RNG) { const originalRealInRange = Phaser.Math.RND.realInRange; - Phaser.Math.RND.realInRange = function (min: number, max: number): number { + Phaser.Math.RND.realInRange = function ( + min: number, + max: number, + ): number { const ret = originalRealInRange.apply(this, [ min, max ]); - const args = [ "RNG", ++this.rngCounter, ret / (max - min), `min: ${min} / max: ${max}` ]; - args.push(`seed: ${this.rngSeedOverride || this.waveSeed || this.seed}`); + const args = [ + "RNG", + ++this.rngCounter, + ret / (max - min), + `min: ${min} / max: ${max}`, + ]; + args.push( + `seed: ${this.rngSeedOverride || this.waveSeed || this.seed}`, + ); if (this.rngOffset) { args.push(`offset: ${this.rngOffset}`); } @@ -423,10 +511,16 @@ export default class BattleScene extends SceneBase { this.load.setBaseURL(); this.spritePipeline = new SpritePipeline(this.game); - (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add("Sprite", this.spritePipeline); + (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add( + "Sprite", + this.spritePipeline, + ); this.fieldSpritePipeline = new FieldSpritePipeline(this.game); - (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add("FieldSprite", this.fieldSpritePipeline); + (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add( + "FieldSprite", + this.fieldSpritePipeline, + ); this.launchBattle(); } @@ -441,7 +535,7 @@ export default class BattleScene extends SceneBase { this.arenaBgTransition = this.add.sprite(0, 0, "plains_bg"); this.arenaBgTransition.setName("sprite-arena-bg-transition"); - [ this.arenaBgTransition, this.arenaBg ].forEach(a => { + [ this.arenaBgTransition, this.arenaBg ].forEach((a) => { a.setPipeline(this.fieldSpritePipeline); a.setScale(6); a.setOrigin(0); @@ -461,13 +555,16 @@ export default class BattleScene extends SceneBase { this.fieldUI = fieldUI; - const transition = this.make.rexTransitionImagePack({ - x: 0, - y: 0, - scale: 6, - key: "loading_bg", - origin: { x: 0, y: 0 } - }, true); + const transition = this.make.rexTransitionImagePack( + { + x: 0, + y: 0, + scale: 6, + key: "loading_bg", + origin: { x: 0, y: 0 }, + }, + true, + ); //@ts-ignore (the defined types in the package are incromplete...) transition.transit({ @@ -489,14 +586,26 @@ export default class BattleScene extends SceneBase { this.uiContainer = uiContainer; const overlayWidth = this.game.canvas.width / 6; - const overlayHeight = (this.game.canvas.height / 6) - 48; - this.fieldOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x424242); + const overlayHeight = this.game.canvas.height / 6 - 48; + this.fieldOverlay = this.add.rectangle( + 0, + overlayHeight * -1 - 48, + overlayWidth, + overlayHeight, + 0x424242, + ); this.fieldOverlay.setName("rect-field-overlay"); this.fieldOverlay.setOrigin(0, 0); this.fieldOverlay.setAlpha(0); this.fieldUI.add(this.fieldOverlay); - this.shopOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x070707); + this.shopOverlay = this.add.rectangle( + 0, + overlayHeight * -1 - 48, + overlayWidth, + overlayHeight, + 0x070707, + ); this.shopOverlay.setName("rect-shop-overlay"); this.shopOverlay.setOrigin(0, 0); this.shopOverlay.setAlpha(0); @@ -547,28 +656,56 @@ export default class BattleScene extends SceneBase { this.candyBar.setup(); this.fieldUI.add(this.candyBar); - this.biomeWaveText = addTextObject((this.game.canvas.width / 6) - 2, 0, startingWave.toString(), TextStyle.BATTLE_INFO); + this.biomeWaveText = addTextObject( + this.game.canvas.width / 6 - 2, + 0, + startingWave.toString(), + TextStyle.BATTLE_INFO, + ); this.biomeWaveText.setName("text-biome-wave"); this.biomeWaveText.setOrigin(1, 0.5); this.fieldUI.add(this.biomeWaveText); - this.moneyText = addTextObject((this.game.canvas.width / 6) - 2, 0, "", TextStyle.MONEY); + this.moneyText = addTextObject( + this.game.canvas.width / 6 - 2, + 0, + "", + TextStyle.MONEY, + ); this.moneyText.setName("text-money"); this.moneyText.setOrigin(1, 0.5); this.fieldUI.add(this.moneyText); - this.scoreText = addTextObject((this.game.canvas.width / 6) - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); + this.scoreText = addTextObject( + this.game.canvas.width / 6 - 2, + 0, + "", + TextStyle.PARTY, + { fontSize: "54px" }, + ); this.scoreText.setName("text-score"); this.scoreText.setOrigin(1, 0.5); this.fieldUI.add(this.scoreText); - this.luckText = addTextObject((this.game.canvas.width / 6) - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); + this.luckText = addTextObject( + this.game.canvas.width / 6 - 2, + 0, + "", + TextStyle.PARTY, + { fontSize: "54px" }, + ); this.luckText.setName("text-luck"); this.luckText.setOrigin(1, 0.5); this.luckText.setVisible(false); this.fieldUI.add(this.luckText); - this.luckLabelText = addTextObject((this.game.canvas.width / 6) - 2, 0, i18next.t("common:luckIndicator"), TextStyle.PARTY, { fontSize: "54px" }); + this.luckLabelText = addTextObject( + this.game.canvas.width / 6 - 2, + 0, + i18next.t("common:luckIndicator"), + TextStyle.PARTY, + { fontSize: "54px" }, + ); this.luckLabelText.setName("text-luck-label"); this.luckLabelText.setOrigin(1, 0.5); this.luckLabelText.setVisible(false); @@ -576,7 +713,10 @@ export default class BattleScene extends SceneBase { this.arenaFlyout = new ArenaFlyout(); this.fieldUI.add(this.arenaFlyout); - this.fieldUI.moveBelow(this.arenaFlyout, this.fieldOverlay); + this.fieldUI.moveBelow( + this.arenaFlyout, + this.fieldOverlay, + ); this.updateUIPositions(); @@ -585,7 +725,10 @@ export default class BattleScene extends SceneBase { this.spriteSparkleHandler = new PokemonSpriteSparkleHandler(); this.spriteSparkleHandler.setup(); - this.pokemonInfoContainer = new PokemonInfoContainer((this.game.canvas.width / 6) + 52, -(this.game.canvas.height / 6) + 66); + this.pokemonInfoContainer = new PokemonInfoContainer( + this.game.canvas.width / 6 + 52, + -(this.game.canvas.height / 6) + 66, + ); this.pokemonInfoContainer.setup(); this.fieldUI.add(this.pokemonInfoContainer); @@ -607,14 +750,23 @@ export default class BattleScene extends SceneBase { this.arenaPlayerTransition.setVisible(false); this.arenaNextEnemy.setVisible(false); - [ this.arenaPlayer, this.arenaPlayerTransition, this.arenaEnemy, this.arenaNextEnemy ].forEach(a => { + [ + this.arenaPlayer, + this.arenaPlayerTransition, + this.arenaEnemy, + this.arenaNextEnemy, + ].forEach((a) => { if (a instanceof Phaser.GameObjects.Sprite) { a.setOrigin(0, 0); } field.add(a); }); - const trainer = this.addFieldSprite(0, 0, `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + const trainer = this.addFieldSprite( + 0, + 0, + `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); trainer.setOrigin(0.5, 1); trainer.setName("sprite-trainer"); @@ -627,16 +779,19 @@ export default class BattleScene extends SceneBase { frames: this.anims.generateFrameNumbers("prompt", { start: 1, end: 4 }), frameRate: 6, repeat: -1, - showOnStart: true + showOnStart: true, }); this.anims.create({ key: "tera_sparkle", - frames: this.anims.generateFrameNumbers("tera_sparkle", { start: 0, end: 12 }), + frames: this.anims.generateFrameNumbers("tera_sparkle", { + start: 0, + end: 12, + }), frameRate: 18, repeat: 0, showOnStart: true, - hideOnComplete: true + hideOnComplete: true, }); this.reset(false, false, true); @@ -648,13 +803,22 @@ export default class BattleScene extends SceneBase { ui.setup(); - const defaultMoves = [ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ]; + const defaultMoves = [ + Moves.TACKLE, + Moves.TAIL_WHIP, + Moves.FOCUS_ENERGY, + Moves.STRUGGLE, + ]; Promise.all([ Promise.all(loadPokemonAssets), initCommonAnims().then(() => loadCommonAnimAssets(true)), - Promise.all([ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map(m => initMoveAnim(m))).then(() => loadMoveAnimAssets(defaultMoves, true)), - this.initStarterColors() + Promise.all( + [ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map( + (m) => initMoveAnim(m), + ), + ).then(() => loadMoveAnimAssets(defaultMoves, true)), + this.initStarterColors(), ]).then(() => { this.pushPhase(new LoginPhase()); this.pushPhase(new TitlePhase()); @@ -688,7 +852,7 @@ export default class BattleScene extends SceneBase { if (this.lastSavePlayTime !== null) { this.lastSavePlayTime++; } - } + }, }); this.updateBiomeWaveText(); @@ -700,19 +864,22 @@ export default class BattleScene extends SceneBase { if (expSpriteKeys.length) { return; } - this.cachedFetch("./exp-sprites.json").then(res => res.json()).then(keys => { - if (Array.isArray(keys)) { - expSpriteKeys.push(...keys); - } - Promise.resolve(); - }); + this.cachedFetch("./exp-sprites.json") + .then((res) => res.json()) + .then((keys) => { + if (Array.isArray(keys)) { + expSpriteKeys.push(...keys); + } + Promise.resolve(); + }); } async initVariantData(): Promise { - Object.keys(variantData).forEach(key => delete variantData[key]); - await this.cachedFetch("./images/pokemon/variant/_masterlist.json").then(res => res.json()) - .then(v => { - Object.keys(v).forEach(k => variantData[k] = v[k]); + Object.keys(variantData).forEach((key) => delete variantData[key]); + await this.cachedFetch("./images/pokemon/variant/_masterlist.json") + .then((res) => res.json()) + .then((v) => { + Object.keys(v).forEach((k) => (variantData[k] = v[k])); if (this.experimentalSprites) { const expVariantData = variantData["exp"]; const traverseVariantData = (keys: string[]) => { @@ -722,7 +889,10 @@ export default class BattleScene extends SceneBase { if (i < keys.length - 1) { variantTree = variantTree[k]; expTree = expTree[k]; - } else if (variantTree.hasOwnProperty(k) && expTree.hasOwnProperty(k)) { + } else if ( + variantTree.hasOwnProperty(k) && + expTree.hasOwnProperty(k) + ) { if ([ "back", "female" ].includes(k)) { traverseVariantData(keys.concat(k)); } else { @@ -731,7 +901,9 @@ export default class BattleScene extends SceneBase { } }); }; - Object.keys(expVariantData).forEach(ek => traverseVariantData([ ek ])); + Object.keys(expVariantData).forEach((ek) => + traverseVariantData([ ek ]), + ); } Promise.resolve(); }); @@ -749,18 +921,20 @@ export default class BattleScene extends SceneBase { } initStarterColors(): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { if (starterColors) { return resolve(); } - this.cachedFetch("./starter-colors.json").then(res => res.json()).then(sc => { - starterColors = {}; - Object.keys(sc).forEach(key => { - starterColors[key] = sc[key]; - }); + this.cachedFetch("./starter-colors.json") + .then((res) => res.json()) + .then((sc) => { + starterColors = {}; + Object.keys(sc).forEach((key) => { + starterColors[key] = sc[key]; + }); - /*const loadPokemonAssets: Promise[] = []; + /*const loadPokemonAssets: Promise[] = []; for (let s of Object.keys(speciesStarters)) { const species = getPokemonSpecies(parseInt(s)); @@ -782,13 +956,16 @@ export default class BattleScene extends SceneBase { resolve(); });*/ - resolve(); - }); + resolve(); + }); }); } hasExpSprite(key: string): boolean { - const keyMatch = /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(\-.*?)?(?:_[1-3])?$/g.exec(key); + const keyMatch = + /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(\-.*?)?(?:_[1-3])?$/g.exec( + key, + ); if (!keyMatch) { return false; } @@ -821,7 +998,7 @@ export default class BattleScene extends SceneBase { * that are {@linkcode Pokemon.isAllowedInBattle | allowed in battle}. */ public getPokemonAllowedInBattle(): PlayerPokemon[] { - return this.getPlayerParty().filter(p => p.isAllowedInBattle()); + return this.getPlayerParty().filter((p) => p.isAllowedInBattle()); } /** @@ -831,8 +1008,12 @@ export default class BattleScene extends SceneBase { * or `undefined` if there are no valid pokemon * @param includeSwitching Whether a pokemon that is currently switching out is valid, default `true` */ - public getPlayerPokemon(includeSwitching: boolean = true): PlayerPokemon | undefined { - return this.getPlayerField().find(p => p.isActive() && (includeSwitching || p.switchOutStatus === false)); + public getPlayerPokemon( + includeSwitching: boolean = true, + ): PlayerPokemon | undefined { + return this.getPlayerField().find( + (p) => p.isActive() && (includeSwitching || p.switchOutStatus === false), + ); } /** @@ -842,7 +1023,10 @@ export default class BattleScene extends SceneBase { */ public getPlayerField(): PlayerPokemon[] { const party = this.getPlayerParty(); - return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); + return party.slice( + 0, + Math.min(party.length, this.currentBattle?.double ? 2 : 1), + ); } public getEnemyParty(): EnemyPokemon[] { @@ -856,8 +1040,12 @@ export default class BattleScene extends SceneBase { * or `undefined` if there are no valid pokemon * @param includeSwitching Whether a pokemon that is currently switching out is valid, default `true` */ - public getEnemyPokemon(includeSwitching: boolean = true): EnemyPokemon | undefined { - return this.getEnemyField().find(p => p.isActive() && (includeSwitching || p.switchOutStatus === false)); + public getEnemyPokemon( + includeSwitching: boolean = true, + ): EnemyPokemon | undefined { + return this.getEnemyField().find( + (p) => p.isActive() && (includeSwitching || p.switchOutStatus === false), + ); } /** @@ -867,7 +1055,10 @@ export default class BattleScene extends SceneBase { */ public getEnemyField(): EnemyPokemon[] { const party = this.getEnemyParty(); - return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); + return party.slice( + 0, + Math.min(party.length, this.currentBattle?.double ? 2 : 1), + ); } /** @@ -882,9 +1073,7 @@ export default class BattleScene extends SceneBase { const enemyField = this.getEnemyField(); ret.splice(0, playerField.length, ...playerField); ret.splice(2, enemyField.length, ...enemyField); - return activeOnly - ? ret.filter(p => p?.isActive()) - : ret; + return activeOnly ? ret.filter((p) => p?.isActive()) : ret; } /** @@ -900,8 +1089,17 @@ export default class BattleScene extends SceneBase { if (allyPokemon?.isActive(true)) { let targetingMovePhase: MovePhase; do { - targetingMovePhase = this.findPhase(mp => mp instanceof MovePhase && mp.targets.length === 1 && mp.targets[0] === removedPokemon.getBattlerIndex() && mp.pokemon.isPlayer() !== allyPokemon.isPlayer()) as MovePhase; - if (targetingMovePhase && targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex()) { + targetingMovePhase = this.findPhase( + (mp) => + mp instanceof MovePhase && + mp.targets.length === 1 && + mp.targets[0] === removedPokemon.getBattlerIndex() && + mp.pokemon.isPlayer() !== allyPokemon.isPlayer(), + ) as MovePhase; + if ( + targetingMovePhase && + targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex() + ) { targetingMovePhase.targets[0] = allyPokemon.getBattlerIndex(); } } while (targetingMovePhase); @@ -924,16 +1122,46 @@ export default class BattleScene extends SceneBase { // return the stored info toggles; used by ui-inputs getInfoToggles(activeOnly: boolean = false): InfoToggle[] { - return activeOnly ? this.infoToggles.filter(t => t?.isActive()) : this.infoToggles; + return activeOnly + ? this.infoToggles.filter((t) => t?.isActive()) + : this.infoToggles; } getPokemonById(pokemonId: number): Pokemon | null { - const findInParty = (party: Pokemon[]) => party.find(p => p.id === pokemonId); - return (findInParty(this.getPlayerParty()) || findInParty(this.getEnemyParty())) ?? null; + const findInParty = (party: Pokemon[]) => + party.find((p) => p.id === pokemonId); + return ( + (findInParty(this.getPlayerParty()) || + findInParty(this.getEnemyParty())) ?? + null + ); } - addPlayerPokemon(species: PokemonSpecies, level: number, abilityIndex?: number, formIndex?: number, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: number[], nature?: Nature, dataSource?: Pokemon | PokemonData, postProcess?: (playerPokemon: PlayerPokemon) => void): PlayerPokemon { - const pokemon = new PlayerPokemon(species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); + addPlayerPokemon( + species: PokemonSpecies, + level: number, + abilityIndex?: number, + formIndex?: number, + gender?: Gender, + shiny?: boolean, + variant?: Variant, + ivs?: number[], + nature?: Nature, + dataSource?: Pokemon | PokemonData, + postProcess?: (playerPokemon: PlayerPokemon) => void, + ): PlayerPokemon { + const pokemon = new PlayerPokemon( + species, + level, + abilityIndex, + formIndex, + gender, + shiny, + variant, + ivs, + nature, + dataSource, + ); if (postProcess) { postProcess(pokemon); } @@ -941,17 +1169,37 @@ export default class BattleScene extends SceneBase { return pokemon; } - addEnemyPokemon(species: PokemonSpecies, level: number, trainerSlot: TrainerSlot, boss: boolean = false, shinyLock: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon { + addEnemyPokemon( + species: PokemonSpecies, + level: number, + trainerSlot: TrainerSlot, + boss: boolean = false, + shinyLock: boolean = false, + dataSource?: PokemonData, + postProcess?: (enemyPokemon: EnemyPokemon) => void, + ): EnemyPokemon { if (Overrides.OPP_LEVEL_OVERRIDE > 0) { level = Overrides.OPP_LEVEL_OVERRIDE; } if (Overrides.OPP_SPECIES_OVERRIDE) { species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE); // The fact that a Pokemon is a boss or not can change based on its Species and level - boss = this.getEncounterBossSegments(this.currentBattle.waveIndex, level, species) > 1; + boss = + this.getEncounterBossSegments( + this.currentBattle.waveIndex, + level, + species, + ) > 1; } - const pokemon = new EnemyPokemon(species, level, trainerSlot, boss, shinyLock, dataSource); + const pokemon = new EnemyPokemon( + species, + level, + trainerSlot, + boss, + shinyLock, + dataSource, + ); if (Overrides.OPP_FUSION_OVERRIDE) { pokemon.generateFusionSpecies(); } @@ -960,7 +1208,13 @@ export default class BattleScene extends SceneBase { const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967296)); for (let s = 0; s < pokemon.ivs.length; s++) { - pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75)); + pokemon.ivs[s] = Math.round( + Phaser.Math.Linear( + Math.min(pokemon.ivs[s], secondaryIvs[s]), + Math.max(pokemon.ivs[s], secondaryIvs[s]), + 0.75, + ), + ); } } if (postProcess) { @@ -983,7 +1237,10 @@ export default class BattleScene extends SceneBase { * @param pokemon * @param destroy Default true. If true, will destroy the {@linkcode PlayerPokemon} after removing */ - removePokemonFromPlayerParty(pokemon: PlayerPokemon, destroy: boolean = true) { + removePokemonFromPlayerParty( + pokemon: PlayerPokemon, + destroy: boolean = true, + ) { if (!pokemon) { return; } @@ -997,7 +1254,14 @@ export default class BattleScene extends SceneBase { this.updateModifiers(true); } - addPokemonIcon(pokemon: Pokemon, x: number, y: number, originX: number = 0.5, originY: number = 0.5, ignoreOverride: boolean = false): Phaser.GameObjects.Container { + addPokemonIcon( + pokemon: Pokemon, + x: number, + y: number, + originX: number = 0.5, + originY: number = 0.5, + ignoreOverride: boolean = false, + ): Phaser.GameObjects.Container { const container = this.add.container(x, y); container.setName(`${pokemon.name}-icon`); @@ -1006,7 +1270,9 @@ export default class BattleScene extends SceneBase { icon.setFrame(pokemon.getIconId(true)); // Temporary fix to show pokemon's default icon if variant icon doesn't exist if (icon.frame.name !== pokemon.getIconId(true)) { - console.log(`${pokemon.name}'s variant icon does not exist. Replacing with default.`); + console.log( + `${pokemon.name}'s variant icon does not exist. Replacing with default.`, + ); const temp = pokemon.shiny; pokemon.shiny = false; icon.setTexture(pokemon.getIconAtlasKey(ignoreOverride)); @@ -1018,7 +1284,11 @@ export default class BattleScene extends SceneBase { container.add(icon); if (pokemon.isFusion()) { - const fusionIcon = this.add.sprite(0, 0, pokemon.getFusionIconAtlasKey(ignoreOverride)); + const fusionIcon = this.add.sprite( + 0, + 0, + pokemon.getFusionIconAtlasKey(ignoreOverride), + ); fusionIcon.setName("sprite-fusion-icon"); fusionIcon.setOrigin(0.5, 0); fusionIcon.setFrame(pokemon.getFusionIconId(true)); @@ -1027,13 +1297,24 @@ export default class BattleScene extends SceneBase { const originalHeight = icon.height; const originalFrame = icon.frame; - const iconHeight = (icon.frame.cutHeight <= fusionIcon.frame.cutHeight ? Math.ceil : Math.floor)((icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4); + const iconHeight = ( + icon.frame.cutHeight <= fusionIcon.frame.cutHeight + ? Math.ceil + : Math.floor + )((icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4); // Inefficient, but for some reason didn't work with only the unique properties as part of the name const iconFrameId = `${icon.frame.name}f${fusionIcon.frame.name}`; if (!icon.frame.texture.has(iconFrameId)) { - icon.frame.texture.add(iconFrameId, icon.frame.sourceIndex, icon.frame.cutX, icon.frame.cutY, icon.frame.cutWidth, iconHeight); + icon.frame.texture.add( + iconFrameId, + icon.frame.sourceIndex, + icon.frame.cutX, + icon.frame.cutY, + icon.frame.cutWidth, + iconHeight, + ); } icon.setFrame(iconFrameId); @@ -1043,13 +1324,21 @@ export default class BattleScene extends SceneBase { const originalFusionFrame = fusionIcon.frame; const fusionIconY = fusionIcon.frame.cutY + icon.frame.cutHeight; - const fusionIconHeight = fusionIcon.frame.cutHeight - icon.frame.cutHeight; + const fusionIconHeight = + fusionIcon.frame.cutHeight - icon.frame.cutHeight; // Inefficient, but for some reason didn't work with only the unique properties as part of the name const fusionIconFrameId = `${fusionIcon.frame.name}f${icon.frame.name}`; if (!fusionIcon.frame.texture.has(fusionIconFrameId)) { - fusionIcon.frame.texture.add(fusionIconFrameId, fusionIcon.frame.sourceIndex, fusionIcon.frame.cutX, fusionIconY, fusionIcon.frame.cutWidth, fusionIconHeight); + fusionIcon.frame.texture.add( + fusionIconFrameId, + fusionIcon.frame.sourceIndex, + fusionIcon.frame.cutX, + fusionIconY, + fusionIcon.frame.cutWidth, + fusionIconHeight, + ); } fusionIcon.setFrame(fusionIconFrameId); @@ -1062,7 +1351,7 @@ export default class BattleScene extends SceneBase { container.x -= originalWidth * (originX - 0.5); } if (originY !== 0) { - container.y -= (originalHeight) * originY; + container.y -= originalHeight * originY; } } else { if (originX !== 0.5) { @@ -1097,7 +1386,11 @@ export default class BattleScene extends SceneBase { return this.currentBattle?.randSeedInt(range, min); } - reset(clearScene: boolean = false, clearData: boolean = false, reloadI18n: boolean = false): void { + reset( + clearScene: boolean = false, + clearData: boolean = false, + reloadI18n: boolean = false, + ): void { if (clearData) { this.gameData = new GameData(); } @@ -1111,7 +1404,11 @@ export default class BattleScene extends SceneBase { this.lockModifierTiers = false; - this.pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ])); + this.pokeballCounts = Object.fromEntries( + Utils.getEnumValues(PokeballType) + .filter((p) => p <= PokeballType.MASTER_BALL) + .map((t) => [ t, 0 ]), + ); this.pokeballCounts[PokeballType.POKEBALL] += 5; if (Overrides.POKEBALL_OVERRIDE.active) { this.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs; @@ -1132,7 +1429,10 @@ export default class BattleScene extends SceneBase { // If this is a ME, clear any residual visual sprites before reloading if (this.currentBattle?.mysteryEncounter?.introVisuals) { - this.field.remove(this.currentBattle.mysteryEncounter?.introVisuals, true); + this.field.remove( + this.currentBattle.mysteryEncounter?.introVisuals, + true, + ); } //@ts-ignore - allowing `null` for currentBattle causes a lot of trouble @@ -1153,7 +1453,7 @@ export default class BattleScene extends SceneBase { this.updateScoreText(); this.scoreText.setVisible(false); - [ this.luckLabelText, this.luckText ].map(t => t.setVisible(false)); + [ this.luckLabelText, this.luckText ].map((t) => t.setVisible(false)); this.newArena(Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN); @@ -1162,12 +1462,16 @@ export default class BattleScene extends SceneBase { this.arenaBgTransition.setPosition(0, 0); this.arenaPlayer.setPosition(300, 0); this.arenaPlayerTransition.setPosition(0, 0); - [ this.arenaEnemy, this.arenaNextEnemy ].forEach(a => a.setPosition(-280, 0)); + [ this.arenaEnemy, this.arenaNextEnemy ].forEach((a) => + a.setPosition(-280, 0), + ); this.arenaNextEnemy.setVisible(false); this.arena.init(); - this.trainer.setTexture(`trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + this.trainer.setTexture( + `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); this.trainer.setPosition(406, 186); this.trainer.setVisible(true); @@ -1180,7 +1484,16 @@ export default class BattleScene extends SceneBase { ...allSpecies, ...allMoves, ...allAbilities, - ...Utils.getEnumValues(ModifierPoolType).map(mpt => getModifierPoolForType(mpt)).map(mp => Object.values(mp).flat().map(mt => mt.modifierType).filter(mt => "localize" in mt).map(lpb => lpb as unknown as Localizable)).flat() + ...Utils.getEnumValues(ModifierPoolType) + .map((mpt) => getModifierPoolForType(mpt)) + .map((mp) => + Object.values(mp) + .flat() + .map((mt) => mt.modifierType) + .filter((mt) => "localize" in mt) + .map((lpb) => lpb as unknown as Localizable), + ) + .flat(), ]; for (const item of localizable) { item.localize(); @@ -1206,21 +1519,32 @@ export default class BattleScene extends SceneBase { this.children.removeAll(true); this.game.domContainer.innerHTML = ""; this.launchBattle(); - } + }, }); } } getDoubleBattleChance(newWaveIndex: number, playerField: PlayerPokemon[]) { - const doubleChance = new Utils.NumberHolder(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)); + playerField.forEach((p) => + applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance), + ); return Math.max(doubleChance.value, 1); } - newBattle(waveIndex?: number, battleType?: BattleType, trainerData?: TrainerData, double?: boolean, mysteryEncounterType?: MysteryEncounterType): Battle | null { + newBattle( + waveIndex?: number, + battleType?: BattleType, + trainerData?: TrainerData, + double?: boolean, + mysteryEncounterType?: MysteryEncounterType, + ): Battle | null { const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave; - const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (_startingWave - 1)) + 1); + const newWaveIndex = + waveIndex || (this.currentBattle?.waveIndex || _startingWave - 1) + 1; let newDouble: boolean | undefined; let newBattleType: BattleType; let newTrainer: Trainer | undefined; @@ -1231,11 +1555,17 @@ export default class BattleScene extends SceneBase { const playerField = this.getPlayerField(); - if (this.gameMode.isFixedBattle(newWaveIndex) && trainerData === undefined) { + if ( + this.gameMode.isFixedBattle(newWaveIndex) && + trainerData === undefined + ) { battleConfig = this.gameMode.getFixedBattle(newWaveIndex); newDouble = battleConfig.double; newBattleType = battleConfig.battleType; - this.executeWithSeedOffset(() => newTrainer = battleConfig?.getTrainer(), (battleConfig.seedOffsetWaveIndex || newWaveIndex) << 8); + this.executeWithSeedOffset( + () => (newTrainer = battleConfig?.getTrainer()), + (battleConfig.seedOffsetWaveIndex || newWaveIndex) << 8, + ); if (newTrainer) { this.field.add(newTrainer); } @@ -1243,7 +1573,9 @@ export default class BattleScene extends SceneBase { if (!this.gameMode.hasTrainers) { newBattleType = BattleType.WILD; } else if (battleType === undefined) { - newBattleType = this.gameMode.isWaveTrainer(newWaveIndex, this.arena) ? BattleType.TRAINER : BattleType.WILD; + newBattleType = this.gameMode.isWaveTrainer(newWaveIndex, this.arena) + ? BattleType.TRAINER + : BattleType.WILD; } else { newBattleType = battleType; } @@ -1254,29 +1586,50 @@ export default class BattleScene extends SceneBase { if (trainerConfigs[trainerType].doubleOnly) { doubleTrainer = true; } else if (trainerConfigs[trainerType].hasDouble) { - doubleTrainer = !Utils.randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField)); + doubleTrainer = !Utils.randSeedInt( + this.getDoubleBattleChance(newWaveIndex, playerField), + ); // Add a check that special trainers can't be double except for tate and liza - they should use the normal double chance - if (trainerConfigs[trainerType].trainerTypeDouble && ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType)) { + if ( + trainerConfigs[trainerType].trainerTypeDouble && + ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType) + ) { doubleTrainer = false; } } - const variant = doubleTrainer ? TrainerVariant.DOUBLE : (Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); - newTrainer = trainerData !== undefined ? trainerData.toTrainer() : new Trainer(trainerType, variant); + const variant = doubleTrainer + ? TrainerVariant.DOUBLE + : Utils.randSeedInt(2) + ? TrainerVariant.FEMALE + : TrainerVariant.DEFAULT; + newTrainer = + trainerData !== undefined + ? trainerData.toTrainer() + : new Trainer(trainerType, variant); this.field.add(newTrainer); } // Check for mystery encounter // Can only occur in place of a standard (non-boss) wild battle, waves 10-180 - if (this.isWaveMysteryEncounter(newBattleType, newWaveIndex) || newBattleType === BattleType.MYSTERY_ENCOUNTER) { + if ( + this.isWaveMysteryEncounter(newBattleType, newWaveIndex) || + newBattleType === BattleType.MYSTERY_ENCOUNTER + ) { newBattleType = BattleType.MYSTERY_ENCOUNTER; // Reset to base spawn weight - this.mysteryEncounterSaveData.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; + this.mysteryEncounterSaveData.encounterSpawnChance = + BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; } } if (double === undefined && newWaveIndex > 1) { - if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) { - newDouble = !Utils.randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField)); + if ( + newBattleType === BattleType.WILD && + !this.gameMode.isWaveFinal(newWaveIndex) + ) { + newDouble = !Utils.randSeedInt( + this.getDoubleBattleChance(newWaveIndex, playerField), + ); } else if (newBattleType === BattleType.TRAINER) { newDouble = newTrainer?.variant === TrainerVariant.DOUBLE; } @@ -1300,10 +1653,10 @@ export default class BattleScene extends SceneBase { doubleOverrideForWave = "single"; break; case "even-doubles": - doubleOverrideForWave = (newWaveIndex % 2) ? "single" : "double"; + doubleOverrideForWave = newWaveIndex % 2 ? "single" : "double"; break; case "odd-doubles": - doubleOverrideForWave = (newWaveIndex % 2) ? "double" : "single"; + doubleOverrideForWave = newWaveIndex % 2 ? "double" : "single"; break; } @@ -1314,7 +1667,10 @@ export default class BattleScene extends SceneBase { * Override battles into single only if not fighting with trainers. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/1948 | GitHub Issue #1948} */ - if (newBattleType !== BattleType.TRAINER && doubleOverrideForWave === "single") { + if ( + newBattleType !== BattleType.TRAINER && + doubleOverrideForWave === "single" + ) { newDouble = false; } } @@ -1332,13 +1688,25 @@ export default class BattleScene extends SceneBase { } if (lastBattle?.double && !newDouble) { - this.tryRemovePhase(p => p instanceof SwitchPhase); - this.getPlayerField().forEach(p => p.lapseTag(BattlerTagType.COMMANDED)); + this.tryRemovePhase((p) => p instanceof SwitchPhase); + this.getPlayerField().forEach((p) => + p.lapseTag(BattlerTagType.COMMANDED), + ); } - this.executeWithSeedOffset(() => { - this.currentBattle = new Battle(this.gameMode, newWaveIndex, newBattleType, newTrainer, newDouble); - }, newWaveIndex << 3, this.waveSeed); + this.executeWithSeedOffset( + () => { + this.currentBattle = new Battle( + this.gameMode, + newWaveIndex, + newBattleType, + newTrainer, + newDouble, + ); + }, + newWaveIndex << 3, + this.waveSeed, + ); this.currentBattle.incrementTurn(); if (newBattleType === BattleType.MYSTERY_ENCOUNTER) { @@ -1350,20 +1718,33 @@ export default class BattleScene extends SceneBase { if (!waveIndex && lastBattle) { const isWaveIndexMultipleOfTen = !(lastBattle.waveIndex % 10); - const isEndlessOrDaily = this.gameMode.hasShortBiomes || this.gameMode.isDaily; - const isEndlessFifthWave = this.gameMode.hasShortBiomes && (lastBattle.waveIndex % 5) === 0; - const isWaveIndexMultipleOfFiftyMinusOne = (lastBattle.waveIndex % 50) === 49; - const isNewBiome = isWaveIndexMultipleOfTen || isEndlessFifthWave || (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne); - const resetArenaState = isNewBiome || [ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes(this.currentBattle.battleType) || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; - this.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy()); + const isEndlessOrDaily = + this.gameMode.hasShortBiomes || this.gameMode.isDaily; + const isEndlessFifthWave = + this.gameMode.hasShortBiomes && lastBattle.waveIndex % 5 === 0; + const isWaveIndexMultipleOfFiftyMinusOne = + lastBattle.waveIndex % 50 === 49; + const isNewBiome = + isWaveIndexMultipleOfTen || + isEndlessFifthWave || + (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne); + const resetArenaState = + isNewBiome || + [ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes( + this.currentBattle.battleType, + ) || + this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; + this.getEnemyParty().forEach((enemyPokemon) => enemyPokemon.destroy()); this.trySpreadPokerus(); - if (!isNewBiome && (newWaveIndex % 10) === 5) { + if (!isNewBiome && newWaveIndex % 10 === 5) { this.arena.updatePoolsForTimeOfDay(); } if (resetArenaState) { this.arena.resetArenaEffects(); - playerField.forEach((pokemon) => pokemon.lapseTag(BattlerTagType.COMMANDED)); + playerField.forEach((pokemon) => + pokemon.lapseTag(BattlerTagType.COMMANDED), + ); playerField.forEach((pokemon, p) => { if (pokemon.isOnField()) { @@ -1375,7 +1756,12 @@ export default class BattleScene extends SceneBase { pokemon.resetBattleData(); pokemon.resetTera(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); - if (pokemon.hasSpecies(Species.TERAPAGOS) || (this.gameMode.isClassic && this.currentBattle.waveIndex > 180 && this.currentBattle.waveIndex <= 190)) { + if ( + pokemon.hasSpecies(Species.TERAPAGOS) || + (this.gameMode.isClassic && + this.currentBattle.waveIndex > 180 && + this.currentBattle.waveIndex <= 190) + ) { this.arena.playerTerasUsed = 0; } } @@ -1386,7 +1772,10 @@ export default class BattleScene extends SceneBase { } for (const pokemon of this.getPlayerParty()) { - this.triggerPokemonFormChange(pokemon, SpeciesFormChangeTimeOfDayTrigger); + this.triggerPokemonFormChange( + pokemon, + SpeciesFormChangeTimeOfDayTrigger, + ); } if (!this.gameMode.hasRandomBiomes && !isNewBiome) { @@ -1409,23 +1798,35 @@ export default class BattleScene extends SceneBase { this.arena = new Arena(biome, Biome[biome].toLowerCase(), playerFaints); this.eventTarget.dispatchEvent(new NewArenaEvent()); - this.arenaBg.pipelineData = { terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome() }; + this.arenaBg.pipelineData = { + terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome(), + }; return this.arena; } updateFieldScale(): Promise { - return new Promise(resolve => { - const fieldScale = Math.floor(Math.pow(1 / this.getField(true) - .map(p => p.getSpriteScale()) - .reduce((highestScale: number, scale: number) => highestScale = Math.max(scale, highestScale), 0), 0.7) * 40 - ) / 40; + return new Promise((resolve) => { + const fieldScale = + Math.floor( + Math.pow( + 1 / + this.getField(true) + .map((p) => p.getSpriteScale()) + .reduce( + (highestScale: number, scale: number) => + (highestScale = Math.max(scale, highestScale)), + 0, + ), + 0.7, + ) * 40, + ) / 40; this.setFieldScale(fieldScale).then(() => resolve()); }); } setFieldScale(scale: number, instant: boolean = false): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { scale *= 6; if (this.field.scale === scale) { return resolve(); @@ -1441,19 +1842,28 @@ export default class BattleScene extends SceneBase { scale: scale, x: (defaultWidth - scaledWidth) / 2, y: defaultHeight - scaledHeight, - duration: !instant ? Utils.fixedInt(Math.abs(this.field.scale - scale) * 200) : 0, + duration: !instant + ? Utils.fixedInt(Math.abs(this.field.scale - scale) * 200) + : 0, ease: "Sine.easeInOut", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } - getSpeciesFormIndex(species: PokemonSpecies, gender?: Gender, nature?: Nature, ignoreArena?: boolean): number { + getSpeciesFormIndex( + species: PokemonSpecies, + gender?: Gender, + nature?: Nature, + ignoreArena?: boolean, + ): number { if (!species.forms?.length) { return 0; } - const isEggPhase: boolean = [ "EggLapsePhase", "EggHatchPhase" ].includes(this.getCurrentPhase()?.constructor.name ?? ""); + const isEggPhase: boolean = [ "EggLapsePhase", "EggHatchPhase" ].includes( + this.getCurrentPhase()?.constructor.name ?? "", + ); switch (species.speciesId) { case Species.UNOWN: @@ -1481,12 +1891,19 @@ export default class BattleScene extends SceneBase { case Species.PALDEA_TAUROS: return Utils.randSeedInt(species.forms.length); case Species.PIKACHU: - if (this.currentBattle?.battleType === BattleType.TRAINER && this.currentBattle?.waveIndex < 30) { + if ( + this.currentBattle?.battleType === BattleType.TRAINER && + this.currentBattle?.waveIndex < 30 + ) { return 0; // Ban Cosplay and Partner Pika from Trainers before wave 30 } return Utils.randSeedInt(8); case Species.EEVEE: - if (this.currentBattle?.battleType === BattleType.TRAINER && this.currentBattle?.waveIndex < 30 && !isEggPhase) { + if ( + this.currentBattle?.battleType === BattleType.TRAINER && + this.currentBattle?.waveIndex < 30 && + !isEggPhase + ) { return 0; // No Partner Eevee for Wave 12 Preschoolers } return Utils.randSeedInt(2); @@ -1509,13 +1926,26 @@ export default class BattleScene extends SceneBase { case Species.OINKOLOGNE: return gender === Gender.FEMALE ? 1 : 0; case Species.TOXTRICITY: - const lowkeyNatures = [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ]; + const lowkeyNatures = [ + Nature.LONELY, + Nature.BOLD, + Nature.RELAXED, + Nature.TIMID, + Nature.SERIOUS, + Nature.MODEST, + Nature.MILD, + Nature.QUIET, + Nature.BASHFUL, + Nature.CALM, + Nature.GENTLE, + Nature.CAREFUL, + ]; if (nature !== undefined && lowkeyNatures.indexOf(nature) > -1) { return 1; } return 0; case Species.GIMMIGHOUL: - // Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs + // Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs if (this.gameMode.hasMysteryEncounters && !isEggPhase) { return 1; // Wandering form } else { @@ -1539,21 +1969,34 @@ export default class BattleScene extends SceneBase { private getGeneratedOffsetGym(): boolean { let ret = false; - this.executeWithSeedOffset(() => { - ret = !Utils.randSeedInt(2); - }, 0, this.seed.toString()); + this.executeWithSeedOffset( + () => { + ret = !Utils.randSeedInt(2); + }, + 0, + this.seed.toString(), + ); return ret; } private getGeneratedWaveCycleOffset(): number { let ret = 0; - this.executeWithSeedOffset(() => { - ret = Utils.randSeedInt(8) * 5; - }, 0, this.seed.toString()); + this.executeWithSeedOffset( + () => { + ret = Utils.randSeedInt(8) * 5; + }, + 0, + this.seed.toString(), + ); return ret; } - getEncounterBossSegments(waveIndex: number, level: number, species?: PokemonSpecies, forceBoss: boolean = false): number { + getEncounterBossSegments( + waveIndex: number, + level: number, + species?: PokemonSpecies, + forceBoss: boolean = false, + ): number { if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1) { return Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE; } else if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) { @@ -1566,11 +2009,19 @@ export default class BattleScene extends SceneBase { } let isBoss: boolean | undefined; - if (forceBoss || (species && (species.subLegendary || species.legendary || species.mythical))) { + if ( + forceBoss || + (species && + (species.subLegendary || species.legendary || species.mythical)) + ) { isBoss = true; } else { this.executeWithSeedOffset(() => { - isBoss = waveIndex % 10 === 0 || (this.gameMode.hasRandomBosses && Utils.randSeedInt(100) < Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); + isBoss = + waveIndex % 10 === 0 || + (this.gameMode.hasRandomBosses && + Utils.randSeedInt(100) < + Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); }, waveIndex << 2); } if (!isBoss) { @@ -1607,14 +2058,17 @@ export default class BattleScene extends SceneBase { return; } - this.executeWithSeedOffset(() => { - if (p) { - spread(p, -1); - } - if (p < party.length - 1) { - spread(p, 1); - } - }, this.currentBattle.waveIndex + (p << 8)); + this.executeWithSeedOffset( + () => { + if (p) { + spread(p, -1); + } + if (p < party.length - 1) { + spread(p, 1); + } + }, + this.currentBattle.waveIndex + (p << 8), + ); }); } @@ -1626,7 +2080,11 @@ export default class BattleScene extends SceneBase { this.rngCounter = 0; } - executeWithSeedOffset(func: Function, offset: number, seedOverride?: string): void { + executeWithSeedOffset( + func: Function, + offset: number, + seedOverride?: string, + ): void { if (!func) { return; } @@ -1634,7 +2092,9 @@ export default class BattleScene extends SceneBase { const tempRngOffset = this.rngOffset; const tempRngSeedOverride = this.rngSeedOverride; const state = Phaser.Math.RND.state(); - Phaser.Math.RND.sow([ Utils.shiftCharCodes(seedOverride || this.seed, offset) ]); + Phaser.Math.RND.sow([ + Utils.shiftCharCodes(seedOverride || this.seed, offset), + ]); this.rngCounter = 0; this.rngOffset = offset; this.rngSeedOverride = seedOverride || ""; @@ -1645,7 +2105,13 @@ export default class BattleScene extends SceneBase { this.rngSeedOverride = tempRngSeedOverride; } - addFieldSprite(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, terrainColorRatio: number = 0): Phaser.GameObjects.Sprite { + addFieldSprite( + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + terrainColorRatio: number = 0, + ): Phaser.GameObjects.Sprite { const ret = this.add.sprite(x, y, texture, frame); ret.setPipeline(this.fieldSpritePipeline); if (terrainColorRatio) { @@ -1655,14 +2121,33 @@ export default class BattleScene extends SceneBase { return ret; } - addPokemonSprite(pokemon: Pokemon, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { + addPokemonSprite( + pokemon: Pokemon, + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + hasShadow: boolean = false, + ignoreOverride: boolean = false, + ): Phaser.GameObjects.Sprite { const ret = this.addFieldSprite(x, y, texture, frame); this.initPokemonSprite(ret, pokemon, hasShadow, ignoreOverride); return ret; } - 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, isTerastallized: pokemon ? pokemon.isTerastallized : false }); + 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, + isTerastallized: pokemon ? pokemon.isTerastallized : false, + }); this.spriteSparkleHandler.add(sprite); return sprite; } @@ -1675,25 +2160,25 @@ export default class BattleScene extends SceneBase { } showFieldOverlay(duration: number): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { this.tweens.add({ targets: this.fieldOverlay, alpha: 0.5, ease: "Sine.easeOut", duration: duration, - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } hideFieldOverlay(duration: number): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { this.tweens.add({ targets: this.fieldOverlay, alpha: 0, duration: duration, ease: "Cubic.easeIn", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } @@ -1708,26 +2193,26 @@ export default class BattleScene extends SceneBase { showShopOverlay(duration: number): Promise { this.shopOverlayShown = true; - return new Promise(resolve => { + return new Promise((resolve) => { this.tweens.add({ targets: this.shopOverlay, alpha: this.shopOverlayOpacity, ease: "Sine.easeOut", duration, - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } hideShopOverlay(duration: number): Promise { this.shopOverlayShown = false; - return new Promise(resolve => { + return new Promise((resolve) => { this.tweens.add({ targets: this.shopOverlay, alpha: 0, duration: duration, ease: "Cubic.easeIn", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } @@ -1744,7 +2229,9 @@ export default class BattleScene extends SceneBase { const isBoss = !(this.currentBattle.waveIndex % 10); const biomeString: string = getBiomeName(this.arena.biomeType); this.fieldUI.moveAbove(this.biomeWaveText, this.luckText); - this.biomeWaveText.setText( biomeString + " - " + this.currentBattle.waveIndex.toString()); + this.biomeWaveText.setText( + biomeString + " - " + this.currentBattle.waveIndex.toString(), + ); this.biomeWaveText.setColor(!isBoss ? "#ffffff" : "#f89890"); this.biomeWaveText.setShadowColor(!isBoss ? "#636363" : "#984038"); this.biomeWaveText.setVisible(true); @@ -1755,7 +2242,9 @@ export default class BattleScene extends SceneBase { return; } const formattedMoney = Utils.formatMoney(this.moneyFormat, this.money); - this.moneyText.setText(i18next.t("battleScene:moneyOwned", { formattedMoney })); + this.moneyText.setText( + i18next.t("battleScene:moneyOwned", { formattedMoney }), + ); this.fieldUI.moveAbove(this.moneyText, this.luckText); if (forceVisible) { this.moneyText.setVisible(true); @@ -1774,7 +2263,8 @@ export default class BattleScene extends SceneBase { scale: this.moneyText.scale + deltaScale, loop: 0, yoyo: true, - onComplete: (_) => this.moneyText.setShadowColor(getTextColor(TextStyle.MONEY, true)), + onComplete: (_) => + this.moneyText.setShadowColor(getTextColor(TextStyle.MONEY, true)), }); } @@ -1789,7 +2279,7 @@ export default class BattleScene extends SceneBase { */ updateAndShowText(duration: number): void { const labels = [ this.luckLabelText, this.luckText ]; - labels.forEach(t => t.setAlpha(0)); + labels.forEach((t) => t.setAlpha(0)); const luckValue = getPartyLuckValue(this.getPlayerParty()); this.luckText.setText(getLuckString(luckValue)); if (luckValue < 14) { @@ -1797,14 +2287,16 @@ export default class BattleScene extends SceneBase { } else { this.luckText.setTint(0xffef5c, 0x47ff69, 0x6b6bff, 0xff6969); } - this.luckLabelText.setX((this.game.canvas.width / 6) - 2 - (this.luckText.displayWidth + 2)); + this.luckLabelText.setX( + this.game.canvas.width / 6 - 2 - (this.luckText.displayWidth + 2), + ); this.tweens.add({ targets: labels, duration: duration, alpha: 1, onComplete: () => { - labels.forEach(t => t.setVisible(true)); - } + labels.forEach((t) => t.setVisible(true)); + }, }); } @@ -1818,21 +2310,29 @@ export default class BattleScene extends SceneBase { duration: duration, alpha: 0, onComplete: () => { - labels.forEach(l => l.setVisible(false)); - } + labels.forEach((l) => l.setVisible(false)); + }, }); } updateUIPositions(): void { - const enemyModifierCount = this.enemyModifiers.filter(m => m.isIconVisible()).length; - const biomeWaveTextHeight = this.biomeWaveText.getBottomLeft().y - this.biomeWaveText.getTopLeft().y; + const enemyModifierCount = this.enemyModifiers.filter((m) => + m.isIconVisible(), + ).length; + const biomeWaveTextHeight = + this.biomeWaveText.getBottomLeft().y - this.biomeWaveText.getTopLeft().y; this.biomeWaveText.setY( - -(this.game.canvas.height / 6) + (enemyModifierCount ? enemyModifierCount <= 12 ? 15 : 24 : 0) + (biomeWaveTextHeight / 2) + -(this.game.canvas.height / 6) + + (enemyModifierCount ? (enemyModifierCount <= 12 ? 15 : 24) : 0) + + biomeWaveTextHeight / 2, ); this.moneyText.setY(this.biomeWaveText.y + 10); this.scoreText.setY(this.moneyText.y + 10); - [ this.luckLabelText, this.luckText ].map(l => l.setY((this.scoreText.visible ? this.scoreText : this.moneyText).y + 10)); - const offsetY = (this.scoreText.visible ? this.scoreText : this.moneyText).y + 15; + [ this.luckLabelText, this.luckText ].map((l) => + l.setY((this.scoreText.visible ? this.scoreText : this.moneyText).y + 10), + ); + const offsetY = + (this.scoreText.visible ? this.scoreText : this.moneyText).y + 15; this.partyExpBar.setY(offsetY); this.candyBar.setY(offsetY + 15); this.ui?.achvBar.setY(this.game.canvas.height / 6 + offsetY); @@ -1848,8 +2348,20 @@ export default class BattleScene extends SceneBase { } addFaintedEnemyScore(enemy: EnemyPokemon): void { - let scoreIncrease = enemy.getSpeciesForm().getBaseExp() * (enemy.level / this.getMaxExpLevel()) * ((enemy.ivs.reduce((iv: number, total: number) => total += iv, 0) / 93) * 0.2 + 0.8); - this.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemy.id, false).map(m => scoreIncrease *= (m as PokemonHeldItemModifier).getScoreMultiplier()); + let scoreIncrease = + enemy.getSpeciesForm().getBaseExp() * + (enemy.level / this.getMaxExpLevel()) * + ((enemy.ivs.reduce((iv: number, total: number) => (total += iv), 0) / + 93) * + 0.2 + + 0.8); + this.findModifiers( + (m) => m instanceof PokemonHeldItemModifier && m.pokemonId === enemy.id, + false, + ).map( + (m) => + (scoreIncrease *= (m as PokemonHeldItemModifier).getScoreMultiplier()), + ); if (enemy.isBoss()) { scoreIncrease *= Math.sqrt(enemy.bossSegments); } @@ -1864,35 +2376,68 @@ export default class BattleScene extends SceneBase { } const waveIndex = Math.ceil((this.currentBattle?.waveIndex || 1) / 10) * 10; const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(waveIndex); - const baseLevel = (1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2)) * 1.2; + const baseLevel = + (1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2)) * + 1.2; return Math.ceil(baseLevel / 2) * 2 + 2; } - randomSpecies(waveIndex: number, level: number, fromArenaPool?: boolean, speciesFilter?: PokemonSpeciesFilter, filterAllEvolutions?: boolean): PokemonSpecies { + randomSpecies( + waveIndex: number, + level: number, + fromArenaPool?: boolean, + speciesFilter?: PokemonSpeciesFilter, + filterAllEvolutions?: boolean, + ): PokemonSpecies { if (fromArenaPool) { - return this.arena.randomSpecies(waveIndex, level, undefined, getPartyLuckValue(this.party)); + return this.arena.randomSpecies( + waveIndex, + level, + undefined, + getPartyLuckValue(this.party), + ); } - const filteredSpecies = speciesFilter ? [ ...new Set(allSpecies.filter(s => s.isCatchable()).filter(speciesFilter).map(s => { - if (!filterAllEvolutions) { - while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) { - s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); - } - } - return s; - })) ] : allSpecies.filter(s => s.isCatchable()); + const filteredSpecies = speciesFilter + ? [ + ...new Set( + allSpecies + .filter((s) => s.isCatchable()) + .filter(speciesFilter) + .map((s) => { + if (!filterAllEvolutions) { + while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) { + s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); + } + } + return s; + }), + ), + ] + : allSpecies.filter((s) => s.isCatchable()); return filteredSpecies[Utils.randSeedInt(filteredSpecies.length)]; } generateRandomBiome(waveIndex: number): Biome { const relWave = waveIndex % 250; - const biomes = Utils.getEnumValues(Biome).filter(b => b !== Biome.TOWN && b !== Biome.END); + const biomes = Utils.getEnumValues(Biome).filter( + (b) => b !== Biome.TOWN && b !== Biome.END, + ); const maxDepth = biomeDepths[Biome.END][0] - 2; - const depthWeights = new Array(maxDepth + 1).fill(null) - .map((_, i: number) => ((1 - Math.min(Math.abs((i / (maxDepth - 1)) - (relWave / 250)) + 0.25, 1)) / 0.75) * 250); + const depthWeights = new Array(maxDepth + 1) + .fill(null) + .map( + (_, i: number) => + ((1 - + Math.min(Math.abs(i / (maxDepth - 1) - relWave / 250) + 0.25, 1)) / + 0.75) * + 250, + ); const biomeThresholds: number[] = []; let totalWeight = 0; for (const biome of biomes) { - totalWeight += Math.ceil(depthWeights[biomeDepths[biome][0] - 1] / biomeDepths[biome][1]); + totalWeight += Math.ceil( + depthWeights[biomeDepths[biome][0] - 1] / biomeDepths[biome][1], + ); biomeThresholds.push(totalWeight); } @@ -1918,7 +2463,7 @@ export default class BattleScene extends SceneBase { if (this.bgm && bgmName === this.bgm.key) { if (!this.bgm.isPlaying) { this.bgm.play({ - volume: this.masterVolume * this.bgmVolume + volume: this.masterVolume * this.bgmVolume, }); } return; @@ -1929,15 +2474,16 @@ export default class BattleScene extends SceneBase { this.bgmCache.add(bgmName); this.loadBgm(bgmName); let loopPoint = 0; - loopPoint = bgmName === this.arena.bgm - ? this.arena.getBgmLoopPoint() - : this.getBgmLoopPoint(bgmName); + loopPoint = + bgmName === this.arena.bgm + ? this.arena.getBgmLoopPoint() + : this.getBgmLoopPoint(bgmName); let loaded = false; const playNewBgm = () => { this.ui.bgmBar.setBgmToBgmBar(bgmName); if (bgmName === null && this.bgm && !this.bgm.pendingRemove) { this.bgm.play({ - volume: this.masterVolume * this.bgmVolume + volume: this.masterVolume * this.bgmVolume, }); return; } @@ -1946,7 +2492,7 @@ export default class BattleScene extends SceneBase { } this.bgm = this.sound.add(bgmName, { loop: true }); this.bgm.play({ - volume: this.masterVolume * this.bgmVolume + volume: this.masterVolume * this.bgmVolume, }); if (loopPoint) { this.bgm.on("looped", () => this.bgm.play({ seek: loopPoint })); @@ -1995,7 +2541,6 @@ export default class BattleScene extends SceneBase { } else { const soundDetails = sound.key.split("/"); switch (soundDetails[0]) { - case "battle_anims": case "cry": if (soundDetails[1].startsWith("PRSFX- ")) { @@ -2017,7 +2562,9 @@ export default class BattleScene extends SceneBase { if (!this.bgm) { return false; } - const bgm = this.sound.getAllPlaying().find(bgm => bgm.key === this.bgm.key); + const bgm = this.sound + .getAllPlaying() + .find((bgm) => bgm.key === this.bgm.key); if (bgm) { SoundFade.fadeOut(this, this.bgm, duration, destroy); return true; @@ -2032,7 +2579,11 @@ export default class BattleScene extends SceneBase { * @param destroy * @param delay */ - fadeAndSwitchBgm(newBgmKey: string, destroy: boolean = false, delay: number = 2000) { + fadeAndSwitchBgm( + newBgmKey: string, + destroy: boolean = false, + delay: number = 2000, + ) { this.fadeOutBgm(delay, destroy); this.time.delayedCall(delay, () => { this.playBgm(newBgmKey); @@ -2052,24 +2603,24 @@ export default class BattleScene extends SceneBase { case "heal": case "evolution": case "evolution_fanfare": - // These sounds are loaded in as BGM, but played as sound effects - // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() - config["volume"] *= (this.masterVolume * this.bgmVolume); + // These sounds are loaded in as BGM, but played as sound effects + // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() + config["volume"] *= this.masterVolume * this.bgmVolume; break; case "battle_anims": case "cry": - config["volume"] *= (this.masterVolume * this.fieldVolume); + config["volume"] *= this.masterVolume * this.fieldVolume; //PRSFX sound files are unusually loud if (keyDetails[1].startsWith("PRSFX- ")) { config["volume"] *= 0.5; } break; case "ui": - //As of, right now this applies to the "select", "menu_open", "error" sound effects - config["volume"] *= (this.masterVolume * this.uiVolume); + //As of, right now this applies to the "select", "menu_open", "error" sound effects + config["volume"] *= this.masterVolume * this.uiVolume; break; case "se": - config["volume"] *= (this.masterVolume * this.seVolume); + config["volume"] *= this.masterVolume * this.seVolume; break; } this.sound.play(key, config); @@ -2089,10 +2640,13 @@ export default class BattleScene extends SceneBase { this.bgmResumeTimer.destroy(); } if (resumeBgm) { - this.bgmResumeTimer = this.time.delayedCall((pauseDuration || Utils.fixedInt(sound.totalDuration * 1000)), () => { - this.resumeBgm(); - this.bgmResumeTimer = null; - }); + this.bgmResumeTimer = this.time.delayedCall( + pauseDuration || Utils.fixedInt(sound.totalDuration * 1000), + () => { + this.resumeBgm(); + this.bgmResumeTimer = null; + }, + ); } return sound; } @@ -2101,9 +2655,9 @@ export default class BattleScene extends SceneBase { getBgmLoopPoint(bgmName: string): number { switch (bgmName) { case "title": //Firel PokéRogue Title - return 46.500; + return 46.5; case "battle_kanto_champion": //B2W2 Kanto Champion Battle - return 13.950; + return 13.95; case "battle_johto_champion": //B2W2 Johto Champion Battle return 23.498; case "battle_hoenn_champion_g5": //B2W2 Hoenn Champion Battle @@ -2117,7 +2671,7 @@ export default class BattleScene extends SceneBase { case "battle_champion_iris": //B2W2 Unova Champion Battle return 10.145; case "battle_kalos_champion": //XY Kalos Champion Battle - return 10.380; + return 10.38; case "battle_champion_kukui": //SM Kukui Battle return 15.784; case "battle_alola_champion": //USUM Alola Champion Battle @@ -2133,17 +2687,17 @@ export default class BattleScene extends SceneBase { case "battle_champion_kieran": //SV Champion Kieran Battle return 7.206; case "battle_hoenn_elite": //ORAS Elite Four Battle - return 11.350; + return 11.35; case "battle_unova_elite": //BW Elite Four Battle - return 17.730; + return 17.73; case "battle_kalos_elite": //XY Elite Four Battle - return 12.340; + return 12.34; case "battle_alola_elite": //SM Elite Four Battle return 19.212; case "battle_galar_elite": //SWSH League Tournament Battle return 164.069; case "battle_paldea_elite": //SV Elite Four Battle - return 12.770; + return 12.77; case "battle_bb_elite": //SV BB League Elite Four Battle return 19.434; case "battle_final_encounter": //PMD RTDX Rayquaza's Domain @@ -2161,7 +2715,7 @@ export default class BattleScene extends SceneBase { case "battle_unova_gym": //BW Unova Gym Battle return 19.145; case "battle_kalos_gym": //XY Kalos Gym Battle - return 44.810; + return 44.81; case "battle_galar_gym": //SWSH Galar Gym Battle return 171.262; case "battle_paldea_gym": //SV Paldea Gym Battle @@ -2175,13 +2729,13 @@ export default class BattleScene extends SceneBase { case "battle_legendary_suicune": //HGSS Suicune Battle return 12.636; case "battle_legendary_lugia": //HGSS Lugia Battle - return 19.770; + return 19.77; case "battle_legendary_ho_oh": //HGSS Ho-oh Battle return 17.668; case "battle_legendary_regis_g5": //B2W2 Legendary Titan Battle - return 49.500; + return 49.5; case "battle_legendary_regis_g6": //ORAS Legendary Titan Battle - return 21.130; + return 21.13; case "battle_legendary_gro_kyo": //ORAS Groudon & Kyogre Battle return 10.547; case "battle_legendary_rayquaza": //ORAS Rayquaza Battle @@ -2191,7 +2745,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_lake_trio": //ORAS Lake Guardians Battle return 16.887; case "battle_legendary_sinnoh": //ORAS Sinnoh Legendary Battle - return 22.770; + return 22.77; case "battle_legendary_dia_pal": //ORAS Dialga & Palkia Battle return 16.009; case "battle_legendary_origin_forme": //LA Origin Dialga & Palkia Battle @@ -2209,7 +2763,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_xern_yvel": //XY Xerneas & Yveltal Battle return 26.468; case "battle_legendary_tapu": //SM Tapu Battle - return 0.000; + return 0.0; case "battle_legendary_sol_lun": //SM Solgaleo & Lunala Battle return 6.525; case "battle_legendary_ub": //SM Ultra Beast Battle @@ -2233,7 +2787,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_kor_mir": //SV Depths of Area Zero Battle return 6.442; case "battle_legendary_loyal_three": //SV Loyal Three Battle - return 6.500; + return 6.5; case "battle_legendary_ogerpon": //SV Ogerpon Battle return 14.335; case "battle_legendary_terapagos": //SV Terapagos Battle @@ -2241,7 +2795,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_pecharunt": //SV Pecharunt Battle return 6.508; case "battle_rival": //BW Rival Battle - return 14.110; + return 14.11; case "battle_rival_2": //BW N Battle return 17.714; case "battle_rival_3": //BW Final N Battle @@ -2251,7 +2805,7 @@ export default class BattleScene extends SceneBase { case "battle_wild": //BW Wild Battle return 12.703; case "battle_wild_strong": //BW Strong Wild Battle - return 13.940; + return 13.94; case "end_summit": //PMD RTDX Sky Tower Summit return 30.025; case "battle_rocket_grunt": //HGSS Team Rocket Battle @@ -2265,7 +2819,7 @@ export default class BattleScene extends SceneBase { case "battle_flare_grunt": //XY Team Flare Battle return 4.228; case "battle_aether_grunt": // SM Aether Foundation Battle - return 16.00; + return 16.0; case "battle_skull_grunt": // SM Team Skull Battle return 20.87; case "battle_macro_grunt": // SWSH Trainer Battle @@ -2279,7 +2833,7 @@ export default class BattleScene extends SceneBase { case "battle_skull_admin": //SM Team Skull Admin Battle return 15.463; case "battle_oleana": //SWSH Oleana Battle - return 14.110; + return 14.11; case "battle_star_admin": //SV Team Star Boss Battle return 9.493; case "battle_rocket_boss": //USUM Giovanni Battle @@ -2332,7 +2886,6 @@ export default class BattleScene extends SceneBase { return this.standbyPhase; } - /** * Adds a phase to the conditional queue and ensures it is executed only when the specified condition is met. * @@ -2364,7 +2917,11 @@ export default class BattleScene extends SceneBase { if (this.phaseQueuePrependSpliceIndex === -1) { this.phaseQueuePrepend.push(...phases); } else { - this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, ...phases); + this.phaseQueuePrepend.splice( + this.phaseQueuePrependSpliceIndex, + 0, + ...phases, + ); } } @@ -2437,7 +2994,10 @@ export default class BattleScene extends SceneBase { } if (this.currentPhase) { - console.log(`%cStart Phase ${this.currentPhase.constructor.name}`, "color:green;"); + console.log( + `%cStart Phase ${this.currentPhase.constructor.name}`, + "color:green;", + ); this.currentPhase.start(); } } @@ -2461,11 +3021,16 @@ export default class BattleScene extends SceneBase { * @param phaseFilter filter function to use to find the wanted phase * @returns the found phase or undefined if none found */ - findPhase

(phaseFilter: (phase: P) => boolean): P | undefined { + findPhase

( + phaseFilter: (phase: P) => boolean, + ): P | undefined { return this.phaseQueue.find(phaseFilter) as P; } - tryReplacePhase(phaseFilter: (phase: Phase) => boolean, phase: Phase): boolean { + tryReplacePhase( + phaseFilter: (phase: Phase) => boolean, + phase: Phase, + ): boolean { const phaseIndex = this.phaseQueue.findIndex(phaseFilter); if (phaseIndex > -1) { this.phaseQueue[phaseIndex] = phase; @@ -2502,11 +3067,16 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in phaseQueue * @returns boolean if a targetPhase was found and added */ - prependToPhase(phase: Phase | Phase [], targetPhase: Constructor): boolean { + prependToPhase( + phase: Phase | Phase[], + targetPhase: Constructor, + ): boolean { if (!Array.isArray(phase)) { phase = [ phase ]; } - const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); + const targetIndex = this.phaseQueue.findIndex( + (ph) => ph instanceof targetPhase, + ); if (targetIndex !== -1) { this.phaseQueue.splice(targetIndex, 0, ...phase); @@ -2523,11 +3093,16 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in {@linkcode phaseQueue} * @returns `true` if a `targetPhase` was found to append to */ - appendToPhase(phase: Phase | Phase[], targetPhase: Constructor): boolean { + appendToPhase( + phase: Phase | Phase[], + targetPhase: Constructor, + ): boolean { if (!Array.isArray(phase)) { phase = [ phase ]; } - const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); + const targetIndex = this.phaseQueue.findIndex( + (ph) => ph instanceof targetPhase, + ); if (targetIndex !== -1 && this.phaseQueue.length > targetIndex) { this.phaseQueue.splice(targetIndex + 1, 0, ...phase); @@ -2546,7 +3121,13 @@ export default class BattleScene extends SceneBase { * @param promptDelay optional param for MessagePhase constructor * @param defer boolean for which queue to add it to, false -> add to PhaseQueuePrepend, true -> nextCommandPhaseQueue */ - queueMessage(message: string, callbackDelay?: number | null, prompt?: boolean | null, promptDelay?: number | null, defer?: boolean | null) { + queueMessage( + message: string, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + defer?: boolean | null, + ) { const phase = new MessagePhase(message, callbackDelay, prompt, promptDelay); if (!defer) { // adds to the end of PhaseQueuePrepend @@ -2578,98 +3159,126 @@ export default class BattleScene extends SceneBase { getWaveMoneyAmount(moneyMultiplier: number): number { const waveIndex = this.currentBattle.waveIndex; const waveSetIndex = Math.ceil(waveIndex / 10) - 1; - const moneyValue = Math.pow((waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, 1 + 0.005 * waveSetIndex) * moneyMultiplier; + const moneyValue = + Math.pow( + (waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, + 1 + 0.005 * waveSetIndex, + ) * moneyMultiplier; return Math.floor(moneyValue / 10) * 10; } - addModifier(modifier: Modifier | null, ignoreUpdate?: boolean, playSound?: boolean, virtual?: boolean, instant?: boolean, cost?: number): Promise { + addModifier( + modifier: Modifier | null, + ignoreUpdate?: boolean, + playSound?: boolean, + virtual?: boolean, + instant?: boolean, + cost?: number, + ): boolean { if (!modifier) { - return Promise.resolve(false); + return false; } - return new Promise(resolve => { - let success = false; - const soundName = modifier.type.soundName; - this.validateAchvs(ModifierAchv, modifier); - const modifiersToRemove: PersistentModifier[] = []; - const modifierPromises: Promise[] = []; - if (modifier instanceof PersistentModifier) { - if ((modifier as PersistentModifier).add(this.modifiers, !!virtual)) { - if (modifier instanceof PokemonFormChangeItemModifier) { - const pokemon = this.getPokemonById(modifier.pokemonId); - if (pokemon) { - success = modifier.apply(pokemon, true); - } + let success = false; + const soundName = modifier.type.soundName; + this.validateAchvs(ModifierAchv, modifier); + const modifiersToRemove: PersistentModifier[] = []; + if (modifier instanceof PersistentModifier) { + if ((modifier as PersistentModifier).add(this.modifiers, !!virtual)) { + if (modifier instanceof PokemonFormChangeItemModifier) { + const pokemon = this.getPokemonById(modifier.pokemonId); + if (pokemon) { + success = modifier.apply(pokemon, true); } - if (playSound && !this.sound.get(soundName)) { - this.playSound(soundName); - } - } else if (!virtual) { - const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); - this.queueMessage(i18next.t("battle:itemStackFull", { fullItemName: modifier.type.name, itemName: defaultModifierType.name }), undefined, false, 3000); - return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success)); } - - for (const rm of modifiersToRemove) { - this.removeModifier(rm); - } - - if (!ignoreUpdate && !virtual) { - return this.updateModifiers(true, instant).then(() => resolve(success)); - } - } else if (modifier instanceof ConsumableModifier) { if (playSound && !this.sound.get(soundName)) { this.playSound(soundName); } - - if (modifier instanceof ConsumablePokemonModifier) { - for (const p in this.party) { - const pokemon = this.party[p]; - - const args: unknown[] = []; - if (modifier instanceof PokemonHpRestoreModifier) { - if (!(modifier as PokemonHpRestoreModifier).fainted) { - const hpRestoreMultiplier = new Utils.NumberHolder(1); - this.applyModifiers(HealingBoosterModifier, true, hpRestoreMultiplier); - args.push(hpRestoreMultiplier.value); - } else { - args.push(1); - } - } else if (modifier instanceof FusePokemonModifier) { - args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon); - } else if (modifier instanceof RememberMoveModifier && !Utils.isNullOrUndefined(cost)) { - args.push(cost); - } - - if (modifier.shouldApply(pokemon, ...args)) { - const result = modifier.apply(pokemon, ...args); - if (result instanceof Promise) { - modifierPromises.push(result.then(s => success ||= s)); - } else { - success ||= result; - } - } - } - - return Promise.allSettled([ this.party.map(p => p.updateInfo(instant)), ...modifierPromises ]).then(() => resolve(success)); - } else { - const args = [ this ]; - if (modifier.shouldApply(...args)) { - const result = modifier.apply(...args); - if (result instanceof Promise) { - return result.then(success => resolve(success)); - } else { - success ||= result; - } - } - } + } else if (!virtual) { + const defaultModifierType = getDefaultModifierTypeForTier( + modifier.type.tier, + ); + this.queueMessage( + i18next.t("battle:itemStackFull", { + fullItemName: modifier.type.name, + itemName: defaultModifierType.name, + }), + undefined, + false, + 3000, + ); + return this.addModifier( + defaultModifierType.newModifier(), + ignoreUpdate, + playSound, + false, + instant, + ); } - resolve(success); - }); + for (const rm of modifiersToRemove) { + this.removeModifier(rm); + } + + if (!ignoreUpdate && !virtual) { + this.updateModifiers(true, instant); + } + } else if (modifier instanceof ConsumableModifier) { + if (playSound && !this.sound.get(soundName)) { + this.playSound(soundName); + } + + if (modifier instanceof ConsumablePokemonModifier) { + for (const p in this.party) { + const pokemon = this.party[p]; + + const args: unknown[] = []; + if (modifier instanceof PokemonHpRestoreModifier) { + if (!(modifier as PokemonHpRestoreModifier).fainted) { + const hpRestoreMultiplier = new Utils.NumberHolder(1); + this.applyModifiers( + HealingBoosterModifier, + true, + hpRestoreMultiplier, + ); + args.push(hpRestoreMultiplier.value); + } else { + args.push(1); + } + } else if (modifier instanceof FusePokemonModifier) { + args.push( + this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon, + ); + } else if ( + modifier instanceof RememberMoveModifier && + !Utils.isNullOrUndefined(cost) + ) { + args.push(cost); + } + + if (modifier.shouldApply(pokemon, ...args)) { + const result = modifier.apply(pokemon, ...args); + success ||= result; + } + } + + this.party.map((p) => p.updateInfo(instant)); + } else { + const args = [ this ]; + if (modifier.shouldApply(...args)) { + const result = modifier.apply(...args); + success ||= result; + } + } + } + return success; } - addEnemyModifier(modifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { - return new Promise(resolve => { + addEnemyModifier( + modifier: PersistentModifier, + ignoreUpdate?: boolean, + instant?: boolean, + ): Promise { + return new Promise((resolve) => { const modifiersToRemove: PersistentModifier[] = []; if ((modifier as PersistentModifier).add(this.enemyModifiers, false)) { if (modifier instanceof PokemonFormChangeItemModifier) { @@ -2683,7 +3292,8 @@ export default class BattleScene extends SceneBase { } } if (!ignoreUpdate) { - this.updateModifiers(false, instant).then(() => resolve()); + this.updateModifiers(false, instant); + resolve(); } else { resolve(); } @@ -2704,86 +3314,128 @@ export default class BattleScene extends SceneBase { * @param itemLost If `true`, treat the item's current holder as losing the item (for now, this simply enables Unburden). Default is `true`. * @returns `true` if the transfer was successful */ - tryTransferHeldItemModifier(itemModifier: PokemonHeldItemModifier, target: Pokemon, playSound: boolean, transferQuantity: number = 1, instant?: boolean, ignoreUpdate?: boolean, itemLost: boolean = true): Promise { - return new Promise(resolve => { - const source = itemModifier.pokemonId ? itemModifier.getPokemon() : null; - const cancelled = new Utils.BooleanHolder(false); - Utils.executeIf(!!source && source.isPlayer() !== target.isPlayer(), () => applyAbAttrs(BlockItemTheftAbAttr, source! /* checked in condition*/, cancelled)).then(() => { - if (cancelled.value) { - return resolve(false); - } - const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; - newItemModifier.pokemonId = target.id; - const matchingModifier = this.findModifier(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).matchType(itemModifier) && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier; - let removeOld = true; - if (matchingModifier) { - const maxStackCount = matchingModifier.getMaxStackCount(); - if (matchingModifier.stackCount >= maxStackCount) { - return resolve(false); - } - const countTaken = Math.min(transferQuantity, itemModifier.stackCount, maxStackCount - matchingModifier.stackCount); - itemModifier.stackCount -= countTaken; - newItemModifier.stackCount = matchingModifier.stackCount + countTaken; - removeOld = !itemModifier.stackCount; - } else { - const countTaken = Math.min(transferQuantity, itemModifier.stackCount); - itemModifier.stackCount -= countTaken; - newItemModifier.stackCount = countTaken; - } - removeOld = !itemModifier.stackCount; - if (!removeOld || !source || this.removeModifier(itemModifier, !source.isPlayer())) { - const addModifier = () => { - if (!matchingModifier || this.removeModifier(matchingModifier, !target.isPlayer())) { - if (target.isPlayer()) { - this.addModifier(newItemModifier, ignoreUpdate, playSound, false, instant).then(() => { - if (source && itemLost) { - applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); - } - resolve(true); - }); - } else { - this.addEnemyModifier(newItemModifier, ignoreUpdate, instant).then(() => { - if (source && itemLost) { - applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); - } - resolve(true); - }); - } - } else { - resolve(false); + tryTransferHeldItemModifier( + itemModifier: PokemonHeldItemModifier, + target: Pokemon, + playSound: boolean, + transferQuantity: number = 1, + instant?: boolean, + ignoreUpdate?: boolean, + itemLost: boolean = true, + ): boolean { + const source = itemModifier.pokemonId ? itemModifier.getPokemon() : null; + const cancelled = new Utils.BooleanHolder(false); + + if (source && source.isPlayer() !== target.isPlayer()) { + applyAbAttrs(BlockItemTheftAbAttr, source, cancelled); + } + + if (cancelled.value) { + return false; + } + + const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; + newItemModifier.pokemonId = target.id; + const matchingModifier = this.findModifier( + (m) => + m instanceof PokemonHeldItemModifier && + m.matchType(itemModifier) && + m.pokemonId === target.id, + target.isPlayer(), + ) as PokemonHeldItemModifier; + + if (matchingModifier) { + const maxStackCount = matchingModifier.getMaxStackCount(); + if (matchingModifier.stackCount >= maxStackCount) { + return false; + } + const countTaken = Math.min( + transferQuantity, + itemModifier.stackCount, + maxStackCount - matchingModifier.stackCount, + ); + itemModifier.stackCount -= countTaken; + newItemModifier.stackCount = matchingModifier.stackCount + countTaken; + } else { + const countTaken = Math.min(transferQuantity, itemModifier.stackCount); + itemModifier.stackCount -= countTaken; + newItemModifier.stackCount = countTaken; + } + + const removeOld = itemModifier.stackCount === 0; + + if ( + !removeOld || + !source || + this.removeModifier(itemModifier, !source.isPlayer()) + ) { + const addModifier = () => { + if ( + !matchingModifier || + this.removeModifier(matchingModifier, !target.isPlayer()) + ) { + if (target.isPlayer()) { + this.addModifier( + newItemModifier, + ignoreUpdate, + playSound, + false, + instant, + ); + if (source && itemLost) { + applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); } - }; - if (source && source.isPlayer() !== target.isPlayer() && !ignoreUpdate) { - this.updateModifiers(source.isPlayer(), instant).then(() => addModifier()); + return true; } else { - addModifier(); + this.addEnemyModifier(newItemModifier, ignoreUpdate, instant); + if (source && itemLost) { + applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); + } + return true; } - return; } - resolve(false); - }); - }); + return false; + }; + if (source && source.isPlayer() !== target.isPlayer() && !ignoreUpdate) { + this.updateModifiers(source.isPlayer(), instant); + addModifier(); + } else { + addModifier(); + } + return true; + } + return false; } removePartyMemberModifiers(partyMemberIndex: number): Promise { - return new Promise(resolve => { + return new Promise((resolve) => { const pokemonId = this.getPlayerParty()[partyMemberIndex].id; - const modifiersToRemove = this.modifiers.filter(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemonId); + const modifiersToRemove = this.modifiers.filter( + (m) => + m instanceof PokemonHeldItemModifier && + (m as PokemonHeldItemModifier).pokemonId === pokemonId, + ); for (const m of modifiersToRemove) { this.modifiers.splice(this.modifiers.indexOf(m), 1); } - this.updateModifiers().then(() => resolve()); + this.updateModifiers(); + resolve(); }); } - generateEnemyModifiers(heldModifiersConfigs?: HeldModifierConfig[][]): Promise { - return new Promise(resolve => { + generateEnemyModifiers( + heldModifiersConfigs?: HeldModifierConfig[][], + ): Promise { + return new Promise((resolve) => { if (this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { return resolve(); } - const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(this.currentBattle.waveIndex); - const isFinalBoss = this.gameMode.isWaveFinal(this.currentBattle.waveIndex); + const difficultyWaveIndex = this.gameMode.getWaveForDifficulty( + this.currentBattle.waveIndex, + ); + const isFinalBoss = this.gameMode.isWaveFinal( + this.currentBattle.waveIndex, + ); let chances = Math.ceil(difficultyWaveIndex / 10); if (isFinalBoss) { chances = Math.ceil(chances * 2.5); @@ -2801,8 +3453,12 @@ export default class BattleScene extends SceneBase { } party.forEach((enemyPokemon: EnemyPokemon, i: number) => { - if (heldModifiersConfigs && i < heldModifiersConfigs.length && heldModifiersConfigs[i]) { - heldModifiersConfigs[i].forEach(mt => { + if ( + heldModifiersConfigs && + i < heldModifiersConfigs.length && + heldModifiersConfigs[i] + ) { + heldModifiersConfigs[i].forEach((mt) => { let modifier: PokemonHeldItemModifier; if (mt.modifier instanceof PokemonHeldItemModifierType) { modifier = mt.modifier.newModifier(enemyPokemon); @@ -2811,11 +3467,15 @@ export default class BattleScene extends SceneBase { modifier.pokemonId = enemyPokemon.id; } modifier.stackCount = mt.stackCount ?? 1; - modifier.isTransferable = mt.isTransferable ?? modifier.isTransferable; + modifier.isTransferable = + mt.isTransferable ?? modifier.isTransferable; this.addEnemyModifier(modifier, true); }); } else { - const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && !!this.currentBattle.trainer?.config.isBoss); + const isBoss = + enemyPokemon.isBoss() || + (this.currentBattle.battleType === BattleType.TRAINER && + !!this.currentBattle.trainer?.config.isBoss); let upgradeChance = 32; if (isBoss) { upgradeChance /= 2; @@ -2823,96 +3483,115 @@ export default class BattleScene extends SceneBase { if (isFinalBoss) { upgradeChance /= 8; } - const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); - let pokemonModifierChance = modifierChance; - if (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer) - pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line let count = 0; for (let c = 0; c < chances; c++) { - if (!Utils.randSeedInt(modifierChance)) { + if (!Utils.randSeedInt(this.gameMode.getEnemyModifierChance(isBoss))) { count++; } } if (isBoss) { count = Math.max(count, Math.floor(chances / 2)); } - getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) - .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false)); + getEnemyModifierTypesForWave( + difficultyWaveIndex, + count, + [ enemyPokemon ], + this.currentBattle.battleType === BattleType.TRAINER + ? ModifierPoolType.TRAINER + : ModifierPoolType.WILD, + upgradeChance, + ).map((mt) => + mt.newModifier(enemyPokemon).add(this.enemyModifiers, false), + ); } return true; }); - this.updateModifiers(false).then(() => resolve()); + this.updateModifiers(false); + resolve(); }); } /** - * Removes all modifiers from enemy pokemon of {@linkcode PersistentModifier} type - */ + * Removes all modifiers from enemy pokemon of {@linkcode PersistentModifier} type + */ clearEnemyModifiers(): void { - const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier); + const modifiersToRemove = this.enemyModifiers.filter( + (m) => m instanceof PersistentModifier, + ); for (const m of modifiersToRemove) { this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); } - this.updateModifiers(false).then(() => this.updateUIPositions()); + this.updateModifiers(false); + this.updateUIPositions(); } /** - * Removes all modifiers from enemy pokemon of {@linkcode PokemonHeldItemModifier} type - * @param pokemon - If specified, only removes held items from that {@linkcode Pokemon} - */ + * Removes all modifiers from enemy pokemon of {@linkcode PokemonHeldItemModifier} type + * @param pokemon - If specified, only removes held items from that {@linkcode Pokemon} + */ clearEnemyHeldItemModifiers(pokemon?: Pokemon): void { - const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PokemonHeldItemModifier && (!pokemon || m.getPokemon() === pokemon)); + const modifiersToRemove = this.enemyModifiers.filter( + (m) => + m instanceof PokemonHeldItemModifier && + (!pokemon || m.getPokemon() === pokemon), + ); for (const m of modifiersToRemove) { this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); } - this.updateModifiers(false).then(() => this.updateUIPositions()); + this.updateModifiers(false); + this.updateUIPositions(); } setModifiersVisible(visible: boolean) { - [ this.modifierBar, this.enemyModifierBar ].map(m => m.setVisible(visible)); + [ this.modifierBar, this.enemyModifierBar ].map((m) => m.setVisible(visible)); } - updateModifiers(player?: boolean, instant?: boolean): Promise { - if (player === undefined) { - player = true; + updateModifiers(player: boolean = true, instant?: boolean): void { + const modifiers = player + ? this.modifiers + : (this.enemyModifiers as PersistentModifier[]); + for (let m = 0; m < modifiers.length; m++) { + const modifier = modifiers[m]; + if ( + modifier instanceof PokemonHeldItemModifier && + !this.getPokemonById((modifier as PokemonHeldItemModifier).pokemonId) + ) { + modifiers.splice(m--, 1); + } } - return new Promise(resolve => { - const modifiers = player ? this.modifiers : this.enemyModifiers as PersistentModifier[]; - for (let m = 0; m < modifiers.length; m++) { - const modifier = modifiers[m]; - if (modifier instanceof PokemonHeldItemModifier && !this.getPokemonById((modifier as PokemonHeldItemModifier).pokemonId)) { - modifiers.splice(m--, 1); - } - } - for (const modifier of modifiers) { - if (modifier instanceof PersistentModifier) { - (modifier as PersistentModifier).virtualStackCount = 0; - } + for (const modifier of modifiers) { + if (modifier instanceof PersistentModifier) { + (modifier as PersistentModifier).virtualStackCount = 0; } + } - const modifiersClone = modifiers.slice(0); - for (const modifier of modifiersClone) { - if (!modifier.getStackCount()) { - modifiers.splice(modifiers.indexOf(modifier), 1); - } + const modifiersClone = modifiers.slice(0); + for (const modifier of modifiersClone) { + if (!modifier.getStackCount()) { + modifiers.splice(modifiers.indexOf(modifier), 1); } + } - this.updatePartyForModifiers(player ? this.getPlayerParty() : this.getEnemyParty(), instant).then(() => { - (player ? this.modifierBar : this.enemyModifierBar).updateModifiers(modifiers); - if (!player) { - this.updateUIPositions(); - } - resolve(); - }); - }); + this.updatePartyForModifiers( + player ? this.getPlayerParty() : this.getEnemyParty(), + instant, + ); + (player ? this.modifierBar : this.enemyModifierBar).updateModifiers( + modifiers, + ); + if (!player) { + this.updateUIPositions(); + } } updatePartyForModifiers(party: Pokemon[], instant?: boolean): Promise { - return new Promise(resolve => { - Promise.allSettled(party.map(p => { - p.calculateStats(); - return p.updateInfo(instant); - })).then(() => resolve()); + return new Promise((resolve) => { + Promise.allSettled( + party.map((p) => { + p.calculateStats(); + return p.updateInfo(instant); + }), + ).then(() => resolve()); }); } @@ -2924,7 +3603,10 @@ export default class BattleScene extends SceneBase { * @param enemy If `true`, remove an item owned by the enemy. If `false`, remove an item owned by the player. Default is `false`. * @returns `true` if the item exists and was successfully removed, `false` otherwise. */ - removeModifier(modifier: PersistentModifier, enemy: boolean = false): boolean { + removeModifier( + modifier: PersistentModifier, + enemy: boolean = false, + ): boolean { const modifiers = !enemy ? this.modifiers : this.enemyModifiers; const modifierIndex = modifiers.indexOf(modifier); if (modifierIndex > -1) { @@ -2947,8 +3629,13 @@ export default class BattleScene extends SceneBase { * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the list of all modifiers that matched `modifierType`. */ - getModifiers(modifierType: Constructor, player: boolean = true): T[] { - return (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType); + getModifiers( + modifierType: Constructor, + player: boolean = true, + ): T[] { + return (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType, + ); } /** @@ -2957,8 +3644,13 @@ export default class BattleScene extends SceneBase { * @param isPlayer Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the list of all modifiers that passed the `modifierFilter` function */ - findModifiers(modifierFilter: ModifierPredicate, isPlayer: boolean = true): PersistentModifier[] { - return (isPlayer ? this.modifiers : this.enemyModifiers).filter(modifierFilter); + findModifiers( + modifierFilter: ModifierPredicate, + isPlayer: boolean = true, + ): PersistentModifier[] { + return (isPlayer ? this.modifiers : this.enemyModifiers).filter( + modifierFilter, + ); } /** @@ -2967,7 +3659,10 @@ export default class BattleScene extends SceneBase { * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the first modifier that passed the `modifierFilter` function; `undefined` if none passed */ - findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier | undefined { + findModifier( + modifierFilter: ModifierPredicate, + player: boolean = true, + ): PersistentModifier | undefined { return (player ? this.modifiers : this.enemyModifiers).find(modifierFilter); } @@ -2978,18 +3673,31 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the list of all modifiers that matched `modifierType` and were applied. */ - applyShuffledModifiers(modifierType: Constructor, player: boolean = true, ...args: Parameters): T[] { - let modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); - this.executeWithSeedOffset(() => { - const shuffleModifiers = mods => { - if (mods.length < 1) { - return mods; - } - const rand = Utils.randSeedInt(mods.length); - return [ mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand)) ]; - }; - modifiers = shuffleModifiers(modifiers); - }, this.currentBattle.turn << 4, this.waveSeed); + applyShuffledModifiers( + modifierType: Constructor, + player: boolean = true, + ...args: Parameters + ): T[] { + let modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); + this.executeWithSeedOffset( + () => { + const shuffleModifiers = (mods) => { + if (mods.length < 1) { + return mods; + } + const rand = Utils.randSeedInt(mods.length); + return [ + mods[rand], + ...shuffleModifiers(mods.filter((_, i) => i !== rand)), + ]; + }; + modifiers = shuffleModifiers(modifiers); + }, + this.currentBattle.turn << 4, + this.waveSeed, + ); return this.applyModifiersInternal(modifiers, player, args); } @@ -3000,13 +3708,23 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the list of all modifiers that matched `modifierType` and were applied. */ - applyModifiers(modifierType: Constructor, player: boolean = true, ...args: Parameters): T[] { - const modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); + applyModifiers( + modifierType: Constructor, + player: boolean = true, + ...args: Parameters + ): T[] { + const modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); return this.applyModifiersInternal(modifiers, player, args); } /** Helper function to apply all passed modifiers */ - applyModifiersInternal(modifiers: T[], player: boolean, args: Parameters): T[] { + applyModifiersInternal( + modifiers: T[], + player: boolean, + args: Parameters, + ): T[] { const appliedModifiers: T[] = []; for (const modifier of modifiers) { if (modifier.apply(...args)) { @@ -3025,8 +3743,14 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the first modifier that matches `modifierType` and was applied; return `null` if none matched */ - applyModifier(modifierType: Constructor, player: boolean = true, ...args: Parameters): T | null { - const modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); + applyModifier( + modifierType: Constructor, + player: boolean = true, + ...args: Parameters + ): T | null { + const modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); for (const modifier of modifiers) { if (modifier.apply(...args)) { console.log("Applied", modifier.type.name, !player ? "(enemy)" : ""); @@ -3037,22 +3761,42 @@ export default class BattleScene extends SceneBase { return null; } - triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: Constructor, delayed: boolean = false, modal: boolean = false): boolean { + triggerPokemonFormChange( + pokemon: Pokemon, + formChangeTriggerType: Constructor, + delayed: boolean = false, + modal: boolean = false, + ): boolean { if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) { - // in case this is NECROZMA, determine which forms this - const matchingFormChangeOpts = pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon)); + const matchingFormChangeOpts = pokemonFormChanges[ + pokemon.species.speciesId + ].filter( + (fc) => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon), + ); let matchingFormChange: SpeciesFormChange | null; - if (pokemon.species.speciesId === Species.NECROZMA && matchingFormChangeOpts.length > 1) { + if ( + pokemon.species.speciesId === Species.NECROZMA && + matchingFormChangeOpts.length > 1 + ) { // Ultra Necrozma is changing its form back, so we need to figure out into which form it devolves. - const formChangeItemModifiers = (this.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]).filter(m => m.active).map(m => m.formChangeItem); + const formChangeItemModifiers = ( + this.findModifiers( + (m) => + m instanceof PokemonFormChangeItemModifier && + m.pokemonId === pokemon.id, + ) as PokemonFormChangeItemModifier[] + ) + .filter((m) => m.active) + .map((m) => m.formChangeItem); - - matchingFormChange = formChangeItemModifiers.includes(FormChangeItem.N_LUNARIZER) ? - matchingFormChangeOpts[0] : - formChangeItemModifiers.includes(FormChangeItem.N_SOLARIZER) ? - matchingFormChangeOpts[1] : - null; + matchingFormChange = formChangeItemModifiers.includes( + FormChangeItem.N_LUNARIZER, + ) + ? matchingFormChangeOpts[0] + : formChangeItemModifiers.includes(FormChangeItem.N_SOLARIZER) + ? matchingFormChangeOpts[1] + : null; } else { matchingFormChange = matchingFormChangeOpts[0]; } @@ -3063,7 +3807,11 @@ export default class BattleScene extends SceneBase { } else { phase = new QuietFormChangePhase(pokemon, matchingFormChange); } - if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet && modal) { + if ( + pokemon instanceof PlayerPokemon && + !matchingFormChange.quiet && + modal + ) { this.overridePhase(phase); } else if (delayed) { this.pushPhase(phase); @@ -3077,8 +3825,17 @@ export default class BattleScene extends SceneBase { return false; } - triggerPokemonBattleAnim(pokemon: Pokemon, battleAnimType: PokemonAnimType, fieldAssets?: Phaser.GameObjects.Sprite[], delayed: boolean = false): boolean { - const phase: Phase = new PokemonAnimPhase(battleAnimType, pokemon, fieldAssets); + triggerPokemonBattleAnim( + pokemon: Pokemon, + battleAnimType: PokemonAnimType, + fieldAssets?: Phaser.GameObjects.Sprite[], + delayed: boolean = false, + ): boolean { + const phase: Phase = new PokemonAnimPhase( + battleAnimType, + pokemon, + fieldAssets, + ); if (delayed) { this.pushPhase(phase); } else { @@ -3088,15 +3845,20 @@ export default class BattleScene extends SceneBase { } validateAchvs(achvType: Constructor, ...args: unknown[]): void { - const filteredAchvs = Object.values(achvs).filter(a => a instanceof achvType); + const filteredAchvs = Object.values(achvs).filter( + (a) => a instanceof achvType, + ); for (const achv of filteredAchvs) { this.validateAchv(achv, args); } } validateAchv(achv: Achv, args?: unknown[]): boolean { - if ((!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE) - && achv.validate(args)) { + if ( + (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || + Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE) && + achv.validate(args) + ) { this.gameData.achvUnlocks[achv.id] = new Date().getTime(); this.ui.achvBar.showAchv(achv); if (vouchers.hasOwnProperty(achv.id)) { @@ -3109,7 +3871,10 @@ export default class BattleScene extends SceneBase { } validateVoucher(voucher: Voucher, args?: unknown[]): boolean { - if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(args)) { + if ( + !this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && + voucher.validate(args) + ) { this.gameData.voucherUnlocks[voucher.id] = new Date().getTime(); this.ui.achvBar.showAchv(voucher); this.gameData.voucherCounts[voucher.voucherType]++; @@ -3125,19 +3890,21 @@ export default class BattleScene extends SceneBase { gameMode: this.currentBattle ? this.gameMode.getName() : "Title", biome: this.currentBattle ? getBiomeName(this.arena.biomeType) : "", wave: this.currentBattle?.waveIndex ?? 0, - party: this.party ? this.party.map((p) => { - return { - name: p.name, - form: p.getFormKey(), - types: p.getTypes().map((type) => Type[type]), - teraType: Type[p.getTeraType()], - isTerastallized: p.isTerastallized, - level: p.level, - currentHP: p.hp, - maxHP: p.getMaxHp(), - status: p.status?.effect ? StatusEffect[p.status.effect] : "" - }; - }) : [], + party: this.party + ? this.party.map((p) => { + return { + name: p.name, + form: p.getFormKey(), + types: p.getTypes().map((type) => Type[type]), + teraType: Type[p.getTeraType()], + isTerastallized: p.isTerastallized, + level: p.level, + currentHP: p.hp, + maxHP: p.getMaxHp(), + status: p.status?.effect ? StatusEffect[p.status.effect] : "", + }; + }) + : [], modeChain: this.ui?.getModeChain() ?? [], }; (window as any).gameInfo = gameInfo; @@ -3171,26 +3938,44 @@ export default class BattleScene extends SceneBase { * @param pokemon The (enemy) pokemon */ initFinalBossPhaseTwo(pokemon: Pokemon): void { - if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) { + if ( + pokemon instanceof EnemyPokemon && + pokemon.isBoss() && + !pokemon.formIndex && + pokemon.bossSegmentIndex < 1 + ) { this.fadeOutBgm(Utils.fixedInt(2000), false); - this.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, undefined, () => { - const finalBossMBH = getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as TurnHeldItemTransferModifier; - finalBossMBH.setTransferrableFalse(); - this.addEnemyModifier(finalBossMBH, false, true); - pokemon.generateAndPopulateMoveset(1); - this.setFieldScale(0.75); - this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - this.currentBattle.double = true; - const availablePartyMembers = this.getPlayerParty().filter((p) => p.isAllowedInBattle()); - if (availablePartyMembers.length > 1) { - this.pushPhase(new ToggleDoublePositionPhase(true)); - if (!availablePartyMembers[1].isOnField()) { - this.pushPhase(new SummonPhase(1)); + this.ui.showDialogue( + battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, + pokemon.species.name, + undefined, + () => { + const finalBossMBH = getModifierType( + modifierTypes.MINI_BLACK_HOLE, + ).newModifier(pokemon) as TurnHeldItemTransferModifier; + finalBossMBH.setTransferrableFalse(); + this.addEnemyModifier(finalBossMBH, false, true); + pokemon.generateAndPopulateMoveset(1); + this.setFieldScale(0.75); + this.triggerPokemonFormChange( + pokemon, + SpeciesFormChangeManualTrigger, + false, + ); + this.currentBattle.double = true; + const availablePartyMembers = this.getPlayerParty().filter((p) => + p.isAllowedInBattle(), + ); + if (availablePartyMembers.length > 1) { + this.pushPhase(new ToggleDoublePositionPhase(true)); + if (!availablePartyMembers[1].isOnField()) { + this.pushPhase(new SummonPhase(1)); + } } - } - this.shiftPhase(); - }); + this.shiftPhase(); + }, + ); return; } @@ -3204,33 +3989,62 @@ export default class BattleScene extends SceneBase { * @param useWaveIndexMultiplier Default false. If true, will multiply expValue by a scaling waveIndex multiplier. Not needed if expValue is already scaled by level/wave * @param pokemonParticipantIds Participants. If none are defined, no exp will be given. To spread evenly among the party, should pass all ids of party members. */ - applyPartyExp(expValue: number, pokemonDefeated: boolean, useWaveIndexMultiplier?: boolean, pokemonParticipantIds?: Set): void { - const participantIds = pokemonParticipantIds ?? this.currentBattle.playerParticipantIds; + applyPartyExp( + expValue: number, + pokemonDefeated: boolean, + useWaveIndexMultiplier?: boolean, + pokemonParticipantIds?: Set, + ): void { + const participantIds = + pokemonParticipantIds ?? this.currentBattle.playerParticipantIds; const party = this.getPlayerParty(); - const expShareModifier = this.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; - const expBalanceModifier = this.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; - const multipleParticipantExpBonusModifier = this.findModifier(m => m instanceof MultipleParticipantExpBonusModifier) as MultipleParticipantExpBonusModifier; - const nonFaintedPartyMembers = party.filter(p => p.hp); - const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < this.getMaxExpLevel()); + const expShareModifier = this.findModifier( + (m) => m instanceof ExpShareModifier, + ) as ExpShareModifier; + const expBalanceModifier = this.findModifier( + (m) => m instanceof ExpBalanceModifier, + ) as ExpBalanceModifier; + const multipleParticipantExpBonusModifier = this.findModifier( + (m) => m instanceof MultipleParticipantExpBonusModifier, + ) as MultipleParticipantExpBonusModifier; + const nonFaintedPartyMembers = party.filter((p) => p.hp); + const expPartyMembers = nonFaintedPartyMembers.filter( + (p) => p.level < this.getMaxExpLevel(), + ); const partyMemberExp: number[] = []; // EXP value calculation is based off Pokemon.getExpValue if (useWaveIndexMultiplier) { - expValue = Math.floor(expValue * this.currentBattle.waveIndex / 5 + 1); + expValue = Math.floor((expValue * this.currentBattle.waveIndex) / 5 + 1); } if (participantIds.size > 0) { - if (this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { + if ( + this.currentBattle.battleType === BattleType.TRAINER || + this.currentBattle.mysteryEncounter?.encounterMode === + MysteryEncounterMode.TRAINER_BATTLE + ) { expValue = Math.floor(expValue * 1.5); - } else if (this.currentBattle.isBattleMysteryEncounter() && this.currentBattle.mysteryEncounter) { - expValue = Math.floor(expValue * this.currentBattle.mysteryEncounter.expMultiplier); + } else if ( + this.currentBattle.isBattleMysteryEncounter() && + this.currentBattle.mysteryEncounter + ) { + expValue = Math.floor( + expValue * this.currentBattle.mysteryEncounter.expMultiplier, + ); } for (const partyMember of nonFaintedPartyMembers) { const pId = partyMember.id; const participated = participantIds.has(pId); if (participated && pokemonDefeated) { partyMember.addFriendship(FRIENDSHIP_GAIN_FROM_BATTLE); - const machoBraceModifier = partyMember.getHeldItems().find(m => m instanceof PokemonIncrementingStatModifier); - if (machoBraceModifier && machoBraceModifier.stackCount < machoBraceModifier.getMaxStackCount()) { + const machoBraceModifier = partyMember + .getHeldItems() + .find((m) => m instanceof PokemonIncrementingStatModifier); + if ( + machoBraceModifier && + machoBraceModifier.stackCount < + machoBraceModifier.getMaxStackCount() + ) { machoBraceModifier.stackCount++; this.updateModifiers(true, true); partyMember.updateInfo(); @@ -3245,12 +4059,14 @@ export default class BattleScene extends SceneBase { } let expMultiplier = 0; if (participated) { - expMultiplier += (1 / participantIds.size); + expMultiplier += 1 / participantIds.size; if (participantIds.size > 1 && multipleParticipantExpBonusModifier) { - expMultiplier += multipleParticipantExpBonusModifier.getStackCount() * 0.2; + expMultiplier += + multipleParticipantExpBonusModifier.getStackCount() * 0.2; } } else if (expShareModifier) { - expMultiplier += (expShareModifier.getStackCount() * 0.2) / participantIds.size; + expMultiplier += + (expShareModifier.getStackCount() * 0.2) / participantIds.size; } if (partyMember.pokerus) { expMultiplier *= 1.5; @@ -3259,7 +4075,12 @@ export default class BattleScene extends SceneBase { expMultiplier = Overrides.XP_MULTIPLIER_OVERRIDE; } const pokemonExp = new Utils.NumberHolder(expValue * expMultiplier); - this.applyModifiers(PokemonExpBoosterModifier, true, partyMember, pokemonExp); + this.applyModifiers( + PokemonExpBoosterModifier, + true, + partyMember, + pokemonExp, + ); partyMemberExp.push(Math.floor(pokemonExp.value)); } @@ -3280,10 +4101,16 @@ export default class BattleScene extends SceneBase { } }); - const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); + const splitExp = Math.floor( + totalExp / recipientExpPartyMemberIndexes.length, + ); expPartyMembers.forEach((_partyMember, pm) => { - partyMemberExp[pm] = Phaser.Math.Linear(partyMemberExp[pm], recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, 0.2 * expBalanceModifier.getStackCount()); + partyMemberExp[pm] = Phaser.Math.Linear( + partyMemberExp[pm], + recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, + 0.2 * expBalanceModifier.getStackCount(), + ); }); } @@ -3292,7 +4119,11 @@ export default class BattleScene extends SceneBase { if (exp) { const partyMemberIndex = party.indexOf(expPartyMembers[pm]); - this.unshiftPhase(expPartyMembers[pm].isOnField() ? new ExpPhase(partyMemberIndex, exp) : new ShowPartyExpBarPhase(partyMemberIndex, exp)); + this.unshiftPhase( + expPartyMembers[pm].isOnField() + ? new ExpPhase(partyMemberIndex, exp) + : new ShowPartyExpBarPhase(partyMemberIndex, exp), + ); } } } @@ -3303,9 +4134,19 @@ export default class BattleScene extends SceneBase { * 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; + 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 + ); } /** @@ -3315,31 +4156,56 @@ export default class BattleScene extends SceneBase { * @param newBattleType * @param waveIndex */ - private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number): boolean { - const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); + private isWaveMysteryEncounter( + newBattleType: BattleType, + waveIndex: number, + ): boolean { + const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = + this.gameMode.getMysteryEncounterLegalWaves(); 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 sessionEncounterRate = + this.mysteryEncounterSaveData.encounterSpawnChance; const encounteredEvents = this.mysteryEncounterSaveData.encounteredEvents; // If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn (reverse as well) // Reduces occurrence of runs with total encounters significantly different from AVERAGE_ENCOUNTERS_PER_RUN_TARGET // Favored rate changes can never exceed 50%. So if base rate is 15/256 and favored rate would add 200/256, result will be (15 + 128)/256 - const expectedEncountersByFloor = AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (highestMysteryEncounterWave - lowestMysteryEncounterWave) * (waveIndex - lowestMysteryEncounterWave); - const currentRunDiffFromAvg = expectedEncountersByFloor - encounteredEvents.length; - const favoredEncounterRate = sessionEncounterRate + Math.min(currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2); + const expectedEncountersByFloor = + (AVERAGE_ENCOUNTERS_PER_RUN_TARGET / + (highestMysteryEncounterWave - lowestMysteryEncounterWave)) * + (waveIndex - lowestMysteryEncounterWave); + const currentRunDiffFromAvg = + expectedEncountersByFloor - encounteredEvents.length; + const favoredEncounterRate = + sessionEncounterRate + + Math.min( + currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, + MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2, + ); - const successRate = isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!; + const successRate = isNullOrUndefined( + Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE, + ) + ? favoredEncounterRate + : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!; // If the most recent ME was 3 or fewer waves ago, can never spawn a ME - const canSpawn = encounteredEvents.length === 0 || (waveIndex - encounteredEvents[encounteredEvents.length - 1].waveIndex) > 3 || !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE); + const canSpawn = + encounteredEvents.length === 0 || + waveIndex - encounteredEvents[encounteredEvents.length - 1].waveIndex > + 3 || + !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE); if (canSpawn) { let roll = MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT; // Always rolls the check on the same offset to ensure no RNG changes from reloading session - this.executeWithSeedOffset(() => { - roll = randSeedInt(MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT); - }, waveIndex * 3 * 1000); + this.executeWithSeedOffset( + () => { + roll = randSeedInt(MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT); + }, + waveIndex * 3 * 1000, + ); return roll < successRate; } } @@ -3353,10 +4219,16 @@ export default class BattleScene extends SceneBase { * @param canBypass optional boolean to indicate that the request is coming from a function that needs to access a Mystery Encounter outside of gameplay requirements * @returns */ - getMysteryEncounter(encounterType?: MysteryEncounterType, canBypass?: boolean): MysteryEncounter { + getMysteryEncounter( + encounterType?: MysteryEncounterType, + canBypass?: boolean, + ): MysteryEncounter { // Loading override or session encounter let encounter: MysteryEncounter | null; - if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) { + if ( + !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && + allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) + ) { encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE]; if (canBypass) { return encounter; @@ -3365,13 +4237,22 @@ export default class BattleScene extends SceneBase { encounter = allMysteryEncounters[encounterType ?? -1]; return encounter; } else { - encounter = !isNullOrUndefined(encounterType) ? allMysteryEncounters[encounterType] : null; + encounter = !isNullOrUndefined(encounterType) + ? allMysteryEncounters[encounterType] + : null; } // Check for queued encounters first - if (!encounter && this.mysteryEncounterSaveData?.queuedEncounters && this.mysteryEncounterSaveData.queuedEncounters.length > 0) { + if ( + !encounter && + this.mysteryEncounterSaveData?.queuedEncounters && + this.mysteryEncounterSaveData.queuedEncounters.length > 0 + ) { let i = 0; - while (i < this.mysteryEncounterSaveData.queuedEncounters.length && !!encounter) { + while ( + i < this.mysteryEncounterSaveData.queuedEncounters.length && + !!encounter + ) { const candidate = this.mysteryEncounterSaveData.queuedEncounters[i]; const forcedChance = candidate.spawnPercent; if (Utils.randSeedInt(100) < forcedChance) { @@ -3389,34 +4270,56 @@ export default class BattleScene extends SceneBase { } // See Enum values for base tier weights - const tierWeights = [ MysteryEncounterTier.COMMON, MysteryEncounterTier.GREAT, MysteryEncounterTier.ULTRA, MysteryEncounterTier.ROGUE ]; + const tierWeights = [ + MysteryEncounterTier.COMMON, + MysteryEncounterTier.GREAT, + MysteryEncounterTier.ULTRA, + MysteryEncounterTier.ROGUE, + ]; // Adjust tier weights by previously encountered events to lower odds of only Common/Great in run - this.mysteryEncounterSaveData.encounteredEvents.forEach(seenEncounterData => { - if (seenEncounterData.tier === MysteryEncounterTier.COMMON) { - tierWeights[0] = tierWeights[0] - 6; - } else if (seenEncounterData.tier === MysteryEncounterTier.GREAT) { - tierWeights[1] = tierWeights[1] - 4; - } - }); + this.mysteryEncounterSaveData.encounteredEvents.forEach( + (seenEncounterData) => { + if (seenEncounterData.tier === MysteryEncounterTier.COMMON) { + tierWeights[0] = tierWeights[0] - 6; + } else if (seenEncounterData.tier === MysteryEncounterTier.GREAT) { + tierWeights[1] = tierWeights[1] - 4; + } + }, + ); const totalWeight = tierWeights.reduce((a, b) => a + b); const tierValue = Utils.randSeedInt(totalWeight); const commonThreshold = totalWeight - tierWeights[0]; const greatThreshold = totalWeight - tierWeights[0] - tierWeights[1]; - const ultraThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; - let tier: MysteryEncounterTier | null = tierValue > commonThreshold ? MysteryEncounterTier.COMMON : tierValue > greatThreshold ? MysteryEncounterTier.GREAT : tierValue > ultraThreshold ? MysteryEncounterTier.ULTRA : MysteryEncounterTier.ROGUE; + const ultraThreshold = + totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; + let tier: MysteryEncounterTier | null = + tierValue > commonThreshold + ? MysteryEncounterTier.COMMON + : tierValue > greatThreshold + ? MysteryEncounterTier.GREAT + : tierValue > ultraThreshold + ? MysteryEncounterTier.ULTRA + : MysteryEncounterTier.ROGUE; if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE)) { tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE; } let availableEncounters: MysteryEncounter[] = []; - const previousEncounter = this.mysteryEncounterSaveData.encounteredEvents.length > 0 ? - this.mysteryEncounterSaveData.encounteredEvents[this.mysteryEncounterSaveData.encounteredEvents.length - 1].type - : null; - const disabledEncounters = this.eventManager.getEventMysteryEncountersDisabled(); - const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType)?.filter(enc => !disabledEncounters.includes(enc)) ?? []; + const previousEncounter = + this.mysteryEncounterSaveData.encounteredEvents.length > 0 + ? this.mysteryEncounterSaveData.encounteredEvents[ + this.mysteryEncounterSaveData.encounteredEvents.length - 1 + ].type + : null; + const disabledEncounters = + this.eventManager.getEventMysteryEncountersDisabled(); + const biomeMysteryEncounters = + mysteryEncountersByBiome + .get(this.arena.biomeType) + ?.filter((enc) => !disabledEncounters.includes(enc)) ?? []; // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available while (availableEncounters.length === 0 && tier !== null) { availableEncounters = biomeMysteryEncounters @@ -3425,34 +4328,57 @@ export default class BattleScene extends SceneBase { if (!encounterCandidate) { return false; } - if (this.eventManager.getMysteryEncounterTierForEvent(encounterType, encounterCandidate.encounterTier) !== tier) { + if ( + this.eventManager.getMysteryEncounterTierForEvent( + encounterType, + encounterCandidate.encounterTier, + ) !== tier + ) { return false; } const disallowedGameModes = encounterCandidate.disallowedGameModes; - if (disallowedGameModes && disallowedGameModes.length > 0 - && disallowedGameModes.includes(this.gameMode.modeId)) { + if ( + disallowedGameModes && + disallowedGameModes.length > 0 && + disallowedGameModes.includes(this.gameMode.modeId) + ) { return false; } if (this.gameMode.modeId === GameModes.CHALLENGE) { - const disallowedChallenges = encounterCandidate.disallowedChallenges; - if (disallowedChallenges && disallowedChallenges.length > 0 && this.gameMode.challenges.some(challenge => disallowedChallenges.includes(challenge.id))) { + const disallowedChallenges = + encounterCandidate.disallowedChallenges; + if ( + disallowedChallenges && + disallowedChallenges.length > 0 && + this.gameMode.challenges.some((challenge) => + disallowedChallenges.includes(challenge.id), + ) + ) { return false; } } if (!encounterCandidate.meetsRequirements()) { return false; } - if (previousEncounter !== null && encounterType === previousEncounter) { + if ( + previousEncounter !== null && + encounterType === previousEncounter + ) { return false; } - if (this.mysteryEncounterSaveData.encounteredEvents.length > 0 && - (encounterCandidate.maxAllowedEncounters && encounterCandidate.maxAllowedEncounters > 0) - && this.mysteryEncounterSaveData.encounteredEvents.filter(e => e.type === encounterType).length >= encounterCandidate.maxAllowedEncounters) { + if ( + this.mysteryEncounterSaveData.encounteredEvents.length > 0 && + encounterCandidate.maxAllowedEncounters && + encounterCandidate.maxAllowedEncounters > 0 && + this.mysteryEncounterSaveData.encounteredEvents.filter( + (e) => e.type === encounterType, + ).length >= encounterCandidate.maxAllowedEncounters + ) { return false; } return true; }) - .map((m) => (allMysteryEncounters[m])); + .map((m) => allMysteryEncounters[m]); // Decrement tier if (tier === MysteryEncounterTier.ROGUE) { tier = MysteryEncounterTier.ULTRA; @@ -3467,10 +4393,13 @@ export default class BattleScene extends SceneBase { // If absolutely no encounters are available, spawn 0th encounter if (availableEncounters.length === 0) { - console.log("No Mystery Encounters found, falling back to Mysterious Challengers."); + console.log( + "No Mystery Encounters found, falling back to Mysterious Challengers.", + ); return allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHALLENGERS]; } - encounter = availableEncounters[Utils.randSeedInt(availableEncounters.length)]; + encounter = + availableEncounters[Utils.randSeedInt(availableEncounters.length)]; // New encounter object to not dirty flags encounter = new MysteryEncounter(encounter); encounter.populateDialogueTokensFromRequirements(); diff --git a/src/data/ability.ts b/src/data/ability.ts index 95601dc2010..65da3753cde 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1,6 +1,6 @@ -import type { EnemyPokemon } from "../field/pokemon"; +import type { EnemyPokemon, PokemonMove } from "../field/pokemon"; import type Pokemon from "../field/pokemon"; -import { HitResult, MoveResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; +import { HitResult, MoveResult, PlayerPokemon } from "../field/pokemon"; import { Type } from "#enums/type"; import type { Constructor } from "#app/utils"; import * as Utils from "../utils"; @@ -44,6 +44,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { StatusEffect } from "#enums/status-effect"; import { WeatherType } from "#enums/weather-type"; +import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; export class Ability implements Localizable { public id: Abilities; @@ -143,7 +144,7 @@ export class Ability implements Localizable { } } -type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => boolean | Promise; +type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => boolean; type AbAttrCondition = (pokemon: Pokemon) => boolean; // TODO: Can this be improved? @@ -159,7 +160,7 @@ export abstract class AbAttr { this.showAbility = showAbility; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { return false; } @@ -215,7 +216,7 @@ export class DoubleBattleChanceAbAttr extends AbAttr { } export class PostBattleInitAbAttr extends AbAttr { - applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -250,7 +251,7 @@ export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { this.stages = stages; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { const statStageChangePhases: StatStageChangePhase[] = []; if (!simulated) { @@ -268,7 +269,15 @@ export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { type PreDefendAbAttrCondition = (pokemon: Pokemon, attacker: Pokemon, move: Move) => boolean; export class PreDefendAbAttr extends AbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + applyPreDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + args: any[], + ): boolean { return false; } } @@ -546,7 +555,15 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { * @param args `[0]` a container for the move's current type effectiveness multiplier * @returns `true` if the move's effectiveness is reduced; `false` otherwise */ - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + override applyPreDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + args: any[], + ): boolean { const typeMultiplier = args[0]; if (!(typeMultiplier && typeMultiplier instanceof Utils.NumberHolder)) { return false; @@ -572,7 +589,15 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { } export class PostDefendAbAttr extends AbAttr { - applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + applyPostDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { return false; } } @@ -593,7 +618,14 @@ export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { } export class PostStatStageChangeAbAttr extends AbAttr { - applyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statsChanged: BattleStat[], stagesChanged: number, selfTarget: boolean, args: any[]): boolean | Promise { + applyPostStatStageChange( + pokemon: Pokemon, + simulated: boolean, + statsChanged: BattleStat[], + stagesChanged: integer, + selfTarget: boolean, + args: any[], + ): boolean { return false; } } @@ -1142,7 +1174,14 @@ export class PostStatStageChangeStatStageChangeAbAttr extends PostStatStageChang } export class PreAttackAbAttr extends AbAttr { - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean | Promise { + applyPreAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon | null, + move: Move, + args: any[], + ): boolean { return false; } } @@ -1208,7 +1247,13 @@ export class VariableMovePowerAbAttr extends PreAttackAbAttr { } export class FieldPreventExplosiveMovesAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + override apply( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { cancelled.value = true; return true; } @@ -1562,8 +1607,15 @@ export class StatMultiplierAbAttr extends AbAttr { this.condition = condition ?? null; } - applyStatStage(pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, statValue: Utils.NumberHolder, args: any[]): boolean | Promise { - const move = (args[0] as Move); + applyStatStage( + pokemon: Pokemon, + _passive: boolean, + simulated: boolean, + stat: BattleStat, + statValue: Utils.NumberHolder, + args: any[], + ): boolean { + const move = args[0] as Move; if (stat === this.stat && (!this.condition || this.condition(pokemon, null, move))) { statValue.value *= this.multiplier; return true; @@ -1588,7 +1640,15 @@ export class PostAttackAbAttr extends AbAttr { * applying the effect of any inherited class. This can be changed by providing a different {@link attackCondition} to the constructor. See {@link ConfusionOnStatusEffectAbAttr} * for an example of an effect that does not require a damaging move. */ - applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + applyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { // When attackRequired is true, we require the move to be an attack move and to deal damage before checking secondary requirements. // If attackRequired is false, we always defer to the secondary requirements. if (this.attackCondition(pokemon, defender, move)) { @@ -1601,7 +1661,15 @@ export class PostAttackAbAttr extends AbAttr { /** * This method is only called after {@link applyPostAttack} has already been applied. Use this for handling checks specific to the ability in question. */ - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + applyPostAttackAfterMoveTypeCheck( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { return false; } } @@ -1626,7 +1694,15 @@ export class GorillaTacticsAbAttr extends PostAttackAbAttr { * @param args n/a * @returns `true` if the ability is applied */ - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + override applyPostAttackAfterMoveTypeCheck( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): boolean { if (simulated) { return simulated; } @@ -1649,23 +1725,36 @@ export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { this.stealCondition = stealCondition ?? null; } - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { - return new Promise(resolve => { - if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.stealCondition || this.stealCondition(pokemon, defender, move))) { - const heldItems = this.getTargetHeldItems(defender).filter(i => i.isTransferable); - if (heldItems.length) { - const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; - globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { - if (success) { - globalScene.queueMessage(i18next.t("abilityTriggers:postAttackStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), defenderName: defender.name, stolenItemType: stolenItem.type.name })); - } - resolve(success); - }); - return; + override applyPostAttackAfterMoveTypeCheck( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult, + args: any[], + ): boolean { + if ( + !simulated && + hitResult < HitResult.NO_EFFECT && + (!this.stealCondition || this.stealCondition(pokemon, defender, move)) + ) { + const heldItems = this.getTargetHeldItems(defender).filter((i) => i.isTransferable); + if (heldItems.length) { + const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + if (globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false)) { + globalScene.queueMessage( + i18next.t("abilityTriggers:postAttackStealHeldItem", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + defenderName: defender.name, + stolenItemType: stolenItem.type.name, + }), + ); + return true; } } - resolve(simulated); - }); + } + return false; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -1742,23 +1831,37 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { this.condition = condition; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): Promise { - return new Promise(resolve => { - if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move)) && !move.hitsSubstitute(attacker, pokemon)) { - const heldItems = this.getTargetHeldItems(attacker).filter(i => i.isTransferable); - if (heldItems.length) { - const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; - globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { - if (success) { - globalScene.queueMessage(i18next.t("abilityTriggers:postDefendStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), attackerName: attacker.name, stolenItemType: stolenItem.type.name })); - } - resolve(success); - }); - return; + override applyPostDefend( + pokemon: Pokemon, + _passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move, + hitResult: HitResult, + _args: any[], + ): boolean { + if ( + !simulated && + hitResult < HitResult.NO_EFFECT && + (!this.condition || this.condition(pokemon, attacker, move)) && + !move.hitsSubstitute(attacker, pokemon) + ) { + const heldItems = this.getTargetHeldItems(attacker).filter((i) => i.isTransferable); + if (heldItems.length) { + const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + if (globalScene.tryTransferHeldItemModifier(stolenItem, pokemon, false)) { + globalScene.queueMessage( + i18next.t("abilityTriggers:postDefendStealHeldItem", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + attackerName: attacker.name, + stolenItemType: stolenItem.type.name, + }), + ); + return true; } } - resolve(simulated); - }); + } + return false; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -1781,7 +1884,14 @@ export class PostSetStatusAbAttr extends AbAttr { * @param args Set of unique arguments needed by this attribute. * @returns `true` if application of the ability succeeds. */ - applyPostSetStatus(pokemon: Pokemon, sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]) : boolean | Promise { + applyPostSetStatus( + pokemon: Pokemon, + sourcePokemon: Pokemon | null = null, + passive: boolean, + effect: StatusEffect, + simulated: boolean, + args: any[], + ): boolean { return false; } } @@ -1823,7 +1933,7 @@ export class SynchronizeStatusAbAttr extends PostSetStatusAbAttr { } export class PostVictoryAbAttr extends AbAttr { - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -1839,10 +1949,8 @@ class PostVictoryStatStageChangeAbAttr extends PostVictoryAbAttr { this.stages = stages; } - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - const stat = typeof this.stat === "function" - ? this.stat(pokemon) - : this.stat; + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], this.stages)); } @@ -1859,7 +1967,7 @@ export class PostVictoryFormChangeAbAttr extends PostVictoryAbAttr { this.formFunc = formFunc; } - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); if (formIndex !== pokemon.formIndex) { if (!simulated) { @@ -1873,7 +1981,7 @@ export class PostVictoryFormChangeAbAttr extends PostVictoryAbAttr { } export class PostKnockOutAbAttr extends AbAttr { - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { return false; } } @@ -1889,10 +1997,8 @@ export class PostKnockOutStatStageChangeAbAttr extends PostKnockOutAbAttr { this.stages = stages; } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { - const stat = typeof this.stat === "function" - ? this.stat(pokemon) - : this.stat; + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { + const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], this.stages)); } @@ -1905,7 +2011,7 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr { super(); } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { if (pokemon.isPlayer() === knockedOut.isPlayer() && !knockedOut.getAbility().hasAttr(UncopiableAbilityAbAttr)) { if (!simulated) { globalScene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); @@ -2015,7 +2121,7 @@ export class PostSummonAbAttr extends AbAttr { * @param args Set of unique arguments needed by this attribute * @returns true if application of the ability succeeds */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -2035,7 +2141,7 @@ export class PostSummonRemoveArenaTagAbAttr extends PostSummonAbAttr { this.arenaTags = arenaTags; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (!simulated) { for (const arenaTag of this.arenaTags) { globalScene.arena.removeTag(arenaTag); @@ -2383,9 +2489,9 @@ export class PostSummonUserFieldRemoveStatusEffectAbAttr extends PostSummonAbAtt * @param pokemon - The Pokémon that triggered the ability. * @param passive - n/a * @param args - n/a - * @returns A boolean or a promise that resolves to a boolean indicating the result of the ability application. + * @returns A boolean that resolves to a boolean indicating the result of the ability application. */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const party = pokemon instanceof PlayerPokemon ? globalScene.getPlayerField() : globalScene.getEnemyField(); const allowedParty = party.filter(p => p.isAllowedInBattle()); @@ -2445,12 +2551,11 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { super(true, false); } - async applyPostSummon(pokemon: Pokemon, _passive: boolean, simulated: boolean, _args: any[]): Promise { + override applyPostSummon(pokemon: Pokemon, _passive: boolean, simulated: boolean, _args: any[]): boolean { const targets = pokemon.getOpponents(); if (simulated || !targets.length) { return simulated; } - const promises: Promise[] = []; let target: Pokemon; if (targets.length > 1) { @@ -2476,41 +2581,14 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { return false; } - pokemon.summonData.speciesForm = target.getSpeciesForm(); - pokemon.summonData.gender = target.getGender(); + globalScene.unshiftPhase(new PokemonTransformPhase(pokemon.getBattlerIndex(), target.getBattlerIndex(), true)); - // Copy all stats (except HP) - for (const s of EFFECTIVE_STATS) { - pokemon.setStat(s, target.getStat(s, false), false); - } - - // Copy all stat stages - for (const s of BATTLE_STATS) { - pokemon.setStatStage(s, target.getStatStage(s)); - } - - 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()); - - globalScene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, })); - globalScene.playSound("battle_anims/PRSFX- Transform"); - promises.push(pokemon.loadAssets(false).then(() => { - pokemon.playAnim(); - pokemon.updateInfo(); - // If the new ability activates immediately, it needs to happen after all the transform animations - pokemon.setTempAbility(target.getAbility()); - })); - - await Promise.all(promises); + globalScene.queueMessage( + i18next.t("abilityTriggers:postSummonTransform", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + targetName: target.name, + }), + ); return true; } @@ -2627,13 +2705,13 @@ export class PreSwitchOutAbAttr extends AbAttr { super(true); } - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr { - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (pokemon.status) { if (!simulated) { pokemon.resetStatus(); @@ -2647,9 +2725,72 @@ export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr { } } +/** + * Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon switching out. + */ +export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { + /** + * @param pokemon The {@linkcode Pokemon} with the ability + * @param passive N/A + * @param args N/A + * @returns {boolean} Returns true if the weather clears, otherwise false. + */ + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const weatherType = globalScene.arena.weather?.weatherType; + let turnOffWeather = false; + + // Clear weather only if user's ability matches the weather and no other pokemon has the ability. + switch (weatherType) { + case WeatherType.HARSH_SUN: + if ( + pokemon.hasAbility(Abilities.DESOLATE_LAND) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0 + ) { + turnOffWeather = true; + } + break; + case WeatherType.HEAVY_RAIN: + if ( + pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0 + ) { + turnOffWeather = true; + } + break; + case WeatherType.STRONG_WINDS: + if ( + pokemon.hasAbility(Abilities.DELTA_STREAM) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.DELTA_STREAM)).length === 0 + ) { + turnOffWeather = true; + } + break; + } + + if (simulated) { + return turnOffWeather; + } + + if (turnOffWeather) { + globalScene.arena.trySetWeather(WeatherType.NONE, false); + return true; + } + + return false; + } +} export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr { - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (!pokemon.isFullHp()) { if (!simulated) { const healAmount = Utils.toDmgValue(pokemon.getMaxHp() * 0.33); @@ -2685,7 +2826,7 @@ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr { * @param args N/A * @returns true if the form change was successful */ - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); if (formIndex !== pokemon.formIndex) { if (!simulated) { @@ -2700,7 +2841,7 @@ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr { } export class PreLeaveFieldAbAttr extends AbAttr { - applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -2715,7 +2856,7 @@ export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { * @param args N/A * @returns Returns `true` if the weather clears, otherwise `false`. */ - applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const weatherType = globalScene.arena.weather?.weatherType; let turnOffWeather = false; @@ -2755,7 +2896,14 @@ export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { } export class PreStatStageChangeAbAttr extends AbAttr { - applyPreStatStageChange(pokemon: Pokemon | null, passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreStatStageChange( + pokemon: Pokemon | null, + passive: boolean, + simulated: boolean, + stat: BattleStat, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -2878,7 +3026,14 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { } export class PreSetStatusAbAttr extends AbAttr { - applyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreSetStatus( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + effect: StatusEffect | undefined, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -2944,7 +3099,14 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr export class UserFieldStatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr { } export class PreApplyBattlerTagAbAttr extends AbAttr { - applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreApplyBattlerTag( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + tag: BattlerTag, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -3139,7 +3301,14 @@ export class ChangeMovePriorityAbAttr extends AbAttr { export class IgnoreContactAbAttr extends AbAttr { } export class PreWeatherEffectAbAttr extends AbAttr { - applyPreWeatherEffect(pokemon: Pokemon, passive: Boolean, simulated: boolean, weather: Weather | null, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + applyPreWeatherEffect( + pokemon: Pokemon, + passive: Boolean, + simulated: boolean, + weather: Weather | null, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { return false; } } @@ -3420,7 +3589,13 @@ export class PostWeatherLapseAbAttr extends AbAttr { this.weatherTypes = weatherTypes; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather | null, args: any[]): boolean | Promise { + applyPostWeatherLapse( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + weather: Weather | null, + args: any[], + ): boolean { return false; } @@ -3516,7 +3691,7 @@ function getTerrainCondition(...terrainTypes: TerrainType[]): AbAttrCondition { } export class PostTurnAbAttr extends AbAttr { - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { return false; } } @@ -3542,7 +3717,7 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr { * @param {any[]} args N/A * @returns Returns true if healed from status, false if not */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (pokemon.status && this.effects.includes(pokemon.status.effect)) { if (!pokemon.isFullHp()) { if (!simulated) { @@ -3776,7 +3951,7 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { * @param args N/A * @returns `true` if any opponents are sleeping */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { let hadEffect: boolean = false; for (const opp of pokemon.getOpponents()) { if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !opp.switchOutStatus) { @@ -3870,7 +4045,14 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { * @extends AbAttr */ export class PostMoveUsedAbAttr extends AbAttr { - applyPostMoveUsed(pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise { + applyPostMoveUsed( + pokemon: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean, + args: any[], + ): boolean { return false; } } @@ -3891,7 +4073,14 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { * * @return true if the Dancer ability was resolved */ - applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise { + override applyPostMoveUsed( + dancer: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean, + args: any[], + ): boolean { // List of tags that prevent the Dancer from replicating the move const forbiddenTags = [ BattlerTagType.FLYING, BattlerTagType.UNDERWATER, BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN ]; @@ -3933,7 +4122,7 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { * @extends AbAttr */ export class PostItemLostAbAttr extends AbAttr { - applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean | Promise { + applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { return false; } } @@ -3954,7 +4143,7 @@ export class PostItemLostApplyBattlerTagAbAttr extends PostItemLostAbAttr { * @param args N/A * @returns true if BattlerTag was applied */ - applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean | Promise { + override applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { if (!pokemon.getTag(this.tagType) && !simulated) { pokemon.addTag(this.tagType); return true; @@ -3980,7 +4169,13 @@ export class StatStageChangeMultiplierAbAttr extends AbAttr { } export class StatStageChangeCopyAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + override apply( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { if (!simulated) { globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, (args[0] as BattleStat[]), (args[1] as number), true, false, false)); } @@ -4096,7 +4291,14 @@ export class CheckTrappedAbAttr extends AbAttr { this.arenaTrapCondition = condition; } - applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean | Promise { + applyCheckTrapped( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + trapped: Utils.BooleanHolder, + otherPokemon: Pokemon, + args: any[], + ): boolean { return false; } } @@ -4170,7 +4372,7 @@ export class PostBattleLootAbAttr extends PostBattleAbAttr { if (!simulated && postBattleLoot.length && args[0]) { const randItem = Utils.randSeedItem(postBattleLoot); //@ts-ignore - TODO see below - if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true, undefined, false)) { // TODO: fix. This is a promise!? + if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true, undefined, false)) { postBattleLoot.splice(postBattleLoot.indexOf(randItem), 1); globalScene.queueMessage(i18next.t("abilityTriggers:postBattleLoot", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), itemName: randItem.type.name })); return true; @@ -4841,7 +5043,7 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { * Checks if the Pokemon should change types if summoned into an active terrain * @returns `true` if there is an active terrain requiring a type change | `false` if not */ - override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (globalScene.arena.getTerrainType() !== TerrainType.NONE) { return this.apply(pokemon, passive, simulated, new Utils.BooleanHolder(false), []); } @@ -4860,27 +5062,7 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { } } -async function applyAbAttrsInternal( - attrType: Constructor, - pokemon: Pokemon | null, - applyFunc: AbAttrApplyFunc, - args: any[], - showAbilityInstant: boolean = false, - simulated: boolean = false, - messages: string[] = [], - gainedMidTurn: boolean = false -) { - for (const passive of [ false, true ]) { - if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { - continue; - } - - applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); - globalScene.clearPhaseQueueSplice(); - } -} - -async function applySingleAbAttrs( +function applySingleAbAttrs( pokemon: Pokemon, passive: boolean, attrType: Constructor, @@ -4903,13 +5085,7 @@ async function applySingleAbAttrs( } globalScene.setPhaseQueueSplice(); - - let result = applyFunc(attr, passive); - // TODO Remove this when promises get reworked - if (result instanceof Promise) { - result = await result; - } - if (result) { + if (applyFunc(attr, passive)) { if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) { pokemon.summonData.abilitiesApplied.push(ability.id); } @@ -5074,7 +5250,14 @@ function calculateShellBellRecovery(pokemon: Pokemon): number { * @extends AbAttr */ export class PostDamageAbAttr extends AbAttr { - public applyPostDamage(pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], source?: Pokemon): boolean | Promise { + public applyPostDamage( + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean, + args: any[], + source?: Pokemon, + ): boolean { return false; } } @@ -5111,7 +5294,14 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { * @param source The Pokemon that dealt damage * @returns `true` if the switch-out logic was successfully applied */ - public override applyPostDamage(pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], source?: Pokemon): boolean | Promise { + public override applyPostDamage( + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean, + args: any[], + source?: Pokemon, + ): boolean { const moveHistory = pokemon.getMoveHistory(); // Will not activate when the Pokémon's HP is lowered by cutting its own HP const fordbiddenAttackingMoves = [ Moves.BELLY_DRUM, Moves.SUBSTITUTE, Moves.CURSE, Moves.PAIN_SPLIT ]; @@ -5165,44 +5355,164 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { return this.helper.getFailedText(target); } } +function applyAbAttrsInternal( + attrType: Constructor, + pokemon: Pokemon | null, + applyFunc: AbAttrApplyFunc, + args: any[], + showAbilityInstant: boolean = false, + simulated: boolean = false, + messages: string[] = [], + gainedMidTurn: boolean = false +) { + for (const passive of [ false, true ]) { + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { + continue; + } - -export function applyAbAttrs(attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), args, false, simulated); + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); + globalScene.clearPhaseQueueSplice(); + } } -export function applyPostBattleInitAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattleInit(pokemon, passive, simulated, args), args, false, simulated); +export function applyAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + cancelled: Utils.BooleanHolder | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), + args, + false, + simulated, + ); } -export function applyPreDefendAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), args, false, simulated); +export function applyPostBattleInitAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostBattleInit(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostDefendAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); +export function applyPreDefendAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), + args, + false, + simulated, + ); } -export function applyPostMoveUsedAbAttrs(attrType: Constructor, - pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, args), args, false, simulated); +export function applyPostDefendAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker: Pokemon, + move: Move, + hitResult: HitResult | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), + args, + false, + simulated, + ); } -export function applyStatMultiplierAbAttrs(attrType: Constructor, - pokemon: Pokemon, stat: BattleStat, statValue: Utils.NumberHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), args); -} -export function applyPostSetStatusAbAttrs(attrType: Constructor, - pokemon: Pokemon, effect: StatusEffect, sourcePokemon?: Pokemon | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), args, false, simulated); +export function applyPostMoveUsedAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, args), + args, + false, + simulated, + ); } -export function applyPostDamageAbAttrs(attrType: Constructor, - pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean = false, args: any[], source?: Pokemon): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDamage(pokemon, damage, passive, simulated, args, source), args); +export function applyStatMultiplierAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stat: BattleStat, + statValue: Utils.NumberHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), + args, + ); +} +export function applyPostSetStatusAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + effect: StatusEffect, + sourcePokemon?: Pokemon | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), + args, + false, + simulated, + ); +} + +export function applyPostDamageAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean = false, + args: any[], + source?: Pokemon, +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostDamage(pokemon, damage, passive, simulated, args, source), + args, + ); } /** @@ -5215,109 +5525,369 @@ export function applyPostDamageAbAttrs(attrType: Constructor, * @param hasApplied {@linkcode Utils.BooleanHolder} whether or not a FieldMultiplyBattleStatAbAttr has already affected this stat * @param args unused */ -export function applyFieldStatMultiplierAbAttrs(attrType: Constructor, - pokemon: Pokemon, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), args); +export function applyFieldStatMultiplierAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stat: Stat, + statValue: Utils.NumberHolder, + checkedPokemon: Pokemon, + hasApplied: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => + attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), + args, + ); } -export function applyPreAttackAbAttrs(attrType: Constructor, - pokemon: Pokemon, defender: Pokemon | null, move: Move, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreAttack(pokemon, passive, simulated, defender, move, args), args, false, simulated); +export function applyPreAttackAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + defender: Pokemon | null, + move: Move, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreAttack(pokemon, passive, simulated, defender, move, args), + args, + false, + simulated, + ); } -export function applyPostAttackAbAttrs(attrType: Constructor, - pokemon: Pokemon, defender: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), args, false, simulated); +export function applyPostAttackAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), + args, + false, + simulated, + ); } -export function applyPostKnockOutAbAttrs(attrType: Constructor, - pokemon: Pokemon, knockedOut: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, simulated, knockedOut, args), args, false, simulated); +export function applyPostKnockOutAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + knockedOut: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostKnockOut(pokemon, passive, simulated, knockedOut, args), + args, + false, + simulated, + ); } -export function applyPostVictoryAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostVictory(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostVictoryAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostVictory(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostSummonAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostSummonAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPreSwitchOutAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), args, true, simulated); +export function applyPreSwitchOutAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), + args, + true, + simulated, + ); } -export function applyPreLeaveFieldAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, args), args, true, simulated); +export function applyPreLeaveFieldAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + return applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => + attr.applyPreLeaveField(pokemon, passive, simulated, args), + args, + true, + simulated + ); } -export function applyPreStatStageChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon | null, stat: BattleStat, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), args, false, simulated); +export function applyPreStatStageChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon | null, + stat: BattleStat, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), + args, + false, + simulated, + ); } -export function applyPostStatStageChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, stats: BattleStat[], stages: number, selfTarget: boolean, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, _passive) => attr.applyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), args, false, simulated); +export function applyPostStatStageChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stats: BattleStat[], + stages: integer, + selfTarget: boolean, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, _passive) => attr.applyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), + args, + false, + simulated, + ); } -export function applyPreSetStatusAbAttrs(attrType: Constructor, - pokemon: Pokemon, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), args, false, simulated); +export function applyPreSetStatusAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + effect: StatusEffect | undefined, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), + args, + false, + simulated, + ); } -export function applyPreApplyBattlerTagAbAttrs(attrType: Constructor, - pokemon: Pokemon, tag: BattlerTag, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), args, false, simulated); +export function applyPreApplyBattlerTagAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + tag: BattlerTag, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), + args, + false, + simulated, + ); } -export function applyPreWeatherEffectAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: Weather | null, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), args, true, simulated); +export function applyPreWeatherEffectAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: Weather | null, + cancelled: Utils.BooleanHolder, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), + args, + true, + simulated, + ); } -export function applyPostTurnAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTurn(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostTurnAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostTurn(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostWeatherChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: WeatherType, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, simulated, weather, args), args, false, simulated); +export function applyPostWeatherChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: WeatherType, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, simulated, weather, args), + args, + false, + simulated, + ); } -export function applyPostWeatherLapseAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: Weather | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, simulated, weather, args), args, false, simulated); +export function applyPostWeatherLapseAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: Weather | null, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, simulated, weather, args), + args, + false, + simulated, + ); } -export function applyPostTerrainChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, terrain: TerrainType, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, simulated, terrain, args), args, false, simulated); +export function applyPostTerrainChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + terrain: TerrainType, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, simulated, terrain, args), + args, + false, + simulated, + ); } -export function applyCheckTrappedAbAttrs(attrType: Constructor, - pokemon: Pokemon, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, messages: string[], simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), args, false, simulated, messages); +export function applyCheckTrappedAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + trapped: Utils.BooleanHolder, + otherPokemon: Pokemon, + messages: string[], + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), + args, + false, + simulated, + messages, + ); } -export function applyPostBattleAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattle(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostBattleAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostBattle(pokemon, passive, simulated, args), + args, + false, + simulated, + ); } -export function applyPostFaintAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker?: Pokemon, move?: Move, hitResult?: HitResult, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); +export function applyPostFaintAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker?: Pokemon, + move?: Move, + hitResult?: HitResult, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), + args, + false, + simulated, + ); } -export function applyPostItemLostAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostItemLost(pokemon, simulated, args), args); +export function applyPostItemLostAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated: boolean = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostItemLost(pokemon, simulated, args), + args, + ); } /** diff --git a/src/data/move.ts b/src/data/move.ts index acc68eb6a26..658534eb48f 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,5 +1,16 @@ -import { ChargeAnim, initMoveAnim, loadMoveAnimAssets, MoveChargeAnim } from "./battle-anims"; -import { CommandedTag, EncoreTag, GulpMissileTag, HelpingHandTag, SemiInvulnerableTag, ShellTrapTag, StockpilingTag, SubstituteTag, TrappedTag, TypeBoostTag } from "./battler-tags"; +import { ChargeAnim, MoveChargeAnim } from "./battle-anims"; +import { + CommandedTag, + EncoreTag, + GulpMissileTag, + HelpingHandTag, + SemiInvulnerableTag, + ShellTrapTag, + StockpilingTag, + SubstituteTag, + TrappedTag, + TypeBoostTag, +} from "./battler-tags"; import { getPokemonNameWithAffix } from "../messages"; import type { AttackMoveResult, TurnMove } from "../field/pokemon"; import type Pokemon from "../field/pokemon"; @@ -30,7 +41,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveUsedEvent } from "#app/events/battle-scene"; -import { BATTLE_STATS, type BattleStat, EFFECTIVE_STATS, type EffectiveStat, getStatKey, Stat } from "#app/enums/stat"; +import { BATTLE_STATS, type BattleStat, type EffectiveStat, getStatKey, Stat } from "#app/enums/stat"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; @@ -46,6 +57,10 @@ import { applyChallenges, ChallengeType } from "./challenge"; import { SwitchType } from "#enums/switch-type"; import { StatusEffect } from "#enums/status-effect"; import { globalScene } from "#app/global-scene"; +import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; +import { LoadMoveAnimPhase } from "#app/phases/load-move-anim-phase"; +import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; +import { MoveAnimPhase } from "#app/phases/move-anim-phase"; export enum MoveCategory { PHYSICAL, @@ -1057,7 +1072,7 @@ export abstract class MoveAttr { * @param args Set of unique arguments needed by this attribute * @returns true if application of the ability succeeds */ - apply(user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): boolean { return true; } @@ -1200,7 +1215,7 @@ export class MoveEffectAttr extends MoveAttr { } /** Applies move effects so long as they are able based on {@linkcode canApply} */ - apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { return this.canApply(user, target, move, args); } @@ -1866,7 +1881,7 @@ export class FlameBurstAttr extends MoveEffectAttr { * @param args - n/a * @returns A boolean indicating whether the effect was successfully applied. */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const targetAlly = target.getAlly(); const cancelled = new Utils.BooleanHolder(false); @@ -2406,32 +2421,27 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { this.chance = chance; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (move.hitsSubstitute(user, target)) { - return resolve(false); - } - const rand = Phaser.Math.RND.realInRange(0, 1); - if (rand >= this.chance) { - return resolve(false); - } - const heldItems = this.getTargetHeldItems(target).filter(i => i.isTransferable); - if (heldItems.length) { - const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; - const highestItemTier = heldItems.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is the bang after tier correct? - const tierHeldItems = heldItems.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); - const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; - globalScene.tryTransferHeldItemModifier(stolenItem, user, false).then(success => { - if (success) { - globalScene.queueMessage(i18next.t("moveTriggers:stoleItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: stolenItem.type.name })); - } - resolve(success); - }); - return; - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (move.hitsSubstitute(user, target)) { + return false; + } - resolve(false); - }); + const rand = Phaser.Math.RND.realInRange(0, 1); + if (rand >= this.chance) { + return false; + } + const heldItems = this.getTargetHeldItems(target).filter((i) => i.isTransferable); + if (heldItems.length) { + const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; + const highestItemTier = heldItems.map((m) => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is the bang after tier correct? + const tierHeldItems = heldItems.filter((m) => m.type.getOrInferTier(poolType) === highestItemTier); + const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; + if (globalScene.tryTransferHeldItemModifier(stolenItem, user, false)) { + globalScene.queueMessage(i18next.t("moveTriggers:stoleItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: stolenItem.type.name })); + return true; + } + } + return false; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -2875,9 +2885,7 @@ export class WeatherInstantChargeAttr extends InstantChargeAttr { } export class OverrideMoveEffectAttr extends MoveAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { - //const overridden = args[0] as Utils.BooleanHolder; - //const virtual = arg[1] as boolean; + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { return true; } } @@ -2903,26 +2911,27 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr { this.chargeText = chargeText; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { // Edge case for the move applied on a pokemon that has fainted if (!target) { - return Promise.resolve(true); + return true; } - const side = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - return new Promise(resolve => { - if (args.length < 2 || !args[1]) { - new MoveChargeAnim(this.chargeAnim, move.id, user).play(false, () => { - (args[0] as Utils.BooleanHolder).value = true; - globalScene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); - user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); - globalScene.arena.addTag(this.tagType, 3, move.id, user.id, side, false, target.getBattlerIndex()); - resolve(true); - }); - } else { - globalScene.ui.showText(i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(target.id) ?? undefined), moveName: move.name }), null, () => resolve(true)); - } - }); + const overridden = args[0] as Utils.BooleanHolder; + const virtual = args[1] as boolean; + + if (!virtual) { + overridden.value = true; + globalScene.unshiftPhase(new MoveAnimPhase(new MoveChargeAnim(this.chargeAnim, move.id, user))); + globalScene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); + user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); + const side = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + globalScene.arena.addTag(this.tagType, 3, move.id, user.id, side, false, target.getBattlerIndex()); + } else { + globalScene.queueMessage(i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(target.id) ?? undefined), moveName: move.name })); + } + + return true; } } @@ -3053,7 +3062,7 @@ export class StatStageChangeAttr extends MoveEffectAttr { * @param args unused * @returns whether stat stages were changed */ - apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { if (!super.apply(user, target, move, args) || (this.condition && !this.condition(user, target, move))) { return false; } @@ -3131,7 +3140,7 @@ export class SecretPowerAttr extends MoveEffectAttr { * Used to apply the secondary effect to the target Pokemon * @returns `true` if a secondary effect is successfully applied */ - override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } @@ -3286,8 +3295,8 @@ export class AcupressureStatStageChangeAttr extends MoveEffectAttr { super(); } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { - const randStats = BATTLE_STATS.filter(s => target.getStatStage(s) < 6); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const randStats = BATTLE_STATS.filter((s) => target.getStatStage(s) < 6); if (randStats.length > 0) { const boostStat = [ randStats[user.randSeedInt(randStats.length)] ]; globalScene.unshiftPhase(new StatStageChangePhase(target.getBattlerIndex(), this.selfTarget, boostStat, 2)); @@ -3324,17 +3333,14 @@ export class CutHpStatStageBoostAttr extends StatStageChangeAttr { this.messageCallback = messageCallback; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); - user.updateInfo().then(() => { - const ret = super.apply(user, target, move, args); - if (this.messageCallback) { - this.messageCallback(user); - } - resolve(ret); - }); - }); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); + user.updateInfo(); + const ret = super.apply(user, target, move, args); + if (this.messageCallback) { + this.messageCallback(user); + } + return ret; } getCondition(): MoveConditionFunc { @@ -3426,28 +3432,27 @@ export class ResetStatsAttr extends MoveEffectAttr { super(); this.targetAllPokemon = targetAllPokemon; } - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - const promises: Promise[] = []; - if (this.targetAllPokemon) { // Target all pokemon on the field when Freezy Frost or Haze are used + + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (this.targetAllPokemon) { + // Target all pokemon on the field when Freezy Frost or Haze are used const activePokemon = globalScene.getField(true); - activePokemon.forEach(p => promises.push(this.resetStats(p))); + activePokemon.forEach((p) => this.resetStats(p)); globalScene.queueMessage(i18next.t("moveTriggers:statEliminated")); } else { // Affects only the single target when Clear Smog is used if (!move.hitsSubstitute(user, target)) { - promises.push(this.resetStats(target)); + this.resetStats(target); globalScene.queueMessage(i18next.t("moveTriggers:resetStats", { pokemonName: getPokemonNameWithAffix(target) })); } } - - await Promise.all(promises); return true; } - async resetStats(pokemon: Pokemon): Promise { + private resetStats(pokemon: Pokemon): void { for (const s of BATTLE_STATS) { pokemon.setStatStage(s, 0); } - return pokemon.updateInfo(); + pokemon.updateInfo(); } } @@ -3503,43 +3508,28 @@ export class SwapStatStagesAttr extends MoveEffectAttr { } export class HpSplitAttr extends MoveEffectAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (!super.apply(user, target, move, args)) { - return resolve(false); - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } - const infoUpdates: Promise[] = []; - - const hpValue = Math.floor((target.hp + user.hp) / 2); - if (user.hp < hpValue) { - const healing = user.heal(hpValue - user.hp); + const hpValue = Math.floor((target.hp + user.hp) / 2); + [ user, target ].forEach((p) => { + if (p.hp < hpValue) { + const healing = p.heal(hpValue - p.hp); if (healing) { - globalScene.damageNumberHandler.add(user, healing, HitResult.HEAL); + globalScene.damageNumberHandler.add(p, healing, HitResult.HEAL); } - } else if (user.hp > hpValue) { - const damage = user.damage(user.hp - hpValue, true); + } else if (p.hp > hpValue) { + const damage = p.damage(p.hp - hpValue, true); if (damage) { - globalScene.damageNumberHandler.add(user, damage); + globalScene.damageNumberHandler.add(p, damage); } } - infoUpdates.push(user.updateInfo()); - - if (target.hp < hpValue) { - const healing = target.heal(hpValue - target.hp); - if (healing) { - globalScene.damageNumberHandler.add(user, healing, HitResult.HEAL); - } - } else if (target.hp > hpValue) { - const damage = target.damage(target.hp - hpValue, true); - if (damage) { - globalScene.damageNumberHandler.add(target, damage); - } - } - infoUpdates.push(target.updateInfo()); - - return Promise.all(infoUpdates).then(() => resolve(true)); + p.updateInfo(); }); + + return true; } } @@ -6024,44 +6014,44 @@ export class RevivalBlessingAttr extends MoveEffectAttr { * @param args N/A * @returns Promise, true if function succeeds. */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - // If user is player, checks if the user has fainted pokemon - if (user instanceof PlayerPokemon - && globalScene.getPlayerParty().findIndex(p => p.isFainted()) > -1) { - (user as PlayerPokemon).revivalBlessing().then(() => { - resolve(true); - }); - // If user is enemy, checks that it is a trainer, and it has fainted non-boss pokemon in party - } else if (user instanceof EnemyPokemon - && user.hasTrainer() - && globalScene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { - // Selects a random fainted pokemon - const faintedPokemon = globalScene.getEnemyParty().filter(p => p.isFainted() && !p.isBoss()); - const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; - const slotIndex = globalScene.getEnemyParty().findIndex(p => pokemon.id === p.id); - pokemon.resetStatus(); - pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); - globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: getPokemonNameWithAffix(pokemon) }), 0, true); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + // If user is player, checks if the user has fainted pokemon + if (user instanceof PlayerPokemon) { + globalScene.unshiftPhase(new RevivalBlessingPhase(user)); + return true; + } else if (user instanceof EnemyPokemon && user.hasTrainer() && globalScene.getEnemyParty().findIndex((p) => p.isFainted() && !p.isBoss()) > -1) { + // If used by an enemy trainer with at least one fainted non-boss Pokemon, this + // revives one of said Pokemon selected at random. + const faintedPokemon = globalScene.getEnemyParty().filter((p) => p.isFainted() && !p.isBoss()); + const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; + const slotIndex = globalScene.getEnemyParty().findIndex((p) => pokemon.id === p.id); + pokemon.resetStatus(); + pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); + globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: getPokemonNameWithAffix(pokemon) }), 0, true); - if (globalScene.currentBattle.double && globalScene.getEnemyParty().length > 1) { - const allyPokemon = user.getAlly(); - if (slotIndex <= 1) { - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, false)); - } else if (allyPokemon.isFainted()) { - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, false)); - } + if (globalScene.currentBattle.double && globalScene.getEnemyParty().length > 1) { + const allyPokemon = user.getAlly(); + if (slotIndex <= 1) { + globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, false)); + } else if (allyPokemon.isFainted()) { + globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, false)); } - resolve(true); - } else { - globalScene.queueMessage(i18next.t("battle:attackFailed")); - resolve(false); } - }); + return true; + } + return false; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - if (user.hasTrainer() && globalScene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { + getCondition(): MoveConditionFunc { + return (user, target, move) => + (user instanceof PlayerPokemon && globalScene.getPlayerParty().some((p) => p.isFainted())) || + (user instanceof EnemyPokemon && + user.hasTrainer() && + globalScene.getEnemyParty().some((p) => p.isFainted() && !p.isBoss())); + } + + override getUserBenefitScore(user: Pokemon, _target: Pokemon, _move: Move): number { + if (user.hasTrainer() && globalScene.getEnemyParty().some((p) => p.isFainted() && !p.isBoss())) { return 20; } @@ -6579,7 +6569,7 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { class CallMoveAttr extends OverrideMoveEffectAttr { protected invalidMoves: Moves[]; protected hasTarget: boolean; - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const replaceMoveTarget = move.moveTarget === MoveTarget.NEAR_OTHER ? MoveTarget.NEAR_ENEMY : undefined; const moveTargets = getMoveTargets(user, move.id, replaceMoveTarget); if (moveTargets.targets.length === 0) { @@ -6589,11 +6579,8 @@ class CallMoveAttr extends OverrideMoveEffectAttr { ? moveTargets.targets : [ this.hasTarget ? target.getBattlerIndex() : moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; // account for Mirror Move having a target already user.getMoveQueue().push({ move: move.id, targets: targets, virtual: true, ignorePP: true }); + globalScene.unshiftPhase(new LoadMoveAnimPhase(move.id)); globalScene.unshiftPhase(new MovePhase(user, targets, new PokemonMove(move.id, 0, 0, true), true, true)); - - await Promise.resolve(initMoveAnim(move.id).then(() => { - loadMoveAnimAssets([ move.id ], true); - })); return true; } } @@ -6626,7 +6613,7 @@ export class RandomMoveAttr extends CallMoveAttr { * @param move Move being used * @param args Unused */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveIds = Utils.getEnumValues(Moves).map(m => !this.invalidMoves.includes(m) && !allMoves[m].name.endsWith(" (N)") ? m : Moves.NONE); let moveId: Moves = Moves.NONE; do { @@ -6663,7 +6650,7 @@ export class RandomMovesetMoveAttr extends CallMoveAttr { * @param move Move being used * @param args Unused */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { return super.apply(user, target, allMoves[this.moveId], args); } @@ -6965,145 +6952,141 @@ const invalidCopycatMoves = [ ]; export class NaturePowerAttr extends OverrideMoveEffectAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - let moveId; - switch (globalScene.arena.getTerrainType()) { - // this allows terrains to 'override' the biome move - case TerrainType.NONE: - switch (globalScene.arena.biomeType) { - case Biome.TOWN: - moveId = Moves.ROUND; - break; - case Biome.METROPOLIS: - moveId = Moves.TRI_ATTACK; - break; - case Biome.SLUM: - moveId = Moves.SLUDGE_BOMB; - break; - case Biome.PLAINS: - moveId = Moves.SILVER_WIND; - break; - case Biome.GRASS: - moveId = Moves.GRASS_KNOT; - break; - case Biome.TALL_GRASS: - moveId = Moves.POLLEN_PUFF; - break; - case Biome.MEADOW: - moveId = Moves.GIGA_DRAIN; - break; - case Biome.FOREST: - moveId = Moves.BUG_BUZZ; - break; - case Biome.JUNGLE: - moveId = Moves.LEAF_STORM; - break; - case Biome.SEA: - moveId = Moves.HYDRO_PUMP; - break; - case Biome.SWAMP: - moveId = Moves.MUD_BOMB; - break; - case Biome.BEACH: - moveId = Moves.SCALD; - break; - case Biome.LAKE: - moveId = Moves.BUBBLE_BEAM; - break; - case Biome.SEABED: - moveId = Moves.BRINE; - break; - case Biome.ISLAND: - moveId = Moves.LEAF_TORNADO; - break; - case Biome.MOUNTAIN: - moveId = Moves.AIR_SLASH; - break; - case Biome.BADLANDS: - moveId = Moves.EARTH_POWER; - break; - case Biome.DESERT: - moveId = Moves.SCORCHING_SANDS; - break; - case Biome.WASTELAND: - moveId = Moves.DRAGON_PULSE; - break; - case Biome.CONSTRUCTION_SITE: - moveId = Moves.STEEL_BEAM; - break; - case Biome.CAVE: - moveId = Moves.POWER_GEM; - break; - case Biome.ICE_CAVE: - moveId = Moves.ICE_BEAM; - break; - case Biome.SNOWY_FOREST: - moveId = Moves.FROST_BREATH; - break; - case Biome.VOLCANO: - moveId = Moves.LAVA_PLUME; - break; - case Biome.GRAVEYARD: - moveId = Moves.SHADOW_BALL; - break; - case Biome.RUINS: - moveId = Moves.ANCIENT_POWER; - break; - case Biome.TEMPLE: - moveId = Moves.EXTRASENSORY; - break; - case Biome.DOJO: - moveId = Moves.FOCUS_BLAST; - break; - case Biome.FAIRY_CAVE: - moveId = Moves.ALLURING_VOICE; - break; - case Biome.ABYSS: - moveId = Moves.OMINOUS_WIND; - break; - case Biome.SPACE: - moveId = Moves.DRACO_METEOR; - break; - case Biome.FACTORY: - moveId = Moves.FLASH_CANNON; - break; - case Biome.LABORATORY: - moveId = Moves.ZAP_CANNON; - break; - case Biome.POWER_PLANT: - moveId = Moves.CHARGE_BEAM; - break; - case Biome.END: - moveId = Moves.ETERNABEAM; - break; - } - break; - case TerrainType.MISTY: - moveId = Moves.MOONBLAST; - break; - case TerrainType.ELECTRIC: - moveId = Moves.THUNDERBOLT; - break; - case TerrainType.GRASSY: - moveId = Moves.ENERGY_BALL; - break; - case TerrainType.PSYCHIC: - moveId = Moves.PSYCHIC; - break; - default: - // Just in case there's no match - moveId = Moves.TRI_ATTACK; - break; - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + let moveId; + switch (globalScene.arena.getTerrainType()) { + // this allows terrains to 'override' the biome move + case TerrainType.NONE: + switch (globalScene.arena.biomeType) { + case Biome.TOWN: + moveId = Moves.ROUND; + break; + case Biome.METROPOLIS: + moveId = Moves.TRI_ATTACK; + break; + case Biome.SLUM: + moveId = Moves.SLUDGE_BOMB; + break; + case Biome.PLAINS: + moveId = Moves.SILVER_WIND; + break; + case Biome.GRASS: + moveId = Moves.GRASS_KNOT; + break; + case Biome.TALL_GRASS: + moveId = Moves.POLLEN_PUFF; + break; + case Biome.MEADOW: + moveId = Moves.GIGA_DRAIN; + break; + case Biome.FOREST: + moveId = Moves.BUG_BUZZ; + break; + case Biome.JUNGLE: + moveId = Moves.LEAF_STORM; + break; + case Biome.SEA: + moveId = Moves.HYDRO_PUMP; + break; + case Biome.SWAMP: + moveId = Moves.MUD_BOMB; + break; + case Biome.BEACH: + moveId = Moves.SCALD; + break; + case Biome.LAKE: + moveId = Moves.BUBBLE_BEAM; + break; + case Biome.SEABED: + moveId = Moves.BRINE; + break; + case Biome.ISLAND: + moveId = Moves.LEAF_TORNADO; + break; + case Biome.MOUNTAIN: + moveId = Moves.AIR_SLASH; + break; + case Biome.BADLANDS: + moveId = Moves.EARTH_POWER; + break; + case Biome.DESERT: + moveId = Moves.SCORCHING_SANDS; + break; + case Biome.WASTELAND: + moveId = Moves.DRAGON_PULSE; + break; + case Biome.CONSTRUCTION_SITE: + moveId = Moves.STEEL_BEAM; + break; + case Biome.CAVE: + moveId = Moves.POWER_GEM; + break; + case Biome.ICE_CAVE: + moveId = Moves.ICE_BEAM; + break; + case Biome.SNOWY_FOREST: + moveId = Moves.FROST_BREATH; + break; + case Biome.VOLCANO: + moveId = Moves.LAVA_PLUME; + break; + case Biome.GRAVEYARD: + moveId = Moves.SHADOW_BALL; + break; + case Biome.RUINS: + moveId = Moves.ANCIENT_POWER; + break; + case Biome.TEMPLE: + moveId = Moves.EXTRASENSORY; + break; + case Biome.DOJO: + moveId = Moves.FOCUS_BLAST; + break; + case Biome.FAIRY_CAVE: + moveId = Moves.ALLURING_VOICE; + break; + case Biome.ABYSS: + moveId = Moves.OMINOUS_WIND; + break; + case Biome.SPACE: + moveId = Moves.DRACO_METEOR; + break; + case Biome.FACTORY: + moveId = Moves.FLASH_CANNON; + break; + case Biome.LABORATORY: + moveId = Moves.ZAP_CANNON; + break; + case Biome.POWER_PLANT: + moveId = Moves.CHARGE_BEAM; + break; + case Biome.END: + moveId = Moves.ETERNABEAM; + break; + } + break; + case TerrainType.MISTY: + moveId = Moves.MOONBLAST; + break; + case TerrainType.ELECTRIC: + moveId = Moves.THUNDERBOLT; + break; + case TerrainType.GRASSY: + moveId = Moves.ENERGY_BALL; + break; + case TerrainType.PSYCHIC: + moveId = Moves.PSYCHIC; + break; + default: + // Just in case there's no match + moveId = Moves.TRI_ATTACK; + break; + } - user.getMoveQueue().push({ move: moveId, targets: [ target.getBattlerIndex() ], ignorePP: true }); - globalScene.unshiftPhase(new MovePhase(user, [ target.getBattlerIndex() ], new PokemonMove(moveId, 0, 0, true), true)); - initMoveAnim(moveId).then(() => { - loadMoveAnimAssets([ moveId ], true) - .then(() => resolve(true)); - }); - }); + user.getMoveQueue().push({ move: moveId, targets: [ target.getBattlerIndex() ], ignorePP: true }); + globalScene.unshiftPhase(new LoadMoveAnimPhase(moveId)); + globalScene.unshiftPhase(new MovePhase(user, [ target.getBattlerIndex() ], new PokemonMove(moveId, 0, 0, true), true)); + return true; } } @@ -7121,7 +7104,7 @@ export class CopyMoveAttr extends CallMoveAttr { this.invalidMoves = invalidMoves; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { this.hasTarget = this.mirrorMove; const lastMove = this.mirrorMove ? target.getLastXMoves()[0].move : globalScene.currentBattle.lastMove; return super.apply(user, target, allMoves[lastMove], args); @@ -7682,50 +7665,15 @@ export class SuppressAbilitiesIfActedAttr extends MoveEffectAttr { * Used by Transform */ export class TransformAttr extends MoveEffectAttr { - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } - const promises: Promise[] = []; - user.summonData.speciesForm = target.getSpeciesForm(); - user.summonData.gender = target.getGender(); - - // Power Trick's effect will not preserved after using Transform - user.removeTag(BattlerTagType.POWER_TRICK); - - // Copy all stats (except HP) - for (const s of EFFECTIVE_STATS) { - user.setStat(s, target.getStat(s, false), false); - } - - // Copy all stat stages - for (const s of BATTLE_STATS) { - user.setStatStage(s, target.getStatStage(s)); - } - - 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()); + globalScene.unshiftPhase(new PokemonTransformPhase(user.getBattlerIndex(), target.getBattlerIndex())); globalScene.queueMessage(i18next.t("moveTriggers:transformedIntoTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); - promises.push(user.loadAssets(false).then(() => { - user.playAnim(); - user.updateInfo(); - // If the new ability activates immediately, it needs to happen after all the transform animations - user.setTempAbility(target.getAbility()); - })); - - await Promise.all(promises); return true; } } @@ -8128,44 +8076,54 @@ const attackedByItemMessageFunc = (user: Pokemon, target: Pokemon, move: Move) = export type MoveAttrFilter = (attr: MoveAttr) => boolean; -function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): Promise { - return new Promise(resolve => { - const attrPromises: Promise[] = []; - const moveAttrs = move.attrs.filter(a => attrFilter(a)); - for (const attr of moveAttrs) { - const result = attr.apply(user, target, move, args); - if (result instanceof Promise) { - attrPromises.push(result); - } - } - Promise.allSettled(attrPromises).then(() => resolve()); - }); +function applyMoveAttrsInternal( + attrFilter: MoveAttrFilter, + user: Pokemon | null, + target: Pokemon | null, + move: Move, + args: any[], +): void { + move.attrs.filter((attr) => attrFilter(attr)).forEach((attr) => attr.apply(user, target, move, args)); } -function applyMoveChargeAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: ChargingMove, args: any[]): Promise { - return new Promise(resolve => { - const chargeAttrPromises: Promise[] = []; - const chargeMoveAttrs = move.chargeAttrs.filter(a => attrFilter(a)); - for (const attr of chargeMoveAttrs) { - const result = attr.apply(user, target, move, args); - if (result instanceof Promise) { - chargeAttrPromises.push(result); - } - } - Promise.allSettled(chargeAttrPromises).then(() => resolve()); - }); +function applyMoveChargeAttrsInternal( + attrFilter: MoveAttrFilter, + user: Pokemon | null, + target: Pokemon | null, + move: ChargingMove, + args: any[], +): void { + move.chargeAttrs.filter((attr) => attrFilter(attr)).forEach((attr) => attr.apply(user, target, move, args)); } -export function applyMoveAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: Move, ...args: any[]): Promise { - return applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); +export function applyMoveAttrs( + attrType: Constructor, + user: Pokemon | null, + target: Pokemon | null, + move: Move, + ...args: any[] +): void { + applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } -export function applyFilteredMoveAttrs(attrFilter: MoveAttrFilter, user: Pokemon, target: Pokemon | null, move: Move, ...args: any[]): Promise { - return applyMoveAttrsInternal(attrFilter, user, target, move, args); +export function applyFilteredMoveAttrs( + attrFilter: MoveAttrFilter, + user: Pokemon, + target: Pokemon | null, + move: Move, + ...args: any[] +): void { + applyMoveAttrsInternal(attrFilter, user, target, move, args); } -export function applyMoveChargeAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: ChargingMove, ...args: any[]): Promise { - return applyMoveChargeAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); +export function applyMoveChargeAttrs( + attrType: Constructor, + user: Pokemon | null, + target: Pokemon | null, + move: ChargingMove, + ...args: any[] +): void { + applyMoveChargeAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } export class MoveCondition { diff --git a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts index ca6b384cfbb..7d3f6f4c5bc 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -151,7 +151,7 @@ async function spawnNextTrainerOrEndEncounter() { // Give 10x Voucher const newModifier = modifierTypes.VOUCHER_PREMIUM().newModifier(); - await globalScene.addModifier(newModifier); + globalScene.addModifier(newModifier); globalScene.playSound("item_fanfare"); await showEncounterText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name })); diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index f7c70cb7052..454d179c003 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -406,7 +406,7 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { // Copy old items to new pokemon for (const item of transformation.heldItems) { item.pokemonId = newPokemon.id; - await globalScene.addModifier(item, false, false, false, true); + globalScene.addModifier(item, false, false, false, true); } // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats if (shouldGetOldGateau(newPokemon)) { @@ -416,7 +416,7 @@ async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU); const modifier = modType?.newModifier(newPokemon); if (modifier) { - await globalScene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); } } diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 580aaaf2cc6..be7d11d6cf1 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -326,7 +326,7 @@ export async function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: numb ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_SHUCKLE_JUICE); const modifier = modType?.newModifier(pokemon); if (modifier) { - await globalScene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); pokemon.calculateStats(); } } @@ -359,7 +359,7 @@ export async function applyModifierTypeToPlayerPokemon(pokemon: PlayerPokemon, m return applyModifierTypeToPlayerPokemon(pokemon, fallbackModifierType); } - await globalScene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); } /** diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 246f82b8164..214c667f1c1 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -104,7 +104,6 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; -import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; import { Challenges } from "#enums/challenges"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; @@ -4510,43 +4509,6 @@ export class PlayerPokemon extends Pokemon { this.friendship = Math.max(this.friendship + friendship, 0); } } - /** - * Handles Revival Blessing when used by player. - * @returns Promise to revive a pokemon. - * @see {@linkcode RevivalBlessingAttr} - */ - revivalBlessing(): Promise { - return new Promise(resolve => { - globalScene.ui.setMode(Mode.PARTY, PartyUiMode.REVIVAL_BLESSING, this.getFieldIndex(), (slotIndex:number, option: PartyOption) => { - if (slotIndex >= 0 && slotIndex < 6) { - const pokemon = globalScene.getPlayerParty()[slotIndex]; - if (!pokemon || !pokemon.isFainted()) { - resolve(); - } - - pokemon.resetTurnData(); - pokemon.resetStatus(); - pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); - globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: pokemon.name }), 0, true); - - if (globalScene.currentBattle.double && globalScene.getPlayerParty().length > 1) { - const allyPokemon = this.getAlly(); - if (slotIndex <= 1) { - // Revived ally pokemon - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, true)); - globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); - } else if (allyPokemon.isFainted()) { - // Revived party pokemon, and ally pokemon is fainted - globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, true)); - globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); - } - } - - } - globalScene.ui.setMode(Mode.MESSAGE).then(() => resolve()); - }, PartyUiHandler.FilterFainted); - }); - } getPossibleEvolution(evolution: SpeciesFormEvolution | null): Promise { if (!evolution) { @@ -4728,70 +4690,62 @@ export class PlayerPokemon extends Pokemon { } /** - * Returns a Promise to fuse two PlayerPokemon together - * @param pokemon The PlayerPokemon to fuse to this one - */ - fuse(pokemon: PlayerPokemon): Promise { - return new Promise(resolve => { - this.fusionSpecies = pokemon.species; - this.fusionFormIndex = pokemon.formIndex; - this.fusionAbilityIndex = pokemon.abilityIndex; - this.fusionShiny = pokemon.shiny; - this.fusionVariant = pokemon.variant; - this.fusionGender = pokemon.gender; - this.fusionLuck = pokemon.luck; - this.fusionCustomPokemonData = pokemon.customPokemonData; - if ((pokemon.pauseEvolutions) || (this.pauseEvolutions)) { - this.pauseEvolutions = true; - } + * Returns a Promise to fuse two PlayerPokemon together + * @param pokemon The PlayerPokemon to fuse to this one + */ + fuse(pokemon: PlayerPokemon): void { + this.fusionSpecies = pokemon.species; + this.fusionFormIndex = pokemon.formIndex; + this.fusionAbilityIndex = pokemon.abilityIndex; + this.fusionShiny = pokemon.shiny; + this.fusionVariant = pokemon.variant; + this.fusionGender = pokemon.gender; + this.fusionLuck = pokemon.luck; + this.fusionCustomPokemonData = pokemon.customPokemonData; + if (pokemon.pauseEvolutions || this.pauseEvolutions) { + this.pauseEvolutions = true; + } - globalScene.validateAchv(achvs.SPLICE); - globalScene.gameData.gameStats.pokemonFused++; + globalScene.validateAchv(achvs.SPLICE); + globalScene.gameData.gameStats.pokemonFused++; - // Store the average HP% that each Pokemon has - const maxHp = this.getMaxHp(); - const newHpPercent = ((pokemon.hp / pokemon.getMaxHp()) + (this.hp / maxHp)) / 2; + // Store the average HP% that each Pokemon has + const maxHp = this.getMaxHp(); + const newHpPercent = (pokemon.hp / pokemon.getMaxHp() + this.hp / maxHp) / 2; - this.generateName(); - this.calculateStats(); + this.generateName(); + this.calculateStats(); - // Set this Pokemon's HP to the average % of both fusion components - this.hp = Math.round(maxHp * newHpPercent); - if (!this.isFainted()) { - // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum - this.hp = Math.min(this.hp, maxHp); - this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two - } else if (!pokemon.isFainted()) { - // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero - this.hp = Math.max(this.hp, 1); - this.status = pokemon.status; // Inherit the other Pokemon's status - } + // Set this Pokemon's HP to the average % of both fusion components + this.hp = Math.round(maxHp * newHpPercent); + if (!this.isFainted()) { + // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum + this.hp = Math.min(this.hp, maxHp); + this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two + } else if (!pokemon.isFainted()) { + // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero + this.hp = Math.max(this.hp, 1); + this.status = pokemon.status; // Inherit the other Pokemon's status + } - this.generateCompatibleTms(); - this.updateInfo(true); - const fusedPartyMemberIndex = globalScene.getPlayerParty().indexOf(pokemon); - let partyMemberIndex = globalScene.getPlayerParty().indexOf(this); - if (partyMemberIndex > fusedPartyMemberIndex) { - partyMemberIndex--; - } - const fusedPartyMemberHeldModifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; - const transferModifiers: Promise[] = []; - for (const modifier of fusedPartyMemberHeldModifiers) { - transferModifiers.push(globalScene.tryTransferHeldItemModifier(modifier, this, false, modifier.getStackCount(), true, true, false)); - } - Promise.allSettled(transferModifiers).then(() => { - globalScene.updateModifiers(true, true).then(() => { - globalScene.removePartyMemberModifiers(fusedPartyMemberIndex); - globalScene.getPlayerParty().splice(fusedPartyMemberIndex, 1)[0]; - const newPartyMemberIndex = globalScene.getPlayerParty().indexOf(this); - pokemon.getMoveset(true).map((m: PokemonMove) => globalScene.unshiftPhase(new LearnMovePhase(newPartyMemberIndex, m.getMove().id))); - pokemon.destroy(); - this.updateFusionPalette(); - resolve(); - }); - }); - }); + this.generateCompatibleTms(); + this.updateInfo(true); + const fusedPartyMemberIndex = globalScene.getPlayerParty().indexOf(pokemon); + let partyMemberIndex = globalScene.getPlayerParty().indexOf(this); + if (partyMemberIndex > fusedPartyMemberIndex) { + partyMemberIndex--; + } + const fusedPartyMemberHeldModifiers = globalScene.findModifiers((m) => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + for (const modifier of fusedPartyMemberHeldModifiers) { + globalScene.tryTransferHeldItemModifier(modifier, this, false, modifier.getStackCount(), true, true, false); + } + globalScene.updateModifiers(true, true); + globalScene.removePartyMemberModifiers(fusedPartyMemberIndex); + globalScene.getPlayerParty().splice(fusedPartyMemberIndex, 1)[0]; + const newPartyMemberIndex = globalScene.getPlayerParty().indexOf(this); + pokemon.getMoveset(true).map((m: PokemonMove) => globalScene.unshiftPhase(new LearnMovePhase(newPartyMemberIndex, m.getMove().id))); + pokemon.destroy(); + this.updateFusionPalette(); } unfuse(): Promise { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 3af2aa2144f..f6a69fcca2d 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -158,7 +158,7 @@ export abstract class Modifier { * Handles applying of {@linkcode Modifier} * @param args collection of all passed parameters */ - abstract apply(...args: unknown[]): boolean | Promise; + abstract apply(...args: unknown[]): boolean; } export abstract class PersistentModifier extends Modifier { @@ -1949,7 +1949,7 @@ export abstract class ConsumablePokemonModifier extends ConsumableModifier { * @param playerPokemon The {@linkcode PlayerPokemon} that consumes the item * @param args Additional arguments passed to {@linkcode ConsumablePokemonModifier.apply} */ - abstract override apply(playerPokemon: PlayerPokemon, ...args: unknown[]): boolean | Promise; + abstract override apply(playerPokemon: PlayerPokemon, ...args: unknown[]): boolean; getPokemon() { return globalScene.getPlayerParty().find(p => p.id === this.pokemonId); @@ -2288,8 +2288,8 @@ export class FusePokemonModifier extends ConsumablePokemonModifier { * @param playerPokemon2 {@linkcode PlayerPokemon} that should be fused with {@linkcode playerPokemon} * @returns always Promise */ - override async apply(playerPokemon: PlayerPokemon, playerPokemon2: PlayerPokemon): Promise { - await playerPokemon.fuse(playerPokemon2); + override apply(playerPokemon: PlayerPokemon, playerPokemon2: PlayerPokemon): boolean { + playerPokemon.fuse(playerPokemon2); return true; } } @@ -3136,8 +3136,6 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { let highestItemTier = itemModifiers.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is this bang correct? let tierItemModifiers = itemModifiers.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); - const heldItemTransferPromises: Promise[] = []; - for (let i = 0; i < transferredItemCount; i++) { if (!tierItemModifiers.length) { while (highestItemTier-- && !tierItemModifiers.length) { @@ -3149,19 +3147,15 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { } const randItemIndex = pokemon.randSeedInt(itemModifiers.length); const randItem = itemModifiers[randItemIndex]; - heldItemTransferPromises.push(globalScene.tryTransferHeldItemModifier(randItem, pokemon, false).then(success => { - if (success) { - transferredModifierTypes.push(randItem.type); - itemModifiers.splice(randItemIndex, 1); - } - })); + if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, false)) { + transferredModifierTypes.push(randItem.type); + itemModifiers.splice(randItemIndex, 1); + } } - Promise.all(heldItemTransferPromises).then(() => { - for (const mt of transferredModifierTypes) { - globalScene.queueMessage(this.getTransferMessage(pokemon, targetPokemon, mt)); - } - }); + for (const mt of transferredModifierTypes) { + globalScene.queueMessage(this.getTransferMessage(pokemon, targetPokemon, mt)); + } return !!transferredModifierTypes.length; } diff --git a/src/phases/add-enemy-buff-modifier-phase.ts b/src/phases/add-enemy-buff-modifier-phase.ts index d79b4f6eca5..f504fd0aaa2 100644 --- a/src/phases/add-enemy-buff-modifier-phase.ts +++ b/src/phases/add-enemy-buff-modifier-phase.ts @@ -21,6 +21,7 @@ export class AddEnemyBuffModifierPhase extends Phase { for (let i = 0; i < count; i++) { globalScene.addEnemyModifier(getEnemyBuffModifierForWave(tier, globalScene.findModifiers(m => m instanceof EnemyPersistentModifier, false)), true, true); } - globalScene.updateModifiers(false, true).then(() => this.end()); + globalScene.updateModifiers(false, true); + this.end(); } } diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts index edffd8498d6..c0922b91809 100644 --- a/src/phases/battle-end-phase.ts +++ b/src/phases/battle-end-phase.ts @@ -63,6 +63,7 @@ export class BattleEndPhase extends BattlePhase { } } - globalScene.updateModifiers().then(() => this.end()); + globalScene.updateModifiers(); + this.end(); } } diff --git a/src/phases/game-over-modifier-reward-phase.ts b/src/phases/game-over-modifier-reward-phase.ts index c98bb5fff04..93f53bf38c0 100644 --- a/src/phases/game-over-modifier-reward-phase.ts +++ b/src/phases/game-over-modifier-reward-phase.ts @@ -12,16 +12,22 @@ export class GameOverModifierRewardPhase extends ModifierRewardPhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - globalScene.addModifier(newModifier).then(() => { - // Sound loaded into game as is - globalScene.playSound("level_up_fanfare"); - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.fadeIn(250).then(() => { - globalScene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => { + globalScene.addModifier(newModifier); + // Sound loaded into game as is + globalScene.playSound("level_up_fanfare"); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.fadeIn(250).then(() => { + globalScene.ui.showText( + i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), + null, + () => { globalScene.time.delayedCall(1500, () => globalScene.arenaBg.setVisible(true)); resolve(); - }, null, true, 1500); - }); + }, + null, + true, + 1500, + ); }); }); } diff --git a/src/phases/load-move-anim-phase.ts b/src/phases/load-move-anim-phase.ts new file mode 100644 index 00000000000..66cb90744e0 --- /dev/null +++ b/src/phases/load-move-anim-phase.ts @@ -0,0 +1,20 @@ +import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +import type { Moves } from "#enums/moves"; +import { Phase } from "#app/phase"; + +/** + * Phase for synchronous move animation loading. + * Should be used when a move invokes another move that + * isn't already loaded (e.g. for Metronome) + */ +export class LoadMoveAnimPhase extends Phase { + constructor(protected moveId: Moves) { + super(); + } + + public override start(): void { + initMoveAnim(this.moveId) + .then(() => loadMoveAnimAssets([ this.moveId ], true)) + .then(() => this.end()); + } +} diff --git a/src/phases/modifier-reward-phase.ts b/src/phases/modifier-reward-phase.ts index 1cdfd6b2721..e4fac33767f 100644 --- a/src/phases/modifier-reward-phase.ts +++ b/src/phases/modifier-reward-phase.ts @@ -22,10 +22,9 @@ export class ModifierRewardPhase extends BattlePhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - globalScene.addModifier(newModifier).then(() => { - globalScene.playSound("item_fanfare"); - globalScene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); - }); + globalScene.addModifier(newModifier); + globalScene.playSound("item_fanfare"); + globalScene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); }); } } diff --git a/src/phases/move-anim-phase.ts b/src/phases/move-anim-phase.ts new file mode 100644 index 00000000000..005445924a0 --- /dev/null +++ b/src/phases/move-anim-phase.ts @@ -0,0 +1,20 @@ +import type { MoveAnim } from "#app/data/battle-anims"; +import { Phase } from "#app/phase"; + +/** + * Plays the given {@linkcode MoveAnim} sequentially. + */ +export class MoveAnimPhase extends Phase { + constructor( + protected anim: Anim, + protected onSubstitute: boolean = false, + ) { + super(); + } + + public override start(): void { + super.start(); + + this.anim.play(this.onSubstitute, () => this.end()); + } +} diff --git a/src/phases/move-charge-phase.ts b/src/phases/move-charge-phase.ts index b0925f1f6cb..6eccdd20254 100644 --- a/src/phases/move-charge-phase.ts +++ b/src/phases/move-charge-phase.ts @@ -44,10 +44,9 @@ export class MoveChargePhase extends PokemonPhase { new MoveChargeAnim(move.chargeAnim, move.id, user).play(false, () => { move.showChargeText(user, target); - applyMoveChargeAttrs(MoveEffectAttr, user, target, move).then(() => { - user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); - this.end(); - }); + applyMoveChargeAttrs(MoveEffectAttr, user, target, move); + user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); + this.end(); }); } diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 65d8d95cde6..f878cb40e2e 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -61,7 +61,7 @@ import { PokemonMultiHitModifier, } from "#app/modifier/modifier"; import { PokemonPhase } from "#app/phases/pokemon-phase"; -import { BooleanHolder, executeIf, isNullOrUndefined, NumberHolder } from "#app/utils"; +import { BooleanHolder, isNullOrUndefined, NumberHolder } from "#app/utils"; import { type nil } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import type { Moves } from "#enums/moves"; @@ -143,86 +143,86 @@ export class MoveEffectPhase extends PokemonPhase { const move = this.move.getMove(); // Assume single target for override - applyMoveAttrs(OverrideMoveEffectAttr, user, this.getFirstTarget() ?? null, move, overridden, this.move.virtual).then(() => { - // If other effects were overriden, stop this phase before they can be applied - if (overridden.value) { - return this.end(); + applyMoveAttrs(OverrideMoveEffectAttr, user, this.getFirstTarget() ?? null, move, overridden, this.move.virtual); + + // If other effects were overriden, stop this phase before they can be applied + if (overridden.value) { + return this.end(); + } + + user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); + + // If the user is acting again (such as due to Instruct), reset hitsLeft/hitCount so that + // the move executes correctly (ensures all hits of a multi-hit are properly calculated) + if (user.turnData.hitsLeft === 0 && user.turnData.hitCount > 0 && user.turnData.extraTurns > 0) { + user.turnData.hitsLeft = -1; + user.turnData.hitCount = 0; + user.turnData.extraTurns--; + } + + /** + * If this phase is for the first hit of the invoked move, + * resolve the move's total hit count. This block combines the + * effects of the move itself, Parental Bond, and Multi-Lens to do so. + */ + if (user.turnData.hitsLeft === -1) { + const hitCount = new NumberHolder(1); + // Assume single target for multi hit + applyMoveAttrs(MultiHitAttr, user, this.getFirstTarget() ?? null, move, hitCount); + // If Parental Bond is applicable, add another hit + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, hitCount, null); + // If Multi-Lens is applicable, add hits equal to the number of held Multi-Lenses + globalScene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, move.id, hitCount); + // Set the user's relevant turnData fields to reflect the final hit count + user.turnData.hitCount = hitCount.value; + user.turnData.hitsLeft = hitCount.value; + } + + /** + * Log to be entered into the user's move history once the move result is resolved. + * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully + * used in the sense of "Does it have an effect on the user?". + */ + const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; + + /** + * Stores results of hit checks of the invoked move against all targets, organized by battler index. + * @see {@linkcode hitCheck} + */ + const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); + const hasActiveTargets = targets.some(t => t.isActive(true)); + + /** Check if the target is immune via ability to the attacking move, and NOT in semi invulnerable state */ + const isImmune = targets[0]?.hasAbilityWithAttr(TypeImmunityAbAttr) + && (targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) + && !targets[0]?.getTag(SemiInvulnerableTag); + + const mayBounce = move.hasFlag(MoveFlags.REFLECTABLE) && !this.reflected && targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); + + /** + * If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target + * (and not random target) and failed the hit check against its target (MISS), log the move + * as FAILed or MISSed (depending on the conditions above) and end this phase. + */ + if (!hasActiveTargets || (!mayBounce && !move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { + this.stopMultiHit(); + if (hasActiveTargets) { + globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" })); + moveHistoryEntry.result = MoveResult.MISS; + applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); + } else { + globalScene.queueMessage(i18next.t("battle:attackFailed")); + moveHistoryEntry.result = MoveResult.FAIL; } + user.pushMoveHistory(moveHistoryEntry); + return this.end(); + } - user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); - - // If the user is acting again (such as due to Instruct), reset hitsLeft/hitCount so that - // the move executes correctly (ensures all hits of a multi-hit are properly calculated) - if (user.turnData.hitsLeft === 0 && user.turnData.hitCount > 0 && user.turnData.extraTurns > 0) { - user.turnData.hitsLeft = -1; - user.turnData.hitCount = 0; - user.turnData.extraTurns--; - } - - /** - * If this phase is for the first hit of the invoked move, - * resolve the move's total hit count. This block combines the - * effects of the move itself, Parental Bond, and Multi-Lens to do so. - */ - if (user.turnData.hitsLeft === -1) { - const hitCount = new NumberHolder(1); - // Assume single target for multi hit - applyMoveAttrs(MultiHitAttr, user, this.getFirstTarget() ?? null, move, hitCount); - // If Parental Bond is applicable, add another hit - applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, hitCount, null); - // If Multi-Lens is applicable, add hits equal to the number of held Multi-Lenses - globalScene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, move.id, hitCount); - // Set the user's relevant turnData fields to reflect the final hit count - user.turnData.hitCount = hitCount.value; - user.turnData.hitsLeft = hitCount.value; - } - - /** - * Log to be entered into the user's move history once the move result is resolved. - * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully - * used in the sense of "Does it have an effect on the user?". - */ - const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; - - /** - * Stores results of hit checks of the invoked move against all targets, organized by battler index. - * @see {@linkcode hitCheck} - */ - const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); - const hasActiveTargets = targets.some(t => t.isActive(true)); - - /** Check if the target is immune via ability to the attacking move, and NOT in semi invulnerable state */ - const isImmune = targets[0]?.hasAbilityWithAttr(TypeImmunityAbAttr) - && (targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !targets[0]?.getTag(SemiInvulnerableTag); - - const mayBounce = move.hasFlag(MoveFlags.REFLECTABLE) && !this.reflected && targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); - - /** - * If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target - * (and not random target) and failed the hit check against its target (MISS), log the move - * as FAILed or MISSed (depending on the conditions above) and end this phase. - */ - if (!hasActiveTargets || (!mayBounce && !move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { - this.stopMultiHit(); - if (hasActiveTargets) { - globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" })); - moveHistoryEntry.result = MoveResult.MISS; - applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); - } else { - globalScene.queueMessage(i18next.t("battle:attackFailed")); - moveHistoryEntry.result = MoveResult.FAIL; - } - user.pushMoveHistory(moveHistoryEntry); - return this.end(); - } - - /** All move effect attributes are chained together in this array to be applied asynchronously. */ - const applyAttrs: Promise[] = []; - - const playOnEmptyField = globalScene.currentBattle?.mysteryEncounter?.hasBattleAnimationsWithoutTargets ?? false; - // Move animation only needs one target - new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex(), playOnEmptyField).play(move.hitsSubstitute(user, this.getFirstTarget()!), () => { + const playOnEmptyField = globalScene.currentBattle?.mysteryEncounter?.hasBattleAnimationsWithoutTargets ?? false; + // Move animation only needs one target + new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex(), playOnEmptyField).play( + move.hitsSubstitute(user, this.getFirstTarget()!), + () => { /** Has the move successfully hit a target (for damage) yet? */ let hasHit: boolean = false; @@ -313,7 +313,7 @@ export class MoveEffectPhase extends PokemonPhase { } /** Does this phase represent the invoked move's first strike? */ - const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); + const firstHit = user.turnData.hitsLeft === user.turnData.hitCount; // Only log the move's result on the first strike if (firstHit) { @@ -363,7 +363,7 @@ export class MoveEffectPhase extends PokemonPhase { } /** Does this phase represent the invoked move's last strike? */ - const lastHit = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()); + const lastHit = user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive(); /** * If the user can change forms by using the invoked move, @@ -381,43 +381,29 @@ export class MoveEffectPhase extends PokemonPhase { } } - /** - * Create a Promise that applies *all* effects from the invoked move's MoveEffectAttrs. - * These are ordered by trigger type (see {@linkcode MoveEffectTrigger}), and each trigger - * type requires different conditions to be met with respect to the move's hit result. - */ - const k = new Promise((resolve) => { - //Start promise chain and apply PRE_APPLY move attributes - let promiseChain: Promise = applyFilteredMoveAttrs((attr: MoveAttr) => - attr instanceof MoveEffectAttr - && attr.trigger === MoveEffectTrigger.PRE_APPLY - && (!attr.firstHitOnly || firstHit) - && (!attr.lastHitOnly || lastHit) - && hitResult !== HitResult.NO_EFFECT, user, target, move); + applyFilteredMoveAttrs( + (attr: MoveAttr) => + attr instanceof MoveEffectAttr && + attr.trigger === MoveEffectTrigger.PRE_APPLY && + (!attr.firstHitOnly || firstHit) && + (!attr.lastHitOnly || lastHit) && + hitResult !== HitResult.NO_EFFECT, + user, + target, + move, + ); - /** Don't complete if the move failed */ - if (hitResult === HitResult.FAIL) { - return resolve(); - } - - /** Apply Move/Ability Effects in correct order */ - promiseChain = promiseChain - .then(this.applySelfTargetEffects(user, target, firstHit, lastHit)); + if (hitResult !== HitResult.FAIL) { + this.applySelfTargetEffects(user, target, firstHit, lastHit); if (hitResult !== HitResult.NO_EFFECT) { - promiseChain - .then(this.applyPostApplyEffects(user, target, firstHit, lastHit)) - .then(this.applyHeldItemFlinchCheck(user, target, dealsDamage)) - .then(this.applySuccessfulAttackEffects(user, target, firstHit, lastHit, !!isProtected, hitResult, firstTarget)) - .then(() => resolve()); + this.applyPostApplyEffects(user, target, firstHit, lastHit); + this.applyHeldItemFlinchCheck(user, target, dealsDamage); + this.applySuccessfulAttackEffects(user, target, firstHit, lastHit, !!isProtected, hitResult, firstTarget); } else { - promiseChain - .then(() => applyMoveAttrs(NoEffectAttr, user, null, move)) - .then(resolve); + applyMoveAttrs(NoEffectAttr, user, null, move); } - }); - - applyAttrs.push(k); + } } // Apply queued phases @@ -425,41 +411,35 @@ export class MoveEffectPhase extends PokemonPhase { globalScene.appendToPhase(queuedPhases, MoveEndPhase); } // Apply the move's POST_TARGET effects on the move's last hit, after all targeted effects have resolved - const postTarget = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) ? - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : - null; - - if (postTarget) { - if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after - applyAttrs[applyAttrs.length - 1].then(() => postTarget); - } else { // Otherwise, push a new asynchronous move effect - applyAttrs.push(postTarget); - } + if (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) { + applyFilteredMoveAttrs( + (attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, + user, + null, + move, + ); } - // Wait for all move effects to finish applying, then end this phase - Promise.allSettled(applyAttrs).then(() => { - /** - * Remove the target's substitute (if it exists and has expired) - * after all targeted effects have applied. - * This prevents blocked effects from applying until after this hit resolves. - */ - targets.forEach(target => { - const substitute = target.getTag(SubstituteTag); - if (substitute && substitute.hp <= 0) { - target.lapseTag(BattlerTagType.SUBSTITUTE); - } - }); - - const moveType = user.getMoveType(move, true); - if (move.category !== MoveCategory.STATUS && !user.stellarTypesBoosted.includes(moveType)) { - user.stellarTypesBoosted.push(moveType); + /** + * Remove the target's substitute (if it exists and has expired) + * after all targeted effects have applied. + * This prevents blocked effects from applying until after this hit resolves. + */ + targets.forEach((target) => { + const substitute = target.getTag(SubstituteTag); + if (substitute && substitute.hp <= 0) { + target.lapseTag(BattlerTagType.SUBSTITUTE); } - - this.end(); }); - }); - }); + + const moveType = user.getMoveType(move, true); + if (move.category !== MoveCategory.STATUS && !user.stellarTypesBoosted.includes(moveType)) { + user.stellarTypesBoosted.push(moveType); + } + + this.end(); + }, + ); } public override end(): void { @@ -500,8 +480,8 @@ export class MoveEffectPhase extends PokemonPhase { * @param lastHit - `true` if this is the last hit in a multi-hit attack * @returns a function intended to be passed into a `then()` call. */ - protected applySelfTargetEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): () => Promise { - return () => applyFilteredMoveAttrs((attr: MoveAttr) => + protected applySelfTargetEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): void { + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY && attr.selfTarget @@ -518,8 +498,8 @@ export class MoveEffectPhase extends PokemonPhase { * @param lastHit - `true` if this is the last hit in a multi-hit attack * @returns a function intended to be passed into a `then()` call. */ - protected applyPostApplyEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): () => Promise { - return () => applyFilteredMoveAttrs((attr: MoveAttr) => + protected applyPostApplyEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): void { + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY && !attr.selfTarget @@ -537,8 +517,8 @@ export class MoveEffectPhase extends PokemonPhase { * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} * @returns a function intended to be passed into a `then()` call. */ - protected applyOnHitEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, firstTarget: boolean): Promise { - return applyFilteredMoveAttrs((attr: MoveAttr) => + protected applyOnHitEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, firstTarget: boolean): void { + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.HIT && (!attr.firstHitOnly || firstHit) @@ -554,21 +534,18 @@ export class MoveEffectPhase extends PokemonPhase { * @param hitResult - The {@linkcode HitResult} of the attempted move * @returns a `Promise` intended to be passed into a `then()` call. */ - protected applyOnGetHitAbEffects(user: Pokemon, target: Pokemon, hitResult: HitResult): Promise { - return executeIf(!target.isFainted() || target.canApplyAbility(), () => - applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult) - .then(() => { + protected applyOnGetHitAbEffects(user: Pokemon, target: Pokemon, hitResult: HitResult): void { + if (!target.isFainted() || target.canApplyAbility()) { + applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult); - if (!this.move.getMove().hitsSubstitute(user, target)) { - if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { - globalScene.applyShuffledModifiers(EnemyAttackStatusEffectChanceModifier, false, target); - } + if (!this.move.getMove().hitsSubstitute(user, target)) { + if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { + globalScene.applyShuffledModifiers(EnemyAttackStatusEffectChanceModifier, false, target); + } - target.lapseTags(BattlerTagLapseType.AFTER_HIT); - } - - }) - ); + target.lapseTags(BattlerTagLapseType.AFTER_HIT); + } + } } /** @@ -583,17 +560,15 @@ export class MoveEffectPhase extends PokemonPhase { * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} * @returns a function intended to be passed into a `then()` call. */ - protected applySuccessfulAttackEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, isProtected : boolean, hitResult: HitResult, firstTarget: boolean) : () => Promise { - return () => executeIf(!isProtected, () => - this.applyOnHitEffects(user, target, firstHit, lastHit, firstTarget).then(() => - this.applyOnGetHitAbEffects(user, target, hitResult)).then(() => - applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult)).then(() => { // Item Stealing Effects - - if (this.move.getMove() instanceof AttackMove) { - globalScene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); - } - }) - ); + protected applySuccessfulAttackEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean, isProtected: boolean, hitResult: HitResult, firstTarget: boolean): void { + if (!isProtected) { + this.applyOnHitEffects(user, target, firstHit, lastHit, firstTarget); + this.applyOnGetHitAbEffects(user, target, hitResult); + applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult); + if (this.move.getMove() instanceof AttackMove) { + globalScene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); + } + } } /** @@ -603,20 +578,18 @@ export class MoveEffectPhase extends PokemonPhase { * @param dealsDamage - `true` if the attempted move successfully dealt damage * @returns a function intended to be passed into a `then()` call. */ - protected applyHeldItemFlinchCheck(user: Pokemon, target: Pokemon, dealsDamage: boolean) : () => void { - return () => { - if (this.move.getMove().hasAttr(FlinchAttr)) { - return; - } + protected applyHeldItemFlinchCheck(user: Pokemon, target: Pokemon, dealsDamage: boolean) : void { + if (this.move.getMove().hasAttr(FlinchAttr)) { + return; + } - if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !this.move.getMove().hitsSubstitute(user, target)) { - const flinched = new BooleanHolder(false); - globalScene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); - if (flinched.value) { - target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); - } + if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !this.move.getMove().hitsSubstitute(user, target)) { + const flinched = new BooleanHolder(false); + globalScene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); + if (flinched.value) { + target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); } - }; + } } /** diff --git a/src/phases/move-header-phase.ts b/src/phases/move-header-phase.ts index 6a982646b50..5b89548b663 100644 --- a/src/phases/move-header-phase.ts +++ b/src/phases/move-header-phase.ts @@ -22,9 +22,8 @@ export class MoveHeaderPhase extends BattlePhase { super.start(); if (this.canMove()) { - applyMoveAttrs(MoveHeaderAttr, this.pokemon, null, this.move.getMove()).then(() => this.end()); - } else { - this.end(); + applyMoveAttrs(MoveHeaderAttr, this.pokemon, null, this.move.getMove()); } + this.end(); } } diff --git a/src/phases/pokemon-transform-phase.ts b/src/phases/pokemon-transform-phase.ts new file mode 100644 index 00000000000..d67f758b1fd --- /dev/null +++ b/src/phases/pokemon-transform-phase.ts @@ -0,0 +1,77 @@ +import type { BattlerIndex } from "#app/battle"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { EFFECTIVE_STATS, BATTLE_STATS } from "#enums/stat"; +import { PokemonMove } from "#app/field/pokemon"; +import { globalScene } from "#app/global-scene"; +import { PokemonPhase } from "./pokemon-phase"; + +/** + * Transforms a Pokemon into another Pokemon on the field. + * Used for Transform (move) and Imposter (ability) + */ +export class PokemonTransformPhase extends PokemonPhase { + protected targetIndex: BattlerIndex; + private playSound: boolean; + + constructor(userIndex: BattlerIndex, targetIndex: BattlerIndex, playSound: boolean = false) { + super(userIndex); + + this.targetIndex = targetIndex; + this.playSound = playSound; + } + + public override start(): void { + const user = this.getPokemon(); + const target = globalScene.getField(true).find((p) => p.getBattlerIndex() === this.targetIndex); + + if (!target) { + return this.end(); + } + + user.summonData.speciesForm = target.getSpeciesForm(); + user.summonData.ability = target.getAbility().id; + user.summonData.gender = target.getGender(); + + // Power Trick's effect is removed after using Transform + user.removeTag(BattlerTagType.POWER_TRICK); + + // Copy all stats (except HP) + for (const s of EFFECTIVE_STATS) { + user.setStat(s, target.getStat(s, false), false); + } + + // Copy all stat stages + for (const s of BATTLE_STATS) { + user.setStatStage(s, target.getStatStage(s)); + } + + 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(); + + const promises = [ user.updateInfo() ]; + + if (this.playSound) { + globalScene.playSound("battle_anims/PRSFX- Transform"); + } + + promises.push( + user.loadAssets(false).then(() => { + user.playAnim(); + user.updateInfo(); + // If the new ability activates immediately, it needs to happen after all the transform animations + user.setTempAbility(target.getAbility()); + }), + ); + + Promise.allSettled(promises).then(() => this.end()); + } +} diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts index d76708b7050..b92d79501d4 100644 --- a/src/phases/post-summon-phase.ts +++ b/src/phases/post-summon-phase.ts @@ -27,12 +27,10 @@ export class PostSummonPhase extends PokemonPhase { pokemon.lapseTag(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON); } - applyPostSummonAbAttrs(PostSummonAbAttr, pokemon) - .then(() => { - const field = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); - field.forEach((p) => applyAbAttrs(CommanderAbAttr, p, null, false)); + applyPostSummonAbAttrs(PostSummonAbAttr, pokemon); + const field = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); + field.forEach((p) => applyAbAttrs(CommanderAbAttr, p, null, false)); - this.end(); - }); + this.end(); } } diff --git a/src/phases/revival-blessing-phase.ts b/src/phases/revival-blessing-phase.ts new file mode 100644 index 00000000000..a063e325a31 --- /dev/null +++ b/src/phases/revival-blessing-phase.ts @@ -0,0 +1,61 @@ +import { SwitchType } from "#enums/switch-type"; +import { globalScene } from "#app/global-scene"; +import type { PartyOption } from "#app/ui/party-ui-handler"; +import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { BattlePhase } from "#app/phases/battle-phase"; +import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; +import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; +import type { PlayerPokemon } from "#app/field/pokemon"; + +/** + * Sets the Party UI and handles the effect of Revival Blessing + * when used by one of the player's Pokemon. + */ +export class RevivalBlessingPhase extends BattlePhase { + constructor(protected user: PlayerPokemon) { + super(); + } + + public override start(): void { + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.REVIVAL_BLESSING, + this.user.getFieldIndex(), + (slotIndex: integer, option: PartyOption) => { + if (slotIndex >= 0 && slotIndex < 6) { + const pokemon = globalScene.getPlayerParty()[slotIndex]; + if (!pokemon || !pokemon.isFainted()) { + return this.end(); + } + + pokemon.resetTurnData(); + pokemon.resetStatus(); + pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); + globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: pokemon.name }), 0, true); + + if (globalScene.currentBattle.double && globalScene.getPlayerParty().length > 1) { + const allyPokemon = this.user.getAlly(); + if (slotIndex <= 1) { + // Revived ally pokemon + globalScene.unshiftPhase( + new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, true), + ); + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); + } else if (allyPokemon.isFainted()) { + // Revived party pokemon, and ally pokemon is fainted + globalScene.unshiftPhase( + new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, true), + ); + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); + } + } + } + globalScene.ui.setMode(Mode.MESSAGE).then(() => this.end()); + }, + PartyUiHandler.FilterFainted, + ); + } +} diff --git a/src/phases/ribbon-modifier-reward-phase.ts b/src/phases/ribbon-modifier-reward-phase.ts index 8cf15ba8f2c..72a8f4bf37c 100644 --- a/src/phases/ribbon-modifier-reward-phase.ts +++ b/src/phases/ribbon-modifier-reward-phase.ts @@ -17,17 +17,16 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - globalScene.addModifier(newModifier).then(() => { - globalScene.playSound("level_up_fanfare"); - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.showText(i18next.t("battle:beatModeFirstTime", { - speciesName: this.species.name, - gameMode: globalScene.gameMode.getName(), - newModifier: newModifier?.type.name - }), null, () => { - resolve(); - }, null, true, 1500); - }); + globalScene.addModifier(newModifier); + globalScene.playSound("level_up_fanfare"); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText(i18next.t("battle:beatModeFirstTime", { + speciesName: this.species.name, + gameMode: globalScene.gameMode.getName(), + newModifier: newModifier?.type.name, + }), null, () => { + resolve(); + }, null, true, 1500); }); } } diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index a3a2fa1aa24..36f18a8d64d 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -171,30 +171,21 @@ export class SelectModifierPhase extends BattlePhase { } if (cost && !(modifier.type instanceof RememberMoveModifierType)) { - result.then(success => { - if (success) { - if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { - globalScene.money -= cost; - globalScene.updateMoneyText(); - globalScene.animateMoneyChanged(false); - } - globalScene.playSound("se/buy"); - (globalScene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); - } else { - globalScene.ui.playError(); + if (result) { + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + globalScene.money -= cost; + globalScene.updateMoneyText(); + globalScene.animateMoneyChanged(false); } - }); - } else { - const doEnd = () => { - globalScene.ui.clearText(); - globalScene.ui.setMode(Mode.MESSAGE); - super.end(); - }; - if (result instanceof Promise) { - result.then(() => doEnd()); + globalScene.playSound("se/buy"); + (globalScene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); } else { - doEnd(); + globalScene.ui.playError(); } + } else { + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.MESSAGE); + super.end(); } }; @@ -304,7 +295,7 @@ export class SelectModifierPhase extends BattlePhase { ); } - addModifier(modifier: Modifier): Promise { + addModifier(modifier: Modifier): boolean { return globalScene.addModifier(modifier, false, true); } } diff --git a/src/test/abilities/unburden.test.ts b/src/test/abilities/unburden.test.ts index a652f55d591..9c5f6c2d185 100644 --- a/src/test/abilities/unburden.test.ts +++ b/src/test/abilities/unburden.test.ts @@ -391,7 +391,7 @@ describe("Abilities - Unburden", () => { await game.forceEnemyMove(Moves.THIEF, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.SPLASH); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2 ]); - game.doSelectPartyPokemon(0, "MoveEffectPhase"); + game.doSelectPartyPokemon(0, "RevivalBlessingPhase"); await game.toNextTurn(); expect(game.scene.getPlayerField()[0]).toBe(treecko); diff --git a/src/test/moves/revival_blessing.test.ts b/src/test/moves/revival_blessing.test.ts new file mode 100644 index 00000000000..cdde3941d30 --- /dev/null +++ b/src/test/moves/revival_blessing.test.ts @@ -0,0 +1,117 @@ +import { BattlerIndex } from "#app/battle"; +import { MoveResult } from "#app/field/pokemon"; +import { toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Revival Blessing", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.REVIVAL_BLESSING, Moves.MEMENTO ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should revive a selected fainted Pokemon when used by the player", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + game.move.select(Moves.MEMENTO); + game.doSelectPartyPokemon(1, "SwitchPhase"); + await game.toNextTurn(); + + const player = game.scene.getPlayerPokemon()!; + + expect(player.species.speciesId).toBe(Species.MAGIKARP); + game.move.select(Moves.REVIVAL_BLESSING); + + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1, "RevivalBlessingPhase"); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + const revivedPokemon = game.scene.getPlayerParty()[1]; + expect(revivedPokemon.status?.effect).toBeFalsy(); + expect(revivedPokemon.hp).toBe(Math.floor(revivedPokemon.getMaxHp() / 2)); + }); + + it("should revive a random fainted enemy when used by an enemy Trainer", async () => { + game.override.enemyMoveset(Moves.REVIVAL_BLESSING).startingWave(8); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + const revivedPokemon = game.scene.getEnemyParty()[1]; + expect(revivedPokemon.status?.effect).toBeFalsy(); + expect(revivedPokemon.hp).toBe(Math.floor(revivedPokemon.getMaxHp() / 2)); + }); + + it("should fail when there are no fainted Pokemon to target", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + game.move.select(Moves.REVIVAL_BLESSING); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("MoveEndPhase", false); + + const player = game.scene.getPlayerPokemon()!; + expect(player.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should revive a player pokemon and immediately send it back out if used in the same turn it fainted in doubles", async () => { + game.override + .battleType("double") + .enemyMoveset([ Moves.SPLASH, Moves.FISSURE ]) + .enemyAbility(Abilities.NO_GUARD) + .enemyLevel(100); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC, Species.GYARADOS ]); + + const feebas = game.scene.getPlayerField()[0]; + + game.move.select(Moves.SPLASH); + game.move.select(Moves.REVIVAL_BLESSING, 1); + await game.forceEnemyMove(Moves.FISSURE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2 ]); + + await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(feebas.isFainted()).toBe(true); + + game.doSelectPartyPokemon(0, "RevivalBlessingPhase"); + await game.toNextTurn(); + + expect(feebas.isFainted()).toBe(false); + expect(feebas.hp).toBe(toDmgValue(0.5 * feebas.getMaxHp())); + expect(game.scene.getPlayerField()[0]).toBe(feebas); + }); +}); 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 f105678e71f..f95450bbf44 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -375,6 +375,6 @@ describe("Clowning Around - Mystery Encounter", () => { async function addItemToPokemon(scene: BattleScene, pokemon: Pokemon, stackCount: number, itemType: PokemonHeldItemModifierType) { const itemMod = itemType.newModifier(pokemon) as PokemonHeldItemModifier; itemMod.stackCount = stackCount; - await scene.addModifier(itemMod, true, false, false, true); + scene.addModifier(itemMod, true, false, false, true); await scene.updateModifiers(true); } diff --git a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index 795e6b6650b..ceb457666d7 100644 --- a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -123,8 +123,6 @@ describe("Dancing Lessons - Mystery Encounter", () => { partyLead.level = 1000; partyLead.calculateStats(); await runMysteryEncounterToEnd(game, 1, undefined, true); - // For some reason updateModifiers breaks in this test and does not resolve promise - vi.spyOn(game.scene, "updateModifiers").mockImplementation(() => new Promise(resolve => resolve())); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index f99aa24805e..8121916a4d7 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -123,7 +123,7 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const amuletCoin = generateModifierType(modifierTypes.AMULET_COIN)!.newModifier() as MoneyMultiplierModifier; amuletCoin.stackCount = 5; - await scene.addModifier(amuletCoin, true, false, false, true); + scene.addModifier(amuletCoin, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 1); @@ -193,7 +193,7 @@ describe("Delibird-y - Mystery Encounter", () => { const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -214,7 +214,7 @@ describe("Delibird-y - Mystery Encounter", () => { const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -234,13 +234,13 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const candyJar = generateModifierType(modifierTypes.CANDY_JAR)!.newModifier() as LevelIncrementBoosterModifier; candyJar.stackCount = 99; - await scene.addModifier(candyJar, true, false, false, true); + scene.addModifier(candyJar, true, false, false, true); const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; // Sitrus berries on party const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -263,13 +263,13 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const healingCharm = generateModifierType(modifierTypes.BERRY_POUCH)!.newModifier() as PreserveBerryModifier; healingCharm.stackCount = 3; - await scene.addModifier(healingCharm, true, false, false, true); + scene.addModifier(healingCharm, true, false, false, true); // Set 1 Reviver Seed on party lead const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -292,7 +292,7 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]); - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await game.phaseInterceptor.to(MysteryEncounterPhase, false); @@ -321,7 +321,7 @@ describe("Delibird-y - Mystery Encounter", () => { const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -355,7 +355,7 @@ describe("Delibird-y - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 2; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -376,7 +376,7 @@ describe("Delibird-y - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -396,13 +396,13 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const healingCharm = generateModifierType(modifierTypes.HEALING_CHARM)!.newModifier() as HealingBoosterModifier; healingCharm.stackCount = 5; - await scene.addModifier(healingCharm, true, false, false, true); + scene.addModifier(healingCharm, true, false, false, true); // Set 1 Soul Dew on party lead const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -425,7 +425,7 @@ describe("Delibird-y - Mystery Encounter", () => { scene.modifiers = []; const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getPlayerParty()[0]); - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await game.phaseInterceptor.to(MysteryEncounterPhase, false); @@ -455,7 +455,7 @@ describe("Delibird-y - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); diff --git a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts b/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts index fb5801c941a..60780984014 100644 --- a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -224,7 +224,7 @@ describe("Global Trade System - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 2; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -249,7 +249,7 @@ describe("Global Trade System - Mystery Encounter", () => { const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); diff --git a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index 39904c030a3..06bd382879f 100644 --- a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -216,11 +216,11 @@ describe("Uncommon Breed - Mystery Encounter", () => { const sitrus = generateModifierType(modifierTypes.BERRY, [ BerryType.SITRUS ])!; const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); const ganlon = generateModifierType(modifierTypes.BERRY, [ BerryType.GANLON ])!; const ganlonMod = ganlon.newModifier(scene.getPlayerParty()[0]) as BerryModifier; ganlonMod.stackCount = 3; - await scene.addModifier(ganlonMod, true, false, false, true); + scene.addModifier(ganlonMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2); diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index ca5a67f901a..3ba9cae3c8d 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -91,6 +91,7 @@ export default class GameWrapper { Pokemon.prototype.updateFusionPalette = () => null; Pokemon.prototype.cry = () => null; Pokemon.prototype.faintCry = (cb) => { if (cb) cb(); }; + BattleScene.prototype.addPokemonIcon = () => new Phaser.GameObjects.Container(this.scene); } setScene(scene: BattleScene) { diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index d60e0e78373..91f98e89ec3 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -60,6 +60,7 @@ import { RibbonModifierRewardPhase } from "#app/phases/ribbon-modifier-reward-ph import { GameOverModifierRewardPhase } from "#app/phases/game-over-modifier-reward-phase"; import { UnlockPhase } from "#app/phases/unlock-phase"; import { PostGameOverPhase } from "#app/phases/post-game-over-phase"; +import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; export interface PromptHandler { phaseTarget?: string; @@ -126,7 +127,8 @@ type PhaseClass = | typeof EncounterPhase | typeof GameOverPhase | typeof UnlockPhase - | typeof PostGameOverPhase; + | typeof PostGameOverPhase + | typeof RevivalBlessingPhase; type PhaseString = | "LoginPhase" @@ -185,7 +187,8 @@ type PhaseString = | "EncounterPhase" | "GameOverPhase" | "UnlockPhase" - | "PostGameOverPhase"; + | "PostGameOverPhase" + | "RevivalBlessingPhase"; type PhaseInterceptorPhase = PhaseClass | PhaseString; @@ -269,6 +272,7 @@ export default class PhaseInterceptor { [ GameOverPhase, this.startPhase ], [ UnlockPhase, this.startPhase ], [ PostGameOverPhase, this.startPhase ], + [ RevivalBlessingPhase, this.startPhase ], ]; private endBySetMode = [ @@ -511,11 +515,11 @@ export default class PhaseInterceptor { if (expireFn) { this.prompts.shift(); } else if ( - currentMode === actionForNextPrompt.mode - && currentPhase === actionForNextPrompt.phaseTarget - && currentHandler.active - && (!actionForNextPrompt.awaitingActionInput - || (actionForNextPrompt.awaitingActionInput && currentHandler.awaitingActionInput)) + currentMode === actionForNextPrompt.mode && + currentPhase === actionForNextPrompt.phaseTarget && + currentHandler.active && + (!actionForNextPrompt.awaitingActionInput || + (actionForNextPrompt.awaitingActionInput && currentHandler.awaitingActionInput)) ) { const prompt = this.prompts.shift(); if (prompt?.callback) { From 39f2fdf4ff323efbed0b8baa62336b0d05b80743 Mon Sep 17 00:00:00 2001 From: damocleas Date: Fri, 21 Feb 2025 03:43:45 -0500 Subject: [PATCH 12/83] [Bug] Giratina no longer loses its' Hidden Ability going from Origin back to Altered Form #5326 --- 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 4349cee2cbf..ff9fbdf0bc8 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1848,7 +1848,7 @@ export function initSpecies() { new PokemonSpecies(Species.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", Type.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.GIRATINA, 4, false, true, false, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true, new PokemonForm("Altered Forme", "altered", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), + new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.LEVITATE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), ), new PokemonSpecies(Species.CRESSELIA, 4, true, false, false, "Lunar Pokémon", Type.PSYCHIC, null, 1.5, 85.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), new PokemonSpecies(Species.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", Type.WATER, null, 0.4, 3.1, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 240, GrowthRate.SLOW, null, false), From 180a9cc054d4d3e76a2b43401be7aa5aaf851f88 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 21 Feb 2025 21:09:00 +0100 Subject: [PATCH 13/83] [UI/UX] Pokedex - Separate shiny icons (#5371) * Separate shiny icons * Added forgotten access modifier --- src/ui/pokedex-page-ui-handler.ts | 83 +++++++++++++++++++------------ 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 4d30609a020..a086762bb57 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -164,7 +164,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private pokemonFormText: Phaser.GameObjects.Text; private pokemonHatchedIcon : Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; - private pokemonShinyIcon: Phaser.GameObjects.Sprite; + private pokemonShinyIcons: Phaser.GameObjects.Sprite[]; private activeTooltip: "ABILITY" | "PASSIVE" | "CANDY" | undefined; private instructionsContainer: Phaser.GameObjects.Container; @@ -245,6 +245,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { protected scale: number = 0.1666666667; private menuDescriptions: string[]; + private availableVariants: number; + private unlockedVariants: boolean[]; + constructor() { super(Mode.POKEDEX_PAGE); } @@ -381,10 +384,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setScale(0.8); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); - 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); + this.pokemonShinyIcons = []; + for (let i = 0; i < 3; i++) { + const pokemonShinyIcon = globalScene.add.sprite(153 + i * 13, 160, "shiny_icons"); + pokemonShinyIcon.setOrigin(0.15, 0.2); + pokemonShinyIcon.setScale(1); + pokemonShinyIcon.setFrame(getVariantIcon(i as Variant)); + pokemonShinyIcon.setVisible(false); + this.pokemonCaughtHatchedContainer.add(pokemonShinyIcon); + this.pokemonShinyIcons.push(pokemonShinyIcon); + } this.pokemonHatchedCountText = addTextObject(24, 19, "0", TextStyle.SUMMARY_ALT); this.pokemonHatchedCountText.setOrigin(0, 0); @@ -672,6 +681,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { ) ); } + + this.availableVariants = species.getFullUnlocksData() & DexAttr.VARIANT_3 ? 3 : 1; } // Function to ensure that forms appear in the appropriate biome and tod @@ -795,17 +806,17 @@ export default class PokedexPageUiHandler extends MessageUiHandler { starterAttributes.variant = 0; } - const unlockedVariants = [ - hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, - hasShiny && caughtAttr & DexAttr.VARIANT_2, - hasShiny && caughtAttr & DexAttr.VARIANT_3 + this.unlockedVariants = [ + !!(hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT), + !!(hasShiny && caughtAttr & DexAttr.VARIANT_2), + !!(hasShiny && caughtAttr & DexAttr.VARIANT_3) ]; if (starterAttributes.variant === undefined || isNaN(starterAttributes.variant) || starterAttributes.variant < 0) { starterAttributes.variant = 0; - } else if (!unlockedVariants[starterAttributes.variant]) { + } else if (!this.unlockedVariants[starterAttributes.variant]) { let highestValidIndex = -1; - for (let i = 0; i <= starterAttributes.variant && i < unlockedVariants.length; i++) { - if (unlockedVariants[i] !== 0n) { + for (let i = 0; i <= starterAttributes.variant && i < this.unlockedVariants.length; i++) { + if (this.unlockedVariants[i]) { highestValidIndex = i; } } @@ -1530,11 +1541,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.setSpeciesDetails(this.species, { shiny: true, variant: newVariant }); globalScene.playSound("se/sparkle"); - // Set the variant label to the shiny tint - const tint = getVariantTint(newVariant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); - this.pokemonShinyIcon.setTint(tint); - this.pokemonShinyIcon.setVisible(true); starterAttributes.shiny = true; this.savedStarterAttributes.shiny = starterAttributes.shiny; @@ -1561,14 +1567,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.savedStarterAttributes.variant = starterAttributes.variant; if (newVariant > props.variant) { this.setSpeciesDetails(this.species, { variant: newVariant as Variant }); - // Cycle tint based on current sprite tint - const tint = getVariantTint(newVariant as Variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); - this.pokemonShinyIcon.setTint(tint); success = true; } else { this.setSpeciesDetails(this.species, { shiny: false, variant: 0 }); - this.pokemonShinyIcon.setVisible(false); success = true; starterAttributes.shiny = false; @@ -2005,7 +2006,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.type2Icon.setVisible(true); this.pokemonLuckLabelText.setVisible(false); this.pokemonLuckText.setVisible(false); - this.pokemonShinyIcon.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } this.pokemonUncaughtText.setVisible(true); this.pokemonCaughtHatchedContainer.setVisible(true); this.pokemonCandyContainer.setVisible(false); @@ -2031,7 +2034,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.type2Icon.setVisible(false); this.pokemonLuckLabelText.setVisible(false); this.pokemonLuckText.setVisible(false); - this.pokemonShinyIcon.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } this.pokemonUncaughtText.setVisible(!!species); this.pokemonCaughtHatchedContainer.setVisible(false); this.pokemonCandyContainer.setVisible(false); @@ -2232,13 +2237,26 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - const variant = defaultProps.variant; - const tint = getVariantTint(variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); - this.pokemonShinyIcon.setTint(tint); - this.pokemonShinyIcon.setVisible(defaultProps.shiny); - this.pokemonCaughtHatchedContainer.setVisible(true); + const variant = defaultProps.variant; + for (let v = 0; v < 3; v++) { + const icon = this.pokemonShinyIcons[v]; + if (v < this.availableVariants) { + if (!this.unlockedVariants[v]) { + icon.setTint(0x000000); + } else if (shiny && v === variant) { + const tint = getVariantTint(v as Variant); + icon.setTint(tint); + } else { + icon.setTint(0x808080); + } + icon.setVisible(true); + } else { + icon.setVisible(false); + } + } + + this.pokemonCaughtHatchedContainer.setVisible(true); this.pokemonCaughtHatchedContainer.setY(25); this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); @@ -2246,7 +2264,6 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCandyContainer.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { - this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); this.pokemonHatchedIcon.setVisible(false); this.pokemonHatchedCountText.setVisible(false); this.pokemonFormText.setY(36); @@ -2273,7 +2290,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonUncaughtText.setVisible(true); this.pokemonCaughtHatchedContainer.setVisible(false); this.pokemonCandyContainer.setVisible(false); - this.pokemonShinyIcon.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } } // Setting type icons and form text From 7a015e094fef5d39ed3e2659ab4b2e28a7c1af2c Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 22 Feb 2025 12:33:32 -0600 Subject: [PATCH 14/83] [Bug] [Move] Add focus punch lost focus message (#5341) * Add focus punch lost focus message * Rename attribute * Added automated test * Fix failedToTerrain being undefined * Update src/test/moves/focus_punch.test.ts Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> * Update src/data/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/ability.ts | 2 +- src/data/move.ts | 84 ++++++++++++++++++++++++------ src/phases/move-phase.ts | 40 +++++++++----- src/test/moves/focus_punch.test.ts | 22 ++++++-- 4 files changed, 112 insertions(+), 36 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 65da3753cde..131b7d0ff7a 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6633,7 +6633,7 @@ export function initAbilities() { .bypassFaint(), new Ability(Abilities.CORROSION, 7) .attr(IgnoreTypeStatusEffectImmunityAbAttr, [ StatusEffect.POISON, StatusEffect.TOXIC ], [ Type.STEEL, Type.POISON ]) - .edgeCase(), // Should interact correctly with magic coat/bounce (not yet implemented) + fling with toxic orb (not implemented yet) + .edgeCase(), // Should poison itself with toxic orb. new Ability(Abilities.COMATOSE, 7) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) diff --git a/src/data/move.ts b/src/data/move.ts index 658534eb48f..30c5ef75491 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -692,19 +692,17 @@ export default class Move implements Localizable { /** * Sees if a move has a custom failure text (by looking at each {@linkcode MoveAttr} of this move) * @param user {@linkcode Pokemon} using the move - * @param target {@linkcode Pokemon} receiving the move - * @param move {@linkcode Move} using the move - * @param cancelled {@linkcode Utils.BooleanHolder} to hold boolean value + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute * @returns string of the custom failure text, or `null` if it uses the default text ("But it failed!") */ - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { for (const attr of this.attrs) { - const failedText = attr.getFailedText(user, target, move, cancelled); - if (failedText !== null) { + const failedText = attr.getFailedText(user, target, move); + if (failedText) { return failedText; } } - return null; } /** @@ -1089,11 +1087,10 @@ export abstract class MoveAttr { * @param user {@linkcode Pokemon} using the move * @param target {@linkcode Pokemon} target of the move * @param move {@linkcode Move} with this attribute - * @param cancelled {@linkcode Utils.BooleanHolder} which stores if the move should fail * @returns the string representing failure of this {@linkcode Move} */ - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { - return null; + getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { + return; } /** @@ -1335,6 +1332,54 @@ export class PreMoveMessageAttr extends MoveAttr { } } +/** + * Attribute for moves that can be conditionally interrupted to be considered to + * have failed before their "useMove" message is displayed. Currently used by + * Focus Punch. + * @extends MoveAttr + */ +export class PreUseInterruptAttr extends MoveAttr { + protected message?: string | ((user: Pokemon, target: Pokemon, move: Move) => string); + protected overridesFailedMessage: boolean; + protected conditionFunc: MoveConditionFunc; + + /** + * Create a new MoveInterruptedMessageAttr. + * @param message The message to display when the move is interrupted, or a function that formats the message based on the user, target, and move. + */ + constructor(message?: string | ((user: Pokemon, target: Pokemon, move: Move) => string), conditionFunc?: MoveConditionFunc) { + super(); + this.message = message; + this.conditionFunc = conditionFunc ?? (() => true); + } + + /** + * Message to display when a move is interrupted. + * @param user {@linkcode Pokemon} using the move + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute + */ + override apply(user: Pokemon, target: Pokemon, move: Move): boolean { + return this.conditionFunc(user, target, move); + } + + /** + * Message to display when a move is interrupted. + * @param user {@linkcode Pokemon} using the move + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute + */ + override getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { + if (this.message && this.conditionFunc(user, target, move)) { + const message = + typeof this.message === "string" + ? (this.message as string) + : this.message(user, target, move); + return message; + } + } +} + /** * Attribute for Status moves that take attack type effectiveness * into consideration (i.e. {@linkcode https://bulbapedia.bulbagarden.net/wiki/Thunder_Wave_(move) | Thunder Wave}) @@ -1754,13 +1799,16 @@ export class AddSubstituteAttr extends MoveEffectAttr { return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > Math.floor(user.getMaxHp() * this.hpCost) && user.getMaxHp() > 1; } - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + /** + * Get the substitute-specific failure message if one should be displayed. + * @param user The pokemon using the move. + * @returns The substitute-specific failure message if the conditions apply, otherwise `undefined` + */ + getFailedText(user: Pokemon, _target: Pokemon, _move: Move): string | undefined { if (user.getTag(SubstituteTag)) { return i18next.t("moveTriggers:substituteOnOverlap", { pokemonName: getPokemonNameWithAffix(user) }); } else if (user.hp <= Math.floor(user.getMaxHp() / 4) || user.getMaxHp() === 1) { return i18next.t("moveTriggers:substituteNotEnoughHp"); - } else { - return i18next.t("battle:attackFailed"); } } } @@ -6230,10 +6278,12 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return (user, target, move) => (move.category !== MoveCategory.STATUS || this.getSwitchOutCondition()(user, target, move)); } - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + getFailedText(_user: Pokemon, target: Pokemon, _move: Move): string | undefined { const blockedByAbility = new Utils.BooleanHolder(false); applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility); - return blockedByAbility.value ? i18next.t("moveTriggers:cannotBeSwitchedOut", { pokemonName: getPokemonNameWithAffix(target) }) : null; + if (blockedByAbility.value) { + return i18next.t("moveTriggers:cannotBeSwitchedOut", { pokemonName: getPokemonNameWithAffix(target) }); + } } getSwitchOutCondition(): MoveConditionFunc { @@ -9185,8 +9235,8 @@ export function initMoves() { .attr(BypassBurnDamageReductionAttr), new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) .attr(MessageHeaderAttr, (user, move) => i18next.t("moveTriggers:isTighteningFocus", { pokemonName: getPokemonNameWithAffix(user) })) - .punchingMove() - .condition((user, target, move) => !user.turnData.attacksReceived.find(r => r.damage)), + .attr(PreUseInterruptAttr, i18next.t("moveTriggers:lostFocus"), user => !!user.turnData.attacksReceived.find(r => r.damage)) + .punchingMove(), new AttackMove(Moves.SMELLING_SALTS, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.PARALYSIS ? 2 : 1) .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS), diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index c1e4aeaf497..d58c052812f 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -9,7 +9,7 @@ import { PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr, - ReduceStatusEffectDurationAbAttr + ReduceStatusEffectDurationAbAttr, } from "#app/data/ability"; import type { DelayedAttackTag } from "#app/data/arena-tag"; import { CommonAnim } from "#app/data/battle-anims"; @@ -24,7 +24,8 @@ import { frenzyMissFunc, HealStatusEffectAttr, MoveFlags, - PreMoveMessageAttr + PreMoveMessageAttr, + PreUseInterruptAttr, } from "#app/data/move"; import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect"; @@ -42,7 +43,7 @@ import { MoveChargePhase } from "#app/phases/move-charge-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; -import { BooleanHolder, NumberHolder } from "#app/utils"; +import { NumberHolder } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -293,7 +294,18 @@ export class MovePhase extends BattlePhase { } } - this.showMoveText(); + let success: boolean = true; + // Check if there are any attributes that can interrupt the move, overriding the fail message. + for (const move of this.move.getMove().getAttrs(PreUseInterruptAttr)) { + if (move.apply(this.pokemon, targets[0], this.move.getMove())) { + success = false; + break; + } + } + + if (success) { + this.showMoveText(); + } if (moveQueue.length > 0) { // Using .shift here clears out two turn moves once they've been used @@ -329,11 +341,14 @@ export class MovePhase extends BattlePhase { * Move conditions assume the move has a single target * TODO: is this sustainable? */ - const passesConditions = move.applyConditions(this.pokemon, targets[0], move); - const failedDueToWeather: boolean = globalScene.arena.isMoveWeatherCancelled(this.pokemon, move); - const failedDueToTerrain: boolean = globalScene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, move); + let failedDueToTerrain: boolean = false; + if (success) { + const passesConditions = move.applyConditions(this.pokemon, targets[0], move); + const failedDueToWeather: boolean = globalScene.arena.isMoveWeatherCancelled(this.pokemon, move); + failedDueToTerrain = globalScene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, move); + success = passesConditions && !failedDueToWeather && !failedDueToTerrain; + } - const success = passesConditions && !failedDueToWeather && !failedDueToTerrain; // Update the battle's "last move" pointer, unless we're currently mimicking a move. if (!allMoves[this.move.moveId].hasAttr(CopyMoveAttr)) { @@ -360,9 +375,8 @@ export class MovePhase extends BattlePhase { this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); + const failureMessage = move.getFailedText(this.pokemon, targets[0], move); let failedText: string | undefined; - const failureMessage = move.getFailedText(this.pokemon, targets[0], move, new BooleanHolder(false)); - if (failureMessage) { failedText = failureMessage; } else if (failedDueToTerrain) { @@ -398,7 +412,7 @@ export class MovePhase extends BattlePhase { } else { this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); - const failureMessage = move.getFailedText(this.pokemon, targets[0], move, new BooleanHolder(false)); + const failureMessage = move.getFailedText(this.pokemon, targets[0], move); this.showMoveText(); this.showFailedText(failureMessage ?? undefined); @@ -566,7 +580,7 @@ export class MovePhase extends BattlePhase { applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents()[0], this.move.getMove()); } - public showFailedText(failedText?: string): void { - globalScene.queueMessage(failedText ?? i18next.t("battle:attackFailed")); + public showFailedText(failedText: string = i18next.t("battle:attackFailed")): void { + globalScene.queueMessage(failedText); } } diff --git a/src/test/moves/focus_punch.test.ts b/src/test/moves/focus_punch.test.ts index 352e3b60aa4..44d9c92cac1 100644 --- a/src/test/moves/focus_punch.test.ts +++ b/src/test/moves/focus_punch.test.ts @@ -7,8 +7,9 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; +import i18next from "i18next"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Focus Punch", () => { @@ -41,7 +42,7 @@ describe("Moves - Focus Punch", () => { it( "should deal damage at the end of turn if uninterrupted", async () => { - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); const leadPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -68,7 +69,7 @@ describe("Moves - Focus Punch", () => { async () => { game.override.enemyMoveset([ Moves.TACKLE ]); - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); const leadPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -95,7 +96,7 @@ describe("Moves - Focus Punch", () => { async () => { game.override.enemyMoveset([ Moves.SPORE ]); - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); const leadPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -119,7 +120,7 @@ describe("Moves - Focus Punch", () => { /** Guarantee a Trainer battle with multiple enemy Pokemon */ game.override.startingWave(25); - await game.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); game.forceEnemyToSwitch(); game.move.select(Moves.FOCUS_PUNCH); @@ -130,4 +131,15 @@ describe("Moves - Focus Punch", () => { expect(game.scene.phaseQueue.find(phase => phase instanceof MoveHeaderPhase)).toBeDefined(); } ); + it("should replace the 'but it failed' text when the user gets hit", async () => { + game.override.enemyMoveset([ Moves.TACKLE ]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + game.move.select(Moves.FOCUS_PUNCH); + await game.phaseInterceptor.to("MoveEndPhase", true); + await game.phaseInterceptor.to("MessagePhase", false); + const consoleSpy = vi.spyOn(console, "log"); + await game.phaseInterceptor.to("MoveEndPhase", true); + expect(consoleSpy).nthCalledWith(1, i18next.t("moveTriggers:lostFocus")); + }); }); From b1b71dbd6d222fa3fce7e76d3b05c0a7636741a7 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 22 Feb 2025 17:37:52 -0600 Subject: [PATCH 15/83] [Test] Fix annoying BBCodeText error messages in tests (#5395) --- src/test/utils/gameWrapper.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index 3ba9cae3c8d..e8addcfc1d9 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -15,6 +15,7 @@ import MockTextureManager from "#test/utils/mocks/mockTextureManager"; import fs from "fs"; import Phaser from "phaser"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { vi } from "vitest"; import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; import InputManager = Phaser.Input.InputManager; @@ -33,7 +34,8 @@ Object.defineProperty(window, "console", { value: mockConsoleLog(false), }); - +BBCodeText.prototype.destroy = () => null; +BBCodeText.prototype.resize = () => null; InputText.prototype.setElement = () => null; InputText.prototype.resize = () => null; Phaser.GameObjects.Image = MockImage; From bd288ad8627a6b3a38547058b0752178de719818 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sun, 23 Feb 2025 00:38:11 +0100 Subject: [PATCH 16/83] [UI] Adding container to set transparency of optionSelectText (#5396) --- src/ui/abstact-option-select-ui-handler.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index 10dbedd7b2f..07e43a344dd 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -35,6 +35,7 @@ const scrollDownLabel = "↓"; export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected optionSelectContainer: Phaser.GameObjects.Container; + protected optionSelectTextContainer: Phaser.GameObjects.Container; protected optionSelectBg: Phaser.GameObjects.NineSlice; protected optionSelectText: BBCodeText; protected optionSelectIcons: Phaser.GameObjects.Sprite[]; @@ -53,6 +54,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected unskippedIndices: number[] = []; protected defaultTextStyle: TextStyle = TextStyle.WINDOW; + protected textContent: string; constructor(mode: Mode | null) { @@ -78,6 +80,9 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { this.optionSelectBg.setOrigin(1, 1); this.optionSelectContainer.add(this.optionSelectBg); + this.optionSelectTextContainer = globalScene.add.container(0, 0); + this.optionSelectContainer.add(this.optionSelectTextContainer); + this.optionSelectIcons = []; this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; @@ -123,19 +128,18 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { ); this.optionSelectText.setOrigin(0, 0); this.optionSelectText.setName("text-option-select"); - this.optionSelectContainer.add(this.optionSelectText); + this.optionSelectTextContainer.add(this.optionSelectText); this.optionSelectContainer.setPosition((globalScene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0)); this.optionSelectBg.width = Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()); this.optionSelectBg.height = this.getWindowHeight(); - this.optionSelectText.setPosition(this.optionSelectBg.x - this.optionSelectBg.width + 12 + 24 * this.scale, this.optionSelectBg.y - this.optionSelectBg.height + 2 + 42 * this.scale); + this.optionSelectTextContainer.setPosition(this.optionSelectBg.x - this.optionSelectBg.width + 12 + 24 * this.scale, this.optionSelectBg.y - this.optionSelectBg.height + 2 + 42 * this.scale); // Now that the container and background widths are established, we can set up the proper text restricted to visible options - this.optionSelectText.setText(optionsWithScroll.map(o => o.item + this.textContent = optionsWithScroll.map(o => o.item ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]` - ).join("\n") - - ); + ).join("\n"); + this.optionSelectText.setText(this.textContent); options.forEach((option: OptionSelectItem, i: number) => { if (option.item) { @@ -184,7 +188,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { if (this.config.delay) { this.blockInput = true; - this.optionSelectText.setAlpha(0.5); + this.optionSelectTextContainer.setAlpha(0.5); this.cursorObj?.setAlpha(0.8); globalScene.time.delayedCall(Utils.fixedInt(this.config.delay), () => this.unblockInput()); } @@ -278,7 +282,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } this.blockInput = false; - this.optionSelectText.setAlpha(1); + this.optionSelectTextContainer.setAlpha(1); this.cursorObj?.setAlpha(1); } From a51a504155f7e506203a4a5aafc51f2ce5c4a897 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 22 Feb 2025 22:52:07 -0600 Subject: [PATCH 17/83] [Test] Move test folder out of src (#5398) * move test folder * Update vitest files * rename test/utils to test/testUtils * Remove stray utils/gameManager Got put back from a rebase --- .dependency-cruiser.cjs | 2 +- create-test-boilerplate.js | 8 +++--- eslint.config.js | 4 +-- .../abilities/ability_duplication.test.ts | 2 +- .../abilities/ability_timing.test.ts | 2 +- {src/test => test}/abilities/analytic.test.ts | 2 +- .../abilities/arena_trap.test.ts | 2 +- .../abilities/aroma_veil.test.ts | 2 +- .../abilities/aura_break.test.ts | 2 +- {src/test => test}/abilities/battery.test.ts | 2 +- .../abilities/battle_bond.test.ts | 2 +- .../abilities/beast_boost.test.ts | 2 +- .../test => test}/abilities/commander.test.ts | 2 +- .../abilities/competitive.test.ts | 2 +- {src/test => test}/abilities/contrary.test.ts | 2 +- .../test => test}/abilities/corrosion.test.ts | 2 +- {src/test => test}/abilities/costar.test.ts | 2 +- {src/test => test}/abilities/dancer.test.ts | 2 +- {src/test => test}/abilities/defiant.test.ts | 2 +- .../abilities/desolate-land.test.ts | 2 +- {src/test => test}/abilities/disguise.test.ts | 2 +- {src/test => test}/abilities/dry_skin.test.ts | 2 +- .../abilities/early_bird.test.ts | 2 +- .../abilities/flash_fire.test.ts | 2 +- .../abilities/flower_gift.test.ts | 2 +- {src/test => test}/abilities/forecast.test.ts | 2 +- .../abilities/friend_guard.test.ts | 2 +- .../test => test}/abilities/galvanize.test.ts | 2 +- .../abilities/good_as_gold.test.ts | 2 +- .../abilities/gorilla_tactics.test.ts | 2 +- .../abilities/gulp_missile.test.ts | 2 +- .../test => test}/abilities/heatproof.test.ts | 2 +- .../abilities/honey_gather.test.ts | 2 +- {src/test => test}/abilities/hustle.test.ts | 2 +- .../abilities/hyper_cutter.test.ts | 2 +- {src/test => test}/abilities/ice_face.test.ts | 2 +- .../abilities/illuminate.test.ts | 2 +- {src/test => test}/abilities/imposter.test.ts | 2 +- .../abilities/infiltrator.test.ts | 2 +- .../abilities/intimidate.test.ts | 4 +-- .../abilities/intrepid_sword.test.ts | 2 +- {src/test => test}/abilities/libero.test.ts | 2 +- .../abilities/magic_bounce.test.ts | 2 +- .../abilities/magic_guard.test.ts | 2 +- {src/test => test}/abilities/mimicry.test.ts | 2 +- .../abilities/mirror_armor.test.ts | 2 +- {src/test => test}/abilities/moody.test.ts | 2 +- {src/test => test}/abilities/moxie.test.ts | 2 +- {src/test => test}/abilities/mummy.test.ts | 2 +- .../abilities/mycelium_might.test.ts | 2 +- {src/test => test}/abilities/no_guard.test.ts | 2 +- .../abilities/parental_bond.test.ts | 2 +- .../abilities/pastel_veil.test.ts | 2 +- .../abilities/perish_body.test.ts | 2 +- .../abilities/power_construct.test.ts | 2 +- .../abilities/power_spot.test.ts | 2 +- {src/test => test}/abilities/protean.test.ts | 2 +- .../abilities/protosynthesis.test.ts | 2 +- .../abilities/quick_draw.test.ts | 2 +- .../test => test}/abilities/sand_spit.test.ts | 2 +- .../test => test}/abilities/sand_veil.test.ts | 2 +- .../abilities/sap_sipper.test.ts | 2 +- .../test => test}/abilities/schooling.test.ts | 2 +- .../abilities/screen_cleaner.test.ts | 2 +- .../abilities/seed_sower.test.ts | 2 +- .../abilities/serene_grace.test.ts | 2 +- .../abilities/sheer_force.test.ts | 2 +- .../abilities/shield_dust.test.ts | 2 +- .../abilities/shields_down.test.ts | 2 +- {src/test => test}/abilities/simple.test.ts | 2 +- .../abilities/speed_boost.test.ts | 2 +- {src/test => test}/abilities/stakeout.test.ts | 2 +- {src/test => test}/abilities/stall.test.ts | 2 +- .../abilities/steely_spirit.test.ts | 2 +- {src/test => test}/abilities/sturdy.test.ts | 2 +- .../abilities/supreme_overlord.test.ts | 2 +- .../abilities/sweet_veil.test.ts | 2 +- .../abilities/synchronize.test.ts | 2 +- .../abilities/tera_shell.test.ts | 2 +- {src/test => test}/abilities/trace.test.ts | 2 +- {src/test => test}/abilities/unburden.test.ts | 2 +- .../abilities/unseen_fist.test.ts | 2 +- .../abilities/volt_absorb.test.ts | 2 +- .../abilities/wandering_spirit.test.ts | 2 +- {src/test => test}/abilities/wimp_out.test.ts | 2 +- .../abilities/wind_power.test.ts | 2 +- .../abilities/wind_rider.test.ts | 2 +- .../abilities/wonder_skin.test.ts | 2 +- {src/test => test}/abilities/zen_mode.test.ts | 2 +- .../abilities/zero_to_hero.test.ts | 2 +- {src/test => test}/account.test.ts | 2 +- .../achievements/achievement.test.ts | 4 +-- .../test => test}/arena/arena_gravity.test.ts | 2 +- .../arena/grassy_terrain.test.ts | 2 +- {src/test => test}/arena/weather_fog.test.ts | 2 +- {src/test => test}/arena/weather_hail.test.ts | 2 +- .../arena/weather_sandstorm.test.ts | 2 +- .../arena/weather_strong_winds.test.ts | 2 +- {src/test => test}/battle-scene.test.ts | 2 +- .../test => test}/battle/ability_swap.test.ts | 2 +- .../test => test}/battle/battle-order.test.ts | 2 +- {src/test => test}/battle/battle.test.ts | 6 ++-- .../battle/damage_calculation.test.ts | 2 +- .../battle/double_battle.test.ts | 2 +- .../battle/inverse_battle.test.ts | 2 +- .../battle/special_battle.test.ts | 2 +- .../battlerTags/octolock.test.ts | 2 +- .../battlerTags/stockpiling.test.ts | 2 +- .../battlerTags/substitute.test.ts | 0 {src/test => test}/boss-pokemon.test.ts | 2 +- {src/test => test}/daily_mode.test.ts | 2 +- .../data/splash_messages.test.ts | 0 {src/test => test}/data/status_effect.test.ts | 4 +-- {src/test => test}/eggs/egg.test.ts | 4 +-- {src/test => test}/eggs/manaphy-egg.test.ts | 4 +-- {src/test => test}/endless_boss.test.ts | 2 +- {src/test => test}/enemy_command.test.ts | 2 +- .../test => test}/escape-calculations.test.ts | 2 +- {src/test => test}/evolution.test.ts | 2 +- {src/test => test}/field/pokemon.test.ts | 2 +- {src/test => test}/final_boss.test.ts | 2 +- {src/test => test}/fontFace.setup.ts | 0 {src/test => test}/game-mode.test.ts | 4 +-- {src/test => test}/imports.test.ts | 0 {src/test => test}/inputs/inputs.test.ts | 4 +-- {src/test => test}/internals.test.ts | 2 +- {src/test => test}/items/dire_hit.test.ts | 2 +- .../double_battle_chance_booster.test.ts | 2 +- {src/test => test}/items/eviolite.test.ts | 2 +- {src/test => test}/items/exp_booster.test.ts | 2 +- {src/test => test}/items/grip_claw.test.ts | 2 +- {src/test => test}/items/leek.test.ts | 2 +- {src/test => test}/items/leftovers.test.ts | 2 +- {src/test => test}/items/light_ball.test.ts | 2 +- {src/test => test}/items/lock_capsule.test.ts | 2 +- {src/test => test}/items/metal_powder.test.ts | 2 +- {src/test => test}/items/multi_lens.test.ts | 2 +- {src/test => test}/items/quick_powder.test.ts | 2 +- {src/test => test}/items/scope_lens.test.ts | 2 +- .../items/temp_stat_stage_booster.test.ts | 2 +- {src/test => test}/items/thick_club.test.ts | 2 +- {src/test => test}/items/toxic_orb.test.ts | 2 +- {src/test => test}/misc.test.ts | 4 +-- {src/test => test}/moves/after_you.test.ts | 2 +- .../moves/alluring_voice.test.ts | 2 +- {src/test => test}/moves/aromatherapy.test.ts | 2 +- {src/test => test}/moves/assist.test.ts | 2 +- {src/test => test}/moves/astonish.test.ts | 2 +- {src/test => test}/moves/aurora_veil.test.ts | 2 +- {src/test => test}/moves/autotomize.test.ts | 2 +- {src/test => test}/moves/baddy_bad.test.ts | 2 +- .../moves/baneful_bunker.test.ts | 2 +- {src/test => test}/moves/baton_pass.test.ts | 2 +- {src/test => test}/moves/beak_blast.test.ts | 2 +- {src/test => test}/moves/beat_up.test.ts | 2 +- {src/test => test}/moves/belly_drum.test.ts | 2 +- .../moves/burning_jealousy.test.ts | 2 +- {src/test => test}/moves/camouflage.test.ts | 2 +- .../moves/ceaseless_edge.test.ts | 2 +- .../moves/chilly_reception.test.ts | 2 +- {src/test => test}/moves/chloroblast.test.ts | 2 +- .../moves/clangorous_soul.test.ts | 2 +- {src/test => test}/moves/copycat.test.ts | 2 +- .../test => test}/moves/crafty_shield.test.ts | 2 +- {src/test => test}/moves/defog.test.ts | 2 +- {src/test => test}/moves/destiny_bond.test.ts | 2 +- .../test => test}/moves/diamond_storm.test.ts | 2 +- {src/test => test}/moves/dig.test.ts | 2 +- {src/test => test}/moves/disable.test.ts | 2 +- {src/test => test}/moves/dive.test.ts | 2 +- {src/test => test}/moves/doodle.test.ts | 2 +- {src/test => test}/moves/double_team.test.ts | 2 +- {src/test => test}/moves/dragon_cheer.test.ts | 2 +- {src/test => test}/moves/dragon_rage.test.ts | 2 +- {src/test => test}/moves/dragon_tail.test.ts | 2 +- .../moves/dynamax_cannon.test.ts | 2 +- .../test => test}/moves/effectiveness.test.ts | 2 +- {src/test => test}/moves/electrify.test.ts | 2 +- {src/test => test}/moves/electro_shot.test.ts | 2 +- {src/test => test}/moves/encore.test.ts | 2 +- {src/test => test}/moves/endure.test.ts | 2 +- {src/test => test}/moves/entrainment.test.ts | 2 +- {src/test => test}/moves/fairy_lock.test.ts | 2 +- {src/test => test}/moves/fake_out.test.ts | 2 +- {src/test => test}/moves/fell_stinger.test.ts | 2 +- {src/test => test}/moves/fillet_away.test.ts | 2 +- {src/test => test}/moves/fissure.test.ts | 2 +- {src/test => test}/moves/flame_burst.test.ts | 2 +- .../test => test}/moves/flower_shield.test.ts | 2 +- {src/test => test}/moves/fly.test.ts | 2 +- {src/test => test}/moves/focus_punch.test.ts | 2 +- {src/test => test}/moves/follow_me.test.ts | 2 +- {src/test => test}/moves/foresight.test.ts | 2 +- .../test => test}/moves/forests_curse.test.ts | 2 +- {src/test => test}/moves/freeze_dry.test.ts | 2 +- {src/test => test}/moves/freezy_frost.test.ts | 2 +- {src/test => test}/moves/fusion_bolt.test.ts | 2 +- {src/test => test}/moves/fusion_flare.test.ts | 2 +- .../moves/fusion_flare_bolt.test.ts | 2 +- {src/test => test}/moves/future_sight.test.ts | 2 +- {src/test => test}/moves/gastro_acid.test.ts | 2 +- {src/test => test}/moves/geomancy.test.ts | 2 +- .../moves/gigaton_hammer.test.ts | 2 +- {src/test => test}/moves/glaive_rush.test.ts | 2 +- {src/test => test}/moves/growth.test.ts | 2 +- {src/test => test}/moves/grudge.test.ts | 2 +- {src/test => test}/moves/guard_split.test.ts | 2 +- {src/test => test}/moves/guard_swap.test.ts | 2 +- {src/test => test}/moves/hard_press.test.ts | 2 +- {src/test => test}/moves/haze.test.ts | 2 +- {src/test => test}/moves/heal_bell.test.ts | 2 +- {src/test => test}/moves/heal_block.test.ts | 2 +- {src/test => test}/moves/heart_swap.test.ts | 2 +- {src/test => test}/moves/hyper_beam.test.ts | 2 +- {src/test => test}/moves/imprison.test.ts | 2 +- {src/test => test}/moves/instruct.test.ts | 2 +- {src/test => test}/moves/jaw_lock.test.ts | 2 +- {src/test => test}/moves/lash_out.test.ts | 2 +- .../test => test}/moves/last_respects.test.ts | 2 +- {src/test => test}/moves/light_screen.test.ts | 2 +- {src/test => test}/moves/lucky_chant.test.ts | 2 +- .../moves/lunar_blessing.test.ts | 2 +- {src/test => test}/moves/lunar_dance.test.ts | 2 +- {src/test => test}/moves/magic_coat.test.ts | 2 +- {src/test => test}/moves/magnet_rise.test.ts | 2 +- {src/test => test}/moves/make_it_rain.test.ts | 2 +- {src/test => test}/moves/mat_block.test.ts | 2 +- {src/test => test}/moves/metal_burst.test.ts | 2 +- {src/test => test}/moves/metronome.test.ts | 2 +- {src/test => test}/moves/miracle_eye.test.ts | 2 +- {src/test => test}/moves/mirror_move.test.ts | 2 +- {src/test => test}/moves/mist.test.ts | 2 +- .../moves/moongeist_beam.test.ts | 2 +- {src/test => test}/moves/multi_target.test.ts | 2 +- {src/test => test}/moves/nightmare.test.ts | 2 +- {src/test => test}/moves/obstruct.test.ts | 2 +- {src/test => test}/moves/octolock.test.ts | 2 +- {src/test => test}/moves/order_up.test.ts | 2 +- {src/test => test}/moves/parting_shot.test.ts | 2 +- {src/test => test}/moves/plasma_fists.test.ts | 2 +- {src/test => test}/moves/pledge_moves.test.ts | 2 +- {src/test => test}/moves/powder.test.ts | 2 +- {src/test => test}/moves/power_shift.test.ts | 2 +- {src/test => test}/moves/power_split.test.ts | 2 +- {src/test => test}/moves/power_swap.test.ts | 2 +- {src/test => test}/moves/power_trick.test.ts | 2 +- {src/test => test}/moves/protect.test.ts | 2 +- {src/test => test}/moves/psycho_shift.test.ts | 2 +- {src/test => test}/moves/purify.test.ts | 2 +- {src/test => test}/moves/quash.test.ts | 2 +- {src/test => test}/moves/quick_guard.test.ts | 2 +- {src/test => test}/moves/rage_fist.test.ts | 2 +- {src/test => test}/moves/rage_powder.test.ts | 2 +- {src/test => test}/moves/reflect.test.ts | 2 +- {src/test => test}/moves/reflect_type.test.ts | 2 +- {src/test => test}/moves/relic_song.test.ts | 2 +- {src/test => test}/moves/retaliate.test.ts | 2 +- .../moves/revival_blessing.test.ts | 2 +- {src/test => test}/moves/role_play.test.ts | 2 +- {src/test => test}/moves/rollout.test.ts | 2 +- {src/test => test}/moves/roost.test.ts | 2 +- {src/test => test}/moves/round.test.ts | 2 +- {src/test => test}/moves/safeguard.test.ts | 2 +- {src/test => test}/moves/scale_shot.test.ts | 2 +- {src/test => test}/moves/secret_power.test.ts | 2 +- {src/test => test}/moves/shed_tail.test.ts | 2 +- .../moves/shell_side_arm.test.ts | 2 +- {src/test => test}/moves/shell_trap.test.ts | 2 +- {src/test => test}/moves/simple_beam.test.ts | 2 +- {src/test => test}/moves/sketch.test.ts | 2 +- {src/test => test}/moves/skill_swap.test.ts | 2 +- {src/test => test}/moves/sleep_talk.test.ts | 2 +- {src/test => test}/moves/solar_beam.test.ts | 2 +- .../test => test}/moves/sparkly_swirl.test.ts | 2 +- .../moves/spectral_thief.test.ts | 2 +- {src/test => test}/moves/speed_swap.test.ts | 2 +- {src/test => test}/moves/spikes.test.ts | 2 +- {src/test => test}/moves/spit_up.test.ts | 2 +- {src/test => test}/moves/spotlight.test.ts | 2 +- {src/test => test}/moves/steamroller.test.ts | 2 +- {src/test => test}/moves/stockpile.test.ts | 2 +- {src/test => test}/moves/substitute.test.ts | 2 +- {src/test => test}/moves/swallow.test.ts | 2 +- {src/test => test}/moves/syrup_bomb.test.ts | 2 +- {src/test => test}/moves/tackle.test.ts | 2 +- {src/test => test}/moves/tail_whip.test.ts | 2 +- {src/test => test}/moves/tailwind.test.ts | 2 +- {src/test => test}/moves/tar_shot.test.ts | 2 +- {src/test => test}/moves/taunt.test.ts | 2 +- {src/test => test}/moves/telekinesis.test.ts | 2 +- {src/test => test}/moves/tera_blast.test.ts | 2 +- .../moves/tera_starstorm.test.ts | 2 +- .../moves/thousand_arrows.test.ts | 2 +- {src/test => test}/moves/throat_chop.test.ts | 2 +- {src/test => test}/moves/thunder_wave.test.ts | 2 +- {src/test => test}/moves/tidy_up.test.ts | 2 +- {src/test => test}/moves/torment.test.ts | 2 +- {src/test => test}/moves/toxic.test.ts | 2 +- {src/test => test}/moves/toxic_spikes.test.ts | 2 +- {src/test => test}/moves/transform.test.ts | 2 +- .../moves/trick_or_treat.test.ts | 2 +- .../test => test}/moves/triple_arrows.test.ts | 2 +- {src/test => test}/moves/u_turn.test.ts | 2 +- {src/test => test}/moves/upper_hand.test.ts | 2 +- {src/test => test}/moves/whirlwind.test.ts | 2 +- {src/test => test}/moves/wide_guard.test.ts | 2 +- {src/test => test}/moves/will_o_wisp.test.ts | 2 +- .../mystery-encounter/encounter-test-utils.ts | 2 +- .../a-trainers-test-encounter.test.ts | 4 +-- .../absolute-avarice-encounter.test.ts | 2 +- ...an-offer-you-cant-refuse-encounter.test.ts | 4 +-- .../berries-abound-encounter.test.ts | 4 +-- .../bug-type-superfan-encounter.test.ts | 4 +-- .../clowning-around-encounter.test.ts | 4 +-- .../dancing-lessons-encounter.test.ts | 2 +- .../encounters/delibirdy-encounter.test.ts | 2 +- .../department-store-sale-encounter.test.ts | 2 +- .../encounters/field-trip-encounter.test.ts | 2 +- .../fiery-fallout-encounter.test.ts | 4 +-- .../fight-or-flight-encounter.test.ts | 4 +-- .../fun-and-games-encounter.test.ts | 4 +-- .../global-trade-system-encounter.test.ts | 2 +- .../encounters/lost-at-sea-encounter.test.ts | 4 +-- .../mysterious-challengers-encounter.test.ts | 4 +-- .../encounters/part-timer-encounter.test.ts | 2 +- .../encounters/safari-zone.test.ts | 4 +-- .../teleporting-hijinks-encounter.test.ts | 4 +-- .../the-expert-breeder-encounter.test.ts | 4 +-- .../the-pokemon-salesman-encounter.test.ts | 4 +-- .../the-strong-stuff-encounter.test.ts | 4 +-- .../the-winstrate-challenge-encounter.test.ts | 4 +-- .../trash-to-treasure-encounter.test.ts | 4 +-- .../uncommon-breed-encounter.test.ts | 4 +-- .../encounters/weird-dream-encounter.test.ts | 4 +-- .../mystery-encounter-utils.test.ts | 4 +-- .../mystery-encounter.test.ts | 2 +- .../phases/form-change-phase.test.ts | 2 +- .../phases/frenzy-move-reset.test.ts | 2 +- .../phases/game-over-phase.test.ts | 2 +- .../phases/learn-move-phase.test.ts | 2 +- .../phases/mystery-encounter-phase.test.ts | 2 +- {src/test => test}/phases/phases.test.ts | 2 +- .../phases/select-modifier-phase.test.ts | 4 +-- .../plugins/api/pokerogue-account-api.test.ts | 2 +- .../plugins/api/pokerogue-admin-api.test.ts | 2 +- .../plugins/api/pokerogue-api.test.ts | 2 +- .../plugins/api/pokerogue-daily-api.test.ts | 2 +- .../api/pokerogue-savedata-api.test.ts | 2 +- .../pokerogue-session-savedata-api.test.ts | 2 +- .../api/pokerogue-system-savedata-api.test.ts | 2 +- {src/test => test}/pre.test.ts | 0 {src/test => test}/reload.test.ts | 4 +-- .../settingMenu/helpers/inGameManip.ts | 0 .../settingMenu/helpers/menuManip.ts | 13 ++++++++- .../settingMenu/rebinding_setting.test.ts | 0 .../sprites/pokemonSprite.test.ts | 2 +- {src/test => test}/sprites/spritesUtils.ts | 0 {src/test => test}/system/game_data.test.ts | 4 +-- .../testUtils}/TextInterceptor.ts | 0 .../testUtils}/errorInterceptor.ts | 0 .../utils => test/testUtils}/fakeMobile.html | 0 .../utils => test/testUtils}/gameManager.ts | 28 +++++++++---------- .../testUtils}/gameManagerUtils.ts | 0 .../utils => test/testUtils}/gameWrapper.ts | 18 ++++++------ .../testUtils}/helpers/challengeModeHelper.ts | 0 .../testUtils}/helpers/classicModeHelper.ts | 0 .../testUtils}/helpers/dailyModeHelper.ts | 0 .../testUtils}/helpers/gameManagerHelper.ts | 0 .../testUtils}/helpers/modifiersHelper.ts | 0 .../testUtils}/helpers/moveHelper.ts | 4 +-- .../testUtils}/helpers/overridesHelper.ts | 0 .../testUtils}/helpers/reloadHelper.ts | 0 .../testUtils}/helpers/settingsHelper.ts | 0 .../utils => test/testUtils}/inputsHandler.ts | 4 +-- .../testUtils}/mocks/mockClock.ts | 0 .../testUtils}/mocks/mockConsoleLog.ts | 0 .../testUtils}/mocks/mockFetch.ts | 0 .../testUtils}/mocks/mockGameObject.ts | 0 .../testUtils}/mocks/mockGameObjectCreator.ts | 0 .../testUtils}/mocks/mockLoader.ts | 0 .../testUtils}/mocks/mockLocalStorage.ts | 0 .../testUtils}/mocks/mockTextureManager.ts | 16 +++++------ .../testUtils}/mocks/mockTimedEventManager.ts | 0 .../testUtils}/mocks/mockVideoGameObject.ts | 0 .../mocks/mocksContainer/mockContainer.ts | 2 +- .../mocks/mocksContainer/mockGraphics.ts | 0 .../mocks/mocksContainer/mockImage.ts | 2 +- .../mocks/mocksContainer/mockNineslice.ts | 2 +- .../mocks/mocksContainer/mockPolygon.ts | 2 +- .../mocks/mocksContainer/mockRectangle.ts | 0 .../mocks/mocksContainer/mockSprite.ts | 0 .../mocks/mocksContainer/mockText.ts | 0 .../mocks/mocksContainer/mockTexture.ts | 2 +- .../testUtils}/phaseInterceptor.ts | 2 +- .../testUtils}/saves/data_new.prsv | 0 .../testUtils}/saves/everything.prsv | 0 .../utils => test/testUtils}/testUtils.ts | 0 {src/test => test}/ui/battle_info.test.ts | 2 +- {src/test => test}/ui/starter-select.test.ts | 20 ++++++------- {src/test => test}/ui/transfer-item.test.ts | 2 +- {src/test => test}/ui/type-hints.test.ts | 4 +-- {src/test => test}/vitest.setup.ts | 2 +- tsconfig.json | 6 ++-- vitest.config.ts | 6 ++-- vitest.workspace.ts | 2 +- 405 files changed, 461 insertions(+), 450 deletions(-) rename {src/test => test}/abilities/ability_duplication.test.ts (96%) rename {src/test => test}/abilities/ability_timing.test.ts (96%) rename {src/test => test}/abilities/analytic.test.ts (98%) rename {src/test => test}/abilities/arena_trap.test.ts (98%) rename {src/test => test}/abilities/aroma_veil.test.ts (97%) rename {src/test => test}/abilities/aura_break.test.ts (97%) rename {src/test => test}/abilities/battery.test.ts (97%) rename {src/test => test}/abilities/battle_bond.test.ts (98%) rename {src/test => test}/abilities/beast_boost.test.ts (98%) rename {src/test => test}/abilities/commander.test.ts (99%) rename {src/test => test}/abilities/competitive.test.ts (97%) rename {src/test => test}/abilities/contrary.test.ts (97%) rename {src/test => test}/abilities/corrosion.test.ts (96%) rename {src/test => test}/abilities/costar.test.ts (97%) rename {src/test => test}/abilities/dancer.test.ts (98%) rename {src/test => test}/abilities/defiant.test.ts (97%) rename {src/test => test}/abilities/desolate-land.test.ts (98%) rename {src/test => test}/abilities/disguise.test.ts (99%) rename {src/test => test}/abilities/dry_skin.test.ts (98%) rename {src/test => test}/abilities/early_bird.test.ts (98%) rename {src/test => test}/abilities/flash_fire.test.ts (99%) rename {src/test => test}/abilities/flower_gift.test.ts (99%) rename {src/test => test}/abilities/forecast.test.ts (99%) rename {src/test => test}/abilities/friend_guard.test.ts (98%) rename {src/test => test}/abilities/galvanize.test.ts (98%) rename {src/test => test}/abilities/good_as_gold.test.ts (99%) rename {src/test => test}/abilities/gorilla_tactics.test.ts (98%) rename {src/test => test}/abilities/gulp_missile.test.ts (99%) rename {src/test => test}/abilities/heatproof.test.ts (97%) rename {src/test => test}/abilities/honey_gather.test.ts (97%) rename {src/test => test}/abilities/hustle.test.ts (98%) rename {src/test => test}/abilities/hyper_cutter.test.ts (96%) rename {src/test => test}/abilities/ice_face.test.ts (99%) rename {src/test => test}/abilities/illuminate.test.ts (96%) rename {src/test => test}/abilities/imposter.test.ts (98%) rename {src/test => test}/abilities/infiltrator.test.ts (98%) rename {src/test => test}/abilities/intimidate.test.ts (97%) rename {src/test => test}/abilities/intrepid_sword.test.ts (95%) rename {src/test => test}/abilities/libero.test.ts (99%) rename {src/test => test}/abilities/magic_bounce.test.ts (99%) rename {src/test => test}/abilities/magic_guard.test.ts (99%) rename {src/test => test}/abilities/mimicry.test.ts (98%) rename {src/test => test}/abilities/mirror_armor.test.ts (99%) rename {src/test => test}/abilities/moody.test.ts (98%) rename {src/test => test}/abilities/moxie.test.ts (97%) rename {src/test => test}/abilities/mummy.test.ts (96%) rename {src/test => test}/abilities/mycelium_might.test.ts (98%) rename {src/test => test}/abilities/no_guard.test.ts (97%) rename {src/test => test}/abilities/parental_bond.test.ts (99%) rename {src/test => test}/abilities/pastel_veil.test.ts (97%) rename {src/test => test}/abilities/perish_body.test.ts (98%) rename {src/test => test}/abilities/power_construct.test.ts (98%) rename {src/test => test}/abilities/power_spot.test.ts (97%) rename {src/test => test}/abilities/protean.test.ts (99%) rename {src/test => test}/abilities/protosynthesis.test.ts (97%) rename {src/test => test}/abilities/quick_draw.test.ts (98%) rename {src/test => test}/abilities/sand_spit.test.ts (97%) rename {src/test => test}/abilities/sand_veil.test.ts (97%) rename {src/test => test}/abilities/sap_sipper.test.ts (98%) rename {src/test => test}/abilities/schooling.test.ts (97%) rename {src/test => test}/abilities/screen_cleaner.test.ts (97%) rename {src/test => test}/abilities/seed_sower.test.ts (97%) rename {src/test => test}/abilities/serene_grace.test.ts (96%) rename {src/test => test}/abilities/sheer_force.test.ts (99%) rename {src/test => test}/abilities/shield_dust.test.ts (97%) rename {src/test => test}/abilities/shields_down.test.ts (99%) rename {src/test => test}/abilities/simple.test.ts (95%) rename {src/test => test}/abilities/speed_boost.test.ts (98%) rename {src/test => test}/abilities/stakeout.test.ts (97%) rename {src/test => test}/abilities/stall.test.ts (98%) rename {src/test => test}/abilities/steely_spirit.test.ts (98%) rename {src/test => test}/abilities/sturdy.test.ts (97%) rename {src/test => test}/abilities/supreme_overlord.test.ts (99%) rename {src/test => test}/abilities/sweet_veil.test.ts (98%) rename {src/test => test}/abilities/synchronize.test.ts (98%) rename {src/test => test}/abilities/tera_shell.test.ts (98%) rename {src/test => test}/abilities/trace.test.ts (96%) rename {src/test => test}/abilities/unburden.test.ts (99%) rename {src/test => test}/abilities/unseen_fist.test.ts (98%) rename {src/test => test}/abilities/volt_absorb.test.ts (98%) rename {src/test => test}/abilities/wandering_spirit.test.ts (97%) rename {src/test => test}/abilities/wimp_out.test.ts (99%) rename {src/test => test}/abilities/wind_power.test.ts (98%) rename {src/test => test}/abilities/wind_rider.test.ts (98%) rename {src/test => test}/abilities/wonder_skin.test.ts (97%) rename {src/test => test}/abilities/zen_mode.test.ts (98%) rename {src/test => test}/abilities/zero_to_hero.test.ts (98%) rename {src/test => test}/account.test.ts (99%) rename {src/test => test}/achievements/achievement.test.ts (99%) rename {src/test => test}/arena/arena_gravity.test.ts (98%) rename {src/test => test}/arena/grassy_terrain.test.ts (97%) rename {src/test => test}/arena/weather_fog.test.ts (96%) rename {src/test => test}/arena/weather_hail.test.ts (97%) rename {src/test => test}/arena/weather_sandstorm.test.ts (98%) rename {src/test => test}/arena/weather_strong_winds.test.ts (98%) rename {src/test => test}/battle-scene.test.ts (93%) rename {src/test => test}/battle/ability_swap.test.ts (97%) rename {src/test => test}/battle/battle-order.test.ts (99%) rename {src/test => test}/battle/battle.test.ts (98%) rename {src/test => test}/battle/damage_calculation.test.ts (98%) rename {src/test => test}/battle/double_battle.test.ts (98%) rename {src/test => test}/battle/inverse_battle.test.ts (99%) rename {src/test => test}/battle/special_battle.test.ts (98%) rename {src/test => test}/battlerTags/octolock.test.ts (96%) rename {src/test => test}/battlerTags/stockpiling.test.ts (99%) rename {src/test => test}/battlerTags/substitute.test.ts (100%) rename {src/test => test}/boss-pokemon.test.ts (99%) rename {src/test => test}/daily_mode.test.ts (98%) rename {src/test => test}/data/splash_messages.test.ts (100%) rename {src/test => test}/data/status_effect.test.ts (99%) rename {src/test => test}/eggs/egg.test.ts (99%) rename {src/test => test}/eggs/manaphy-egg.test.ts (96%) rename {src/test => test}/endless_boss.test.ts (98%) rename {src/test => test}/enemy_command.test.ts (98%) rename {src/test => test}/escape-calculations.test.ts (99%) rename {src/test => test}/evolution.test.ts (99%) rename {src/test => test}/field/pokemon.test.ts (99%) rename {src/test => test}/final_boss.test.ts (99%) rename {src/test => test}/fontFace.setup.ts (100%) rename {src/test => test}/game-mode.test.ts (95%) rename {src/test => test}/imports.test.ts (100%) rename {src/test => test}/inputs/inputs.test.ts (96%) rename {src/test => test}/internals.test.ts (95%) rename {src/test => test}/items/dire_hit.test.ts (98%) rename {src/test => test}/items/double_battle_chance_booster.test.ts (98%) rename {src/test => test}/items/eviolite.test.ts (99%) rename {src/test => test}/items/exp_booster.test.ts (95%) rename {src/test => test}/items/grip_claw.test.ts (98%) rename {src/test => test}/items/leek.test.ts (98%) rename {src/test => test}/items/leftovers.test.ts (97%) rename {src/test => test}/items/light_ball.test.ts (99%) rename {src/test => test}/items/lock_capsule.test.ts (96%) rename {src/test => test}/items/metal_powder.test.ts (99%) rename {src/test => test}/items/multi_lens.test.ts (99%) rename {src/test => test}/items/quick_powder.test.ts (99%) rename {src/test => test}/items/scope_lens.test.ts (95%) rename {src/test => test}/items/temp_stat_stage_booster.test.ts (99%) rename {src/test => test}/items/thick_club.test.ts (99%) rename {src/test => test}/items/toxic_orb.test.ts (96%) rename {src/test => test}/misc.test.ts (95%) rename {src/test => test}/moves/after_you.test.ts (97%) rename {src/test => test}/moves/alluring_voice.test.ts (96%) rename {src/test => test}/moves/aromatherapy.test.ts (98%) rename {src/test => test}/moves/assist.test.ts (98%) rename {src/test => test}/moves/astonish.test.ts (97%) rename {src/test => test}/moves/aurora_veil.test.ts (98%) rename {src/test => test}/moves/autotomize.test.ts (98%) rename {src/test => test}/moves/baddy_bad.test.ts (95%) rename {src/test => test}/moves/baneful_bunker.test.ts (98%) rename {src/test => test}/moves/baton_pass.test.ts (98%) rename {src/test => test}/moves/beak_blast.test.ts (98%) rename {src/test => test}/moves/beat_up.test.ts (97%) rename {src/test => test}/moves/belly_drum.test.ts (98%) rename {src/test => test}/moves/burning_jealousy.test.ts (98%) rename {src/test => test}/moves/camouflage.test.ts (96%) rename {src/test => test}/moves/ceaseless_edge.test.ts (98%) rename {src/test => test}/moves/chilly_reception.test.ts (98%) rename {src/test => test}/moves/chloroblast.test.ts (95%) rename {src/test => test}/moves/clangorous_soul.test.ts (98%) rename {src/test => test}/moves/copycat.test.ts (98%) rename {src/test => test}/moves/crafty_shield.test.ts (98%) rename {src/test => test}/moves/defog.test.ts (97%) rename {src/test => test}/moves/destiny_bond.test.ts (99%) rename {src/test => test}/moves/diamond_storm.test.ts (96%) rename {src/test => test}/moves/dig.test.ts (98%) rename {src/test => test}/moves/disable.test.ts (98%) rename {src/test => test}/moves/dive.test.ts (98%) rename {src/test => test}/moves/doodle.test.ts (97%) rename {src/test => test}/moves/double_team.test.ts (96%) rename {src/test => test}/moves/dragon_cheer.test.ts (98%) rename {src/test => test}/moves/dragon_rage.test.ts (98%) rename {src/test => test}/moves/dragon_tail.test.ts (99%) rename {src/test => test}/moves/dynamax_cannon.test.ts (99%) rename {src/test => test}/moves/effectiveness.test.ts (98%) rename {src/test => test}/moves/electrify.test.ts (97%) rename {src/test => test}/moves/electro_shot.test.ts (98%) rename {src/test => test}/moves/encore.test.ts (98%) rename {src/test => test}/moves/endure.test.ts (97%) rename {src/test => test}/moves/entrainment.test.ts (96%) rename {src/test => test}/moves/fairy_lock.test.ts (99%) rename {src/test => test}/moves/fake_out.test.ts (98%) rename {src/test => test}/moves/fell_stinger.test.ts (99%) rename {src/test => test}/moves/fillet_away.test.ts (98%) rename {src/test => test}/moves/fissure.test.ts (97%) rename {src/test => test}/moves/flame_burst.test.ts (98%) rename {src/test => test}/moves/flower_shield.test.ts (98%) rename {src/test => test}/moves/fly.test.ts (98%) rename {src/test => test}/moves/focus_punch.test.ts (98%) rename {src/test => test}/moves/follow_me.test.ts (98%) rename {src/test => test}/moves/foresight.test.ts (97%) rename {src/test => test}/moves/forests_curse.test.ts (96%) rename {src/test => test}/moves/freeze_dry.test.ts (99%) rename {src/test => test}/moves/freezy_frost.test.ts (98%) rename {src/test => test}/moves/fusion_bolt.test.ts (96%) rename {src/test => test}/moves/fusion_flare.test.ts (96%) rename {src/test => test}/moves/fusion_flare_bolt.test.ts (99%) rename {src/test => test}/moves/future_sight.test.ts (95%) rename {src/test => test}/moves/gastro_acid.test.ts (97%) rename {src/test => test}/moves/geomancy.test.ts (97%) rename {src/test => test}/moves/gigaton_hammer.test.ts (97%) rename {src/test => test}/moves/glaive_rush.test.ts (98%) rename {src/test => test}/moves/growth.test.ts (96%) rename {src/test => test}/moves/grudge.test.ts (98%) rename {src/test => test}/moves/guard_split.test.ts (97%) rename {src/test => test}/moves/guard_swap.test.ts (97%) rename {src/test => test}/moves/hard_press.test.ts (97%) rename {src/test => test}/moves/haze.test.ts (97%) rename {src/test => test}/moves/heal_bell.test.ts (98%) rename {src/test => test}/moves/heal_block.test.ts (98%) rename {src/test => test}/moves/heart_swap.test.ts (96%) rename {src/test => test}/moves/hyper_beam.test.ts (97%) rename {src/test => test}/moves/imprison.test.ts (98%) rename {src/test => test}/moves/instruct.test.ts (99%) rename {src/test => test}/moves/jaw_lock.test.ts (99%) rename {src/test => test}/moves/lash_out.test.ts (96%) rename {src/test => test}/moves/last_respects.test.ts (99%) rename {src/test => test}/moves/light_screen.test.ts (98%) rename {src/test => test}/moves/lucky_chant.test.ts (98%) rename {src/test => test}/moves/lunar_blessing.test.ts (97%) rename {src/test => test}/moves/lunar_dance.test.ts (98%) rename {src/test => test}/moves/magic_coat.test.ts (99%) rename {src/test => test}/moves/magnet_rise.test.ts (97%) rename {src/test => test}/moves/make_it_rain.test.ts (98%) rename {src/test => test}/moves/mat_block.test.ts (98%) rename {src/test => test}/moves/metal_burst.test.ts (98%) rename {src/test => test}/moves/metronome.test.ts (98%) rename {src/test => test}/moves/miracle_eye.test.ts (96%) rename {src/test => test}/moves/mirror_move.test.ts (98%) rename {src/test => test}/moves/mist.test.ts (96%) rename {src/test => test}/moves/moongeist_beam.test.ts (97%) rename {src/test => test}/moves/multi_target.test.ts (98%) rename {src/test => test}/moves/nightmare.test.ts (96%) rename {src/test => test}/moves/obstruct.test.ts (98%) rename {src/test => test}/moves/octolock.test.ts (98%) rename {src/test => test}/moves/order_up.test.ts (98%) rename {src/test => test}/moves/parting_shot.test.ts (99%) rename {src/test => test}/moves/plasma_fists.test.ts (98%) rename {src/test => test}/moves/pledge_moves.test.ts (99%) rename {src/test => test}/moves/powder.test.ts (99%) rename {src/test => test}/moves/power_shift.test.ts (97%) rename {src/test => test}/moves/power_split.test.ts (97%) rename {src/test => test}/moves/power_swap.test.ts (97%) rename {src/test => test}/moves/power_trick.test.ts (98%) rename {src/test => test}/moves/protect.test.ts (98%) rename {src/test => test}/moves/psycho_shift.test.ts (96%) rename {src/test => test}/moves/purify.test.ts (97%) rename {src/test => test}/moves/quash.test.ts (98%) rename {src/test => test}/moves/quick_guard.test.ts (98%) rename {src/test => test}/moves/rage_fist.test.ts (98%) rename {src/test => test}/moves/rage_powder.test.ts (97%) rename {src/test => test}/moves/reflect.test.ts (98%) rename {src/test => test}/moves/reflect_type.test.ts (97%) rename {src/test => test}/moves/relic_song.test.ts (97%) rename {src/test => test}/moves/retaliate.test.ts (96%) rename {src/test => test}/moves/revival_blessing.test.ts (98%) rename {src/test => test}/moves/role_play.test.ts (96%) rename {src/test => test}/moves/rollout.test.ts (98%) rename {src/test => test}/moves/roost.test.ts (99%) rename {src/test => test}/moves/round.test.ts (97%) rename {src/test => test}/moves/safeguard.test.ts (98%) rename {src/test => test}/moves/scale_shot.test.ts (98%) rename {src/test => test}/moves/secret_power.test.ts (98%) rename {src/test => test}/moves/shed_tail.test.ts (97%) rename {src/test => test}/moves/shell_side_arm.test.ts (97%) rename {src/test => test}/moves/shell_trap.test.ts (98%) rename {src/test => test}/moves/simple_beam.test.ts (95%) rename {src/test => test}/moves/sketch.test.ts (98%) rename {src/test => test}/moves/skill_swap.test.ts (96%) rename {src/test => test}/moves/sleep_talk.test.ts (97%) rename {src/test => test}/moves/solar_beam.test.ts (98%) rename {src/test => test}/moves/sparkly_swirl.test.ts (98%) rename {src/test => test}/moves/spectral_thief.test.ts (99%) rename {src/test => test}/moves/speed_swap.test.ts (96%) rename {src/test => test}/moves/spikes.test.ts (97%) rename {src/test => test}/moves/spit_up.test.ts (99%) rename {src/test => test}/moves/spotlight.test.ts (97%) rename {src/test => test}/moves/steamroller.test.ts (97%) rename {src/test => test}/moves/stockpile.test.ts (98%) rename {src/test => test}/moves/substitute.test.ts (99%) rename {src/test => test}/moves/swallow.test.ts (99%) rename {src/test => test}/moves/syrup_bomb.test.ts (98%) rename {src/test => test}/moves/tackle.test.ts (97%) rename {src/test => test}/moves/tail_whip.test.ts (96%) rename {src/test => test}/moves/tailwind.test.ts (98%) rename {src/test => test}/moves/tar_shot.test.ts (98%) rename {src/test => test}/moves/taunt.test.ts (96%) rename {src/test => test}/moves/telekinesis.test.ts (99%) rename {src/test => test}/moves/tera_blast.test.ts (96%) rename {src/test => test}/moves/tera_starstorm.test.ts (98%) rename {src/test => test}/moves/thousand_arrows.test.ts (98%) rename {src/test => test}/moves/throat_chop.test.ts (96%) rename {src/test => test}/moves/thunder_wave.test.ts (98%) rename {src/test => test}/moves/tidy_up.test.ts (98%) rename {src/test => test}/moves/torment.test.ts (97%) rename {src/test => test}/moves/toxic.test.ts (98%) rename {src/test => test}/moves/toxic_spikes.test.ts (98%) rename {src/test => test}/moves/transform.test.ts (98%) rename {src/test => test}/moves/trick_or_treat.test.ts (96%) rename {src/test => test}/moves/triple_arrows.test.ts (97%) rename {src/test => test}/moves/u_turn.test.ts (98%) rename {src/test => test}/moves/upper_hand.test.ts (98%) rename {src/test => test}/moves/whirlwind.test.ts (99%) rename {src/test => test}/moves/wide_guard.test.ts (98%) rename {src/test => test}/moves/will_o_wisp.test.ts (96%) rename {src/test => test}/mystery-encounter/encounter-test-utils.ts (99%) rename {src/test => test}/mystery-encounter/encounters/a-trainers-test-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/absolute-avarice-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/berries-abound-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/clowning-around-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/dancing-lessons-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/delibirdy-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/department-store-sale-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/field-trip-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/fiery-fallout-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/fight-or-flight-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/fun-and-games-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/global-trade-system-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/lost-at-sea-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/part-timer-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/safari-zone.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts (99%) rename {src/test => test}/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/uncommon-breed-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/encounters/weird-dream-encounter.test.ts (98%) rename {src/test => test}/mystery-encounter/mystery-encounter-utils.test.ts (98%) rename {src/test => test}/mystery-encounter/mystery-encounter.test.ts (96%) rename {src/test => test}/phases/form-change-phase.test.ts (97%) rename {src/test => test}/phases/frenzy-move-reset.test.ts (97%) rename {src/test => test}/phases/game-over-phase.test.ts (98%) rename {src/test => test}/phases/learn-move-phase.test.ts (99%) rename {src/test => test}/phases/mystery-encounter-phase.test.ts (98%) rename {src/test => test}/phases/phases.test.ts (96%) rename {src/test => test}/phases/select-modifier-phase.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-account-api.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-admin-api.test.ts (99%) rename {src/test => test}/plugins/api/pokerogue-api.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-daily-api.test.ts (98%) rename {src/test => test}/plugins/api/pokerogue-savedata-api.test.ts (96%) rename {src/test => test}/plugins/api/pokerogue-session-savedata-api.test.ts (99%) rename {src/test => test}/plugins/api/pokerogue-system-savedata-api.test.ts (98%) rename {src/test => test}/pre.test.ts (100%) rename {src/test => test}/reload.test.ts (97%) rename {src/test => test}/settingMenu/helpers/inGameManip.ts (100%) rename {src/test => test}/settingMenu/helpers/menuManip.ts (92%) rename {src/test => test}/settingMenu/rebinding_setting.test.ts (100%) rename {src/test => test}/sprites/pokemonSprite.test.ts (99%) rename {src/test => test}/sprites/spritesUtils.ts (100%) rename {src/test => test}/system/game_data.test.ts (96%) rename {src/test/utils => test/testUtils}/TextInterceptor.ts (100%) rename {src/test/utils => test/testUtils}/errorInterceptor.ts (100%) rename {src/test/utils => test/testUtils}/fakeMobile.html (100%) rename {src/test/utils => test/testUtils}/gameManager.ts (95%) rename {src/test/utils => test/testUtils}/gameManagerUtils.ts (100%) rename {src/test/utils => test/testUtils}/gameWrapper.ts (93%) rename {src/test/utils => test/testUtils}/helpers/challengeModeHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/classicModeHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/dailyModeHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/gameManagerHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/modifiersHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/moveHelper.ts (97%) rename {src/test/utils => test/testUtils}/helpers/overridesHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/reloadHelper.ts (100%) rename {src/test/utils => test/testUtils}/helpers/settingsHelper.ts (100%) rename {src/test/utils => test/testUtils}/inputsHandler.ts (94%) rename {src/test/utils => test/testUtils}/mocks/mockClock.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockConsoleLog.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockFetch.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockGameObject.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockGameObjectCreator.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockLoader.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockLocalStorage.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockTextureManager.ts (80%) rename {src/test/utils => test/testUtils}/mocks/mockTimedEventManager.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mockVideoGameObject.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockContainer.ts (98%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockGraphics.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockImage.ts (70%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockNineslice.ts (86%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockPolygon.ts (67%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockRectangle.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockSprite.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockText.ts (100%) rename {src/test/utils => test/testUtils}/mocks/mocksContainer/mockTexture.ts (92%) rename {src/test/utils => test/testUtils}/phaseInterceptor.ts (99%) rename {src/test/utils => test/testUtils}/saves/data_new.prsv (100%) rename {src/test/utils => test/testUtils}/saves/everything.prsv (100%) rename {src/test/utils => test/testUtils}/testUtils.ts (100%) rename {src/test => test}/ui/battle_info.test.ts (96%) rename {src/test => test}/ui/starter-select.test.ts (97%) rename {src/test => test}/ui/transfer-item.test.ts (98%) rename {src/test => test}/ui/type-hints.test.ts (95%) rename {src/test => test}/vitest.setup.ts (97%) diff --git a/.dependency-cruiser.cjs b/.dependency-cruiser.cjs index 25f7b64ce85..8c6dff55c8c 100644 --- a/.dependency-cruiser.cjs +++ b/.dependency-cruiser.cjs @@ -156,7 +156,7 @@ module.exports = { path: '^(src)', pathNot: [ '[.](?:spec|test|setup|script)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$', - 'src/test' + './test' ] }, to: { diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index a365999c623..04e1a29cb5f 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -84,19 +84,19 @@ async function runInteractive() { let description; switch (type) { case "move": - dir = path.join(__dirname, "src", "test", "moves"); + dir = path.join(__dirname, "test", "moves"); description = `Moves - ${formattedName}`; break; case "ability": - dir = path.join(__dirname, "src", "test", "abilities"); + dir = path.join(__dirname, "test", "abilities"); description = `Abilities - ${formattedName}`; break; case "item": - dir = path.join(__dirname, "src", "test", "items"); + dir = path.join(__dirname, "test", "items"); description = `Items - ${formattedName}`; break; case "mystery encounter": - dir = path.join(__dirname, "src", "test", "mystery-encounter", "encounters"); + dir = path.join(__dirname, "test", "mystery-encounter", "encounters"); description = `Mystery Encounter - ${formattedName}`; break; default: diff --git a/eslint.config.js b/eslint.config.js index 0da9cc604bf..e79395e1900 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -6,7 +6,7 @@ import importX from 'eslint-plugin-import-x'; export default [ { name: "eslint-config", - files: ["src/**/*.{ts,tsx,js,jsx}"], + files: ["src/**/*.{ts,tsx,js,jsx}", "test/**/*.{ts,tsx,js,jsx}"], ignores: ["dist/*", "build/*", "coverage/*", "public/*", ".github/*", "node_modules/*", ".vscode/*"], languageOptions: { parser: parser @@ -52,7 +52,7 @@ export default [ }, { name: "eslint-tests", - files: ["src/test/**/**.test.ts"], + files: ["test/**/**.test.ts"], languageOptions: { parser: parser, parserOptions: { diff --git a/src/test/abilities/ability_duplication.test.ts b/test/abilities/ability_duplication.test.ts similarity index 96% rename from src/test/abilities/ability_duplication.test.ts rename to test/abilities/ability_duplication.test.ts index f9122b3259c..73092b41ce6 100644 --- a/src/test/abilities/ability_duplication.test.ts +++ b/test/abilities/ability_duplication.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/abilities/ability_timing.test.ts b/test/abilities/ability_timing.test.ts similarity index 96% rename from src/test/abilities/ability_timing.test.ts rename to test/abilities/ability_timing.test.ts index e3264c2c1a8..85332b9cd82 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/test/abilities/ability_timing.test.ts @@ -5,7 +5,7 @@ import i18next from "#app/plugins/i18n"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/analytic.test.ts b/test/abilities/analytic.test.ts similarity index 98% rename from src/test/abilities/analytic.test.ts rename to test/abilities/analytic.test.ts index 12777c545f0..45f7bc55006 100644 --- a/src/test/abilities/analytic.test.ts +++ b/test/abilities/analytic.test.ts @@ -3,7 +3,7 @@ import { isBetween, toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/arena_trap.test.ts b/test/abilities/arena_trap.test.ts similarity index 98% rename from src/test/abilities/arena_trap.test.ts rename to test/abilities/arena_trap.test.ts index 12b9673080d..dda6e60e886 100644 --- a/src/test/abilities/arena_trap.test.ts +++ b/test/abilities/arena_trap.test.ts @@ -2,7 +2,7 @@ import { allAbilities } from "#app/data/ability"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/abilities/aroma_veil.test.ts b/test/abilities/aroma_veil.test.ts similarity index 97% rename from src/test/abilities/aroma_veil.test.ts rename to test/abilities/aroma_veil.test.ts index 4ba4d16504b..111d682aabe 100644 --- a/src/test/abilities/aroma_veil.test.ts +++ b/test/abilities/aroma_veil.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#enums/battler-tag-type"; diff --git a/src/test/abilities/aura_break.test.ts b/test/abilities/aura_break.test.ts similarity index 97% rename from src/test/abilities/aura_break.test.ts rename to test/abilities/aura_break.test.ts index 137688d1f22..230835a887e 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/test/abilities/aura_break.test.ts @@ -2,7 +2,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/battery.test.ts b/test/abilities/battery.test.ts similarity index 97% rename from src/test/abilities/battery.test.ts rename to test/abilities/battery.test.ts index 8abeca287f7..b82ffaeea7b 100644 --- a/src/test/abilities/battery.test.ts +++ b/test/abilities/battery.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/battle_bond.test.ts b/test/abilities/battle_bond.test.ts similarity index 98% rename from src/test/abilities/battle_bond.test.ts rename to test/abilities/battle_bond.test.ts index db7ed01e7d9..38d25fa3800 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/test/abilities/battle_bond.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/beast_boost.test.ts b/test/abilities/beast_boost.test.ts similarity index 98% rename from src/test/abilities/beast_boost.test.ts rename to test/abilities/beast_boost.test.ts index de31b979e32..c9877709467 100644 --- a/src/test/abilities/beast_boost.test.ts +++ b/test/abilities/beast_boost.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/commander.test.ts b/test/abilities/commander.test.ts similarity index 99% rename from src/test/abilities/commander.test.ts rename to test/abilities/commander.test.ts index 70568639b61..1b054bbd5ea 100644 --- a/src/test/abilities/commander.test.ts +++ b/test/abilities/commander.test.ts @@ -9,7 +9,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/competitive.test.ts b/test/abilities/competitive.test.ts similarity index 97% rename from src/test/abilities/competitive.test.ts rename to test/abilities/competitive.test.ts index ecb276a1b8d..e4baf9b9855 100644 --- a/src/test/abilities/competitive.test.ts +++ b/test/abilities/competitive.test.ts @@ -3,7 +3,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/contrary.test.ts b/test/abilities/contrary.test.ts similarity index 97% rename from src/test/abilities/contrary.test.ts rename to test/abilities/contrary.test.ts index c838a5a098e..eaf8d885a83 100644 --- a/src/test/abilities/contrary.test.ts +++ b/test/abilities/contrary.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/corrosion.test.ts b/test/abilities/corrosion.test.ts similarity index 96% rename from src/test/abilities/corrosion.test.ts rename to test/abilities/corrosion.test.ts index e607e85defb..2829c3c3b41 100644 --- a/src/test/abilities/corrosion.test.ts +++ b/test/abilities/corrosion.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/costar.test.ts b/test/abilities/costar.test.ts similarity index 97% rename from src/test/abilities/costar.test.ts rename to test/abilities/costar.test.ts index 3be29ea2dcf..09b724a07ec 100644 --- a/src/test/abilities/costar.test.ts +++ b/test/abilities/costar.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import { MessagePhase } from "#app/phases/message-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/dancer.test.ts b/test/abilities/dancer.test.ts similarity index 98% rename from src/test/abilities/dancer.test.ts rename to test/abilities/dancer.test.ts index 3a480316c96..99d8a6d588d 100644 --- a/src/test/abilities/dancer.test.ts +++ b/test/abilities/dancer.test.ts @@ -3,7 +3,7 @@ import type { MovePhase } from "#app/phases/move-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/defiant.test.ts b/test/abilities/defiant.test.ts similarity index 97% rename from src/test/abilities/defiant.test.ts rename to test/abilities/defiant.test.ts index aa8d250dad7..ce8c7bac8b3 100644 --- a/src/test/abilities/defiant.test.ts +++ b/test/abilities/defiant.test.ts @@ -3,7 +3,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/desolate-land.test.ts b/test/abilities/desolate-land.test.ts similarity index 98% rename from src/test/abilities/desolate-land.test.ts rename to test/abilities/desolate-land.test.ts index 75576d7a8f6..4aa44c97404 100644 --- a/src/test/abilities/desolate-land.test.ts +++ b/test/abilities/desolate-land.test.ts @@ -3,7 +3,7 @@ import { WeatherType } from "#app/enums/weather-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/abilities/disguise.test.ts b/test/abilities/disguise.test.ts similarity index 99% rename from src/test/abilities/disguise.test.ts rename to test/abilities/disguise.test.ts index 07a84bd7a5a..cb875e23019 100644 --- a/src/test/abilities/disguise.test.ts +++ b/test/abilities/disguise.test.ts @@ -5,7 +5,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/dry_skin.test.ts b/test/abilities/dry_skin.test.ts similarity index 98% rename from src/test/abilities/dry_skin.test.ts rename to test/abilities/dry_skin.test.ts index 314564df15c..f3a67f0c1fd 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/test/abilities/dry_skin.test.ts @@ -1,7 +1,7 @@ import { Species } from "#app/enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/early_bird.test.ts b/test/abilities/early_bird.test.ts similarity index 98% rename from src/test/abilities/early_bird.test.ts rename to test/abilities/early_bird.test.ts index a69290fa1e4..5889cfe2f89 100644 --- a/src/test/abilities/early_bird.test.ts +++ b/test/abilities/early_bird.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/flash_fire.test.ts b/test/abilities/flash_fire.test.ts similarity index 99% rename from src/test/abilities/flash_fire.test.ts rename to test/abilities/flash_fire.test.ts index 0ca55227ea4..1c94c694b29 100644 --- a/src/test/abilities/flash_fire.test.ts +++ b/test/abilities/flash_fire.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/flower_gift.test.ts b/test/abilities/flower_gift.test.ts similarity index 99% rename from src/test/abilities/flower_gift.test.ts rename to test/abilities/flower_gift.test.ts index 04ada598f22..99f4211eeaa 100644 --- a/src/test/abilities/flower_gift.test.ts +++ b/test/abilities/flower_gift.test.ts @@ -4,7 +4,7 @@ import { Stat } from "#app/enums/stat"; import { WeatherType } from "#app/enums/weather-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/forecast.test.ts b/test/abilities/forecast.test.ts similarity index 99% rename from src/test/abilities/forecast.test.ts rename to test/abilities/forecast.test.ts index 6d1f776da16..31c9942cd98 100644 --- a/src/test/abilities/forecast.test.ts +++ b/test/abilities/forecast.test.ts @@ -9,7 +9,7 @@ import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/friend_guard.test.ts b/test/abilities/friend_guard.test.ts similarity index 98% rename from src/test/abilities/friend_guard.test.ts rename to test/abilities/friend_guard.test.ts index 4ce64468c43..986bd8e7925 100644 --- a/src/test/abilities/friend_guard.test.ts +++ b/test/abilities/friend_guard.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/abilities/galvanize.test.ts b/test/abilities/galvanize.test.ts similarity index 98% rename from src/test/abilities/galvanize.test.ts rename to test/abilities/galvanize.test.ts index 80e767866ea..f0230be3b31 100644 --- a/src/test/abilities/galvanize.test.ts +++ b/test/abilities/galvanize.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { HitResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/good_as_gold.test.ts b/test/abilities/good_as_gold.test.ts similarity index 99% rename from src/test/abilities/good_as_gold.test.ts rename to test/abilities/good_as_gold.test.ts index ecda1a0e031..e3367d5b7f8 100644 --- a/src/test/abilities/good_as_gold.test.ts +++ b/test/abilities/good_as_gold.test.ts @@ -9,7 +9,7 @@ import { WeatherType } from "#app/enums/weather-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/gorilla_tactics.test.ts b/test/abilities/gorilla_tactics.test.ts similarity index 98% rename from src/test/abilities/gorilla_tactics.test.ts rename to test/abilities/gorilla_tactics.test.ts index 8aee365eb8f..e97bca6a725 100644 --- a/src/test/abilities/gorilla_tactics.test.ts +++ b/test/abilities/gorilla_tactics.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/gulp_missile.test.ts b/test/abilities/gulp_missile.test.ts similarity index 99% rename from src/test/abilities/gulp_missile.test.ts rename to test/abilities/gulp_missile.test.ts index bbb103c63e6..d34e86ddc08 100644 --- a/src/test/abilities/gulp_missile.test.ts +++ b/test/abilities/gulp_missile.test.ts @@ -6,7 +6,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/heatproof.test.ts b/test/abilities/heatproof.test.ts similarity index 97% rename from src/test/abilities/heatproof.test.ts rename to test/abilities/heatproof.test.ts index bf4e99ce467..6c41460535f 100644 --- a/src/test/abilities/heatproof.test.ts +++ b/test/abilities/heatproof.test.ts @@ -4,7 +4,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/honey_gather.test.ts b/test/abilities/honey_gather.test.ts similarity index 97% rename from src/test/abilities/honey_gather.test.ts rename to test/abilities/honey_gather.test.ts index fc9d6cdd150..a1cad453843 100644 --- a/src/test/abilities/honey_gather.test.ts +++ b/test/abilities/honey_gather.test.ts @@ -3,7 +3,7 @@ import { Command } from "#app/ui/command-ui-handler"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/hustle.test.ts b/test/abilities/hustle.test.ts similarity index 98% rename from src/test/abilities/hustle.test.ts rename to test/abilities/hustle.test.ts index 08a441315fb..c92bc5cbbd3 100644 --- a/src/test/abilities/hustle.test.ts +++ b/test/abilities/hustle.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Stat } from "#app/enums/stat"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/hyper_cutter.test.ts b/test/abilities/hyper_cutter.test.ts similarity index 96% rename from src/test/abilities/hyper_cutter.test.ts rename to test/abilities/hyper_cutter.test.ts index e51fef6bd49..c8c4c21c98f 100644 --- a/src/test/abilities/hyper_cutter.test.ts +++ b/test/abilities/hyper_cutter.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/ice_face.test.ts b/test/abilities/ice_face.test.ts similarity index 99% rename from src/test/abilities/ice_face.test.ts rename to test/abilities/ice_face.test.ts index e31bee1c721..e4339cb8a28 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/test/abilities/ice_face.test.ts @@ -8,7 +8,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/illuminate.test.ts b/test/abilities/illuminate.test.ts similarity index 96% rename from src/test/abilities/illuminate.test.ts rename to test/abilities/illuminate.test.ts index 4f7d3d83b51..c4fbcd2c7a4 100644 --- a/src/test/abilities/illuminate.test.ts +++ b/test/abilities/illuminate.test.ts @@ -1,7 +1,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/abilities/imposter.test.ts b/test/abilities/imposter.test.ts similarity index 98% rename from src/test/abilities/imposter.test.ts rename to test/abilities/imposter.test.ts index 98f30c60505..d73b77feda9 100644 --- a/src/test/abilities/imposter.test.ts +++ b/test/abilities/imposter.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/abilities/infiltrator.test.ts b/test/abilities/infiltrator.test.ts similarity index 98% rename from src/test/abilities/infiltrator.test.ts rename to test/abilities/infiltrator.test.ts index 8ea72b55b0c..c614bbe4474 100644 --- a/src/test/abilities/infiltrator.test.ts +++ b/test/abilities/infiltrator.test.ts @@ -7,7 +7,7 @@ import { StatusEffect } from "#enums/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/intimidate.test.ts b/test/abilities/intimidate.test.ts similarity index 97% rename from src/test/abilities/intimidate.test.ts rename to test/abilities/intimidate.test.ts index d5a37d06593..eab59e7c1a2 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/test/abilities/intimidate.test.ts @@ -1,9 +1,9 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Mode } from "#app/ui/ui"; import { Stat } from "#enums/stat"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { getMovePosition } from "#test/testUtils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/intrepid_sword.test.ts b/test/abilities/intrepid_sword.test.ts similarity index 95% rename from src/test/abilities/intrepid_sword.test.ts rename to test/abilities/intrepid_sword.test.ts index 7bf0654276c..0f4305d38b4 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/test/abilities/intrepid_sword.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/libero.test.ts b/test/abilities/libero.test.ts similarity index 99% rename from src/test/abilities/libero.test.ts rename to test/abilities/libero.test.ts index f6e85979c69..46093019daa 100644 --- a/src/test/abilities/libero.test.ts +++ b/test/abilities/libero.test.ts @@ -9,7 +9,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/magic_bounce.test.ts b/test/abilities/magic_bounce.test.ts similarity index 99% rename from src/test/abilities/magic_bounce.test.ts rename to test/abilities/magic_bounce.test.ts index 2fc460662ca..9bb7b55bc72 100644 --- a/src/test/abilities/magic_bounce.test.ts +++ b/test/abilities/magic_bounce.test.ts @@ -9,7 +9,7 @@ import { StatusEffect } from "#app/enums/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Abilities - Magic Bounce", () => { diff --git a/src/test/abilities/magic_guard.test.ts b/test/abilities/magic_guard.test.ts similarity index 99% rename from src/test/abilities/magic_guard.test.ts rename to test/abilities/magic_guard.test.ts index 7c038354748..a2a88915419 100644 --- a/src/test/abilities/magic_guard.test.ts +++ b/test/abilities/magic_guard.test.ts @@ -8,7 +8,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/mimicry.test.ts b/test/abilities/mimicry.test.ts similarity index 98% rename from src/test/abilities/mimicry.test.ts rename to test/abilities/mimicry.test.ts index 29aa1d649d3..75990c89707 100644 --- a/src/test/abilities/mimicry.test.ts +++ b/test/abilities/mimicry.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/mirror_armor.test.ts b/test/abilities/mirror_armor.test.ts similarity index 99% rename from src/test/abilities/mirror_armor.test.ts rename to test/abilities/mirror_armor.test.ts index 070428a8ee7..1d103c45be1 100644 --- a/src/test/abilities/mirror_armor.test.ts +++ b/test/abilities/mirror_armor.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/abilities/moody.test.ts b/test/abilities/moody.test.ts similarity index 98% rename from src/test/abilities/moody.test.ts rename to test/abilities/moody.test.ts index 166f69b0fe3..64c2c7d8a07 100644 --- a/src/test/abilities/moody.test.ts +++ b/test/abilities/moody.test.ts @@ -2,7 +2,7 @@ import { BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/moxie.test.ts b/test/abilities/moxie.test.ts similarity index 97% rename from src/test/abilities/moxie.test.ts rename to test/abilities/moxie.test.ts index 5f337fedabb..c518c55671f 100644 --- a/src/test/abilities/moxie.test.ts +++ b/test/abilities/moxie.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/mummy.test.ts b/test/abilities/mummy.test.ts similarity index 96% rename from src/test/abilities/mummy.test.ts rename to test/abilities/mummy.test.ts index bf93cdcf61d..96b5e170c14 100644 --- a/src/test/abilities/mummy.test.ts +++ b/test/abilities/mummy.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/mycelium_might.test.ts b/test/abilities/mycelium_might.test.ts similarity index 98% rename from src/test/abilities/mycelium_might.test.ts rename to test/abilities/mycelium_might.test.ts index 0c8e7b5a703..2c0bd39b32a 100644 --- a/src/test/abilities/mycelium_might.test.ts +++ b/test/abilities/mycelium_might.test.ts @@ -1,6 +1,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Stat } from "#enums/stat"; import { Moves } from "#enums/moves"; diff --git a/src/test/abilities/no_guard.test.ts b/test/abilities/no_guard.test.ts similarity index 97% rename from src/test/abilities/no_guard.test.ts rename to test/abilities/no_guard.test.ts index b0b454dd560..1a319eb2611 100644 --- a/src/test/abilities/no_guard.test.ts +++ b/test/abilities/no_guard.test.ts @@ -4,7 +4,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/abilities/parental_bond.test.ts b/test/abilities/parental_bond.test.ts similarity index 99% rename from src/test/abilities/parental_bond.test.ts rename to test/abilities/parental_bond.test.ts index c2f54fa4cfc..d22c5615df2 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/test/abilities/parental_bond.test.ts @@ -6,7 +6,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/pastel_veil.test.ts b/test/abilities/pastel_veil.test.ts similarity index 97% rename from src/test/abilities/pastel_veil.test.ts rename to test/abilities/pastel_veil.test.ts index dd8360493a1..cb73a79bae4 100644 --- a/src/test/abilities/pastel_veil.test.ts +++ b/test/abilities/pastel_veil.test.ts @@ -5,7 +5,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/perish_body.test.ts b/test/abilities/perish_body.test.ts similarity index 98% rename from src/test/abilities/perish_body.test.ts rename to test/abilities/perish_body.test.ts index 70ba6d8d684..7084076713a 100644 --- a/src/test/abilities/perish_body.test.ts +++ b/test/abilities/perish_body.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/power_construct.test.ts b/test/abilities/power_construct.test.ts similarity index 98% rename from src/test/abilities/power_construct.test.ts rename to test/abilities/power_construct.test.ts index aaab5ddb5c4..b6b7be33753 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/test/abilities/power_construct.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/power_spot.test.ts b/test/abilities/power_spot.test.ts similarity index 97% rename from src/test/abilities/power_spot.test.ts rename to test/abilities/power_spot.test.ts index a566c2277c3..dbc3799d48d 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/test/abilities/power_spot.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/protean.test.ts b/test/abilities/protean.test.ts similarity index 99% rename from src/test/abilities/protean.test.ts rename to test/abilities/protean.test.ts index c7d04b9e1c8..a20fa61d75f 100644 --- a/src/test/abilities/protean.test.ts +++ b/test/abilities/protean.test.ts @@ -9,7 +9,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/protosynthesis.test.ts b/test/abilities/protosynthesis.test.ts similarity index 97% rename from src/test/abilities/protosynthesis.test.ts rename to test/abilities/protosynthesis.test.ts index 67786c3ae9e..a122fbad797 100644 --- a/src/test/abilities/protosynthesis.test.ts +++ b/test/abilities/protosynthesis.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#enums/moves"; import { Nature } from "#enums/nature"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { BattlerIndex } from "#app/battle"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/quick_draw.test.ts b/test/abilities/quick_draw.test.ts similarity index 98% rename from src/test/abilities/quick_draw.test.ts rename to test/abilities/quick_draw.test.ts index 4979152f4d6..c451218a56c 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/test/abilities/quick_draw.test.ts @@ -3,7 +3,7 @@ import { FaintPhase } from "#app/phases/faint-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/abilities/sand_spit.test.ts b/test/abilities/sand_spit.test.ts similarity index 97% rename from src/test/abilities/sand_spit.test.ts rename to test/abilities/sand_spit.test.ts index 092c3e66105..dafae695d3b 100644 --- a/src/test/abilities/sand_spit.test.ts +++ b/test/abilities/sand_spit.test.ts @@ -2,7 +2,7 @@ import { WeatherType } from "#app/enums/weather-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/sand_veil.test.ts b/test/abilities/sand_veil.test.ts similarity index 97% rename from src/test/abilities/sand_veil.test.ts rename to test/abilities/sand_veil.test.ts index ee8ca450df9..0128276075b 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/test/abilities/sand_veil.test.ts @@ -7,7 +7,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/abilities/sap_sipper.test.ts b/test/abilities/sap_sipper.test.ts similarity index 98% rename from src/test/abilities/sap_sipper.test.ts rename to test/abilities/sap_sipper.test.ts index dc254a54b54..836219fcbcb 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/test/abilities/sap_sipper.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves, RandomMoveAttr } from "#app/data/move"; diff --git a/src/test/abilities/schooling.test.ts b/test/abilities/schooling.test.ts similarity index 97% rename from src/test/abilities/schooling.test.ts rename to test/abilities/schooling.test.ts index e1ec58f517e..a52c6a06f12 100644 --- a/src/test/abilities/schooling.test.ts +++ b/test/abilities/schooling.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/screen_cleaner.test.ts b/test/abilities/screen_cleaner.test.ts similarity index 97% rename from src/test/abilities/screen_cleaner.test.ts rename to test/abilities/screen_cleaner.test.ts index c036aa90a77..9c182398765 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/test/abilities/screen_cleaner.test.ts @@ -4,7 +4,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/seed_sower.test.ts b/test/abilities/seed_sower.test.ts similarity index 97% rename from src/test/abilities/seed_sower.test.ts rename to test/abilities/seed_sower.test.ts index 71b76e24d2e..6e3acdf6093 100644 --- a/src/test/abilities/seed_sower.test.ts +++ b/test/abilities/seed_sower.test.ts @@ -2,7 +2,7 @@ import { TerrainType } from "#app/data/terrain"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/serene_grace.test.ts b/test/abilities/serene_grace.test.ts similarity index 96% rename from src/test/abilities/serene_grace.test.ts rename to test/abilities/serene_grace.test.ts index 6f9b2195a9c..cb21121743b 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/test/abilities/serene_grace.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { allMoves } from "#app/data/move"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/sheer_force.test.ts b/test/abilities/sheer_force.test.ts similarity index 99% rename from src/test/abilities/sheer_force.test.ts rename to test/abilities/sheer_force.test.ts index a0ddf5bb9c6..a65334cbfa0 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/test/abilities/sheer_force.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves, FlinchAttr } from "#app/data/move"; diff --git a/src/test/abilities/shield_dust.test.ts b/test/abilities/shield_dust.test.ts similarity index 97% rename from src/test/abilities/shield_dust.test.ts rename to test/abilities/shield_dust.test.ts index 329f52cc4c6..a63898b0c63 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/test/abilities/shield_dust.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/shields_down.test.ts b/test/abilities/shields_down.test.ts similarity index 99% rename from src/test/abilities/shields_down.test.ts rename to test/abilities/shields_down.test.ts index ca6d945824e..4e47a018471 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/test/abilities/shields_down.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/simple.test.ts b/test/abilities/simple.test.ts similarity index 95% rename from src/test/abilities/simple.test.ts rename to test/abilities/simple.test.ts index e5ca474d7c3..e8d478655ab 100644 --- a/src/test/abilities/simple.test.ts +++ b/test/abilities/simple.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/speed_boost.test.ts b/test/abilities/speed_boost.test.ts similarity index 98% rename from src/test/abilities/speed_boost.test.ts rename to test/abilities/speed_boost.test.ts index 74ee6a8cb92..912bb62bca4 100644 --- a/src/test/abilities/speed_boost.test.ts +++ b/test/abilities/speed_boost.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import type { CommandPhase } from "#app/phases/command-phase"; diff --git a/src/test/abilities/stakeout.test.ts b/test/abilities/stakeout.test.ts similarity index 97% rename from src/test/abilities/stakeout.test.ts rename to test/abilities/stakeout.test.ts index 885169b284e..67442ae1822 100644 --- a/src/test/abilities/stakeout.test.ts +++ b/test/abilities/stakeout.test.ts @@ -3,7 +3,7 @@ import { isBetween } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/stall.test.ts b/test/abilities/stall.test.ts similarity index 98% rename from src/test/abilities/stall.test.ts rename to test/abilities/stall.test.ts index b51c56dbe1f..c0b71221071 100644 --- a/src/test/abilities/stall.test.ts +++ b/test/abilities/stall.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; diff --git a/src/test/abilities/steely_spirit.test.ts b/test/abilities/steely_spirit.test.ts similarity index 98% rename from src/test/abilities/steely_spirit.test.ts rename to test/abilities/steely_spirit.test.ts index 61e76989060..e1f6a04c0fa 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/test/abilities/steely_spirit.test.ts @@ -3,7 +3,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/sturdy.test.ts b/test/abilities/sturdy.test.ts similarity index 97% rename from src/test/abilities/sturdy.test.ts rename to test/abilities/sturdy.test.ts index 8f134338f12..36b098ab69e 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/test/abilities/sturdy.test.ts @@ -4,7 +4,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/abilities/supreme_overlord.test.ts b/test/abilities/supreme_overlord.test.ts similarity index 99% rename from src/test/abilities/supreme_overlord.test.ts rename to test/abilities/supreme_overlord.test.ts index ecd595cb6bb..6de17bc3c7a 100644 --- a/src/test/abilities/supreme_overlord.test.ts +++ b/test/abilities/supreme_overlord.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { BattlerIndex } from "#app/battle"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves } from "#app/data/move"; diff --git a/src/test/abilities/sweet_veil.test.ts b/test/abilities/sweet_veil.test.ts similarity index 98% rename from src/test/abilities/sweet_veil.test.ts rename to test/abilities/sweet_veil.test.ts index ef66cb1c68a..14f4f79c3f0 100644 --- a/src/test/abilities/sweet_veil.test.ts +++ b/test/abilities/sweet_veil.test.ts @@ -5,7 +5,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/synchronize.test.ts b/test/abilities/synchronize.test.ts similarity index 98% rename from src/test/abilities/synchronize.test.ts rename to test/abilities/synchronize.test.ts index 2ae80ae9c7a..19b5560f61a 100644 --- a/src/test/abilities/synchronize.test.ts +++ b/test/abilities/synchronize.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/tera_shell.test.ts b/test/abilities/tera_shell.test.ts similarity index 98% rename from src/test/abilities/tera_shell.test.ts rename to test/abilities/tera_shell.test.ts index 01382d0fd9a..38be70f511b 100644 --- a/src/test/abilities/tera_shell.test.ts +++ b/test/abilities/tera_shell.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { HitResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/trace.test.ts b/test/abilities/trace.test.ts similarity index 96% rename from src/test/abilities/trace.test.ts rename to test/abilities/trace.test.ts index ffa76f59769..e7059d2b0f1 100644 --- a/src/test/abilities/trace.test.ts +++ b/test/abilities/trace.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/unburden.test.ts b/test/abilities/unburden.test.ts similarity index 99% rename from src/test/abilities/unburden.test.ts rename to test/abilities/unburden.test.ts index 9c5f6c2d185..67cf83870b3 100644 --- a/src/test/abilities/unburden.test.ts +++ b/test/abilities/unburden.test.ts @@ -9,7 +9,7 @@ import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/unseen_fist.test.ts b/test/abilities/unseen_fist.test.ts similarity index 98% rename from src/test/abilities/unseen_fist.test.ts rename to test/abilities/unseen_fist.test.ts index 584f997aa55..de93aef0988 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/test/abilities/unseen_fist.test.ts @@ -2,7 +2,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#app/enums/battler-tag-type"; diff --git a/src/test/abilities/volt_absorb.test.ts b/test/abilities/volt_absorb.test.ts similarity index 98% rename from src/test/abilities/volt_absorb.test.ts rename to test/abilities/volt_absorb.test.ts index 4fee7653b99..2221619af07 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/test/abilities/volt_absorb.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/abilities/wandering_spirit.test.ts b/test/abilities/wandering_spirit.test.ts similarity index 97% rename from src/test/abilities/wandering_spirit.test.ts rename to test/abilities/wandering_spirit.test.ts index 4bc9298353f..48c7afa5751 100644 --- a/src/test/abilities/wandering_spirit.test.ts +++ b/test/abilities/wandering_spirit.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/wimp_out.test.ts b/test/abilities/wimp_out.test.ts similarity index 99% rename from src/test/abilities/wimp_out.test.ts rename to test/abilities/wimp_out.test.ts index 90cd3d62af5..5aff05d4c20 100644 --- a/src/test/abilities/wimp_out.test.ts +++ b/test/abilities/wimp_out.test.ts @@ -1,7 +1,7 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; import { allMoves } from "#app/data/move"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; diff --git a/src/test/abilities/wind_power.test.ts b/test/abilities/wind_power.test.ts similarity index 98% rename from src/test/abilities/wind_power.test.ts rename to test/abilities/wind_power.test.ts index 538b65f898b..f9be5393d15 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/test/abilities/wind_power.test.ts @@ -3,7 +3,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/wind_rider.test.ts b/test/abilities/wind_rider.test.ts similarity index 98% rename from src/test/abilities/wind_rider.test.ts rename to test/abilities/wind_rider.test.ts index cd7094fb0a9..7cebd70a11a 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/test/abilities/wind_rider.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/abilities/wonder_skin.test.ts b/test/abilities/wonder_skin.test.ts similarity index 97% rename from src/test/abilities/wonder_skin.test.ts rename to test/abilities/wonder_skin.test.ts index 6b25701e36a..4f6e45d8fe0 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/test/abilities/wonder_skin.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/abilities/zen_mode.test.ts b/test/abilities/zen_mode.test.ts similarity index 98% rename from src/test/abilities/zen_mode.test.ts rename to test/abilities/zen_mode.test.ts index e0cc457c4d5..cb4c82e00dc 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/test/abilities/zen_mode.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/abilities/zero_to_hero.test.ts b/test/abilities/zero_to_hero.test.ts similarity index 98% rename from src/test/abilities/zero_to_hero.test.ts rename to test/abilities/zero_to_hero.test.ts index 5702f73e6c4..338ebd6344f 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/test/abilities/zero_to_hero.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/account.test.ts b/test/account.test.ts similarity index 99% rename from src/test/account.test.ts rename to test/account.test.ts index 0f49014c377..099564ce7a8 100644 --- a/src/test/account.test.ts +++ b/test/account.test.ts @@ -1,7 +1,7 @@ import * as battleScene from "#app/battle-scene"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { describe, expect, it, vi } from "vitest"; -import { initLoggedInUser, loggedInUser, updateUserInfo } from "../account"; +import { initLoggedInUser, loggedInUser, updateUserInfo } from "#app/account"; describe("account", () => { describe("initLoggedInUser", () => { diff --git a/src/test/achievements/achievement.test.ts b/test/achievements/achievement.test.ts similarity index 99% rename from src/test/achievements/achievement.test.ts rename to test/achievements/achievement.test.ts index 2d1cc50603e..3c6dc8aefe8 100644 --- a/src/test/achievements/achievement.test.ts +++ b/test/achievements/achievement.test.ts @@ -1,10 +1,10 @@ import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; import { NumberHolder } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import BattleScene from "../../battle-scene"; +import BattleScene from "#app/battle-scene"; describe("check some Achievement related stuff", () => { it ("should check Achievement creation", () => { diff --git a/src/test/arena/arena_gravity.test.ts b/test/arena/arena_gravity.test.ts similarity index 98% rename from src/test/arena/arena_gravity.test.ts rename to test/arena/arena_gravity.test.ts index 13e9c23a35c..75197a4341c 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/test/arena/arena_gravity.test.ts @@ -5,7 +5,7 @@ import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/arena/grassy_terrain.test.ts b/test/arena/grassy_terrain.test.ts similarity index 97% rename from src/test/arena/grassy_terrain.test.ts rename to test/arena/grassy_terrain.test.ts index ead4467925b..f493242a9d8 100644 --- a/src/test/arena/grassy_terrain.test.ts +++ b/test/arena/grassy_terrain.test.ts @@ -2,7 +2,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/arena/weather_fog.test.ts b/test/arena/weather_fog.test.ts similarity index 96% rename from src/test/arena/weather_fog.test.ts rename to test/arena/weather_fog.test.ts index 8c1fcb1e3a4..8b4ffff3a64 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/test/arena/weather_fog.test.ts @@ -4,7 +4,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/arena/weather_hail.test.ts b/test/arena/weather_hail.test.ts similarity index 97% rename from src/test/arena/weather_hail.test.ts rename to test/arena/weather_hail.test.ts index 0b267550d75..137c7622517 100644 --- a/src/test/arena/weather_hail.test.ts +++ b/test/arena/weather_hail.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/arena/weather_sandstorm.test.ts b/test/arena/weather_sandstorm.test.ts similarity index 98% rename from src/test/arena/weather_sandstorm.test.ts rename to test/arena/weather_sandstorm.test.ts index 17ccfdee94b..6420117d107 100644 --- a/src/test/arena/weather_sandstorm.test.ts +++ b/test/arena/weather_sandstorm.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#app/enums/stat"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/arena/weather_strong_winds.test.ts b/test/arena/weather_strong_winds.test.ts similarity index 98% rename from src/test/arena/weather_strong_winds.test.ts rename to test/arena/weather_strong_winds.test.ts index 557de93d644..2685a9149ae 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/test/arena/weather_strong_winds.test.ts @@ -4,7 +4,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/battle-scene.test.ts b/test/battle-scene.test.ts similarity index 93% rename from src/test/battle-scene.test.ts rename to test/battle-scene.test.ts index 4da75cea197..44f1364441b 100644 --- a/src/test/battle-scene.test.ts +++ b/test/battle-scene.test.ts @@ -1,6 +1,6 @@ import { LoadingScene } from "#app/loading-scene"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("BattleScene", () => { let phaserGame: Phaser.Game; diff --git a/src/test/battle/ability_swap.test.ts b/test/battle/ability_swap.test.ts similarity index 97% rename from src/test/battle/ability_swap.test.ts rename to test/battle/ability_swap.test.ts index 9ce7a36c16e..ff3f7c002bc 100644 --- a/src/test/battle/ability_swap.test.ts +++ b/test/battle/ability_swap.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/battle/battle-order.test.ts b/test/battle/battle-order.test.ts similarity index 99% rename from src/test/battle/battle-order.test.ts rename to test/battle/battle-order.test.ts index d4e9950dec9..165a2fc916c 100644 --- a/src/test/battle/battle-order.test.ts +++ b/test/battle/battle-order.test.ts @@ -4,7 +4,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/battle.test.ts b/test/battle/battle.test.ts similarity index 98% rename from src/test/battle/battle.test.ts rename to test/battle/battle.test.ts index bd84cb2fd3b..edd04cf8ed0 100644 --- a/src/test/battle/battle.test.ts +++ b/test/battle/battle.test.ts @@ -16,8 +16,8 @@ import { SwitchPhase } from "#app/phases/switch-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { VictoryPhase } from "#app/phases/victory-phase"; -import GameManager from "#app/test/utils/gameManager"; -import { generateStarter } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { generateStarter } from "#test/testUtils/gameManagerUtils"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -122,7 +122,7 @@ describe("Test Battle Phase", () => { }, 20000); it("load 100% data file", async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; diff --git a/src/test/battle/damage_calculation.test.ts b/test/battle/damage_calculation.test.ts similarity index 98% rename from src/test/battle/damage_calculation.test.ts rename to test/battle/damage_calculation.test.ts index 22d072f313c..0a954b624c0 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/test/battle/damage_calculation.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/double_battle.test.ts b/test/battle/double_battle.test.ts similarity index 98% rename from src/test/battle/double_battle.test.ts rename to test/battle/double_battle.test.ts index b48f2a96a5b..de65245698e 100644 --- a/src/test/battle/double_battle.test.ts +++ b/test/battle/double_battle.test.ts @@ -6,7 +6,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/inverse_battle.test.ts b/test/battle/inverse_battle.test.ts similarity index 99% rename from src/test/battle/inverse_battle.test.ts rename to test/battle/inverse_battle.test.ts index 0bda678bbd3..ce44824e772 100644 --- a/src/test/battle/inverse_battle.test.ts +++ b/test/battle/inverse_battle.test.ts @@ -6,7 +6,7 @@ import { Challenges } from "#enums/challenges"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/battle/special_battle.test.ts b/test/battle/special_battle.test.ts similarity index 98% rename from src/test/battle/special_battle.test.ts rename to test/battle/special_battle.test.ts index af9e3dddbec..df24626766c 100644 --- a/src/test/battle/special_battle.test.ts +++ b/test/battle/special_battle.test.ts @@ -3,7 +3,7 @@ import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/battlerTags/octolock.test.ts b/test/battlerTags/octolock.test.ts similarity index 96% rename from src/test/battlerTags/octolock.test.ts rename to test/battlerTags/octolock.test.ts index 4bf0257af8f..f161d90d466 100644 --- a/src/test/battlerTags/octolock.test.ts +++ b/test/battlerTags/octolock.test.ts @@ -3,7 +3,7 @@ import type Pokemon from "#app/field/pokemon"; import { BattlerTagLapseType, OctolockTag, TrappedTag } from "#app/data/battler-tags"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("BattlerTag - OctolockTag", () => { describe("lapse behavior", () => { diff --git a/src/test/battlerTags/stockpiling.test.ts b/test/battlerTags/stockpiling.test.ts similarity index 99% rename from src/test/battlerTags/stockpiling.test.ts rename to test/battlerTags/stockpiling.test.ts index 13a4227853d..5970b5abbc6 100644 --- a/src/test/battlerTags/stockpiling.test.ts +++ b/test/battlerTags/stockpiling.test.ts @@ -4,7 +4,7 @@ import { PokemonSummonData } from "#app/field/pokemon"; import * as messages from "#app/messages"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; beforeEach(() => { diff --git a/src/test/battlerTags/substitute.test.ts b/test/battlerTags/substitute.test.ts similarity index 100% rename from src/test/battlerTags/substitute.test.ts rename to test/battlerTags/substitute.test.ts diff --git a/src/test/boss-pokemon.test.ts b/test/boss-pokemon.test.ts similarity index 99% rename from src/test/boss-pokemon.test.ts rename to test/boss-pokemon.test.ts index 389b42a2963..ea5a9000000 100644 --- a/src/test/boss-pokemon.test.ts +++ b/test/boss-pokemon.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#app/enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Abilities } from "#app/enums/abilities"; diff --git a/src/test/daily_mode.test.ts b/test/daily_mode.test.ts similarity index 98% rename from src/test/daily_mode.test.ts rename to test/daily_mode.test.ts index 3e70cc2d8a7..95c01b51434 100644 --- a/src/test/daily_mode.test.ts +++ b/test/daily_mode.test.ts @@ -6,7 +6,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Species } from "#enums/species"; import { Mode } from "#app/ui/ui"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; //const TIMEOUT = 20 * 1000; diff --git a/src/test/data/splash_messages.test.ts b/test/data/splash_messages.test.ts similarity index 100% rename from src/test/data/splash_messages.test.ts rename to test/data/splash_messages.test.ts diff --git a/src/test/data/status_effect.test.ts b/test/data/status_effect.test.ts similarity index 99% rename from src/test/data/status_effect.test.ts rename to test/data/status_effect.test.ts index 071dea989a9..e94cb193f0a 100644 --- a/src/test/data/status_effect.test.ts +++ b/test/data/status_effect.test.ts @@ -11,8 +11,8 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; -import { mockI18next } from "#test/utils/testUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { mockI18next } from "#test/testUtils/testUtils"; import i18next from "i18next"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/eggs/egg.test.ts b/test/eggs/egg.test.ts similarity index 99% rename from src/test/eggs/egg.test.ts rename to test/eggs/egg.test.ts index d7ed07dd151..e4a7cc31709 100644 --- a/src/test/eggs/egg.test.ts +++ b/test/eggs/egg.test.ts @@ -7,7 +7,7 @@ import { VariantTier } from "#app/enums/variant-tier"; import EggData from "#app/system/egg-data"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,7 +29,7 @@ describe("Egg Generation Tests", () => { }); beforeEach(async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); }); it("should return Kyogre for the 10th of June", () => { diff --git a/src/test/eggs/manaphy-egg.test.ts b/test/eggs/manaphy-egg.test.ts similarity index 96% rename from src/test/eggs/manaphy-egg.test.ts rename to test/eggs/manaphy-egg.test.ts index 5bb5b790201..c63dbae7780 100644 --- a/src/test/eggs/manaphy-egg.test.ts +++ b/test/eggs/manaphy-egg.test.ts @@ -2,7 +2,7 @@ import { Egg } from "#app/data/egg"; import { EggSourceType } from "#app/enums/egg-source-types"; import { EggTier } from "#app/enums/egg-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -25,7 +25,7 @@ describe("Manaphy Eggs", () => { }); beforeEach(async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); /** * In our tests, we will perform an "RNG sweep" by letting rngSweepProgress diff --git a/src/test/endless_boss.test.ts b/test/endless_boss.test.ts similarity index 98% rename from src/test/endless_boss.test.ts rename to test/endless_boss.test.ts index c9f3afc3936..ab7df412c12 100644 --- a/src/test/endless_boss.test.ts +++ b/test/endless_boss.test.ts @@ -2,7 +2,7 @@ import { Biome } from "#app/enums/biome"; import { Species } from "#app/enums/species"; import { GameModes } from "#app/game-mode"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; const EndlessBossWave = { Minor: 250, diff --git a/src/test/enemy_command.test.ts b/test/enemy_command.test.ts similarity index 98% rename from src/test/enemy_command.test.ts rename to test/enemy_command.test.ts index 647c0be279a..b8e0c38b9e8 100644 --- a/src/test/enemy_command.test.ts +++ b/test/enemy_command.test.ts @@ -6,7 +6,7 @@ import { Species } from "#app/enums/species"; import type { EnemyPokemon } from "#app/field/pokemon"; import { AiType } from "#app/field/pokemon"; import { randSeedInt } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/escape-calculations.test.ts b/test/escape-calculations.test.ts similarity index 99% rename from src/test/escape-calculations.test.ts rename to test/escape-calculations.test.ts index 419a6b4c19a..6c5c8777d01 100644 --- a/src/test/escape-calculations.test.ts +++ b/test/escape-calculations.test.ts @@ -4,7 +4,7 @@ import { Command } from "#app/ui/command-ui-handler"; import * as Utils from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/evolution.test.ts b/test/evolution.test.ts similarity index 99% rename from src/test/evolution.test.ts rename to test/evolution.test.ts index 8dc19a548ca..dbd4ef3a0d7 100644 --- a/src/test/evolution.test.ts +++ b/test/evolution.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Utils from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/field/pokemon.test.ts b/test/field/pokemon.test.ts similarity index 99% rename from src/test/field/pokemon.test.ts rename to test/field/pokemon.test.ts index 0c282b44f49..b327fe0c137 100644 --- a/src/test/field/pokemon.test.ts +++ b/test/field/pokemon.test.ts @@ -1,6 +1,6 @@ import { Species } from "#app/enums/species"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { PokeballType } from "#enums/pokeball"; import type BattleScene from "#app/battle-scene"; import { Moves } from "#app/enums/moves"; diff --git a/src/test/final_boss.test.ts b/test/final_boss.test.ts similarity index 99% rename from src/test/final_boss.test.ts rename to test/final_boss.test.ts index 5540d9511e4..f7675c17005 100644 --- a/src/test/final_boss.test.ts +++ b/test/final_boss.test.ts @@ -5,7 +5,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; const FinalWave = { diff --git a/src/test/fontFace.setup.ts b/test/fontFace.setup.ts similarity index 100% rename from src/test/fontFace.setup.ts rename to test/fontFace.setup.ts diff --git a/src/test/game-mode.test.ts b/test/game-mode.test.ts similarity index 95% rename from src/test/game-mode.test.ts rename to test/game-mode.test.ts index 2c8184a30ef..3f5819f9a38 100644 --- a/src/test/game-mode.test.ts +++ b/test/game-mode.test.ts @@ -1,8 +1,8 @@ import type { GameMode } from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import * as Utils from "../utils"; -import GameManager from "./utils/gameManager"; +import * as Utils from "#app/utils"; +import GameManager from "#test/testUtils/gameManager"; describe("game-mode", () => { let phaserGame: Phaser.Game; diff --git a/src/test/imports.test.ts b/test/imports.test.ts similarity index 100% rename from src/test/imports.test.ts rename to test/imports.test.ts diff --git a/src/test/inputs/inputs.test.ts b/test/inputs/inputs.test.ts similarity index 96% rename from src/test/inputs/inputs.test.ts rename to test/inputs/inputs.test.ts index 6306c1b9da6..2cdab4b3eb2 100644 --- a/src/test/inputs/inputs.test.ts +++ b/test/inputs/inputs.test.ts @@ -1,7 +1,7 @@ import cfg_keyboard_qwerty from "#app/configs/inputs/cfg_keyboard_qwerty"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; -import GameManager from "#test/utils/gameManager"; -import InputsHandler from "#test/utils/inputsHandler"; +import GameManager from "#test/testUtils/gameManager"; +import InputsHandler from "#test/testUtils/inputsHandler"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/internals.test.ts b/test/internals.test.ts similarity index 95% rename from src/test/internals.test.ts rename to test/internals.test.ts index ce2cd55dbc6..2cc827a8906 100644 --- a/src/test/internals.test.ts +++ b/test/internals.test.ts @@ -1,6 +1,6 @@ import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/dire_hit.test.ts b/test/items/dire_hit.test.ts similarity index 98% rename from src/test/items/dire_hit.test.ts rename to test/items/dire_hit.test.ts index 3c82ebd3a47..4a94030ab93 100644 --- a/src/test/items/dire_hit.test.ts +++ b/test/items/dire_hit.test.ts @@ -1,7 +1,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; diff --git a/src/test/items/double_battle_chance_booster.test.ts b/test/items/double_battle_chance_booster.test.ts similarity index 98% rename from src/test/items/double_battle_chance_booster.test.ts rename to test/items/double_battle_chance_booster.test.ts index cccd8d4765e..2a86a151685 100644 --- a/src/test/items/double_battle_chance_booster.test.ts +++ b/test/items/double_battle_chance_booster.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { DoubleBattleChanceBoosterModifier } from "#app/modifier/modifier"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; diff --git a/src/test/items/eviolite.test.ts b/test/items/eviolite.test.ts similarity index 99% rename from src/test/items/eviolite.test.ts rename to test/items/eviolite.test.ts index a97c287da29..64038cc9b82 100644 --- a/src/test/items/eviolite.test.ts +++ b/test/items/eviolite.test.ts @@ -2,7 +2,7 @@ import { StatBoosterModifier } from "#app/modifier/modifier"; import { NumberHolder, randItem } from "#app/utils"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/exp_booster.test.ts b/test/items/exp_booster.test.ts similarity index 95% rename from src/test/items/exp_booster.test.ts rename to test/items/exp_booster.test.ts index 7441dcaeb73..4519df29b01 100644 --- a/src/test/items/exp_booster.test.ts +++ b/test/items/exp_booster.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#app/enums/abilities"; import { PokemonExpBoosterModifier } from "#app/modifier/modifier"; import * as Utils from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/grip_claw.test.ts b/test/items/grip_claw.test.ts similarity index 98% rename from src/test/items/grip_claw.test.ts rename to test/items/grip_claw.test.ts index e0cbeb95b6f..854e0998d3b 100644 --- a/src/test/items/grip_claw.test.ts +++ b/test/items/grip_claw.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/leek.test.ts b/test/items/leek.test.ts similarity index 98% rename from src/test/items/leek.test.ts rename to test/items/leek.test.ts index 901b353b3d3..a3c509d19dd 100644 --- a/src/test/items/leek.test.ts +++ b/test/items/leek.test.ts @@ -2,7 +2,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/leftovers.test.ts b/test/items/leftovers.test.ts similarity index 97% rename from src/test/items/leftovers.test.ts rename to test/items/leftovers.test.ts index 672151d97cb..8d74301968f 100644 --- a/src/test/items/leftovers.test.ts +++ b/test/items/leftovers.test.ts @@ -3,7 +3,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/light_ball.test.ts b/test/items/light_ball.test.ts similarity index 99% rename from src/test/items/light_ball.test.ts rename to test/items/light_ball.test.ts index aae1d806a28..8dff8001ffc 100644 --- a/src/test/items/light_ball.test.ts +++ b/test/items/light_ball.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/lock_capsule.test.ts b/test/items/lock_capsule.test.ts similarity index 96% rename from src/test/items/lock_capsule.test.ts rename to test/items/lock_capsule.test.ts index 2d95cea5847..4cdd3b8a8a0 100644 --- a/src/test/items/lock_capsule.test.ts +++ b/test/items/lock_capsule.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/items/metal_powder.test.ts b/test/items/metal_powder.test.ts similarity index 99% rename from src/test/items/metal_powder.test.ts rename to test/items/metal_powder.test.ts index 68c3107af08..c1345af35df 100644 --- a/src/test/items/metal_powder.test.ts +++ b/test/items/metal_powder.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/multi_lens.test.ts b/test/items/multi_lens.test.ts similarity index 99% rename from src/test/items/multi_lens.test.ts rename to test/items/multi_lens.test.ts index bd586878fce..01447a29544 100644 --- a/src/test/items/multi_lens.test.ts +++ b/test/items/multi_lens.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/quick_powder.test.ts b/test/items/quick_powder.test.ts similarity index 99% rename from src/test/items/quick_powder.test.ts rename to test/items/quick_powder.test.ts index ae16daf17ff..80ff0d7ba33 100644 --- a/src/test/items/quick_powder.test.ts +++ b/test/items/quick_powder.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/scope_lens.test.ts b/test/items/scope_lens.test.ts similarity index 95% rename from src/test/items/scope_lens.test.ts rename to test/items/scope_lens.test.ts index e39517ceae9..98e374b6969 100644 --- a/src/test/items/scope_lens.test.ts +++ b/test/items/scope_lens.test.ts @@ -1,7 +1,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/temp_stat_stage_booster.test.ts b/test/items/temp_stat_stage_booster.test.ts similarity index 99% rename from src/test/items/temp_stat_stage_booster.test.ts rename to test/items/temp_stat_stage_booster.test.ts index 3e496d1bbf8..8bbd9f4f29d 100644 --- a/src/test/items/temp_stat_stage_booster.test.ts +++ b/test/items/temp_stat_stage_booster.test.ts @@ -1,5 +1,5 @@ import { BATTLE_STATS, Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/thick_club.test.ts b/test/items/thick_club.test.ts similarity index 99% rename from src/test/items/thick_club.test.ts rename to test/items/thick_club.test.ts index d32c213e506..f18c0bd073e 100644 --- a/src/test/items/thick_club.test.ts +++ b/test/items/thick_club.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/items/toxic_orb.test.ts b/test/items/toxic_orb.test.ts similarity index 96% rename from src/test/items/toxic_orb.test.ts rename to test/items/toxic_orb.test.ts index 6918d7f34f0..8201036b927 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/test/items/toxic_orb.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/misc.test.ts b/test/misc.test.ts similarity index 95% rename from src/test/misc.test.ts rename to test/misc.test.ts index ae91a5014d9..f2b89418ef5 100644 --- a/src/test/misc.test.ts +++ b/test/misc.test.ts @@ -1,6 +1,6 @@ // import { apiFetch } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; -import { waitUntil } from "#test/utils/gameManagerUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { waitUntil } from "#test/testUtils/gameManagerUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/after_you.test.ts b/test/moves/after_you.test.ts similarity index 97% rename from src/test/moves/after_you.test.ts rename to test/moves/after_you.test.ts index 99f383194aa..bf030027436 100644 --- a/src/test/moves/after_you.test.ts +++ b/test/moves/after_you.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { MovePhase } from "#app/phases/move-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/alluring_voice.test.ts b/test/moves/alluring_voice.test.ts similarity index 96% rename from src/test/moves/alluring_voice.test.ts rename to test/moves/alluring_voice.test.ts index 2980f102735..bf5a9f90f82 100644 --- a/src/test/moves/alluring_voice.test.ts +++ b/test/moves/alluring_voice.test.ts @@ -4,7 +4,7 @@ import { BattlerTagType } from "#app/enums/battler-tag-type"; import { BerryPhase } from "#app/phases/berry-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/aromatherapy.test.ts b/test/moves/aromatherapy.test.ts similarity index 98% rename from src/test/moves/aromatherapy.test.ts rename to test/moves/aromatherapy.test.ts index 874dadc0a1f..e70384355a0 100644 --- a/src/test/moves/aromatherapy.test.ts +++ b/test/moves/aromatherapy.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/assist.test.ts b/test/moves/assist.test.ts similarity index 98% rename from src/test/moves/assist.test.ts rename to test/moves/assist.test.ts index 81633d9a277..4168ec6295a 100644 --- a/src/test/moves/assist.test.ts +++ b/test/moves/assist.test.ts @@ -5,7 +5,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/astonish.test.ts b/test/moves/astonish.test.ts similarity index 97% rename from src/test/moves/astonish.test.ts rename to test/moves/astonish.test.ts index d94e50fc9f9..87af0db737b 100644 --- a/src/test/moves/astonish.test.ts +++ b/test/moves/astonish.test.ts @@ -7,7 +7,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/moves/aurora_veil.test.ts b/test/moves/aurora_veil.test.ts similarity index 98% rename from src/test/moves/aurora_veil.test.ts rename to test/moves/aurora_veil.test.ts index 721f682f778..c8da3e03db5 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/test/moves/aurora_veil.test.ts @@ -10,7 +10,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/autotomize.test.ts b/test/moves/autotomize.test.ts similarity index 98% rename from src/test/moves/autotomize.test.ts rename to test/moves/autotomize.test.ts index e15642b7ce5..29d2edbcf4e 100644 --- a/src/test/moves/autotomize.test.ts +++ b/test/moves/autotomize.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/baddy_bad.test.ts b/test/moves/baddy_bad.test.ts similarity index 95% rename from src/test/moves/baddy_bad.test.ts rename to test/moves/baddy_bad.test.ts index 1be25704393..78e7c63d49f 100644 --- a/src/test/moves/baddy_bad.test.ts +++ b/test/moves/baddy_bad.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/baneful_bunker.test.ts b/test/moves/baneful_bunker.test.ts similarity index 98% rename from src/test/moves/baneful_bunker.test.ts rename to test/moves/baneful_bunker.test.ts index a0fc0f21ee2..55b4b7d985e 100644 --- a/src/test/moves/baneful_bunker.test.ts +++ b/test/moves/baneful_bunker.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/baton_pass.test.ts b/test/moves/baton_pass.test.ts similarity index 98% rename from src/test/moves/baton_pass.test.ts rename to test/moves/baton_pass.test.ts index 52e4c3ec016..6abd2d95f7b 100644 --- a/src/test/moves/baton_pass.test.ts +++ b/test/moves/baton_pass.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/beak_blast.test.ts b/test/moves/beak_blast.test.ts similarity index 98% rename from src/test/moves/beak_blast.test.ts rename to test/moves/beak_blast.test.ts index 0c1e7bbeed9..177610182b0 100644 --- a/src/test/moves/beak_blast.test.ts +++ b/test/moves/beak_blast.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/beat_up.test.ts b/test/moves/beat_up.test.ts similarity index 97% rename from src/test/moves/beat_up.test.ts rename to test/moves/beat_up.test.ts index 41e5b63471f..1ac2ae238b8 100644 --- a/src/test/moves/beat_up.test.ts +++ b/test/moves/beat_up.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { StatusEffect } from "#app/enums/status-effect"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/belly_drum.test.ts b/test/moves/belly_drum.test.ts similarity index 98% rename from src/test/moves/belly_drum.test.ts rename to test/moves/belly_drum.test.ts index 0bed1248e7e..7d8b17262d7 100644 --- a/src/test/moves/belly_drum.test.ts +++ b/test/moves/belly_drum.test.ts @@ -3,7 +3,7 @@ import { toDmgValue } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; import { Abilities } from "#app/enums/abilities"; diff --git a/src/test/moves/burning_jealousy.test.ts b/test/moves/burning_jealousy.test.ts similarity index 98% rename from src/test/moves/burning_jealousy.test.ts rename to test/moves/burning_jealousy.test.ts index abe2c09bb72..bfa9af600a2 100644 --- a/src/test/moves/burning_jealousy.test.ts +++ b/test/moves/burning_jealousy.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#app/enums/abilities"; import { StatusEffect } from "#app/enums/status-effect"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/camouflage.test.ts b/test/moves/camouflage.test.ts similarity index 96% rename from src/test/moves/camouflage.test.ts rename to test/moves/camouflage.test.ts index 5773afffcc3..8995e2d00bb 100644 --- a/src/test/moves/camouflage.test.ts +++ b/test/moves/camouflage.test.ts @@ -4,7 +4,7 @@ import { Species } from "#enums/species"; import { TerrainType } from "#app/data/terrain"; import { Type } from "#enums/type"; import { BattlerIndex } from "#app/battle"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/ceaseless_edge.test.ts b/test/moves/ceaseless_edge.test.ts similarity index 98% rename from src/test/moves/ceaseless_edge.test.ts rename to test/moves/ceaseless_edge.test.ts index 3fbbb7b0aaf..22cf310bc80 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/test/moves/ceaseless_edge.test.ts @@ -6,7 +6,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; diff --git a/src/test/moves/chilly_reception.test.ts b/test/moves/chilly_reception.test.ts similarity index 98% rename from src/test/moves/chilly_reception.test.ts rename to test/moves/chilly_reception.test.ts index 664ca242b20..0d99175a9bc 100644 --- a/src/test/moves/chilly_reception.test.ts +++ b/test/moves/chilly_reception.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; //import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/chloroblast.test.ts b/test/moves/chloroblast.test.ts similarity index 95% rename from src/test/moves/chloroblast.test.ts rename to test/moves/chloroblast.test.ts index 5e55bf46958..ee01935291a 100644 --- a/src/test/moves/chloroblast.test.ts +++ b/test/moves/chloroblast.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/clangorous_soul.test.ts b/test/moves/clangorous_soul.test.ts similarity index 98% rename from src/test/moves/clangorous_soul.test.ts rename to test/moves/clangorous_soul.test.ts index 52e980cc4fa..6bb50b9ba59 100644 --- a/src/test/moves/clangorous_soul.test.ts +++ b/test/moves/clangorous_soul.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/copycat.test.ts b/test/moves/copycat.test.ts similarity index 98% rename from src/test/moves/copycat.test.ts rename to test/moves/copycat.test.ts index d9e64289481..9b111c7b342 100644 --- a/src/test/moves/copycat.test.ts +++ b/test/moves/copycat.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/crafty_shield.test.ts b/test/moves/crafty_shield.test.ts similarity index 98% rename from src/test/moves/crafty_shield.test.ts rename to test/moves/crafty_shield.test.ts index 93dd4a02538..054d19debf8 100644 --- a/src/test/moves/crafty_shield.test.ts +++ b/test/moves/crafty_shield.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/defog.test.ts b/test/moves/defog.test.ts similarity index 97% rename from src/test/moves/defog.test.ts rename to test/moves/defog.test.ts index c83cdc192bf..52c51df657a 100644 --- a/src/test/moves/defog.test.ts +++ b/test/moves/defog.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/destiny_bond.test.ts b/test/moves/destiny_bond.test.ts similarity index 99% rename from src/test/moves/destiny_bond.test.ts rename to test/moves/destiny_bond.test.ts index e668aee2191..9ae37ef5b9b 100644 --- a/src/test/moves/destiny_bond.test.ts +++ b/test/moves/destiny_bond.test.ts @@ -5,7 +5,7 @@ import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/moves/diamond_storm.test.ts b/test/moves/diamond_storm.test.ts similarity index 96% rename from src/test/moves/diamond_storm.test.ts rename to test/moves/diamond_storm.test.ts index 6e5be2a790d..7a30f73a113 100644 --- a/src/test/moves/diamond_storm.test.ts +++ b/test/moves/diamond_storm.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dig.test.ts b/test/moves/dig.test.ts similarity index 98% rename from src/test/moves/dig.test.ts rename to test/moves/dig.test.ts index 4c6b5d3b75d..53104f13b20 100644 --- a/src/test/moves/dig.test.ts +++ b/test/moves/dig.test.ts @@ -7,7 +7,7 @@ import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import { MoveResult } from "#app/field/pokemon"; import { describe, beforeAll, afterEach, beforeEach, it, expect } from "vitest"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("Moves - Dig", () => { let phaserGame: Phaser.Game; diff --git a/src/test/moves/disable.test.ts b/test/moves/disable.test.ts similarity index 98% rename from src/test/moves/disable.test.ts rename to test/moves/disable.test.ts index bd56201ad33..044cfc762cd 100644 --- a/src/test/moves/disable.test.ts +++ b/test/moves/disable.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Disable", () => { diff --git a/src/test/moves/dive.test.ts b/test/moves/dive.test.ts similarity index 98% rename from src/test/moves/dive.test.ts rename to test/moves/dive.test.ts index b60416d7740..e8febaa72f6 100644 --- a/src/test/moves/dive.test.ts +++ b/test/moves/dive.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; import { WeatherType } from "#enums/weather-type"; diff --git a/src/test/moves/doodle.test.ts b/test/moves/doodle.test.ts similarity index 97% rename from src/test/moves/doodle.test.ts rename to test/moves/doodle.test.ts index 258abda392a..6272a822094 100644 --- a/src/test/moves/doodle.test.ts +++ b/test/moves/doodle.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/double_team.test.ts b/test/moves/double_team.test.ts similarity index 96% rename from src/test/moves/double_team.test.ts rename to test/moves/double_team.test.ts index 62848553e06..9145265bf93 100644 --- a/src/test/moves/double_team.test.ts +++ b/test/moves/double_team.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dragon_cheer.test.ts b/test/moves/dragon_cheer.test.ts similarity index 98% rename from src/test/moves/dragon_cheer.test.ts rename to test/moves/dragon_cheer.test.ts index 750f09214ca..44bedeaa03a 100644 --- a/src/test/moves/dragon_cheer.test.ts +++ b/test/moves/dragon_cheer.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dragon_rage.test.ts b/test/moves/dragon_rage.test.ts similarity index 98% rename from src/test/moves/dragon_rage.test.ts rename to test/moves/dragon_rage.test.ts index 61630ede326..0a5202825f5 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/test/moves/dragon_rage.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dragon_tail.test.ts b/test/moves/dragon_tail.test.ts similarity index 99% rename from src/test/moves/dragon_tail.test.ts rename to test/moves/dragon_tail.test.ts index 96db67279d3..8415251c24c 100644 --- a/src/test/moves/dragon_tail.test.ts +++ b/test/moves/dragon_tail.test.ts @@ -7,7 +7,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/dynamax_cannon.test.ts b/test/moves/dynamax_cannon.test.ts similarity index 99% rename from src/test/moves/dynamax_cannon.test.ts rename to test/moves/dynamax_cannon.test.ts index 033d8960bad..0deb12b2737 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/test/moves/dynamax_cannon.test.ts @@ -4,7 +4,7 @@ import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/effectiveness.test.ts b/test/moves/effectiveness.test.ts similarity index 98% rename from src/test/moves/effectiveness.test.ts rename to test/moves/effectiveness.test.ts index 09c94c740cc..d9974fd1980 100644 --- a/src/test/moves/effectiveness.test.ts +++ b/test/moves/effectiveness.test.ts @@ -6,7 +6,7 @@ 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 GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/electrify.test.ts b/test/moves/electrify.test.ts similarity index 97% rename from src/test/moves/electrify.test.ts rename to test/moves/electrify.test.ts index 8015dd0a74d..f7d78a2f4d0 100644 --- a/src/test/moves/electrify.test.ts +++ b/test/moves/electrify.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/electro_shot.test.ts b/test/moves/electro_shot.test.ts similarity index 98% rename from src/test/moves/electro_shot.test.ts rename to test/moves/electro_shot.test.ts index 283154b3408..7cc7e793f4a 100644 --- a/src/test/moves/electro_shot.test.ts +++ b/test/moves/electro_shot.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/encore.test.ts b/test/moves/encore.test.ts similarity index 98% rename from src/test/moves/encore.test.ts rename to test/moves/encore.test.ts index 7d8dc9658bf..4cf466a7f2a 100644 --- a/src/test/moves/encore.test.ts +++ b/test/moves/encore.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/endure.test.ts b/test/moves/endure.test.ts similarity index 97% rename from src/test/moves/endure.test.ts rename to test/moves/endure.test.ts index bde5a26f68e..8514470d59c 100644 --- a/src/test/moves/endure.test.ts +++ b/test/moves/endure.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/entrainment.test.ts b/test/moves/entrainment.test.ts similarity index 96% rename from src/test/moves/entrainment.test.ts rename to test/moves/entrainment.test.ts index 5d0991c8dfd..608c6ef3676 100644 --- a/src/test/moves/entrainment.test.ts +++ b/test/moves/entrainment.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fairy_lock.test.ts b/test/moves/fairy_lock.test.ts similarity index 99% rename from src/test/moves/fairy_lock.test.ts rename to test/moves/fairy_lock.test.ts index ceb298ed0fe..627eac401cc 100644 --- a/src/test/moves/fairy_lock.test.ts +++ b/test/moves/fairy_lock.test.ts @@ -3,7 +3,7 @@ import { ArenaTagType } from "#app/enums/arena-tag-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fake_out.test.ts b/test/moves/fake_out.test.ts similarity index 98% rename from src/test/moves/fake_out.test.ts rename to test/moves/fake_out.test.ts index f20b6db3a13..21a129b6410 100644 --- a/src/test/moves/fake_out.test.ts +++ b/test/moves/fake_out.test.ts @@ -1,4 +1,4 @@ -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/fell_stinger.test.ts b/test/moves/fell_stinger.test.ts similarity index 99% rename from src/test/moves/fell_stinger.test.ts rename to test/moves/fell_stinger.test.ts index a901ddced44..fdcba624e22 100644 --- a/src/test/moves/fell_stinger.test.ts +++ b/test/moves/fell_stinger.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/fillet_away.test.ts b/test/moves/fillet_away.test.ts similarity index 98% rename from src/test/moves/fillet_away.test.ts rename to test/moves/fillet_away.test.ts index aa3243270cb..076a3011afa 100644 --- a/src/test/moves/fillet_away.test.ts +++ b/test/moves/fillet_away.test.ts @@ -3,7 +3,7 @@ import { toDmgValue } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/fissure.test.ts b/test/moves/fissure.test.ts similarity index 97% rename from src/test/moves/fissure.test.ts rename to test/moves/fissure.test.ts index 65719df0205..07f2a3bfacb 100644 --- a/src/test/moves/fissure.test.ts +++ b/test/moves/fissure.test.ts @@ -5,7 +5,7 @@ import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/flame_burst.test.ts b/test/moves/flame_burst.test.ts similarity index 98% rename from src/test/moves/flame_burst.test.ts rename to test/moves/flame_burst.test.ts index 9dea930d7e8..7bcf06d92ae 100644 --- a/src/test/moves/flame_burst.test.ts +++ b/test/moves/flame_burst.test.ts @@ -4,7 +4,7 @@ import type Pokemon from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/flower_shield.test.ts b/test/moves/flower_shield.test.ts similarity index 98% rename from src/test/moves/flower_shield.test.ts rename to test/moves/flower_shield.test.ts index 4c03df5212b..d6f79c40533 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/test/moves/flower_shield.test.ts @@ -6,7 +6,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fly.test.ts b/test/moves/fly.test.ts similarity index 98% rename from src/test/moves/fly.test.ts rename to test/moves/fly.test.ts index 6ae758fe3dc..b0abf96e128 100644 --- a/src/test/moves/fly.test.ts +++ b/test/moves/fly.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/moves/focus_punch.test.ts b/test/moves/focus_punch.test.ts similarity index 98% rename from src/test/moves/focus_punch.test.ts rename to test/moves/focus_punch.test.ts index 44d9c92cac1..9bf858dfda5 100644 --- a/src/test/moves/focus_punch.test.ts +++ b/test/moves/focus_punch.test.ts @@ -6,7 +6,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import i18next from "i18next"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/follow_me.test.ts b/test/moves/follow_me.test.ts similarity index 98% rename from src/test/moves/follow_me.test.ts rename to test/moves/follow_me.test.ts index fba7937f812..bef9b9ddb01 100644 --- a/src/test/moves/follow_me.test.ts +++ b/test/moves/follow_me.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#app/enums/abilities"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/foresight.test.ts b/test/moves/foresight.test.ts similarity index 97% rename from src/test/moves/foresight.test.ts rename to test/moves/foresight.test.ts index 1195cd0b71b..7dccd0fefca 100644 --- a/src/test/moves/foresight.test.ts +++ b/test/moves/foresight.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/forests_curse.test.ts b/test/moves/forests_curse.test.ts similarity index 96% rename from src/test/moves/forests_curse.test.ts rename to test/moves/forests_curse.test.ts index 010b00599a5..c9977190c9d 100644 --- a/src/test/moves/forests_curse.test.ts +++ b/test/moves/forests_curse.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/freeze_dry.test.ts b/test/moves/freeze_dry.test.ts similarity index 99% rename from src/test/moves/freeze_dry.test.ts rename to test/moves/freeze_dry.test.ts index f207e297191..f07105882c2 100644 --- a/src/test/moves/freeze_dry.test.ts +++ b/test/moves/freeze_dry.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Type } from "#enums/type"; import { Challenges } from "#enums/challenges"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/freezy_frost.test.ts b/test/moves/freezy_frost.test.ts similarity index 98% rename from src/test/moves/freezy_frost.test.ts rename to test/moves/freezy_frost.test.ts index 09d7779474f..26c7d06961f 100644 --- a/src/test/moves/freezy_frost.test.ts +++ b/test/moves/freezy_frost.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { allMoves } from "#app/data/move"; diff --git a/src/test/moves/fusion_bolt.test.ts b/test/moves/fusion_bolt.test.ts similarity index 96% rename from src/test/moves/fusion_bolt.test.ts rename to test/moves/fusion_bolt.test.ts index 4e35b939abf..9bb53ef8fb0 100644 --- a/src/test/moves/fusion_bolt.test.ts +++ b/test/moves/fusion_bolt.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fusion_flare.test.ts b/test/moves/fusion_flare.test.ts similarity index 96% rename from src/test/moves/fusion_flare.test.ts rename to test/moves/fusion_flare.test.ts index 75641c04d02..02f5b19d97f 100644 --- a/src/test/moves/fusion_flare.test.ts +++ b/test/moves/fusion_flare.test.ts @@ -2,7 +2,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/fusion_flare_bolt.test.ts b/test/moves/fusion_flare_bolt.test.ts similarity index 99% rename from src/test/moves/fusion_flare_bolt.test.ts rename to test/moves/fusion_flare_bolt.test.ts index dbd4479dff8..340020c85b7 100644 --- a/src/test/moves/fusion_flare_bolt.test.ts +++ b/test/moves/fusion_flare_bolt.test.ts @@ -7,7 +7,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/future_sight.test.ts b/test/moves/future_sight.test.ts similarity index 95% rename from src/test/moves/future_sight.test.ts rename to test/moves/future_sight.test.ts index d0110a87202..e0a9a1efd04 100644 --- a/src/test/moves/future_sight.test.ts +++ b/test/moves/future_sight.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/gastro_acid.test.ts b/test/moves/gastro_acid.test.ts similarity index 97% rename from src/test/moves/gastro_acid.test.ts rename to test/moves/gastro_acid.test.ts index ec9246c855c..2e4f7938306 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/test/moves/gastro_acid.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/geomancy.test.ts b/test/moves/geomancy.test.ts similarity index 97% rename from src/test/moves/geomancy.test.ts rename to test/moves/geomancy.test.ts index 9ff3a1e7a7d..914e4f7188a 100644 --- a/src/test/moves/geomancy.test.ts +++ b/test/moves/geomancy.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/gigaton_hammer.test.ts b/test/moves/gigaton_hammer.test.ts similarity index 97% rename from src/test/moves/gigaton_hammer.test.ts rename to test/moves/gigaton_hammer.test.ts index f54700fe660..37735b29a3b 100644 --- a/src/test/moves/gigaton_hammer.test.ts +++ b/test/moves/gigaton_hammer.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/glaive_rush.test.ts b/test/moves/glaive_rush.test.ts similarity index 98% rename from src/test/moves/glaive_rush.test.ts rename to test/moves/glaive_rush.test.ts index 9cfbfdd8727..557d003e541 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/test/moves/glaive_rush.test.ts @@ -2,7 +2,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/growth.test.ts b/test/moves/growth.test.ts similarity index 96% rename from src/test/moves/growth.test.ts rename to test/moves/growth.test.ts index a66e4ec6719..dfc41acd757 100644 --- a/src/test/moves/growth.test.ts +++ b/test/moves/growth.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/grudge.test.ts b/test/moves/grudge.test.ts similarity index 98% rename from src/test/moves/grudge.test.ts rename to test/moves/grudge.test.ts index 340808929ab..4b9683dd417 100644 --- a/src/test/moves/grudge.test.ts +++ b/test/moves/grudge.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { BattlerIndex } from "#app/battle"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/guard_split.test.ts b/test/moves/guard_split.test.ts similarity index 97% rename from src/test/moves/guard_split.test.ts rename to test/moves/guard_split.test.ts index 519f347b920..af5023608d3 100644 --- a/src/test/moves/guard_split.test.ts +++ b/test/moves/guard_split.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/guard_swap.test.ts b/test/moves/guard_swap.test.ts similarity index 97% rename from src/test/moves/guard_swap.test.ts rename to test/moves/guard_swap.test.ts index 99769b32899..592307ff168 100644 --- a/src/test/moves/guard_swap.test.ts +++ b/test/moves/guard_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/hard_press.test.ts b/test/moves/hard_press.test.ts similarity index 97% rename from src/test/moves/hard_press.test.ts rename to test/moves/hard_press.test.ts index 0fa4181491c..29a386207ad 100644 --- a/src/test/moves/hard_press.test.ts +++ b/test/moves/hard_press.test.ts @@ -3,7 +3,7 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/haze.test.ts b/test/moves/haze.test.ts similarity index 97% rename from src/test/moves/haze.test.ts rename to test/moves/haze.test.ts index 30aab8bd98c..11071bdc07d 100644 --- a/src/test/moves/haze.test.ts +++ b/test/moves/haze.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/heal_bell.test.ts b/test/moves/heal_bell.test.ts similarity index 98% rename from src/test/moves/heal_bell.test.ts rename to test/moves/heal_bell.test.ts index b180588d3a3..72957ee21e7 100644 --- a/src/test/moves/heal_bell.test.ts +++ b/test/moves/heal_bell.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/heal_block.test.ts b/test/moves/heal_block.test.ts similarity index 98% rename from src/test/moves/heal_block.test.ts rename to test/moves/heal_block.test.ts index 25f2076ff3e..a0e8eaf541c 100644 --- a/src/test/moves/heal_block.test.ts +++ b/test/moves/heal_block.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; diff --git a/src/test/moves/heart_swap.test.ts b/test/moves/heart_swap.test.ts similarity index 96% rename from src/test/moves/heart_swap.test.ts rename to test/moves/heart_swap.test.ts index a128549c459..43569a32a69 100644 --- a/src/test/moves/heart_swap.test.ts +++ b/test/moves/heart_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/hyper_beam.test.ts b/test/moves/hyper_beam.test.ts similarity index 97% rename from src/test/moves/hyper_beam.test.ts rename to test/moves/hyper_beam.test.ts index af8440a0911..5869655948c 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/test/moves/hyper_beam.test.ts @@ -5,7 +5,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { BerryPhase } from "#app/phases/berry-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/imprison.test.ts b/test/moves/imprison.test.ts similarity index 98% rename from src/test/moves/imprison.test.ts rename to test/moves/imprison.test.ts index f10e20dab63..85d529d7a74 100644 --- a/src/test/moves/imprison.test.ts +++ b/test/moves/imprison.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#enums/battler-tag-type"; diff --git a/src/test/moves/instruct.test.ts b/test/moves/instruct.test.ts similarity index 99% rename from src/test/moves/instruct.test.ts rename to test/moves/instruct.test.ts index b26f9c9669f..db9801932cc 100644 --- a/src/test/moves/instruct.test.ts +++ b/test/moves/instruct.test.ts @@ -5,7 +5,7 @@ import type { MovePhase } from "#app/phases/move-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/jaw_lock.test.ts b/test/moves/jaw_lock.test.ts similarity index 99% rename from src/test/moves/jaw_lock.test.ts rename to test/moves/jaw_lock.test.ts index 30dbcac64a8..4f9c6481a9a 100644 --- a/src/test/moves/jaw_lock.test.ts +++ b/test/moves/jaw_lock.test.ts @@ -5,7 +5,7 @@ import { BerryPhase } from "#app/phases/berry-phase"; import { FaintPhase } from "#app/phases/faint-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/lash_out.test.ts b/test/moves/lash_out.test.ts similarity index 96% rename from src/test/moves/lash_out.test.ts rename to test/moves/lash_out.test.ts index 014c0ae8fe5..3fe5c56dd3e 100644 --- a/src/test/moves/lash_out.test.ts +++ b/test/moves/lash_out.test.ts @@ -3,7 +3,7 @@ import { allMoves } from "#app/data/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/last_respects.test.ts b/test/moves/last_respects.test.ts similarity index 99% rename from src/test/moves/last_respects.test.ts rename to test/moves/last_respects.test.ts index 71a76e3fa1a..54e4bc5a0bc 100644 --- a/src/test/moves/last_respects.test.ts +++ b/test/moves/last_respects.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#enums/moves"; import { BattlerIndex } from "#app/battle"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { allMoves } from "#app/data/move"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import Phaser from "phaser"; diff --git a/src/test/moves/light_screen.test.ts b/test/moves/light_screen.test.ts similarity index 98% rename from src/test/moves/light_screen.test.ts rename to test/moves/light_screen.test.ts index 424f43e155c..8eee58c8e17 100644 --- a/src/test/moves/light_screen.test.ts +++ b/test/moves/light_screen.test.ts @@ -9,7 +9,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/lucky_chant.test.ts b/test/moves/lucky_chant.test.ts similarity index 98% rename from src/test/moves/lucky_chant.test.ts rename to test/moves/lucky_chant.test.ts index 02e9dd24465..7f943732192 100644 --- a/src/test/moves/lucky_chant.test.ts +++ b/test/moves/lucky_chant.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import { BerryPhase } from "#app/phases/berry-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("Moves - Lucky Chant", () => { diff --git a/src/test/moves/lunar_blessing.test.ts b/test/moves/lunar_blessing.test.ts similarity index 97% rename from src/test/moves/lunar_blessing.test.ts rename to test/moves/lunar_blessing.test.ts index 52c41a30e11..a81e967a6d9 100644 --- a/src/test/moves/lunar_blessing.test.ts +++ b/test/moves/lunar_blessing.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/lunar_dance.test.ts b/test/moves/lunar_dance.test.ts similarity index 98% rename from src/test/moves/lunar_dance.test.ts rename to test/moves/lunar_dance.test.ts index 603247298ac..37e96e0dc3e 100644 --- a/src/test/moves/lunar_dance.test.ts +++ b/test/moves/lunar_dance.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/magic_coat.test.ts b/test/moves/magic_coat.test.ts similarity index 99% rename from src/test/moves/magic_coat.test.ts rename to test/moves/magic_coat.test.ts index 7371c89d4ac..6ecbea435b6 100644 --- a/src/test/moves/magic_coat.test.ts +++ b/test/moves/magic_coat.test.ts @@ -9,7 +9,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Magic Coat", () => { diff --git a/src/test/moves/magnet_rise.test.ts b/test/moves/magnet_rise.test.ts similarity index 97% rename from src/test/moves/magnet_rise.test.ts rename to test/moves/magnet_rise.test.ts index b26bbf42ed0..e4ceeaea929 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/test/moves/magnet_rise.test.ts @@ -2,7 +2,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/make_it_rain.test.ts b/test/moves/make_it_rain.test.ts similarity index 98% rename from src/test/moves/make_it_rain.test.ts rename to test/moves/make_it_rain.test.ts index 08021227e9c..8de6777bddf 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/test/moves/make_it_rain.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveEndPhase } from "#app/phases/move-end-phase"; diff --git a/src/test/moves/mat_block.test.ts b/test/moves/mat_block.test.ts similarity index 98% rename from src/test/moves/mat_block.test.ts rename to test/moves/mat_block.test.ts index a4d9177cbdc..b9e66253058 100644 --- a/src/test/moves/mat_block.test.ts +++ b/test/moves/mat_block.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/metal_burst.test.ts b/test/moves/metal_burst.test.ts similarity index 98% rename from src/test/moves/metal_burst.test.ts rename to test/moves/metal_burst.test.ts index 3b32dd322a3..7f7cfa841da 100644 --- a/src/test/moves/metal_burst.test.ts +++ b/test/moves/metal_burst.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/metronome.test.ts b/test/moves/metronome.test.ts similarity index 98% rename from src/test/moves/metronome.test.ts rename to test/moves/metronome.test.ts index 946dc92de0f..85c027b62e3 100644 --- a/src/test/moves/metronome.test.ts +++ b/test/moves/metronome.test.ts @@ -5,7 +5,7 @@ import { Stat } from "#app/enums/stat"; import { CommandPhase } from "#app/phases/command-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/miracle_eye.test.ts b/test/moves/miracle_eye.test.ts similarity index 96% rename from src/test/moves/miracle_eye.test.ts rename to test/moves/miracle_eye.test.ts index 70f487de942..068f4f70493 100644 --- a/src/test/moves/miracle_eye.test.ts +++ b/test/moves/miracle_eye.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/mirror_move.test.ts b/test/moves/mirror_move.test.ts similarity index 98% rename from src/test/moves/mirror_move.test.ts rename to test/moves/mirror_move.test.ts index e55c55038ae..a6fe90548be 100644 --- a/src/test/moves/mirror_move.test.ts +++ b/test/moves/mirror_move.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/mist.test.ts b/test/moves/mist.test.ts similarity index 96% rename from src/test/moves/mist.test.ts rename to test/moves/mist.test.ts index cd338f79412..a9b69bccc6c 100644 --- a/src/test/moves/mist.test.ts +++ b/test/moves/mist.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/moongeist_beam.test.ts b/test/moves/moongeist_beam.test.ts similarity index 97% rename from src/test/moves/moongeist_beam.test.ts rename to test/moves/moongeist_beam.test.ts index 216eee482fb..15a5787be41 100644 --- a/src/test/moves/moongeist_beam.test.ts +++ b/test/moves/moongeist_beam.test.ts @@ -2,7 +2,7 @@ import { allMoves, RandomMoveAttr } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/multi_target.test.ts b/test/moves/multi_target.test.ts similarity index 98% rename from src/test/moves/multi_target.test.ts rename to test/moves/multi_target.test.ts index 965876d3445..a2379524c73 100644 --- a/src/test/moves/multi_target.test.ts +++ b/test/moves/multi_target.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/nightmare.test.ts b/test/moves/nightmare.test.ts similarity index 96% rename from src/test/moves/nightmare.test.ts rename to test/moves/nightmare.test.ts index 850b0793b1e..0a2392fe833 100644 --- a/src/test/moves/nightmare.test.ts +++ b/test/moves/nightmare.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/obstruct.test.ts b/test/moves/obstruct.test.ts similarity index 98% rename from src/test/moves/obstruct.test.ts rename to test/moves/obstruct.test.ts index 1649c199e32..e2c469e21f0 100644 --- a/src/test/moves/obstruct.test.ts +++ b/test/moves/obstruct.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/octolock.test.ts b/test/moves/octolock.test.ts similarity index 98% rename from src/test/moves/octolock.test.ts rename to test/moves/octolock.test.ts index 6ca96eeb464..882a2357e1a 100644 --- a/src/test/moves/octolock.test.ts +++ b/test/moves/octolock.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/order_up.test.ts b/test/moves/order_up.test.ts similarity index 98% rename from src/test/moves/order_up.test.ts rename to test/moves/order_up.test.ts index a9281b121b2..339f3f31584 100644 --- a/src/test/moves/order_up.test.ts +++ b/test/moves/order_up.test.ts @@ -6,7 +6,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/parting_shot.test.ts b/test/moves/parting_shot.test.ts similarity index 99% rename from src/test/moves/parting_shot.test.ts rename to test/moves/parting_shot.test.ts index 30ad3660a32..43a6d833949 100644 --- a/src/test/moves/parting_shot.test.ts +++ b/test/moves/parting_shot.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Stat } from "#enums/stat"; import { BerryPhase } from "#app/phases/berry-phase"; import { FaintPhase } from "#app/phases/faint-phase"; diff --git a/src/test/moves/plasma_fists.test.ts b/test/moves/plasma_fists.test.ts similarity index 98% rename from src/test/moves/plasma_fists.test.ts rename to test/moves/plasma_fists.test.ts index 4075c1ab988..5a2ec90f60b 100644 --- a/src/test/moves/plasma_fists.test.ts +++ b/test/moves/plasma_fists.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/pledge_moves.test.ts b/test/moves/pledge_moves.test.ts similarity index 99% rename from src/test/moves/pledge_moves.test.ts rename to test/moves/pledge_moves.test.ts index 64d586e7ba4..24fff05a25d 100644 --- a/src/test/moves/pledge_moves.test.ts +++ b/test/moves/pledge_moves.test.ts @@ -9,7 +9,7 @@ import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/powder.test.ts b/test/moves/powder.test.ts similarity index 99% rename from src/test/moves/powder.test.ts rename to test/moves/powder.test.ts index a1db2bced3a..24162825230 100644 --- a/src/test/moves/powder.test.ts +++ b/test/moves/powder.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/power_shift.test.ts b/test/moves/power_shift.test.ts similarity index 97% rename from src/test/moves/power_shift.test.ts rename to test/moves/power_shift.test.ts index e389f77bedf..bb98d8cf3ed 100644 --- a/src/test/moves/power_shift.test.ts +++ b/test/moves/power_shift.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/power_split.test.ts b/test/moves/power_split.test.ts similarity index 97% rename from src/test/moves/power_split.test.ts rename to test/moves/power_split.test.ts index 914fa86e491..69ea92c69ef 100644 --- a/src/test/moves/power_split.test.ts +++ b/test/moves/power_split.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/power_swap.test.ts b/test/moves/power_swap.test.ts similarity index 97% rename from src/test/moves/power_swap.test.ts rename to test/moves/power_swap.test.ts index e9a4b569c92..637714f1277 100644 --- a/src/test/moves/power_swap.test.ts +++ b/test/moves/power_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/power_trick.test.ts b/test/moves/power_trick.test.ts similarity index 98% rename from src/test/moves/power_trick.test.ts rename to test/moves/power_trick.test.ts index a064a43dec4..e60172b5304 100644 --- a/src/test/moves/power_trick.test.ts +++ b/test/moves/power_trick.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { Species } from "#enums/species"; diff --git a/src/test/moves/protect.test.ts b/test/moves/protect.test.ts similarity index 98% rename from src/test/moves/protect.test.ts rename to test/moves/protect.test.ts index e639969ddf0..d502e997483 100644 --- a/src/test/moves/protect.test.ts +++ b/test/moves/protect.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/psycho_shift.test.ts b/test/moves/psycho_shift.test.ts similarity index 96% rename from src/test/moves/psycho_shift.test.ts rename to test/moves/psycho_shift.test.ts index 448a8c99ef0..d5890a3af0b 100644 --- a/src/test/moves/psycho_shift.test.ts +++ b/test/moves/psycho_shift.test.ts @@ -2,7 +2,7 @@ import { StatusEffect } from "#app/enums/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/purify.test.ts b/test/moves/purify.test.ts similarity index 97% rename from src/test/moves/purify.test.ts rename to test/moves/purify.test.ts index d72b4a87d2a..eba8e9d851f 100644 --- a/src/test/moves/purify.test.ts +++ b/test/moves/purify.test.ts @@ -5,7 +5,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/quash.test.ts b/test/moves/quash.test.ts similarity index 98% rename from src/test/moves/quash.test.ts rename to test/moves/quash.test.ts index 3cbe79d7bfe..dd91820a8db 100644 --- a/src/test/moves/quash.test.ts +++ b/test/moves/quash.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#app/enums/abilities"; import { BattlerIndex } from "#app/battle"; import { WeatherType } from "#enums/weather-type"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { describe, beforeAll, afterEach, beforeEach, it, expect } from "vitest"; diff --git a/src/test/moves/quick_guard.test.ts b/test/moves/quick_guard.test.ts similarity index 98% rename from src/test/moves/quick_guard.test.ts rename to test/moves/quick_guard.test.ts index 7bda71782aa..c326e77d057 100644 --- a/src/test/moves/quick_guard.test.ts +++ b/test/moves/quick_guard.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/rage_fist.test.ts b/test/moves/rage_fist.test.ts similarity index 98% rename from src/test/moves/rage_fist.test.ts rename to test/moves/rage_fist.test.ts index a85be5a88d9..4d17cf990f7 100644 --- a/src/test/moves/rage_fist.test.ts +++ b/test/moves/rage_fist.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { allMoves } from "#app/data/move"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/rage_powder.test.ts b/test/moves/rage_powder.test.ts similarity index 97% rename from src/test/moves/rage_powder.test.ts rename to test/moves/rage_powder.test.ts index 1b73a7f0f5f..15a9bfd951c 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/test/moves/rage_powder.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/reflect.test.ts b/test/moves/reflect.test.ts similarity index 98% rename from src/test/moves/reflect.test.ts rename to test/moves/reflect.test.ts index aa9f2095c89..edc3f1ab8aa 100644 --- a/src/test/moves/reflect.test.ts +++ b/test/moves/reflect.test.ts @@ -9,7 +9,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/reflect_type.test.ts b/test/moves/reflect_type.test.ts similarity index 97% rename from src/test/moves/reflect_type.test.ts rename to test/moves/reflect_type.test.ts index 50e0fc2fbe6..575f4b88f86 100644 --- a/src/test/moves/reflect_type.test.ts +++ b/test/moves/reflect_type.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/relic_song.test.ts b/test/moves/relic_song.test.ts similarity index 97% rename from src/test/moves/relic_song.test.ts rename to test/moves/relic_song.test.ts index c09514850eb..f28047bb90e 100644 --- a/src/test/moves/relic_song.test.ts +++ b/test/moves/relic_song.test.ts @@ -3,7 +3,7 @@ import { Challenges } from "#app/enums/challenges"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/retaliate.test.ts b/test/moves/retaliate.test.ts similarity index 96% rename from src/test/moves/retaliate.test.ts rename to test/moves/retaliate.test.ts index e00b9da6010..32d5379f05e 100644 --- a/src/test/moves/retaliate.test.ts +++ b/test/moves/retaliate.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { allMoves } from "#app/data/move"; diff --git a/src/test/moves/revival_blessing.test.ts b/test/moves/revival_blessing.test.ts similarity index 98% rename from src/test/moves/revival_blessing.test.ts rename to test/moves/revival_blessing.test.ts index cdde3941d30..647771fa23b 100644 --- a/src/test/moves/revival_blessing.test.ts +++ b/test/moves/revival_blessing.test.ts @@ -4,7 +4,7 @@ import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/role_play.test.ts b/test/moves/role_play.test.ts similarity index 96% rename from src/test/moves/role_play.test.ts rename to test/moves/role_play.test.ts index a37f4faac9b..edc41de5c68 100644 --- a/src/test/moves/role_play.test.ts +++ b/test/moves/role_play.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/rollout.test.ts b/test/moves/rollout.test.ts similarity index 98% rename from src/test/moves/rollout.test.ts rename to test/moves/rollout.test.ts index 199f4e1dcf2..c58ab3e6a18 100644 --- a/src/test/moves/rollout.test.ts +++ b/test/moves/rollout.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/roost.test.ts b/test/moves/roost.test.ts similarity index 99% rename from src/test/moves/roost.test.ts rename to test/moves/roost.test.ts index 69301dc86cf..b9424747f5e 100644 --- a/src/test/moves/roost.test.ts +++ b/test/moves/roost.test.ts @@ -5,7 +5,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/round.test.ts b/test/moves/round.test.ts similarity index 97% rename from src/test/moves/round.test.ts rename to test/moves/round.test.ts index 1d7c91bcbd4..5d26e242aff 100644 --- a/src/test/moves/round.test.ts +++ b/test/moves/round.test.ts @@ -4,7 +4,7 @@ import type { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/safeguard.test.ts b/test/moves/safeguard.test.ts similarity index 98% rename from src/test/moves/safeguard.test.ts rename to test/moves/safeguard.test.ts index 6505162fd04..9768b24f170 100644 --- a/src/test/moves/safeguard.test.ts +++ b/test/moves/safeguard.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { allAbilities, PostDefendContactApplyStatusEffectAbAttr } from "#app/data/ability"; import { Abilities } from "#app/enums/abilities"; import { StatusEffect } from "#app/enums/status-effect"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; diff --git a/src/test/moves/scale_shot.test.ts b/test/moves/scale_shot.test.ts similarity index 98% rename from src/test/moves/scale_shot.test.ts rename to test/moves/scale_shot.test.ts index cbaa6611f3e..76954ba2413 100644 --- a/src/test/moves/scale_shot.test.ts +++ b/test/moves/scale_shot.test.ts @@ -8,7 +8,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/secret_power.test.ts b/test/moves/secret_power.test.ts similarity index 98% rename from src/test/moves/secret_power.test.ts rename to test/moves/secret_power.test.ts index 09fe5faa50b..f155633d545 100644 --- a/src/test/moves/secret_power.test.ts +++ b/test/moves/secret_power.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { allMoves } from "#app/data/move"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#enums/status-effect"; diff --git a/src/test/moves/shed_tail.test.ts b/test/moves/shed_tail.test.ts similarity index 97% rename from src/test/moves/shed_tail.test.ts rename to test/moves/shed_tail.test.ts index 33a7d81e460..37f046ba2fa 100644 --- a/src/test/moves/shed_tail.test.ts +++ b/test/moves/shed_tail.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/shell_side_arm.test.ts b/test/moves/shell_side_arm.test.ts similarity index 97% rename from src/test/moves/shell_side_arm.test.ts rename to test/moves/shell_side_arm.test.ts index 41cbefb186b..3a658d53a83 100644 --- a/src/test/moves/shell_side_arm.test.ts +++ b/test/moves/shell_side_arm.test.ts @@ -3,7 +3,7 @@ import { allMoves, ShellSideArmCategoryAttr } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/shell_trap.test.ts b/test/moves/shell_trap.test.ts similarity index 98% rename from src/test/moves/shell_trap.test.ts rename to test/moves/shell_trap.test.ts index 04d3cf998b1..aa94d0cab1b 100644 --- a/src/test/moves/shell_trap.test.ts +++ b/test/moves/shell_trap.test.ts @@ -6,7 +6,7 @@ import { MoveResult } from "#app/field/pokemon"; import { BerryPhase } from "#app/phases/berry-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/simple_beam.test.ts b/test/moves/simple_beam.test.ts similarity index 95% rename from src/test/moves/simple_beam.test.ts rename to test/moves/simple_beam.test.ts index b4566669e8d..1fb8b54e8aa 100644 --- a/src/test/moves/simple_beam.test.ts +++ b/test/moves/simple_beam.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/sketch.test.ts b/test/moves/sketch.test.ts similarity index 98% rename from src/test/moves/sketch.test.ts rename to test/moves/sketch.test.ts index f531f44ef0c..e736893b0aa 100644 --- a/src/test/moves/sketch.test.ts +++ b/test/moves/sketch.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveResult, PokemonMove } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#app/enums/status-effect"; diff --git a/src/test/moves/skill_swap.test.ts b/test/moves/skill_swap.test.ts similarity index 96% rename from src/test/moves/skill_swap.test.ts rename to test/moves/skill_swap.test.ts index 9c0f0b75ade..e39dac8bb01 100644 --- a/src/test/moves/skill_swap.test.ts +++ b/test/moves/skill_swap.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/sleep_talk.test.ts b/test/moves/sleep_talk.test.ts similarity index 97% rename from src/test/moves/sleep_talk.test.ts rename to test/moves/sleep_talk.test.ts index 9ad2d23f903..b9c98f4fb65 100644 --- a/src/test/moves/sleep_talk.test.ts +++ b/test/moves/sleep_talk.test.ts @@ -4,7 +4,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/solar_beam.test.ts b/test/moves/solar_beam.test.ts similarity index 98% rename from src/test/moves/solar_beam.test.ts rename to test/moves/solar_beam.test.ts index ebec338932a..7f18cebff6d 100644 --- a/src/test/moves/solar_beam.test.ts +++ b/test/moves/solar_beam.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/sparkly_swirl.test.ts b/test/moves/sparkly_swirl.test.ts similarity index 98% rename from src/test/moves/sparkly_swirl.test.ts rename to test/moves/sparkly_swirl.test.ts index a83f1c3a437..53851cb77d3 100644 --- a/src/test/moves/sparkly_swirl.test.ts +++ b/test/moves/sparkly_swirl.test.ts @@ -4,7 +4,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/spectral_thief.test.ts b/test/moves/spectral_thief.test.ts similarity index 99% rename from src/test/moves/spectral_thief.test.ts rename to test/moves/spectral_thief.test.ts index 8913b7f3683..883f280da08 100644 --- a/src/test/moves/spectral_thief.test.ts +++ b/test/moves/spectral_thief.test.ts @@ -5,7 +5,7 @@ import { allMoves } from "#app/data/move"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/speed_swap.test.ts b/test/moves/speed_swap.test.ts similarity index 96% rename from src/test/moves/speed_swap.test.ts rename to test/moves/speed_swap.test.ts index 179f1212394..5cdea223296 100644 --- a/src/test/moves/speed_swap.test.ts +++ b/test/moves/speed_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/spikes.test.ts b/test/moves/spikes.test.ts similarity index 97% rename from src/test/moves/spikes.test.ts rename to test/moves/spikes.test.ts index 35e89c8caf7..11ef295a62f 100644 --- a/src/test/moves/spikes.test.ts +++ b/test/moves/spikes.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/spit_up.test.ts b/test/moves/spit_up.test.ts similarity index 99% rename from src/test/moves/spit_up.test.ts rename to test/moves/spit_up.test.ts index 7f9dfaad38b..125b17891ed 100644 --- a/src/test/moves/spit_up.test.ts +++ b/test/moves/spit_up.test.ts @@ -4,7 +4,7 @@ import { allMoves } from "#app/data/move"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import type { TurnMove } from "#app/field/pokemon"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/spotlight.test.ts b/test/moves/spotlight.test.ts similarity index 97% rename from src/test/moves/spotlight.test.ts rename to test/moves/spotlight.test.ts index 095f7d80bfe..2a883d403a7 100644 --- a/src/test/moves/spotlight.test.ts +++ b/test/moves/spotlight.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; diff --git a/src/test/moves/steamroller.test.ts b/test/moves/steamroller.test.ts similarity index 97% rename from src/test/moves/steamroller.test.ts rename to test/moves/steamroller.test.ts index f641c58c2d1..2aed941fd92 100644 --- a/src/test/moves/steamroller.test.ts +++ b/test/moves/steamroller.test.ts @@ -5,7 +5,7 @@ import type { DamageCalculationResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/stockpile.test.ts b/test/moves/stockpile.test.ts similarity index 98% rename from src/test/moves/stockpile.test.ts rename to test/moves/stockpile.test.ts index f83459cd09d..0d0a1de4840 100644 --- a/src/test/moves/stockpile.test.ts +++ b/test/moves/stockpile.test.ts @@ -7,7 +7,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/substitute.test.ts b/test/moves/substitute.test.ts similarity index 99% rename from src/test/moves/substitute.test.ts rename to test/moves/substitute.test.ts index 18b0c6ea536..5acbb6c0a44 100644 --- a/src/test/moves/substitute.test.ts +++ b/test/moves/substitute.test.ts @@ -4,7 +4,7 @@ import { SubstituteTag, TrappedTag } from "#app/data/battler-tags"; import { allMoves, StealHeldItemChanceAttr } from "#app/data/move"; import { MoveResult } from "#app/field/pokemon"; import type { CommandPhase } from "#app/phases/command-phase"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; diff --git a/src/test/moves/swallow.test.ts b/test/moves/swallow.test.ts similarity index 99% rename from src/test/moves/swallow.test.ts rename to test/moves/swallow.test.ts index b2435ba77b3..1ede5808d82 100644 --- a/src/test/moves/swallow.test.ts +++ b/test/moves/swallow.test.ts @@ -8,7 +8,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/syrup_bomb.test.ts b/test/moves/syrup_bomb.test.ts similarity index 98% rename from src/test/moves/syrup_bomb.test.ts rename to test/moves/syrup_bomb.test.ts index ea2f8b6bab3..a284e6fa669 100644 --- a/src/test/moves/syrup_bomb.test.ts +++ b/test/moves/syrup_bomb.test.ts @@ -3,7 +3,7 @@ import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { BattlerIndex } from "#app/battle"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tackle.test.ts b/test/moves/tackle.test.ts similarity index 97% rename from src/test/moves/tackle.test.ts rename to test/moves/tackle.test.ts index ff50f027f87..2ee811d3137 100644 --- a/src/test/moves/tackle.test.ts +++ b/test/moves/tackle.test.ts @@ -3,7 +3,7 @@ import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tail_whip.test.ts b/test/moves/tail_whip.test.ts similarity index 96% rename from src/test/moves/tail_whip.test.ts rename to test/moves/tail_whip.test.ts index 5c83feb8a4e..fea334e4708 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/test/moves/tail_whip.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; diff --git a/src/test/moves/tailwind.test.ts b/test/moves/tailwind.test.ts similarity index 98% rename from src/test/moves/tailwind.test.ts rename to test/moves/tailwind.test.ts index a26dde82824..56cf85749cd 100644 --- a/src/test/moves/tailwind.test.ts +++ b/test/moves/tailwind.test.ts @@ -4,7 +4,7 @@ import { ArenaTagType } from "#app/enums/arena-tag-type"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tar_shot.test.ts b/test/moves/tar_shot.test.ts similarity index 98% rename from src/test/moves/tar_shot.test.ts rename to test/moves/tar_shot.test.ts index 66f540e4f9f..1a259206e48 100644 --- a/src/test/moves/tar_shot.test.ts +++ b/test/moves/tar_shot.test.ts @@ -4,7 +4,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/taunt.test.ts b/test/moves/taunt.test.ts similarity index 96% rename from src/test/moves/taunt.test.ts rename to test/moves/taunt.test.ts index a425a048a2c..c5cdd512704 100644 --- a/src/test/moves/taunt.test.ts +++ b/test/moves/taunt.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveResult } from "#app/field/pokemon"; diff --git a/src/test/moves/telekinesis.test.ts b/test/moves/telekinesis.test.ts similarity index 99% rename from src/test/moves/telekinesis.test.ts rename to test/moves/telekinesis.test.ts index ba2bc40a189..441c70fff34 100644 --- a/src/test/moves/telekinesis.test.ts +++ b/test/moves/telekinesis.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; diff --git a/src/test/moves/tera_blast.test.ts b/test/moves/tera_blast.test.ts similarity index 96% rename from src/test/moves/tera_blast.test.ts rename to test/moves/tera_blast.test.ts index 08e401ef9d1..22231ec6e46 100644 --- a/src/test/moves/tera_blast.test.ts +++ b/test/moves/tera_blast.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#app/enums/abilities"; import { HitResult } from "#app/field/pokemon"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/tera_starstorm.test.ts b/test/moves/tera_starstorm.test.ts similarity index 98% rename from src/test/moves/tera_starstorm.test.ts rename to test/moves/tera_starstorm.test.ts index 1e934b88c86..219a64b4ecc 100644 --- a/src/test/moves/tera_starstorm.test.ts +++ b/test/moves/tera_starstorm.test.ts @@ -3,7 +3,7 @@ import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; diff --git a/src/test/moves/thousand_arrows.test.ts b/test/moves/thousand_arrows.test.ts similarity index 98% rename from src/test/moves/thousand_arrows.test.ts rename to test/moves/thousand_arrows.test.ts index 976b4352ee4..563f99c030d 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/test/moves/thousand_arrows.test.ts @@ -4,7 +4,7 @@ import { BerryPhase } from "#app/phases/berry-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/throat_chop.test.ts b/test/moves/throat_chop.test.ts similarity index 96% rename from src/test/moves/throat_chop.test.ts rename to test/moves/throat_chop.test.ts index 24293f8d086..d69205aadf3 100644 --- a/src/test/moves/throat_chop.test.ts +++ b/test/moves/throat_chop.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/moves/thunder_wave.test.ts b/test/moves/thunder_wave.test.ts similarity index 98% rename from src/test/moves/thunder_wave.test.ts rename to test/moves/thunder_wave.test.ts index 21e215a51f2..34ab64e081a 100644 --- a/src/test/moves/thunder_wave.test.ts +++ b/test/moves/thunder_wave.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/tidy_up.test.ts b/test/moves/tidy_up.test.ts similarity index 98% rename from src/test/moves/tidy_up.test.ts rename to test/moves/tidy_up.test.ts index 255967b40ac..5b5b67847ce 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/test/moves/tidy_up.test.ts @@ -5,7 +5,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SubstituteTag } from "#app/data/battler-tags"; diff --git a/src/test/moves/torment.test.ts b/test/moves/torment.test.ts similarity index 97% rename from src/test/moves/torment.test.ts rename to test/moves/torment.test.ts index b4c9a059db1..8cc835aad48 100644 --- a/src/test/moves/torment.test.ts +++ b/test/moves/torment.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveResult } from "#app/field/pokemon"; diff --git a/src/test/moves/toxic.test.ts b/test/moves/toxic.test.ts similarity index 98% rename from src/test/moves/toxic.test.ts rename to test/moves/toxic.test.ts index b146134ae51..8e66fefe6ff 100644 --- a/src/test/moves/toxic.test.ts +++ b/test/moves/toxic.test.ts @@ -1,6 +1,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#enums/status-effect"; diff --git a/src/test/moves/toxic_spikes.test.ts b/test/moves/toxic_spikes.test.ts similarity index 98% rename from src/test/moves/toxic_spikes.test.ts rename to test/moves/toxic_spikes.test.ts index 8969289c2f2..2bddbc2eccb 100644 --- a/src/test/moves/toxic_spikes.test.ts +++ b/test/moves/toxic_spikes.test.ts @@ -7,7 +7,7 @@ import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/transform.test.ts b/test/moves/transform.test.ts similarity index 98% rename from src/test/moves/transform.test.ts rename to test/moves/transform.test.ts index ffe935aa61b..781e83b7e89 100644 --- a/src/test/moves/transform.test.ts +++ b/test/moves/transform.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/trick_or_treat.test.ts b/test/moves/trick_or_treat.test.ts similarity index 96% rename from src/test/moves/trick_or_treat.test.ts rename to test/moves/trick_or_treat.test.ts index 5c85cac05e2..2efd1b76d1a 100644 --- a/src/test/moves/trick_or_treat.test.ts +++ b/test/moves/trick_or_treat.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Type } from "#enums/type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/triple_arrows.test.ts b/test/moves/triple_arrows.test.ts similarity index 97% rename from src/test/moves/triple_arrows.test.ts rename to test/moves/triple_arrows.test.ts index 98ad29997df..9aa08d7b670 100644 --- a/src/test/moves/triple_arrows.test.ts +++ b/test/moves/triple_arrows.test.ts @@ -2,7 +2,7 @@ import { allMoves, FlinchAttr, StatStageChangeAttr } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/u_turn.test.ts b/test/moves/u_turn.test.ts similarity index 98% rename from src/test/moves/u_turn.test.ts rename to test/moves/u_turn.test.ts index c6e255e01b2..f57dec2e39f 100644 --- a/src/test/moves/u_turn.test.ts +++ b/test/moves/u_turn.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/moves/upper_hand.test.ts b/test/moves/upper_hand.test.ts similarity index 98% rename from src/test/moves/upper_hand.test.ts rename to test/moves/upper_hand.test.ts index f94197d3fbd..c7556c1fa91 100644 --- a/src/test/moves/upper_hand.test.ts +++ b/test/moves/upper_hand.test.ts @@ -3,7 +3,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/moves/whirlwind.test.ts b/test/moves/whirlwind.test.ts similarity index 99% rename from src/test/moves/whirlwind.test.ts rename to test/moves/whirlwind.test.ts index 69232bee43a..8637b6ec02c 100644 --- a/src/test/moves/whirlwind.test.ts +++ b/test/moves/whirlwind.test.ts @@ -5,7 +5,7 @@ import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { Status } from "#app/data/status-effect"; diff --git a/src/test/moves/wide_guard.test.ts b/test/moves/wide_guard.test.ts similarity index 98% rename from src/test/moves/wide_guard.test.ts rename to test/moves/wide_guard.test.ts index c25a700c981..1f0579e24ee 100644 --- a/src/test/moves/wide_guard.test.ts +++ b/test/moves/wide_guard.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; diff --git a/src/test/moves/will_o_wisp.test.ts b/test/moves/will_o_wisp.test.ts similarity index 96% rename from src/test/moves/will_o_wisp.test.ts rename to test/moves/will_o_wisp.test.ts index 39729d331ad..473f0d4d0a8 100644 --- a/src/test/moves/will_o_wisp.test.ts +++ b/test/moves/will_o_wisp.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/mystery-encounter/encounter-test-utils.ts b/test/mystery-encounter/encounter-test-utils.ts similarity index 99% rename from src/test/mystery-encounter/encounter-test-utils.ts rename to test/mystery-encounter/encounter-test-utils.ts index 69fa9b5465f..97f292ef6b1 100644 --- a/src/test/mystery-encounter/encounter-test-utils.ts +++ b/test/mystery-encounter/encounter-test-utils.ts @@ -12,7 +12,7 @@ import { Mode } from "#app/ui/ui"; import { isNullOrUndefined } from "#app/utils"; import { Button } from "#enums/buttons"; import { StatusEffect } from "#enums/status-effect"; -import type GameManager from "#test/utils/gameManager"; +import type GameManager from "#test/testUtils/gameManager"; import { expect, vi } from "vitest"; /** diff --git a/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts rename to test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts index 5a01b8a7379..d7f0ed6e20e 100644 --- a/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts +++ b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; import { EggTier } from "#enums/egg-type"; import { CommandPhase } from "#app/phases/command-phase"; diff --git a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts rename to test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts index 797c062dafe..0503a60cf1b 100644 --- a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts b/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts rename to test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts index 9a6dae53901..b88e02be6ab 100644 --- a/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts +++ b/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts @@ -3,7 +3,7 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; @@ -12,7 +12,7 @@ import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { AnOfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Moves } from "#enums/moves"; import { ShinyRateBoosterModifier } from "#app/modifier/modifier"; diff --git a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts rename to test/mystery-encounter/encounters/berries-abound-encounter.test.ts index f980b0cb20a..d623d1ce7a8 100644 --- a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; @@ -11,7 +11,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { BerryModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/berries-abound-encounter"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import * as EncounterDialogueUtils from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; diff --git a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts rename to test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts index 1ff523909da..6827ea5a463 100644 --- a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts +++ b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; @@ -11,7 +11,7 @@ import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { TrainerType } from "#enums/trainer-type"; import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import { ContactHeldItemTransferChanceModifier } from "#app/modifier/modifier"; diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts rename to test/mystery-encounter/encounters/clowning-around-encounter.test.ts index f95450bbf44..799e26ea271 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; @@ -16,7 +16,7 @@ import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters/clowning-around-encounter"; import { TrainerType } from "#enums/trainer-type"; diff --git a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts rename to test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index ceb457666d7..46217cca5e2 100644 --- a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts rename to test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 8121916a4d7..baea430fdaf 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts rename to test/mystery-encounter/encounters/department-store-sale-encounter.test.ts index e30aaadbf85..224a4403942 100644 --- a/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts +++ b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/field-trip-encounter.test.ts b/test/mystery-encounter/encounters/field-trip-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/field-trip-encounter.test.ts rename to test/mystery-encounter/encounters/field-trip-encounter.test.ts index bc9be246e10..b831a52f116 100644 --- a/src/test/mystery-encounter/encounters/field-trip-encounter.test.ts +++ b/test/mystery-encounter/encounters/field-trip-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts rename to test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts index 2f668dd7f50..96fac78d872 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; import { Gender } from "#app/data/gender"; @@ -18,7 +18,7 @@ import { Status } from "#app/data/status-effect"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; diff --git a/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts rename to test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts index 8c869812f39..116c45c1faf 100644 --- a/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts +++ b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; @@ -12,7 +12,7 @@ import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { FightOrFlightEncounter } from "#app/data/mystery-encounters/encounters/fight-or-flight-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts rename to test/mystery-encounter/encounters/fun-and-games-encounter.test.ts index 44ddbb8f7ba..de351e48c76 100644 --- a/src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts +++ b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { Nature } from "#enums/nature"; diff --git a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts rename to test/mystery-encounter/encounters/global-trade-system-encounter.test.ts index 60780984014..f898b1f574f 100644 --- a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -1,7 +1,7 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts rename to test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts index 17e324f29f0..09ecbc6c31a 100644 --- a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts +++ b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts @@ -5,12 +5,12 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "../encounter-test-utils"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { PartyExpPhase } from "#app/phases/party-exp-phase"; diff --git a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts rename to test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts index 7729fa40599..e42cd321cde 100644 --- a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { MysteriousChallengersEncounter } from "#app/data/mystery-encounters/encounters/mysterious-challengers-encounter"; import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#app/data/trainer-config"; diff --git a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts b/test/mystery-encounter/encounters/part-timer-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/part-timer-encounter.test.ts rename to test/mystery-encounter/encounters/part-timer-encounter.test.ts index e8f2af0de5f..0cd7bc9bc76 100644 --- a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts +++ b/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; diff --git a/src/test/mystery-encounter/encounters/safari-zone.test.ts b/test/mystery-encounter/encounters/safari-zone.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/safari-zone.test.ts rename to test/mystery-encounter/encounters/safari-zone.test.ts index a807805b81c..068e28547f4 100644 --- a/src/test/mystery-encounter/encounters/safari-zone.test.ts +++ b/test/mystery-encounter/encounters/safari-zone.test.ts @@ -2,13 +2,13 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { getSafariSpeciesSpawn, SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; diff --git a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts rename to test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts index a00cca5083c..c7fcc1e967f 100644 --- a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts +++ b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts @@ -8,13 +8,13 @@ import { Species } from "#enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import i18next from "i18next"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts rename to test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts index e6f8127b776..7b10adc9680 100644 --- a/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts @@ -3,13 +3,13 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { CommandPhase } from "#app/phases/command-phase"; diff --git a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts rename to test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts index 4fd96f8d5bc..3a3d94dbc44 100644 --- a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; @@ -12,7 +12,7 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { getSalesmanSpeciesOffer, ThePokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/the-pokemon-salesman-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { NON_LEGEND_PARADOX_POKEMON } from "#app/data/balance/special-species-groups"; diff --git a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts rename to test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts index 3c0e75a2195..1a075ffaff2 100644 --- a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; @@ -20,7 +20,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { BerryModifier, PokemonBaseStatTotalModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; diff --git a/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts similarity index 99% rename from src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts rename to test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts index e087bc5c180..85dbb4e23ff 100644 --- a/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts @@ -3,14 +3,14 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#enums/biome"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; diff --git a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts rename to test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts index 395e33e818a..90a13c75dc3 100644 --- a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts +++ b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; @@ -16,7 +16,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { HitHealModifier, HealShopCostModifier, TurnHealModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { TrashToTreasureEncounter } from "#app/data/mystery-encounters/encounters/trash-to-treasure-encounter"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; diff --git a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts rename to test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index 06bd382879f..ab50666ab3d 100644 --- a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; @@ -10,7 +10,7 @@ import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts similarity index 98% rename from src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts rename to test/mystery-encounter/encounters/weird-dream-encounter.test.ts index 669a99b92cd..073893f340d 100644 --- a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -2,7 +2,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; @@ -11,7 +11,7 @@ import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { WeirdDreamEncounter } from "#app/data/mystery-encounters/encounters/weird-dream-encounter"; import * as EncounterTransformationSequence from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/test/mystery-encounter/mystery-encounter-utils.test.ts similarity index 98% rename from src/test/mystery-encounter/mystery-encounter-utils.test.ts rename to test/mystery-encounter/mystery-encounter-utils.test.ts index 7c924b86e0d..dacfb5cc96e 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -6,10 +6,10 @@ import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, getRandomPla import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Type } from "#enums/type"; import { MessagePhase } from "#app/phases/message-phase"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/test/mystery-encounter/mystery-encounter.test.ts similarity index 96% rename from src/test/mystery-encounter/mystery-encounter.test.ts rename to test/mystery-encounter/mystery-encounter.test.ts index 7958fc1cd46..c70193a5d56 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/test/mystery-encounter/mystery-encounter.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeAll, beforeEach, expect, describe, it } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { Species } from "#enums/species"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/phases/form-change-phase.test.ts b/test/phases/form-change-phase.test.ts similarity index 97% rename from src/test/phases/form-change-phase.test.ts rename to test/phases/form-change-phase.test.ts index 07e59cafe1c..10287cd2046 100644 --- a/src/test/phases/form-change-phase.test.ts +++ b/test/phases/form-change-phase.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { Type } from "#enums/type"; diff --git a/src/test/phases/frenzy-move-reset.test.ts b/test/phases/frenzy-move-reset.test.ts similarity index 97% rename from src/test/phases/frenzy-move-reset.test.ts rename to test/phases/frenzy-move-reset.test.ts index db9ec2bfe66..0bea8e87f47 100644 --- a/src/test/phases/frenzy-move-reset.test.ts +++ b/test/phases/frenzy-move-reset.test.ts @@ -4,7 +4,7 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { StatusEffect } from "#enums/status-effect"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; diff --git a/src/test/phases/game-over-phase.test.ts b/test/phases/game-over-phase.test.ts similarity index 98% rename from src/test/phases/game-over-phase.test.ts rename to test/phases/game-over-phase.test.ts index 2e19d5fe954..4f5e215959a 100644 --- a/src/test/phases/game-over-phase.test.ts +++ b/test/phases/game-over-phase.test.ts @@ -2,7 +2,7 @@ import { Biome } from "#enums/biome"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { achvs } from "#app/system/achv"; diff --git a/src/test/phases/learn-move-phase.test.ts b/test/phases/learn-move-phase.test.ts similarity index 99% rename from src/test/phases/learn-move-phase.test.ts rename to test/phases/learn-move-phase.test.ts index 3a3d111f551..6eb86620877 100644 --- a/src/test/phases/learn-move-phase.test.ts +++ b/test/phases/learn-move-phase.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/test/phases/mystery-encounter-phase.test.ts similarity index 98% rename from src/test/phases/mystery-encounter-phase.test.ts rename to test/phases/mystery-encounter-phase.test.ts index 507862534af..aa4e1683aae 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/test/phases/mystery-encounter-phase.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeAll, beforeEach, expect, describe, it, vi } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { Species } from "#enums/species"; import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; diff --git a/src/test/phases/phases.test.ts b/test/phases/phases.test.ts similarity index 96% rename from src/test/phases/phases.test.ts rename to test/phases/phases.test.ts index 36a405b8d15..4aabeb55b9e 100644 --- a/src/test/phases/phases.test.ts +++ b/test/phases/phases.test.ts @@ -3,7 +3,7 @@ import { LoginPhase } from "#app/phases/login-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { UnavailablePhase } from "#app/phases/unavailable-phase"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/phases/select-modifier-phase.test.ts b/test/phases/select-modifier-phase.test.ts similarity index 98% rename from src/test/phases/select-modifier-phase.test.ts rename to test/phases/select-modifier-phase.test.ts index 23fab729838..0949eeec955 100644 --- a/src/test/phases/select-modifier-phase.test.ts +++ b/test/phases/select-modifier-phase.test.ts @@ -12,8 +12,8 @@ import { Abilities } from "#enums/abilities"; import { Button } from "#enums/buttons"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-account-api.test.ts b/test/plugins/api/pokerogue-account-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-account-api.test.ts rename to test/plugins/api/pokerogue-account-api.test.ts index 90a7d3639ad..e9033c859de 100644 --- a/src/test/plugins/api/pokerogue-account-api.test.ts +++ b/test/plugins/api/pokerogue-account-api.test.ts @@ -1,7 +1,7 @@ import type { AccountInfoResponse } from "#app/@types/PokerogueAccountApi"; import { SESSION_ID_COOKIE_NAME } from "#app/constants"; import { PokerogueAccountApi } from "#app/plugins/api/pokerogue-account-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import * as Utils from "#app/utils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-admin-api.test.ts b/test/plugins/api/pokerogue-admin-api.test.ts similarity index 99% rename from src/test/plugins/api/pokerogue-admin-api.test.ts rename to test/plugins/api/pokerogue-admin-api.test.ts index 5ae46abfcc8..5af55967ae2 100644 --- a/src/test/plugins/api/pokerogue-admin-api.test.ts +++ b/test/plugins/api/pokerogue-admin-api.test.ts @@ -7,7 +7,7 @@ import type { UnlinkAccountFromGoogledIdRequest, } from "#app/@types/PokerogueAdminApi"; import { PokerogueAdminApi } from "#app/plugins/api/pokerogue-admin-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-api.test.ts b/test/plugins/api/pokerogue-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-api.test.ts rename to test/plugins/api/pokerogue-api.test.ts index a62174c226d..241453866a5 100644 --- a/src/test/plugins/api/pokerogue-api.test.ts +++ b/test/plugins/api/pokerogue-api.test.ts @@ -1,6 +1,6 @@ import type { TitleStatsResponse } from "#app/@types/PokerogueApi"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-daily-api.test.ts b/test/plugins/api/pokerogue-daily-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-daily-api.test.ts rename to test/plugins/api/pokerogue-daily-api.test.ts index 569e7cbb15d..95d938e6625 100644 --- a/src/test/plugins/api/pokerogue-daily-api.test.ts +++ b/test/plugins/api/pokerogue-daily-api.test.ts @@ -1,6 +1,6 @@ import type { GetDailyRankingsPageCountRequest, GetDailyRankingsRequest } from "#app/@types/PokerogueDailyApi"; import { PokerogueDailyApi } from "#app/plugins/api/pokerogue-daily-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { ScoreboardCategory, type RankingEntry } from "#app/ui/daily-run-scoreboard"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-savedata-api.test.ts b/test/plugins/api/pokerogue-savedata-api.test.ts similarity index 96% rename from src/test/plugins/api/pokerogue-savedata-api.test.ts rename to test/plugins/api/pokerogue-savedata-api.test.ts index 6dd402206e5..47eafa0a933 100644 --- a/src/test/plugins/api/pokerogue-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-savedata-api.test.ts @@ -1,6 +1,6 @@ import type { UpdateAllSavedataRequest } from "#app/@types/PokerogueSavedataApi"; import { PokerogueSavedataApi } from "#app/plugins/api/pokerogue-savedata-api"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-session-savedata-api.test.ts b/test/plugins/api/pokerogue-session-savedata-api.test.ts similarity index 99% rename from src/test/plugins/api/pokerogue-session-savedata-api.test.ts rename to test/plugins/api/pokerogue-session-savedata-api.test.ts index f453c5edd88..d8103428d59 100644 --- a/src/test/plugins/api/pokerogue-session-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-session-savedata-api.test.ts @@ -8,7 +8,7 @@ import type { } from "#app/@types/PokerogueSessionSavedataApi"; import { PokerogueSessionSavedataApi } from "#app/plugins/api/pokerogue-session-savedata-api"; import type { SessionSaveData } from "#app/system/game-data"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/plugins/api/pokerogue-system-savedata-api.test.ts b/test/plugins/api/pokerogue-system-savedata-api.test.ts similarity index 98% rename from src/test/plugins/api/pokerogue-system-savedata-api.test.ts rename to test/plugins/api/pokerogue-system-savedata-api.test.ts index af377762b77..f108e22ee2c 100644 --- a/src/test/plugins/api/pokerogue-system-savedata-api.test.ts +++ b/test/plugins/api/pokerogue-system-savedata-api.test.ts @@ -6,7 +6,7 @@ import type { } from "#app/@types/PokerogueSystemSavedataApi"; import { PokerogueSystemSavedataApi } from "#app/plugins/api/pokerogue-system-savedata-api"; import type { SystemSaveData } from "#app/system/game-data"; -import { getApiBaseUrl } from "#app/test/utils/testUtils"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; import { http, HttpResponse } from "msw"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/pre.test.ts b/test/pre.test.ts similarity index 100% rename from src/test/pre.test.ts rename to test/pre.test.ts diff --git a/src/test/reload.test.ts b/test/reload.test.ts similarity index 97% rename from src/test/reload.test.ts rename to test/reload.test.ts index b5f66630606..019da0a4c2a 100644 --- a/src/test/reload.test.ts +++ b/test/reload.test.ts @@ -6,8 +6,8 @@ import { Biome } from "#enums/biome"; import { Button } from "#enums/buttons"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import type { MockClock } from "#test/utils/mocks/mockClock"; +import GameManager from "#test/testUtils/gameManager"; +import type { MockClock } from "#test/testUtils/mocks/mockClock"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Reload", () => { diff --git a/src/test/settingMenu/helpers/inGameManip.ts b/test/settingMenu/helpers/inGameManip.ts similarity index 100% rename from src/test/settingMenu/helpers/inGameManip.ts rename to test/settingMenu/helpers/inGameManip.ts diff --git a/src/test/settingMenu/helpers/menuManip.ts b/test/settingMenu/helpers/menuManip.ts similarity index 92% rename from src/test/settingMenu/helpers/menuManip.ts rename to test/settingMenu/helpers/menuManip.ts index 0b1f48525f1..1d53b845047 100644 --- a/src/test/settingMenu/helpers/menuManip.ts +++ b/test/settingMenu/helpers/menuManip.ts @@ -1,4 +1,15 @@ -import { assign, canIAssignThisKey, canIDeleteThisKey, canIOverrideThisSetting, deleteBind, getIconWithKeycode, getIconWithSettingName, getKeyWithKeycode, getKeyWithSettingName, getSettingNameWithKeycode } from "#app/configs/inputs/configHandler"; +import { + assign, + canIAssignThisKey, + canIDeleteThisKey, + canIOverrideThisSetting, + deleteBind, + getIconWithKeycode, + getIconWithSettingName, + getKeyWithKeycode, + getKeyWithSettingName, + getSettingNameWithKeycode, +} from "#app/configs/inputs/configHandler"; import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { expect } from "vitest"; diff --git a/src/test/settingMenu/rebinding_setting.test.ts b/test/settingMenu/rebinding_setting.test.ts similarity index 100% rename from src/test/settingMenu/rebinding_setting.test.ts rename to test/settingMenu/rebinding_setting.test.ts diff --git a/src/test/sprites/pokemonSprite.test.ts b/test/sprites/pokemonSprite.test.ts similarity index 99% rename from src/test/sprites/pokemonSprite.test.ts rename to test/sprites/pokemonSprite.test.ts index 2bfdbe9ce39..43749015e1c 100644 --- a/src/test/sprites/pokemonSprite.test.ts +++ b/test/sprites/pokemonSprite.test.ts @@ -2,7 +2,7 @@ import { getAppRootDir } from "#test/sprites/spritesUtils"; import fs from "fs"; import path from "path"; import { beforeAll, describe, expect, it } from "vitest"; -import _masterlist from "../../../public/images/pokemon/variant/_masterlist.json"; +import _masterlist from "../../public/images/pokemon/variant/_masterlist.json"; type PokemonVariantMasterlist = typeof _masterlist; diff --git a/src/test/sprites/spritesUtils.ts b/test/sprites/spritesUtils.ts similarity index 100% rename from src/test/sprites/spritesUtils.ts rename to test/sprites/spritesUtils.ts diff --git a/src/test/system/game_data.test.ts b/test/system/game_data.test.ts similarity index 96% rename from src/test/system/game_data.test.ts rename to test/system/game_data.test.ts index ad24c40f445..f7940567746 100644 --- a/src/test/system/game_data.test.ts +++ b/test/system/game_data.test.ts @@ -3,10 +3,10 @@ import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import type { SessionSaveData } from "#app/system/game-data"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import * as account from "../../account"; +import * as account from "#app/account"; describe("System - Game Data", () => { let phaserGame: Phaser.Game; diff --git a/src/test/utils/TextInterceptor.ts b/test/testUtils/TextInterceptor.ts similarity index 100% rename from src/test/utils/TextInterceptor.ts rename to test/testUtils/TextInterceptor.ts diff --git a/src/test/utils/errorInterceptor.ts b/test/testUtils/errorInterceptor.ts similarity index 100% rename from src/test/utils/errorInterceptor.ts rename to test/testUtils/errorInterceptor.ts diff --git a/src/test/utils/fakeMobile.html b/test/testUtils/fakeMobile.html similarity index 100% rename from src/test/utils/fakeMobile.html rename to test/testUtils/fakeMobile.html diff --git a/src/test/utils/gameManager.ts b/test/testUtils/gameManager.ts similarity index 95% rename from src/test/utils/gameManager.ts rename to test/testUtils/gameManager.ts index b2015700c9b..436c97a6967 100644 --- a/src/test/utils/gameManager.ts +++ b/test/testUtils/gameManager.ts @@ -22,8 +22,8 @@ import { TitlePhase } from "#app/phases/title-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; -import ErrorInterceptor from "#app/test/utils/errorInterceptor"; -import type InputsHandler from "#app/test/utils/inputsHandler"; +import ErrorInterceptor from "#test/testUtils/errorInterceptor"; +import type InputsHandler from "#test/testUtils/inputsHandler"; import type BallUiHandler from "#app/ui/ball-ui-handler"; import type BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; import type CommandUiHandler from "#app/ui/command-ui-handler"; @@ -40,18 +40,18 @@ import type { Moves } from "#enums/moves"; import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PlayerGender } from "#enums/player-gender"; import type { Species } from "#enums/species"; -import { generateStarter, waitUntil } from "#test/utils/gameManagerUtils"; -import GameWrapper from "#test/utils/gameWrapper"; -import { ChallengeModeHelper } from "#test/utils/helpers/challengeModeHelper"; -import { ClassicModeHelper } from "#test/utils/helpers/classicModeHelper"; -import { DailyModeHelper } from "#test/utils/helpers/dailyModeHelper"; -import { ModifierHelper } from "#test/utils/helpers/modifiersHelper"; -import { MoveHelper } from "#test/utils/helpers/moveHelper"; -import { OverridesHelper } from "#test/utils/helpers/overridesHelper"; -import { ReloadHelper } from "#test/utils/helpers/reloadHelper"; -import { SettingsHelper } from "#test/utils/helpers/settingsHelper"; -import PhaseInterceptor from "#test/utils/phaseInterceptor"; -import TextInterceptor from "#test/utils/TextInterceptor"; +import { generateStarter, waitUntil } from "#test/testUtils/gameManagerUtils"; +import GameWrapper from "#test/testUtils/gameWrapper"; +import { ChallengeModeHelper } from "#test/testUtils/helpers/challengeModeHelper"; +import { ClassicModeHelper } from "#test/testUtils/helpers/classicModeHelper"; +import { DailyModeHelper } from "#test/testUtils/helpers/dailyModeHelper"; +import { ModifierHelper } from "#test/testUtils/helpers/modifiersHelper"; +import { MoveHelper } from "#test/testUtils/helpers/moveHelper"; +import { OverridesHelper } from "#test/testUtils/helpers/overridesHelper"; +import { ReloadHelper } from "#test/testUtils/helpers/reloadHelper"; +import { SettingsHelper } from "#test/testUtils/helpers/settingsHelper"; +import PhaseInterceptor from "#test/testUtils/phaseInterceptor"; +import TextInterceptor from "#test/testUtils/TextInterceptor"; import { AES, enc } from "crypto-js"; import fs from "fs"; import { expect, vi } from "vitest"; diff --git a/src/test/utils/gameManagerUtils.ts b/test/testUtils/gameManagerUtils.ts similarity index 100% rename from src/test/utils/gameManagerUtils.ts rename to test/testUtils/gameManagerUtils.ts diff --git a/src/test/utils/gameWrapper.ts b/test/testUtils/gameWrapper.ts similarity index 93% rename from src/test/utils/gameWrapper.ts rename to test/testUtils/gameWrapper.ts index e8addcfc1d9..c2614b2b61d 100644 --- a/src/test/utils/gameWrapper.ts +++ b/test/testUtils/gameWrapper.ts @@ -4,14 +4,14 @@ import BattleScene, * as battleScene from "#app/battle-scene"; import { MoveAnim } from "#app/data/battle-anims"; import Pokemon from "#app/field/pokemon"; import * as Utils from "#app/utils"; -import { blobToString } from "#test/utils/gameManagerUtils"; -import { MockClock } from "#test/utils/mocks/mockClock"; -import mockConsoleLog from "#test/utils/mocks/mockConsoleLog"; -import { MockFetch } from "#test/utils/mocks/mockFetch"; -import MockLoader from "#test/utils/mocks/mockLoader"; -import mockLocalStorage from "#test/utils/mocks/mockLocalStorage"; -import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; -import MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import { blobToString } from "#test/testUtils/gameManagerUtils"; +import { MockClock } from "#test/testUtils/mocks/mockClock"; +import mockConsoleLog from "#test/testUtils/mocks/mockConsoleLog"; +import { MockFetch } from "#test/testUtils/mocks/mockFetch"; +import MockLoader from "#test/testUtils/mocks/mockLoader"; +import mockLocalStorage from "#test/testUtils/mocks/mockLocalStorage"; +import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; +import MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import fs from "fs"; import Phaser from "phaser"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; @@ -24,7 +24,7 @@ import KeyboardPlugin = Phaser.Input.Keyboard.KeyboardPlugin; import GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; import EventEmitter = Phaser.Events.EventEmitter; import UpdateList = Phaser.GameObjects.UpdateList; -import { version } from "../../../package.json"; +import { version } from "../../package.json"; import { MockTimedEventManager } from "./mocks/mockTimedEventManager"; Object.defineProperty(window, "localStorage", { diff --git a/src/test/utils/helpers/challengeModeHelper.ts b/test/testUtils/helpers/challengeModeHelper.ts similarity index 100% rename from src/test/utils/helpers/challengeModeHelper.ts rename to test/testUtils/helpers/challengeModeHelper.ts diff --git a/src/test/utils/helpers/classicModeHelper.ts b/test/testUtils/helpers/classicModeHelper.ts similarity index 100% rename from src/test/utils/helpers/classicModeHelper.ts rename to test/testUtils/helpers/classicModeHelper.ts diff --git a/src/test/utils/helpers/dailyModeHelper.ts b/test/testUtils/helpers/dailyModeHelper.ts similarity index 100% rename from src/test/utils/helpers/dailyModeHelper.ts rename to test/testUtils/helpers/dailyModeHelper.ts diff --git a/src/test/utils/helpers/gameManagerHelper.ts b/test/testUtils/helpers/gameManagerHelper.ts similarity index 100% rename from src/test/utils/helpers/gameManagerHelper.ts rename to test/testUtils/helpers/gameManagerHelper.ts diff --git a/src/test/utils/helpers/modifiersHelper.ts b/test/testUtils/helpers/modifiersHelper.ts similarity index 100% rename from src/test/utils/helpers/modifiersHelper.ts rename to test/testUtils/helpers/modifiersHelper.ts diff --git a/src/test/utils/helpers/moveHelper.ts b/test/testUtils/helpers/moveHelper.ts similarity index 97% rename from src/test/utils/helpers/moveHelper.ts rename to test/testUtils/helpers/moveHelper.ts index ee026c06a8d..535537b34a2 100644 --- a/src/test/utils/helpers/moveHelper.ts +++ b/test/testUtils/helpers/moveHelper.ts @@ -9,8 +9,8 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; -import { GameManagerHelper } from "#test/utils/helpers/gameManagerHelper"; +import { getMovePosition } from "#test/testUtils/gameManagerUtils"; +import { GameManagerHelper } from "#test/testUtils/helpers/gameManagerHelper"; import { vi } from "vitest"; /** diff --git a/src/test/utils/helpers/overridesHelper.ts b/test/testUtils/helpers/overridesHelper.ts similarity index 100% rename from src/test/utils/helpers/overridesHelper.ts rename to test/testUtils/helpers/overridesHelper.ts diff --git a/src/test/utils/helpers/reloadHelper.ts b/test/testUtils/helpers/reloadHelper.ts similarity index 100% rename from src/test/utils/helpers/reloadHelper.ts rename to test/testUtils/helpers/reloadHelper.ts diff --git a/src/test/utils/helpers/settingsHelper.ts b/test/testUtils/helpers/settingsHelper.ts similarity index 100% rename from src/test/utils/helpers/settingsHelper.ts rename to test/testUtils/helpers/settingsHelper.ts diff --git a/src/test/utils/inputsHandler.ts b/test/testUtils/inputsHandler.ts similarity index 94% rename from src/test/utils/inputsHandler.ts rename to test/testUtils/inputsHandler.ts index e2591def447..c526300a75a 100644 --- a/src/test/utils/inputsHandler.ts +++ b/test/testUtils/inputsHandler.ts @@ -2,7 +2,7 @@ import type BattleScene from "#app/battle-scene"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import type { InputsController } from "#app/inputs-controller"; import TouchControl from "#app/touch-controls"; -import { holdOn } from "#test/utils/gameManagerUtils"; +import { holdOn } from "#test/testUtils/gameManagerUtils"; import fs from "fs"; import { JSDOM } from "jsdom"; import Phaser from "phaser"; @@ -90,7 +90,7 @@ class Fakepad extends Phaser.Input.Gamepad.Gamepad { class FakeMobile { constructor() { - const fakeMobilePage = fs.readFileSync("./src/test/utils/fakeMobile.html", { encoding: "utf8", flag: "r" }); + const fakeMobilePage = fs.readFileSync("././test/testUtils/fakeMobile.html", { encoding: "utf8", flag: "r" }); const dom = new JSDOM(fakeMobilePage); Object.defineProperty(window, "document", { value: dom.window.document, diff --git a/src/test/utils/mocks/mockClock.ts b/test/testUtils/mocks/mockClock.ts similarity index 100% rename from src/test/utils/mocks/mockClock.ts rename to test/testUtils/mocks/mockClock.ts diff --git a/src/test/utils/mocks/mockConsoleLog.ts b/test/testUtils/mocks/mockConsoleLog.ts similarity index 100% rename from src/test/utils/mocks/mockConsoleLog.ts rename to test/testUtils/mocks/mockConsoleLog.ts diff --git a/src/test/utils/mocks/mockFetch.ts b/test/testUtils/mocks/mockFetch.ts similarity index 100% rename from src/test/utils/mocks/mockFetch.ts rename to test/testUtils/mocks/mockFetch.ts diff --git a/src/test/utils/mocks/mockGameObject.ts b/test/testUtils/mocks/mockGameObject.ts similarity index 100% rename from src/test/utils/mocks/mockGameObject.ts rename to test/testUtils/mocks/mockGameObject.ts diff --git a/src/test/utils/mocks/mockGameObjectCreator.ts b/test/testUtils/mocks/mockGameObjectCreator.ts similarity index 100% rename from src/test/utils/mocks/mockGameObjectCreator.ts rename to test/testUtils/mocks/mockGameObjectCreator.ts diff --git a/src/test/utils/mocks/mockLoader.ts b/test/testUtils/mocks/mockLoader.ts similarity index 100% rename from src/test/utils/mocks/mockLoader.ts rename to test/testUtils/mocks/mockLoader.ts diff --git a/src/test/utils/mocks/mockLocalStorage.ts b/test/testUtils/mocks/mockLocalStorage.ts similarity index 100% rename from src/test/utils/mocks/mockLocalStorage.ts rename to test/testUtils/mocks/mockLocalStorage.ts diff --git a/src/test/utils/mocks/mockTextureManager.ts b/test/testUtils/mocks/mockTextureManager.ts similarity index 80% rename from src/test/utils/mocks/mockTextureManager.ts rename to test/testUtils/mocks/mockTextureManager.ts index 39066561f25..44d33cf8910 100644 --- a/src/test/utils/mocks/mockTextureManager.ts +++ b/test/testUtils/mocks/mockTextureManager.ts @@ -1,11 +1,11 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; -import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; -import MockNineslice from "#test/utils/mocks/mocksContainer/mockNineslice"; -import MockPolygon from "#test/utils/mocks/mocksContainer/mockPolygon"; -import MockRectangle from "#test/utils/mocks/mocksContainer/mockRectangle"; -import MockSprite from "#test/utils/mocks/mocksContainer/mockSprite"; -import MockText from "#test/utils/mocks/mocksContainer/mockText"; -import MockTexture from "#test/utils/mocks/mocksContainer/mockTexture"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; +import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; +import MockNineslice from "#test/testUtils/mocks/mocksContainer/mockNineslice"; +import MockPolygon from "#test/testUtils/mocks/mocksContainer/mockPolygon"; +import MockRectangle from "#test/testUtils/mocks/mocksContainer/mockRectangle"; +import MockSprite from "#test/testUtils/mocks/mocksContainer/mockSprite"; +import MockText from "#test/testUtils/mocks/mocksContainer/mockText"; +import MockTexture from "#test/testUtils/mocks/mocksContainer/mockTexture"; import type { MockGameObject } from "./mockGameObject"; import { MockVideoGameObject } from "./mockVideoGameObject"; diff --git a/src/test/utils/mocks/mockTimedEventManager.ts b/test/testUtils/mocks/mockTimedEventManager.ts similarity index 100% rename from src/test/utils/mocks/mockTimedEventManager.ts rename to test/testUtils/mocks/mockTimedEventManager.ts diff --git a/src/test/utils/mocks/mockVideoGameObject.ts b/test/testUtils/mocks/mockVideoGameObject.ts similarity index 100% rename from src/test/utils/mocks/mockVideoGameObject.ts rename to test/testUtils/mocks/mockVideoGameObject.ts diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/test/testUtils/mocks/mocksContainer/mockContainer.ts similarity index 98% rename from src/test/utils/mocks/mocksContainer/mockContainer.ts rename to test/testUtils/mocks/mocksContainer/mockContainer.ts index f0198535e7b..6c03ff7460d 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/test/testUtils/mocks/mocksContainer/mockContainer.ts @@ -1,4 +1,4 @@ -import type MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import type MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import type { MockGameObject } from "../mockGameObject"; export default class MockContainer implements MockGameObject { diff --git a/src/test/utils/mocks/mocksContainer/mockGraphics.ts b/test/testUtils/mocks/mocksContainer/mockGraphics.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockGraphics.ts rename to test/testUtils/mocks/mocksContainer/mockGraphics.ts diff --git a/src/test/utils/mocks/mocksContainer/mockImage.ts b/test/testUtils/mocks/mocksContainer/mockImage.ts similarity index 70% rename from src/test/utils/mocks/mocksContainer/mockImage.ts rename to test/testUtils/mocks/mocksContainer/mockImage.ts index be183a0dd89..3badde4f8ab 100644 --- a/src/test/utils/mocks/mocksContainer/mockImage.ts +++ b/test/testUtils/mocks/mocksContainer/mockImage.ts @@ -1,4 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockImage extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockNineslice.ts b/test/testUtils/mocks/mocksContainer/mockNineslice.ts similarity index 86% rename from src/test/utils/mocks/mocksContainer/mockNineslice.ts rename to test/testUtils/mocks/mocksContainer/mockNineslice.ts index a8e10036a72..4f6b8a5d21d 100644 --- a/src/test/utils/mocks/mocksContainer/mockNineslice.ts +++ b/test/testUtils/mocks/mocksContainer/mockNineslice.ts @@ -1,4 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockNineslice extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockPolygon.ts b/test/testUtils/mocks/mocksContainer/mockPolygon.ts similarity index 67% rename from src/test/utils/mocks/mocksContainer/mockPolygon.ts rename to test/testUtils/mocks/mocksContainer/mockPolygon.ts index 12b60904a96..43e9c5460d0 100644 --- a/src/test/utils/mocks/mocksContainer/mockPolygon.ts +++ b/test/testUtils/mocks/mocksContainer/mockPolygon.ts @@ -1,4 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockPolygon extends MockContainer { diff --git a/src/test/utils/mocks/mocksContainer/mockRectangle.ts b/test/testUtils/mocks/mocksContainer/mockRectangle.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockRectangle.ts rename to test/testUtils/mocks/mocksContainer/mockRectangle.ts diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/test/testUtils/mocks/mocksContainer/mockSprite.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockSprite.ts rename to test/testUtils/mocks/mocksContainer/mockSprite.ts diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/test/testUtils/mocks/mocksContainer/mockText.ts similarity index 100% rename from src/test/utils/mocks/mocksContainer/mockText.ts rename to test/testUtils/mocks/mocksContainer/mockText.ts diff --git a/src/test/utils/mocks/mocksContainer/mockTexture.ts b/test/testUtils/mocks/mocksContainer/mockTexture.ts similarity index 92% rename from src/test/utils/mocks/mocksContainer/mockTexture.ts rename to test/testUtils/mocks/mocksContainer/mockTexture.ts index 57c87df23be..a9186783d46 100644 --- a/src/test/utils/mocks/mocksContainer/mockTexture.ts +++ b/test/testUtils/mocks/mocksContainer/mockTexture.ts @@ -1,4 +1,4 @@ -import type MockTextureManager from "#test/utils/mocks/mockTextureManager"; +import type MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; import type { MockGameObject } from "../mockGameObject"; diff --git a/src/test/utils/phaseInterceptor.ts b/test/testUtils/phaseInterceptor.ts similarity index 99% rename from src/test/utils/phaseInterceptor.ts rename to test/testUtils/phaseInterceptor.ts index 91f98e89ec3..fe0fbf82e29 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/test/testUtils/phaseInterceptor.ts @@ -1,5 +1,5 @@ import { Phase } from "#app/phase"; -import ErrorInterceptor from "#app/test/utils/errorInterceptor"; +import ErrorInterceptor from "#test/testUtils/errorInterceptor"; import { AttemptRunPhase } from "#app/phases/attempt-run-phase"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { BerryPhase } from "#app/phases/berry-phase"; diff --git a/src/test/utils/saves/data_new.prsv b/test/testUtils/saves/data_new.prsv similarity index 100% rename from src/test/utils/saves/data_new.prsv rename to test/testUtils/saves/data_new.prsv diff --git a/src/test/utils/saves/everything.prsv b/test/testUtils/saves/everything.prsv similarity index 100% rename from src/test/utils/saves/everything.prsv rename to test/testUtils/saves/everything.prsv diff --git a/src/test/utils/testUtils.ts b/test/testUtils/testUtils.ts similarity index 100% rename from src/test/utils/testUtils.ts rename to test/testUtils/testUtils.ts diff --git a/src/test/ui/battle_info.test.ts b/test/ui/battle_info.test.ts similarity index 96% rename from src/test/ui/battle_info.test.ts rename to test/ui/battle_info.test.ts index 3100372f091..6209312c451 100644 --- a/src/test/ui/battle_info.test.ts +++ b/test/ui/battle_info.test.ts @@ -3,7 +3,7 @@ import { Species } from "#app/enums/species"; import { ExpPhase } from "#app/phases/exp-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/test/ui/starter-select.test.ts b/test/ui/starter-select.test.ts similarity index 97% rename from src/test/ui/starter-select.test.ts rename to test/ui/starter-select.test.ts index 15b5f643539..685debf098d 100644 --- a/src/test/ui/starter-select.test.ts +++ b/test/ui/starter-select.test.ts @@ -13,7 +13,7 @@ import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Button } from "#enums/buttons"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import i18next from "i18next"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -38,7 +38,7 @@ describe("UI - Starter select", () => { }); it("Bulbasaur - shiny - variant 2 male", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -98,7 +98,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 2 female hardy overgrow", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -160,7 +160,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 2 female lonely chlorophyl", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -225,7 +225,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 2 female", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -286,7 +286,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - not shiny", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -346,7 +346,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 1", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -408,7 +408,7 @@ describe("UI - Starter select", () => { }, 20000); it("Bulbasaur - shiny - variant 0", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -469,7 +469,7 @@ describe("UI - Starter select", () => { }, 20000); it("Check if first pokemon in party is caterpie from gen 1 and 1rd row, 3rd column", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; @@ -533,7 +533,7 @@ describe("UI - Starter select", () => { }, 20000); it("Check if first pokemon in party is nidoran_m from gen 1 and 2nd row, 4th column (cursor (9+4)-1)", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; diff --git a/src/test/ui/transfer-item.test.ts b/test/ui/transfer-item.test.ts similarity index 98% rename from src/test/ui/transfer-item.test.ts rename to test/ui/transfer-item.test.ts index b08b056f60e..83c2eb2ef79 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/test/ui/transfer-item.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/src/test/ui/type-hints.test.ts b/test/ui/type-hints.test.ts similarity index 95% rename from src/test/ui/type-hints.test.ts rename to test/ui/type-hints.test.ts index 9046d82c1df..0838ab01f51 100644 --- a/src/test/ui/type-hints.test.ts +++ b/test/ui/type-hints.test.ts @@ -4,10 +4,10 @@ import { Species } from "#app/enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import FightUiHandler from "#app/ui/fight-ui-handler"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import type MockText from "#test/utils/mocks/mocksContainer/mockText"; +import type MockText from "#test/testUtils/mocks/mocksContainer/mockText"; import i18next from "i18next"; describe("UI - Type Hints", () => { diff --git a/src/test/vitest.setup.ts b/test/vitest.setup.ts similarity index 97% rename from src/test/vitest.setup.ts rename to test/vitest.setup.ts index eb2c1e4b9cf..bc7db8ea591 100644 --- a/src/test/vitest.setup.ts +++ b/test/vitest.setup.ts @@ -45,7 +45,7 @@ vi.mock("i18next", async (importOriginal) => { const filename = req.params[0]; try { - const json = await import(`../../public/locales/en/${req.params[0]}`); + const json = await import(`../public/locales/en/${req.params[0]}`); console.log("Loaded locale", filename); return HttpResponse.json(json); } catch (err) { diff --git a/tsconfig.json b/tsconfig.json index 0ec945df4ee..6bb0ae51c1b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,12 +8,12 @@ "strictNullChecks": true, "sourceMap": false, "strict": false, - "rootDir": "./src", + "rootDir": ".", "baseUrl": "./src", "paths": { "#enums/*": ["./enums/*.ts"], "#app/*": ["*.ts"], - "#test/*": ["./test/*.ts"] + "#test/*": ["../test/*.ts"] }, "outDir": "./build", "noEmit": true @@ -31,4 +31,4 @@ "vitest.config.ts", "vitest.workspace.ts", ] -} \ No newline at end of file +} diff --git a/vitest.config.ts b/vitest.config.ts index 9f9245687a1..b52c16ec00c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,7 +5,7 @@ export default defineProject(({ mode }) => ({ ...defaultConfig, test: { testTimeout: 20000, - setupFiles: ["./src/test/fontFace.setup.ts", "./src/test/vitest.setup.ts"], + setupFiles: ["./test/fontFace.setup.ts", "./test/vitest.setup.ts"], server: { deps: { inline: ["vitest-canvas-mock"], @@ -33,8 +33,8 @@ export default defineProject(({ mode }) => ({ reporters: ["text-summary", "html"], }, name: "main", - include: ["./src/test/**/*.{test,spec}.ts"], - exclude: ["./src/test/pre.test.ts"], + include: ["./test/**/*.{test,spec}.ts"], + exclude: ["./test/pre.test.ts"], }, esbuild: { pure: mode === "production" ? ["console.log"] : [], diff --git a/vitest.workspace.ts b/vitest.workspace.ts index 38121942004..2f5d1f1e2c8 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -6,7 +6,7 @@ export default defineWorkspace([ ...defaultConfig, test: { name: "pre", - include: ["src/test/pre.test.ts"], + include: ["./test/pre.test.ts"], environment: "jsdom", }, }, From eeeb4171b18b55f9ba252f58b4632a82f32e684c Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Sat, 22 Feb 2025 23:35:49 -0600 Subject: [PATCH 18/83] [Move] Add flavor text for Splash and Celebrate (#5392) * Add flavor text for Splash and Celebrate * Remove unnecessary constructors * Use Splash move text from move triggers --- src/data/move.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/data/move.ts b/src/data/move.ts index 30c5ef75491..332a3302fdd 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -61,6 +61,7 @@ import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; import { LoadMoveAnimPhase } from "#app/phases/load-move-anim-phase"; import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; import { MoveAnimPhase } from "#app/phases/move-anim-phase"; +import { loggedInUser } from "#app/account"; export enum MoveCategory { PHYSICAL, @@ -1584,6 +1585,20 @@ export class SurviveDamageAttr extends ModifiedDamageAttr { } } +export class SplashAttr extends MoveEffectAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + globalScene.queueMessage(i18next.t("moveTriggers:splash")); + return true; + } +} + +export class CelebrateAttr extends MoveEffectAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + globalScene.queueMessage(i18next.t("moveTriggers:celebrate", { playerName: loggedInUser?.username })); + return true; + } +} + export class RecoilAttr extends MoveEffectAttr { private useHp: boolean; private damageRatio: number; @@ -8852,6 +8867,7 @@ export function initMoves() { new AttackMove(Moves.PSYWAVE, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) .attr(RandomLevelDamageAttr), new SelfStatusMove(Moves.SPLASH, Type.NORMAL, -1, 40, -1, 0, 1) + .attr(SplashAttr) .condition(failOnGravityCondition), new SelfStatusMove(Moves.ACID_ARMOR, Type.POISON, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), @@ -10294,7 +10310,8 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES), new AttackMove(Moves.DAZZLING_GLEAM, Type.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.CELEBRATE, Type.NORMAL, -1, 40, -1, 0, 6), + new SelfStatusMove(Moves.CELEBRATE, Type.NORMAL, -1, 40, -1, 0, 6) + .attr(CelebrateAttr), new StatusMove(Moves.HOLD_HANDS, Type.NORMAL, -1, 40, -1, 0, 6) .ignoresSubstitute() .target(MoveTarget.NEAR_ALLY), From cefd92bee8fbbba5db5d0f8b299a0ac1590335a7 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 22 Feb 2025 22:06:27 -0800 Subject: [PATCH 19/83] [Misc] Update Encounter Phase logging nature display and passive check (#5397) --- src/phases/encounter-phase.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index ce85460a481..b868c3f8952 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -38,7 +38,7 @@ import { Species } from "#enums/species"; import { overrideHeldItems, overrideModifiers } from "#app/modifier/modifier"; import i18next from "i18next"; import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; -import { Nature } from "#enums/nature"; +import { getNatureName } from "#app/data/nature"; export class EncounterPhase extends BattlePhase { private loaded: boolean; @@ -173,12 +173,12 @@ export class EncounterPhase extends BattlePhase { console.log( `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, `| Species ID: ${enemyPokemon.species.speciesId}`, - `| Nature: ${Nature[enemyPokemon.getNature()]}`, + `| Nature: ${getNatureName(enemyPokemon.nature, true, true, true)}`, ); console.log(`Stats (IVs): ${stats}`); console.log( `Ability: ${enemyPokemon.getAbility().name}`, - `| Passive Ability${enemyPokemon.isBoss() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, + `| Passive Ability${enemyPokemon.hasPassive() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}` ); console.log("Moveset:", moveset); From 095634fe6d1661bfcaef0d4b51ecd523dba19e7a Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sun, 23 Feb 2025 14:21:24 -0500 Subject: [PATCH 20/83] [Bug] Fix Gym Leaders fought on wave 20 not evolving mons when fought later in the run (#5370) * Fix repeat Plains GLs not evolving first mons * Add null check --- src/data/pokemon-species.ts | 6 +++++- src/data/trainer-config.ts | 3 --- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index ff9fbdf0bc8..06704666153 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -830,7 +830,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } } - if (!allowEvolving || !pokemonEvolutions.hasOwnProperty(this.speciesId)) { + if ( // If evolutions shouldn't happen, add more cases here :) + !allowEvolving + || !pokemonEvolutions.hasOwnProperty(this.speciesId) + || globalScene.currentBattle?.waveIndex === 20 && globalScene.gameMode.isClassic && globalScene.currentBattle.trainer + ) { return this.speciesId; } diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index d9aab528e72..1b646fc6478 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1247,9 +1247,6 @@ function getGymLeaderPartyTemplate() { export function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void) { return (level: number, strength: PartyMemberStrength) => { let species = Utils.randSeedItem(speciesPool); - if (globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex === 20) { - ignoreEvolution = true; - } if (!ignoreEvolution) { species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex); } From 3ab75b297b0e221df68d7270d47d4910a741ae9b Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 23 Feb 2025 22:27:40 -0800 Subject: [PATCH 21/83] [Misc] Copy Encounter Phase logging to MEs (#5405) --- .../utils/encounter-phase-utils.ts | 28 ++++++++++++++++++- src/phases/encounter-phase.ts | 2 +- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index d745da5ecb3..1f740763148 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -47,6 +47,8 @@ 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"; +import { getNatureName } from "#app/data/nature"; +import { getPokemonNameWithAffix } from "#app/messages"; /** * Animates exclamation sprite over trainer's head at start of encounter @@ -357,7 +359,31 @@ export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): loadEnemyAssets.push(enemyPokemon.loadAssets()); - console.log(`Pokemon: ${enemyPokemon.name}`, `Species ID: ${enemyPokemon.species.speciesId}`, `Stats: ${enemyPokemon.stats}`, `Ability: ${enemyPokemon.getAbility().name}`, `Passive Ability: ${enemyPokemon.getPassiveAbility().name}`); + const stats: string[] = [ + `HP: ${enemyPokemon.stats[0]} (${enemyPokemon.ivs[0]})`, + ` Atk: ${enemyPokemon.stats[1]} (${enemyPokemon.ivs[1]})`, + ` Def: ${enemyPokemon.stats[2]} (${enemyPokemon.ivs[2]})`, + ` Spatk: ${enemyPokemon.stats[3]} (${enemyPokemon.ivs[3]})`, + ` Spdef: ${enemyPokemon.stats[4]} (${enemyPokemon.ivs[4]})`, + ` Spd: ${enemyPokemon.stats[5]} (${enemyPokemon.ivs[5]})`, + ]; + const moveset: string[] = []; + enemyPokemon.getMoveset().forEach((move) => { + moveset.push(move!.getName()); // TODO: remove `!` after moveset-null removal PR + }); + + console.log( + `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, + `| Species ID: ${enemyPokemon.species.speciesId}`, + `| Nature: ${getNatureName(enemyPokemon.nature, true, true, true)}`, + ); + console.log(`Stats (IVs): ${stats}`); + console.log( + `Ability: ${enemyPokemon.getAbility().name}`, + `| Passive Ability${enemyPokemon.hasPassive() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, + `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}` + ); + console.log("Moveset:", moveset); }); globalScene.pushPhase(new MysteryEncounterBattlePhase(partyConfig.disableSwitch)); diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index b868c3f8952..9485e77e5aa 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -167,7 +167,7 @@ export class EncounterPhase extends BattlePhase { ]; const moveset: string[] = []; enemyPokemon.getMoveset().forEach((move) => { - moveset.push(move!.getName()); + moveset.push(move!.getName()); // TODO: remove `!` after moveset-null removal PR }); console.log( From 9d03004dd34e629d94cea0b86b50f08ab50834cd Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:17:37 -0800 Subject: [PATCH 22/83] [Test] Fix import in `create-test` script (#5403) --- create-test-boilerplate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index 04e1a29cb5f..1ea61e0dc48 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -108,7 +108,7 @@ async function runInteractive() { const content = `import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; From 1c192d434b4547543dd75b2066c2401be353d10d Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:44:41 +0100 Subject: [PATCH 23/83] [Sprite] 666-Vivillion back exp change and scuff fix (#5382) * [Sprite] Vivillion back exp change and scuff fix scuff is the incorrect labeling in the exp-sprite.json. fully updated meadow pattern. all incorrect labeled back sprites are no more a thing. * fix the last issues with Shiny exp backs * Last adjustment for the future variant Pr added 1 color --- public/exp-sprites.json | 58 +- public/images/pokemon/666-continental.png | Bin 948 -> 982 bytes public/images/pokemon/666-fancy.png | Bin 1069 -> 1111 bytes public/images/pokemon/666-river.png | Bin 952 -> 1005 bytes public/images/pokemon/back/666-fancy.png | Bin 994 -> 1035 bytes public/images/pokemon/back/666-river.png | Bin 906 -> 953 bytes public/images/pokemon/exp/666-fancy.png | Bin 6381 -> 7162 bytes public/images/pokemon/exp/666-meadow.json | 863 +++++++++++------- public/images/pokemon/exp/666-meadow.png | Bin 5195 -> 5634 bytes public/images/pokemon/exp/666-poke-ball.png | Bin 6270 -> 7178 bytes public/images/pokemon/exp/666-river.png | Bin 6155 -> 7043 bytes .../pokemon/exp/back/666-archipelago.json | 221 ++--- .../pokemon/exp/back/666-archipelago.png | Bin 2861 -> 2776 bytes .../pokemon/exp/back/666-continental.json | 221 ++--- .../pokemon/exp/back/666-continental.png | Bin 3067 -> 2795 bytes .../images/pokemon/exp/back/666-elegant.json | 221 ++--- .../images/pokemon/exp/back/666-elegant.png | Bin 2775 -> 2799 bytes public/images/pokemon/exp/back/666-fancy.json | 221 ++--- public/images/pokemon/exp/back/666-fancy.png | Bin 3284 -> 2977 bytes .../images/pokemon/exp/back/666-garden.json | 221 ++--- public/images/pokemon/exp/back/666-garden.png | Bin 2534 -> 2753 bytes .../pokemon/exp/back/666-high-plains.json | 221 ++--- .../pokemon/exp/back/666-high-plains.png | Bin 3287 -> 2810 bytes .../images/pokemon/exp/back/666-icy-snow.json | 221 ++--- .../images/pokemon/exp/back/666-icy-snow.png | Bin 2613 -> 2769 bytes .../images/pokemon/exp/back/666-jungle.json | 221 ++--- public/images/pokemon/exp/back/666-jungle.png | Bin 2873 -> 2764 bytes .../images/pokemon/exp/back/666-marine.json | 221 ++--- public/images/pokemon/exp/back/666-marine.png | Bin 2654 -> 7088 bytes .../images/pokemon/exp/back/666-meadow.json | 640 +++---------- public/images/pokemon/exp/back/666-meadow.png | Bin 4909 -> 2869 bytes .../images/pokemon/exp/back/666-modern.json | 221 ++--- public/images/pokemon/exp/back/666-modern.png | Bin 3013 -> 2755 bytes .../images/pokemon/exp/back/666-monsoon.json | 221 ++--- .../images/pokemon/exp/back/666-monsoon.png | Bin 3169 -> 2768 bytes public/images/pokemon/exp/back/666-ocean.json | 221 ++--- public/images/pokemon/exp/back/666-ocean.png | Bin 2784 -> 2894 bytes .../pokemon/exp/back/666-poke-ball.json | 221 ++--- .../images/pokemon/exp/back/666-poke-ball.png | Bin 3532 -> 2983 bytes public/images/pokemon/exp/back/666-polar.json | 221 ++--- public/images/pokemon/exp/back/666-polar.png | Bin 2584 -> 2766 bytes public/images/pokemon/exp/back/666-river.json | 221 ++--- public/images/pokemon/exp/back/666-river.png | Bin 2696 -> 2805 bytes .../pokemon/exp/back/666-sandstorm.json | 221 ++--- .../images/pokemon/exp/back/666-sandstorm.png | Bin 2866 -> 2821 bytes .../images/pokemon/exp/back/666-savanna.json | 221 ++--- .../images/pokemon/exp/back/666-savanna.png | Bin 3302 -> 2850 bytes public/images/pokemon/exp/back/666-sun.json | 221 ++--- public/images/pokemon/exp/back/666-sun.png | Bin 3541 -> 2859 bytes .../images/pokemon/exp/back/666-tundra.json | 221 ++--- public/images/pokemon/exp/back/666-tundra.png | Bin 2813 -> 2777 bytes .../exp/back/shiny/666-archipelago.json | 221 ++--- .../exp/back/shiny/666-archipelago.png | Bin 3018 -> 2776 bytes .../exp/back/shiny/666-continental.json | 221 ++--- .../exp/back/shiny/666-continental.png | Bin 3174 -> 2795 bytes .../pokemon/exp/back/shiny/666-elegant.json | 221 ++--- .../pokemon/exp/back/shiny/666-elegant.png | Bin 2960 -> 2799 bytes .../pokemon/exp/back/shiny/666-fancy.json | 221 ++--- .../pokemon/exp/back/shiny/666-fancy.png | Bin 3067 -> 2967 bytes .../pokemon/exp/back/shiny/666-garden.json | 221 ++--- .../pokemon/exp/back/shiny/666-garden.png | Bin 2688 -> 2753 bytes .../exp/back/shiny/666-high-plains.json | 221 ++--- .../exp/back/shiny/666-high-plains.png | Bin 3203 -> 2803 bytes .../pokemon/exp/back/shiny/666-icy-snow.json | 221 ++--- .../pokemon/exp/back/shiny/666-icy-snow.png | Bin 2803 -> 2769 bytes .../pokemon/exp/back/shiny/666-jungle.json | 221 ++--- .../pokemon/exp/back/shiny/666-jungle.png | Bin 2856 -> 2764 bytes .../pokemon/exp/back/shiny/666-marine.json | 221 ++--- .../pokemon/exp/back/shiny/666-marine.png | Bin 2808 -> 2810 bytes .../pokemon/exp/back/shiny/666-meadow.json | 641 +++---------- .../pokemon/exp/back/shiny/666-meadow.png | Bin 4941 -> 2869 bytes .../pokemon/exp/back/shiny/666-modern.json | 221 ++--- .../pokemon/exp/back/shiny/666-modern.png | Bin 2794 -> 2755 bytes .../pokemon/exp/back/shiny/666-monsoon.json | 221 ++--- .../pokemon/exp/back/shiny/666-monsoon.png | Bin 3127 -> 2768 bytes .../pokemon/exp/back/shiny/666-ocean.json | 221 ++--- .../pokemon/exp/back/shiny/666-ocean.png | Bin 2749 -> 2894 bytes .../pokemon/exp/back/shiny/666-poke-ball.json | 221 ++--- .../pokemon/exp/back/shiny/666-poke-ball.png | Bin 3495 -> 2983 bytes .../pokemon/exp/back/shiny/666-polar.json | 221 ++--- .../pokemon/exp/back/shiny/666-polar.png | Bin 2794 -> 2766 bytes .../pokemon/exp/back/shiny/666-savanna.json | 221 ++--- .../pokemon/exp/back/shiny/666-savanna.png | Bin 3165 -> 2850 bytes .../pokemon/exp/back/shiny/666-sun.json | 221 ++--- .../images/pokemon/exp/back/shiny/666-sun.png | Bin 3365 -> 2859 bytes .../pokemon/exp/back/shiny/666-tundra.json | 221 ++--- .../pokemon/exp/back/shiny/666-tundra.png | Bin 2984 -> 2777 bytes 87 files changed, 5062 insertions(+), 5096 deletions(-) diff --git a/public/exp-sprites.json b/public/exp-sprites.json index a340d02a65a..c3b79d0cb38 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -261,10 +261,10 @@ "666-fancy", "666-garden", "666-garden", - "666-high", - "666-high", - "666-icy", - "666-icy", + "666-high-plains", + "666-high-plains", + "666-icy-snow", + "666-icy-snow", "666-jungle", "666-jungle", "666-marine", @@ -277,8 +277,8 @@ "666-monsoon", "666-ocean", "666-ocean", - "666-poke", - "666-poke", + "666-poke-ball", + "666-poke-ball", "666-polar", "666-polar", "666-river", @@ -1379,10 +1379,10 @@ "666b-fancy", "666b-garden", "666b-garden", - "666b-high", - "666b-high", - "666b-icy", - "666b-icy", + "666b-high-plains", + "666b-high-plains", + "666b-icy-snow", + "666b-icy-snow", "666b-jungle", "666b-jungle", "666b-marine", @@ -1395,8 +1395,8 @@ "666b-monsoon", "666b-ocean", "666b-ocean", - "666b-poke", - "666b-poke", + "666b-poke-ball", + "666b-poke-ball", "666b-polar", "666b-polar", "666b-river", @@ -2499,10 +2499,10 @@ "666sb-fancy", "666sb-garden", "666sb-garden", - "666sb-high", - "666sb-high", - "666sb-icy", - "666sb-icy", + "666sb-high-plains", + "666sb-high-plains", + "666sb-icy-snow", + "666sb-icy-snow", "666sb-jungle", "666sb-jungle", "666sb-marine", @@ -2515,8 +2515,8 @@ "666sb-monsoon", "666sb-ocean", "666sb-ocean", - "666sb-poke", - "666sb-poke", + "666sb-poke-ball", + "666sb-poke-ball", "666sb-polar", "666sb-polar", "666sb-river", @@ -3624,10 +3624,10 @@ "666s-fancy", "666s-garden", "666s-garden", - "666s-high", - "666s-high", - "666s-icy", - "666s-icy", + "666s-high-plains", + "666s-high-plains", + "666s-icy-snow", + "666s-icy-snow", "666s-jungle", "666s-jungle", "666s-marine", @@ -3640,8 +3640,8 @@ "666s-monsoon", "666s-ocean", "666s-ocean", - "666s-poke", - "666s-poke", + "666s-poke-ball", + "666s-poke-ball", "666s-polar", "666s-polar", "666s-river", @@ -4551,7 +4551,7 @@ "666-fancy_3", "666-garden", "666-high", - "666-icy", + "666-icy-snow", "666-jungle", "666-marine", "666-meadow_2", @@ -4841,10 +4841,10 @@ "666b-high", "666b-high", "666b-high", - "666b-icy", - "666b-icy", - "666b-icy", - "666b-icy", + "666b-icy-snow", + "666b-icy-snow", + "666b-icy-snow", + "666b-icy-snow", "666b-jungle_2", "666b-jungle_2", "666b-jungle_3", diff --git a/public/images/pokemon/666-continental.png b/public/images/pokemon/666-continental.png index 1bd15dbb70db5166998f29f3c36a737414ef5959..b45f5c4e76d1dc94eaba1a58d446005feafe4c23 100644 GIT binary patch delta 927 zcmV;Q17Q5L2i6CWBq0HFQb$4nuFf3k0000pP)t-s0000G5D+jhFi=WLRZ~-uH6(vL zj7rY{000qmQchC<|NsC0|NsC0|NsC0|NsC05EVe70009tNkl39nnTDZrddE=0p3_wM14#rmg#OW{8^;Yq z8eP|MAaXj5!kM6HVACuJaa}mhiLNZ_5DkLbDoPN-;fZj5oY**_$U_{VLS7$f6eS{p z_nrtpAR0zAuGaWKmLlOj8$A*Y?-}u-LUis`VnPfQ$Pb1PjL@Y*ppwKO1fPFTZpu?v zkQ_!DBO6d(gBBtPk*sawi4sRbU_wNs3M3ko22~;xb3+NuWi%M(dJGwvg`snL9j4(k zGBJeE1rB-hF_I0h+2lZ=CtL_b$O_YSG!8L*9Y}Aukcv#2VZ@cGkZkmX7SlL5L=M(v zqY9%ZBGMbF(rF;@HH>H=6>5J<*Vc%EPzBe`!U)p87{XN5+yh}<>9ZhOgrhDSm14** zu0e2JR{pTk6O=taPlK`1`Q)l$)>0NUfQeBlu+{|)pfM7n_oD(!jscg1G(a)rIjRDQ z3P?{OcK%VOwFT5b+h7H#t7ajEs8Og>>5`EGG@y>W zVFUvEf@&}@B}y1pAh_4XBDyfF8KGqM_xsI)n-O&wCc+9Ev@tB=8i*0$=SkL;GLbhY zXAt8nNI_`-#dLN-RE;}55yMMNR2WIkXn5T9(nJu?jM>W$a4=_V3(3s0u+ZE4K$I)pkC=9LRqMeunk$6Ga|Aw47^?| z#O3Y`3(?gr#_L7M>ywO<&`pDh&qs|!q)-wuF;X(r7C!VI1_V`xC_K*8NP*CU=45H< zL6R4`8o6YL&r(SS*YnC!Pd@eKrLYj(dEB#oGE|>79~*My)`oK`Gb06(4Ee*MM{apG zw&pCJ1tOD@jC5S)Rn5qB!;qm1%&XJ<(-4K9M4k~r&c-;4@Rg{LttAxM?hrN7Z*C~U zcR~@g3`M>kVx?(RtZz8(2~}IO=KeP&f7ABy_yamdXkl&=KK%dy002ovPDHLkV1gic BnBM>Z delta 893 zcmV-@1A_e42eb!}BoQ!BOjJbx000mW5HK(>P)bUXMI?Xl&4RiB0004WQchCx65*%HCX~IIdFOx5QR- zozrv?<_LeP2>sLsfPDgyO4qgTh}@k<;hvyrU{mcB;=1sj6CGL9TQmr2tti2H?tusw z?um^FMZU#;R>=D!m7+w%8A2c;+z<^T8dqz4AWM-5fsG!CMhJ|AvqCiYDls7j3KVXJ z5RA~FLZFhwAOxMn!Ko`q4kO(o8&DrlEy&G+^xA(m97-GsfdLVbDv)SUH|Ps8F*cOY zzT6Fl`2?OB8HJ%ay>`qukP20$V{61f0Fkea!Z@XUF@&iu za|?fjb*0aOXb}z(H!8)DKU{<0x~%+Rr6;KOJfCjH#`Cng&05NW1~4!x1=hNt0W?NJ z^n6rc$uZ!PkOnA*%%duhsDQK-!t+;2YYV7>w!sQeQ|*NmqV7W7m98^Vz$2zGI1rE5 zH8SE{?gP01(Jz_}7W~M_VHkmcUr-GO{BwU8Rv_r>Vi8>!Rz?uL|M~f0!HtMI3=?66 z4TpG*!)Tt)J;L)z#?^b&=Yc`oUqK3j=wf%gAgacdo(Qns&q-k)~qqD5-?u zj{!hD()dOL{CdmCaU9za*|y^-^9(#6))o6~urWZmGugNR(0kxrfZ}j>1L4u2R%w4D zLK&!zunifRBO)>~47}ef#NqA?3(?Un#`{gk`;&~)p-F>@&qocYW?oGUjMN#b3!l#i zfS}3{h3_*oQXn+ZoD40%OJ3-pnPZz49F0q?fIPC)l6QT1DXbStemIQ`y`B~y8?xp0 zYkq8`K$0O34&8Fg+}O5$_pt(zq$FV@ZI^jeGcsH-Wat3%=rlhXqVP!Mj0kcx#!-Z? zM1^cEp~yBv)JVU$p$Pc&n+=l!F9Z3yi8VVbD=@e+_kWI9*WN9s|F`g$y06zS|HNQR TIqGlt00000NkvXXu0mjf;wP6Z diff --git a/public/images/pokemon/666-fancy.png b/public/images/pokemon/666-fancy.png index ec5e8a5f6e871f80d59fe6dbdc5ac71564367e99..9e40deb3568d4da2579ce7060b37cdf3a041d5dc 100644 GIT binary patch delta 1041 zcmV+s1n&E-2-gUZBn|;{Qb$4nuFf3k0000pktH;L>eA!!R5K6&000qmQchC<|NsC0 z|NsC0|NsC0|NsC05EVe7000BENklFG|NqxsUc3}r?~d7V zb|iiVi0JO)@lOrl&Z+N&bH^(tr+yKqE8u+UC-Hv<_z5A1zl(tPes)W6)Nv1CVutWo zZW<7Of)LaBxQ7ry$km*Z5q=|LY*%x-ZQ-{89JOuRbQ!6WdVe7tr48U%+H_*Ofk;qF z+lCl;G<`6QB%mPM!N4KR3y~7?q>OXIGa4A-TMP(llu1+>LO4$NfN&brkoyPZ`IaD) zxVZQ}PDdU3BGEL$CPwmu@rEiXL5S0-8!D}T7=mnlrRm(O#PumF;&fsB(GY^VlXSL0 zb`lp?=9qow(0%Wbnugt@RV(yICURzi5I*b&gUY-btw^9Fa%Lh6v8VljsNr`>&}|ev zH-zv)q-4Zs?ADyb!kowwD9cBoab~27To|0MPulhvTO!pE-M2(wN?0C|+rfz1$7ip9 z4C?T0K4wOYyBZa#MkR9AWs%u98GJ@2#Cwfaqf0}_D2Oh=%&>(i;ZTh(4MBWwATw5A5Ns8y3Ig0Qaivmo|_B2)r&2`^4FBJEA+D#6#_x~%-e zN>5~+glG#q7%66&muleJ+JYTHQ7+Se#b+b(3GTN*So?+pK<#LhMA)bbEHwvQ3gYT5 z)Zmp-qApCm6%lf!5Rrey+~p`n&>F+J!O=jM>L{cU)eF2m91KHrqq6CsyO%ULkvPn1 zF|@?2mf4`KtRZwJE;<`5#DfvU@Ld`O2@Qd`pc;!jl;KU^VL(tb_`A}TVxAi% z5#Ie1uPPOie9%D=crvi&aj`B|$@GOtfWGYHqtJw;7k^2k4925OD>XKFWXnyB2>du) z8)Y!)6_FQ*Zn;&E2QJ_xVTtJG`cb27mr~vZ`I3evVg$9}kA@EUN?0N?@z=(8qN@=? z#xS@`49Ib(Yr=Oz5u6!{eBH!as427maNHBR*lExG|CIbq?BnqV65UylEUane00000 LNkvXXu0mjfp4smO delta 999 zcmV2of3}$BHF%Q|J4AVeDs-c4!(c%jkufv?pKHse=~sG zES?d9#{|*rlHj-l9uqS}#`4er@0FO&$1{WpM%=yO;hC}D&FQ}T?*@NJ)V}Z2W#mro z{f0=CHGp$z1Hk?O(V!Uj9ns5ZU>u1@MfQ_{Ll`L$Bg&+Vb0Rb91(8b(2wGH@fJg}^ z37-&2gBwc!fV?*i%90e9T*uj{eP1M&hTqkQG#DFH$p}WAP2Esw#ZYALE6wKKB&knb z5oZfSXG00@j@sD<*-3v=TuEY%Lqd+Vy#=@LP8mP<1pGFt zN;p)bOG6Rr4dlk5e9Q(ZQ4-+}=^N6JDIr5bz}(E>7OZMgMG)4N{}#laFoa705oK|j z5n@Dim5_6AT~_%Mr6-b2LdXj|7%?R0s2aGowqQqaluLZ_)d=!|^yffW`-TI+?QE1p z#Hb1^H3wV@;_81T%#f8aqApCm6cc);5<&jO)a9s#w;IE_A<=*VZ4}y=>IK;zPDVy- zqsr3}5K9`8NEl|d7*=Armc=0Q4FSZk*ldUpPKH;5x-<&n8vWPvF zwL~!V?L;IKMx!Dv7pa+_pC1w2WgtY==$>d-gq0+QL!5t(<3d~!sVBP^1L~WTyBI87 zUO^gy=<;xaBKa1wRt%WEpRBT)gE2$S#{134dn<;drq9Ah1|vdjn;FpUEcz(S#EoGHMHdrn+Xlc;GvvL} zm13S7B@rTWQC1b;r7v_)1epx1dEBf^u4Ign0ejf#OJNqGo%|t!1nv?K>M51!mtVKW<{f&MFGr^gR2WBgf8n%g4Vh{3iDG`UmG` VS%OXE0($@e002ovPDHLkV1h^5%{%}A diff --git a/public/images/pokemon/666-river.png b/public/images/pokemon/666-river.png index eeabeecb0699cc4a67635e4e7bbf513f12a919c7..ca93fd612b7645b262d7890d24a6c33bf173d4bf 100644 GIT binary patch delta 935 zcmV;Y16cgH2ki%tBn|;{Qb$4nuFf3k0000vktH;LV@)8^sA5V%ED8R!DF6Tf6LeBe zQvm<}|NsC0|NsC0|NsC0|NsC0K0n+o0009+Nkl&)U?GAqF&S3`2~pt4uo=RW5eEnB*M9gW@86a zIUIL}!f;R}CXBo$L`)MQVO=xC$taaz4N?purjQ}vxfPLh&5-%SgH!_S3@4GTj-lr$KXn4p#$PCv5k{+JKQDoJ5L<$g`qtnF00_ zZ?l)ggAozPi2X_=#2R@bSED4VhD93Es2jU~FfK$yY6c_FK-7&hkr`&$LwvW1~rh&HTGhDn1T2Sdp4%m}e{N{K+3M#{q&4g-hcr#9+3=92`QWEr_Yh(t7-Scia zV{kV>#V`siHrx%6j0}ki3@HaUMC1a9!TZP>q5xmX#74hzS+77!qcq+t?i##QX2F4! z_v`z?D3CWUGT_}~8kERJOMheNUM`J)6k-7cL%Z?$)9GxCh^kL|G%kl2Rrp)ixqcjxz%$7vA897z*!TL*xI63sCDUVnkO6AI zwzx!$eT?oF>AF4{c(aW@aK~#kGUEmTr-mT-)NDX+0nEb}1RAc2SYyPi;)}@fLXCME zbpsQRMnC#djd@;xCxS|!88w8Bh~RDK8Ik!T24&%YXZU`^Gn5#Sz*cXG8zW8z$HE8C zVSvyKW5irer$4V_HKx8fj! zU%7o2H0sXKL^_uUHF89CR z!Xo9v4X5x-2;ypnAdfGxbEqn{zi_k(W^A>m{VyfI8T)$u1M4?lTa*b7QSkr(002ov JPDHLkV1hRhv~mCd delta 881 zcmV-%1CIRd2e=22BmppyGBkgj%Vd850004WQchC#bB_g_4 ztgbL1f2Z4AHSuCZ1PXuRdJ+lAjWUp@Q4>ugM+U-Z8<%@A9z;Z1h9EFNw2eEE+9-P2 z3aJdOq{SAIWI)^{Aqlo*E5nu$FIbn1EDYHW8KK<^BgEP*1p;*#DUQrQD%6$Ut=a|? zG!SawHVcDyL&}C22U<~sN`xgbj3Degy%xShJtg6Ah#08chWvk1&M@xF&M#JKf;YOA z!l06`dED=^UIZ4SzTX zbg7O)3Q^7-{>7*ePm>HMVhn==IeF?khOOn=IH=}aG#f0OV!Va%K)i=@K{XgSzlZV2 z2sfU2L2~nq`DcF^O@x%6pC1-n+2ps)Kf|~YUn*?4Quq2n*&qz@TMCoclgulPM4p^n zZg?f0k06NNnh~81=M+R$+v(AO*7G?j@~MkBuPYJG;i+$FBm19}MW$&^1|ppNw(n@!D2xsQXoezy=LviYP#k}*BFI4aW~_8oJcv*xYAwTP z8-N&%d3CE9-tQm-A!RO%79vJO=(gSy;x9Eg3img|&8xpIH6lT^E+;xh91QgZc^W3j z!@8zin9?<}K-|o;3h^(BO0+6MV$L#*kC5Pl@vDQ$eoMA zy?TZPGGS#R%qS6!qC;39IAumWE(_u%3=QO-;NnZeC=oMaNW+-E5*ad;gd)=jkt6ly zhFidI-`OxK@M$2ghgfm4vI3o!vEMnYZ~L?y{%zqeeLtUHhRa=SIYQ5c00000NkvXX Hu0mjf_TPg0 diff --git a/public/images/pokemon/back/666-fancy.png b/public/images/pokemon/back/666-fancy.png index 35ed4317d8e9b2fae2fdeec76277277598cdf15f..b56daf08a527082a6ac159b88c0e6d9f9f7193a5 100644 GIT binary patch delta 968 zcmV;(12_EQ2a5=hBn|;{Qb$4nuFf3k0000mktH#I>eAyVwV00V7FL_t(og{9XG)0-d+0N{qghDGrI|J&t*KoGR{#@*bt z!qWr-`o3Ph0lfaVf%iWm(~lzYBQpOe8^0j1=*~!Zj;sv&GK9wngiGQn0@(8+l@MZl zgrG5h=OS~8#3MwAbs*`P0dZ{*k`f{*eMNwJEyBQ-w0%L4h;uKXOrmos<@^Pk#lqY?W~gZG_~QcF!ogC#H- z{-K_X8auT_7oSQgtzJh2E40Ph0vU)s^VJtZN-@KA?&`#gq5ICHf<$H{Fmhp(l02uq zhqJK>K}b+zLV&;Zdu`QdVQiZaIn$?$K%fzMVQkb|918?`7(tU>7=1nh_PjEvxBS+B zwlsDzcJAAeYBYk39S6*YOp_87X@OJ&zoaFkCLk20tB2 z83K{}pkXi)sv$RI{Fd=QFGeXN@>g0Xid5v*a5b=PGBssHjG?7Rhf!jtlyLH2{swBpip{wkZ~Lr zZ;n8jQl%P0pE0ys2Mn+31i{f*r#O;J&`S6rf1?063WKn$G3~QnV zBG+6Mel?UwoV-x#Zn!b1kYh)(9Jpx6N9+);Q>iCW)U7K@J#Q%*A%eR}MFVLB6~3O8 zVjOaW-h|PRiIAHIZ4*JR2~#5%1~1!f7!xvfgrk+$9ij6o?fi$dIp9u^~DdekLOpF>-Q&m=SeNP>x!!ZM2^}h%pP{ zjZPc~4?Ye?YAZDx4W56XWaNiNGG-jyG9NJ4T6?|D2&C9!?SV|hQRIk~ky_nwm`bA= zcHOyDh$wC zPJuuRgZ|p8%mz0#DL8YU+$Q z!%B}4455_$YV3O@rY;c|1{u_ghpY|m=^1oJ|C&4SkX;Qyq9VIrVFB@5Gvp#FhN7Q z(UG_?bR-#WRg_4c7zQh~t`w+q*+>-Luo-E}fsZx`Em_ z44qPZBJ_r4M%xTrSwhQ&LK?*K@gCYW*Ew5#F4;6hFVDZ1g3p&zM3yicX=M9D5)RoZ^b(I^qa zLn;kncLxhGtW+!(TKk6~Ppxg*qGUg7x#DGUX!?@n(B z+san&mS947@zyEIVxNL0ynBOQ?{x59_}bpKe31{TEj?4_YcpR4zIF`g! z1XARGVk(!BWQ=o>nqEbO_){W0lXXomA!JNy3aK5(H3X(nKr`9Bzl7wmpxNwPi#@d| z0=_elLwr*ZCXkF>N`etgZwL(nF%sfaa7A=QDuOWzBE2Cz|20I6Ob`MMk=nlF!T&`? zq&GZ!1B;4kbSPbvw)MyRd`$V9mvFB*C1~n#PnJDJR4{qsZiV}lP2-Jyx z^JBv|s6VEb{)E_6Rm%rI(m*a~2qhwe8-v=g%)T|6RpoA@F)|eaI{eIYDiO?>3 zvEtzuJPQQRjCYA}Tq?*fm6R{OrbLr}$az}jrJ)BLvtf*36FK+&oCL!xQA=2ae=g5H z)c4ap2ZDZzB<8dRoh;nf1Lfh%&N$B$(i8H7mJK}&LdgR`=OWJ;1)WKly`zAhCHMQb znW-SAWkEr=1HyTm__)P{QV%(iu5Z)MnifBdB z<06I<$r#F6j3$vSRDui)+Xo|+(=~~NkV}${Ehs_84CxITbSnfIDX~H<4TFRr(;?#N zACDhEnn<{Agiva-ZRw4SmQrdF%2eJIgb;5F3-VeAQqJ%$jhcur1R?xtNT*V}dlF4s}`AX;{Rq4CmfeqeEOr zFybx{wXW3q4=s0%$Vb_PP{V&FiZVH;K!s~x(DRdSWq;Kc_U-l`$;euX1)_nH00000 LNkvXXu0mjfgSd|} delta 838 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 M5SH+d=UpEDAD$SgS^xk5 diff --git a/public/images/pokemon/exp/666-meadow.json b/public/images/pokemon/exp/666-meadow.json index ee4f6d31bc0..77158992e59 100644 --- a/public/images/pokemon/exp/666-meadow.json +++ b/public/images/pokemon/exp/666-meadow.json @@ -1,314 +1,551 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 243, - "h": 243 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 84, - "h": 88 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 77, - "h": 89 - }, - "frame": { - "x": 0, - "y": 88, - "w": 77, - "h": 89 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 77, - "h": 89 - }, - "frame": { - "x": 0, - "y": 88, - "w": 77, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 69, - "h": 89 - }, - "frame": { - "x": 77, - "y": 88, - "w": 69, - "h": 89 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 69, - "h": 89 - }, - "frame": { - "x": 77, - "y": 88, - "w": 69, - "h": 89 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 62, - "h": 87 - }, - "frame": { - "x": 84, - "y": 0, - "w": 62, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 62, - "h": 87 - }, - "frame": { - "x": 84, - "y": 0, - "w": 62, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 13, - "y": 2, - "w": 56, - "h": 86 - }, - "frame": { - "x": 146, - "y": 0, - "w": 56, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 13, - "y": 2, - "w": 56, - "h": 86 - }, - "frame": { - "x": 146, - "y": 0, - "w": 56, - "h": 86 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 41, - "h": 85 - }, - "frame": { - "x": 202, - "y": 0, - "w": 41, - "h": 85 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 51, - "h": 86 - }, - "frame": { - "x": 146, - "y": 86, - "w": 51, - "h": 86 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 51, - "h": 86 - }, - "frame": { - "x": 146, - "y": 86, - "w": 51, - "h": 86 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 46, - "h": 86 - }, - "frame": { - "x": 197, - "y": 86, - "w": 46, - "h": 86 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 46, - "h": 86 - }, - "frame": { - "x": 197, - "y": 86, - "w": 46, - "h": 86 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223ce33721ef8da9ff40286099c20de4:b82acd304c2a8b8cebeda2043a3e1f96:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 2, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 278, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 53, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 104, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 71, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 20, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 155, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 140, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 206, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 209, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 257, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 278, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 308, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 2, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 53, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 71, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 104, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 140, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 20, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 2, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 209, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 53, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 278, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 104, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-meadow.png", + "format": "I8", + "size": { "w": 398, "h": 347 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/666-meadow.png b/public/images/pokemon/exp/666-meadow.png index 3f9f758ad1f4bc4cb5084167f39a2be12a475e4a..6912a8d81740b6ecbb74f1fe451fc11ae3235807 100644 GIT binary patch literal 5634 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 FV1l9R6bt|W diff --git a/public/images/pokemon/exp/666-poke-ball.png b/public/images/pokemon/exp/666-poke-ball.png index e33fe6e8c5a091dad51a0d57d62cbb9bfd7c0dfe..58cae8e2aaac62b691b79d25432136ce2bbd9667 100644 GIT binary patch literal 7178 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

(Ou8 zj|&q(fsabXZ!OluM#C}UayEIofEGqiG`l9~u;w+f&xq;wBjPU}Jq0FexFuUqToLCQ zxK1T`bmoQzph`lpnGt9EFud06Ph{3gQNz)LKl!wW{zddhUu z!}QN_gpP6Jy{WJnZ^?)p0c%lAkonI~?yu^Zx`qTAnr7@dO&d-i7m=e>Sjv=?3i-Lt zj)o4t*^L>=%}-4N=yM8?RX6B8-gID~9L_ z=?d0)2P^dtW@g^yLe2vfdK#SN^SkDL7u9z;Q+xwDiVoB<4vCIuXE6r&V{8RLGh`Jc zhyGP$W14A36IuG7Rf9&*k}!o_(BkXPLIcF}cTf#=9ob^?QxlFE)7?lPmGtS^IYMs< z4cQrwGVQxwE=-IaqPq?%=nMN-=CyvPmydsu^#jJ@+?({r?L`w-sJ1`h8@9;MyKE*v zxq(p_D3mv7!~xX7BG8DfNM_^L98204PtLXLC4s4@#7l`H0NU)IDQVgHosCXMeejnt z&b17!|B4AW0%YBc8?De?IhUTOye*V^g6ELo6-r9+6d0diTF{Xlw*t_%f)VbdLLYK_ z`+vS$kr?oIK~|Q+!|<~74HSXw>Bf?%$?()_W*1;&`|C?Yd{U&4WUH{mmRS@O@fx5T zf|X%`xzIhmIJPcTS<2nyM8~T9USZ_%X^NvxLWDeWW)??--{5lxAGNM{ftzBN?km!E z83;5mn6ZBQp{m}F-AuZO-D#4c2qHsgUT8n%U`H#(ek+otG@)_)60alpk*F_5{OV65 zv$S`! z)93Z~PQ;sn`)^pUeV`HI>q_C^C3M>ZMqg+?rMpRs4i!bca4bzYIAabAedFv1Fb4)4l+5z(AdO#W)*YsLIvL$&yp45i8o zF0Iw#qH(PuCd*QLmk)d-o=f~+hSx@~JL?B^0?RJ=#=2j4cxnMB%Ayk;BY8W*;6yTt zczLNCdrRWE9$VLJ5&}*v{OoeHV`!TDwHwRi4zD2@fRE1V`u~2EziNh!I8L9P&A1MX zg#+=NUj%vK?u-32VKk9?9V*Y$#TWhiF2jD9R0rvcYUD*Es@;g+fuOr(&TNpOBybBQly`mmm?M~0nPn!AczT?T7(hJj7TCSc`a{$}A$+wp!Vg3I_g-jS#X-W_p*|hg8W{MDQK^n@)n~v{L59K$ zhw}q7l;bf&tbZb~mWSa`M2`c;4Z@QVMrVu?f`2;W(=_2+i=#y?ZtOD%oJr%wi$9&I zJc$-hiQYTt-nRbB z&ib!0I_hHob&Z7w+~~io?VPefW3=@N%RUNXN-l_ykbIlDm$aYbY2VQA= zWt8Lo^G)e`8>;L$gLz1Usq$3)c4@r7TY*1MNA9&Xr&YEb%f*F**>p(T+hm$>_KK}F zlYE;Bzu(wgrl{WP|Enq07cRs>=O~>y(~0G%*qSoQt=PKS%ggL?C^GKN(tKHf%mjJJ zPwv)}YV8fJ5kj_np*PHK?57`goL-$Fh(Nh7_*P(Yi&MSe@*L!@`Xlc}bnYXUIFV_W z3*tQO^^ZJMYd^3x8>3ky!fn~O8xou~uOeHVLwHjzF>lp8n<&SGoQ{$NS@SJN5<) z7#D$To(=7v=Io_5epNceO%@PG92mOtN@4{=ieSeQ;m!d0DnUSoB5xkDQlVMhnSZVq zG-7F$;M5%jkZKbXN`)1GzOH=Z_JafsVzZGQA(4~c0@1cK}m z6Ut|w)!Bm3fAwj*fV5+VuHhrhL-;#v7QR!}7`tW%={E&JGKo~RD_yEd>_dVf;^&)= zffitAQaE9dp}dH5hkoS$X3=Hx+e%OE^jOKqB0P?W-*q`<;&| zts!b}#So?F|KrG&8L7aMxQ?{Vydf^ykU=Bpn4&CrD+aH6X^4MWlT z6+cbBBG}YDNi*e3(=f1wJ-6u~F2PSZPOdmZ5;QK0}i#{7T)%N^^{}tzpmU#o+3(s8Zpr?s})RKVU w49K{Ts`mp;+2#?v4SzAfold|2OJ5|%gWZ~{KYJ+Pg&as1W}y91)8WPc0G*f!z5oCK literal 6270 zcmYjWdpy(s_aCWP!$xw+C6bhT)M74`Ek)*+^YhAHP5Le!X^{&vRbqecsP=_IN+`)D&&N3l;-|Kp@_$SCHl) z5QiQ6!@Uo%xW&05fkoBynk5QYp-`x*s;a4>p{=bg*8G^ax7#Ce@gxa}j~`P?6cuSS zT1&P|pOMj2NXW*<1}sjp81UinGe=v1E{rp7gFwPNSCJPj1AAusqXV)_`3^XbzWC9S zTe;VZez4E!;)@vRj|D9~>R9-en!t(h4+9YW(04N&ZO6S~oxHW@FU5VkoL2MpL5R)I z<4aBlTT#%VvEgy(@ zK5)>{`Aj|6dCk#CaJF0Z@wzD#T|r>$O6u}pX1k*bEcNCKn4Ggsia{)e8a0j(aPZ{T z;hGRNS@ly>R=`gcTKoM$8)!G)Ul5pt30eKb8wgC?lTO8lHn)~)rykoYJiE}&zgelO zB7qU?)C>HVLVnyuuSyh}N?88d&|R3s%t=ams+zTai0hCH($WSsB5}27O-SkcRo?bn z%z3Xu@-fbxqiOHh`Bfgj=n=ZAsrhQ+U20$9@4N?$O26YHGtXdm> z&3td-w@F8koU$Otph_gn3?meSll|Evi)g^a3lBx*WHsp!v?$D4+-ph!8kEa&9@Swpy?4gc7yA>4*)3CBG=H44@%rNd+LyU`fKh+JTBlEi_ z^t5SGxAsCuvDM+riV7|Uz^(U6TrF8kjkSniM#)vgHw$gTn%tu#fc)>_WC!fjKe^j2 zfj;0;UiTGhqAR7IN87AD{THQsGg*Y3T`mSmz z&v&Pf=>1l>k*9a*HE&?Xixbmg^v@K79Xb2#J!XjDw@R}c194KTPei`HA8F8Ray;1z zOtNZme=&t+q4rXyzin?}2f8S{0 zf$|f=e&)R%XGzfecZF6XON-2y8g=^I2zkv7Rq9=VjZx;%$B*SpmCJqOowOGPtLJJeK1rrQ>d?!Wa~ZqZw6x^MVvOh(zxm7K{| z17y`NEWiIg14p@@^~i$#EBXO>1Z{5{$SM!>#L5VaZ)&G$Jp##eY^d zxc7(dsm1sK)l1dxLEoyy#mq1UlQ6TvcdL>|UY~EndM-Bvy=CPZBg5@pJk!)5*T;Ix zkolh+S_W^#!Z;Qz0&wGp-(n3 z_+`S@oHwAl&f`1Ld=gp8V;>e}MwFA9ge+sBEx1R|jA~pRWt_`jM=HR{^{4rINPOOKZceJs7I=sqsfI{L9NhQ!G+ z25YrIQUhck2)j5Q`IWuo8j*(0AkP6(7qjbDy_z zP!o`dvxdQ*TL>hyDTF@|mSH>yw8mEq;>C`#>inP_)LE~xu<{sKZS0^BvUbNYg53cJ zXRquycqfMw1kZ#D;FlzqY!ymQ?nb6-bE07vnelXr=a%>x&6ha?4zyjb>!IYuXB6|U<69YeV%jY@ zWQx#*yhDWFHajJt$+Kx*wZCRHD%6iok6E3U0oAfL8NAgewK52~1*u$H2MTa+ZbA&=GCJF~)| z$+5PQKg@1Vr7>3)0<_{YX|EKvqm^HlYjUtn-74^m^g#m6PE*nT@<I&NOb{TI@HQ zA+vh1m3v1xrpzm*f*l>>&?*R#X%`45fY}a7)2j~<9@}!s8r2OJGdgC`#PY9Ysh-{;CG(QCG`=D^ z-IH^;m?aLg9g?J1^AQj=swqlE7X5Rxovus-gs`G~_yvT$2u8d{iXjJz9Baq4JWiBG7~F^(b2 z`j0a96_3*;`Lc|Ww<4b8Iy|nfvq++ud-c}zV#E6(s|$P=JGdLc{D_JJgzT;sBX0Ds z5b2_#>%6NArCwtBHbagc@U;1|BA??mDJ40@j_o~fiCY}7Q#{-um*Oky_Ygf1z|S6nD#Gy{##uy6`Dbt>s509E5E6 z&4$msx3i5%XC8RqR6FCMob87`6qP$NdhaaTyvrA`x9>OAI}_#_(cAT>U<^9BaUwVO z4h0@d0TEPkuRqD%k~n}kGG@M++rLq|n}Xj=6A-&Bo9<=Z*MFWY+n<;>U&tx49Ozf>ADYjpl-!_IKGu;{dFTgfx3QRF!l zxTNL13VGnLq)P)$4;urQ>w^^l=BhCWzkkyH1fz?Xysm6A7ugk3l-@$EpG_KWK52(| zZoi!l!fUR~7N6^>RP<{qw%>k5#6J@9sVaH=1+x6p24ExC`Ud6RJc`Xb(V2{{e+jensRa~ z7f(^^XG)*xLFp8&VLX!V5;3Dw22JyVHfg%c^))w4beZGrdrgx>7nm6nW3}Af-4hli zM|cU3VM$reiU}u@4%yk$Ooats^GHDRFAQY()pLxdq@@GW{leiZ_@g+ULI^>P5zDpK zhIo=ZX1MvctPY=@bXuvsG%)^N1AI2I>00RwO3e;XT@v=L2;Z~Uo!DsScg~72# z6o`LV9dkb}yn0p?W0`cyEb~}N0Kfh&H4?Oi7FqWwoZqq2YQ{aRt)gTGtVM%X%qQ)Y z>wcX3RM|gya26*zjcQweKpHL#@J1*QANevu_C0juCL|}AlZ)WYi`#%Cq*rv-yY!^` z8Khk~P!)8Gh*UE*+y11WWr92f%rVeVLpN#nG^mPu%j)Y-IB%n4UJ+Rxb@lE!1VPVr6)HM9Yzy%( zZ?Cd8%al&}YKlG8|Bf7>uN|GXSbEExXMFMi>o!y}ax{V~*c)^jpZH zB2mj|YWy$|$6X{Kwp~Ivf(u8cbVHvMh)g>^1m&5CX7(zyn*^*W8w6X6$$XIKr9FWw zJSA$G`S8E=)W6ay?`t=;7KQxgG~woTq^KqNff#Xp)~7rjozSPB*{fdeYgpp+zT5pt zO-mb7@eT>GDGQNeiT^UqGMf9`PB4>r`*G=6`>e3-?_OK);z+~X0=d-3Lpl#1q#d0` ze%G-q=WXXzHk3Nm9}*AC-fd|>{TE}Nb97&$>B*~e@$Iu}Lz2|)1!P*mh8+mAoKI$G}Ejrb3jo}8Jo3#l(`^e z_R)WCG(oiz_stjL|6)|~RDX*H!EuT&>KLO>1uvQ0sfAm*Dx!Pdt(&N&EMs22i_;Lz zM971mjW^417PXKb2oTrpDk{(9cmujZ)VUVVk3xPaTBn~PM3rMFlB@({m6f^SNQ21F^fnw49i^diYt`q~j}%mQVN zG$ToqqhjHmL5A=eN&{34by5}BG-6EenBJ7jn{o$&R#7VN-i}?_a535F;w8c7810skJN@ zMKu#AkJy16cqUzmTHT3KuMOc@lwZ&Z6P6OF+zy+bjxHH{!?txp{nHPnnSkQX=#yNV zd|!G>&i3Dpr1258Xo)}%oj@rOZAh32q)le8`ItG+fMvNcthQsZ8SV}=(lg9Plj8FN zh=1bf=Tq)Rubi-^!PlqG{aG1Kc6yGwb%%6zQ#x!&1wU|2P4vRV)j8iJ+3O)?H%tvn zGOIXJ-ll#y98dA@8h!E{6PkF2rTD%7ZDrKyq?(9FX64u(`|Md~!g7qvfufeTJA?Zs zk8x?Apn0yxU?>H$xD3BT{t@IHpYZmo!;k8#)Y#o{Hfa5Ihg8*@9GasurQ-y^@yHfW z8Nd1IsNuS~Mok^<2<#*Kw8IaT!J+}>qt){Ls$K+(sWrEG4u`)jA!QB;b|Go#la$L; z4B?QU<0aAKPQ!hQE@m@1-&Gp>IMZm)@BFA{Pm0?|)c&UKD>AK^nS8y|Gji=Ug25g; zedNpfe&|aV(|aCGhwQq?Kbd|2pK5Z|nPY1yb3QN)$Cq zoSYBcnoz$7RJFbN)Sa_P{2^S7+mhQk`kxJ2Tnp7#MvJEFM_T}&H z?`8LYU#tGzZMZ@Zbzsb9Isu*imt<~vFi+q+ zbtDR`#6H)V9c@O9RZ6~OR1=BG5}6i~U4KuRJ2T=&lyK^FiOeM8_kY(p@d+XPB#=ll zrCph{pCkKVtusfa5}gkdXaWXgsFz$k{I|M!Z1o+wqX?6n(|BoeEdx zGRb%zTJ;33k2+8`}jb?TslYovSy!GK8Mm`GM-Wke^Wk}#nU1ZcYD=QZDA8e1M; z*BBKE*gqJ;N1JQe*G$crs8jF(>ku90dQPgb_|UPp8H>x#N8Yqn?T1wK74f?;9Nvky zQU%BB6wD)}Y04+oOk5Ze@5Gy_34m#<0D^Fptdvf9iphF9E!9BvWtS9TZ;4fBi5t~~ zV7Lvq5+BQXR!R&!N5|*g<+c*B1&sfW7lRsSt|}R zVaFCnKU*B?D1TjAOA!!ZP1^C~D@>N*oVZ!la}3sYD+02u`W|oO!ubAT8wNo%wf`*` zjaIGBLLmK!1cnk>owbbub|sN5)OnGgqHDW=j;phHmZ`>sM! zVto0;bjLa{5TwD>%Q*r^Bp{?m3Im8b5v^U+dIT+H(IdKSv4uJTUj`2P2u$~6KZQsPfF2B8-&vvHn;xGfjLd{(f{J<;iS zA<6maBXHfDeH8ZPfmPrg>jJCNxcjZhH#;Y-7UT{K*=}t}%WVm`Eha;P+rjHN|6gE!HP5{{ zdGm#aBY={>Ny}{uUMh~i>Qc1UHsC=>hM|}0LxjR7Rf90(Mm}l2lsnjGfU5mlLV3)vNzSH&DjiLu=lM> z8%iDYgp~q2qW%$Go0T3H4ah2RBNFoKtGYbxha?+jJBRmsxxfb64fyj9&{DqC>z4&J zf!C3%nTfU3zniub(Vk5f>juf*GLLZzu|PiAbQ|7Bf;wY^PGhd5kT1k&oCx-LwZPsN_Cbfv5F`J z^zRm1F9n2;E`X|ZXjEZ)Ksdl`%=~L6;*HtdYzX2pTS^V4d9G|)6IIxIgoJ4onf^;t zZ^!Ld*vSwHn4okgWAdCMk`6I#DykZwNg20+;SeU|csej+cFp7_!^39CH4M)5)Z0(v z$14b;a_lY11W?~rYm2#=hdOM?wc+dBJ;M2IBE(Si+{qdsIyCetf0@8_LG zKca*DlI{GdIxyVfMZ*S*J-pGdruHmewdq45jii65Dt#OBByZDE?H+I{%Kv(BIuDah z<}^yxpqHwE?{-b>)1b}S4uRH>Ua)-gQBC%5)a(eF}t792afyDlTdIOOQdyxm-BZA50o16P$ zFpa{CN`xM02O(dILOa9a@zl=Go3YwZ{M73pr^cEj`>;je=VV^h@50!pppEIvbI&tS zWoa8p>20QiX^u3YzqhGpB&*pER9oKc4tqjeSV_dPSDg$x8#cWBhKOxr+ZZtlN!Da76ULGyLXttIkg*Q3@7r63 zQL-lc8pYU>Z@lmK*Y};@@636gd+z0V?sMJOnfpu}!qk9+O^}U_j*jD|p`HaD9libO zd6t1D!6e_&qh079S{U4*`|wG4g*Lf{xMc;WUAefpMEvebziwAhP(T=ak&`iJ#9 z4?g5uk>1$(N+af8$~MG&x8B*eB18M-FaJqEI+>GX8cj)-W}Rio^dwM^^r)F;-s$B0 zIe}s{CVZUZ_Zo2j;>cU6@etK@o>Ay?wEp{vN!h5mF zpmkHu@T!TWE8mrwYkZkA53bh2pU4I}8>X%=6;neWM;I714$kUwz5Ds>fl$rFk~p;k z>NFQjf9^4k*?PU{xrF`k;r!mQ$ibA8e9_5{pmNjx%c<5TZqnAdMfoh6E2`7kTVEzL zf5fkM9V~8CPmnw*zqb!Ok&DM{z|CLbmgYLQPCYd~zcOyH6*_qPK3~1P>WEBOrN*y# zF7}h#4qPL69X@q=iMT+u?+?}7s&Bi0=NH_2In}-uUdL2w>_&bQ-^70=jpJED2>dU> zv)f~Jaf1zLL@yL~x)G;dzv|C~e`M=4AFBSmT}j8+Cr3-b&l^VMXdB00@fNCu_+D_9 zfh)~RF26;B$}Vz6*@o=JoqNmTzh%+Px5$hZ=8KDe*nlg_rY`?#RszfRkWhjH*}29x z7Ff+T7F94gB5Y62t8K;Cl$(7XNXd(z8Wd9VSe#Cf;41zjwZLCO*Ly zzIg0B@6O4>cL&HuwLgs?#-D0%w8iqcyUgN^dA?=Jlmdr!WiN?+g0}x77^9wgSewXp zb=jjj8xt1O@_PLhQiPdy!qnb(>?*JdF1T^!@y_Cnf@AF7k>k|QpN}ecu>1R>(tT*b ze7w*0^#Wz*XUQTRVS+ywlP?D3nC3haqRGt@0tL5oH0Bn&j}Ti%va7%@jJR$L}w5Xj%G(Cf@tPMtn+NqC1U2(3}Ul0PkbJT(p&kxh}w=q_vV3!<~nxj2U&3#i? z;8BiZebU^XwjVrV-1Xu_#7Nq+?87;sBIIsCo&j6nd*pRo7pA4S{7>UV2~OomF|ZDq zkJt99NZ)9QSX~Mu29B>i8zT5bN#!`9b{=SNgWg`k^S3m+t2W|Wyel#`+^%MygzN7Q ze_ir$E6#xaJ^I;_*WwX%=ZJ~JKm_(`dEl?axgS{Ma{S-d@Yfq(J;r86#4EzaUT(%0 z2vkgE20YO|h_%%y?PvpX0NZOKznNm4H+xYaZ7nH&wDK`Z+LtE!Im%_kol=ssH9Y;AvhHKL9d zBv#Iq)b>q4`=Oxe$Au5-%2GaQjDVKEQRRSM2u@f|M$(a7 zf<}E*y@NhZZT7#SPn+c%o4udq!M^+8Au#A24gKekhVDzp-N_U8e&zfn1};{=v37&L z9T-_twwv@B$y1_1Qn>E91-yF`P3L2og9{zIBY(_mnV-4()*x|s9!%5fBH?SsZ0Ar3z08kRMit1OW*&9?+t>i>;@ z_O7b!!u(RWsB}2xhBb!;t+3(`gUOjc1?)+iLe)u}xmQRV= zdTn`O7f2;--UPzke`QAipTZ5=2!=aGJH_P?Nf5qsA ztd*B1UaLcl7QIV9;L~ic(1qoIZPFVJvc}_0QRXf&{2~fNB>U8oki`WsKg3VWLO;)1 zX=S0l?F;bGP2YC*4$Cn+dtX2oU%sy=*ISNDfNK0B?4g1bGZJa*?)Qn!OlRHr&HX#L zSmW5jyRWnT>$@QD-3g&r_aI64@3AxPXdczolvcJUM%^e%R#0BKNMBCK&fok#8AWcY zkMTC8Ik>)#dvhNd^Nv1KYm&m*&tRKRi_ma6vck(Ns>o8g|V(PcVa%PxGzDYo4u=_z;y0dsFSj?g*T)CyA;$t+$((%)7JgZcZT*b z4w2ZL0kR4uN1L|xd_ zseZ>GxWSv2gs2XN%UCfg^E?VsT5ATzl(jG)o+D?sv^Q3%H1UuNy!#Q-8%JewivyB( zM)XBfCixKK)q@zM62;7g+qAXDtqPNe9!AFCGAg0g=V$V7%gWkzetmHa{qERY_xr-K zkUl$GtJD&F;|KEur-XM&-UA(5fAc* zKXqYG;^Tq*bHswK$f#yMksZyD{k4SLOXpCpr1PYmaKN%<68+F9f-bCOL}#WSxJ~3s za5=O+(rl==DS$&7PL${xs)8wz%`a*}?WpaYEfF6sZhYChWiO!L5UCPqnqA)tj^4K-;-N;m`e`n{qd%r7te$l01tM0``Y8F{0u|+ z&(7{};7y9nUX+k)3Co2*uuX8RN}g77;I(i1e7UXQU9QMxzPbyABTMgJV1%svjo5!@ zNAhhJ{PWgKy7;1p>2>-0E>R&0Iy2;2lec*uL6+stcX52V3>}}|w})CqHqUvHS2`&E z3Pw)kYYOY7vZV%mJ{mp>O2?Ub*$n#EUOP>ezSx40gKxj;AQ@{F0*cKYMr%=r%-phXOrck)HiA zxZpd=y1W3TTUK0Fw^g`4Q_JXfc;WFJJd_5bCML!(b(}iOj`vRAj)MJkttLxTV@(X> z&PGGY=rek^{ywEVoVf|EHfwtb8D!zKahRowcrp5 z*0!r+nNhxNTu_U@Y-bhKT(FdWfO}9`GUMyzNcNNigKEz1Y`}~RtM6BuARWmea$rvG zWpy|9as#J6v)Tq4g^uOD=#s;{xgQhDS5%y1?JtV6A0k2MgbVMcmVH>(0L~(I`0PC@ z)AYCg$#Lh)?TZeO0e5TFzmpWqd*T#+mF{@?;AlTWp#9|X)5QQUm0A?R((2MRT?ufa ziirlRZmvtp-_5sxjV5Q_3A&*@V(*);H^|{84s+(M=A75%?Mk)oxy$61=_O_d1F;RU z!%*&xubl%oL8}E%hoQV1qn!hupw-7lq<=j?6C=|HzJRDjpYd$uc)d_%vUvk*o7X=G z56gxHyyO3M0X7PP#Yg16y)a%D_mBf}s>s5;ndyFf;{QHSuGl(FoxS-C96qiYhY`CVxwm-e$+_ns;ERqtGc&=>xMqi4}{^^o))gh$Hc zWg}9~=wE9*O(kugNe=gt5MaI(0FwbZ!M6=Tt8%HKMk`pw7qq1my7r|SM$&?aGQDvg z?%EbuJ(K!TOl$mrIo`5?mph?0mI}=OBAF{sH5B_sRyt$;e2vX>XK z3#?yBrK;!6^PEJ0TRqrCb#rz7LfCiH~mD* zp3lEFZzu>2%Nov&wNeqO5xZdDfN6@`w!yZQdfCg_3-oCg_?Hy!IK0692)EFibC9lz zoByP%H(v$v1`hCo(|FnEhYe5zpVfy1TyDtO`@ToOzc<|U0oVVwgLx~g3*!=obM@3) zK$Z>n;N){|Dk#skp(h|BQ_iKvbGT;z|&2SsDbrN$#f1`#C0RalV_?-VOu#Y7@b^x0*K z=KW-Yl?6JkK(=w8rsy4`phQfb)a$5xSb@K>-jOo*nX8;=!hp*-_{Z<6zJ-tU60CdKrvKaQrS$hvqPd+4D4V%QNnUKMy~geH8hF~2m$Ln|-6C!QS$54&EODIW9TtCj|p|8IR{;LGS)WvAx&{7-iVa(*$T z`$S<#Qjbu8>#6}?6e-`lLcWTr6d}RmC2`F+lo^Ihavx-!!K&p!0H2L(?5v zc}VJN4t_=r7|Tp4Rqy$jQ21)y3G8FPXf>IOIg*m9r(C8;0-b)EF9hLao!|P0j+Z{7 zZ$4lf4{echqO-H=@xz^+KSN`Lc^~s(QS0zzyWs(HvmLQ+A!jBQ+``g(S^;6O%b>sR zUl;vQ3`2J$_MWHeznJk+=`v&0YgreautF{S`F^mk4Uv;CSzF0%VRE z-hd~Kf6$nD4BzQCD8s4UhXCmO!<-{L0Uw=nBJ*M3dPrWX_{}t#sVYN(I#u}j!!{k7 zn%Gm($Pa@f6D3Kf)vazsnxQTpah9ZS+MS>NZVtaiX(0T50HcrG)YiyQqKvjm)_+#L z!ROwh-wz*aNpb82)8BQZ9N@Hb(ExRer59a@rL@Tcp;^hCaL4n8%_ZO=&b@zl^mzqx zIor=hYDL%x^i&!qn?PX>IGr0S!1zTZOn|nZKV3iT(E_XFT;IR0!aVvbz&PqXJY*Y# zZAe8l6ybBTud**e#hQ4EDxtcXos2<$CTlg)*j%mg9OvfCIkE}??>$ugN<%cUEs_kfD96u+ceMH^a7SW{X z?z_+oKsHa~$rbEWIEFvWf60mwaMZAj0UU84G6a<1bOioh>-RU+sWVKdhj6qrqjFETs7;vg%q%7kNoGM~gf zx@2Z301AvJWYfNQrw`a=mI%@&=mn$@n2cN4{^CIJQ$ts*WC!s9wF9ryGl%hk?9{}n+5Rwdb)`y5Yt@3PIQXyXSYgL(C!wuccs9j4p?fTKXh zpGl}7Iwyzuf(;P$4lc_U1C!jN;Ux40yoabgoI)x_k9lzS7NN(~u}%N`q3Y=hywyW| za(Gv7rASHsHy1#iqx{~<*`A74 zj=AE!Vr1J+Wne()G7Edhr{!n2+@4;-I;M?9@M1NwX_kuXrQyALnFC^7#D|9$@42Q9 zu4gpF-hZt+12%v`I-CJbL$ZJ5Ql!3|ftgc{=Z;V?}daBzG(e_$XKh*d2^E z^Gm+}RIBJ-p;r=$1X-xsxu>}PHwFTd1E^P0;OwmCO*|bi*Ol9@V@v!$Y=QLE?_z$~ z16W+f;Bv=FD0$o|D^#GzCR85)KOwaqNgDl|_G38{Kz|bICy4rp>|>H}cO69S#@phY zJJqp{a@onea%DALumbehkqZDdcX9#S#N_iz>fQx#VwKC-rMjj0ePQrTUqkB%T7$8z zaIU`Vy{<|kg7!qpnQte`%y!?-3sT%!k;3bnc%=-erGu_&C<=S_5a;Tzv?kKtp(QQ2 zMm)%Kt7v8W2@2H6lq%gS+S`o5oSelr0aa;K5HkVla*g7nje=nuzH>B#MT^s39Wfb< zXAzqWnNn)Ykx~P8Y|08(MsGRne2XTw51fkP-!(cthS>0G`KN|zG9oAA`Qtc+ya_QIoB>p_97D9%2u zhtI~u55ZC~gvv%SaLV%{vrUZ*W3@R8Sfn$1t+%N6>T|eyLpm((il*arBXEjfIr&52!zzLEyoc&v%{8t)Y!esX4+@&4Q1 z9dRexQ`)sY(i_rBd{)wLUx}%XJWRM$fq{bsjPoY-984qbK~69Ym17)B)z{g#JYfQ=AXi}3$dDR5+isF>Akn5Nb zvHc$Fv|C_k81G&e(OHn#zIJvxe$Ypo3G1i`TFrc96D-me`lf0kLIm5C&F2K)a<7<( z5W+TzKpgb87KsxP%2>x}p%VsBpkzC- zRU|4iR!=U>iMPrjeXj1I;`(KuKku*2_Fq`)EA@?7OwbRV<8I8tt6nqC8|~EKXYf+_ z%AkhTy!#mwHP-)EiYbk6vl`oNB28OLKCPs*isL+C4a1xP+~_eDhN|YfxVAs3Y_w+G zWzznh&Jw>`8xovau@jPO=0~0rf6Ug?Mr5$5>(-jMzwOW_L#vM_O8CjeFJy)%lLL$5)qNu>cG6t3Gz1c!zDZ`X~n_@&E zvW>BfDUz}8qfF}eOz;2tUjMnSnfrOpeSgk5_xXJ8b3M-_+gO?M@rv=Xv9a-8HZ!(k zV`Fz>eYrUR%bm2_#=xLvbHyG3jDmuKk|DnGg`H|@YBuKPH-OK_5f4YWx82F0pgZvr z68Y)yws->)i8S!a<4qp^4}f70wX?d)X84`r#l|L@eA(E@K4Nl}nu;oI<3H@4)l_%u z*~afcm^LY^&t{OCfP<&#Wdz<*3~np-m>cGJc&sL0kF!p|~O#ZKydd!R(ox!5oQ= z0ljiBoAmetA!U|p*2Oi8NE;z0Jsa4O3$$cHwD!dAn>@Ye)h-Q#lFp<^W5*|oiqzMC zGX1EfUaeg?aR8$WL5~9g$L87Oyz-~La-cToJ#Lh*m>+VZ^OhxD@ zWgu=jA|^PJ>&cL7!qp$F;SRSDYz&P8QD94n0;eXO3|kjg>Hf4Oav8LQnX z37VOJ-`=W5S&gcajrf&%)WDRBO$;LLyhmyMKt;aJg6sD&iIx%r$@qFy3p%3xpZWNL zGTP^V)waF5oYSRWSDQ%yF>VWR`rso)bcrH9uSFL3;v6PJ!@UtkoK3Yk#(y*8ac1VP zZ+NEh<{K$zzL^~*7@dXcx=>hUU>N3;&*1v?`b)p~nBa~p;QF6;H^%jiA$ktZ)EYf< zl>J5KpPG(B7els3$LHA7dd8d1{o&dCImItGh;(+amo2>Gw@YhPg^hYrh&$4~*5U?I z8dGmd#Dx4;2@`=^q0c6W_NV%sZ69G9$h;4d+AGZ*no7imx}soQo#Ps~&5NZQRf_z+ z4nMz61{`9bU-8Cp9TR5SgZ!FFXMZh>&$so$t?A_t4uM>8mrk^uPo zIRRgZF~1nSW6Af$gj%Ie2ETniy6o4|@(`&i*?7J}EWWVL$aTD9*}^i|lboss7*OQ5 zoe%e-C-THlNVoWwAe-}t0+n;LIUDxlYRK)C%%6)-jJ^u}`F#+5(9T`eSRhV${3$Ga z)RNX^G`xWgM#QN?SN!*C^J)H5FMXmF53;w&kC)3d?-gJdvVua4F&tk_BHUhIdwFip z{^h}MDZ9|ojh;FVVS^qSx1YPR7{OgTbGPDw)DJ-?e_>DB#7$kUWJZ{|&wi=b=Ow;f z-}_l=dFg@cF!-)7;40mi(~V#H4aTyE@4V_k4_w)Ywinsj5eqD6dVW<_LjrrY^HVEz zZP_S3s@>fzTH$V3@T`YL2y`cDyWI4aj-c&>y9Zjq7p)CINwxFpRxfvlF-;%(bmR|x z!HI?j{Ec8d*Zpem7X%mk>=%j);W#9n7UUM%AH1iI7oTgXj=mSm35pMw=a1`aGkF*8 z4V4-OxFI1yywu>VfZ`OlWlJ|G? z@+)7JIIdupMpqS*xhVL@1)J<=q)2~Tyv~%dGPrD&#wOhKxjgzn0p`~K$dVk?VB_4E}~ z59REgnPug-XxM4m;qUqx9q9)O_ZDBT-`sp5KJ>!$og9?HmGE%sL|1dymsKjkyl8S~U&Zsq<=U4S5c-jIDrx$*k~F zpr=xG|72=7k{U*QyG#l@XUlYZdzQ|7%$48rJZT&t^I#0SYWOa$iv4^7Bpp{}GKvp4 z+^}4be*N(0?Mt)^C;lk1Me)0Xh-~LYA4k%bnH`+HTa72XYDJggk1OR&KAGndB#aNy1O~L z6>Vzj?(ieS^YQI*-f{MOIr_OSnXacKZdHiqx7JGC>@n%83KH<3Js_4}qo4nRv#wp1 zpFd1NVp@2Drb2=^eG_4VOsyU2K7QBYQ?-w3fWW!Y4yIs(Auv;;zTZCu0Ld?dc?7ep zm;v6Q>7$cy(5~T&lMgVhF<&ex;0l8b#x4d4@VX_5b=`}j{e zucQ1+>T?^kUKLwiTu)1JRL#xGB=-_}B?BQ}b0YDdd@9^ddPK6Vg=yXKr$yBsZsUH6 z|5Ta_kLVV87*sT0>Rosg-HH!8ac?z$eDYybBqbLr1eEY~pDld~Eq2stDk}PP1A`5I zkcB<2G+l>!8OV3L{V~pkccJmY3$hflqDUzHR$`vE${g*=NLcp9ZQ9^ZJsDhm5_l<5 zR>P3y>1Rn>$(&iyzq2|pzM3}LCthHqb|{e;&yN;>Y=?PGW>O!Zs6Sig+R3pGiyvR2 zxrNfj%MiNdB6S06tCKYHieF=W(X9%3Bbu5?#e4u`jT+w6db(hYC82qMW}z|(T06|n z$&V&!IOv&}w?$byNMHLsJFx&+xPF&F#}sNo%t z@#Fh#er<+_2}1@$qjwg zyM>UqdJ#PBx<~J=U7}fVLiWjiHoOxDHWjC0dd}}`NwBr>p;d)I^k}C;Z-ON@TR;4ocvZ(e25|$ltImOu zU1}AUon(fW#~nX+>q&8-<5IzEM*(o8-(B$1swCUa11qd!@j8sYe(s^^B@8i_+%V_( z{q#c|3Q|*lfiDcb1{a`~hCbjx`=yALx$Qi^MB7GGj(IMg=tLKjn(?0kDg+9CV!rot zme^mZweN#SJr#Fl`lwo zpNSezp-xU?_7AeSIrp`?^@R3OZe^U=fKe8-I|9|Ei>t3S-f?3>(6RK%K>MbGgOhA} zBKuOg?q1^dGXcLc8MUC@Q}n5*f;Yc$)Ei@(86yl~wjE>o)Xl6Xr0dnr!LX% zp+hpyh+SvXvzA_V(7t;*`%F|h$8@ToA~n)y{TI9qTdZQ!a=R|PS%xS;;z#-+5c8M_ z5qLpOsPwfgAMADYQG|Kpi;8K%8jp(9tbiM~l`^h9HVaBrjmg$&LDeq8-RuCL|BT*B z)U6UIye*|z#jZt;0s)3eADY`z5-(On*3DdeCte)l| zS*3Dk1+36~c~7j1$o$&%61oo*g!qVOis=}k0@t%?!E3$GUc1L|4L4VY+AR-%lmPueDOZPcu|AXGfOs%tK5u5EW~HLw_V+i*Ac2M6$(a!$4ug;ewl?D}t)GDz>u&F55QCxPD-XG8w@o zuxZX(m~$Lh7>~KAbg3-VBBd?z*T^4Fesx{VX>Wsmn+21N>;T(zZGpJ#7c#>sTJAqi z!3%u)fb?0ev=l%FTU(bg7sqn~ADA~jub>DnToN}NU%ql~bfO_f)*cWy4$~Cl8F={f z?nPm~Fru<5%l00lBQnXhuWeXTtny}F&b;v1hEn*SLT8 z+_m3NE4KV`(PXdU@R)5$)=`3kiM5;|@x>|`)AHs~Wxdi3a_!W~Db7@DVx;L=kE?(N zwb?;5%O0=&&Lf|1XE29x>1Wnk9=`}3tkX86`NclF+EqeEWCq4y+O2O>5E;yvNxzqE z%gn-(P}RD<7Y(G9y!GQe6~JK-7d7O`t+~ zgby|cr|*wB7kO1|%Y~PQ4wkq7{zR z$6$3Houa$);!9ARvy=TDEE%_D4|jP1(AUd1PP;_+D$QaIt>=Uj6;)`QNSSe^;9%FzV7!krzcTC67dS)pu^?EL`vYx5vp#@fuc0 zN_eV<rG}S1Cd`CB$(*E(4j=OOSp~ zh`WYq*I3C$)_|gKQxD(h#fazTL7wO#(cX)9WjX`HoXvxUN;1J+>>RD11eNba1Kk@@6 zLJm_P|MD$_q@vDZ&BNBEpI~wJ;5f#`i&d;l<1nN255vIuk|{v0&x2rB?Q_qqKv{*$ zg#d*MPp&BJBBY)@(8RcSumHlwVSumt|B)t|vJ`@G@m&PAVA*7)LK?`PmMe*Zl2qR8 z2tycU9Z`KAl!*)`1l0Or_;0NaMu>nqS#rH_wnSs42VsvnAYg%-f^8v;Ip`Tu>_5io zc#V}XPfOy>iRg1H7n*{dZeU6h;Qh!7Z$hUMNlJb6sN>gcB+VMDgU?3xY)nWvMBJvx z#`*|w<-98E0r3#;hy+P{q)XjF-GCN@i za3LkNR45V<_7T%vnV?;%a35za4ILJ}PiQTmdQfbYbah6Rm8Rb}i9U+{75DPXCk5cx zEW(ZVXMHwXK``IM)}$7nL?*bAxu{^fQFcPkdB01h1kFQO#}ke5K|L;Bj$Z|{hB*W6 zZ22vUw7S5gwXmEX0*oKlw6293n_o#znssQ0osl9Km%P>y@1tt1qKj>86H&nS|Xv+?kovOK7z&9UAg*XxiI( zgGxRfaX0nYS@f*nYvQ}_?Ppj|xsCWB@i~+)P@8szq2Y3VbzxHBKZ!7K<5dfh zwvUL9AXqRq63j4G((P)(JGB7ZnR`=`;a9vU+m2sxoa+)f`u^D0M9rKNZwCpb4myOY zjcqV09q0BCX^P)aEn|s-n^Z_*NhDUOO=D$<_^pR$nYc4Jr?n*+6Gi37kc8|(W2lz7hZYv6lAlJ_ShDEf$!uFFQ*!TT9 zRBU?RthOoN&~l#wnnW=1e0CJfVCZKIj-+c;Z9x2`{QSS?zav8#zv zpy#{SpT8YclR7iO>t-D0GPTJW=w+LL8x-@Pi1KMIFS8dQ!>fY$JV-lv$FC?&kNQ5! zQ;Dce89s|15Ii8#IiF=%cqRPhj+tSX_E}>V~jr47P!eu{ed(@%_Na zM46VJXph&jN)kUZHj^WD^N6bsUhGGJG$#gJi1v1I0Nm_D&xsd5d6Ipd#1#&Q<8ZhTZ*5Ok*F%R6 zMMTh_SlU#0TenAh;RKO)@H(-6I*{?Mqh~&&GU|}Lon#rusV%Nz z;_A&C){EUspKM4GcRT=-GVyO4jwxocuL*FNY2-XG=~0H%{cuq8^7VQC@&sjfv~1y+ zqHhW~Z$kH#pynhm70r@EnIP8u%U>9$M zxgd+Ry~h_ln+|ZZ|5#L(pSQK1P(N-oaq=A|4-g!i*@3=01%VxySyt==Uo-^)Y8axW zjoO4pKT&I9J(Mhg&MTOgrT@j&f

vFTe9TvYi;c^x7f9m)Wo{41k~a`u)WwzPmT$+LBt38xqC&E8YXheU>y zTauNgc0>-k6V9Dw&ubmHgUqq_RwGRaMroTz%uvH#lZZFQ(0jmE#43lF9SkvXmeMe} zEAZWw7ZHaxbc8p8AL|9&G&&EYq?%RLp=5Jso^M4KokStf&uN&viVqUEA+h}43{jQC z{&q!4AA5Ocy+|c#sd1bOdI)y0MwUHF>?k^{^7PqsWTBlsq<5p50rnUPfATSeSMq1f zDbTY*cy`vc0Z@!U&<_G4RtZ|FDRk@5XEXE+-2irszJp|4RjBKDK$naN_U+lV{dT|a zq8pg0Wn$t6xjHoE-KKXrp2w90U`b`UXfriN<$~cwISb4_a|JEx>V^Ho`}_+Sgd_~2 zfm@op(n$+dl=f{=Mkpal#mMim(_N5jP_x^tXfLKoUNiZ^(}zr0aYGT<*U$d>);)Bf zP|vI6>u<~27*?vNpHtp#dJ^o591BeHSY;sg6es))8`aIS*Qg+^W=>JjvYOX^eDpY6xfKZA$ zK>6cd=hcu^@`FJyZa!KG%5YSRsNI=bvm{GPE6T>Jc z_Bc)RXyL?9=gyZjdsC59%rk{;Q`$|oh!95yxJx_hBqMoizw#|xzzgE! zz@-A3OACJQZH~@To$#s5lr90~e{98uNB$wC*aB$MnlL~E9v zAL^m9jtF)o>SF7(Wb2}k4o>yS4j{In3XXbdCi0dr$Tk;ejZcuTEos(-6?%VVE1){Jt+RvA0QcGmMgAl>uf`assOj{t8uNGHr!(~41{ z=DHt!`Q$kDT%s8K|6pf+z)HkywK3{s7Uy-M9#tPsKFXH`yK=+U&D9G|I#1p^fz)nN zRb>RV6L2V=EGxjyzFRoDJp=Us^n23ww5Veh^=G(2-87_J8t$5*kT;O!YewY}SxuVQ z%PvAC0UnzL`8878OLbm=w^ak-W@i)m`lqX4?<($xr;>LRe6XKNI-m9ckIp#LNUY;sg7`Sn9Rhkm z5^~wH+x&O=QO_N$-8DZK1VgSoOQ#jn86K%YixsIbpeLRs5?ukk12wTxI+BnB2s}hGnK3ejuIZ5Vt`O7q06n04bWlk~v z_WWqT2uj@MGt9(@)t5N0DWIYZ-lPWIAEI}hBZd=8;j*l`ZBJ6Z9(ey=fNu#kudq00 zOXXRMjRn5|tXvNmsC{KPbTb$WM zL+UJL8?A(mHr_@b%7 literal 2861 zcmb7`dpr~BAICS5HP_i(vK?$@TjVx#zs(Gr6OUzJb21N^ffc z-TqR3xT2DR3Pe#uS-JOs7s1fL-oVJ-!X(qim+%0eiQZyWRb^&iP^G_(3z@8;g+RlUFF2C+M(!co;jfzDMU}pOK|W`N zjm^4x2g7`a1bZ+@m9~y<^_@!QcBV!KCiIwye*OV=u>WW}Gd7m(7rB?sKy`O_lna`m z>Z;~e=Gg|IpT#7=c$x>{c1S*1^MJze!9(;7iISvrg@TG&jDqW_V?~%9Lj%G~RiAru zKkqHV)Fq#0HIJ^H*$R>Bcr^KjAG_MNUGrkVg4g6Hlda>}^=kfB$Od4_x4mz1z5keH z%R?2^k=z>_mP;GcZO=A)x3*PCB(3VI5Dkr}_{%Rs<%_>{YDg2edM>!&W1sp`f2){% zk~w1iwF%#DkC06!woVA@a?PFbv>x;z0dP;WBg^a@p38=J*-3@-Y-*jRA~tGGLSUg0 z*)f!Uh{L0#wb}Z_Tr7Ta_F_|U(iZ#heuMEafm@$U$~$TQML^2%o|$3-KCGeGW$N23 z@Rt-K^fLFNH>LLZR^#*;o=qymKR>vvW_2kgC(5U`f;MUgh*X_ntdZ(pInOU(YpcOote1Q06kbFj;%i!^kpbjl|Ss5xx-qxzjC=brFusVK0~xF)0b zwGQd6qKHs;ybuM?ph|K*^sD4QY7S-#sd(%(4VpVn)2m}ⅇcT;gSQdtM=6TKfje=~8Xj?4z^A#el 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 literal 3067 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 PcMGtwa6~>b^Go~}g$u5n diff --git a/public/images/pokemon/exp/back/666-elegant.json b/public/images/pokemon/exp/back/666-elegant.json index c44ea10f7dd..35c20315153 100644 --- a/public/images/pokemon/exp/back/666-elegant.json +++ b/public/images/pokemon/exp/back/666-elegant.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-elegant.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bbba66d69955866664e782205a4af88d:66e99814147be780756a4d4ccd8b31dc:d6b035048c66474f6236a3bc923faa7b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-elegant.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-elegant.png b/public/images/pokemon/exp/back/666-elegant.png index 3187d681140b974b8a75638c399d68acda24d089..2a75c09b505d982b3547030a4252820f3557f556 100644 GIT binary patch literal 2799 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 diff --git a/public/images/pokemon/exp/back/666-fancy.json b/public/images/pokemon/exp/back/666-fancy.json index 657c29e99ee..54113df4b51 100644 --- a/public/images/pokemon/exp/back/666-fancy.json +++ b/public/images/pokemon/exp/back/666-fancy.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-fancy.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:570d1bf9b987c1bf5ebfe39e485464dd:a3c8bebd39c1c84b1bf0fdf600026ea5:6d5edff9a806f43feff031c9919c9aca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-fancy.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-fancy.png b/public/images/pokemon/exp/back/666-fancy.png index 9f9f9c42e801687f62565a72d132688034ca5b50..f7da62d06377646563c2d28e88e861ab309d3ea7 100644 GIT binary patch literal 2977 zcmai$c|4SD7su~mj3JZBQjujWSu!%l@+eDVU$T=1#VE2wM6x}EnZiRgmMl%SXoSkx z64}O*Y-Nm;oz%Q#udz&}ytjJ(djEOvKdy7`bH1N*e%F1U>+`u%>}|~v{Nnro03a+a zOdJ6K0t5XtI5)VKH*7&c0||39Hv*o#lK2e1XxLjjn}QaJL}D-)Uq_U^m6fZjYeMarp%VrtGwaf-$%u{xZVpDUEw?Ar(o5HZfKH| z4|5j;7+YODD1BjnFUMi`sq%;m;fsP0eUdZPxCJZI zU*dtXl8~^-djinpB1rXg6D@yh_WPwS%4Lt!s(TBx=Dt;43vSwKCS|G%$^gmV_@LLQ zZIQW}P`LWV_)&930ImDnyyeZ$`_C!nmln47C2U8zCYmbjQ3sGScBp{unJX{13S~)W z@!C-GufMsJavzm4UpV|M(%{?uI2GoIY?wu&WFzqRQnqdjYbO0kW`9v19E`(X} z5@va^a_HLd{((My=E&uyh-fHZGP6@SnZ?P~Bn5>4<-9@`kn3T7#O0sS#S0roU+C_) zKL8_H!-!_rQzSf~N3x#7XCN;$3(Ued?c0x%O&=bgSnC*H6Reg@T9o=;bTw%6c+`P8 zej$N*NLQE!x6BP0_~WfpZoL%#;LGsnHkY4@|J?qlGdnr1_pq@s)*%eR$7{dmixLl9 zPIGREC*f+f_DfFONZ+Z857tI}58XO196j3Vt(mCz!Q1$7m-$B-5-Oe+8o^~%PIB8n zMso@lImy)f3R#cnPE`>%guGX>Lop?j%`ovBzxd*X`}|zTBNlGz?#-j@CB#(4v31Fr zh&$xZFcUd6t~3z&C^hh1^^%qaXZ9?YKWixpYMNZEcjHVxp9~rYP30c)CSQ3i9~2T% z>TJ#mY%eMADG)bww;&k9?(e%0MEKbYQ#ElNhm9_5yjfiFG}jNVZV)Op9}?=&7Lf@g z?v#e4%ExaA`hb(m2ysgfI67oCbxv`>AIgoB=%{5J6?ld%B2U(84^(WkhL0cgu$(LmLNRWJM%np+_VvucDAH65>w+3_s#{N`+aGF-(@ca* zwT}}J&Nce}ovqSVvGUJja&YP+4o$A-pi?s5L*g?lVNh71k)9{B#%5oboAXrG|%gt zjBQzX75&ytaxwZg)Jw&fYqhO)P0h>-o7?djH|!KK41Z?`eO%p;Rkkk;GN&9aTV#}S z-TgG4<=dCG!l~> zX&^Z}bF!>=R=Ky^BnIwVd`VJ(fP&*q>e}PW($2t}dYBFb;d)CoK`{DEtezA=czo85 zN^8#%e_UjA!2hh!1Bd_=66208km#;!N3(2?Z;UR}Ek1v|t0ft1QSeWn{af7)EMAa*(|(VzQvxY?P~OQ#?D9c zrX#E7ru!Snt)E(SxYs)OomeR7zakAygwL2~P;x~42rDItO^rw8_CMLmi7F!+$T>>U z0VI(SA7x6H%D^_X{C{U8F(U zH~iLJP%V(4{L7$cBD!-ca6Jjr!j?P8-2q2n0_65b1hy+yBd6a(XJ$Cg!`D2!k2G#k zkeoy0AHG=1peWa)6nU57Z7o`u!?Mb{es^fQUBZ{Dl&t#Zod}*cx`iCGZxvkn)x$y^XcI~AHSOQU)E^(;#K9a|E8 zq)Hi@fjY*Y98aWt-+q%1Tjo6cJuBuBDd|>Z*}?rl4IL{Xz^%Yy#nA?ixw0hCnfu3F>efq#{qByF_hiq# zVU#vE??Vflb(+wzV(Ay}2x&#g96}4rUv55xK3{*CX6@lk#AkrogNAk{LKX5~d|SIj zOJlyEV|mgY9t``9KPU5LSC8!xrDI2LDB-E{SV^Z{T8XzmzILvKAm-~Of_4%TV>|wi zg4;^5k?zr$gGVI#EUjNPic-Z^hRO#lb(qowUf=kKAf_RCpO9CRe8%DdL$khE0zL1W z0!jf_4jt>0ZaJOI^t(Gj7R;ts9dMuJ#P@lpJRyG!AS zM4vuci&O(bXDZuXXqWsFM-!L`*_&N1q*d!xpv%)gLS@v|LKf%gSn%&G2YwPlJ5kJ- zqc=8~eIabB0v# zEJJY{Il1r9em$!a{}0gozA~au1=z&7ijcPePR1LR-_0#I__NFH{tV#nbi==C)j#R* zJ-fTB{F^550>$>4fl literal 3284 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 B0zm)( diff --git a/public/images/pokemon/exp/back/666-garden.json b/public/images/pokemon/exp/back/666-garden.json index 763dd125a5c..4fcc5ab0ad1 100644 --- a/public/images/pokemon/exp/back/666-garden.json +++ b/public/images/pokemon/exp/back/666-garden.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-garden.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b2ac69ef7a99f6cef35d3fd38c74d01:8a4c29615f3bf20e9c5d0bb372a5b210:f13a1a8fa0a411aa91fccb833ac8719c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-garden.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-garden.png b/public/images/pokemon/exp/back/666-garden.png index 47a9a27e7903dacde7c59d3f3080cdd4940d6633..35e0dd02087d8b543e6a8e48a8d65ec1fde65104 100644 GIT binary patch literal 2753 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 wRdocfqh?iYOCT%uR&d{oFs{f~ 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 diff --git a/public/images/pokemon/exp/back/666-icy-snow.json b/public/images/pokemon/exp/back/666-icy-snow.json index 17e6e3be8ef..b44f33bb07f 100644 --- a/public/images/pokemon/exp/back/666-icy-snow.json +++ b/public/images/pokemon/exp/back/666-icy-snow.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-icy-snow.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9f47e6de00b727163c2ffb6870af9c6b:16bfd68007c3798294c7d690e075f679:fb1e8b97806dc5c60ac6adf0ae48199b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-icy-snow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-icy-snow.png b/public/images/pokemon/exp/back/666-icy-snow.png index b34659ded515f99013e75a6a45216bfcbabf06f6..332e96a6d6158d0b6ab422f14312387610ec0514 100644 GIT binary patch literal 2769 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 X1i1sT_?<2NU;>B^ZuSptsm%WXhK~*W literal 2613 zcmb7`X*3jU8^>oR%OLy6J~3%Xh8g>oEF&{^#ya+$>LH>mm8D{kWyV%CVj{9Ub|OnL zk3_Zy`+prx5QJvB>T`l7C9kXw)om64)S zX9mXy-cB!yii+SIao@i0sGw9XM@9*Yh!vETYw2n|@9WXm){~Z%8>7-rtDw#Yop-@I zBbC+OycrJ+@^W`}adP*3*4Hl~E|i*b`W}K7}BQ$0RS#5EZWE++H<{dDPk4FcW$oz-pz=}4xLwD zx(|jBV+$mqlR5ZH^r;)472R4RuN^hC%IC2;a1)FBU9=(ggw*)E=oL`kBj@D=)``E+ zM$JclTQ->&ZLL~_&ZKWT5GOd@V>&1f04F-qRj%45!Z*x+57?FoBV%hX`i%&m;R{5y z=j5G#p`!9TeWpgiX-qRA1CsrPX>I5 z3tH~D$@HmBj4Q&=#A??VQ8TrILL{o8;!bfDT0?;{NpJ=##Bv1CxrGr(ymY6eZ3l3Q+Ne*+I2oTpAWbBz-_8Z zA;Py{y0 zUX!!r=LXTfmL{YJgUCByL=3L`lFeKxX1we%BUy_<_zc)H51HnUlDvR!tL!D0GmVABuuoO%{efOnaY9GHK zPSG9$#RD2Q)V*mR#dYlDpg}vJCjQK5phK&d5Ir=drdK{@UFvw|$iU0eEhx9syNQuw zb^|XLPD4UwHBpmznJx3AtlZ^-TkT1?3M9_Ig12V}5;-oVjGS@!N7hxsu$0i(3B2_^ zzYWxw3LP(tbe4|eaB+Li31Q>>L^C3{wg%3%9#8w$8WqfsFb~G0KUT5?lLU@HR7ec{ zDPP1Jjw)#!K7O)*HdN>Ji;(_4ES`y z#A@?Y(&}BZ`y1B2Gg$BYZg`-@qOv^i5sJohtn3;>FT?PCCWMVK=M@u4&O^$nJVNJl zmDJv(&L8zKcR;l?;|Mxx%sB zF$(F;|C-bzaikLSQ3_D1wT(QD3|Bno^jNiid@{_<*a$_x8VOCRjT95%@iut@82C;WI$KufmPuSgyxJN;@ z_p_}7Dr8TgFW$zG(B%rZzb=f@3Zl}y6lK-V*SuSOaRxRM-Ucu&`}JzF8sZ{>WrUOG zLZ8mTFO)i)0!Q83%WMVr5j#rRc97uIMlLr4EB*xG29N>>H)3$)s4b@BIc-^cR>qz! zLnA-w;6sQ&co@UqxuL?0(o&)OF|7$=`if+hjjA1yXOe4vqA-Lh#4A}`7|VAUDMSzlsxbP_Uc*_>n=XV{#2lVPHq zlfJ?nnxBmaMW;mb=xlBkl2LVBcwq*o zAr#N^Jb~`|JAa^K!ti7mskdjo+sR9n32?ZY@++J0LYKZWakU>ncb%0D5|4XWo{5M$ z__Vv_^{wvN;OMg5*?DpF2|JiD!O#z^7b^fr?)qM!%_P9Z_q8@IZ07#uWTYBNC*HgT zbmdtm(wu)%HNoRoO(%8FqjMnf@3;Ck9-A+gNAL256F4G1J+df4nVCSA+B#?Df~gF0 zozmr{p7gN=YdW#s3H@ng0%Wc?Rxg)Q%9)Ic2NH(G=LM{~6DJetcHvGbC);ZVLNB#{ zgKJl1-A*U0O)x(U>*-q{J66&eL_KQA$;Y7Dr&uYi@x7!-6AHWa%0n)9>5zTFrLEx@ zAqR@ttBvnX7o*v?`;J!b$k82>q0^FYFuGYUteD3Op*@yLcAx7zqmC?TK(`3;SNS_k zCdE>XLg(j8IO-V}RKbhaq%@Qi)ZgF0#Ofc47)U`?&je;a!z{Rf*o%g6u# diff --git a/public/images/pokemon/exp/back/666-jungle.json b/public/images/pokemon/exp/back/666-jungle.json index b2ffdb768e6..51876d649da 100644 --- a/public/images/pokemon/exp/back/666-jungle.json +++ b/public/images/pokemon/exp/back/666-jungle.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-jungle.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4d8913bd65ce0b63c5354717532a7d60:39392afb8d9fb30f37b8d68b6cd368ad:c8686bcc5493911384853d54c85bfea1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-jungle.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-jungle.png b/public/images/pokemon/exp/back/666-jungle.png index 8e72fdd3af620769005e926961c628184cccdd81..291c6bce18cd69f25877fdbe7b4da7ab14c50165 100644 GIT binary patch literal 2764 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 Ao&W#< literal 2873 zcmaKudpy(a8^?z{p=9PzHqV?kCWpnySz2sHIgA{$a+vceq>)pxSjl0S$0I3+DaR-! z=OQdqNit;>8fi(+I>^s>`u(22et&$w_v^l{>wSH$&;9-5dsFOeu%aSh5dZ)ninBDw zZ>|*HBP6i-Mti23#n(Qhc!31>g=(#J?3!S z!RZ7+O=JHFXBTf@Vq(-8sJtv|opdB40VX5p|4AT@yI@W#z~Fo*L^L zeVzYtNFN22lClo!QbTG*MxC*H`344sxcd2Kf1SH^vlJ`?^7T8}*x1li;5^Kl3^?T$ z=oe^is(nx&ql458a8&FmJ1H#=G{xF!X{xvrLr$L#@M&pNR*;@$EeUQ8%@>8YaR8W2 zv3vmlk%Kt%!;U1v@N2)EG5tM%y#FIP!f9G(&>*b&>qa7r4>p`zEmP||&4Rm~4+ zh5~YZ$Chg`k6E9J?c-_7&?K34BsZCeSA3jlN^cTF9ilMZkg=xJ0|f@d%nFNw5q6gs zuCPB?F+1a+HY1K+H1hLB&0aLLxp&62VQdhi+2)In%J0Wpz4K@eD2|VxArKGwCIr

9Xu ztX4zsp6$XM@jN>J3i$xnM$$51i@!ZCKt%as?y!M7=JMEL{hzAOJxH~=^@CIAT)QJP z_Hdku_HFe9PrVqwV(&omqLsZbDZ)>%Bwn8OqNe72{Mu6gvzBokKEgD8_~@%BTI`xk zhccm;I5lrmI+3|jx%=X3al$&W9U>W7z`e1gJ>6Y_47xlL?loC7us0p%46?3w=GZ{q zcK98d!-QNInc~nmjfPdPQ13Nbk5HJSC2~8#P45`WH+%cr=_PtP0&fb55tSxz3Dp?FxqX6kjtkovakH& zPo?9J%+*UZiIzhqts{bT{$_(@DR;B9$oVK7LnRBdAEyjann`P_C*>AmD{n>I^EW6u z!gus!s!xdniD!ADhE8U>q}J;W37^zijUZJ*nh}Tk79s(Qrlr~c*dHB zdud51Wfgk)hD4)^gma>m?}~(`J`xXoIm}N9?#aC$Rxel|8ZR1wL>=Cr?`~&;;=9UWKimPH3fZk3o+q&?k$c$54L+1|1eFn(E6iVWiH6n>}<_ z_rIP@FF~GtT?IQU8U{+)r;WuC;c1;+okl;UhN$h6`X%L5#H9osI(z|RVYkp%ZO?ejn*kIeiE$UwKD$BQ7#sk1sIo< z-YJI_QpJHhO82~J*X09?A+Y-Lh0m>FcqjMj#mx9XtYXTV;*PtR7b5n_z%n>vZW{G{ zr|_AGoKphnU)un7U+LV5eFK+aEwkgd*_>|)9f>-?N;d}~enlF;wJ6+FDNcnWpAGuK zs<1+f-h~CsG%c)Wd?Hf$;VvzembNp$Vuyi8v_J|%B^MjsO(U>4Q>tt+_s@i511yAZCZ5c&&B{)6+Wb*vrDm^9~W*S*V#EF`KG$04?V_J z^+)76q6%CBNf-v|W%3*;)@plnfHLYggj~J#U^2h9M4%Kob^qWI+oaLDJ+< z^Zk?&yE5pLZmO9uZgwpOfLF}q$p+v0k`-bb!y|xXL4!0M5868p8~0>BlSgcj+1%iML%V z>7>x_D+A{L$PiG6D(*V%5U%d(sTm^Z`=}BG7ViHD{ZxoQ4#v9))u`lutkNj9=*cLh zXOrR5EN6w0w_Kh6;n8EPkcw$jw{b`X&bDMOh3+FLmyEs*b6RZP8SJf(u;Yhe z*LwQvy|}aYZj|=Ud*xOlmGQs_MImT5USHcidl&>}I0Wtl5UBye zE2OdjT}#3<*yp3vAx2WMy<(^3Q>Ha2UJen^+_48Z-&+xeD}iT~*{Wz5bSTGYXP(1= z_}w6|6}U4Zl0F_WV=ig?7KALl()QNMSX(r&nUUf*Y4qC+-uh)2V-7 zwRVCpXaDsF@R{T~;)@tJf}^6Ul(gQha2-3z?(!WDy4IdCAd`>Ezbd%9!o3@{Xr}j( z5Q8t-d1qe>q)ksYG$dR*+UMxnt3R^JxN6 z=N#xQ0U8o;8c4101b_0Y346^I#5_IMTV%7nqygyO20;^FC!MErh&Vvvr3R)vjPFhX)j$)RUYAeH9REeTIp^0W zof2_ix=8MdkM6nm>l&XqeqDyLx$SbJ-g{w3KjvNWjLu6uE55$b^h<%Xku`YIB)T}u zp2X}wPEaWQ`d5C-&m)*|t-6?R^PG7gXa7Hn+hA4e7Kq&jZ7A42g#PAF zl$4Tw!J82J|F?`Ph0+0aA4%E82UyR7ys%^T1E;dL>ZnxeVG?=_K_Ps~EPlc>} uzFkk^)$`OY$BtaknF1Y&>U*zU>5`eR?F|S3Ry6_*0Y(H-R diff --git a/public/images/pokemon/exp/back/666-marine.json b/public/images/pokemon/exp/back/666-marine.json index 6f4be700dfc..18edbc78ec0 100644 --- a/public/images/pokemon/exp/back/666-marine.json +++ b/public/images/pokemon/exp/back/666-marine.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-marine.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b061fec5d665439da49159647e0a7d71:7cac8aa51d4531fbcf0f9ea9bf644452:dc240f0acbf3d56fe8729dd1f703009f$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-marine.png", + "format": "RGBA8888", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-marine.png b/public/images/pokemon/exp/back/666-marine.png index 91c5b1be983735aa5b94badbf059664d8f02412b..9e644f0cdaa5f2de94c0965eac2e1cffe27f4820 100644 GIT binary patch literal 7088 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 aY(m;j5&W_bq<|whkcO&`N|mxz$o~LS0J8!B literal 2654 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 A1ONa4 diff --git a/public/images/pokemon/exp/back/666-meadow.json b/public/images/pokemon/exp/back/666-meadow.json index 737ccd7c848..0f24040bd0d 100644 --- a/public/images/pokemon/exp/back/666-meadow.json +++ b/public/images/pokemon/exp/back/666-meadow.json @@ -1,524 +1,118 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:49698fe6f96ff24d2fe1c7a365f79f1b:f15ccef05dfd7ebb03ac6c66ae05dcef:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-meadow.png b/public/images/pokemon/exp/back/666-meadow.png index d7d63b3098f745a00c2133cdd2a082078fc146e8..fabeb9730db35220698c0e8e8028a9491d9da21e 100644 GIT binary patch literal 2869 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 diff --git a/public/images/pokemon/exp/back/666-modern.json b/public/images/pokemon/exp/back/666-modern.json index a57b695d10b..e0a00da6d81 100644 --- a/public/images/pokemon/exp/back/666-modern.json +++ b/public/images/pokemon/exp/back/666-modern.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-modern.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:deb5b8b4295c15b4c8718bf2ed9791d1:bbe309a34a59a4e2f74eeba5769476f4:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-modern.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-modern.png b/public/images/pokemon/exp/back/666-modern.png index 689876c3d6d7ded05a01b8a56a741fbe5a25e725..01a3981dd9740fe7cf20654e8e49a1db20e4ee25 100644 GIT binary patch literal 2755 zcmY*bdpy(YA73srY%Y__HpI-WR%S+#Bomv4C9=wKR*YQcQo1R{M1?V-Tz{=a1*}`MjUc<$1k6@6Ypku2DT)VM<6P5C{Y# zlbpRkpbcQDo(7SX?sscG%SpwClU}Y)po$LNX{oW5O7Y$+m1=5gI2kMCavx$Ub@xvzAy-!S}LcIE&xuCGfuhx<<~FEi4Q1K@49(> zd&#|-gSoFpRS6{JwIp%B2pNr;|FY~O8JdY_lwx1z=vRqK^?!rVw?pOa6>L_cCJ=4iF&lTE5 zhkgxGOwW1jo@^|UE4(5FK2gIcy&8keFaDE>ykTz_xGyUE@Wa@d zL`~le=02@AX&8Pp3_f8(WaUBSbS9Z+b!g{yts3u0*KojSm^F5i+Z3xf20SG);l*$$ zeA6dY+53a@f)<|<@M2jE=<@T#!d3iV0PXUl{`p)q7% zlQg#kTSM+}frks^Howwsut|KcIhcGUZWQ+=Wjvf3{h$?bm5Z^#VR&eG*^6ZMV}LL= zQ{am~RhJ(6cd&uycz79CCnei3f(rt6k0#&VXk3wYJ&XyiC+ES;?Zct5!3Ix{I+UaJ zB@v3@#SGsGD&{uq554;dM=o4+vYFakB|EII@TXiwUabR8pX_pU5J>P%+evLrj(e@W zmV0o$CUJ&GYHx0qu_ z@Pc=L`^ADs$TITiu6Ly>p}LX8ipr}Ik6v6yd@|m%QN6MbHY%^YV6%gMD}8YdZNN0u z`(43^Y-T^215xZMEV&kTrIEy5|Mm?$OqqZ-8$Q1oa~v`-<{v^V`a`^VTy_tqf3OMK zY+!EJ2J#jdP8TVzIHp*ndijrxUw2Z-Tq0otU7x(GjAX;Q^q8;<7B1)HEvWpMM{-7) z;z^%3T?({y%1CPD*p}2Wh)Q%?2IelG$f5cs5rtcTl5M@(fO?=Z#{zJ~o2Tz@@dlNjZtg`+MKoUbis8sVP!(6ZZ(y&VXZb=SgjU5vey$ z@2^bodNs#AXRAV>%k?zpKxO;EQnfw49c&lPIc*_;SHr(Ksg%!U?_+6KqZcN^t4c?J#n2@&T zkZN(#2c-{pYDe~uEwYTucNcu=@T5bz!=xUq%BeRS0;}G64KHS2)aq>Hr%Ru(LXr;F zFR>U_cQ%3%?r>CXXo#2B zBDoE(4W2l_!-!65t~iUYn$xk}bw`c}s=sLsNQ9|F5=&ic?urFR7rS5#_e?lE-Qbb+ z_-N&9r&f+b`uonbeU6m^#0|C~OugnVmo+<$Mc-GIz za(!Xh5)OfOgV&f&g041XqpI`g;Bwg8g>~<|IM4*?Lw82za(Zk~R3LHhaOjoX>+4s$ zhUTl-%@qM`jCjllGgm&p9K}uQXmo{Dty=Z#6GZhM;IR1~v=fs4Q7+p|%RF7zp5xBtz5+3ufXtlH#GW)_yWEbI7ZFOkuX^LWeXNGb_$@{o9icRFbld)9O0oLgPyr0p$jTmxJ;5o10rF^C^K81q zbIwrfIp_lPg&VS0eFtJaFWhH{w7C3)ay7}C-cb? zRn6{1ghF`0>`kx~yXd>kvEW343NN9yy&i%6d#DJ)yPJ4l*&Ep&9Bz=vh~l+A1Mp-X zB$&A2<8u@P$*zNi3)1}C%?ZNu0KPk!{V+jB9#x$&NZ&N`gpLR!9ubHMO{cap#~d9K z9Ri46A*psKB#V&;J13xMki_6MMnVeg1b}}KLO5YFwR%=S2}82;VCOUF{C)!R5K4Tb zd^ZByljC9(NwmcP-_e|m0nScC?H@dNEBqt)lIE^U=pPLggJ&`(CKDNlrOaS1Ul34E zBH6#G-iD0>cy|LbYG4Y|P3N0%%2X*kv9|zxdkEo}%{&>+0`Rj^)nR^C&?+ygD(xn% zHk`$YeyFX>U0Y~xU65>!dK`-pai<$%n@M^7%s~JDG|c%)!|%07i%Pr@PigP{e*O$G8p1yEVmW>Upw0KZ!H z<@1nKG)XbOi|pv~VQKn47NZ0O;A6eC+=g1>EBo3+d1t5Qraq57NLIWlE=GlPYh;y?Et;%A$h&;=Cv6K(U+jKM5l5^>D6m HqO<-7t*ZF* literal 3013 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 diff --git a/public/images/pokemon/exp/back/666-monsoon.json b/public/images/pokemon/exp/back/666-monsoon.json index 3afda85f798..117fad03b83 100644 --- a/public/images/pokemon/exp/back/666-monsoon.json +++ b/public/images/pokemon/exp/back/666-monsoon.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-monsoon.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a24b11bc54be921b67b4376d798e05:f5358aac113e1f7af7eddf984d9692b3:637bea52b465abfb8e5a576310b4dacc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-monsoon.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-monsoon.png b/public/images/pokemon/exp/back/666-monsoon.png index e3cb4d2dca70ee4a40833a7cfb76116441d9417e..32cf2331411f50af3e4925a3f44a94820f3571ba 100644 GIT binary patch literal 2768 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 literal 3169 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 diff --git a/public/images/pokemon/exp/back/666-ocean.json b/public/images/pokemon/exp/back/666-ocean.json index f0785703906..8d23d70cd31 100644 --- a/public/images/pokemon/exp/back/666-ocean.json +++ b/public/images/pokemon/exp/back/666-ocean.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-ocean.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1a0079c64e9d91336d227b1380cd9d2:cf159e4653ad9208c0f4633a498a6cd1:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-ocean.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-ocean.png b/public/images/pokemon/exp/back/666-ocean.png index f60844a9b87d3834c5f16440f36338fa1065d7de..65665ea56c359a73ee8e5a910f0205d1d3299fd5 100644 GIT binary patch literal 2894 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 B{9^zB diff --git a/public/images/pokemon/exp/back/666-poke-ball.json b/public/images/pokemon/exp/back/666-poke-ball.json index ed04a06e7ab..45564e59a32 100644 --- a/public/images/pokemon/exp/back/666-poke-ball.json +++ b/public/images/pokemon/exp/back/666-poke-ball.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-poke-ball.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e744396a3b647429d050d678017c05ce:ec812f719dffcd362f0481d7d83c3476:8ec14f129d1691b8da504a13b661abed$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-poke-ball.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-poke-ball.png b/public/images/pokemon/exp/back/666-poke-ball.png index eb3053e94340735bcd1e9ecbfb775b7a9658a52b..895a2bf680f23119a89ac0460bdb939c4798ca33 100644 GIT binary patch literal 2983 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 U78e~1{xd^ttQ;+$m;>bh0Q*UK>Hq)$ literal 3532 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 R9sZutA@#4oU%{Mk{{e7VnnC~o diff --git a/public/images/pokemon/exp/back/666-polar.json b/public/images/pokemon/exp/back/666-polar.json index 4618d891d3f..abb6d0286f4 100644 --- a/public/images/pokemon/exp/back/666-polar.json +++ b/public/images/pokemon/exp/back/666-polar.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-polar.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a3b0453f2d03b9c62472f57a438298a4:81a5a3455ae0c378bdb1dbe3c3323463:eb7086e98f867c6592e4b161835da18b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-polar.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-polar.png b/public/images/pokemon/exp/back/666-polar.png index 5d09b57833ca1bc49ef895cb4e91b68644b17ff6..c7ec3ec550a55bd5253347d342460f573b2f58f4 100644 GIT binary patch literal 2766 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 diff --git a/public/images/pokemon/exp/back/666-river.json b/public/images/pokemon/exp/back/666-river.json index c4e5274ab6d..28912532d76 100644 --- a/public/images/pokemon/exp/back/666-river.json +++ b/public/images/pokemon/exp/back/666-river.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-river.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2bb6d375761e6690eba12cf4d2bc99c9:9db30ec1cf68fe8c1026c243086573f3:fa23dc87fc53ba2cfa532cf440553cf5$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-river.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-river.png b/public/images/pokemon/exp/back/666-river.png index 2910340b676644fd2c12823a123a41b4c30531ec..4e0493b8de555ff66a6fd3ee2b9be54d72051233 100644 GIT binary patch literal 2805 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 literal 2696 zcmb7`X*d*W8^;HO$ɯ}P?_*$KytB+J;zGG?sDl3^%eIQFH9vWz&^kR_q)vK%M- zmJHb{QBB?{v=lUhjwZIv?Kaxt`~LU-$CAe)qR0$?B33H-``h007`NF~-_3 zH1X#Ju`pgvBF>E=Jyzzn1`K@^rQ4EcH&Es(CC)FWq{29AN{ScJs#xuFmX;P?B-eYX zMqnrpFHE3~q78?`o>#luJK7PPU2u4ui>)@Xy;IoV%f}Y!>*L_>VHf0Pb|+OIg*c<3 zslg8c%PGiO7@~y)p+qM<0tQ2f35$rM)Xr<;2gi)CSO*upvz@(Z&p>5Gsk@z#Onx`7 z5ZuZ08ky|lLmN<0l=g9RwDR_=Z)}#85%TczbRckh~cUyr`{Qw|JxVwA{Q$F2`}F`ThAq@cK+VnKET2vKD8j5(L)NgA&!m8+Nd zWs9Lg_W9_vwR+Zx8DG za}C3a9;?qB6u^gyuSxVo^JE>Ch1ly)%=SZ(^0T4@fYa`cKBxya{u%13s=z*aE5KfV z-$jy64tra#U6SZshgxj~C5W7sqdX0^L7cvtpx&eB$W3E*hx~bc3kd2mZKebzB|RSE z9zP^VZQi0k7jt{A5$`Cy&zT}GkTOs-K9}p8t$b0E+%9oW$V~ZBXmJbh*7?xUI3WTwrLVlG#EQuQS?H>DR%HfshWvIbqSa~U-r13x^_ZaEg2<` zQYBdG0aYL6b^s_*<+~Y`M#faBRjXp!m0)EK@*pWYhER>q;@pLGBwOPoL2yi(ewmPS z5)~N0@hj|TAGNz3SU|<3a$^av9F}_w4Em|{kS^U1gYCw`sfftu_KhBgs@H698jrD#!eK3d3S~4?#e8D!&{P7h7F7qEbU@Ke8=*Pkn^nel2^Rb%j!Ah{_In*oiBdss zjzS5ch9#RwYraDK^Z`DkugL~w%`kgpcFW?yAWja#?ZTW%G6lM=1XrS0Op4OeGX`i8 zKFB+J>M-gR$p(4s&ApeDDZbi<^m0Rpj$A!J3Je>AB87j4Wa&v*#!ZvAxZ!#fP+85* z8$+uGk`1zJAj^;&2=6z?IxJc}Otn43`yS!`&{TPEAnGlP!U87sLwJ$Wg_8LZDOeCb zX%(Hf>e~SBax+sGltCU3ga}~)h-|kz9A{tl5|Qi#Sp(o>5x#~CcOH&>?!Xj}Vt}C? z{d925m)P#p&MpGqpf$jS70q@w2<2o!3%0%@+@*6Gqbcs)e4s^QN7ijWko6@yg95Y@ zb}_ch{AqiJAn*%F)Xo=q&&4e^h+Ur`MLlDKf5q=v_3(v@o_|6x?OL*Mk3N6B_q{>8 z4O8GnxOrRTC{l=CQ5iWl5hs@m=Il3y&=RM9ZBaUChTgc>`pVurC9Bl}IVRWzs6wru z%`g*4L$P6d`a>M9T=qhxL_3_~M}F#4S*w`K-FopwhjBt>AW{phUF8eq_IK;pw`*@l&b@PE zo-|R@FJ>V6Is&OI7`bP-EUlEp)BVL)u=X|xfq!h>-=LINq(sjFdap08%~GK(yN;5_ z-09~Q;q|G z?cPK$Kl7%fQN9+`R~KIii%g2kL~8cXNa7N1JM2h@5>DPaw=N2=5uOQqwdKAs$%{#<_msbP z$~!rEw86sMxfK%&s*3KU!RIj!1zc@wnGcbZpI^MWt3nZ%t$uyiq8j;m(jj`d&NZe^ z_tYOcK-I#K!$Cd=z4YUI!J8~x*1?mn3?UxpmX~^oa^+&^W#WW>^7Nb{@{=u2T87XI z*tj}9)rAan7+SN8Hj$_Au-*>{yv|S7q-JH)TXn=%^jPyXn}3)HLPic7wHSZh{dy;=NB~JTp(mAJF`hwN@qF67%1^ zAi!r@LkHFlN$MhOi23Uvs`?2B{yRE(x)2MftpIqAM1+>DBPg$&)PO9mBx%xA*1VxCfP%3@E|uaT19kySzN+c|SItK_!K% zub0w-%S}GwVpR}Qj=+t{?>j<&B-=lkLaraUsH(`CSYRV&?Tu+$U}tx!b@EZeknM2( zyljeJoC=Zk7jqL;qh`OxCbMkI?&60)o(iILE2-de=kHXH*R0uXG%;(TPj#gUOpEyY zfdir?R!_-|ZJW|l0dHEG62gBY!G!u&q`qu_;_z-S^%e__)Mc6WkNwlBRM!$d{p0X) z&dVQ-ycdo<%NO)rLrN05wy-?WGnGG{=M=uXuXKKbk=(p^d;&+0!he`Rd+U*>;W^M8E~KP#O723OShB@NF%Fv9qb0Za@oVe9nVV*dq* Cw%|+v diff --git a/public/images/pokemon/exp/back/666-sandstorm.json b/public/images/pokemon/exp/back/666-sandstorm.json index cc96c2a2805..99df25242ff 100644 --- a/public/images/pokemon/exp/back/666-sandstorm.json +++ b/public/images/pokemon/exp/back/666-sandstorm.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-sandstorm.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 0, - "w": 40, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 68, - "w": 40, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e35abed8cd9d0bbf1556fa684995d930:8d765a06a769bbf3d1639f361548cd6f:12f47e779927411662912d6094a9782d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-sandstorm.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-sandstorm.png b/public/images/pokemon/exp/back/666-sandstorm.png index 96d7084eb3014feb7b7d6e7b15fb57c77232602a..d95ab4413a553f4e0f9e3eb9b77db5548e8d8b9d 100644 GIT binary patch literal 2821 zcmai0eLNG|8{ceZY4cuU%r>i(VRsl^y=;s&ri3!r)X227`K_xWl`wg!XdzV6yhP<~ zUh{S}c_}TTsU{R7UFzqhkXv5vy7&Hb|M~sSALlvedA{eI=RD8%JfD-~v1d12-B29> z0KjQfiYEX7geb?Cp&(^{@4;8FQUJp|cRK>gx{W536AKTzx3f}eX=&l{_#>Vu4_8-T zU*AB6)2}RdKA&^*Dzzb*(_I|cUwdNqRZeSb>nR@LnsR~W3C}%VfYpDs_sKbh0D$^2 z8ini~k^NuhrBkDKb@ZOen>Tr`tcK~|fEaSLT*&-z*@tJ?V_y67BA}<6YIqOl{m!nL zwZcpUYh8Jqz!(qlL2J9i=!nwg+@Hg0iiL@rAl>F#tCU-5zg#Hjq(!{|&T)K>7$3UO z)^sAf)gHe5`M6E-rTn0A9c=ta9I4fw*b};6zhUFU>I{_j6)% zt6~rWUZPhcyowuMT7C-sLTgH6tF$Cb7Wz>V3T|4d=q>^|Xlq9r@g`lGY8$&YABQ=k zBpY`6KkhBGbS*uAUIW|M#CoR}yne?WuIE>sPJ@Lw%9Bf2Dk(x88;c)X1kj%kiw$o# z$SvDmm#_Mfb+6;f2uT~YG*2r%R@()I@5SI$XVHxSz|)|gVrmJBy^RHZetPBSb*Jrw zzjve;Q5Dd((U0m$Q>&T0&+|pD7$av%k-jJf>NY6LBm4jM?!Zv%s_@k}cQ>8hbed7j zqPmSSR-^p9H|>-ABW=dnNMQ7(JDtlDe|W1cEx61teJic|tk68}s({X^tc1n1^+dy? zoU5=?2ksg4#E0`ef{1Z9owa;|FV>R*`VV#3RrO}&rFF<4EYPY<2++JULd%B7kBk&~ zomG7VU~`>%Ivh`KT-0D8?&NG8tSH9jkeJy1yyh9KcEWs2+4(Dd_SU0MiSqutgGl4= zD95#nsxO~Y^Fo;@bm)3&pa%Z4=q^j-%+~#B-!6@wXNHGz5+$Ydd^m|pcSZVOx||{gy@tl9iP9{$=8F9?Sm5_wonD$iGi91)!FuMXlp=}jHhq+Kbi z-6j)EVB^q^ekFomn4R(7hdgJ!8~OzGSZyFV9}YcX7LM#}Gd*Vqr8rQhLwOd?j})az z7+^?W?X^Oupn{gw=lI%YewP|u)}gG8^w6MqR-->Ygmx9#s?F??cs~}E!i@{?nChvx9Dp28PQF8?^I^^&h5w&@*}<| z*^s+J^yr9xgCe={Mj!NN4m-DpSWzDF0nGgN2knvAlV~K^HRT~9R?yg7t>z}wLU_Y6 zcSj*~+?gCj^$;mb{i`l%y76sJc%wsW)fOgeVqi#FmeNUv_=v9%l=V8? z%$;fSg1`jBi$-bKnX#vbC+xgmnQA`~LEp%uJx&?s5ij}`5TsAb$g|75_3LmpVW+&x zed({eeWeVa`c)*2cb`j)l!Z7810={kC$ax(pNy`e$t)r{pEU+998ecvUDp#9Q z+~6z5XWOTHzv=%Dlt=H@K3cPDQ_T6(P05r9NZa%r{)Wo=cIXZjQ!ny(?6F;XfCDYiPFTHLV#=aZQ7XTU-G ztn+=6;^IZWYp9f)o@}Gn=ruddzP%5V9C#dkH~%cQ%;S69VFR7XAkLU5d9s{>=sN^A zX2i#J--Qi`rp9ENj}P*cbF4khF2hH#cIvQ+%YbgSC(a4elgM#K&(V$F*I$9|`&JG5 zC`@d+7EvRu>T=bu`BAtmtSdg`tvshjIj%lfaj-RK1ef~$Y|bcjNDiiUsb@^=%{TC@ zie+0C^uq4>wh;7RaN_$)Sl6d)ZlIOm{|9^f56n)v+shY6nU(aj{=1KfFK^~cpzSdV zGsI4%VZUi8xAHQoUO%~o&}?dn*rb^eKsu-%z%}d=-iJt`nYhu%)wYa|aBx2RGs{3@ zjFn~9TB!6VL`=`X$&k1-m)4*b0xl7{GC~sg+pD(_Ho#1o&)m<5={Im`5a|rciv0j- znH(&JpB2NVQY_!U7qG6|8*W;gu_ZcIPt9;zW&JmiC!$A{D>KB6R-6{o4aNivxy_9; zT-J-Dv6{CbQZN^Z^8#+u%XA4#Tbr91a3;}z5zFWpApNnIyyqv-&{3xxEM~EjkHqQX zu#zyLwH2sKjFuWqLNjt@-$(WxK|L@(B69G5QY1*Mt?!HfMSS_DhOd}z9OOUzf-_Z( zo+rlt>j+AjiE6^tcnPPglVHe(Hp*mLgZ*_b>elw%cE_wU_ zqC-u3qNo@4C8j1I;>YF%@UU2R1Ig)}89m_~=kJw>La=o12dJfU$Pg#H?P4uYxG7+N zlW{s0@#c(iN5d|Z={Q)*bj>#yi~9~n-T2-rU^mGAC$auASO3F1i@$m2zBXe*1z!BC z_;OOkh7CBGs-aIi>w4EM{MQ_oK^o2ruFP)R=^rElOS8hy2-wdqy<`~>lRNs3{!l6- zs2|Iw7lpJCR6X33nj7o>^0pvYRm!CPoA&;q7~3t3an~OxJzUsEC2QT)GwRb_tP3_N t(aM{6Dg)v2--F{PDiu=lMLJ+xL0iKi;c0R;GgdQv3h_K#*XDx7(j-zYdst z|32tz@3lWlY%Cm%_h(y%@85$32HI+PebpEBp(+@aLx;psGKVcqw5_cz?H%ns9rV4O zP5lGTlDvrYEF(siDFiCqRd!KH1;gs3u1u7=xH*f8OG=19f&*PcLj#W@B~0;nrQ^q> zU{DzZ9CJcJUFC$9j#eM@tdqOv-3;$QFSqH|PYMFF&LKX|KK_2Lo{kNT zExu;c%nU-<(7{CEN$=Md$&bbXQr?-Wcfs3BS9t_IV0 zy&mn|hapb&lp=C=?x)WmTs1%R(Powl;Wn+Ka+9U5vL~uwK^t`q?!UGZ`3&85w8<4} zg_6xdHGS23<_`r^7vBo5`qF3O_2|7=&0IG%V#e;fJK1BCp~jD0zY#+=r!9_!yN#Bg z)vXoYS!m5g@8thzFt2JMPY5R|5nc)J1ZcO8bZxo6{=s0Sthba6qb`_d6i=Y)y{=s3 zneX+s6eqCza%KcC04F|9U)pRq0`|DC&daZQ|FBbo{>w3EKoLF>ZiTu48T%{3MO3|> z5tM=MnWn5(n?kk<5eHV5L(;`wyblafJf`4<3cRj1BP^uBm!EF3+V_)HB0ORaHTV1Q zCVy>RZKSdAY!EaHopdG~Z(|%y^DNF~GF*erRl~f>qqq#8o{EiC@T2?PlXABEVgj}d zle!)0Xi1fO9#9Y}7*LOT-bMTzV`|LH|ExEk8-OCDpqO>FH*n|EW%o1}s%mScv{wYo z#%xq_&H*AZ)S$@E=dsV5g6TSSjYZ1%B9U~27`Ap@-22A|J+7%qmz-V7_$G-p*k!He zCeU1aQ97m?YqqH*a$#F;mR%WLnDtv2sk#>8VGw_(2B?8xI78C?RI^%?Xs+JU--g66OwpvS;}%r(@{}-7Q^5$2O4v*tJNuM z9ZQ1P+vvoDaFGk>N-e|+ca%MJhnGFuP>(*R^i9A(6L;Xyc}SvWEnKWkR~mfm?!miL zytpn{M$XNS?g(N0&d3n__V3 znneaBLrT8+otAQ@xU6FvRh**IJGT*bd2Fjhd2lOWteYp8(476fM@D+fyK+4INpwRv zP()T%mTP#0Wc=ypr`{c`u+$v3#+BTBR&^%*`#1rTusf2WAtS^FB#oVjeqCCE`-&iz zy9x|E9OXIXp?L}+UdGcS4ibvWZ~B6kpp@oGG7-&5aKU~#;s`nqe~9vfm-{$$P7&7} zSwok;)rfE>nZ5t^#JmD4<2t8t*pYUmLcNODNU41Nr=E_z-BhQb0G~sudCPcMVPNXa zNyu!|gC5J;Q|fO}#c4-(q*Im!>Hz*FU%WnVotzp4J-1c-R>S=^Z>G>_p@NO3&g}rP zLa~Ox51rLlQ$}y#s2>97l*$x0kW*^|*x5=qNyy|(p&a;*_;9H1$E7PxAte4G?~rg~ z3!G#G?{I_wm!|paAsKF$^w}#pOQa5uM(v)?M$d;57dm7T;P-EGed>Lw zT$|pjzFV3kJSWA}eW*?CinWfhe|b_Fb8F}Q)+no;M+BM8gJB)B_UMNEm^~nMkb1BZ z^uC#P{&u72l$XfUo$_p-@XC|@N7yG232UMi!HA4*q)lDE8(Uw#Vlb^eX6Pe*#Pzkl zg$N7&>hLF(rVRV$cPH&qZZ4QK&ZkrQ_p}1JqNfYH`$JscWMu&1aP2`JxPaHo)}Q0S z-DNEmuRHdH?)lt328LHa=*G5xNIdHN(_f}*KJG*UvE`0fijg&83)xj0ym&1^&a(pE z49_1{TxBbR23C{<79M;~|6^BTsEA6;3I$d`)B8G%NguL718QsKS04?*ByBwDASty^ zcoD7=7e^(~%TkxLp2+b&!_%l?Nr~fyTEY=uou2X1!H4agtA&n+k@G3+xT+${k?5_^ zncZ-061m;XPE>-dv1+P|^m5eP{quAQE;|MVSYnF)&5u8>jPvqM-mb&qcBc<^m&qD> zT0SFxV~+rtyy1MB$gXZx6teP#j($m_!)tSruiyQ=aD7t(6lf-Zy6o`$X^_@CrxBrG z*?>P9+VL9aZzX^#kG{xO*lV(hoB7aoh`(pmZd-_nukR0QUg}2vGyu9@lEQzPBu8va zw~53rHrU18mUT_Mlo4alZd*#+21_TFNj0-{MCWd%r!fkaE=LOTBDsbQ3usg!EyEjJq0!)1(MoV1Roc!#p1_+DUvT)xI{ezOqjIGqFtI&Q}H9p z<+soj_|s*W*%hwTwd65e-Zop{TnE|rYnVFU^62I4#8WfPxo2`A4uy%CBi{=P*dRvO zxFMv`&}nY?3f|&N<3Xi5<5s0m%fwrCk#abfNqncf z|IBi12vakO%Gmzl6x2MZHdW8^^i|jKwthG ztj}_PcI~nbzaHc3i@jt?k4g1Ms~3~}eYF#}=NXJA6-5Sd4rjUw#{;xB*4&Ouumm(W z_OfG^6wZ{WnLK=K^*u9((U5!EXAZsSJ0iKkuREn?a)kreb6^Dy%=ZhP`43y^U$)F+ ztBWu>VQ+=D%$(GQT%W#vqgMm+K6A*$x$Bq}NJQ9k$!M_dJ-ujYW>0*jJ5#$;onzvKv?`Y9_0%IhJQQmd81kd6*T^U#bWHsD7u~ zb13_kq7h+3zw%CT^4_SLcye0r7rXFJDo6i2^}l5#A}$X~?p!GOrxxXgGED9fr>#Aw zEl0PVdc&fReH-SNN#->8;;oR239{(xcjj;;INd0}Hag3Z5;?H=zl;8k{O!nr_Z|1y fd)~J`eKhdAp2JG*DeK+;TmlHjR`@zYuf+cYFIYhR diff --git a/public/images/pokemon/exp/back/666-savanna.json b/public/images/pokemon/exp/back/666-savanna.json index 8f85dfdeb13..8fa326da1b4 100644 --- a/public/images/pokemon/exp/back/666-savanna.json +++ b/public/images/pokemon/exp/back/666-savanna.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-savanna.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1ad0c7c841409c3fd4cb50b399d6e13c:b9406b41d37bc72c57260f9a01a352c8:625a4f0dc001069326a75c6a381f93e6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-savanna.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-savanna.png b/public/images/pokemon/exp/back/666-savanna.png index 7254d0f1f61843b357b47402cc9fbea74c812d0f..4169b1325a6a3cc410d3cb6a2d3abc119e66b793 100644 GIT binary patch literal 2850 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

RgGf7y($HbNjM7 zY5ya|X|_2wPcBmEp?sJL)oI?6Po6Ir()p2X-p6UZ8k0(BnoGkWC;WFN534@TC3LS4TZVXi_u>F;HH99rHUd z?v}WnY>Pw^AiKEjK1E?mx5N5;FwYygrYiTc!J`9U#(%`c7z9Jz_6=C<=)ccH4Oj#*BlQL+--Mm2e(G|f0%f5mzK71))QnW zAo{VdwchT?f$)?|YK~?^`Q3&d2n?@JDnIeR~AP5W_L`{H|05&xdc z%(^;s7tJFryO-~D-vMK~t5M@#b?6;s$9-VBUM_Utwt$yAw8=IY7)kD>3Y-xPMUNnJ>Mx^=zl8z zP-NL1Qpo;Gp?rv+o^yyV@dsbWj^_YBto$&Hh5rxZ-%Mml<;VA<`L{wIT+O^(P;)dj z%8v-qjK(D&q#LCS7S-RUbk(TQgVE9?>kp5qtCucIPCoZ1zjOVSAN??<(Hb?eRfjV! z`x{#=`*Fy{T;%3qMk@CXCCl>=8K?5+Eb)U-@#Mo9yWIohV|dh`)`^1_nU;3xtmk1P fuWg?tW!G>%Hs}~72jsc`M-RZ8SYhvDys7^OfL-%^ diff --git a/public/images/pokemon/exp/back/666-sun.json b/public/images/pokemon/exp/back/666-sun.json index df795f0ef0c..d41f22f541c 100644 --- a/public/images/pokemon/exp/back/666-sun.json +++ b/public/images/pokemon/exp/back/666-sun.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-sun.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1d3a140bac5951725915aa0b64d1fdc6:e322510cf8386dcc7834a05d57e5368e:8f5fdd0a698701f5391c5a3f67e303d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-sun.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-sun.png b/public/images/pokemon/exp/back/666-sun.png index 84b9d76ef88708c273f2b1c838dc2e8487b4abbe..5cc814e82d7e6bfe3f5dfcf57e7fa6ae21d8ad62 100644 GIT binary patch literal 2859 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 O1(2M`j`jA`LvKtL5HI?jy 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 literal 2813 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 diff --git a/public/images/pokemon/exp/back/shiny/666-archipelago.json b/public/images/pokemon/exp/back/shiny/666-archipelago.json index 5207ba45af5..817696f70a1 100644 --- a/public/images/pokemon/exp/back/shiny/666-archipelago.json +++ b/public/images/pokemon/exp/back/shiny/666-archipelago.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-archipelago.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d3b3934e858033f670ae2a24ec4d347a:f014942f9212da6fadbc8a0c94f2dc11:80cdb6dd219378a41ccf5c2acc7e7786$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-archipelago.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-archipelago.png b/public/images/pokemon/exp/back/shiny/666-archipelago.png index cfc3f0012b64540f3020984dd70e449303bde79e..ada5bd02bdbb22fb49ffa566c98ce2df3a2be43d 100644 GIT binary patch literal 2776 zcmai0XH-+!8VwLqkU$7EgiZv648(xo03szoBB5i54Z|Q16qKg)Q3x$GDMOT@NC+>2 zj2fkjlmLqKs#FI=!&9V+I3SF?;P~ggKkxpy-*?ux&pvzYyVtsh;o@Wu6H^oe001x| z0q+I?2!RBB21G>guB`tHC@4Z)~gXZ~y=?3nJdi zBeH1u?D8+=_YgIVioCZAf2;oW!rn#%X4-Hpbd|VAFlL_=wN3ZKof-XnruCV8+nyBB zM5J${km6Uv&TcyhS}3yFalHCtF`%dSEz4BtPx(;9DdG+UN;D!;PgQm^#oAAvCZX><4Ed{w6$Z7UrXy<+G~$S;Y&F-L^6Wuz|p zhB(Hefy*D9^LDV>%rD8#+S`h%ozk7Y_z|52@VlDQsZ>1+fjQ5wN)Le34M2b@I)7#R zepJ0Dza={4@-Fz%ViZzwN5k73a}O0Ca7a)pQHy_zCEpx1 zt@ZAhTE1HM0Do+g$2b%81mchGHoBY*H_=1q_(%d}l8htSc^_Rbd5p`d&I2>P22PU; z|6PyN&$%G|9<7dnAsiK6^?^5@3D+j^jcNTAo`DqqCecYI$!|#QP~dwFmd8~@`4G{p zQz&w-B`5=C=K8SKX6%bkzrTw%0~0~u=%M2^=05=1L`;6M3B6l4Q9CS=9T2mwhc18> zqen#%%BB}!TYbqx*d*Ass>!8Sfe$L$Q^KLajgOHvglxWX_awnQNpo$h0W={l@qC(l zSx;`##~oE+Y$ig??MxP9+=YmT1<=74|4hy&Uwg>AT9iYd;aJ$u2hnnmrX9J@g@pK* znvi5>4}^?3;$yEBFRD5}MrK&KDG;Z56V%-^hNv;u8N@q1XaleXvCbl-`9bvUM3nWb zc^-$df+Li4Y~c0a=bGLRbgu)+35FFlDDlksmwO@k7f}eMmsE6C*=M0gkgMFjWPXM9 z@pfrpcPmLd%@7$;ktwXb(kLvwO1yZ2(3yW)u77YYB-hdk(zjhn2Rn@iz1Z~U6#fx@ z2{f1sPfNWs3<~G*hCo2XI$l*io@N#>I8RH~@GcJ5vKFqX2skn2-7Ut4eH*-U-17HB zG;KqL6m-N0Tb(L<*r1x_a$bf97M7I=GgP3LFX^O97^9CFNvTrSZyX;x=9NRo$Dk2) z?4r!IE^2_Zs7JFrdsqB8)_R0@GVV!?4B`d!Hz9V)tE9BL zUz@!g$V^6>L2vKG`8Nv5Kpco~o*_r}w7fMx;Iy?JfAC(b*QVs{OzT`!fco*_4iU;Q z`CkoPxBb^iPe)wY*-A1{x{X3`4NJeon_VX*xhSwT9v$W;tMV!^xc-nBtb~0OM_Et% zs)kORD$OOEZWzek+{qqxdX|27=nbI)mR3rKJ-IC6svV)YMHYHE;Ex3{LM_nxI-$13 zQ&g3+xzj(zUN3BNqabG)S905C)fz1j{x;Td`%>mt*$*+p-|FgIf;J9u-yTS7T0eR8 zGTM4s>fVyRqO}V4*f`;z@joc$!t9JFrG+zLvt5SVH=8P!)#A!5>FUF{khud_4U?|V zwNP;zL~%JPy=6|gWx0a}PH<22CbXe)&bq2Zb5{6`^^oSzAArx*<3C}B#`%+@7wL)x z<((b*PD{wKJ%#Ssp}qTiPRC?1hU8lovY63gJ54ud(caH@hf~Mgc{r018h){oT7U{L z(%AIik|Go{2?Fr{gI)OnD-^KZ4_72HS#P5?DOzySS*|$v1UqocNHOQ4-Auy;q*|lA zJl(e)k416BnckLGJslJKGf*!;t2gmTvm!=XYo6`fLq$p?V(;j5aE4Po3@ID}vrz?; zXWt>i!(mb(zlNx}$}jS8778Hj!a_8cRD#I^_pX(y@#|FdGwu37F;#y6d$(RoxqJNy zVG`NiY19HSof9EyMENNm&bO=w#ls1m0rieqsi!76vZboMJMNW_;#L2IF&Ps$3P;FV z=9Zo2Li;H$>4n#O2oq}jM--QIATdppFp-=`MV1;rmBvW_^tnv|Gb+rA5+%$elewh8 z!0}uKGF04{~cTiCRFTJ0Cj~7~Uud@>g$mVvm*D$kl-3zb2qF~0#hD-WJ&E6O{`855YYs3fGmf>O zaLfe8f?t8wsRjDk<*=9UA;bG!g=GFU3ZDLbdtgOfhlYUkj=(#cW@WiXYQZ-nMWU*% ziq1bRQnf^k*_dOed7;yghpQih#JCGtNuxb8smQRgz1?fvjHpLQj37|} z#n}^VsY)`pFI-?9smCg6N4He($H~|KNphHGrd|0Dwci!Q13$8;1!nsw7j9p%AhXdr zlm+rWS_TuQw~vN0a|i<7o8aDE&hYLlkxhdwy~{FvE}%`pB@;ljb;3WerY8Ic4n69L literal 3018 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 diff --git a/public/images/pokemon/exp/back/shiny/666-elegant.json b/public/images/pokemon/exp/back/shiny/666-elegant.json index e4372fe6e79..35c20315153 100644 --- a/public/images/pokemon/exp/back/shiny/666-elegant.json +++ b/public/images/pokemon/exp/back/shiny/666-elegant.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-elegant.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 44, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2f5780697c633c5f2db2d90012b0bfaa:3df5d06e71f1f48664b1d3f70b589ce5:d6b035048c66474f6236a3bc923faa7b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-elegant.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-elegant.png b/public/images/pokemon/exp/back/shiny/666-elegant.png index a63ccd8a4fd657ac946588a31fdd1100311ff7a4..f14933548315719f7b6af7750b3b6678803130b7 100644 GIT binary patch literal 2799 zcmai0dpy(YAD@{qHin|Jx%=iQON>TYE}P3%5-OHk(-}r4N<(tnTsDWAtuWn0hD6iN z<#3p!n7isMmo83JI{cCpUHDC%e|~@cob~HACm(vaZRM8ae8RCFa?@MAc!wL7I~-NHDUlA@ zWYkyb7&AcsZi$e{qhu?x^v&wG&)%95U*2>mfXHiK;87pIa7$kJ+8FZYqD2sp4&MT9 z(*E8R?>BM8pV{!0%o3ac^ZY!cntYEH)bt1AoG<>Mpa*9D2-#1aeOQ}Nd>I!&vs;rcV>oUKsM z?>SR*NwbS%Dd%<86?L`k!`S!J1l4?`0{)Oc>C`$HCw2F@*OM0en7gSBx(mVm zr39_{*sRX^SdI=ANn}PFq_81wgWGY_Wr9U1QIFTLn zoHRkJ2()P|%JgwR& zZRMN76HgZhp~N0&5^%E9xAnI4W)o6y0~`&AnOPM%YgZ};8qmhlMlgY%48 z)#Mo)s>Sf{D>qR^ojz8IcpB7M=Rbrg!BY^|JaS;+&z%Et<}3dE(aJwOj598@Q>>ES z1Xa<;+TwZ-Za1@Z9H_a|)?p2Y(coRl8@61pYxm1dc6j+(dAcgbDd526_6(cfR_ zn6 zU)rp9NejpGEH8hsgu-?A}G`4jFB5r;ui3*JS zJcJtXIp1y%4CS1=H)dDusqf@p%(+pO(k{RC1nec(LBY&e$?9L)&TrW;II+XwTKgsM zUzfl2)z6MYvW>Z3AM(Q-UV>X^P3g)kVs0o2luxQN&ornmZ~3TWyvxvws;6Z>z?yAo zNep0kn+nb*+K+H|vcDLbE~CG+Ek3XQgB8{_Gc50$N9g-!>ZrmMThzH`3(7PBmA`9Z zJ?6M^zI(--YT;Y2a-TKu|AX!M2|FogyLQft*o{3EbQB_muyWR6Of!bf(c9&8C7O1Q z2ceX?``uKbm1a-&CUzLan@1=vb}#qsqyAD#6N*IVJCD=$?Pfg4|1-DJGt8WPo6p`otBvXnRRZ11^Fo)E0B5k8^*Y_V2d!lI8t=bsv z`Y^GlqO19)eD}Vra;lKmI;e@!jy7k71sM6B9j4nd>{SXC!tVu2utOaiH3}m$9=3q5 zGKe-5Gu++U23FYNQ@nNTF!{4N9wyFZhKM~AQ28Yq)d;S3t_0hMF%sYG<^FCO8*KUj|MON6C5xQ+kRU-A{4>SH$<4>{iH9te7LA%O*j+qD@n@SBZBNydzNKpE* z(W77qb|TVt^9lbSRBOWg;cocX&G^?HDE8DP)y_z;xGsYA+PVE7Q-wLn!=~tGh{F1A zY#&vqs#0Rq8U>Nc%9j?#B-l^)!^L^U?uxWi7IK9JNU&$rBv_`e!R9f4g^T2$VwPw8 zqcqfhX3(4Uvqa?d6gwqp&>HGIE3EG7P}QS75^T}194(>>cdw!Miu2s%g_MG)Oxxv8 dH^fw>Da^@6JuJLb7UX|V5ZTSkwT?h#{TE;m2Sfk> literal 2960 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 diff --git a/public/images/pokemon/exp/back/shiny/666-fancy.json b/public/images/pokemon/exp/back/shiny/666-fancy.json index da0238946be..54113df4b51 100644 --- a/public/images/pokemon/exp/back/shiny/666-fancy.json +++ b/public/images/pokemon/exp/back/shiny/666-fancy.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-fancy.png", - "format": "RGBA8888", - "size": { - "w": 133, - "h": 133 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 41, - "h": 67 - }, - "frame": { - "x": 65, - "y": 0, - "w": 41, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 41, - "h": 67 - }, - "frame": { - "x": 0, - "y": 66, - "w": 41, - "h": 67 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 65, - "h": 66 - }, - "frame": { - "x": 41, - "y": 67, - "w": 65, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f6d28d4fec94007c70d1812b69e8c9a4:cff02079419826e1cb2148e331588d89:6d5edff9a806f43feff031c9919c9aca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-fancy.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-fancy.png b/public/images/pokemon/exp/back/shiny/666-fancy.png index c84443bbe4ec54e7ff0f04b6c7b2b7892f183835..6a50c5817a842a41fba63eb330cdfaf1b1d2503b 100644 GIT binary patch literal 2967 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 bbZ@<&FSpxO(`+8*KQe&RGu16VizogM;Tv+= literal 3067 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 htsg8_&O{yo_L-ns&mUxo{`eCEFlha2~l}mCx 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 literal 2688 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 literal 3203 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 diff --git a/public/images/pokemon/exp/back/shiny/666-icy-snow.json b/public/images/pokemon/exp/back/shiny/666-icy-snow.json index 4922c7c1fb6..b44f33bb07f 100644 --- a/public/images/pokemon/exp/back/shiny/666-icy-snow.json +++ b/public/images/pokemon/exp/back/shiny/666-icy-snow.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-icy-snow.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a19b20c8ff121729b5b9dfb470e1e166:abf786c03cda88b39336d9172fd788ec:fb1e8b97806dc5c60ac6adf0ae48199b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-icy-snow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-icy-snow.png b/public/images/pokemon/exp/back/shiny/666-icy-snow.png index 2ba96cc9ac348994622c1f86249d267298de482c..1fe8305f068cda4f7edc4c8eb461dad5571be44e 100644 GIT binary patch literal 2769 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 X7!GY;F7Xt8FhK-sXR9X`Wcq&q9DWR^ literal 2803 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 Vy^7RH`{k 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 r>q91gTzs literal 2808 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 diff --git a/public/images/pokemon/exp/back/shiny/666-meadow.json b/public/images/pokemon/exp/back/shiny/666-meadow.json index 54e872aee05..2c4a73b80cf 100644 --- a/public/images/pokemon/exp/back/shiny/666-meadow.json +++ b/public/images/pokemon/exp/back/shiny/666-meadow.json @@ -1,524 +1,119 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:217e1d90eca71c8b95407de1c156a5e6:e2b23be3d14960d78059a46f5b83304a:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-meadow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-meadow.png b/public/images/pokemon/exp/back/shiny/666-meadow.png index 2e8a64be5d458e872f3b0ee23596ae7bf4d31b2b..1148fa5a620b3cac609015bea44c2c5a0a5f2a34 100644 GIT binary patch literal 2869 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 diff --git a/public/images/pokemon/exp/back/shiny/666-modern.json b/public/images/pokemon/exp/back/shiny/666-modern.json index c60078bd8ce..e0a00da6d81 100644 --- a/public/images/pokemon/exp/back/shiny/666-modern.json +++ b/public/images/pokemon/exp/back/shiny/666-modern.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-modern.png", - "format": "RGBA8888", - "size": { - "w": 132, - "h": 132 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 40, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 40, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 40, - "y": 0, - "w": 65, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 65, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 65, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:854759536c0175b34e9ed7b2513e55dd:9fbbae33832e3b62152c5bae85714a7a:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-modern.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-modern.png b/public/images/pokemon/exp/back/shiny/666-modern.png index f9654fbeb0237647d00251316ff580a71490c749..d9f109c8ef942541584424629da41a6ce5cd8659 100644 GIT binary patch literal 2755 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 IPBiBK0G0>*K>z>% literal 2794 zcmb7GX*3iJ7gj>{8QEe?GxlXL6UB_Oj-AOEVzQKd7*S0mypnY=GBIRVW69QJj3vFi zvXnJa5@k!akg`*j&v$yy`QAU@`Of#_-sjwVp8MQ;&$&Ntf(^!$pGSg+jg5`p+zf4d zh%x`RTZ~xfe-~6V1WVH45%*>2FvC+fZOUt_gXOF9`tsb|salGU(Yl2zF zShut_k6W6_3X52HGfl6R>jnQgJ?`_O?bU?~){9dYm!{mSs%y7b8~^}-pS?pc$x##t zSR1qgi-`PO_3kq>B{^RZD+Mjv`|`b zIQ(=(jkAMeUxoWQZ5?l)%XmEA#}?w`b#-IHS49FO3zlq&D;hl9^TmQ3PG-LLpNCiepl7H9&KKpexBazeHfeN(u50cyz zi6f&5sK?SD-6UsefxvN584w|U|Kg{{wz`^?Vq;F|fF)Ue6R!0hCztoGg`lRjsb z{Hw$jE>1ia%3_wY?LX?^ZW1?^X}xF|Yja1Sr}F4MS|{LAihx(`S58S--IsR1S`^X- zW51H{pqAv1;CTe34D%b*`@oNh6i}lm;>W(RBlWKnv|On05l?s8aB7?0w+jOL55f`L zul;!F1nz8WH>YVx$005hq;J>z>pZ|0eJnOb4n>U> z#8QM1$62#%UQ5xk>vS}C!x%@Y;goJGz$=6r`TU*^@Ka}U9=P^wnj+z>#{49cFB!z!$Yu}sg~IW!zPh(Kd1v;`v(U;6&C58Ob&@} z#Lb%Ta)2p?lyW_r*03uHB{I?zLHLV|{y4WBR%OH@F1_3ff3Vk4FvieXQjkT-YkVN{ z**VMUCVt*ZZF80VDDE-&%wGvCCTg0dy{gR>e`BYi(Cn%PbbtpB?vJG4E}rh4Q>#lh zJFYqn?N>j4b9csE3iF&2$b+A~(Z4)KLyN^OR`zPnXPTA$h@}ET(Gf;f_k=4TX-WWwyL6+~O#IuQl;9&GmZ0=Aal#}DLZBc>& zywR&V%BT)zALYBa>hv8V>>l@oi{^Y-X=JHWhrsv?*G3;gi-Q{Q_McXBQpMW zIl;7~b*mxB>BRl7sG&S;T-49Fx(LhaDjakIEkx$^Q`)W$-Iy?Ihh^IgN zSu|ZfWnVI#7V!?W9DzhrfJJ~b6<4o9MAwO+50MPk<%kHgCLK`)pI>;s^Ih?CG0ZGr zlU_cE6{8vVD3l4f%d&=&dd9@=SMi@1r4zr;#vc0>d@#ee_WY%o3@9)}F9^*=TGPl~{1*_P@yO)Y>x=4=N zo`={)srmypD6B`Gu5;rCcFK2eXK9ht;K>*|L&|d4f-rjBO9+bmB!uWoCCGS0YahSh z)>4LUq!FHvw+gC2Q3VnE^Kvm$;;qr-!M^(ha>GyGK83rnx!3?tq1OgOMvT|>w-iM5 z_I7u^%*4uR2b>Il;zZ9<04jxMvEwjDPtcwcXDR+XU2PbV-p^$R6ZrQR|UsGP$u969>$N_S$bsX!`k3}3@H}zn@y7@#AUEb8B^}{{0eJsuF zcD~=iX_A&oSTLmNX+B>@7&Q4>_H4e$dbJ}t4pquw8UDb-USlz9=}EwBN$Jc$Zp*68 ziSr!@jLa)+e;J{wjoQ5v3+4;WBkA%t;ufUEnX9}ez>_}H40y8f-Uj=8MQK@~fcvJR z@K4T)r-6+`-i^Q55~9Eb-i&CeJGMp4n4;Y4NqN4`*OXb3m{c^oR01`k>mVIe~G2_{dcax_&1M~^t;iV=xF+dAC>=y z-aqAs@Bt_Po-d2R64qFNnf*T_|Cjydn#)~Fbt&f)VU3=W?;HgjVPnqhb)>R)7Z BGIsy~ diff --git a/public/images/pokemon/exp/back/shiny/666-monsoon.json b/public/images/pokemon/exp/back/shiny/666-monsoon.json index 78130a47159..117fad03b83 100644 --- a/public/images/pokemon/exp/back/shiny/666-monsoon.json +++ b/public/images/pokemon/exp/back/shiny/666-monsoon.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-monsoon.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dcde8c849851ea64b2ceed92a82153e1:5a97106b9193dc2cda01b0448d9f2637:637bea52b465abfb8e5a576310b4dacc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-monsoon.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-monsoon.png b/public/images/pokemon/exp/back/shiny/666-monsoon.png index 5d87fc101a8f6e5fec9961c8a871145322ad1a1f..cc5279545d553ffd260e24db46860e2076fb06f7 100644 GIT binary patch literal 2768 zcmY+Gdpr~BAIE2A85^6FW^&yRNo>QY5Odp3&Pd9T+L5`F%ZfF zJZ^&AH&R$wc=s;<*|Ue-&!4BKrzMg#7K5@W4N#8pARh&6{@<9+y3Pjx6!0WRd(Zfi z`4gFOm90vSnncTD* z4x4lTJ#;5m=-w%NK_y&mPb{ev-8d>RK;Mky#16 zftD$k#|Ov)ShNKM=7_;s!-vp8a_}6Q2sp*$r+}8e`sRVo>Xm5#NRqv9&IPrVrT3G2 zOSsz12h6?r6S`RQ5pa8jH@8|%av=(?fO?eYWOTiHyESg#V12)KF>vyo5@(td60c(T z4YG`QYlC=2z28#jncf5XOG51Ug#e1m3)nN`!KGwh)qb!EX*=&3=y1$tRc0{uk&~4k ziBC^KpS?%m`XIl+XJm5i2HC#4{a|6F+k4oD@(|2pf$8v-t z@=wR?#9yFu=ohiy*=T-E-qm%`W59>4!*;K*^d>|mvWW=n-OZg=fDDnB01TyVs8+Id z%{)B9gm~|f1-I`KnL7=Hob#pObCS|vLAF;9!$;n#KpMyO_oE;!f23NluQ5M@SsNR> zNf>;WxEoqYQb8G^nU4?y@2`n2{ng=P`F(`CBAoE|O;v6U>fab37h!z*wVH(EaGI? zM~}e7ZGH>gRl4?imS_qh0@g$v4J?B3m00DiX^Vo^6`w>)sFn4(HXE!KDKv$-xN({J z)oeyxk$`eN`1L-!sU_+4zx_mq>Zzm3{#;oX3nZsP5CkCyXLTP{;=Pm%-bzl~M&HMO zcL5!#S#C8e3P)!XHW{Gb_ci@yK};W(53d2(0+a8jIiMw~YN0*#WoxOm1cBI)~l*JuoQC8u_y(7;ZMAplo5c<;q` z=+e2TPSY>+u^-l$?Q&z0`L^`|DLA`ix6~`2!X{Hk=QPh~J9THrcF+NDwSJ|P!{Xf?(-W=c`UYs4I((uKzreXhx~d>rsmoj z5l4(P0u7`&J`d_R$ok(?gQcdnB5lZRIFt4y(tUjl0y3cA<{Tx)Mw9h3+>CeCR91jJ$S4L$w>ByacvK)4FwDtBxs`-eV?4Z^WrqneB2d_Z&Ov znHq-={%|MKp;FUkNLZlT(YSyQ!ffLx*ybq8A79MGqup90tF-I+ai0H_uIWI&!?+*y zbWr7}4B->8F!T45n|oUV(EgsH5w!z1%3yuIkRNZ`0eXNch|SnSdX@iXm4(QPkro0EU?%Gxf7Ds-e1 zFcCVr;1q8(Um(1=p~YD|mVJP8@Y^nkA-^EzIdjq`4u%xMUkZGSi_NOZZ|zmy`cdHC z7l+-w+-#r7+u}#)n%u7RD1`2zBk#LkX$<9bLDOJQo&FlW=N41{D^;CaSSCE_?o}H% zRzx=B>p*N(QN3*k9;@95EBlP>Hb=kBGF+(c*(iJ*t%W#0I|S)-08SqhoGJ)1y#osk zdpA>)UIz7C5@8rv%h43tazGKL z;=YXTo|e_Ao9W@yM9Jo~mV#P8i#8Zss7v7k6+ASE!)b9wiUS4DQfTtN;ND?-)vibU z=R|ST^K`cq8n7A43t_;!Z#`$X4=C`;KBZ+-k&QYUZ~E=4DU8YpVvh%!0~m$AN~0E0 zb#}jLj)q_JVx&e83o3bL!wBQ;E$7sYhk)Izv|GkEv1omvCJAQYX|QmCt3U_0sOpHX)J{OT=PL5( z_|I~^#vcefjfcQ8%ICW-g$gdWl$la`#O~nU7-m;ECfS&g*=U0_9+FeJFB-Q0JHe2` zS44-Vv|$sytksN%ik?_4W*}xBEQx6RE@gvy)m!z!JSnioW3_7X?#@1 zemmMLi;9dMIn>NFx&i7fOnFL0; zZvE$NW}KyUvJ`l2xj!jyw_{ltQfA0o)un2lR83*gBBg)~-=r4#ZUyO6oOPuwXe#r* fkSf01mRU8G{Q9BGQwh-^{agY_PGrY=0+sb2SU3Fd literal 3127 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 JC{?!&|2G>*wGIFP diff --git a/public/images/pokemon/exp/back/shiny/666-ocean.json b/public/images/pokemon/exp/back/shiny/666-ocean.json index 1bf44996eef..8d23d70cd31 100644 --- a/public/images/pokemon/exp/back/shiny/666-ocean.json +++ b/public/images/pokemon/exp/back/shiny/666-ocean.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-ocean.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dc3f54a39a4afa0ea28913252050d7c1:d856dfe44678a2ee4dc3d367a6658ad3:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-ocean.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-ocean.png b/public/images/pokemon/exp/back/shiny/666-ocean.png index 8c6aeca189acebd2799a77c99f1156f6a400bd8d..caabd9302eabf0f9321dcb29593762d0e08185e0 100644 GIT binary patch literal 2894 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 literal 2749 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 diff --git a/public/images/pokemon/exp/back/shiny/666-poke-ball.json b/public/images/pokemon/exp/back/shiny/666-poke-ball.json index 5c8715a8a1e..45564e59a32 100644 --- a/public/images/pokemon/exp/back/shiny/666-poke-ball.json +++ b/public/images/pokemon/exp/back/shiny/666-poke-ball.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-poke-ball.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9df25dba5036e3cd48218e8de3a98074:4357b8b161f5f87776f4d39fcb3723f5:8ec14f129d1691b8da504a13b661abed$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-poke-ball.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-poke-ball.png b/public/images/pokemon/exp/back/shiny/666-poke-ball.png index 24907a5ef9fcecae2c775eb27e1f6dae1f64cb36..30e2cbf861543ff605d9111186643356896ae34f 100644 GIT binary patch literal 2983 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 literal 3495 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 TupB4<8Wd<jB-JDV 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 literal 2794 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 LTk}fO(>MMHK&B~< diff --git a/public/images/pokemon/exp/back/shiny/666-savanna.json b/public/images/pokemon/exp/back/shiny/666-savanna.json index 24638119724..8fa326da1b4 100644 --- a/public/images/pokemon/exp/back/shiny/666-savanna.json +++ b/public/images/pokemon/exp/back/shiny/666-savanna.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-savanna.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0c7fd4a8c1137a2566fabe2f53dac4c4:295a7bdde494b6106f9c73b649be6098:625a4f0dc001069326a75c6a381f93e6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-savanna.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-savanna.png b/public/images/pokemon/exp/back/shiny/666-savanna.png index 5fcf8bc6d281809a2e161892750b32a3dba1ad06..a69c0c18ae1540a6b426b99ccf7b9b2da68c8e69 100644 GIT binary patch literal 2850 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 O6+m|KaBQ%rGX4qKEgwe! literal 3365 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 diff --git a/public/images/pokemon/exp/back/shiny/666-tundra.json b/public/images/pokemon/exp/back/shiny/666-tundra.json index 8361b7ca139..afa574f9e07 100644 --- a/public/images/pokemon/exp/back/shiny/666-tundra.json +++ b/public/images/pokemon/exp/back/shiny/666-tundra.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-tundra.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 46, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b87511ba7b272729aecbf5eb18fe65cc:383836b7b2902a470e150b17bdd9bcfc:9779ed3adebc298af537dd64dc25fe00$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-tundra.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-tundra.png b/public/images/pokemon/exp/back/shiny/666-tundra.png index c33fbf1fc6550a37aa9fcbd48e3b0b8a4ee180dc..78316df8a8fc721faceabe9e7f86dc6544ccead1 100644 GIT binary patch literal 2777 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 Yb?f>0jXI;cz(W&6bS1geI#F2v1A3tVssI20 literal 2984 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 Vo3bKqt^dFZ5$#F1hjza4{{pdUc6a~) From 8f15788b39930906d1c451a51c5731cec10d5f2f Mon Sep 17 00:00:00 2001 From: Jimmybald1 <122436263+Jimmybald1@users.noreply.github.com> Date: Mon, 24 Feb 2025 17:43:38 +0100 Subject: [PATCH 24/83] [Misc] Added a Daily Run Seed Override to the overrides. Only works locally. (#5330) * [Misc] Added a Daily Run Seed Override to the overrides. Only works locally. * [Misc] Changed Daily Run Seed Override to string | null Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: Jimmybald1 <147992650+IBBCalc@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: damocleas --- src/overrides.ts | 1 + src/phases/title-phase.ts | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/overrides.ts b/src/overrides.ts index e53d3b766c4..d15370259fc 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -47,6 +47,7 @@ class DefaultOverrides { // ----------------- /** a specific seed (default: a random string of 24 characters) */ readonly SEED_OVERRIDE: string = ""; + readonly DAILY_RUN_SEED_OVERRIDE: string | null = null; readonly WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; /** * If `null`, ignore this override. diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts index 0d486da1998..a560897037e 100644 --- a/src/phases/title-phase.ts +++ b/src/phases/title-phase.ts @@ -21,6 +21,7 @@ import { SelectChallengePhase } from "./select-challenge-phase"; import { SelectStarterPhase } from "./select-starter-phase"; import { SummonPhase } from "./summon-phase"; import { globalScene } from "#app/global-scene"; +import Overrides from "#app/overrides"; export class TitlePhase extends Phase { @@ -256,7 +257,11 @@ export class TitlePhase extends Phase { console.error("Failed to load daily run:\n", err); }); } else { - generateDaily(btoa(new Date().toISOString().substring(0, 10))); + let seed: string = btoa(new Date().toISOString().substring(0, 10)); + if (!Utils.isNullOrUndefined(Overrides.DAILY_RUN_SEED_OVERRIDE)) { + seed = Overrides.DAILY_RUN_SEED_OVERRIDE; + } + generateDaily(seed); } }); } From 9fb654ce736d5f670466fad858f90a9911619d6a Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 25 Feb 2025 03:44:22 +1100 Subject: [PATCH 25/83] [Balance] Make dual STABs way more likely #5401 --- src/field/pokemon.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 214c667f1c1..ed27dd41f6a 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2395,14 +2395,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { while (baseWeights.length > this.moveset.length && this.moveset.length < 4) { if (this.hasTrainer()) { // Sqrt the weight of any damaging moves with overlapping types. This is about a 0.05 - 0.1 multiplier. - // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights double if STAB. + // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights get 20x if STAB. // Status moves remain unchanged on weight, this encourages 1-2 movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)).map((m) => { let ret: number; if (this.moveset.some(mo => mo?.getMove().category !== MoveCategory.STATUS && mo?.getMove().type === allMoves[m[0]].type)) { ret = Math.ceil(Math.sqrt(m[1])); } else if (allMoves[m[0]].category !== MoveCategory.STATUS) { - ret = Math.ceil(m[1] / Math.max(Math.pow(4, this.moveset.filter(mo => (mo?.getMove().power ?? 0) > 1).length) / 8, 0.5) * (this.isOfType(allMoves[m[0]].type) ? 2 : 1)); + ret = Math.ceil(m[1] / Math.max(Math.pow(4, this.moveset.filter(mo => (mo?.getMove().power ?? 0) > 1).length) / 8, 0.5) * (this.isOfType(allMoves[m[0]].type) ? 20 : 1)); } else { ret = m[1]; } From 5996f8c6ebbe6063c87065f35df52db3796be702 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Mon, 24 Feb 2025 08:46:54 -0800 Subject: [PATCH 26/83] [Move] Add Taunt Removal Message #5407 --- src/data/battler-tags.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 8d5f21c0a42..7b16c718f07 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2752,6 +2752,12 @@ export class TauntTag extends MoveRestrictionBattlerTag { globalScene.queueMessage(i18next.t("battlerTags:tauntOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); } + public override onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + + globalScene.queueMessage(i18next.t("battlerTags:tauntOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + } + /** * Checks if a move is a status move and determines its restriction status on that basis * @param {Moves} move the move under investigation From 0cb3a28dfa757b6d2e5b758923728ce006ef4335 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Tue, 25 Feb 2025 04:33:39 +1100 Subject: [PATCH 27/83] Fix tera type access (#5364) --- src/field/pokemon.ts | 4 ++-- src/phases/tera-phase.ts | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index ed27dd41f6a..61815ec649c 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2848,7 +2848,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { stabMultiplier.value += 0.5; } - if (source.isTerastallized && source.teraType === Type.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { + if (source.isTerastallized && source.getTeraType() === Type.STELLAR && (!source.stellarTypesBoosted.includes(moveType) || source.hasSpecies(Species.TERAPAGOS))) { if (matchesSourceType) { stabMultiplier.value += 0.5; } else { @@ -4632,7 +4632,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionVariant = this.fusionVariant; newPokemon.fusionGender = this.fusionGender; newPokemon.fusionLuck = this.fusionLuck; - newPokemon.fusionTeraType = this.teraType; + newPokemon.fusionTeraType = this.fusionTeraType; newPokemon.usedTMs = this.usedTMs; globalScene.getPlayerParty().push(newPokemon); diff --git a/src/phases/tera-phase.ts b/src/phases/tera-phase.ts index f4b72d39192..462a4e1882e 100644 --- a/src/phases/tera-phase.ts +++ b/src/phases/tera-phase.ts @@ -20,9 +20,7 @@ export class TeraPhase extends BattlePhase { 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]}`) })); + globalScene.queueMessage(i18next.t("battle:pokemonTerastallized", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), type: i18next.t(`pokemonInfo:Type.${Type[this.pokemon.getTeraType()]}`) })); new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(false, () => { this.end(); }); @@ -41,7 +39,7 @@ export class TeraPhase extends BattlePhase { if (this.pokemon.isPlayer()) { globalScene.validateAchv(achvs.TERASTALLIZE); - if (this.pokemon.teraType === Type.STELLAR) { + if (this.pokemon.getTeraType() === Type.STELLAR) { globalScene.validateAchv(achvs.STELLAR_TERASTALLIZE); } } From cc7e1af82760712fee4444967101abb7df4238fc Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Feb 2025 05:43:34 +0100 Subject: [PATCH 28/83] [BUG] Base forms are now counted as caught when catching a battle form (#5385) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Base forms are counted as caught when catching a battle form * Ensuring that correct form shows up in Pokédex Index --- src/system/game-data.ts | 21 ++++++++++++++++++++- src/ui/pokedex-ui-handler.ts | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 6b25013795f..57e25325ba4 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -55,6 +55,7 @@ import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-e import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { ArenaTrapTag } from "#app/data/arena-tag"; +import { pokemonFormChanges } from "#app/data/pokemon-forms"; import type { Type } from "#enums/type"; export const defaultStarterSpecies: Species[] = [ @@ -1629,11 +1630,29 @@ export class GameData { const caughtAttr = dexEntry.caughtAttr; const formIndex = pokemon.formIndex; const dexAttr = pokemon.getDexAttr(); - pokemon.formIndex = formIndex; // Mark as caught dexEntry.caughtAttr |= dexAttr; + // If the caught form is a battleform, we want to also mark the base form as caught. + // This snippet assumes that the base form has formIndex equal to 0, which should be + // always true except for the case of Urshifu. + const formKey = pokemon.getFormKey(); + if (formIndex > 0) { + if (pokemon.species.speciesId === Species.URSHIFU) { + if (formIndex === 2) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); + } else if (formIndex === 3) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(1); + } + } + const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : []; + const toCurrentFormChanges = allFormChanges.filter(f => (f.formKey === formKey)); + if (toCurrentFormChanges.length > 0) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); + } + } + // Unlock ability if (speciesStarterCosts.hasOwnProperty(species.speciesId)) { this.starterData[species.speciesId].abilityAttr |= pokemon.abilityIndex !== 1 || pokemon.species.ability2 diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 1ba1b846224..6b8fdc41539 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1207,7 +1207,7 @@ export default class PokedexUiHandler extends MessageUiHandler { shiny: false, female: props.female, variant: 0, - formIndex: 0, + formIndex: props.formIndex, }; return sanitizedProps; } @@ -1906,7 +1906,7 @@ export default class PokedexUiHandler extends MessageUiHandler { const dexEntry = globalScene.gameData.dexData[species.speciesId]; const caughtAttr = dexEntry.caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)].caughtAttr & species.getFullUnlocksData(); - if (!caughtAttr) { + if (caughtAttr) { const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId))); if (shiny === undefined) { From 6857cd459cb2f5457cecadd35bfcef85f49741ae Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Feb 2025 05:43:53 +0100 Subject: [PATCH 29/83] =?UTF-8?q?[UI/UX]=20Pok=C3=A9dex=20-=20Fix=20candy?= =?UTF-8?q?=20filter=20(#5377)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Hardcoding Pikachu to show 0 candies * Looking at starterId to determine order in sort by candy --- src/ui/pokedex-page-ui-handler.ts | 2 +- src/ui/pokedex-ui-handler.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index a086762bb57..ad05b265a50 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -2260,7 +2260,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.setY(25); this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); - this.pokemonCandyCountText.setText(`x${globalScene.gameData.starterData[this.starterId].candyCount}`); + this.pokemonCandyCountText.setText(`x${species.speciesId === Species.PIKACHU ? 0 : globalScene.gameData.starterData[this.starterId].candyCount}`); this.pokemonCandyContainer.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 6b8fdc41539..ed0c3e7ee33 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1534,8 +1534,8 @@ export default class PokedexUiHandler extends MessageUiHandler { case SortCriteria.COST: return (a.cost - b.cost) * -sort.dir; case SortCriteria.CANDY: - const candyCountA = globalScene.gameData.starterData[a.species.speciesId].candyCount; - const candyCountB = globalScene.gameData.starterData[b.species.speciesId].candyCount; + const candyCountA = globalScene.gameData.starterData[this.getStarterSpeciesId(a.species.speciesId)].candyCount; + const candyCountB = globalScene.gameData.starterData[this.getStarterSpeciesId(b.species.speciesId)].candyCount; return (candyCountA - candyCountB) * -sort.dir; case SortCriteria.IV: const avgIVsA = globalScene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / globalScene.gameData.dexData[a.species.speciesId].ivs.length; From 4128d09a1d908634c2130b3c719200031c589e32 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Feb 2025 05:44:13 +0100 Subject: [PATCH 30/83] [UI/UX] Pokedex - Page turning takes filters into account (#5372) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Introducing list of indices of filtered mons to be passed to the Pokédex Page for scrolling * Update pokedex-page-ui-handler.ts --- src/ui/pokedex-page-ui-handler.ts | 36 ++++++++++++++++++++++--------- src/ui/pokedex-ui-handler.ts | 7 ++++-- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index ad05b265a50..ef7ee57cc17 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, normalForm } from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpecies, 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"; @@ -244,6 +244,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private menuOptions: MenuOptions[]; protected scale: number = 0.1666666667; private menuDescriptions: string[]; + private filteredIndices: Species[] | null = null; private availableVariants: number; private unlockedVariants: boolean[]; @@ -560,6 +561,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.species = args[0]; this.formIndex = args[1] ?? 0; this.savedStarterAttributes = args[2] ?? { shiny:false, female:true, variant:0, form:0 }; + this.filteredIndices = args[3] ?? null; this.starterSetup(); } @@ -1447,7 +1449,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setMode(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + ui.setMode(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes, this.filteredIndices); return true; }, onHover: () => this.showText(conditionText) @@ -1752,31 +1754,45 @@ export default class PokedexPageUiHandler extends MessageUiHandler { case Button.LEFT: this.blockInput = true; ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { - const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); - const newIndex = index <= 0 ? allSpecies.length - 1 : index - 1; - const newSpecies = allSpecies[newIndex]; + let newSpecies: PokemonSpecies; + if (this.filteredIndices) { + const index = this.filteredIndices.findIndex(id => id === this.species.speciesId); + const newIndex = index <= 0 ? this.filteredIndices.length - 1 : index - 1; + newSpecies = getPokemonSpecies(this.filteredIndices[newIndex]); + } else { + const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); + const newIndex = index <= 0 ? allSpecies.length - 1 : index - 1; + newSpecies = allSpecies[newIndex]; + } const matchingForm = newSpecies?.forms.find(form => form.formKey === this.species?.forms[this.formIndex]?.formKey); const newFormIndex = matchingForm ? matchingForm.formIndex : 0; this.starterAttributes.form = newFormIndex; this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes, this.filteredIndices); }); this.blockInput = false; break; case Button.RIGHT: ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { - const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); - const newIndex = index >= allSpecies.length - 1 ? 0 : index + 1; - const newSpecies = allSpecies[newIndex]; + let newSpecies: PokemonSpecies; + if (this.filteredIndices) { + const index = this.filteredIndices.findIndex(id => id === this.species.speciesId); + const newIndex = index >= this.filteredIndices.length - 1 ? 0 : index + 1; + newSpecies = getPokemonSpecies(this.filteredIndices[newIndex]); + } else { + const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); + const newIndex = index >= allSpecies.length - 1 ? 0 : index + 1; + newSpecies = allSpecies[newIndex]; + } const matchingForm = newSpecies?.forms.find(form => form.formKey === this.species?.forms[this.formIndex]?.formKey); const newFormIndex = matchingForm ? matchingForm.formIndex : 0; this.starterAttributes.form = newFormIndex; this.savedStarterAttributes.form = newFormIndex; this.moveInfoOverlay.clear(); this.clearText(); - ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes, this.filteredIndices); }); break; } diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index ed0c3e7ee33..82208a5899d 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -215,6 +215,7 @@ export default class PokedexUiHandler extends MessageUiHandler { private showFormTrayIconElement: Phaser.GameObjects.Sprite; private showFormTrayLabel: Phaser.GameObjects.Text; private canShowFormTray: boolean; + private filteredIndices: Species[]; constructor() { super(Mode.POKEDEX); @@ -1037,7 +1038,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } else if (this.showingTray) { if (button === Button.ACTION) { const formIndex = this.trayForms[this.trayCursor].formIndex; - ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, formIndex, { form: formIndex }); + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, formIndex, { form: formIndex }, this.filteredIndices); success = true; } else { const numberOfForms = this.trayContainers.length; @@ -1084,7 +1085,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } } else { if (button === Button.ACTION) { - ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, 0); + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, 0, null, this.filteredIndices); success = true; } else { switch (button) { @@ -1551,6 +1552,8 @@ export default class PokedexUiHandler extends MessageUiHandler { return 0; }); + this.filteredIndices = this.filteredPokemonContainers.map(c => c.species.speciesId); + this.updateScroll(); }; From b95bedce7afeb10b4d7d9fbbab31b921571bcdbb Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Feb 2025 05:45:45 +0100 Subject: [PATCH 31/83] [UI/UX] Pokedex - Ensure gender forms loop correctly with either button (#5387) --- src/ui/pokedex-page-ui-handler.ts | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index ef7ee57cc17..99b25c3c383 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -244,6 +244,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private menuOptions: MenuOptions[]; protected scale: number = 0.1666666667; private menuDescriptions: string[]; + private isFormGender: boolean; private filteredIndices: Species[] | null = null; private availableVariants: number; @@ -633,6 +634,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.tmMoves = speciesTmMoves[species.speciesId]?.filter(m => Array.isArray(m) ? (m[0] === formKey ? true : false ) : true) .map(m => Array.isArray(m) ? m[1] : m).sort((a, b) => allMoves[a].name > allMoves[b].name ? 1 : -1) ?? []; + this.isFormGender = formKey === "male" || formKey === "female"; + const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) ? species.speciesId : starterPassiveAbilities.hasOwnProperty(this.starterId) ? this.starterId : pokemonPrevolutions[this.starterId]; const passives = starterPassiveAbilities[passiveId]; @@ -1593,8 +1596,15 @@ export default class PokedexPageUiHandler extends MessageUiHandler { starterAttributes.form = newFormIndex; // store the selected form this.savedStarterAttributes.form = starterAttributes.form; this.formIndex = newFormIndex; + // Some forms are tied to the gender and should change accordingly + let newFemale = props.female; + if (this.isFormGender) { + newFemale = !props.female; + } + starterAttributes.female = newFemale; + this.savedStarterAttributes.female = starterAttributes.female; this.starterSetup(); - this.setSpeciesDetails(this.species, { formIndex: newFormIndex }); + this.setSpeciesDetails(this.species, { formIndex: newFormIndex, female: newFemale }); success = this.setCursor(this.cursor); } break; @@ -1602,7 +1612,16 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.canCycleGender) { starterAttributes.female = !props.female; this.savedStarterAttributes.female = starterAttributes.female; - this.setSpeciesDetails(this.species, { female: !props.female }); + let newFormIndex = this.formIndex; + // Some forms are tied to the gender and should change accordingly + if (this.isFormGender) { + newFormIndex = this.formIndex === 0 ? 1 : 0; + } + starterAttributes.form = newFormIndex; // store the selected form + this.savedStarterAttributes.form = starterAttributes.form; + this.formIndex = newFormIndex; + this.starterSetup(); + this.setSpeciesDetails(this.species, { female: !props.female, formIndex: newFormIndex }); success = true; } break; From d14f71d27a6da203fd30843bfb1e42c95be6a15e Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Tue, 25 Feb 2025 00:15:15 -0500 Subject: [PATCH 32/83] [Bug] Maintain Gimmighoul evo counter when fusing (#5411) --- src/field/pokemon.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 61815ec649c..4e3e53f994f 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4634,6 +4634,7 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionLuck = this.fusionLuck; newPokemon.fusionTeraType = this.fusionTeraType; newPokemon.usedTMs = this.usedTMs; + newPokemon.evoCounter = this.evoCounter; globalScene.getPlayerParty().push(newPokemon); newPokemon.evolve((!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution)), evoSpecies); @@ -4702,6 +4703,7 @@ export class PlayerPokemon extends Pokemon { this.fusionGender = pokemon.gender; this.fusionLuck = pokemon.luck; this.fusionCustomPokemonData = pokemon.customPokemonData; + this.evoCounter = Math.max(pokemon.evoCounter, this.evoCounter); if (pokemon.pauseEvolutions || this.pauseEvolutions) { this.pauseEvolutions = true; } From 88a5c9d41651dcb2efc3e83ca64240144a36347c Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Tue, 25 Feb 2025 01:46:07 -0600 Subject: [PATCH 33/83] [Ability] Implement Teraform Zero ability (#5359) * Partially implement Teraform Zero ability The functionality of the ability is all there, it just isn't limited to one use per Terastallization yet. * Add the once per battle condition This removes the partial from the ability. * Make attribute names more generic --------- Co-authored-by: damocleas --- src/data/ability.ts | 50 ++++++++++++++++++++++++++- src/phases/quiet-form-change-phase.ts | 4 ++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 131b7d0ff7a..8de0c68a8e7 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -266,6 +266,52 @@ export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { } } +/** + * Clears a specified weather whenever this attribute is called. + */ +export class ClearWeatherAbAttr extends AbAttr { + private weather: WeatherType[]; + + /** + * @param weather {@linkcode WeatherType[]} - the weather to be removed + */ + constructor(weather: WeatherType[]) { + super(true); + + this.weather = weather; + } + + apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (!simulated) { + globalScene.arena.trySetWeather(WeatherType.NONE, true); + } + return true; + } +} + +/** + * Clears a specified terrain whenever this attribute is called. + */ +export class ClearTerrainAbAttr extends AbAttr { + private terrain: TerrainType[]; + + /** + * @param terrain {@linkcode TerrainType[]} - the terrain to be removed + */ + constructor(terrain: TerrainType[]) { + super(true); + + this.terrain = terrain; + } + + apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (!simulated) { + globalScene.arena.trySetTerrain(TerrainType.NONE, true, true); + } + return true; + } +} + type PreDefendAbAttrCondition = (pokemon: Pokemon, attacker: Pokemon, move: Move) => boolean; export class PreDefendAbAttr extends AbAttr { @@ -6993,9 +7039,11 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .ignorable(), new Ability(Abilities.TERAFORM_ZERO, 9) + .attr(ClearWeatherAbAttr, [ WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN, WeatherType.STRONG_WINDS ]) + .attr(ClearTerrainAbAttr, [ TerrainType.MISTY, TerrainType.ELECTRIC, TerrainType.GRASSY, TerrainType.PSYCHIC ]) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .unimplemented(), + .condition(getOncePerBattleCondition(Abilities.TERAFORM_ZERO)), new Ability(Abilities.POISON_PUPPETEER, 9) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts index 6cd1129d318..81a39f53a76 100644 --- a/src/phases/quiet-form-change-phase.ts +++ b/src/phases/quiet-form-change-phase.ts @@ -11,7 +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"; +import { applyAbAttrs, ClearTerrainAbAttr, ClearWeatherAbAttr, PostTeraFormChangeStatChangeAbAttr } from "#app/data/ability"; export class QuietFormChangePhase extends BattlePhase { protected pokemon: Pokemon; @@ -148,6 +148,8 @@ export class QuietFormChangePhase extends BattlePhase { } if (this.formChange.trigger instanceof SpeciesFormChangeTeraTrigger) { applyAbAttrs(PostTeraFormChangeStatChangeAbAttr, this.pokemon, null); + applyAbAttrs(ClearWeatherAbAttr, this.pokemon, null); + applyAbAttrs(ClearTerrainAbAttr, this.pokemon, null); } super.end(); From c81d9b6a891f1338a266621653a039c4913f4173 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 25 Feb 2025 08:22:25 -0600 Subject: [PATCH 34/83] [Balance] Update moveset gen to calculate expected power (#5390) * Make moveset gen consider multi hit moves fairly * Make getTargetBenefitScore consider effective power * Apply Kev's suggestions Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Fix improper stat ratio. * Fix expected hit count for pop-bomb like moves Accuracy is now properly divided by 100 * Update src/data/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/move.ts | 206 +++++++++++++++++++++++++++++++++++-------- src/field/pokemon.ts | 4 +- 2 files changed, 169 insertions(+), 41 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 332a3302fdd..d9ceb0f3dce 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -14,8 +14,18 @@ import { import { getPokemonNameWithAffix } from "../messages"; import type { AttackMoveResult, TurnMove } from "../field/pokemon"; import type Pokemon from "../field/pokemon"; -import { EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; -import { getNonVolatileStatusEffects, getStatusEffectHealText, isNonVolatileStatusEffect } from "./status-effect"; +import { + EnemyPokemon, + HitResult, + MoveResult, + PlayerPokemon, + PokemonMove, +} from "../field/pokemon"; +import { + getNonVolatileStatusEffects, + getStatusEffectHealText, + isNonVolatileStatusEffect, +} from "./status-effect"; import { getTypeDamageMultiplier } from "./type"; import { Type } from "#enums/type"; import type { Constructor } from "#app/utils"; @@ -24,8 +34,50 @@ import * as Utils from "../utils"; import { WeatherType } from "#enums/weather-type"; import type { ArenaTrapTag } from "./arena-tag"; import { ArenaTagSide, WeakenMoveTypeTag } from "./arena-tag"; -import { allAbilities, AllyMoveCategoryPowerBoostAbAttr, applyAbAttrs, applyPostAttackAbAttrs, applyPostItemLostAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, BlockItemTheftAbAttr, BlockNonDirectDamageAbAttr, BlockOneHitKOAbAttr, BlockRecoilDamageAttr, ChangeMovePriorityAbAttr, ConfusionOnStatusEffectAbAttr, FieldMoveTypePowerBoostAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, HealFromBerryUseAbAttr, IgnoreContactAbAttr, IgnoreMoveEffectsAbAttr, IgnoreProtectOnContactAbAttr, InfiltratorAbAttr, MaxMultiHitAbAttr, MoveAbilityBypassAbAttr, MoveEffectChanceMultiplierAbAttr, MoveTypeChangeAbAttr, PostDamageForceSwitchAbAttr, PostItemLostAbAttr, ReverseDrainAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, UnswappableAbilityAbAttr, UserFieldMoveTypePowerBoostAbAttr, VariableMovePowerAbAttr, WonderSkinAbAttr } from "./ability"; -import { AttackTypeBoosterModifier, BerryModifier, PokemonHeldItemModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PreserveBerryModifier } from "../modifier/modifier"; +import { + allAbilities, + AllyMoveCategoryPowerBoostAbAttr, + applyAbAttrs, + applyPostAttackAbAttrs, + applyPostItemLostAbAttrs, + applyPreAttackAbAttrs, + applyPreDefendAbAttrs, + BlockItemTheftAbAttr, + BlockNonDirectDamageAbAttr, + BlockOneHitKOAbAttr, + BlockRecoilDamageAttr, + ChangeMovePriorityAbAttr, + ConfusionOnStatusEffectAbAttr, + FieldMoveTypePowerBoostAbAttr, + FieldPreventExplosiveMovesAbAttr, + ForceSwitchOutImmunityAbAttr, + HealFromBerryUseAbAttr, + IgnoreContactAbAttr, + IgnoreMoveEffectsAbAttr, + IgnoreProtectOnContactAbAttr, + InfiltratorAbAttr, + MaxMultiHitAbAttr, + MoveAbilityBypassAbAttr, + MoveEffectChanceMultiplierAbAttr, + MoveTypeChangeAbAttr, + PostDamageForceSwitchAbAttr, + PostItemLostAbAttr, + ReverseDrainAbAttr, + UncopiableAbilityAbAttr, + UnsuppressableAbilityAbAttr, + UnswappableAbilityAbAttr, + UserFieldMoveTypePowerBoostAbAttr, + VariableMovePowerAbAttr, + WonderSkinAbAttr, +} from "./ability"; +import { + AttackTypeBoosterModifier, + BerryModifier, + PokemonHeldItemModifier, + PokemonMoveAccuracyBoosterModifier, + PokemonMultiHitModifier, + PreserveBerryModifier, +} from "../modifier/modifier"; import type { BattlerIndex } from "../battle"; import { BattleType } from "../battle"; import { TerrainType } from "./terrain"; @@ -41,7 +93,13 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveUsedEvent } from "#app/events/battle-scene"; -import { BATTLE_STATS, type BattleStat, type EffectiveStat, getStatKey, Stat } from "#app/enums/stat"; +import { + BATTLE_STATS, + type BattleStat, + type EffectiveStat, + getStatKey, + Stat, +} from "#app/enums/stat"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; @@ -860,6 +918,46 @@ export default class Move implements Localizable { return priority.value; } + /** + * Calculate the [Expected Power](https://en.wikipedia.org/wiki/Expected_value) per turn + * of this move, taking into account multi hit moves, accuracy, and the number of turns it + * takes to execute. + * + * Does not (yet) consider the current field effects or the user's abilities. + */ + calculateEffectivePower(): number { + let effectivePower: number; + // Triple axel and triple kick are easier to special case. + if (this.id === Moves.TRIPLE_AXEL) { + effectivePower = 94.14; + } else if (this.id === Moves.TRIPLE_KICK) { + effectivePower = 47.07; + } else { + const multiHitAttr = this.getAttrs(MultiHitAttr)[0]; + if (multiHitAttr) { + effectivePower = multiHitAttr.calculateExpectedHitCount(this) * this.power; + } else { + effectivePower = this.power * (this.accuracy === -1 ? 1 : this.accuracy / 100); + } + } + /** The number of turns the user must commit to for this move's damage */ + let numTurns = 1; + + // These are intentionally not else-if statements even though there are no + // pokemon moves that have more than one of these attributes. This allows + // the function to future proof new moves / custom move behaviors. + if (this.hasAttr(DelayedAttackAttr)) { + numTurns += 2; + } + if (this.hasAttr(RechargeAttr)) { + numTurns += 1; + } + if (this.isChargingMove()) { + numTurns += 1; + } + return effectivePower / numTurns; + } + /** * Returns `true` if this move can be given additional strikes * by enhancing effects. @@ -913,47 +1011,37 @@ export class AttackMove extends Move { } } + /** + * Compute the benefit score of this move based on the offensive stat used and the move's power. + * @param user The Pokemon using the move + * @param target The Pokemon targeted by the move + * @param move The move being used + * @returns The benefit score of using this move + */ getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - let ret = super.getTargetBenefitScore(user, target, move); - + // TODO: Properly handle foul play, body press, and opponent stat stages. + const ret = super.getTargetBenefitScore(user, target, move); let attackScore = 0; const effectiveness = target.getAttackTypeEffectiveness(this.type, user, undefined, undefined, this); - attackScore = Math.pow(effectiveness - 1, 2) * effectiveness < 1 ? -2 : 2; - if (attackScore) { - if (this.category === MoveCategory.PHYSICAL) { - 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; - if (statRatio <= 0.75) { - attackScore *= 2; - } else if (statRatio <= 0.875) { - attackScore *= 1.5; - } - } - } else { - 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; - if (statRatio <= 0.75) { - attackScore *= 2; - } else if (statRatio <= 0.875) { - attackScore *= 1.5; - } - } - } - - const power = new Utils.NumberHolder(this.power); - applyMoveAttrs(VariablePowerAttr, user, target, move, power); - - attackScore += Math.floor(power.value / 5); + attackScore = Math.pow(effectiveness - 1, 2) * (effectiveness < 1 ? -2 : 2); + const [ thisStat, offStat ]: EffectiveStat[] = this.category === MoveCategory.PHYSICAL ? [ Stat.ATK, Stat.SPATK ] : [ Stat.SPATK, Stat.ATK ]; + const statHolder = new Utils.NumberHolder(user.getEffectiveStat(thisStat, target)); + const offStatValue = user.getEffectiveStat(offStat, target); + applyMoveAttrs(VariableAtkAttr, user, target, move, statHolder); + const statRatio = offStatValue / statHolder.value; + if (statRatio <= 0.75) { + attackScore *= 2; + } else if (statRatio <= 0.875) { + attackScore *= 1.5; } - ret -= attackScore; + const power = new Utils.NumberHolder(this.calculateEffectivePower()); + applyMoveAttrs(VariablePowerAttr, user, target, move, power); - return ret; + attackScore += Math.floor(power.value / 5); + + return ret - attackScore; } } @@ -2343,6 +2431,46 @@ export class MultiHitAttr extends MoveAttr { }, 0); } } + + /** + * Calculate the expected number of hits given this attribute's {@linkcode MultiHitType}, + * the move's accuracy, and a number of situational parameters. + * + * @param move - The move that this attribtue is applied to + * @param partySize - The size of the user's party, used for {@linkcode Moves.BEAT_UP | Beat Up} (default: `1`) + * @param maxMultiHit - Whether the move should always hit the maximum number of times, e.g. due to {@linkcode Abilities.SKILL_LINK | Skill Link} (default: `false`) + * @param ignoreAcc - `true` if the move should ignore accuracy checks, e.g. due to {@linkcode Abilities.NO_GUARD | No Guard} (default: `false`) + */ + calculateExpectedHitCount(move: Move, { ignoreAcc = false, maxMultiHit = false, partySize = 1 }: {ignoreAcc?: boolean, maxMultiHit?: boolean, partySize?: number} = {}): number { + let expectedHits: number; + switch (this.multiHitType) { + case MultiHitType._2_TO_5: + expectedHits = maxMultiHit ? 5 : 3.1; + break; + case MultiHitType._2: + expectedHits = 2; + break; + case MultiHitType._3: + expectedHits = 3; + break; + case MultiHitType._10: + expectedHits = 10; + break; + case MultiHitType.BEAT_UP: + // Estimate that half of the party can contribute to beat up. + expectedHits = Math.max(1, partySize / 2); + break; + } + if (ignoreAcc || move.accuracy === -1) { + return expectedHits; + } + const acc = move.accuracy / 100; + if (move.hasFlag(MoveFlags.CHECK_ALL_HITS) && !maxMultiHit) { + // N.B. No moves should be the _2_TO_5 variant and have the CHECK_ALL_HITS flag. + return acc * (1 - Math.pow(acc, expectedHits)) / (1 - acc); + } + return expectedHits *= acc; + } } export class ChangeMultiHitTypeAttr extends MoveAttr { diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 4e3e53f994f..17917ad9b40 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2344,8 +2344,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Weight towards higher power moves, by reducing the power of moves below the highest power. // Caps max power at 90 to avoid something like hyper beam ruining the stats. // This is a pretty soft weighting factor, although it is scaled with the weight multiplier. - const maxPower = Math.min(movePool.reduce((v, m) => Math.max(allMoves[m[0]].power, v), 40), 90); - movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].power / maxPower, 1), 0.5)) ]); + const maxPower = Math.min(movePool.reduce((v, m) => Math.max(allMoves[m[0]].calculateEffectivePower(), v), 40), 90); + movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].calculateEffectivePower() / maxPower, 1), 0.5)) ]); // Weight damaging moves against the lower stat. This uses a non-linear relationship. // If the higher stat is 1 - 1.09x higher, no change. At higher stat ~1.38x lower stat, off-stat moves have half weight. From d11f02aa3d9b90084e3e2191fb770bfc7a1f3e49 Mon Sep 17 00:00:00 2001 From: Unicorn_Power <189861924+Unicornpowerstar@users.noreply.github.com> Date: Tue, 25 Feb 2025 15:54:24 +0100 Subject: [PATCH 35/83] [Sprite] Variant json and deletion of the pngs for Vivillon-666 (#5408) * Variant json and deletion of the pngs * Variant color adjustment adjusted some color that werent mapped correctly. adjusted some colors due to contrast issues * Fixing the reason sprite test kept failing. .....669 --- public/exp-sprites.json | 130 +- public/images/pokemon/666-high-plains.png | Bin 970 -> 1010 bytes .../images/pokemon/back/666-high-plains.png | Bin 910 -> 949 bytes public/images/pokemon/exp/666-high-plains.png | Bin 6204 -> 7104 bytes .../exp/back/shiny/666-high-plains.png | Bin 2803 -> 2810 bytes .../pokemon/variant/666-continental.json | 19 + .../pokemon/variant/666-continental_3.json | 41 - .../pokemon/variant/666-continental_3.png | Bin 1352 -> 0 bytes public/images/pokemon/variant/666-fancy.json | 38 + .../images/pokemon/variant/666-fancy_2.json | 41 - public/images/pokemon/variant/666-fancy_2.png | Bin 1490 -> 0 bytes .../images/pokemon/variant/666-fancy_3.json | 41 - public/images/pokemon/variant/666-fancy_3.png | Bin 1490 -> 0 bytes .../pokemon/variant/666-high-plains.json | 6 +- .../images/pokemon/variant/666-monsoon.json | 61 +- public/images/pokemon/variant/666-ocean.json | 2 +- .../images/pokemon/variant/666-poke-ball.json | 21 +- .../pokemon/variant/666-poke-ball_3.json | 41 - .../pokemon/variant/666-poke-ball_3.png | Bin 1417 -> 0 bytes public/images/pokemon/variant/666-river.json | 55 +- .../images/pokemon/variant/666-river_2.json | 41 - public/images/pokemon/variant/666-river_2.png | Bin 1388 -> 0 bytes public/images/pokemon/variant/669-red.json | 18 + public/images/pokemon/variant/669-red_2.json | 41 - public/images/pokemon/variant/669-red_2.png | Bin 631 -> 0 bytes .../images/pokemon/variant/_masterlist.json | 64 +- .../pokemon/variant/back/666-fancy.json | 36 + .../pokemon/variant/back/666-fancy_2.json | 41 - .../pokemon/variant/back/666-fancy_2.png | Bin 1410 -> 0 bytes .../pokemon/variant/back/666-fancy_3.json | 41 - .../pokemon/variant/back/666-fancy_3.png | Bin 1416 -> 0 bytes .../pokemon/variant/back/666-high-plains.json | 6 +- .../pokemon/variant/back/666-monsoon.json | 59 +- .../pokemon/variant/back/666-ocean.json | 2 +- .../pokemon/variant/back/666-river.json | 54 +- .../pokemon/variant/back/666-river_2.json | 41 - .../pokemon/variant/back/666-river_2.png | Bin 1332 -> 0 bytes .../images/pokemon/variant/exp/666-fancy.json | 38 + .../pokemon/variant/exp/666-fancy_2.json | 1280 ----------------- .../pokemon/variant/exp/666-fancy_2.png | Bin 7586 -> 0 bytes .../pokemon/variant/exp/666-fancy_3.json | 1280 ----------------- .../pokemon/variant/exp/666-fancy_3.png | Bin 7532 -> 0 bytes .../pokemon/variant/exp/666-high-plains.json | 6 +- .../pokemon/variant/exp/666-icy-snow.json | 10 +- .../pokemon/variant/exp/666-meadow.json | 36 + .../pokemon/variant/exp/666-meadow_2.json | 1280 ----------------- .../pokemon/variant/exp/666-meadow_2.png | Bin 7448 -> 0 bytes .../pokemon/variant/exp/666-meadow_3.json | 1280 ----------------- .../pokemon/variant/exp/666-meadow_3.png | Bin 7434 -> 0 bytes .../pokemon/variant/exp/666-monsoon.json | 61 +- .../images/pokemon/variant/exp/666-ocean.json | 2 +- .../pokemon/variant/exp/666-poke-ball.json | 27 +- .../pokemon/variant/exp/666-poke-ball_3.json | 1280 ----------------- .../pokemon/variant/exp/666-poke-ball_3.png | Bin 7549 -> 0 bytes .../images/pokemon/variant/exp/666-river.json | 55 +- .../pokemon/variant/exp/666-river_2.json | 1280 ----------------- .../pokemon/variant/exp/666-river_2.png | Bin 7425 -> 0 bytes .../variant/exp/back/666-archipelago.json | 35 + .../variant/exp/back/666-archipelago_2.json | 104 -- .../variant/exp/back/666-archipelago_2.png | Bin 2271 -> 0 bytes .../variant/exp/back/666-archipelago_3.json | 104 -- .../variant/exp/back/666-archipelago_3.png | Bin 2261 -> 0 bytes .../variant/exp/back/666-continental.json | 38 + .../variant/exp/back/666-continental_2.json | 104 -- .../variant/exp/back/666-continental_2.png | Bin 2328 -> 0 bytes .../variant/exp/back/666-continental_3.json | 104 -- .../variant/exp/back/666-continental_3.png | Bin 2319 -> 0 bytes .../pokemon/variant/exp/back/666-elegant.json | 34 + .../variant/exp/back/666-elegant_2.json | 104 -- .../variant/exp/back/666-elegant_2.png | Bin 2328 -> 0 bytes .../variant/exp/back/666-elegant_3.json | 104 -- .../variant/exp/back/666-elegant_3.png | Bin 2319 -> 0 bytes .../pokemon/variant/exp/back/666-fancy.json | 36 + .../pokemon/variant/exp/back/666-fancy_2.json | 104 -- .../pokemon/variant/exp/back/666-fancy_2.png | Bin 2632 -> 0 bytes .../pokemon/variant/exp/back/666-fancy_3.json | 104 -- .../pokemon/variant/exp/back/666-fancy_3.png | Bin 2623 -> 0 bytes .../pokemon/variant/exp/back/666-garden.json | 32 + .../variant/exp/back/666-garden_2.json | 104 -- .../pokemon/variant/exp/back/666-garden_2.png | Bin 2253 -> 0 bytes .../variant/exp/back/666-garden_3.json | 104 -- .../pokemon/variant/exp/back/666-garden_3.png | Bin 2243 -> 0 bytes .../variant/exp/back/666-high-plains.json | 38 + .../variant/exp/back/666-high-plains_2.json | 104 -- .../variant/exp/back/666-high-plains_2.png | Bin 2359 -> 0 bytes .../variant/exp/back/666-high-plains_3.json | 104 -- .../variant/exp/back/666-high-plains_3.png | Bin 2349 -> 0 bytes .../variant/exp/back/666-icy-snow.json | 32 + .../variant/exp/back/666-icy-snow_2.json | 104 -- .../variant/exp/back/666-icy-snow_2.png | Bin 2353 -> 0 bytes .../variant/exp/back/666-icy-snow_3.json | 104 -- .../variant/exp/back/666-icy-snow_3.png | Bin 2344 -> 0 bytes .../pokemon/variant/exp/back/666-jungle.json | 34 + .../variant/exp/back/666-jungle_2.json | 104 -- .../pokemon/variant/exp/back/666-jungle_2.png | Bin 2492 -> 0 bytes .../variant/exp/back/666-jungle_3.json | 104 -- .../pokemon/variant/exp/back/666-jungle_3.png | Bin 2483 -> 0 bytes .../pokemon/variant/exp/back/666-marine.json | 32 + .../variant/exp/back/666-marine_2.json | 104 -- .../pokemon/variant/exp/back/666-marine_2.png | Bin 2317 -> 0 bytes .../variant/exp/back/666-marine_3.json | 104 -- .../pokemon/variant/exp/back/666-marine_3.png | Bin 2301 -> 0 bytes .../pokemon/variant/exp/back/666-meadow.json | 34 + .../variant/exp/back/666-meadow_2.json | 524 ------- .../pokemon/variant/exp/back/666-meadow_2.png | Bin 2360 -> 0 bytes .../variant/exp/back/666-meadow_3.json | 524 ------- .../pokemon/variant/exp/back/666-meadow_3.png | Bin 2349 -> 0 bytes .../pokemon/variant/exp/back/666-modern.json | 32 + .../variant/exp/back/666-modern_2.json | 104 -- .../pokemon/variant/exp/back/666-modern_2.png | Bin 2237 -> 0 bytes .../variant/exp/back/666-modern_3.json | 104 -- .../pokemon/variant/exp/back/666-modern_3.png | Bin 2226 -> 0 bytes .../pokemon/variant/exp/back/666-monsoon.json | 33 + .../variant/exp/back/666-monsoon_2.json | 104 -- .../variant/exp/back/666-monsoon_2.png | Bin 2462 -> 0 bytes .../variant/exp/back/666-monsoon_3.json | 104 -- .../variant/exp/back/666-monsoon_3.png | Bin 2447 -> 0 bytes .../pokemon/variant/exp/back/666-ocean.json | 34 + .../pokemon/variant/exp/back/666-ocean_2.json | 104 -- .../pokemon/variant/exp/back/666-ocean_2.png | Bin 2607 -> 0 bytes .../pokemon/variant/exp/back/666-ocean_3.json | 104 -- .../pokemon/variant/exp/back/666-ocean_3.png | Bin 2596 -> 0 bytes .../variant/exp/back/666-poke-ball.json | 34 + .../variant/exp/back/666-poke-ball_2.json | 104 -- .../variant/exp/back/666-poke-ball_2.png | Bin 2616 -> 0 bytes .../variant/exp/back/666-poke-ball_3.json | 104 -- .../variant/exp/back/666-poke-ball_3.png | Bin 2606 -> 0 bytes .../pokemon/variant/exp/back/666-polar.json | 34 + .../pokemon/variant/exp/back/666-polar_2.json | 104 -- .../pokemon/variant/exp/back/666-polar_2.png | Bin 2356 -> 0 bytes .../pokemon/variant/exp/back/666-polar_3.json | 104 -- .../pokemon/variant/exp/back/666-polar_3.png | Bin 2346 -> 0 bytes .../pokemon/variant/exp/back/666-river.json | 40 + .../pokemon/variant/exp/back/666-river_2.json | 104 -- .../pokemon/variant/exp/back/666-river_2.png | Bin 2346 -> 0 bytes .../pokemon/variant/exp/back/666-river_3.json | 104 -- .../pokemon/variant/exp/back/666-river_3.png | Bin 2324 -> 0 bytes .../variant/exp/back/666-sandstorm.json | 34 + .../variant/exp/back/666-sandstorm_2.json | 104 -- .../variant/exp/back/666-sandstorm_2.png | Bin 2383 -> 0 bytes .../variant/exp/back/666-sandstorm_3.json | 104 -- .../variant/exp/back/666-sandstorm_3.png | Bin 2382 -> 0 bytes .../pokemon/variant/exp/back/666-savanna.json | 34 + .../variant/exp/back/666-savanna_2.json | 104 -- .../variant/exp/back/666-savanna_2.png | Bin 2505 -> 0 bytes .../variant/exp/back/666-savanna_3.json | 104 -- .../variant/exp/back/666-savanna_3.png | Bin 2495 -> 0 bytes .../pokemon/variant/exp/back/666-sun.json | 34 + .../pokemon/variant/exp/back/666-sun_2.json | 104 -- .../pokemon/variant/exp/back/666-sun_2.png | Bin 2559 -> 0 bytes .../pokemon/variant/exp/back/666-sun_3.json | 104 -- .../pokemon/variant/exp/back/666-sun_3.png | Bin 2550 -> 0 bytes .../pokemon/variant/exp/back/666-tundra.json | 32 + .../variant/exp/back/666-tundra_2.json | 104 -- .../pokemon/variant/exp/back/666-tundra_2.png | Bin 2429 -> 0 bytes .../variant/exp/back/666-tundra_3.json | 104 -- .../pokemon/variant/exp/back/666-tundra_3.png | Bin 2420 -> 0 bytes 157 files changed, 1210 insertions(+), 13331 deletions(-) delete mode 100644 public/images/pokemon/variant/666-continental_3.json delete mode 100644 public/images/pokemon/variant/666-continental_3.png create mode 100644 public/images/pokemon/variant/666-fancy.json delete mode 100644 public/images/pokemon/variant/666-fancy_2.json delete mode 100644 public/images/pokemon/variant/666-fancy_2.png delete mode 100644 public/images/pokemon/variant/666-fancy_3.json delete mode 100644 public/images/pokemon/variant/666-fancy_3.png delete mode 100644 public/images/pokemon/variant/666-poke-ball_3.json delete mode 100644 public/images/pokemon/variant/666-poke-ball_3.png delete mode 100644 public/images/pokemon/variant/666-river_2.json delete mode 100644 public/images/pokemon/variant/666-river_2.png delete mode 100644 public/images/pokemon/variant/669-red_2.json delete mode 100644 public/images/pokemon/variant/669-red_2.png create mode 100644 public/images/pokemon/variant/back/666-fancy.json delete mode 100644 public/images/pokemon/variant/back/666-fancy_2.json delete mode 100644 public/images/pokemon/variant/back/666-fancy_2.png delete mode 100644 public/images/pokemon/variant/back/666-fancy_3.json delete mode 100644 public/images/pokemon/variant/back/666-fancy_3.png delete mode 100644 public/images/pokemon/variant/back/666-river_2.json delete mode 100644 public/images/pokemon/variant/back/666-river_2.png create mode 100644 public/images/pokemon/variant/exp/666-fancy.json delete mode 100644 public/images/pokemon/variant/exp/666-fancy_2.json delete mode 100644 public/images/pokemon/variant/exp/666-fancy_2.png delete mode 100644 public/images/pokemon/variant/exp/666-fancy_3.json delete mode 100644 public/images/pokemon/variant/exp/666-fancy_3.png create mode 100644 public/images/pokemon/variant/exp/666-meadow.json delete mode 100644 public/images/pokemon/variant/exp/666-meadow_2.json delete mode 100644 public/images/pokemon/variant/exp/666-meadow_2.png delete mode 100644 public/images/pokemon/variant/exp/666-meadow_3.json delete mode 100644 public/images/pokemon/variant/exp/666-meadow_3.png delete mode 100644 public/images/pokemon/variant/exp/666-poke-ball_3.json delete mode 100644 public/images/pokemon/variant/exp/666-poke-ball_3.png delete mode 100644 public/images/pokemon/variant/exp/666-river_2.json delete mode 100644 public/images/pokemon/variant/exp/666-river_2.png create mode 100644 public/images/pokemon/variant/exp/back/666-archipelago.json delete mode 100644 public/images/pokemon/variant/exp/back/666-archipelago_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-archipelago_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-archipelago_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-archipelago_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-continental.json delete mode 100644 public/images/pokemon/variant/exp/back/666-continental_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-continental_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-continental_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-continental_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-elegant.json delete mode 100644 public/images/pokemon/variant/exp/back/666-elegant_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-elegant_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-elegant_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-elegant_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-fancy.json delete mode 100644 public/images/pokemon/variant/exp/back/666-fancy_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-fancy_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-fancy_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-fancy_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-garden.json delete mode 100644 public/images/pokemon/variant/exp/back/666-garden_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-garden_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-garden_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-garden_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-high-plains.json delete mode 100644 public/images/pokemon/variant/exp/back/666-high-plains_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-high-plains_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-high-plains_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-high-plains_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-icy-snow.json delete mode 100644 public/images/pokemon/variant/exp/back/666-icy-snow_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-icy-snow_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-icy-snow_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-icy-snow_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-jungle.json delete mode 100644 public/images/pokemon/variant/exp/back/666-jungle_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-jungle_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-jungle_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-jungle_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-marine.json delete mode 100644 public/images/pokemon/variant/exp/back/666-marine_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-marine_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-marine_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-marine_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-meadow.json delete mode 100644 public/images/pokemon/variant/exp/back/666-meadow_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-meadow_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-meadow_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-meadow_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-modern.json delete mode 100644 public/images/pokemon/variant/exp/back/666-modern_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-modern_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-modern_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-modern_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-monsoon.json delete mode 100644 public/images/pokemon/variant/exp/back/666-monsoon_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-monsoon_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-monsoon_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-monsoon_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-ocean.json delete mode 100644 public/images/pokemon/variant/exp/back/666-ocean_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-ocean_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-ocean_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-ocean_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-poke-ball.json delete mode 100644 public/images/pokemon/variant/exp/back/666-poke-ball_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-poke-ball_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-poke-ball_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-poke-ball_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-polar.json delete mode 100644 public/images/pokemon/variant/exp/back/666-polar_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-polar_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-polar_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-polar_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-river.json delete mode 100644 public/images/pokemon/variant/exp/back/666-river_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-river_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-river_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-river_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-sandstorm.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sandstorm_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sandstorm_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-sandstorm_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sandstorm_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-savanna.json delete mode 100644 public/images/pokemon/variant/exp/back/666-savanna_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-savanna_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-savanna_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-savanna_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-sun.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sun_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sun_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-sun_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-sun_3.png create mode 100644 public/images/pokemon/variant/exp/back/666-tundra.json delete mode 100644 public/images/pokemon/variant/exp/back/666-tundra_2.json delete mode 100644 public/images/pokemon/variant/exp/back/666-tundra_2.png delete mode 100644 public/images/pokemon/variant/exp/back/666-tundra_3.json delete mode 100644 public/images/pokemon/variant/exp/back/666-tundra_3.png diff --git a/public/exp-sprites.json b/public/exp-sprites.json index c3b79d0cb38..2bf8c2bf798 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -4545,19 +4545,15 @@ "666-archipelago", "666-continental", "666-elegant", - "666-fancy_2", - "666-fancy_2", - "666-fancy_3", - "666-fancy_3", + "666-fancy", + "666-fancy", "666-garden", "666-high", "666-icy-snow", "666-jungle", "666-marine", - "666-meadow_2", - "666-meadow_2", - "666-meadow_3", - "666-meadow_3", + "666-meadow", + "666-meadow", "666-modern", "666-monsoon", "666-ocean", @@ -4566,8 +4562,6 @@ "666-poke", "666-polar", "666-river", - "666-river_2", - "666-river_2", "666-sandstorm", "666-savanna", "666-sun", @@ -4817,86 +4811,46 @@ "665b", "665_2b", "665_2b", - "666b-archipelago_2", - "666b-archipelago_2", - "666b-archipelago_3", - "666b-archipelago_3", - "666b-continental_2", - "666b-continental_2", - "666b-continental_3", - "666b-continental_3", - "666b-elegant_2", - "666b-elegant_2", - "666b-elegant_3", - "666b-elegant_3", - "666b-fancy_2", - "666b-fancy_2", - "666b-fancy_3", - "666b-fancy_3", - "666b-garden_2", - "666b-garden_2", - "666b-garden_3", - "666b-garden_3", - "666b-high", - "666b-high", - "666b-high", - "666b-high", + "666b-archipelago", + "666b-archipelago", + "666b-continental", + "666b-continental", + "666b-elegant", + "666b-elegant", + "666b-fancy", + "666b-fancy", + "666b-garden", + "666b-garden", + "666b-high-plains", + "666b-high-plains", "666b-icy-snow", "666b-icy-snow", - "666b-icy-snow", - "666b-icy-snow", - "666b-jungle_2", - "666b-jungle_2", - "666b-jungle_3", - "666b-jungle_3", - "666b-marine_2", - "666b-marine_2", - "666b-marine_3", - "666b-marine_3", - "666b-meadow_2", - "666b-meadow_2", - "666b-meadow_3", - "666b-meadow_3", - "666b-modern_2", - "666b-modern_2", - "666b-modern_3", - "666b-modern_3", - "666b-monsoon_2", - "666b-monsoon_2", - "666b-monsoon_3", - "666b-monsoon_3", - "666b-ocean_2", - "666b-ocean_2", - "666b-ocean_3", - "666b-ocean_3", - "666b-poke", - "666b-poke", - "666b-poke", - "666b-poke", - "666b-polar_2", - "666b-polar_2", - "666b-polar_3", - "666b-polar_3", - "666b-river_2", - "666b-river_2", - "666b-river_3", - "666b-river_3", - "666b-sandstorm_2", - "666b-sandstorm_2", - "666b-sandstorm_3", - "666b-sandstorm_3", - "666b-savanna_2", - "666b-savanna_2", - "666b-savanna_3", - "666b-savanna_3", - "666b-sun_2", - "666b-sun_2", - "666b-sun_3", - "666b-sun_3", - "666b-tundra_2", - "666b-tundra_2", - "666b-tundra_3", - "666b-tundra_3", + "666b-jungle", + "666b-jungle", + "666b-marine", + "666b-marine", + "666b-meadow", + "666b-meadow", + "666b-modern", + "666b-modern", + "666b-monsoon", + "666b-monsoon", + "666b-ocean", + "666b-ocean", + "666b-poke-ball", + "666b-poke-ball", + "666b-polar", + "666b-polar", + "666b-river", + "666b-river", + "666b-sandstorm", + "666b-sandstorm", + "666b-savanna", + "666b-savanna", + "666b-sun", + "666b-sun", + "666b-tundra", + "666b-tundra", "6705b", "6706_2b", "6706_2b", diff --git a/public/images/pokemon/666-high-plains.png b/public/images/pokemon/666-high-plains.png index c294984e4699a072f3b3c1f7f175eb3374a3f195..45cb22fc592e9234b5cb3d02878c0ebb35d60510 100644 GIT binary patch delta 959 zcmV;w13>)B2l5AyBqRZIQb$4nuFf3k0000pP)t-s0000G5D+jhFf(;SP)bU7Jt2`e zA%Dhz-Y5V701p*q@M{RcI{SM4Qv(?3dM2D}@91>>A})8pwd*JGe+HZ# zLXdM5f%80j9|?{I#tgs#j3Nv<4l#%=7HwsO*y~du(1wxXC=8@VQ|W5m zwwR!S&;XBF7hUUVT-ot>PWN-|m98X3Hr3kuoC4Q5i=T9*F|+HKB+fAxfk@+>nK5LJ{m4iab8V@>ElL|KS)Din-m9 h@&AGj&5yN=lJPA%7bq%cB4Q00DGTPE!Ct z=GbNc00T%#L_t(o!=>1Za;zW>0MJd8wW#R-|Lx6-r>OLn={POmF$7@Uem?(I07j~w z3FqLw>W#SE0q$3b5Pvh^biMwBoG?tBXYY~Vr~!tF9>QZ8G$PT>#~6}{8)E>u4MTG} zVkptiX>5csf`2+fyR@m|96%C*=y^2IqywcfGzLPK@KoxYFyTETVO=W(wU7xE9ARNCzF60Lnf-((J;gat+7Lrm{=u@GkD)jF&iNvp-8LdUL_$U3?6g1 z8dU44-ZgUrg#;lJsYFEgiq%yHlvjGp*%A*%M4%$hD}RxY(x?Nu8ZFT^N@O66zHzz- z<3dEFX9xlVMBm7Pv_{p-R!C!LW$->C$$+>^LLzL*Hij)BUa&41MHsRjVi0Rww3QKJ ztxthK8%BzwFpvs$rK?rjV1foh4cum7@NOuFLItg;K_$YH7)B75g??s!LOUg4b%+?K zWJCU_XMY%%dEp;cT7oyamCB$}u6bN?nehhb7=;2$S?~r(MukKL<`e_Y5xD?r$T}(w zRY2|(V&h*Wtydt0(Heer4(L`Lg%qNkTm6I4Af6@}HpCbP2eR?h-x#)*TVth~ZPskC zu!->$#s%>nwi(r6V0#bak`Zp)%7VNB%B)|*=zk)l{QUf|;OZvly}O2yk$MGgY`9vt z56TWPKtc$B2Lppgmbv* zB@cyK?971MF9U#hOhN=O1Gc3`s2s=PZxQd0Lx}*0u<>PCu-q%rxIuU@$p`?H3*b`# ztA81b2Ev;$(OvN%LS0yDN1|^4iXq74CNsX@1#G$%PeuKo1RK}5oN1{M{O(^0=h!SZxH)H|dzO%&x?{Yvu65hW% sngTa1WB=!{zWvj3_HGQo19a73KG94IdjJ3c07*qoM6N<$f|sR|!vFvP diff --git a/public/images/pokemon/back/666-high-plains.png b/public/images/pokemon/back/666-high-plains.png index 22f676d8f49d95897204fb63170752e2b5f15914..d6cca9c2413dc4c6b0ab535c8e173077aa62aefe 100644 GIT binary patch delta 900 zcmV-~1AF|A2ek)~BqRZIQb$4nuFf3k0000mP)t-s0000G5D+jhFf(;SP)bU7Jt2`e z9)CN3PKp2k01$LiPE!E?|NsC0|NsC0|NsC0|Np>Hi$eea0~bj|K~z|UrPt|}s~`*j z;0CI9uoHd%x4qebu(kFKKc;hP_zYpuJ|49JJpS5X-@inLn-cLQGTu~-ZxEP-3v%5@ zW(I$GUAGaqmc(5IC~`5B+XxxsShS{h5q~BAl!%OEUDI0#8wd=Zvz%&YYBq@Yj zNWK>|i(P7ws7(I7^@%`9BjsrH1~(!6U~K!r zgDz5(8hk>a4P3U3T;TpljXw6Hseh`K4}P?PeqkY;h~C^8+=gimt`x09~%1MZUe!OB8}O+!6%FK4ZwMXvNE=fLV7|UXxXsCU@v(f*jRL*anMG> z>>UN{EQvAtp&-(VxTh^i6^Hpe@}vxjVfpb;6+A7&NHP2 z5whV3{h;mA8$&sZ;Sl<}SAT*H+~WrWLSw{Ow|F)pAwsY*L%hMEdl?fG*@%|L(s0P` zh~Myh{s0!_j&X`mDobxmXVp=Q@p=NC;VFF aACLb)=w$Hx*$D>#0000Gj&5yN=lJP9)GU?sl5OI00DGTPE!Ct z=GbNc00R$6L_t(o!==~hma8BP0N^Ib9h^qr|8Xx_fUs!o8GiKi)bJU?qJ6zu19<(l zL5yD_(@it+B{JVsjBgNFgbQ-QpA7!-JRc))UJ_3c$dMOAd5mNuUexp{qQsvPk&(ok zf;>RjSkx49JAcn-2rQ$3N0Ja9A?04sEq19z%58}N4hBgGb_EfF*hpFu+QIdP*deg* zj9?CKh|NetXx|ml-VopaI%402UfNvU9*0O7LQ~$sY|_ntMs5Zois{8N9p67GX6I z_0;GMN@F5W(?}(nyunQfKN#D7@IpjDRD(|lD!Y=mja=aVlp7+(ofeY=KiWWlun!zxivctjtUV1SjQP-iW8v^ zv|`v{5NjR;HWuAy9260kulHbQNeICYg$RCu1j$zrQSP(;g8=C`jv&n!gPg%gI5>s% zdlIB#_&q~HWTPR+k`X%yn#$UU=su7%5Q3x!M5`+|n2v@=L^;Y9gc@Lc%Xe!cz!-Gp5zx?@tR00000NkvXXu0mjfprCvM diff --git a/public/images/pokemon/exp/666-high-plains.png b/public/images/pokemon/exp/666-high-plains.png index 9d6527bf091ee1c3b7b6fb40d1c5b09c76da7aad..a34b2fd825406e65727142da72e1d0581c2ccf1f 100644 GIT binary patch literal 7104 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 diff --git a/public/images/pokemon/exp/back/shiny/666-high-plains.png b/public/images/pokemon/exp/back/shiny/666-high-plains.png index 3f8840b8bf0fbf5264cb5378f466cc83e03fb01a..80e02eede1337b956938cb38f3a2553d83e073a8 100644 GIT binary patch literal 2810 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 literal 2803 zcmai$d0diN7smk+Qb7$-bKl5JF&rhbtXx2ZaZN4JY{CUYgIsc(vO-J=10^kuG&8r< zOwlx#7IVpR+%?Ox#U-0uGPH7=)WK%{c;CcfXk}O z0ssIwnM8000Dut5n72tv@+_%c1WP*LNp}Z3KzX<3q~yia&B@bV(km(|nwgm$bJw+q z!h3srU-Pjl#p6e#T|PZi?!N8+wb-w+vZ$x0abjY^PT*7{nV=Bq?&1Mh|F1T|&nW@` zWWC7*ThG|+&%PI<$BPk>7HPb3=e6~dnGRBL?52F%urEbDLez1OgKpJ=`Jq#L&ra7a zftIZGCxcjL))hNCqm>bKe`=f2XN5uGt8zP#Gc4PS_(LhmB}6&RaNBZ`MQ_agJ=06Z zsFlLS-Mj%eOym2mDe(?rJ(wG0spn>v(nYT=O;B$?>fGeFdqD#Qr6&3@@Um> zEU@4v@o`MvzN~*Oe zS9~7CBS)WWz*?P_<@&5=YR!MY^(!bve`G+$NVgfWc$w~&*>mgQqS!jH`qV%g0ZT(T z0FK5NCA5wX-ZJJsBwK3$uRZO>0U-!vct0IH-GZt8k% z!#O;slGd8!lI9>K!*ONkX1Wh1y@5u{O_@;RSdBIjI3;F!xH)Q+CsJ5iKKl_zo zhFpe`fReoB#*mGh5dN`G*0JH(DYgT1mGx(0mBehTQHmmM7Rxi&gh6ID?XRfXFLSyH z>kplc%NwK8qw6}oL||^dK;CuOc9^R+!k&-(?;q)Fk1`gC|wVb zbERnJbw%Fw;kCN8!tOg{-7h3)vWwvjRrmQ9p5$vFr|eBA?1IN53^8W?W*Rbd zw0SspR$mB@!-RyN!G}+&gr0at@O_TCvmM2Q%bsAI59JT`0ur8*tv+p2{Oi6B(3&a^ zB0fD^i(_=Tl*tsGXh_E8bol!m*p-bk5|7XetLb6e=p_oRBT3)L|pF>a5 zna(DZ_*N@!?AYjUH9!LD5pz_pn;ZJ;Tl(=i_KH4Ae@IdMBFPzVvL+qAFKkh(u;%(w z(&1hay9A~0>!qEl?GrfZ0%VtdA^hc-YgzizO9bJH_HP0G$rgKgro%A?pIud#RuBvE zZL_fGF%C++i}d=KzONNnbrpuJj)b|-VFX4heT1dIJ2P$6idwb{c z1R0Auz%@VDIUZ8G*W+>9EA`_ys3bD@$r<`pJKwmj-zmzZp@en6^XExD#jAQPXu}520A`}c7pr$t+A!dJ+B{WF{sZ-@QA<%DtRzI_lz|@5MyC^7 z0-May7dEYp+9Vu_Rb|u6wm^J4ollFLuA$Q*9b#P!EmeC5KS%_R6Txy)c1%npP=%K2 zhH@F(S!^U!{R>ECMb|^4S6XvG9X($8yU0oHLjpw-|1^WzAIw&`0qFoUw9y{G-N;Ph z$#gltE2FU&jx3=lZNoOpuC^|}NWBfl=b%7w7TM4au$+uo^FwEcjRoUbMA9BMjeh!z zb`&JyRs^JBAn}2g?w*hC8X-;Q34+(yu6tM2Sy77Qux}toUYRliMNXmWU9lST+u^W` zN$33fCrQt_;Z5dmgRw1ff?(-w5J<;2Nty5Zx%^b#!SN)HT=LaEN*!+zQ-wQvNg5x) z9g*=#D{ge?ZY-t9iXU_p?!l(5NLGD$gi*KiCq5#Dg~gc35RP=mw_AO@Iln`q&P41r zTVkh7M*U@?#WNWz<@rWVht>Z=CGoex-lXe)FjxIAnx;R)k(}i={_S>zh?i2iWea*h zTHWgjRml0he;S_A*KR&Y6@oT(OVaV&N+C85YoPOwmO(m1!B{H4;+BLUA5rJHorw3F zr^Fo~g#1sOjr2FzmJ7z>L;lJ3=T?xziVP(?U_+J8rj-{+=98PuGy5g#0;a?g+Qrl4H;&VW#N4E^r)Bc*|{s|!4yAaClsO-N1m8}fW diff --git a/public/images/pokemon/variant/666-continental.json b/public/images/pokemon/variant/666-continental.json index 67e25fc79b4..92614fb346c 100644 --- a/public/images/pokemon/variant/666-continental.json +++ b/public/images/pokemon/variant/666-continental.json @@ -2,6 +2,7 @@ "1": { "101010": "101010", "595959": "724b7a", + "555353": "724b7a", "d18257": "d18257", "f9bd55": "f9bd55", "303030": "402746", @@ -15,5 +16,23 @@ "c3c3c3": "ffeaff", "811c1c": "811c1c", "e08528": "e08528" + }, + "2": { + "101010": "101010", + "595959": "8f551e", + "555353": "e99b44", + "d18257": "d18257", + "f9bd55": "f9bd55", + "303030": "6d2d0d", + "f8f05e": "f8f05e", + "d24c3e": "d24c3e", + "675220": "9c5c19", + "ceab62": "e99b44", + "707068": "e99b44", + "504a4a": "9c5c19", + "aa5844": "aa5844", + "c3c3c3": "f8f27f", + "811c1c": "811c1c", + "308528": "308528" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-continental_3.json b/public/images/pokemon/variant/666-continental_3.json deleted file mode 100644 index ed0fee105bb..00000000000 --- a/public/images/pokemon/variant/666-continental_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-continental_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:70eae64f87d7226958d0443e262bab16:5ea86607863e872365dc956f4d819752:23aaac2256d564b9d8a58d7de70397c3$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-continental_3.png b/public/images/pokemon/variant/666-continental_3.png deleted file mode 100644 index 24e4c9ab37cf95d330d8eb9913524fc42905ba44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1352 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 diff --git a/public/images/pokemon/variant/666-fancy_3.json b/public/images/pokemon/variant/666-fancy_3.json deleted file mode 100644 index be0625b1360..00000000000 --- a/public/images/pokemon/variant/666-fancy_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2d5276d8c199bae070dbaa73293fd554:a099f55391d8e4bbae565d4a170574c9:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-fancy_3.png b/public/images/pokemon/variant/666-fancy_3.png deleted file mode 100644 index a8453d6cbce1ed7c6c8a7316cdb34ec3d5f4b1c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1490 zcmV;@1ugoCP)0{{R3@DxZv0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKp2MKrk09S9PCiUAwzYt4l3eUs#pXIrLEAagUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|3-jj3i|98fjO z$RrbDzOX6=UlE`QOd=vNQ%_|VbMPEr_we!kF2=LG>;4>rO3`G1Pb7{r-LQx^h-Wt~ zo%23%m{lZ&_?&pcpbHW|a$R=$jdR&yfoFz|TxOm)Oe~grSngp~F;wCi;;5o(lrQ96 zRyc2QR%;E`xhH>NsHm-ExlU^oNh~3SG(^Z~po$tS#Aw$@F_EG3gol5`@u$fpldB3w zjs?`ALUR1zfAG7vW@&oLO$sG|z>95vi~+%2pxw0X?_=9;p8)=6;7aTI>n&jJlk{d+ ziyi?(+rY(jSCjXE%N-!{q)Ue6NPb#EsRX>A(Ki)<;agx}&Fx#~9H$RJj(W9x0~{Oz z<7LWT_jq@IZ{Pl{>Gbahg>G`LH^sMU0000mP)t-s0000G5D)-&8-W}g-atTKsy=U@ zLZ-iExxiYs(rxMBQqO+#(CLli>4NgqOLZ5p92d z{;2^xIrW+Fe!gOH>Kk#n0bxDz8k<%$8ju|kvggO8^TfA0Or!B6UPHYf?_-l#K5EJgJ~oI z1vw@IhcG8ZjL4HR&I!+GV1#cmAgEC$QDq3>IpGQ6G^io>56J5+K_+o=@qN6GI`l=N zX@obSVxY-bbx}$WqL3R=sSK^p$!P+T=axt{M0YI_SQ3^;<~A8w`}pjgK^?Bm$I8fgQ==l) zs6IH%ESbZO`q14~J1kZpknBj!Z& zQVl#?+p!}k$|t(`YGgja{T2vk-*5n^%|=OtjjF(2bHKeIzTQF&UKu6o!qi(4Ay*2K z`BzL`j$#C@FSoR*gOB#khRLm|_`58H@Lr z_0W$c+MaRuu>+h;4p9s+1M=A;^qfe6-F`8F^qN68%Y2}U?<&0-Hwe&RsWTcvPfZ5U zXWtJ7M+ICWARk(0&{f#&AC`&|(v}9G8iL5mFz|YvwzK=mSRu3VdJ*z^7lTuici|(0 z5GLMlHK0zY_wp(<;>J+KMIRHq={pPvY6gE-`clkmqa?z+f88N+N5T?ux^dqbpNXzU2pPlRDKQ}PPS=Fbgd(^y6#2M` swNO)5|KWHhbg|2x=l?1Bo7kV9KUa2F#yB+sJOBUy07*qoM6N<$g3ed0!vFvP diff --git a/public/images/pokemon/variant/666-high-plains.json b/public/images/pokemon/variant/666-high-plains.json index fd26a077f34..85a5eb24cc3 100644 --- a/public/images/pokemon/variant/666-high-plains.json +++ b/public/images/pokemon/variant/666-high-plains.json @@ -14,7 +14,8 @@ "c3c3c3": "ffeaff", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" }, "2": { "101010": "101010", @@ -31,6 +32,7 @@ "c3c3c3": "edc67c", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-monsoon.json b/public/images/pokemon/variant/666-monsoon.json index 8aaedab67ca..915d471b2b1 100644 --- a/public/images/pokemon/variant/666-monsoon.json +++ b/public/images/pokemon/variant/666-monsoon.json @@ -1,36 +1,33 @@ { - "1": { - "101010": "101010", - "595959": "724b7a", - "f0f0f8": "f0f0f8", - "303030": "402746", - "675220": "958c8a", - "ceab62": "d9edd4", + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "707068": "a97cbc", - "504a4a": "7f6991", - "4eccd6": "4eccd6", + "ceab62": "d9edd4", "5676de": "5676de", - "c3c3c3": "ffeaff", - "811c1c": "811c1c" - }, - "2": { - "101010": "101010", - "595959": "656565", - "f0f0f8": "f0f0f8", - "303030": "4f4645", - "675220": "2c3593", - "ceab62": "5857bc", - "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "707068": "5857bc", - "504a4a": "2c3593", - "4eccd6": "4eccd6", - "5676de": "5676de", - "c3c3c3": "b8f9f9", - "811c1c": "811c1c" - } + "4eccd6": "4eccd6", + "989898": "989898", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "3d3231", + "675220": "2c3593", + "504a4a": "2c3593", + "595959": "4f4645", + "707068": "5857bc", + "807676": "807676", + "ceab62": "5857bc", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "92f4f4": "92f4f4", + "c3c3c3": "b8f9f9", + "f0f0f8": "f0f0f8" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-ocean.json b/public/images/pokemon/variant/666-ocean.json index 975602c6f9e..23f8d48c681 100644 --- a/public/images/pokemon/variant/666-ocean.json +++ b/public/images/pokemon/variant/666-ocean.json @@ -22,7 +22,7 @@ "e1384d": "e1384d", "f4ad61": "f4ad61", "f8ef6a": "f8ef6a", - "303030": "b56208", + "303030": "b54908", "675220": "bc601c", "ceab62": "ea8742", "707068": "ea8742", diff --git a/public/images/pokemon/variant/666-poke-ball.json b/public/images/pokemon/variant/666-poke-ball.json index e83072c51a5..fe6b42f6ef3 100644 --- a/public/images/pokemon/variant/666-poke-ball.json +++ b/public/images/pokemon/variant/666-poke-ball.json @@ -14,6 +14,25 @@ "504a4a": "7f6991", "c3c3c3": "ffeaff", "811c1c": "811c1c", - "a9a99e": "a9a99e" + "a9a99e": "a9a99e", + "2c2b2b": "402746" + }, + "2": { + "101010": "101010", + "f8f8f8": "00006d", + "303030": "ae001a", + "2c2b2b": "660000", + "504a4a": "a70038", + "595959": "df0036", + "c3c3c3": "f0a6bf", + "707068": "d5375a", + "a9a99e": "000050", + "811c1c": "811c1c", + "971d1d": "040046", + "b72c2c": "00005e", + "dc4b4b": "19007d", + "e97e7e": "2e2095", + "675220": "a70038", + "ceab62": "d5375a" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-poke-ball_3.json b/public/images/pokemon/variant/666-poke-ball_3.json deleted file mode 100644 index d506cef780e..00000000000 --- a/public/images/pokemon/variant/666-poke-ball_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7ff5b539e59b71fa67f66f26bb0f2e9d:45bec6d118350401c25850e5f12a25af:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-poke-ball_3.png b/public/images/pokemon/variant/666-poke-ball_3.png deleted file mode 100644 index e6056246fce5aca66e7297d2940276c8905b6c18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1417 zcmV;41$O$0P)0{{R3@DxZv0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKp2MKrk09S9PCiUAwzYt4l3eUs#pXIrLEAagUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|3-jj3i|98fjO z$RrbDzOX6=UlE`QOd=vNQ%_|VbMPEr_we!kF2=LG>;4>rO3`G1Pb7{r-LQx^h-Wt~ zo%23%m{lZ&_?&pcpbHW|a$R=$jdR&yfoFz|TxOm)Oe~grSngp~F;wCi;;5o(lrQ96 zRyc2QR%;E`xhH>NsHm-ExlU^oNh~3SG(^Z~po$tS#Aw$@F_EG3gol5`@u$fpldB3w zjs?`ALUR1zfAG7vW@&oLO$sG|z>95vi~+%2pxw0X?_=9;p8)=6;7aTI>n&jJlk{d+ ziyi?(+rY(jSCjXE%N-!{q)Ue6NPb#EsRX>A(Ki)<;agx}&Fx#~9H$RJj(W9x0~{Oz z<7LWT_jq@IZ{Pl{>Gbahg>G`LH^sMU0000jP)t-s0000G5D;bn00aO=002+`0A2t9 zZ5aT4fgBvJ02-$NINty^)i+u$AeHc@zvsx3ZU6uP4|GyaQvm<}|NsC0|NsC0|NsC0 z<&B=E000AQNklo%WKnP75LCk? zpz}hcXJM_N$mc`qko}OWO@gG2``r-@!;IvO1FBSrr1$bjG13Fk+NdEv4AH?ZZ=;{@#QPm?MtIw)jAtGi8FTK1k?|Hq`)ZOkpF%7cZ#AU1 z8Wu(@@|t0R#0b>@h=gG5iE1G7iUj)Xj6~OC6obyvISM1np+_8OO$}VF;gO(m?5G94RK*O zLsk(D!PPgZg)?%tk!}xDMl@Sliaf_i`ThN6L1t++a@TsIB61@RM8@)BL&mxpbD~FN zvS(gtvKG0X@+IFJ36EEh)(v&7a!~}45Xwp~ogObSrc{7)p|6*INEVt(jJ9XYUUqP#b{?% ziBb_m2FCW4=#b45ifk)HkK7kGG~qL$2#yRzK5k;It0|-ZaI6Vk-{G0{|CIbq-=Cj9 X?#WSr7pRkW00000NkvXXu0mjf21$75 diff --git a/public/images/pokemon/variant/666-river.json b/public/images/pokemon/variant/666-river.json index 818e1ee3989..c7e5e288d05 100644 --- a/public/images/pokemon/variant/666-river.json +++ b/public/images/pokemon/variant/666-river.json @@ -1,19 +1,40 @@ { - "2": { - "101010": "101010", - "595959": "8a5702", - "ceab62": "d9a666", - "303030": "7b2800", - "625841": "625841", - "bc813f": "bc813f", - "9c9143": "9c9143", - "675220": "ae7f41", - "707068": "d9a666", - "504a4a": "ae7f41", - "c3c3c3": "e3c384", - "811c1c": "811c1c", - "279ec2": "279ec2", - "59c9d3": "59c9d3", - "1d726a": "1d726a" - } + "1": { + "101010": "101010", + "303030": "402746", + "4a412c": "4a412c", + "675220": "958c8a", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "7f6991", + "595959": "724b7a", + "625841": "625841", + "707068": "a97cbc", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "c3c3c3", + "d2a862": "d9edd4" + }, + "2": { + "101010": "101010", + "303030": "7b2800", + "4a412c": "4a412c", + "675220": "ae7f41", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "ae7f41", + "595959": "8a5702", + "625841": "625841", + "707068": "d9a666", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "e3c384", + "d2a862": "d2a862" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-river_2.json b/public/images/pokemon/variant/666-river_2.json deleted file mode 100644 index 0da0f00b0be..00000000000 --- a/public/images/pokemon/variant/666-river_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-river_2.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:39f778a45b20cfcfded5a350ee1a02e9:5d7e7e891b7da588a2ebd23733da6c2d:fa23dc87fc53ba2cfa532cf440553cf5$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-river_2.png b/public/images/pokemon/variant/666-river_2.png deleted file mode 100644 index a5a65f4933b4357e8979aaa8976410144bfddd4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1388 zcmV-y1(W)TP)0{{R3@DxZv0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$i(@I4u4t5Z6$WX+0Yt2!bCV&JIqBE>hzEl0u6Z503ls?%w0>9U!!7Of>^>K-DZG zlT3*D!m1d2MF1lZFo~$dOg)ud%)xVf-NVP%yBN>%KKJJsREj18d?In2>4rtTK|H%@ z>74h8!>l4H#OK6OgDyz?$aUG}H_l~;1)do;a+!JJFtJ$fVY!D{#ZZZ7h$D)sQNECO zS>e3JS*Lgn-od_eJ{5CF%ATGfp*ijzmILZeFFHOfh(=+ueX4?Ptu!R zEph}5Z37qAT}|EtE_Z;DCtWfmNAlAYN+sa^jJ~M=4Br9+Yi@6yeVjf3IqGWp1~@nb zCd!n(?(y#a-roK_)9LRA+HP{t3&zYp0000sP)t-s0000G5D;flAV4QZ9dc@7SV3}2 zdVw4qyn#QQkwea_Vt;9oseHUAp2Atl)0K>h+3nQ->i{W^dhh(Pf?M8oJnnrTQ)dki7!HI1ELkVxP_D7Q8?EFDN9oSSGib}*I0ac3wD2UTLi z$ZJBxG!YW!IYXR`QVHfD#UNq|83LYL5t-)xvX~}rBNEgjJpOem055g<^4Q77zHxmA_Lw% zra_6EwDb)__i|~>*mAz58YG--Jf(3%h5^pE6N7;Bdm6WjQ0HmGp=&EPT*UQdT0v0x z`S~Hi=Uu}z8N+;|DKg{=89vts`J${4iVRaqllBv@E6#*ZPTm@W5cea9bAxu{^QY4} z84*>V^l01;F{<#lu5;VIBY|g5K;-y{L0S0U8GhUG3?)V+u+>|lVZ_PcSoq*M3=leC-%~AAX&NRG zztO7VM&bh<*m61{>QgZWjzeJE>8;O)Lc6NC4clqxWJbOf2O0dz-LjxjEkhF-T_V)T z5y_%KXd-SjMtogn#6udA$hE-Pe;Rs;SP?}k#`u*m$e0s?j6H-!%7+^+;h7M`)eJ!% uUt-r#Rce3X=o8G?YES=PN`5o;_4)@Re^Tv_$t-XH0000Px#Gf+%aMF0Q*5D*X%2QpO#96kj{Y6(vXM?hIwS!ifzswO;~BVWx*N*#b#++vl# zzrW;@q4@atNpK1d0000HbW%=J0RR90|NsC0|NsC0|NsC0{}2^Gp#T5@)k#D_R7i=H zlnIuDAP_{Yp%KMMxc_OV7f?ib<5Xf4{8ctfoTi(I>-c&-0r0ozIGw#U1i8-y*9Qf9y?py3%H@y#o`|!Ur2?#fKvh z+{?yN{0JY8fd3o63P7OR>pcp#d=S!KE_1z(!TDm}wmV-b%wk0au?Mt976VuH6@tS#h(cpSh@M-?cckodXKYw21 z690LHbMUOcOzY(z_{TV|{8heC=6G37;os3bt7_nCo?q<`2K)n7y`S^}{tM+*C9>Hs R4;}yj002ovPDHLkV1gmzAvOR2 diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 5c09931ecf2..6d2da0ed0ee 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -526,9 +526,9 @@ "664": [0, 1, 1], "665": [0, 1, 1], "666-archipelago": [0, 1, 1], - "666-continental": [0, 1, 2], + "666-continental": [0, 1, 1], "666-elegant": [0, 1, 1], - "666-fancy": [0, 2, 2], + "666-fancy": [0, 1, 1], "666-garden": [0, 1, 1], "666-high-plains": [0, 1, 1], "666-icy-snow": [0, 1, 1], @@ -538,14 +538,14 @@ "666-modern": [0, 1, 1], "666-monsoon": [0, 1, 1], "666-ocean": [0, 1, 1], - "666-poke-ball": [0, 1, 2], + "666-poke-ball": [0, 1, 1], "666-polar": [0, 1, 1], - "666-river": [0, 2, 1], + "666-river": [0, 1, 1], "666-sandstorm": [0, 1, 1], "666-savanna": [0, 1, 1], "666-sun": [0, 1, 1], "666-tundra": [0, 1, 1], - "669-red": [0, 2, 1], + "669-red": [0, 1, 1], "669-blue": [0, 2, 2], "669-white": [0, 1, 1], "669-yellow": [0, 2, 1], @@ -1438,7 +1438,7 @@ "666-archipelago": [0, 1, 1], "666-continental": [0, 1, 1], "666-elegant": [0, 1, 1], - "666-fancy": [0, 2, 2], + "666-fancy": [0, 1, 1], "666-garden": [0, 1, 1], "666-high-plains": [0, 1, 1], "666-icy-snow": [0, 1, 1], @@ -1450,7 +1450,7 @@ "666-ocean": [0, 1, 1], "666-poke-ball": [0, 1, 1], "666-polar": [0, 1, 1], - "666-river": [0, 2, 1], + "666-river": [0, 1, 1], "666-sandstorm": [0, 1, 1], "666-savanna": [0, 1, 1], "666-sun": [0, 1, 1], @@ -1864,19 +1864,19 @@ "666-archipelago": [0, 1, 1], "666-continental": [0, 1, 1], "666-elegant": [0, 1, 1], - "666-fancy": [0, 2, 2], + "666-fancy": [0, 1, 1], "666-garden": [0, 1, 1], "666-high-plains": [0, 1, 1], "666-icy-snow": [0, 1, 1], "666-jungle": [0, 1, 1], "666-marine": [0, 1, 1], - "666-meadow": [0, 2, 2], + "666-meadow": [0, 1, 1], "666-modern": [0, 1, 1], "666-monsoon": [0, 1, 1], "666-ocean": [0, 1, 1], - "666-poke-ball": [0, 1, 2], + "666-poke-ball": [0, 1, 1], "666-polar": [0, 1, 1], - "666-river": [0, 2, 1], + "666-river": [0, 1, 1], "666-sandstorm": [0, 1, 1], "666-savanna": [0, 1, 1], "666-sun": [0, 1, 1], @@ -2193,26 +2193,26 @@ "658-ash": [0, 1, 1], "664": [0, 1, 1], "665": [0, 1, 1], - "666-archipelago": [0, 2, 2], - "666-continental": [0, 2, 2], - "666-elegant": [0, 2, 2], - "666-fancy": [0, 2, 2], - "666-garden": [0, 2, 2], - "666-high-plains": [0, 2, 2], - "666-icy-snow": [0, 2, 2], - "666-jungle": [0, 2, 2], - "666-marine": [0, 2, 2], - "666-meadow": [0, 2, 2], - "666-modern": [0, 2, 2], - "666-monsoon": [0, 2, 2], - "666-ocean": [0, 2, 2], - "666-poke-ball": [0, 2, 2], - "666-polar": [0, 2, 2], - "666-river": [0, 2, 2], - "666-sandstorm": [0, 2, 2], - "666-savanna": [0, 2, 2], - "666-sun": [0, 2, 2], - "666-tundra": [0, 2, 2], + "666-archipelago": [0, 1, 1], + "666-continental": [0, 1, 1], + "666-elegant": [0, 1, 1], + "666-fancy": [0, 1, 1], + "666-garden": [0, 1, 1], + "666-high-plains": [0, 1, 1], + "666-icy-snow": [0, 1, 1], + "666-jungle": [0, 1, 1], + "666-marine": [0, 1, 1], + "666-meadow": [0, 1, 1], + "666-modern": [0, 1, 1], + "666-monsoon": [0, 1, 1], + "666-ocean": [0, 1, 1], + "666-poke-ball": [0, 1, 1], + "666-polar": [0, 1, 1], + "666-river": [0, 1, 1], + "666-sandstorm": [0, 1, 1], + "666-savanna": [0, 1, 1], + "666-sun": [0, 1, 1], + "666-tundra": [0, 1, 1], "669-red": [0, 2, 2], "669-blue": [0, 2, 2], "669-white": [0, 2, 2], @@ -2478,4 +2478,4 @@ } } } -} +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy.json b/public/images/pokemon/variant/back/666-fancy.json new file mode 100644 index 00000000000..5d368667ae3 --- /dev/null +++ b/public/images/pokemon/variant/back/666-fancy.json @@ -0,0 +1,36 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "d9edd4", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "ffeaff", + "f2d4e3": "f2d4e3", + "ead2e3": "ffeaff" + }, + "2": { + "101010": "101010", + "303030": "00771b", + "675220": "b9c05a", + "504a4a": "b9c05a", + "595959": "6f9f42", + "707068": "6f9f42", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "e3e982", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "fcf1ff", + "f2d4e3": "f2d4e3", + "ead2e3": "fcf1ff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy_2.json b/public/images/pokemon/variant/back/666-fancy_2.json deleted file mode 100644 index 49478186fd7..00000000000 --- a/public/images/pokemon/variant/back/666-fancy_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_2.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c0935d72f3dd919dfad1f00ce1550c3c:4c9a4c435b13a6c8dbd3fa6eacd260d8:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy_2.png b/public/images/pokemon/variant/back/666-fancy_2.png deleted file mode 100644 index a1e23edd659530f500129a98e3b7fe418278d5bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1410 zcmV-|1%3L7P)0{{R3@DxZv0004mX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKp2MKrj{0|I9No)AwzYti;6gwDi*;)X)CnqU~=gnG-*gu zTpR`0f`dPcRR~rk=_!=HNNL?&0J6U5saW*ZnyLl%mN1pGX{Mx?vG-5YKK} zI_G`j2&+g6@j3CNK^G)`Lgn-op}ffw8U7zcv8K)Y$%-^aGyJ^}pCz?IhZ*IU5cC+W?u z7Ciz6w}Ff6t|spRmpj17lP(#OBl&3wr4sOdM&DEbhHioWHMeh_bDTZ^IqKE&4RCM> zOq3~m-Q(S%-oE`?)9K$2QA2W>Ezv&O0000jP)t-s0000G5D-8oMsiDf-atTKsy?>T zZRy}re`%4ae7w(o^OcN>!^6Yb?bPzrVh8GEB@PEB}19<&! z1Mh!CmLEmpM`Zm`Hhw{1)18s<9N8K4WeATE2$#fD1hD5tDj~%92ti}bMdlQVM~D#n zK=LyK;@%)6XGC)TiU9T6gn=zv`+^`5*Iq!GMCWo&=_{f{hN;+jE@&!TN{mb^4DMuP zCR`k|X++GP5vvjz4c^TJ2kT-SW)<41qVDOwm70tO|M`0&QgYP48NIqP8+27fM#E<^ zLSiGwArLcytcmBV)T@pjCl9MDGcg*CI1U^<>OAsAanNTx)Ih zIwM%2E!GyuL>!5)z7kUFFx=)&CteJD?uJy5NQ?wVE{s~U=d_P-Hi{601Tz){_*;Ky zQ=^4ZiV!K$r;9+K5ou!-YAucp0zHgiNpFlk9|3z_8Pr>Tt89%!jD!1jM2$v}ao~W} zkZCePkrs#=_$4hNML~!d4%=u1BTj*UhJpWdRc3>l7<@X^It3#4!NOo9s3A9Gd`bA9 z7o*l0`6I0pRVuPH+zf0*rl!uwU|8u9;vMdJWi?8v$kZ(|gnOdX9`AjP^Bk zpdm#JMuH$}OpFCG5OR+VA#8DJwPQ0{PYLAxeuEKBZ_6?p^k6TFAB`c+!H{GaIT<#B z5FrKu`*vce)VLrr%0mS|2}IzKW;7&h3>k^Wuqr~tk>~~~i@^%ixokL!(Xbg&Wy5%w z(_mpDCS=XWQ(t_T?g=`IdN$4Q(kKj>Qh!Itfo6to218kb=7J%0V*7dzx|gIm6y2do9!1 z4Q__`PP}acVk2G{;7&%bOEVBLBChK?8GMEf4+jyC4MF%28y*h$I5Vm@;@;rn+7I)J zZ)CKTvM4?UC2l7K%ZH~#6_D3DkVWzOFzksIh+LB@{AwsioV-xl({N)@A;*p+*>KU2 zkJuqxr=mMiv`1GI-ES!xA%eR}#R6#rm9*`ZViegzZ^CHELdZ=yI~chph8nprc-d~l zSdh6RlvZAMgw3n8^B-Cd3ERpxgc|NU(Ui?T1u8uI3wpoPUD-di3;Xr@2b*|KJv%vV Q;Q#;t07*qoM6N<$g7QdwS^xk5 diff --git a/public/images/pokemon/variant/back/666-fancy_3.json b/public/images/pokemon/variant/back/666-fancy_3.json deleted file mode 100644 index f060b4b02c6..00000000000 --- a/public/images/pokemon/variant/back/666-fancy_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c0935d72f3dd919dfad1f00ce1550c3c:4c9a4c435b13a6c8dbd3fa6eacd260d8:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy_3.png b/public/images/pokemon/variant/back/666-fancy_3.png deleted file mode 100644 index 6d15bc3f68089577a429d1cd5463ac36769651c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1416 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 diff --git a/public/images/pokemon/variant/exp/666-high-plains.json b/public/images/pokemon/variant/exp/666-high-plains.json index 330d1c39772..f63bb4f81f3 100644 --- a/public/images/pokemon/variant/exp/666-high-plains.json +++ b/public/images/pokemon/variant/exp/666-high-plains.json @@ -14,7 +14,8 @@ "c3c3c3": "ffeaff", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" }, "2": { "101010": "101010", @@ -31,6 +32,7 @@ "c3c3c3": "edc67c", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-icy-snow.json b/public/images/pokemon/variant/exp/666-icy-snow.json index 9cae71418ce..d69d48d89e9 100644 --- a/public/images/pokemon/variant/exp/666-icy-snow.json +++ b/public/images/pokemon/variant/exp/666-icy-snow.json @@ -6,12 +6,13 @@ "303030": "402746", "cfd9cf": "cfd9cf", "c5c5da": "c5c5da", - "ceab62": "d9edd4", "675220": "958c8a", - "504a4a": "7f6991", + "ceab62": "d9edd4", "707068": "a97cbc", + "504a4a": "7f6991", "c3c3c3": "ffeaff", "acacc2": "acacc2", + "95a1a1": "95a1a1", "811c1c": "811c1c" }, "2": { @@ -21,12 +22,13 @@ "303030": "364051", "cfd9cf": "cfd9cf", "c5c5da": "c5c5da", - "ceab62": "8c91a4", "675220": "666b7d", - "504a4a": "666b7d", + "ceab62": "8c91a4", "707068": "8c91a4", + "504a4a": "666b7d", "c3c3c3": "fefeff", "acacc2": "acacc2", + "95a1a1": "95a1a1", "811c1c": "811c1c" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-meadow.json b/public/images/pokemon/variant/exp/666-meadow.json new file mode 100644 index 00000000000..c766325427b --- /dev/null +++ b/public/images/pokemon/variant/exp/666-meadow.json @@ -0,0 +1,36 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "811c1c": "811c1c", + "b4295a": "b4295a", + "da6b7e": "da6b7e", + "ceab62": "d9edd4", + "e66fad": "e66fad", + "2d9b9b": "2d9b9b", + "f3a0ca": "f3a0ca", + "c3c3c3": "ffeaff", + "f2f2f2": "f2f2f2" + }, + "2": { + "101010": "101010", + "303030": "770921", + "675220": "a2275e", + "504a4a": "a2275e", + "595959": "9e3941", + "707068": "ce5283", + "811c1c": "811c1c", + "b4295a": "b4295a", + "da6b7e": "da6b7e", + "ceab62": "ce5283", + "e66fad": "e66fad", + "2d9b9b": "2d9b9b", + "f3a0ca": "f3a0ca", + "c3c3c3": "f4c2ec", + "f2f2f2": "f2f2f2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-meadow_2.json b/public/images/pokemon/variant/exp/666-meadow_2.json deleted file mode 100644 index 4d4d4d16147..00000000000 --- a/public/images/pokemon/variant/exp/666-meadow_2.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-meadow_2.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223ce33721ef8da9ff40286099c20de4:b82acd304c2a8b8cebeda2043a3e1f96:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } -} diff --git a/public/images/pokemon/variant/exp/666-meadow_2.png b/public/images/pokemon/variant/exp/666-meadow_2.png deleted file mode 100644 index 8aada72636fca9bf42e78bb53711192e1d33050b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7448 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 diff --git a/public/images/pokemon/variant/exp/666-monsoon.json b/public/images/pokemon/variant/exp/666-monsoon.json index edc2e86427e..915d471b2b1 100644 --- a/public/images/pokemon/variant/exp/666-monsoon.json +++ b/public/images/pokemon/variant/exp/666-monsoon.json @@ -1,36 +1,33 @@ { - "1": { - "101010": "101010", - "595959": "724b7a", - "f0f0f8": "f0f0f8", - "303030": "402746", - "ceab62": "d9edd4", - "675220": "958c8a", + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "504a4a": "7f6991", - "707068": "a97cbc", - "4eccd6": "4eccd6", + "ceab62": "d9edd4", "5676de": "5676de", - "c3c3c3": "ffeaff", - "811c1c": "811c1c" - }, - "2": { - "101010": "101010", - "595959": "656565", - "f0f0f8": "f0f0f8", - "303030": "4f4645", - "ceab62": "5857bc", - "675220": "2c3593", - "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "504a4a": "2c3593", - "707068": "5857bc", - "4eccd6": "4eccd6", - "5676de": "5676de", - "c3c3c3": "b8f9f9", - "811c1c": "811c1c" - } + "4eccd6": "4eccd6", + "989898": "989898", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "3d3231", + "675220": "2c3593", + "504a4a": "2c3593", + "595959": "4f4645", + "707068": "5857bc", + "807676": "807676", + "ceab62": "5857bc", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "92f4f4": "92f4f4", + "c3c3c3": "b8f9f9", + "f0f0f8": "f0f0f8" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-ocean.json b/public/images/pokemon/variant/exp/666-ocean.json index 26a38bad7a8..c468bbcbf1e 100644 --- a/public/images/pokemon/variant/exp/666-ocean.json +++ b/public/images/pokemon/variant/exp/666-ocean.json @@ -22,7 +22,7 @@ "e1384d": "e1384d", "f3a861": "f3a861", "fcf372": "fcf372", - "303030": "b56208", + "303030": "b54908", "ceab62": "ea8742", "675220": "bc601c", "504a4a": "bc601c", diff --git a/public/images/pokemon/variant/exp/666-poke-ball.json b/public/images/pokemon/variant/exp/666-poke-ball.json index 36cd38b95f0..fe6b42f6ef3 100644 --- a/public/images/pokemon/variant/exp/666-poke-ball.json +++ b/public/images/pokemon/variant/exp/666-poke-ball.json @@ -3,17 +3,36 @@ "101010": "101010", "595959": "724b7a", "b72c2c": "b72c2c", - "303030": "402746", "dc4b4b": "dc4b4b", - "ceab62": "d9edd4", + "303030": "402746", "675220": "958c8a", + "ceab62": "d9edd4", "e97e7e": "e97e7e", "971d1d": "971d1d", "f8f8f8": "f8f8f8", - "504a4a": "7f6991", "707068": "a97cbc", + "504a4a": "7f6991", "c3c3c3": "ffeaff", "811c1c": "811c1c", - "a9a99e": "a9a99e" + "a9a99e": "a9a99e", + "2c2b2b": "402746" + }, + "2": { + "101010": "101010", + "f8f8f8": "00006d", + "303030": "ae001a", + "2c2b2b": "660000", + "504a4a": "a70038", + "595959": "df0036", + "c3c3c3": "f0a6bf", + "707068": "d5375a", + "a9a99e": "000050", + "811c1c": "811c1c", + "971d1d": "040046", + "b72c2c": "00005e", + "dc4b4b": "19007d", + "e97e7e": "2e2095", + "675220": "a70038", + "ceab62": "d5375a" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-poke-ball_3.json b/public/images/pokemon/variant/exp/666-poke-ball_3.json deleted file mode 100644 index 3d133124358..00000000000 --- a/public/images/pokemon/variant/exp/666-poke-ball_3.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_3.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9b0791af9130022168ad784a59e299ce:b180b141bed2ea965d6f07d9e2cd7ecc:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-poke-ball_3.png b/public/images/pokemon/variant/exp/666-poke-ball_3.png deleted file mode 100644 index 767a55ab8490f2848362cf11e0130300c84582f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7549 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 diff --git a/public/images/pokemon/variant/exp/666-river.json b/public/images/pokemon/variant/exp/666-river.json index df10a73d783..c7e5e288d05 100644 --- a/public/images/pokemon/variant/exp/666-river.json +++ b/public/images/pokemon/variant/exp/666-river.json @@ -1,19 +1,40 @@ { - "2": { - "101010": "101010", - "595959": "8a5702", - "ceab62": "d9a666", - "303030": "7b2800", - "625843": "625843", - "bc813f": "bc813f", - "9c9143": "9c9143", - "675220": "ae7f41", - "504a4a": "ae7f41", - "707068": "d9a666", - "c3c3c3": "e3c384", - "811c1c": "811c1c", - "59c9d3": "59c9d3", - "279ec2": "279ec2", - "1d726a": "1d726a" - } + "1": { + "101010": "101010", + "303030": "402746", + "4a412c": "4a412c", + "675220": "958c8a", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "7f6991", + "595959": "724b7a", + "625841": "625841", + "707068": "a97cbc", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "c3c3c3", + "d2a862": "d9edd4" + }, + "2": { + "101010": "101010", + "303030": "7b2800", + "4a412c": "4a412c", + "675220": "ae7f41", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "ae7f41", + "595959": "8a5702", + "625841": "625841", + "707068": "d9a666", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "e3c384", + "d2a862": "d2a862" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-river_2.json b/public/images/pokemon/variant/exp/666-river_2.json deleted file mode 100644 index f840b39ccfd..00000000000 --- a/public/images/pokemon/variant/exp/666-river_2.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-river_2.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3ecaf6e3ae563f3da9598e7b18b87b05:e4ece90a3e9880c6499c363b000de8dd:fa23dc87fc53ba2cfa532cf440553cf5$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-river_2.png b/public/images/pokemon/variant/exp/666-river_2.png deleted file mode 100644 index 863acbbdc7640037628ce703337443d045a120c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7425 zcmZ8mXH-+c)(t8a2p}RM^rC=3K%z83IuQ`5(tAP&snVMW5+I>S5fl{ZL=XwmA@nX% zg7jWQ1B9Z|>vwtY{ra-j&7GNh=Ik@~?0weEx-mLhsx(wAR3H$DMqN!s4+NqxJ-@DA z1V$Va>{NhGq?59;j=Hikmxq_Tz0)&05a>=~NTRG-n*v*h)ej60;}sd4lr64q9D!*6 zq+fOw^4Kif;7YPaQk%T>Z3K7!ke2vm_-flrH}0 z&&KT120NFS;1ltSx(Xw(TZ{=Y6VpZGCm0ZVzKgAs*M2o-8+AEzX^lg!aTej9x>qZ& z`Y}n8d7dFA_lYEIk!JCorp9lAHXDjpom-ASQ?HlkL|8%L(IF@BB z%3LM2L1*_p@+(h9E{h(i2R4*MCWM{3&M(%L^aM38(~9orX`p|qg{CWIg9smqlFMN) z&9eOZ)=MfAeq7;Fwh*2JU5RQoPW(D1J3I4ZVyel(^yCC|w&^wZCC0f0$cu!|6MY15 zzkdC?gC3Ux|08xUXOywBmqy@AHa5ab`S*#+{l%ykPKlp_3H+I@COtpi#9}7ahtF2e z(&lV7ftfeF^|YRX&i?<;vIQ*%0A#pd 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 MM`)>hQL+yIKQ`G;&Hw-a diff --git a/public/images/pokemon/variant/exp/back/666-archipelago.json b/public/images/pokemon/variant/exp/back/666-archipelago.json new file mode 100644 index 00000000000..6386464b74e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-archipelago.json @@ -0,0 +1,35 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "c8373c": "c8373c", + "a2523b": "a2523b", + "c27351": "c27351", + "30c171": "30c171", + "b28e67": "b28e67", + "ceab62": "d9edd4", + "d2bf96": "d2bf96", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "642703", + "675220": "741300", + "504a4a": "741300", + "595959": "824719", + "707068": "a22414", + "c8373c": "c8373c", + "a2523b": "a2523b", + "c27351": "c27351", + "30c171": "30c171", + "b28e67": "b28e67", + "ceab62": "a22414", + "d2bf96": "d2bf96", + "c3c3c3": "e7caa5" + + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_2.json b/public/images/pokemon/variant/exp/back/666-archipelago_2.json deleted file mode 100644 index 8c6fd7bcb91..00000000000 --- a/public/images/pokemon/variant/exp/back/666-archipelago_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-archipelago_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223e2a75aa192f3fb67e18f7f0d6c4c7:ba854fe0d08f005e9aa52e55cdc7eb4e:80cdb6dd219378a41ccf5c2acc7e7786$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_2.png b/public/images/pokemon/variant/exp/back/666-archipelago_2.png deleted file mode 100644 index 86e17e33f11d109bb5b6c2a0a6e333c89dc3fa24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2271 zcmV<52q5=~P)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zVf=Q`8Sa^3`jujbTTx1j3#DkPjn-Hil=WTM{6uHR7&Hf|Wf&x+Uz;EY^!ybet^K zb?t+|u7ZTcx?aTYM@W#YD@ykLHXrtVT{VjpgHK~aP`gILg^+dMZzaJIAZxz^IQKNE zjscoRW4a{Ku|nq=AF?s|B$X;FQ}UKc5-*(6UVR}yzipE&q#(~E{u5Eb&po&w%~?d**OmC1D3mriVI?3zAPpa;(w8 zkR;(};J1d*9cFiZC80s`s`9>$quoI#L59%A-S=IT1SRnqxhhjZ_I?OQTTBHRM?*3h z!Uf4YmuA!ZRFd>e_c4SVeI3Rpj^cZX@GRM)F9L7jUrbx*J#OH0$2}zOz1e4O6 zMTYD`a#fPzh;B7RNMh2;km?NKo%^9A&^YcP@f6`)+d^Vc1)=4~8yD#ZNh)R@1~0%a z2qk;2h);1qzlmaw5Wo6#*(->2^g~LhfbgWbBgD%~NFszCsh)k?H$p@%&kX=a#gnx_ z_5*|^xg-%{dFJ8)poUmJuo)7fe1Vv7ofV`l38aF=s~3Xl6~ve7a*%-Fb%dmn@avEY zQbFj28wh60SdPnCJEoM1V5B*h{Nby11c*z*+lq)}8v{i};xH3r3D?15Ylv`oeyk6I z$t5yEQkZEfvhdYdili=xG0Wl<5J~ZJR3Ydb(ps#5Sjo^rGR1mP5JNc>0tZNCNhJ{u zW)S4o@p=_Vh|P18qLv7Gy>dyG=1LSS$@~4zbD9`^1wn`@*_;{jC@mMZf*d5Jlme0& zDo8D{5h4p4XYm}8C@29jghd40I^-hBk#8uDv_!7wraWiihn|#--h#9cEQUd2Uae6Q;=~l^l#eB03N+>DFG#amIk0jR$W2MYWx=-p)a^LV&9cb2v{a?! zLV>@~n3~e>!1OxWhB#Y-su+M1Nqk$zg5VHLy>+`CB$1g^;BqQ9G2y>-Nn)}f{wL3*3d$_*C}7d zRmpDwIex8%yQY$u;y_52d?L4Ma%fR{J#x63aORA&C)74uALr!9%S&N#OSvcWbUwoEbgD<+UH<3_^}UJU8^7 zx=06qpO+zQ)j4pnirf@u-07-M@4)q2C4I4opY_wyiB>HHkI)zkIgXMpAnnHi`hRS~ml#8iB*{PCZ$74+e{i~ZrCTC?F?5s` z&OZoV0sAG@9}$O3dkGv*doJvMfBjdAHM7}C>6q5+q=!sub{ddOYIagfPR{nryEV;D z1CBY(PD;nLW+y#lQnQm@GOO81E1A~pq+(2Lc2Y4WHalq?Q=6Rz98;Q|h8z=`os^Dw z%}zSV#AYXzV`8(D4l=RXN#&T??4*TEYj)B@CN(>$9g~`!^pHu-PJ@u=o1MlWUS7{M zJE|F9yvy&def2Vo8*=Y=Nw0zy{Gz@7i-!?nxBsHY6 zeBJD%g3N4oQbT4nJLx2+kY}2mbdZV7PD;r|NtOqiopg|i%}z?mbxD>lo1F$E7m9D2 zom7&k%}z?n#AYY8Wm>b7&M~psN#~f??4)wcY7m|mYodzY(H#-eW9&dIUkj!az tQcI>aI}K7MG&_w@<}^D!c8xSU{R7=~g6Ng8CQtwX002ovPDHLkV1kqqKU)9* diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_3.json b/public/images/pokemon/variant/exp/back/666-archipelago_3.json deleted file mode 100644 index 3f9c86ecd75..00000000000 --- a/public/images/pokemon/variant/exp/back/666-archipelago_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-archipelago_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223e2a75aa192f3fb67e18f7f0d6c4c7:ba854fe0d08f005e9aa52e55cdc7eb4e:80cdb6dd219378a41ccf5c2acc7e7786$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_3.png b/public/images/pokemon/variant/exp/back/666-archipelago_3.png deleted file mode 100644 index 7028f550d4554e8836c3779f9125e986aae54724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2261 zcmV;`2rBo9P)EX>4Tx04R}tkv&MmKp2MKrk09S9PCiUAwzYt4l3eUs#pXIrLEAagUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|3-jj3i|98fjO z$RrbDzOX6=UlE`QOd=vNQ%_|VbMPEr_we!kF2=LG>;4>rO3`G1Pb7{r-LQx^h-Wt~ zo%23%m{lZ&_?&pcpbHW|a$R=$jdR&yfoFz|TxOm)Oe~grSngp~F;wCi;;5o(lrQ96 zRyc2QR%;E`xhH>NsHm-ExlU^oNh~3SG(^Z~po$tS#Aw$@F_EG3gol5`@u$fpldB3w zjs?`ALUR1zfAG7vW@&oLO$sG|z>95vi~+%2pxw0X?_=9;p8)=6;7aTI>n&jJlk{d+ ziyi?(+rY(jSCjXE%N-!{q)Ue6NPb#EsRX>A(Ki)<;agx}&Fx#~9H$RJj(W9x0~{Oz z<7LWT_jq@IZ{Pl{>Gbahg>G`LH^sMU0000dP)t-s0000G5D;_|0Awcvq9hc^H#~wz z8KP1?Fz4}8Ol1c0Jnz;a`9vg~Q z-RzuFGA{p^+{6TjQZg?8e5Z3)h(-eAx8tp!UcBDz?6^b$d40O|0>OW=c31*dQ9lUD zcdywth8?342zQP{K8z6B7@nD7Nr0%|qC?BfpL+-_1G12m1s3`wG6 zhru&GWMgtCl`1P!@|H;wFP{O^JnqS1Mo$uo##rCRfyX&3DP`-Pv`$VRA^Z%uN&?=q zV{ilW=5-j`#$l2ek8qqU@lnFhfcty*9CoNA?4Zf?P{(mW^2tb!JvtbYB>W8g)eySF zoOY}vG)P`m-q&%oJLn|H5Zbusd5V&tBt9coWh%%y4&i8rsUYKMNG3zLAbID~Y;z^WJAkdMN!qhLB^dBoNbMtc=4b9y*4^m6{~> zMv~Sw{&RrPG+I1ezdxxr1WNyA*Ybsm83YL zTMZGCn6xvbIzxEpekchvj_;6oig2!LAu*_e(DLJri}Z^m6*CWm7vK_ZX-B_M{diGZ&Txkz&48;T<>k^8wR&pG%@wR28IN ztx*!<#1!Y0k0oIWH02mCNV8fwuyPd0my(3bfouP1*m0ekZIf|nsY=O>0)L?~HD%m^ z>206h0{#U^ksQbP*VAH*A~KKb=zRH#OS^@{-yPl>TFCG^<;&PA`7I#VuhnqZ zR1#Ah2+5M4AT-l?Tpb8+UjZp=D?!pI2%?fehVWFs;eJRhL@e=l3$fD>PI!NT2#MTk zee1+K+JtA=e;@}r) zzpzB@;6*}`G&b6O=H`UX5~ds#c2#gUGw{HVQMA@Tl9xg2LGTVZE~);A zI9=LX;C$M1VgL8nf2CL}o1K)7Wz9}{$f9Pa3CW^nC$*$=w%^{ZX?B`$tZ8;qI+is% z=^=}no%E7b%}!d$vSue0V_~zCim|ZSN#j`B>@?w6((E+lSkUaGbgXN3(m@tBJEMlXM}^G&|`a3!9yklADrj4>UXJAPbwFl#=_BY(F+TO-ODOzcxFmBukr}l$3?d zPHM}tW+$CvVY8FYv98%kL{30c?dGy}0Knw_)~%h!Tt zCnaQEvy&dOsM$#^S=H>MhOp!LW~Uz{4>vnaN}g|anwC7?>@*=+)9j>{ENga}q%3H5 jnxU*|c6#iZX?FS_AGD?=F6P0P00000NkvXXu0mjfq~9!_ diff --git a/public/images/pokemon/variant/exp/back/666-continental.json b/public/images/pokemon/variant/exp/back/666-continental.json new file mode 100644 index 00000000000..92614fb346c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-continental.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "595959": "724b7a", + "555353": "724b7a", + "d18257": "d18257", + "f9bd55": "f9bd55", + "303030": "402746", + "f8f05e": "f8f05e", + "d24c3e": "d24c3e", + "675220": "958c8a", + "ceab62": "d9edd4", + "707068": "a97cbc", + "504a4a": "7f6991", + "aa5844": "aa5844", + "c3c3c3": "ffeaff", + "811c1c": "811c1c", + "e08528": "e08528" + }, + "2": { + "101010": "101010", + "595959": "8f551e", + "555353": "e99b44", + "d18257": "d18257", + "f9bd55": "f9bd55", + "303030": "6d2d0d", + "f8f05e": "f8f05e", + "d24c3e": "d24c3e", + "675220": "9c5c19", + "ceab62": "e99b44", + "707068": "e99b44", + "504a4a": "9c5c19", + "aa5844": "aa5844", + "c3c3c3": "f8f27f", + "811c1c": "811c1c", + "308528": "308528" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-continental_2.json b/public/images/pokemon/variant/exp/back/666-continental_2.json deleted file mode 100644 index 371e157ff8a..00000000000 --- a/public/images/pokemon/variant/exp/back/666-continental_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-continental_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:89725e18f2e4d97217076ac82b40230b:c83c3d03ad1200fc71d95ecafb54bc03:23aaac2256d564b9d8a58d7de70397c3$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-continental_2.png b/public/images/pokemon/variant/exp/back/666-continental_2.png deleted file mode 100644 index 3b9a31469afdccad71e1ac0f6cd2269ab464d3af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2328 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 diff --git a/public/images/pokemon/variant/exp/back/666-continental_3.json b/public/images/pokemon/variant/exp/back/666-continental_3.json deleted file mode 100644 index ec9c98e6312..00000000000 --- a/public/images/pokemon/variant/exp/back/666-continental_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-continental_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:89725e18f2e4d97217076ac82b40230b:c83c3d03ad1200fc71d95ecafb54bc03:23aaac2256d564b9d8a58d7de70397c3$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-continental_3.png b/public/images/pokemon/variant/exp/back/666-continental_3.png deleted file mode 100644 index b61b16538eb9b72d08055ad2242ee796fa24530c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2319 zcmV+q3GnubP)EX>4Tx04R}tkv&MmKp2MKrk09S9PCiUAwzYt4l3eUs#pXIrLEAagUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|3-jj3i|98fjO z$RrbDzOX6=UlE`QOd=vNQ%_|VbMPEr_we!kF2=LG>;4>rO3`G1Pb7{r-LQx^h-Wt~ zo%23%m{lZ&_?&pcpbHW|a$R=$jdR&yfoFz|TxOm)Oe~grSngp~F;wCi;;5o(lrQ96 zRyc2QR%;E`xhH>NsHm-ExlU^oNh~3SG(^Z~po$tS#Aw$@F_EG3gol5`@u$fpldB3w zjs?`ALUR1zfAG7vW@&oLO$sG|z>95vi~+%2pxw0X?_=9;p8)=6;7aTI>n&jJlk{d+ ziyi?(+rY(jSCjXE%N-!{q)Ue6NPb#EsRX>A(Ki)<;agx}&Fx#~9H$RJj(W9x0~{Oz z<7LWT_jq@IZ{Pl{>Gbahg>G`LH^sMU0000dP)t-s0000G5D;xG4UbhGoLm{wOg^eu zMBs%e(Sld$n?(7&Rrv5;`0{^Zg1F9kmj0dsady_wwCS49`rp#6jxU$XzJroFUZ`c2qCc>rkBG;$p3X(8M$>*2_>n zp!`K~R7eogv{moH8zTahZ7< zV30Z<-rk2M7^ZVp$@C^r{4F7aYGV)ez3blB8*XNtnZs;J_E1!x(mONn}u5PR_9` z2Wg+@hLSPYg<@io<{T81L#W^jUFfY1k}xVj;`}|AL?DL`1)YXbW?={<1@VrOBvg|s zVoVjppSw%Q)M=PxOc5ee6C`DbrF~pk>mfmsLTnMTAF^0)Nfg1due~ zB#gn3=x~=lUfee&f#6swApS0Dmr#-vV#*Mne)=T$UoL^9Ab94~LNHbba+(wba|#f< zSihMoh&Yzxag79sip(GjEwutfZAt=hR%K%NoN0up^9Ckg5Pvm_5Swo%KqiRGi)T(8 zjSxc+PQ!n>q{ZK|V4mms1`o3 zp9LrlbPlEC%d6YmAI4@IOMZDv9hl&SHxLR=b3wxVtGgVgha7xMI7<{nziZ@E9wC^U zl!U`f$ib8ha<)WCS`fStt<{hthPuCCTF9cD5+t`61u>e@1kn_M1cyLKl0p)TFNtz6 zgCMsK%vQni1{P+00r4br7H z#~*0nt|SIO(A_Y49L2f8v|>SU|NKOw5k{Vp4d5}D^wh0#WD?H9`o@c59^-xp^AdS3 zFk$ooQcNRvDGO{LwhwYXqUcY0X69rELij)bQ*4}o&J zD|$wU!iWGNRe3M^fF3F*P(h^*IJKJGDE;G&^-cMl?J1Nh%>t%}zZM`33M} zep9nkD`Ql%Q!B#^YIbUL`1SF5vs0(z^Jb@R$JfnH{f=*&ojM`kH#_w?1~fZ$L8#y# zH#_w>Ml?HhL%wcy>VphucItC{-|W;2v0pbky?}h%?DPhrw)f3Woe-OEubZ9PAOoA7 z+989Qo!TMt_1M?VPJIyijls9gPW_Ox=@PT)a)44?9}QQ)$G&*8Pe?3>=@PT^b+!2vr{`{P_t7fWc|F^sYBx15cG-j zzS*e*GN#$74>F+HsY^1X*{KH-`g)XOdfV*uPV!~5Q@`ZnW~VojZ=0R^BqN%gIwWJ7 po%$(XH#>DwMl?HpxV1Jr{Ri9Hz|asMQ0f2x002ovPDHLkV1lKQO1J<3 diff --git a/public/images/pokemon/variant/exp/back/666-elegant.json b/public/images/pokemon/variant/exp/back/666-elegant.json new file mode 100644 index 00000000000..1b7b9838005 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-elegant.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "de4040": "de4040", + "f8de3f": "f8de3f", + "ceab62": "d9edd4", + "56479d": "56479d", + "875fb5": "875fb5", + "cf7ef3": "cf7ef3", + "c3c3c3": "c3c3c3", + "e6ddf8": "e6ddf8" + }, + "2": { + "101010": "101010", + "303030": "351262", + "675220": "7d1083", + "504a4a": "7d1083", + "595959": "612776", + "707068": "a73fab", + "de4040": "de4040", + "f8de3f": "f8de3f", + "ceab62": "a73fab", + "56479d": "56479d", + "875fb5": "875fb5", + "cf7ef3": "cf7ef3", + "c3c3c3": "f0ecff", + "e6ddf8": "e6ddf8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-elegant_2.json b/public/images/pokemon/variant/exp/back/666-elegant_2.json deleted file mode 100644 index 0894ba3672b..00000000000 --- a/public/images/pokemon/variant/exp/back/666-elegant_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-elegant_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bbba66d69955866664e782205a4af88d:66e99814147be780756a4d4ccd8b31dc:d6b035048c66474f6236a3bc923faa7b$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-elegant_2.png b/public/images/pokemon/variant/exp/back/666-elegant_2.png deleted file mode 100644 index 315b2fe859dee64bf111449f9db7decccbab222a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2328 zcmV+z3Fr2SP)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zVZ*km0000GbW%=J0RR90|NsC0|NsC0 z|NsC0z)*`r000K}Nkl*92b_)b3x4Ul)+B%E%IPi#lf13~cejJ9y8e{jp9~5&=Yb0(6IrjanBsyZi zF?@mn#rAf`9H{rjiE(a7B8~%wuJJMYaFp6j!Wi|!MhoOPlEmwe0Czgv@4WBOK_w+SjtBj3_g)_aTO|SS#XPcHfs!BbKi{N*ug9Yt50qdhW>uBHuw*(sM3OPcROm=ZrjOZpIB97B+Rxe{7K z{QhVmxB_XJzA6bhd|Du*kevs}bCc76lhRcn7X&Zc`&rV3kYgW$@WYls9t~uBv=BaL z`NYLT8VOVdk-N>iha-aU@chGXa!sH#DG24X5WmX_lO!F8IB=M6pVAV<=hzCu1KL9e zqBbRgGOIE%T)lBfi3CYY1&KKg#QRo~OOlos&)m+}wLyrEl&CNKM@*st5yZvq1tgaQ zq#*h2AqZyI5MHhTIZ8utYayv5{63_DXi1dXTflDTvbyBP18a2_!oNLXsL%SyD-qgBb*QNCUw@hiOjbq?8vW5lV!3@9Niw92nl52>wSoNn`9ce?N5V|q)}4OfnTxO1@f#R&*y=~urR)y%B87EY2C6yXdyff z_=%7rx%`FjatkFFQ!q`UIzhOk&Jg)*yf>U6gX=U6vCjQgkT!^}fR)4*2OXLu6Obg~ zi7vzHK=|}kkg~cGBppl;gM@2c0w517COOyaT|>&+L`Mw?vk;k?0tsD+lBkmneqDmF zWCG$Ck_wX7$SVk5)T%29{QlzEn(HJpV};-`5-4eo7uy*kb3^ykr*`n~c^Sf1i$l(X zkOwAdF{``k(;c|JS<(-S_^h9nj#%xGbmuE+{BakM^Wy-0aW4?ev)u18qzo^oU5+R} zM2Dkt5JV&yV!N{P@{<*k(n7x=Wp3z4J>~eKKM;eg^5Dz`Ne~JxX(4PEBdR1vaqydT zzOcmVP*?3VG(P#Z_ME9D@}p}7Im9th5GhG0ksw(Y5G4u6`R`L8j2TC|Hk3#>Uaz&X zV4FKVgn5U2;ZuM6g?DQnGNrjICdQ0Io{81dI%mB*m82V6Ztl$b3%37DwbnH|nH{T|ohBe_nw@4OOPZY~B%N#f<=%#7ry0kJW+$^_ zRkPCsWKFZvgk(*#lU=f^*~!LO*X(3tENgbMITkiMO*s}cJ54(7Z+4n>+}-SCg)D1! zGCGzuJ6R#inw^Y}bk<1Y}LKlU34%+|lf0g)D1!GD|K>^8C2j$qHH4>|~Z)m*n|bv(t>^svsXV zI~gSlo1M&*Wz9|#mQ~G8M#r*dC#z#wvy;uSuGz^BS=8)gbS!Ij`V4Yovy&OJs@Z7{ z67FwyvP)7Mf|~cLYId5Y+~4dpMOo79bl+xgcKQ#nOvWxiId|It0000R diff --git a/public/images/pokemon/variant/exp/back/666-elegant_3.json b/public/images/pokemon/variant/exp/back/666-elegant_3.json deleted file mode 100644 index 20501609416..00000000000 --- a/public/images/pokemon/variant/exp/back/666-elegant_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-elegant_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bbba66d69955866664e782205a4af88d:66e99814147be780756a4d4ccd8b31dc:d6b035048c66474f6236a3bc923faa7b$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-elegant_3.png b/public/images/pokemon/variant/exp/back/666-elegant_3.png deleted file mode 100644 index 490bbb5951c51d7a74d3c38ccbf598e723430312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2319 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 diff --git a/public/images/pokemon/variant/exp/back/666-fancy_3.json b/public/images/pokemon/variant/exp/back/666-fancy_3.json deleted file mode 100644 index c1c35bf083a..00000000000 --- a/public/images/pokemon/variant/exp/back/666-fancy_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:570d1bf9b987c1bf5ebfe39e485464dd:a3c8bebd39c1c84b1bf0fdf600026ea5:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-fancy_3.png b/public/images/pokemon/variant/exp/back/666-fancy_3.png deleted file mode 100644 index 7a54e9bb6cdd3f379e61853919e5f44212f95c92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2623 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 diff --git a/public/images/pokemon/variant/exp/back/666-garden.json b/public/images/pokemon/variant/exp/back/666-garden.json new file mode 100644 index 00000000000..16fec8bc537 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-garden.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "de4040": "de4040", + "398351": "398351", + "ceab62": "d9edd4", + "88d254": "88d254", + "3f919a": "3f919a", + "3dba96": "3dba96", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "044553", + "675220": "055160", + "504a4a": "055160", + "595959": "006b55", + "707068": "227687", + "de4040": "de4040", + "398351": "398351", + "ceab62": "227687", + "88d254": "88d254", + "3f919a": "3f919a", + "3dba96": "3dba96", + "c3c3c3": "72d0a3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-garden_2.json b/public/images/pokemon/variant/exp/back/666-garden_2.json deleted file mode 100644 index 1c3840b900c..00000000000 --- a/public/images/pokemon/variant/exp/back/666-garden_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-garden_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b2ac69ef7a99f6cef35d3fd38c74d01:8a4c29615f3bf20e9c5d0bb372a5b210:f13a1a8fa0a411aa91fccb833ac8719c$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-garden_2.png b/public/images/pokemon/variant/exp/back/666-garden_2.png deleted file mode 100644 index c56ff652c7da12a1b9474ff717683963edc75dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2253 zcmV;;2r~DHP)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zV$S20 zEDf8>mK#PJFlEvySCdZwo7|1aJ zNfRSltnLB=XGlKUx#PIaj}Yl%b;H;MY5yl|*>Nj@*~*pdlzWi`&7pB(jG2R5Ofuy@P%howW(ibdz%~+gOkTiv@!A;M z$K~46Dyba%Zm}XL!7*Te|BM`y>osNXdzzazE;$TC8b^Q}2TO1a{9Z%uB|wlE+Qt9(o4B5FN+hIRL z>?VZlT#*hE&*%b@23(bd9TBoGL4f1pU-^szYTHH&S}dKW71OyJIdCU1bC$$DRmYS)5`+k zxuKIf8c5vE5Go1o2O4|inx;EI+HnKH?2?Ibl$COf;flma(>h4dP+yB?J<2*Os*Kw7DB^QeLfyT5Hfg{aL8wjSInd(>=NWzE5 zEfyr6g0)>eCmoF>W~KsDSW^(BK=pN#HaY?8A=lCxQyhX<_aQsyrWBkSYeo(#O9dcD zn9?8cR1Je)cM=8`rOE}MEZ@APp=0Ay+G&AAKn?MJkHwHNUQi`lZ-Ao)LEz31TvPB9 zAVm@%%%l!il0y!kSBN^-!<-?xnBl9ThfJ?i+)RPQ%y$Jb{jrdrpesgkLd>168ygmQu7K0*4&0eqBXNPfF2oS6jS?^KR+W(cW% z;OvbfLHHcZN`SB?=lD#-^XS!Zc zB6d{wZ8|rf!-h#L$?ww|2)#60Dab2dHzgDHkGG>Dah)R#b?Xi+Nl2x?F>SC^i-ais z9nXE^$R#PEcXt6`%IStjj5SBDHvf5l@gZgW;B>KPUQ))wL}_9CAb16wm(+t{xwMzS z^|a^0{`cFzQY_78C!s^F*+~vjYIa(XC^b8YC4+nW<+Ai9@y7X~Ch=?6l<2Xm(n2Jm2gjgH%88o^Ey$IW(J{ zM3CC?bhDGhq1o&thbT2WEkmAec3O5k-0buP?Cq%HakfnYRyg}hhnqSH;_l0orDm*W~UX1(`a^*O7Ia{quEIa(Q9^+LzJ4G z#1gG$CozOyE>@1$1IT9ha>JFQ9{Z+2RcC^b7tC2Gx1ixh=srxl7$v(sbS bO0&~ng*~Rk+8IyF00000NkvXXu0mjfV~!mj diff --git a/public/images/pokemon/variant/exp/back/666-garden_3.json b/public/images/pokemon/variant/exp/back/666-garden_3.json deleted file mode 100644 index 5fbdd2097fd..00000000000 --- a/public/images/pokemon/variant/exp/back/666-garden_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-garden_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b2ac69ef7a99f6cef35d3fd38c74d01:8a4c29615f3bf20e9c5d0bb372a5b210:f13a1a8fa0a411aa91fccb833ac8719c$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-garden_3.png b/public/images/pokemon/variant/exp/back/666-garden_3.png deleted file mode 100644 index 60c7f5b7d01a8c41f7b8af94779734a2de818da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2243 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 diff --git a/public/images/pokemon/variant/exp/back/666-high-plains_3.json b/public/images/pokemon/variant/exp/back/666-high-plains_3.json deleted file mode 100644 index 4c91b8fb5a0..00000000000 --- a/public/images/pokemon/variant/exp/back/666-high-plains_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-high-plains_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:410c759185f779797422e8f2ce55db4f:6afd0d04b6138fdd57d12681e967b48c:2abdb5d19b2754e3daa24b6ff3ed2c2c$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-high-plains_3.png b/public/images/pokemon/variant/exp/back/666-high-plains_3.png deleted file mode 100644 index d6c577be131a25ce9b37bf073fe558666b034366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2349 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 %jCE!w6~{uelbU0d z*-6W>%Iu`)SY&pZ0a;>pn&F5)`S};kPESByH9I}wc+>3k5ad0x(@P-F%}x(F-ZMKr z26@ZuGzH=on4M-omYAI;K-QR@6d-HOPD+q`cs#bi>@)$w&w^h!J57R|S)Q7m z=0RGPhh`@wiEGPiW+x@cIpnjl$ZcG83NIDVd+ot~0ZKTzbA zyEq^nl0L}tfSgF`-kzDAW=NKpo%AHD%ucf?@0*>bP?ngT-YXMkr~d%DBfZl(Au!qi O000069EP}CUeW%E`8>2|lz8A(^9U&2|G0&Qn5 zkr29~XtR;u`9J5c6X(R#{mk)KrNJYyac7h5dBl9K$y@~+u5h+7o3R5X7C+tazQR+@ zA^P9OqsHEI#(Srid0#(?)95vqXL%?$Dn1|x8-wDq?x9reY`jIQR;1mwS5`NbJE|D{ zds@5n*ltk1xo&4@tL!&;9`n!8kL)&KhYT3&7Aqu9+5Bf$7;{GRBajHrlTfXkBe8hj zIL&+1B|9^5EUAD!r| z8Q13c+252tygHKIv?xE9nkIVr#BS~VgIAnm#>NmY|*c*ALPzyK={Lg3iMo zc>kM5ZS9tx_1Sw$Vb#%`($Xh9fgZwkWQ0vb&_SNx_BLnV4`MIjUh(qbx2WK(u9zG~ zAt526HOfHV)FIS?Xn8yPhMs4NXG^;GT|a7BG$XPxF}f`|Jte8NwUxQ_Wsdr``$!Xt zx3&Wv{QqjgC1XG!o*b;P;g!hTzOSk8M&$&!|5mK@EZw@jd=SV(+o@7DzrUm~`gvL1 zfWRNj*kEs-*SP0)*DNkf1FyW{EXIPH_9UEK8rUtvdK5I3)U)3(N6nc5duUq6^#zl_ zoa_^$H;DStY4Hdb$lJWkZdZ|n?}OvJE-33tLc~j{(b=1ipD75`EkEuos4ZEv)16*? zR8U=pJ%h@@LNE4^wiJQ`YrFk+Y-J#Fd~a*W#bz8MGk5loT4wisLwJLM6X?+kTIE*U)G>Ny?$_)-!Z7>Ob)UGpjWf}H$456Rq@ z!-f-oZiP;<#Lf52keWRrc@(?}gtc=IKKZ_FEooXceb zKGJSfy8ON}wG?*d@r93?P`x$@6C?+*=C{fW+G1|ZIWpY|_ORY&`C=G(OeeCx=kz0d zY?loHOcP+dfL1-t3HAq#*BYqvZE?lgjwM%!c>!2hvDn}&2I;EEa;GZw65mY>8#86W ztLtpdw|7SO#3GdO^y^J*L)solY?q6OqE7J{6p5?c$T;uRw^Z4?P|Whfl(PE z``#wA_hPZImHunYeWzzpa$0H8sFf^@zdmhiU@OEw00~pdA(+o7N$BDNF%&RH7|>x^ zIJy8!I@z3;hRskpX(G!xYm&+Z#(Cgv_3~}9(q#(HTaHO5mwHWoT93pib5+SS z=7}Ifvk^{_MbUa{#)LVG!L_Tvo!~!IkmXZPFf^ns4r#3aw#qa%jO-+|zf+IpP)0Ud zbQ_7S6sVRtyuXPT1%}?gzC^Ziah0N7S6+=%Nma!LlL7->{_?*}GtThQ8vJeatU%-p z>uNH-+F)sui%j$Q@Zd&J-+{QMLRbF1?b@Cn6)A~m`2JMATKZigf+IFxWQJ=5zFkOZ z*l`9U_@_-)@;|J0f~R+f)$5{4*Q81oZ|;FVC3R?h0k8>mL4@rh9c}&&g}KI+tuS6U zY%Yit=J1ny?RMh?`_6?myv5euQm<{!+cB$x4&6Ax7FuqL4(I+Q>>ro9*_+Re#%32! z;E>jV>;=gtqn3U}V%V}>r=@i)rPyK7@%gi};`6iY9DvNqKQ+R&O1lwucbH;8=^9^Z zh0edy)8y&~HsEy^61;R|66CgMItdOD+qL1l8(@9!%QXmcPFjNzR!INF!Im7oSgsjP z?VIV?k$1{)YRK=%t$f<=wbR`HL-SKod6Z)%ySB7F1nPLkt!=kv-trs!-EyzQ$oC&S zGZhiazg^8uYO~9w>r+UXXTJr~yVfEh%S>DD{rNPT=?1l82WSRkd@vwd(|yk(*)tty zE94im1qy*4Y<#Sx$?)NSm-HfqS0ER*(=C1PJ#5qRdeN1#0kQOb49DalQB!wV;`Qb}(GVe?=6nW;t?t z@JjspkW`IW%k&*v6-Lw=vXd(Zh*HJVzf=1+Da0QI6_Ae(fU~cbJjsl*y>%!I@rj&Kmx#M-#R=z8q`0O!%Ik^lez diff --git a/public/images/pokemon/variant/exp/back/666-jungle_3.json b/public/images/pokemon/variant/exp/back/666-jungle_3.json deleted file mode 100644 index 8bbc5571373..00000000000 --- a/public/images/pokemon/variant/exp/back/666-jungle_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-jungle_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4d8913bd65ce0b63c5354717532a7d60:39392afb8d9fb30f37b8d68b6cd368ad:c8686bcc5493911384853d54c85bfea1$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-jungle_3.png b/public/images/pokemon/variant/exp/back/666-jungle_3.png deleted file mode 100644 index 0f4ca358601c825eb5ebc69d8e74c83c89c6f95e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2483 zcmYjSc|6oxA0F94n8rwIQp0aDGDz2Uk(e2ppOIxOqcCF`TgoyKQO30-%eZ5ZX(G!I za#55eUb19Ku84Zwh>$||#HGeN{PmvC=bZ0(&i6Ub=X;*-A1BGy`n1HUuIR?~lXTf;ilXV0w^`{}pct1f6~>{Vbu~^ziNRhj)`55Z`P& zkhrjFnNyR_kDNuMiYwkcit8z6yeUG0At7*ADH%S->6mLySXi*UNb7N^uehqYg4#-B z(HrGXqqL}qr6}rRvv9lhr+B3UfEgdC|j3+hJ01vb6AWrq;BZlR;33Q-Jil233YfX=w$m!8!mAVvq?s_-?=a z~^n$hcL`KI-Ne?QcT+$*7O5*70z zefgMAF7EDq3oc&}C9j`k z`wU}Sy$s+==Gr&=iP6A}x63?3xD_n;svP*|zRKQTTOi%oa!7{iikE+hBalWHXR&FQ z>?RC`!V~My$CG44nus^YJ$d!KI0{Mal^JX-J+;dxd^`vUx5TWw?WfAJ}TvSgkw!CrM#pu>n?C~1J2Uf?0^V9<1PTnvhO3sp$;m+!wp?m$5 z!w@m!HeS{j2Yt`{oSa{mdg|HxG3y(D!9OIYBdbf{Npr;(yT2K;9ohLT#O5pgz0rG= zrnUK`n)R#W-A%o+LHd@o8^)p=-_XL0ur5_P^)N|Yf@l)xuh)G4adg4UCzhq?J5Nob zVhoZPkzZVT(nQLvrK^pN$n5p)Hk6JjeiBjbNVAAcKs^OnNE=vYNJ~hnTU$TTqnwbD z=s>-f8?J7W6%QQ#`@z>+^5azS<5Db4sXMkK2zC=Kan|g1jkujn=v%!8l8Ho{7CY|x z{9CciF&ZXwI}V{EBUh;S-wZ1=L0B(MKU;OwXw<3>v_%jHz$HB zKAT2CDMne9Ekgf3^#8UKyzRT($r_;k^<0CdgIK#vJaTKPEcpqCTvBebcc5qA?WZ#{ zyx4dVYZ0eia59 zLc2;2&ma8j=ov0_Ei&*fYapIOZUMNvF&kUBU$O7b4P7phrh}X*W{2V|e)FU-efCb( zPz$VqOis4hD&h?H;2H^AFV8mq=Qov^;=50=7WST$Ev^oBmwyQ~qUos2c&8gDruuX= zabaQIeipCGRqSr>LPMDM9@H9$--SBt=v_!uolV%wW;!bDs?RBy%kNe=2tG&h6t$~- z?Dw<`VOP8Tu&;?V#>uRKR8F=9yMGJ1%bUaWJFdcach&Nrf8TxWoZVo)b+@1K%y7Y1 zoJG5KRrJLnByWI27Wb4=WWH?T_8mHNB<+T-rKhB#beEt?+#cEQA!{J`b-C6+LTaZM zqrMUlYwh6{GE|n3>@cno1OsC+O^-Bux0u{p@s3cHeNWKQObtqvQB` bevmJG-(~8)SOc0S_`e~bxi!8L>mK_*_TQC7 diff --git a/public/images/pokemon/variant/exp/back/666-marine.json b/public/images/pokemon/variant/exp/back/666-marine.json new file mode 100644 index 00000000000..0bae2c2067e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-marine.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "ceab62": "d9edd4", + "315382": "315382", + "367cb9": "367cb9", + "2f8dc9": "2f8dc9", + "5acdf1": "5acdf1", + "c3c3c3": "c3c3c3", + "f2f2f2": "f2f2f2" + }, + "2": { + "101010": "101010", + "303030": "16244f", + "675220": "264c85", + "504a4a": "264c85", + "595959": "2a5894", + "707068": "3070af", + "ceab62": "3070af", + "315382": "315382", + "367cb9": "367cb9", + "2f8dc9": "2f8dc9", + "5acdf1": "5acdf1", + "c3c3c3": "3070af", + "f2f2f2": "f2f2f2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-marine_2.json b/public/images/pokemon/variant/exp/back/666-marine_2.json deleted file mode 100644 index 7f85f0176f9..00000000000 --- a/public/images/pokemon/variant/exp/back/666-marine_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-marine_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b061fec5d665439da49159647e0a7d71:7cac8aa51d4531fbcf0f9ea9bf644452:dc240f0acbf3d56fe8729dd1f703009f$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-marine_2.png b/public/images/pokemon/variant/exp/back/666-marine_2.png deleted file mode 100644 index ffa21823012ed2fc4fb30349ba92134edc84922b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2317 zcmV+o3G()dP)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zVDG;~%>-9rN~sAhsvb>$P$K zEDf8A7M-lMP%AlJFS#8$q0%D@o;Wu8qqO4Go0PttD|xy(_ar z3ZYzR;?jgTr7g&5anhLl>!3PkYHgsYND~*cTwI$|LC)Lc)k>f`W2z(sDTC@bh(E-b zK|#inw6C2M(i8+Ea~!xa#8rpBhiJD1(LE$C@i&M+OTgC!TY>l@@h;~C$Y^DpJLq@$ z0VIsphX7LVRZR7&Kzv@}8qzoplK5Hz?7-2-A%x^u%uI1WQC}fJ;>VESScYg{Ac~^C zLugQxLg%EqPf^y`4<6myi~6HPe6|8yhqN%9XL zox|}AzCtiNhw2!}TcqR^2tQsF%aJ4%MEkNZnug6mFgeXmdxdE#7ete^h18bgBx!dl zZb2h}L<(j4G%JeI)(jybU&k>AZ%!8>E*9iqh7=NV4+gMNVQvIs&@JlcO1Qt3Nk1O9Sq^O9neVrQAwS0 zRGTD*TJ1iHcYa=(Z0<@@AVdLrpXHwj3NnCLt>Ucmgi7_UO2U8C^sz$im@i1RNjM|? z7j*hly)s48Lei<4Z+iM%kV(h6Bp3*smLOFOz(AsP{4`4gPC?^lU2xELtuv{>AuJc9 zJsTiN;&Xw{V=Y0rIK?sl0XRm-TuPy(vG|!uyD)WG(#cg_!jgW#CKkSq4%s&d(B#IC zrYuGEL13!ASW0PINLXephKTWcnJQRY1vzRE1g3}Z?F~L3utkEG5}^YM1S9jjLR4Q5 z)kEU%4!4FgWOkqC>?ZhKLDb;nlSCKC8wzU?lCDS;nC3Nr@Y}b7=v;vW$+Pgot$uT; z4B@4I=RM-PDV-r@Z=$1xm}LkjybGkSZM?STyGwEWsRXfV9YPXaZ8-|Nf#5~0Vj$#C zrO%|T&MPB^U~Wu|ahg`93*xn*d#bG+{CQr6uvO;ZH$u)$aoU*f`d&(6>N^yD+8)*h z62wNV7=r(FiLsF5?jYyK0e+Os5R4Pu?+PT(FUJ`*gp`Nq>f#e0C9y6oM0#Z{_jbr} z3>jSFvm?KW(+7A7Lfb=LkbJeoj2wr1emtc{;%)nN4DbV*xg33epuBSa0_J4o;uM}%% zvy;%Vt=UNq+0^W`AlcOHB$n9uUJOyQ(}H79vy;%Vt=UNq+0^W`Aen?no1MfGa%^aJ z5-~P5JBb(@o1G+%oy|@wjxEhjOO6fAPK%D`o1GRQ@q5%t@?DUc*GaA*l4hqzAWt+qi5;7oo#c?l@m#ah&yc5@oqmTr)a>*d?DWqQB&Fmrxl3V(d;CZq&9^5jq^ye zlN7S8*=Yf?r`bs^+12bMhUCZQ%JF)j+35$#!_7{MlINS9mL-ojJ1t1|G&_kU+nSvg nDI1!dRw#R#ogO<@nw|aw9fGoUthRin00000NkvXXu0mjf$DCB0 diff --git a/public/images/pokemon/variant/exp/back/666-marine_3.json b/public/images/pokemon/variant/exp/back/666-marine_3.json deleted file mode 100644 index f61b5ed14a9..00000000000 --- a/public/images/pokemon/variant/exp/back/666-marine_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-marine_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b061fec5d665439da49159647e0a7d71:7cac8aa51d4531fbcf0f9ea9bf644452:dc240f0acbf3d56fe8729dd1f703009f$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-marine_3.png b/public/images/pokemon/variant/exp/back/666-marine_3.png deleted file mode 100644 index ee4c51543ee2f650384df7399008c35adc84dea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2301 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 TTi8ko00000NkvXXu0mjf*y>fx diff --git a/public/images/pokemon/variant/exp/back/666-modern.json b/public/images/pokemon/variant/exp/back/666-modern.json new file mode 100644 index 00000000000..5572a58bfa9 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-modern.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "b83c3c": "b83c3c", + "f44f4f": "f44f4f", + "ceab62": "d9edd4", + "3b6cbb": "3b6cbb", + "405793": "405793", + "c3c3c3": "c3c3c3", + "cfc5d9": "cfc5d9" + }, + "2":{ + "101010": "101010", + "303030": "4e0000", + "675220": "801521", + "504a4a": "801521", + "595959": "830012", + "707068": "ad2640", + "b83c3c": "b83c3c", + "f44f4f": "f44f4f", + "ceab62": "ad2640", + "3b6cbb": "3b6cbb", + "405793": "405793", + "c3c3c3": "ffeae8", + "cfc5d9": "cfc5d9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-modern_2.json b/public/images/pokemon/variant/exp/back/666-modern_2.json deleted file mode 100644 index 4b0ef1a8a59..00000000000 --- a/public/images/pokemon/variant/exp/back/666-modern_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-modern_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:deb5b8b4295c15b4c8718bf2ed9791d1:bbe309a34a59a4e2f74eeba5769476f4:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-modern_2.png b/public/images/pokemon/variant/exp/back/666-modern_2.png deleted file mode 100644 index 4cd5d77088115c9749cd9e3d1f65573daf461c8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2237 zcmV;u2txOXP)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zV!X^G!F7B-}< zUay%0U~1S{hK>B?-*OJym$Td%D4(rI1KK4lJFS#s~}r~ ze3t}=i!I~aoLo$VM2FeYLrCJsfY z&LbhDg&>}0fY8xcu!Llejfagv){KGyf-&f9Agv`y%7QG5eXRhJQ?`6o6x4;(7R(@6 zFoY1B8xpgExF82{lCzZLmQa$+;Tc1Y*Nf6)YP>cfigT9b_3D+RC?%ET{eH)58W-!(hSilIi9wE0NGU-N$uF?KihansA_fUN5VMnG4jW%&yT~`#e=+9x zl&fo##vy#%$eb}+5Vu;3Y~1hz$&ny;CGiv}Mv4kjEfSX4ILv}V%56!Q0#!N23(|qC zSUMu)OG(^FtiLtvs22$xd0bekx#U7YZ@4TaW!%x01Z`Yrg|GxV68q+KP(f%4h-E!T z9r?|5rASxc5LOg~DUdz-+z}>#EBIPszV*j{0Z!3A*QM~KL4I6yasUcIaM(-wfi+Zv z&Y#`kUy73D0)(t=p=K{WkKKZC3BD?%?;wbIuPEz z86>T(012~j5RqhwkYx>!P?0*QhGa|pT|>@k2&cZkKr%_b)&7z@VZq-Y?bcW)e`UlF%JqppZlO7~L40l8Gj+`!{QJBJVXMr+8zJU~IR0j5*RZ5~ zLb+co(r5j!bi7pxpa_~vFUsxh`_n24BQ;q_1c*jgZ!oEqFaNORGlH{x$Zs|ZUmW2!6^Ht) z>(@t0bHfXaDMygRFTZa-ru08JU7Q(~OF6||7KJB@%|NG;A zrC6HHPC|!Tvy&X6)a*1NQEGM)OSGDuCLB7=PC|!Tvy&X6)a)deXf-=YC2Gx1B8FnK zlZc_%>?Cn$HapEYRGOWp916`&laA+`on#QjW+#zDvDrxmQEYY+IW(J{CLzx^JIzBL zZg!e>JlyOw4|%xRX%3>$>?DS0H9Jj0isO-Hr*VjKvy%*>*z6>OoO;bpatQyO=J95y zIY?{yx!GwNQd@p)c9Kb&R*46jokS4LW+yR3tJz5=xoBf~qS;9XQEYY+O0GM5er|S> zK@^*vgp%u$tUoq8O-L>jzcxFGB$~}mQi@))liZ@#>?Ct2Hap22dd*HEhhnpn7^2ne zBy%V>JN*KAwAo1r(Q9^^ft(u6PEtu|L&!JIBh5}yh+4DL1VpFVNiNZ9b`nFhnw@@- zJlyOwDS5uxXw diff --git a/public/images/pokemon/variant/exp/back/666-modern_3.json b/public/images/pokemon/variant/exp/back/666-modern_3.json deleted file mode 100644 index 78c496fc208..00000000000 --- a/public/images/pokemon/variant/exp/back/666-modern_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-modern_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:deb5b8b4295c15b4c8718bf2ed9791d1:bbe309a34a59a4e2f74eeba5769476f4:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-modern_3.png b/public/images/pokemon/variant/exp/back/666-modern_3.png deleted file mode 100644 index 5795174404f0956ffd52b0bfb4d281670a68228e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2226 zcmV;j2u=5iP)EX>4Tx04R}tkv&MmKp2MKrk09S9PCiUAwzYt4l3eUs#pXIrLEAagUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=X9p)m7b)?(q|hS9JC1vJ?|WbFz5|3-jj3i|98fjO z$RrbDzOX6=UlE`QOd=vNQ%_|VbMPEr_we!kF2=LG>;4>rO3`G1Pb7{r-LQx^h-Wt~ zo%23%m{lZ&_?&pcpbHW|a$R=$jdR&yfoFz|TxOm)Oe~grSngp~F;wCi;;5o(lrQ96 zRyc2QR%;E`xhH>NsHm-ExlU^oNh~3SG(^Z~po$tS#Aw$@F_EG3gol5`@u$fpldB3w zjs?`ALUR1zfAG7vW@&oLO$sG|z>95vi~+%2pxw0X?_=9;p8)=6;7aTI>n&jJlk{d+ ziyi?(+rY(jSCjXE%N-!{q)Ue6NPb#EsRX>A(Ki)<;agx}&Fx#~9H$RJj(W9x0~{Oz z<7LWT_jq@IZ{Pl{>Gbahg>G`LH^sMU0000dP)t-s0000G5D-oP0D}M$fE6LQJUp!? zK=e;f`0!jiY`Z{Llh4K3|LW+;u_reG000eiQchC<|NsC0|NsC0|NsC0Ed)WW000J^ zNkl~2TB7nT^fF=^`>WQT|F7{Ee81#tm`8<^{X6kEl) zq-?on4r2%G+ZH4|2Jr8lJ2vkaTd%x#{q)MX3Q{->?t7B(82GCoTY`L-1c!?)YBxk{sJ^7N0N#O8*?tRODP zL7e0)CAlS(By)JikmL2D^q3m2O^D*0WqG}NB`HctC3(N!@tOw41SAy2=5bmmYyoK` z>w;l*B}ihBV-!+K&_nVI?5|=UvaX0h!Vbjjm;+N5y^A2%{* zj26VL)*>4>{6KOf$X!W11&WcPf>euyB{mMTppbG~5~e^^j`4zYAS;%R2>DVHHxlb_ z4Lj;ZLPs7KmTE4!P|zDLOGz1bv?W0s*I6MffsVw!IUQ6GngU{3&rwHyb6qLY6*zojH;!S4*xE)d!^g=9$%f<(z2shcL%9I4!ED&6NKVK&$|SP^NVrk(w|ZM5S`t8{6|TuO9_$QS<|x}VjM%d zFZPbOiNhzj0CCGhUXXaVq>LD6!>|h}B}a1bNw;5EB6j$FL#bhIs}JiYMF~@m0&;lA zOhLlFNttlm-j0&wtQ>CWIqe9ylH&+pbJ}H6TCmO22+m&|;WibA`mF2MM@nBJ@vjt1v)M`LP-}LQ zLzJ4GCL~JDPGX5xv(tn_r`bv9P-}LQLzJ4G@){yEk8FqO+#wS zugy*}Nz*FvV6&45qS@>uhG;cA$s`wTEKf8$$smf&PD06bXV1^gPBMsMvy)JAU6S?3 zW~T|sh2qy{Cy_+6*-1*#Yj%=b)S8`S4#j3CnM1GHN#sy$b`nFhnw?}0#b&2pAdfaX z2_bsTPBV~GquEI+32g}Z#(AXKNeWSGcA9|bG&{*9TFp*kh*q=H50ZzQohBvEH#<#B z9&dJR07*qoM6N<$g4~Hq)$ diff --git a/public/images/pokemon/variant/exp/back/666-monsoon.json b/public/images/pokemon/variant/exp/back/666-monsoon.json new file mode 100644 index 00000000000..915d471b2b1 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-monsoon.json @@ -0,0 +1,33 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "807676": "807676", + "ceab62": "d9edd4", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "3d3231", + "675220": "2c3593", + "504a4a": "2c3593", + "595959": "4f4645", + "707068": "5857bc", + "807676": "807676", + "ceab62": "5857bc", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "92f4f4": "92f4f4", + "c3c3c3": "b8f9f9", + "f0f0f8": "f0f0f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_2.json b/public/images/pokemon/variant/exp/back/666-monsoon_2.json deleted file mode 100644 index 344344ec0b2..00000000000 --- a/public/images/pokemon/variant/exp/back/666-monsoon_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-monsoon_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a24b11bc54be921b67b4376d798e05:f5358aac113e1f7af7eddf984d9692b3:637bea52b465abfb8e5a576310b4dacc$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_2.png b/public/images/pokemon/variant/exp/back/666-monsoon_2.png deleted file mode 100644 index 8f091f4d1de0f6760297766e7c75d98a3ed166e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2462 zcmY*ac{mhW8=qn<6W5qrTb98LGht*)S{X~TxH3c8iZF4f#3c+@Wf|K{XpAxA63UWN zmL%29zVGEC%S2sd*Pt}Q<(qN8=X;*-JkL4jdEejfyvy(Xz?i8jGMG>sBpX4xU#qA!CRaRe-~>RP{UO#TEQ6sa^zHu86dZHe&m2aNC~5 zUuCBngU(EhM}DXkiSx~P?0fkq2h(nh&ZIZ0{&0eatTlj|8I3S>Jm)L_d_~2Rzp}cH zYI|Pu_8;?2R%|CA4|B3Tq*-$Unmbw*(zn$jdx0%Cd1Eq&io$GngpPhT>w_l(bCnD$ z=OZR1p1CY|zrN!->Od=|70^ovb&MOXf7i6SmcDo0%H59tJGPqn_wim?SVbI+2-YY_ z1(j5Q3(jk`T4#NqQrq!r&(q}Cm4Ot^)yafxDv!M8C0k z;>G>gUOj$%-}c*vjQ6X_p=-9ftx(4Haj}8lqBBxyln|OS)#=hr$MlwA!Gn4u4TXS>s=1e3!QqY-03dz~Yi;Qiey?}zPS_MeO6(KnMfUpfftp<|3X_y=h>00> z?6dQ`2l$~^G4ODADowdziefTyRI8}a;Dn60A@T65RBKbPOkPoq323B`G5o+iZdyNzKm`Ilih`QRXj0`5mUj zkP$v?bl{-5nh(#5PzJ}Ahv?84(8t=*CZgW_OS(wtOB>|yLk3C9FeM2-n#g=V`9T2~ zjB(4sF@G+aD`6!gp1sFvn#R;TxcjJ-rFr>U@h>rzg!!&Xyl1g?X#FAnpD&B4k&_ zYVPK|uC?Tb)wdDKQZ9bZWZTCHyW5`9fFWRS9&oH@#vzJz4Ndv6#feE7Z@wPfx%epG zKuP{;2lJA_k6`^lZR*l&b)HVsnGc^r#Ai{rw%M|pd9)~W!kV!Y`pc3!5tm!`dRL8n zl;4%Tm5tqgfCiMG96V!|B-bB`|zQwvq3fCms$RGZ_thdI3M@P76=G1*U754l`^Cy*0rZPa zs`X@vP#G>s6w9(DG*#Jao}Yc(%_O;B5X*5_S&J!jm8-VU!#siAj;LT9YgU&E`%>z1 z?<}P_Zc)5CiTC2j#dnGZ@%oFjoR4VM z(=MKtiCJNuoS090+r)$DPQMBTD#CFs z6mZSb@mlaYdu7l!$eBPT6|;fML0ZaeT6`j|a7m&FClfJmDs56m(`f zmzV34Ob&fj#*NjM*WbuZjabh@3LOg+v-o6fACK`bZF}?quDnr}0EH$n`fv6u*8PFD z{c2dA%7qwZ-HnjOL&l(_D(FlR1A(?Z;O&v)E2*TP6d?`kV)WB9or{(Byjs|!fjXor z&6z8V5VWnXkS3v2niP=&D`E6AGdVaTkkCZJslrzrbp9S13SSVK!xs5cLiE2ehaK|& zCBx`@WSr3+8k&7vn81`Zx0ew_(-xXT9}#1Fg?Q%wv{x7V>>(pJu%K&}M!}Cv&eaGx zjRK%yxg}vxXgk*<1YL&oTqE@-CO`D?(4uRQOq9MVoA`A6ikcbHr|n6$VB+5K>+zYP z3`Ml9KwkUj@j|Y$Aft);*9H7Hje>b$4+oTfX|MUSSD=$XJ-9%7|DJ2Gf8*Brf`s5E z^VpP+if~q;+5c*PR1n!{W+<@wf0KHh$w`37oaJ6e&6pOtpluxu%VmpPmRGHf4Gprd mo$R;nS&X`xmFYabBVus~yz}Z*iG|>k24HRMt;^7tWB&tl0-_55 diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_3.json b/public/images/pokemon/variant/exp/back/666-monsoon_3.json deleted file mode 100644 index 4f7304f6c0c..00000000000 --- a/public/images/pokemon/variant/exp/back/666-monsoon_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-monsoon_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a24b11bc54be921b67b4376d798e05:f5358aac113e1f7af7eddf984d9692b3:637bea52b465abfb8e5a576310b4dacc$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_3.png b/public/images/pokemon/variant/exp/back/666-monsoon_3.png deleted file mode 100644 index f216010ca9987d164d73f3b6b97a9bfc9b12cfba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2447 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 X=v7C*8ilj@Jwx!WUbq|1q1pcf#olJ# diff --git a/public/images/pokemon/variant/exp/back/666-ocean.json b/public/images/pokemon/variant/exp/back/666-ocean.json new file mode 100644 index 00000000000..70e7a51c21f --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-ocean.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "e1384d": "e1384d", + "ebcf3f": "ebcf3f", + "ceab62": "d9edd4", + "f4ad61": "f4ad61", + "f8ef6a": "f8ef6a", + "4482c9": "4482c9", + "6bb2e9": "6bb2e9", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "b54908", + "675220": "bc601c", + "504a4a": "bc601c", + "595959": "e99a26", + "707068": "ea8742", + "e1384d": "e1384d", + "ebcf3f": "ebcf3f", + "ceab62": "ea8742", + "f4ad61": "f4ad61", + "f8ef6a": "f8ef6a", + "4482c9": "4482c9", + "6bb2e9": "6bb2e9", + "c3c3c3": "f3c86b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-ocean_2.json b/public/images/pokemon/variant/exp/back/666-ocean_2.json deleted file mode 100644 index d5bb27bf592..00000000000 --- a/public/images/pokemon/variant/exp/back/666-ocean_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-ocean_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1a0079c64e9d91336d227b1380cd9d2:cf159e4653ad9208c0f4633a498a6cd1:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-ocean_2.png b/public/images/pokemon/variant/exp/back/666-ocean_2.png deleted file mode 100644 index 6f4fefc99f81866fbdbda805bd252a3d7095ab93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2607 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 QXM7w$fW9%hT+b2zKe(sw)Bpeg diff --git a/public/images/pokemon/variant/exp/back/666-ocean_3.json b/public/images/pokemon/variant/exp/back/666-ocean_3.json deleted file mode 100644 index 4ca1832c359..00000000000 --- a/public/images/pokemon/variant/exp/back/666-ocean_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-ocean_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1a0079c64e9d91336d227b1380cd9d2:cf159e4653ad9208c0f4633a498a6cd1:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-ocean_3.png b/public/images/pokemon/variant/exp/back/666-ocean_3.png deleted file mode 100644 index 554fcb7b510509469c2e62f0167280969c20226d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2596 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 Ksa_4jIp%+;X5^Rv diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball.json b/public/images/pokemon/variant/exp/back/666-poke-ball.json new file mode 100644 index 00000000000..e21ba03fc1e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-poke-ball.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "971d1d": "971d1d", + "b72c2c": "b72c2c", + "dc4b4b": "dc4b4b", + "e97e7e": "e97e7e", + "ceab62": "d9edd4", + "a9a99e": "a9a99e", + "c3c3c3": "c3c3c3", + "f8f8f8": "f8f8f8" + }, + "2": { + "101010": "101010", + "303030": "ae001a", + "675220": "a70038", + "504a4a": "a70038", + "595959": "df0036", + "707068": "d5375a", + "971d1d": "040046", + "b72c2c": "00005e", + "dc4b4b": "19007d", + "e97e7e": "2e2095", + "ceab62": "d5375a", + "a9a99e": "000050", + "c3c3c3": "f0a6bf", + "f8f8f8": "00006d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_2.json b/public/images/pokemon/variant/exp/back/666-poke-ball_2.json deleted file mode 100644 index 99da9b9ac29..00000000000 --- a/public/images/pokemon/variant/exp/back/666-poke-ball_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e744396a3b647429d050d678017c05ce:ec812f719dffcd362f0481d7d83c3476:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_2.png b/public/images/pokemon/variant/exp/back/666-poke-ball_2.png deleted file mode 100644 index a1bd953a1b3055ba17cb1df7f744a04120530351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2616 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 ns>5%7qIIcxF`G&~m diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_3.json b/public/images/pokemon/variant/exp/back/666-poke-ball_3.json deleted file mode 100644 index de222894738..00000000000 --- a/public/images/pokemon/variant/exp/back/666-poke-ball_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e744396a3b647429d050d678017c05ce:ec812f719dffcd362f0481d7d83c3476:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_3.png b/public/images/pokemon/variant/exp/back/666-poke-ball_3.png deleted file mode 100644 index 9e7ff12912dfa61716bc28d1d53af8bf30e4a717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2606 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 BYu5k( diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm_3.json b/public/images/pokemon/variant/exp/back/666-sandstorm_3.json deleted file mode 100644 index d43381578cb..00000000000 --- a/public/images/pokemon/variant/exp/back/666-sandstorm_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-sandstorm_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 0, - "w": 40, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 68, - "w": 40, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e35abed8cd9d0bbf1556fa684995d930:8d765a06a769bbf3d1639f361548cd6f:12f47e779927411662912d6094a9782d$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm_3.png b/public/images/pokemon/variant/exp/back/666-sandstorm_3.png deleted file mode 100644 index 649fa83e025d7f086dd5e9f8536e00d16a26a356..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2382 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 AUH||9 diff --git a/public/images/pokemon/variant/exp/back/666-savanna.json b/public/images/pokemon/variant/exp/back/666-savanna.json new file mode 100644 index 00000000000..c261f52dced --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-savanna.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "dcc433": "dcc433", + "ceab62": "d9edd4", + "3b67ac": "3b67ac", + "61a0f5": "61a0f5", + "55d3d9": "55d3d9", + "6cc6c6": "6cc6c6", + "fffd77": "fffd77", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "183576", + "675220": "1d828b", + "504a4a": "1d828b", + "595959": "4168bb", + "707068": "4faab3", + "dcc433": "dcc433", + "ceab62": "4faab3", + "fffd77": "fffd77", + "3b67ac": "3b67ac", + "61a0f5": "61a0f5", + "55d3d9": "55d3d9", + "6cc6c6": "6cc6c6", + "c3c3c3": "81e7e1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-savanna_2.json b/public/images/pokemon/variant/exp/back/666-savanna_2.json deleted file mode 100644 index c1f73f6efc7..00000000000 --- a/public/images/pokemon/variant/exp/back/666-savanna_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-savanna_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1ad0c7c841409c3fd4cb50b399d6e13c:b9406b41d37bc72c57260f9a01a352c8:625a4f0dc001069326a75c6a381f93e6$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-savanna_2.png b/public/images/pokemon/variant/exp/back/666-savanna_2.png deleted file mode 100644 index b4b8ecedb9e42b956de448a6d63569da654bd077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 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 aXpJ`Q|F}nSNbn;Afyk!T#4`NZ*na^lMWd?# diff --git a/public/images/pokemon/variant/exp/back/666-sun.json b/public/images/pokemon/variant/exp/back/666-sun.json new file mode 100644 index 00000000000..21cf5787ba4 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-sun.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "c94971": "c94971", + "e18248": "e18248", + "ceab62": "d9edd4", + "f1a26a": "f1a26a", + "f0ce44": "f0ce44", + "fcf372": "fcf372", + "f47491": "f47491", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "640000", + "675220": "8c1850", + "504a4a": "8c1850", + "595959": "750500", + "707068": "b83b74", + "c94971": "c94971", + "e18248": "e18248", + "ceab62": "b83b74", + "f1a26a": "f1a26a", + "f0ce44": "f0ce44", + "fcf372": "fcf372", + "f47491": "f47491", + "c3c3c3": "fee3e7" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sun_2.json b/public/images/pokemon/variant/exp/back/666-sun_2.json deleted file mode 100644 index d7c995a1bc0..00000000000 --- a/public/images/pokemon/variant/exp/back/666-sun_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-sun_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1d3a140bac5951725915aa0b64d1fdc6:e322510cf8386dcc7834a05d57e5368e:8f5fdd0a698701f5391c5a3f67e303d6$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sun_2.png b/public/images/pokemon/variant/exp/back/666-sun_2.png deleted file mode 100644 index c9168d5a1c5d2bcf09b21d39b5aafcfbb61150b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2559 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
35lTqf6x>!lNoD{HQw z14^!h?Z2?{_VwioSDTW&kKQ!z9#&J6`A}(-}{pcHWjV~pDSgZ4@#hWu0WxScS3CD_x zin>7{VTU1^$MH|~Li@nr=|s#%xzGBb@h*eN49Q`J=CEfMcGma|IBen2%NACU{r_Kf z*w5k+2;T%~Y-Al-IPl58wLZkok?dqC=IF(Q?KKXnBhwL`6Qn3D-o)MXel>V>adE?n$+Wo@ zVe`(2S+>We#H)P43YVHMU_L^cOS>#?Y5oi|tLc#?o#Aza%^C|LlM0Q;w+&smKTcW- zk4G$frJLYpMW}zX@J4-DB{={TKi3tg`k&k$lrmYbUQy3VO+P$>l!Jp+R`Q@bv`!_D zT2XlTaa*vz_C#ozYeJ8K1^df#nhs}j5iahnmtpCbr=Y|%q*}gsURoL{fu}DWby4@} zbUmRkAKvTVnU|MrKwm*39Z&H*!#Pm!mx%hy%<@V_RcP!m8wiF{0m?0&I$1a^HIiPK zj3rjDAMuz05wc@ z#XZE@uzcV1+P4i;8(Zl!2Esa;K0(*NB*4hKI>l1wPwr-CAOW%%uI<$vC2Q5?HjuQe zuYwKQ)fQ>H>Lm)_Kt|NttK9!%x6Vx9dl}C>%-zgCt^kV{4|VL*Jl3j)D)${Z6>d zG{lYR0diIQ5JpRKOQ$lp&O7mY6+&#Gn&jV&Yv{-tp5g zaEHliRv9%FKtKG^-=qv85$Qs(JiS{zT0W?Yav3QG&V5FKqsR?GWWGw{!cEA2+q)BqK+1P53HL^9dn%?Bh{-CLEgWe6R^ z#}FIJ{Y+X%2M8}DJO^(f$<&zA!-*<(p5vA_X5P4m`^K(*9R)3iW<)4L3oe-va}wxX z_RZ=kncUd*O$LM16!TA`T$@J-*`&>!IIavzq~)>lD73yq)62)>^vIN%2!1*cdngpO zVVUR^`=z|QfaUUyHNlEM|5#}GfOU1X0|EP-rw4@l)hSrFRX9ae3N@&w3>UCw66Fcnv8qO`i)8;^@y;RFDW&XPD`NXaN@mkc} zv}71dM&gKyp9NzfRw1n zz0NV0bO42b?%y!M__)T6Q}fz149YaHr;P_@L|@D*$j4|LIdHwC9rYVpA4KA~#y$TX zDJex>=m1M&dJgi+Uu5#5OwV%ERIS#kqZ)VqiV{++(K;w(Nymilb$(u34XeMXcu=o2 zo>T9)g0Xs)P0D+>eqV@v7^32SfnCd^=alz;{WVT7j)2oG3LR}aqF!e)l9K7+>gWnS z2sQZKE-a@L966qofO&7*4fA6fce0~?AnzQAIi->g*b{dJqy{(xqJ}21q)3^k4_*X+ zzlfXDy)@=O1ae|I^w&)09ZVuWo+t$OmkLp@Lm=abvNB%E^V;R&p4ZkVV&&(nLb61( j#2CN+x&zGHw8TM>`ZINA(wcspF8~BIu`sShIVb)L_r19( diff --git a/public/images/pokemon/variant/exp/back/666-tundra.json b/public/images/pokemon/variant/exp/back/666-tundra.json new file mode 100644 index 00000000000..b098f776c00 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-tundra.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "ceab62": "d9edd4", + "539ad9": "539ad9", + "74bbe9": "74bbe9", + "a3def1": "a3def1", + "c3c3c3": "c3c3c3", + "d0d0d0": "d0d0d0", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "003d69", + "675220": "3a76a7", + "504a4a": "3a76a7", + "595959": "225b72", + "707068": "659dd0", + "ceab62": "659dd0", + "539ad9": "539ad9", + "74bbe9": "74bbe9", + "a3def1": "a3def1", + "c3c3c3": "cbfbfb", + "d0d0d0": "d0d0d0", + "f0f0f8": "f0f0f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-tundra_2.json b/public/images/pokemon/variant/exp/back/666-tundra_2.json deleted file mode 100644 index 3d8ae45a641..00000000000 --- a/public/images/pokemon/variant/exp/back/666-tundra_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-tundra_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:40f74f8757cb0f5a2ab7b5f68ea979a0:d062f67571674668b47f6fab68361105:9779ed3adebc298af537dd64dc25fe00$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-tundra_2.png b/public/images/pokemon/variant/exp/back/666-tundra_2.png deleted file mode 100644 index 49325397d8a79ab63379881b75a624067a67d70a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2429 zcmV-@34->CP)EX>4Tx04R}tkv&MmKpe$i)0T=<9IPPXkfAzR1Ql_VDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!T;exi3;X2I`B(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q=%!57>97zIMRK&xTf-^aGyIsyF8z?IhV*P6iWC+Urj z7Ci#`w}Ff6jwbH`mpj1FlP(#OBl&3x#Uk*2M&FbN25y1gHMh6+K29HiEOoVf0~{Oz zV$i*n;A5Jl6|ct(su{QrNu^nE88w#83{U*I4 zUmx1FXFYk}yG>y4tsj^xDm3*Hk6sh-EjvXRd%>whWM;Ze2++MoE}(5;WwG{}h)4Hg zJ%{e?43CtACuU%=o7O^ zH~wfsWG7V5tZ7If_l~PX_lqSFCw<;xBAvke{4G3ah{)QXLX8)~7=-F_BL2Q;S#;ai2;e8_~Uq>fg1ZacMCPCy7{|Gx|YIv{Sw+!Hy(yLY{Nd+B9O@3p`a?cC);jWWPq9R5c(G{;xgl=5QG%Ug>U=(rmIs%CD z6vDT>C}QJ{7@~+4ga=6H1#u<9Mdpj;FyU5tec9a&BzcaQ>ukrOV6e%s9RE z(TNKY0!J+0`{YF`2p7ZgjSp4C`osTY-q~^u_rD!}%aN|gS~4dixD;Wqvk9rZ_*7~I zlZnvL>||4l6dPCH<)a8;b0887)7C|zR3fblMiZcC!vr+ayh|ik@joyuu#8Yzk=g}w zky@i$q^OFBN-u5$9!*II=y~5r zu&tVzvLyNYgkOAD*pFQMMFMqG9+ntL&7(+B`q&hXO7__!ZeZu~j&S0Uo49Hf$opYE zdt0YRC`k@wS_Z=W4{OkKTP{LRD*oNJ4gG2V|9A!2HlFJa4>i%{W*O*l{y(D=U~7#3 zBP@vMbAj39@LgHNA9AB(tnc6ZIgRXFENUJMawx z6i^ygKzYys2b?UaQiBM&h)nX(7a5Gr#)S}2hr=O{TEy`5z_%9(CbIHIJRlb#U>FvW z4(freh^`WUtBE4I1-jO00!JznUn0UJJZ!JKy(kBJkcdF;iAaHoX3j)F)?g}0&`2WM z*~-T1Hes+p%@##;X4(2!uuN1% zpJ}Ns@`}UJf>3{x_G3oFlj~7huF)hs!9@}3I#`gnNSqP_%{g;2qQ)d|1YzTPlQEC5 zZ(K%%z&ZxyCax6;X9f$BZOBaIdd(Lm)r}FRJz`0mi?0OKg?sE&y&KGX!~v#`A1?wB zRhmn0&=~iKCh3Kay(cQi4{#@EdQ70~2|bmC;|IYr!ETirb_4Zb@+2^BJ4D0vLfs>W3sOZJI#442s@2?tO+|!iL3}a&6#wH427L$Ov1$0%ZsK%G+}a55)C`yH_nBf#zj7a zop3VjG+~m;@Mzd++Qe0>z}^fy4Vx?rJ58u83Oh}?tO+{}d$_Z(6W$9uO?WH`JB@m* z3Omh$orXOw!cHPGnK8N{(uSRW-v~R6i!2H|&5Ar8cA78=F@${U+z&fV zh^z@a&50}sJ58A^2|LY*gw%|Rgb(ndh?@yJ-8U(|pomXR<6);;CQpW)Zkjw8cA7I; v5O$g|Src}eS9v<@G^w&8?DXI<8g}{*{W0Y00000NkvXXu0mjfQ{Z~; diff --git a/public/images/pokemon/variant/exp/back/666-tundra_3.json b/public/images/pokemon/variant/exp/back/666-tundra_3.json deleted file mode 100644 index 65be2910a02..00000000000 --- a/public/images/pokemon/variant/exp/back/666-tundra_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-tundra_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:40f74f8757cb0f5a2ab7b5f68ea979a0:d062f67571674668b47f6fab68361105:9779ed3adebc298af537dd64dc25fe00$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-tundra_3.png b/public/images/pokemon/variant/exp/back/666-tundra_3.png deleted file mode 100644 index 3284e1e637bcc09d36a3e05f4a248e30a82af681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2420 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 Date: Tue, 25 Feb 2025 15:54:48 +0100 Subject: [PATCH 36/83] =?UTF-8?q?[UI/UX]=20Reducing=20number=20of=20contai?= =?UTF-8?q?ners=20in=20the=20Pok=C3=A9dex=20(#5400)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * PokedexMonContainer now has a method to change species. * Not setting tint to 0 in the container * Using only 81 containers in Pokédex * Apply suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/ui/pokedex-mon-container.ts | 66 ++++--- src/ui/pokedex-ui-handler.ts | 305 +++++++++++++++++--------------- 2 files changed, 197 insertions(+), 174 deletions(-) diff --git a/src/ui/pokedex-mon-container.ts b/src/ui/pokedex-mon-container.ts index 31a98c30d1c..1bcfafc0766 100644 --- a/src/ui/pokedex-mon-container.ts +++ b/src/ui/pokedex-mon-container.ts @@ -36,26 +36,7 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { constructor(species: PokemonSpecies, options: SpeciesDetails = {}) { super(globalScene, 0, 0); - this.species = species; - - const { shiny, formIndex, female, variant } = options; - - const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, false, true); - const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - - if (!isNullOrUndefined(formIndex)) { - defaultProps.formIndex = formIndex; - } - if (!isNullOrUndefined(shiny)) { - defaultProps.shiny = shiny; - } - if (!isNullOrUndefined(variant)) { - defaultProps.variant = variant; - } - if (!isNullOrUndefined(female)) { - defaultProps.female = female; - } - + this.setSpecies(species, options); // starter passive bg const starterPassiveBg = globalScene.add.image(2, 5, "passive_bg"); @@ -65,15 +46,6 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { this.add(starterPassiveBg); this.starterPassiveBgs = starterPassiveBg; - // icon - this.icon = globalScene.add.sprite(-2, 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); - this.icon.setScale(0.5); - this.icon.setOrigin(0, 0); - this.icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); - this.checkIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); - this.icon.setTint(0); - this.add(this.icon); - // shiny icons for (let i = 0; i < 3; i++) { const shinyIcon = globalScene.add.image(i * -3 + 12, 2, "shiny_star_small"); @@ -196,6 +168,42 @@ export class PokedexMonContainer extends Phaser.GameObjects.Container { this.passive2OverlayIcon = passive2OverlayIcon; } + setSpecies(species: PokemonSpecies, options: SpeciesDetails = {}) { + + this.species = species; + + const { shiny, formIndex, female, variant } = options; + + const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + + if (!isNullOrUndefined(formIndex)) { + defaultProps.formIndex = formIndex; + } + if (!isNullOrUndefined(shiny)) { + defaultProps.shiny = shiny; + } + if (!isNullOrUndefined(variant)) { + defaultProps.variant = variant; + } + if (!isNullOrUndefined(female)) { + defaultProps.female = female; + } + + if (this.icon) { + this.remove(this.icon); + this.icon.destroy(); // Properly removes the sprite from memory + } + + // icon + this.icon = globalScene.add.sprite(-2, 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.icon.setScale(0.5); + this.icon.setOrigin(0, 0); + this.icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.checkIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); + this.add(this.icon); + } + checkIconId(female, formIndex, shiny, variant) { if (this.icon.frame.name !== this.species.getIconId(female, formIndex, shiny, variant)) { console.log(`${this.species.name}'s variant icon does not exist. Replacing with default.`); diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 82208a5899d..45809c40fb6 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -109,6 +109,17 @@ enum FilterTextOptions{ ABILITY_2, } +interface ContainerData { + species: PokemonSpecies, + cost: number, + props: DexAttrProps, + eggMove1?: boolean, + eggMove2?: boolean, + tmMove1?: boolean, + tmMove2?: boolean, + passive1?: boolean, + passive2?: boolean, +} const valueReductionMax = 2; @@ -121,11 +132,11 @@ const speciesContainerX = 143; * @param index UI index to calculate the starter position of * @returns An interface with an x and y property */ -function calcStarterPosition(index: number, scrollCursor:number = 0): {x: number, y: number} { +function calcStarterPosition(index: number): {x: number, y: number} { const yOffset = 13; const height = 17; const x = (index % 9) * 18; - const y = yOffset + (Math.floor(index / 9) - scrollCursor) * height; + const y = yOffset + (Math.floor(index / 9)) * height; return { x: x, y: y }; } @@ -145,8 +156,7 @@ export default class PokedexUiHandler extends MessageUiHandler { private filterBarContainer: Phaser.GameObjects.Container; private filterBar: FilterBar; private pokemonContainers: PokedexMonContainer[] = []; - private filteredPokemonContainers: PokedexMonContainer[] = []; - private validPokemonContainers: PokedexMonContainer[] = []; + private filteredPokemonData: ContainerData[] = []; private pokemonNumberText: Phaser.GameObjects.Text; private pokemonSprite: Phaser.GameObjects.Sprite; private pokemonNameText: Phaser.GameObjects.Text; @@ -160,6 +170,7 @@ export default class PokedexUiHandler extends MessageUiHandler { private filterMode: boolean; private filterBarCursor: number = 0; private scrollCursor: number; + private oldCursor: number = -1; private allSpecies: PokemonSpecies[] = []; private lastSpecies: PokemonSpecies; @@ -447,8 +458,13 @@ export default class PokedexUiHandler extends MessageUiHandler { for (const species of allSpecies) { this.speciesLoaded.set(species.speciesId, false); this.allSpecies.push(species); + } - const pokemonContainer = new PokedexMonContainer(species).setVisible(false); + // Here code to declare 81 containers + for (let i = 0; i < 81; i++) { + const pokemonContainer = new PokedexMonContainer(this.allSpecies[i]).setVisible(false); + const pos = calcStarterPosition(i); + pokemonContainer.setPosition(pos.x, pos.y); this.iconAnimHandler.addOrUpdate(pokemonContainer.icon, PokemonIconAnimMode.NONE); this.pokemonContainers.push(pokemonContainer); starterBoxContainer.add(pokemonContainer); @@ -563,19 +579,12 @@ export default class PokedexUiHandler extends MessageUiHandler { this.getUi().bringToTop(this.starterSelectContainer); - // Making caught pokemon visible icons, etc - this.allSpecies.forEach((species, s) => { - const icon = this.pokemonContainers[s].icon; - const dexEntry = globalScene.gameData.dexData[species.speciesId]; + this.pokemonContainers.forEach(container => { + const icon = container.icon; + const species = container.species; this.starterPreferences[species.speciesId] = this.initStarterPrefs(species); - if ((dexEntry.caughtAttr & species.getFullUnlocksData()) || globalScene.dexForDevs) { - icon.clearTint(); - } else if (dexEntry.seenAttr) { - icon.setTint(0x808080); - } - this.setUpgradeAnimation(icon, species); }); @@ -872,12 +881,11 @@ export default class PokedexUiHandler extends MessageUiHandler { } const maxColumns = 9; - const numberOfStarters = this.filteredPokemonContainers.length; + const numberOfStarters = this.filteredPokemonData.length; const numOfRows = Math.ceil(numberOfStarters / maxColumns); - const currentRow = Math.floor(this.cursor / maxColumns); const onScreenFirstIndex = this.scrollCursor * maxColumns; // this is first index on the screen - - // TODO: use the above to let the cursor go to the correct position when switching back. + // TODO: check if in some places we need to use one or the other + const currentRow = Math.floor((onScreenFirstIndex + this.cursor) / maxColumns); const ui = this.getUi(); @@ -966,9 +974,9 @@ export default class PokedexUiHandler extends MessageUiHandler { const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); const targetCol = Math.min(8, proportion < 0.5 ? Math.floor(proportion * 8) : Math.ceil(proportion * 8)); if (numberOfStarters % 9 > targetCol) { - this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); + this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol - this.scrollCursor * 9); } else { - this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9, 0)); + this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9 - this.scrollCursor * 9, 0)); } success = true; } @@ -1003,7 +1011,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (numberOfStarters > 0) { this.setFilterTextMode(false); const rowIndex = this.filterTextCursor; - this.setCursor(onScreenFirstIndex + (rowIndex < numOfRows - 1 ? (rowIndex + 1) * maxColumns - 1 : numberOfStarters - 1)); + this.setCursor(rowIndex < numOfRows - 1 ? (rowIndex + 1) * maxColumns - 1 : numberOfStarters - 1); success = true; } break; @@ -1012,7 +1020,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (numberOfStarters > 0) { this.setFilterTextMode(false); const rowIndex = this.filterTextCursor; - this.setCursor(onScreenFirstIndex + (rowIndex < numOfRows ? rowIndex * maxColumns : (numOfRows - 1) * maxColumns)); + this.setCursor(rowIndex < numOfRows ? rowIndex * maxColumns : (numOfRows - 1) * maxColumns); success = true; } break; @@ -1043,10 +1051,10 @@ export default class PokedexUiHandler extends MessageUiHandler { } else { const numberOfForms = this.trayContainers.length; const numOfRows = Math.ceil(numberOfForms / maxColumns); - const currentRow = Math.floor(this.trayCursor / maxColumns); + const currentTrayRow = Math.floor(this.trayCursor / maxColumns); switch (button) { case Button.UP: - if (currentRow > 0) { + if (currentTrayRow > 0) { success = this.setTrayCursor(this.trayCursor - 9); } else { const targetCol = this.trayCursor; @@ -1058,7 +1066,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } break; case Button.DOWN: - if (currentRow < numOfRows - 1) { + if (currentTrayRow < numOfRows - 1) { success = this.setTrayCursor(this.trayCursor + 9); } else { success = this.setTrayCursor(this.trayCursor % 9); @@ -1068,14 +1076,14 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.trayCursor % 9 !== 0) { success = this.setTrayCursor(this.trayCursor - 1); } else { - success = this.setTrayCursor(currentRow < numOfRows - 1 ? (currentRow + 1) * maxColumns - 1 : numberOfForms - 1); + success = this.setTrayCursor(currentTrayRow < numOfRows - 1 ? (currentTrayRow + 1) * maxColumns - 1 : numberOfForms - 1); } break; case Button.RIGHT: - if (this.trayCursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfForms - 1) % 9)) { + if (this.trayCursor % 9 < (currentTrayRow < numOfRows - 1 ? 8 : (numberOfForms - 1) % 9)) { success = this.setTrayCursor(this.trayCursor + 1); } else { - success = this.setTrayCursor(currentRow * 9); + success = this.setTrayCursor(currentTrayRow * 9); } break; case Button.CYCLE_FORM: @@ -1094,10 +1102,12 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.scrollCursor > 0 && currentRow - this.scrollCursor === 0) { this.scrollCursor--; this.updateScroll(); + success = this.setCursor(this.cursor); + } else { + success = this.setCursor(this.cursor - 9); } - success = this.setCursor(this.cursor - 9); } else { - this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.filterBarCursor = this.filterBar.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterMode(true); success = true; } @@ -1106,9 +1116,11 @@ export default class PokedexUiHandler extends MessageUiHandler { if (currentRow < numOfRows - 1) { // not last row if (currentRow - this.scrollCursor === 8) { // last row of visible pokemon this.scrollCursor++; + this.updateScroll(); + success = this.setCursor(this.cursor); + } else { + success = this.setCursor(this.cursor + 9); } - success = this.setCursor(this.cursor + 9); - this.updateScroll(); } else if (numOfRows > 1) { // DOWN from last row of pokemon > Wrap around to first row this.scrollCursor = 0; @@ -1116,7 +1128,7 @@ export default class PokedexUiHandler extends MessageUiHandler { success = this.setCursor(this.cursor % 9); } else { // DOWN from single row of pokemon > Go to filters - this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.filterBarCursor = this.filterBar.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterMode(true); success = true; } @@ -1126,7 +1138,7 @@ export default class PokedexUiHandler extends MessageUiHandler { success = this.setCursor(this.cursor - 1); } else { // LEFT from filtered pokemon, on the left edge - this.filterTextCursor = this.filterText.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.filterTextCursor = this.filterText.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterTextMode(true); success = true; } @@ -1137,13 +1149,13 @@ export default class PokedexUiHandler extends MessageUiHandler { success = this.setCursor(this.cursor + 1); } else { // RIGHT from filtered pokemon, on the right edge - this.filterTextCursor = this.filterText.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.filterTextCursor = this.filterText.getNearestFilter(this.pokemonContainers[this.cursor]); this.setFilterTextMode(true); success = true; } break; case Button.CYCLE_FORM: - const species = this.filteredPokemonContainers[this.cursor].species; + const species = this.pokemonContainers[this.cursor].species; if (this.canShowFormTray) { success = this.openFormTray(species); } @@ -1225,60 +1237,48 @@ export default class PokedexUiHandler extends MessageUiHandler { updateStarters = () => { this.scrollCursor = 0; - this.filteredPokemonContainers = []; - this.validPokemonContainers = []; + this.filteredPokemonData = []; this.pokerusCursorObjs.forEach(cursor => cursor.setVisible(false)); this.filterBar.updateFilterLabels(); this.filterText.updateFilterLabels(); - this.validPokemonContainers = this.pokemonContainers; + this.filteredPokemonData = []; - // this updates icons for previously saved pokemon - for (let i = 0; i < this.validPokemonContainers.length; i++) { - const currentFilteredContainer = this.validPokemonContainers[i]; - const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; + this.allSpecies.forEach(species => { - const currentDexAttr = this.getCurrentDexProps(currentFilteredContainer.species.speciesId); - const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(currentFilteredContainer.species, currentDexAttr)); + const starterId = this.getStarterSpeciesId(species.speciesId); - starterSprite.setTexture(currentFilteredContainer.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), currentFilteredContainer.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant)); - currentFilteredContainer.checkIconId(props.female, props.formIndex, props.shiny, props.variant); - } + const currentDexAttr = this.getCurrentDexProps(species.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, currentDexAttr)); - // filter - this.validPokemonContainers.forEach(container => { - container.setVisible(false); - - const starterId = this.getStarterSpeciesId(container.species.speciesId); - - container.cost = globalScene.gameData.getSpeciesStarterValue(starterId); + const data: ContainerData = { species: species, cost: globalScene.gameData.getSpeciesStarterValue(starterId), props: props }; // 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)) & - (globalScene.gameData.dexData[this.getStarterSpeciesId(container.species.speciesId)]?.caughtAttr || BigInt(0)) & - container.species.getFullUnlocksData(); + const caughtAttr = (globalScene.gameData.dexData[species.speciesId]?.caughtAttr || BigInt(0)) & + (globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)]?.caughtAttr || BigInt(0)) & + species.getFullUnlocksData(); const starterData = globalScene.gameData.starterData[starterId]; const isStarterProgressable = speciesEggMoves.hasOwnProperty(starterId); // Name filter const selectedName = this.filterText.getValue(FilterTextRow.NAME); - const fitsName = container.species.name === selectedName || selectedName === this.filterText.defaultText; + const fitsName = species.name === selectedName || selectedName === this.filterText.defaultText; // Move filter // TODO: There can be fringe cases where the two moves belong to mutually exclusive forms, these must be handled separately (Pikachu); // On the other hand, in some cases it is possible to switch between different forms and combine (Deoxys) - const levelMoves = pokemonSpeciesLevelMoves[container.species.speciesId].map(m => allMoves[m[1]].name); + const levelMoves = pokemonSpeciesLevelMoves[species.speciesId].map(m => allMoves[m[1]].name); // This always gets egg moves from the starter const eggMoves = speciesEggMoves[starterId]?.map(m => allMoves[m].name) ?? []; const tmMoves = speciesTmMoves[starterId]?.map(m => allMoves[Array.isArray(m) ? m[1] : m].name) ?? []; const selectedMove1 = this.filterText.getValue(FilterTextRow.MOVE_1); const selectedMove2 = this.filterText.getValue(FilterTextRow.MOVE_2); - const fitsFormMove1 = container.species.forms.some(form => this.hasFormLevelMove(form, selectedMove1)); - const fitsFormMove2 = container.species.forms.some(form => this.hasFormLevelMove(form, selectedMove2)); + const fitsFormMove1 = species.forms.some(form => this.hasFormLevelMove(form, selectedMove1)); + const fitsFormMove2 = species.forms.some(form => this.hasFormLevelMove(form, selectedMove2)); const fitsLevelMove1 = levelMoves.includes(selectedMove1) || fitsFormMove1; const fitsEggMove1 = eggMoves.includes(selectedMove1); const fitsTmMove1 = tmMoves.includes(selectedMove1); @@ -1289,44 +1289,38 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsMove2 = fitsLevelMove2 || fitsEggMove2 || fitsTmMove2 || selectedMove2 === this.filterText.defaultText; const fitsMoves = fitsMove1 && fitsMove2; - container.eggMove1Icon.setVisible(false); - container.tmMove1Icon.setVisible(false); - container.eggMove2Icon.setVisible(false); - container.tmMove2Icon.setVisible(false); if (fitsEggMove1 && !fitsLevelMove1) { - container.eggMove1Icon.setVisible(true); const em1 = eggMoves.findIndex(name => name === selectedMove1); if ((starterData.eggMoves & (1 << em1)) === 0) { - container.eggMove1Icon.setTint(0x808080); + data.eggMove1 = false; } else { - container.eggMove1Icon.clearTint(); + data.eggMove1 = true; } } else if (fitsTmMove1 && !fitsLevelMove1) { - container.tmMove1Icon.setVisible(true); + data.tmMove1 = true; } if (fitsEggMove2 && !fitsLevelMove2) { - container.eggMove2Icon.setVisible(true); const em2 = eggMoves.findIndex(name => name === selectedMove2); if ((starterData.eggMoves & (1 << em2)) === 0) { - container.eggMove2Icon.setTint(0x808080); + data.eggMove2 = false; } else { - container.eggMove2Icon.clearTint(); + data.eggMove2 = true; } } else if (fitsTmMove2 && !fitsLevelMove2) { - container.tmMove2Icon.setVisible(true); + data.tmMove2 = true; } // Ability filter - const abilities = [ container.species.ability1, container.species.ability2, container.species.abilityHidden ].map(a => allAbilities[a].name); + const abilities = [ species.ability1, species.ability2, species.abilityHidden ].map(a => allAbilities[a].name); const passives = starterPassiveAbilities[starterId] ?? {} as PassiveAbilities; const selectedAbility1 = this.filterText.getValue(FilterTextRow.ABILITY_1); - const fitsFormAbility1 = container.species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility1)); + const fitsFormAbility1 = species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility1)); const fitsAbility1 = abilities.includes(selectedAbility1) || fitsFormAbility1 || selectedAbility1 === this.filterText.defaultText; const fitsPassive1 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility1); const selectedAbility2 = this.filterText.getValue(FilterTextRow.ABILITY_2); - const fitsFormAbility2 = container.species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility2)); + const fitsFormAbility2 = species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility2)); const fitsAbility2 = abilities.includes(selectedAbility2) || fitsFormAbility2 || selectedAbility2 === this.filterText.defaultText; const fitsPassive2 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility2); @@ -1334,35 +1328,27 @@ export default class PokedexUiHandler extends MessageUiHandler { const fitsAbilities = (fitsAbility1 && (fitsPassive2 || selectedAbility2 === this.filterText.defaultText)) || (fitsAbility2 && (fitsPassive1 || selectedAbility1 === this.filterText.defaultText)); - container.passive1Icon.setVisible(false); - container.passive2Icon.setVisible(false); if (fitsPassive1 || fitsPassive2) { if (fitsPassive1) { if (starterData.passiveAttr > 0) { - container.passive1Icon.clearTint(); - container.passive1OverlayIcon.clearTint(); + data.passive1 = true; } else { - container.passive1Icon.setTint(0x808080); - container.passive1OverlayIcon.setTint(0x808080); + data.passive1 = false; } - container.passive1Icon.setVisible(true); } else { if (starterData.passiveAttr > 0) { - container.passive2Icon.clearTint(); - container.passive2OverlayIcon.clearTint(); + data.passive2 = true; } else { - container.passive2Icon.setTint(0x808080); - container.passive2OverlayIcon.setTint(0x808080); + data.passive2 = false; } - container.passive2Icon.setVisible(true); } } // Gen filter - const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); + const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(species.generation); // Type filter - const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1)); + const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => species.isOfType((type as number) - 1)); // Biome filter const indexToBiome = new Map( @@ -1374,7 +1360,7 @@ export default class PokedexUiHandler extends MessageUiHandler { // We get biomes for both the mon and its starters to ensure that evolutions get the correct filters. // TODO: We might also need to do it the other way around. - const biomes = catchableSpecies[container.species.speciesId].concat(catchableSpecies[starterId]).map(b => Biome[b.biome]); + const biomes = catchableSpecies[species.speciesId].concat(catchableSpecies[starterId]).map(b => Biome[b.biome]); if (biomes.length === 0) { biomes.push("Uncatchable"); } @@ -1405,7 +1391,7 @@ export default class PokedexUiHandler extends MessageUiHandler { // Passive Filter const isPassiveUnlocked = starterData.passiveAttr > 0; - const isPassiveUnlockable = this.isPassiveAvailable(container.species.speciesId) && !isPassiveUnlocked; + const isPassiveUnlockable = this.isPassiveAvailable(species.speciesId) && !isPassiveUnlocked; const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) { return isPassiveUnlocked; @@ -1421,7 +1407,7 @@ export default class PokedexUiHandler extends MessageUiHandler { // Cost Reduction Filter const isCostReducedByOne = starterData.valueReduction === 1; const isCostReducedByTwo = starterData.valueReduction === 2; - const isCostReductionUnlockable = this.isValueReductionAvailable(container.species.speciesId); + const isCostReductionUnlockable = this.isValueReductionAvailable(species.speciesId); const fitsCostReduction = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ON) { return isCostReducedByOne || isCostReducedByTwo; @@ -1439,7 +1425,7 @@ export default class PokedexUiHandler extends MessageUiHandler { }); // Starter Filter - const isStarter = this.getStarterSpeciesId(container.species.speciesId) === container.species.speciesId; + const isStarter = this.getStarterSpeciesId(species.speciesId) === species.speciesId; const fitsStarter = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "STARTER" && misc.state === DropDownState.ON) { return isStarter; @@ -1453,7 +1439,7 @@ export default class PokedexUiHandler extends MessageUiHandler { }); // Favorite Filter - const isFavorite = this.starterPreferences[container.species.speciesId]?.favorite ?? false; + const isFavorite = this.starterPreferences[species.speciesId]?.favorite ?? false; const fitsFavorite = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "FAVORITE" && misc.state === DropDownState.ON) { return isFavorite; @@ -1481,7 +1467,7 @@ export default class PokedexUiHandler extends MessageUiHandler { }); // HA Filter - const speciesHasHiddenAbility = container.species.abilityHidden !== container.species.ability1 && container.species.abilityHidden !== Abilities.NONE; + const speciesHasHiddenAbility = species.abilityHidden !== species.ability1 && species.abilityHidden !== Abilities.NONE; const hasHA = starterData.abilityAttr & AbilityAttr.ABILITY_HIDDEN; const fitsHA = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.ON) { @@ -1494,7 +1480,7 @@ export default class PokedexUiHandler extends MessageUiHandler { }); // Egg Purchasable Filter - const isEggPurchasable = this.isSameSpeciesEggAvailable(container.species.speciesId); + const isEggPurchasable = this.isSameSpeciesEggAvailable(species.speciesId); const fitsEgg = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "EGG" && misc.state === DropDownState.ON) { return isEggPurchasable; @@ -1508,25 +1494,25 @@ export default class PokedexUiHandler extends MessageUiHandler { // Pokerus Filter const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "POKERUS" && misc.state === DropDownState.ON) { - return this.pokerusSpecies.includes(container.species); + return this.pokerusSpecies.includes(species); } else if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { - return !this.pokerusSpecies.includes(container.species); + return !this.pokerusSpecies.includes(species); } else if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { return true; } }); if (fitsName && fitsAbilities && fitsMoves && fitsGen && fitsBiome && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsStarter && fitsFavorite && fitsWin && fitsHA && fitsEgg && fitsPokerus) { - this.filteredPokemonContainers.push(container); + this.filteredPokemonData.push(data); } }); - this.starterSelectScrollBar.setTotalRows(Math.max(Math.ceil(this.filteredPokemonContainers.length / 9), 1)); + this.starterSelectScrollBar.setTotalRows(Math.max(Math.ceil(this.filteredPokemonData.length / 9), 1)); this.starterSelectScrollBar.setScrollCursor(0); // sort const sort = this.filterBar.getVals(DropDownColumn.SORT)[0]; - this.filteredPokemonContainers.sort((a, b) => { + this.filteredPokemonData.sort((a, b) => { switch (sort.val) { default: break; @@ -1559,34 +1545,51 @@ export default class PokedexUiHandler extends MessageUiHandler { updateScroll = () => { const maxColumns = 9; - const maxRows = 9; const onScreenFirstIndex = this.scrollCursor * maxColumns; - const onScreenLastIndex = Math.min(this.filteredPokemonContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns - 1); this.starterSelectScrollBar.setScrollCursor(this.scrollCursor); this.pokerusCursorObjs.forEach(cursorObj => cursorObj.setVisible(false)); let pokerusCursorIndex = 0; - this.filteredPokemonContainers.forEach((container, i) => { - const pos = calcStarterPosition(i, this.scrollCursor); - container.setPosition(pos.x, pos.y); - if (i < onScreenFirstIndex || i > onScreenLastIndex) { + this.pokemonContainers.forEach((container, i) => { + + const i_data = i + onScreenFirstIndex; + + if (i_data >= this.filteredPokemonData.length) { container.setVisible(false); - return; } else { container.setVisible(true); + const data = this.filteredPokemonData[i_data]; + const props = data.props; + + container.setSpecies(data.species, props); + + const starterSprite = container.icon as Phaser.GameObjects.Sprite; + starterSprite.setTexture(data.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), container.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant)); + container.checkIconId(props.female, props.formIndex, props.shiny, props.variant); + + const speciesId = data.species.speciesId; + const dexEntry = globalScene.gameData.dexData[speciesId]; + const caughtAttr = dexEntry.caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & data.species.getFullUnlocksData(); + + if ((caughtAttr & data.species.getFullUnlocksData()) || globalScene.dexForDevs) { + container.icon.clearTint(); + } else if (dexEntry.seenAttr) { + container.icon.setTint(0x808080); + } else { + container.icon.setTint(0); + } + if (this.showDecorations) { - if (this.pokerusSpecies.includes(container.species)) { - this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); + if (this.pokerusSpecies.includes(data.species)) { + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(container.x - 1, container.y + 1); this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); pokerusCursorIndex++; } - 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); @@ -1641,6 +1644,7 @@ export default class PokedexUiHandler extends MessageUiHandler { setCursor(cursor: number): boolean { let changed = false; + this.oldCursor = this.cursor; if (this.filterMode) { changed = this.filterBarCursor !== cursor; @@ -1651,16 +1655,17 @@ export default class PokedexUiHandler extends MessageUiHandler { this.filterTextCursor = cursor; this.filterText.setCursor(cursor); } else { - cursor = Math.max(Math.min(this.filteredPokemonContainers.length - 1, cursor), 0); + cursor = Math.max(Math.min(this.pokemonContainers.length - 1, cursor), 0); changed = super.setCursor(cursor); - const pos = calcStarterPosition(cursor, this.scrollCursor); + const pos = calcStarterPosition(cursor); this.cursorObj.setPosition(pos.x - 1, pos.y + 1); - const species = this.filteredPokemonContainers[cursor]?.species; + const species = this.pokemonContainers[cursor]?.species; if (species) { this.setSpecies(species); + return true; } } @@ -1712,13 +1717,12 @@ export default class PokedexUiHandler extends MessageUiHandler { this.trayColumns = Math.min(this.trayNumIcons, 9); const maxColumns = 9; - const onScreenFirstIndex = this.scrollCursor * maxColumns; - const boxCursor = this.cursor - onScreenFirstIndex; + const boxCursor = this.cursor; const boxCursorY = Math.floor(boxCursor / maxColumns); const boxCursorX = boxCursor - boxCursorY * 9; const spaceBelow = 9 - 1 - boxCursorY; const spaceRight = 9 - boxCursorX; - const boxPos = calcStarterPosition(this.cursor, this.scrollCursor); + const boxPos = calcStarterPosition(this.cursor); const goUp = this.trayRows <= spaceBelow - 1 ? 0 : 1; const goLeft = this.trayColumns <= spaceRight ? 0 : 1; @@ -1745,6 +1749,8 @@ export default class PokedexUiHandler extends MessageUiHandler { formContainer.icon.clearTint(); } else if (isFormSeen) { formContainer.icon.setTint(0x808080); + } else { + formContainer.icon.setTint(0); } formContainer.setPosition(5 + (index % 9) * 18, 4 + Math.floor(index / 9) * 17); this.formTrayContainer.add(formContainer); @@ -1809,6 +1815,32 @@ export default class PokedexUiHandler extends MessageUiHandler { return { currentFriendship, friendshipCap }; } + startIconAnimation(cursor: number) { + const container = this.pokemonContainers[cursor]; + const icon = container.icon; + if (this.isUpgradeAnimationEnabled()) { + globalScene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); + // Reset the position of the icon + icon.x = -2; + icon.y = 2; + } + // Initiates the small up and down idle animation + this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); + } + + stopIconAnimation(cursor: number) { + const container = this.pokemonContainers[cursor]; + if (container) { + const lastSpeciesIcon = container.icon; + const dexAttr = this.getCurrentDexProps(container.species.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(container.species, dexAttr)); + this.checkIconId(lastSpeciesIcon, container.species, props.female, props.formIndex, props.shiny, props.variant); + this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE); + // Resume the animation for the previously selected species + globalScene.tweens.getTweensOf(lastSpeciesIcon).forEach(tween => tween.resume()); + } + } + setSpecies(species: PokemonSpecies | null) { this.speciesStarterDexEntry = species ? globalScene.gameData.dexData[species.speciesId] : null; @@ -1818,19 +1850,12 @@ export default class PokedexUiHandler extends MessageUiHandler { } if (this.lastSpecies) { - const dexAttr = this.getCurrentDexProps(this.lastSpecies.speciesId); - const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr)); - const speciesIndex = this.allSpecies.indexOf(this.lastSpecies); - const lastSpeciesIcon = this.pokemonContainers[speciesIndex].icon; - this.checkIconId(lastSpeciesIcon, this.lastSpecies, props.female, props.formIndex, props.shiny, props.variant); - this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE); - - // Resume the animation for the previously selected species - const icon = this.pokemonContainers[speciesIndex].icon; - globalScene.tweens.getTweensOf(icon).forEach(tween => tween.resume()); + this.stopIconAnimation(this.oldCursor); } - this.lastSpecies = species!; // TODO: is this bang correct? + if (species) { + this.lastSpecies = species; + } if (species && (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs)) { @@ -1840,19 +1865,7 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs) { - // Pause the animation when the species is selected - const speciesIndex = this.allSpecies.indexOf(species); - const icon = this.pokemonContainers[speciesIndex].icon; - - if (this.isUpgradeAnimationEnabled()) { - globalScene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); - // Reset the position of the icon - icon.x = -2; - icon.y = 2; - } - - // Initiates the small up and down idle animation - this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); + this.startIconAnimation(this.cursor); const speciesForm = getPokemonSpeciesForm(species.speciesId, 0); this.setTypeIcons(speciesForm.type1, speciesForm.type2); @@ -2115,6 +2128,7 @@ export default class PokedexUiHandler extends MessageUiHandler { override destroy(): void { this.pokemonContainers = []; + this.filteredPokemonData = []; } clearText() { @@ -2126,6 +2140,7 @@ export default class PokedexUiHandler extends MessageUiHandler { super.clear(); this.cursor = -1; + this.oldCursor = -1; globalScene.ui.hideTooltip(); this.starterSelectContainer.setVisible(false); From 7a9bede38df4e5360a5caa69f1baeb3e4325d1db Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Tue, 25 Feb 2025 22:17:22 +0100 Subject: [PATCH 37/83] =?UTF-8?q?[UI/UX][Bug]=20Fixing=20obsolete=20refere?= =?UTF-8?q?nce=20in=20Pok=C3=A9dex=20to=20filteredPokemonContainers=20#541?= =?UTF-8?q?5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 45809c40fb6..b3655d80fa1 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1538,7 +1538,7 @@ export default class PokedexUiHandler extends MessageUiHandler { return 0; }); - this.filteredIndices = this.filteredPokemonContainers.map(c => c.species.speciesId); + this.filteredIndices = this.filteredPokemonData.map(c => c.species.speciesId); this.updateScroll(); }; From 870bff0e6e2de1537a021d739d26543bf3ac8d6b Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Tue, 25 Feb 2025 15:38:17 -0800 Subject: [PATCH 38/83] [Bug][Ability] Fix Neutralizing Gas interactions #5381 * Add neutralizing gas arena tag * Add PostSummonAddArenaTagAbAttr * Add PreLeaveField attr for neutralizing gas * Remove old SuppressFieldAbilitiesAttr * Fix ability suppression logic * Add basic tests * Reapply onGain abilities when neutralizing gas ends * Untodo ability remval test * Add more tests * Modify gastro acid to call onLose attributes when suppressing * Properly cancel abilities on switch in * Add documentation * Remove partial designation * Update locale key usage * Reactivate the last source's other abilities when it becomes the last remaining * Fix loop vars * Add access modifiers for SuppressAbilitiesTag * Minor changes * Move test to reflect new location * Remove promises from abattr function signatures --- src/data/ability.ts | 78 ++++++++++---- src/data/arena-tag.ts | 67 +++++++++++- src/data/move.ts | 7 +- src/enums/arena-tag-type.ts | 1 + src/field/arena.ts | 2 +- src/field/pokemon.ts | 33 +++--- test/abilities/neutralizing_gas.test.ts | 138 ++++++++++++++++++++++++ 7 files changed, 285 insertions(+), 41 deletions(-) create mode 100644 test/abilities/neutralizing_gas.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index 8de0c68a8e7..5f19af8cea4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -12,7 +12,7 @@ import { getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffect import { Gender } from "./gender"; import type Move from "./move"; import { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./move"; -import type { ArenaTrapTag } from "./arena-tag"; +import type { ArenaTrapTag, SuppressAbilitiesTag } from "./arena-tag"; import { ArenaTagSide } from "./arena-tag"; import { BerryModifier, HitHealModifier, PokemonHeldItemModifier } from "../modifier/modifier"; import { TerrainType } from "./terrain"; @@ -2197,6 +2197,34 @@ export class PostSummonRemoveArenaTagAbAttr extends PostSummonAbAttr { } } +/** + * Generic class to add an arena tag upon switching in + */ +export class PostSummonAddArenaTagAbAttr extends PostSummonAbAttr { + private readonly tagType: ArenaTagType; + private readonly turnCount: number; + private readonly side?: ArenaTagSide; + private readonly quiet?: boolean; + private sourceId: number; + + + constructor(tagType: ArenaTagType, turnCount: number, side?: ArenaTagSide, quiet?: boolean) { + super(false); + this.tagType = tagType; + this.turnCount = turnCount; + this.side = side; + this.quiet = quiet; + } + + public override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + this.sourceId = pokemon.id; + if (!simulated) { + globalScene.arena.addTag(this.tagType, this.turnCount, undefined, this.sourceId, this.side, this.quiet); + } + return true; + } +} + export class PostSummonMessageAbAttr extends PostSummonAbAttr { private messageFunc: (pokemon: Pokemon) => string; @@ -2941,6 +2969,26 @@ export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { } } +/** + * Updates the active {@linkcode SuppressAbilitiesTag} when a pokemon with {@linkcode Abilities.NEUTRALIZING_GAS} leaves the field + */ +export class PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr extends PreLeaveFieldAbAttr { + constructor() { + super(false); + } + + public override applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!simulated) { + const suppressTag = globalScene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS) as SuppressAbilitiesTag; + if (suppressTag) { + suppressTag.onSourceLeave(globalScene.arena); + return true; + } + } + return simulated; + } +} + export class PreStatStageChangeAbAttr extends AbAttr { applyPreStatStageChange( pokemon: Pokemon | null, @@ -4692,21 +4740,6 @@ export class MoveAbilityBypassAbAttr extends AbAttr { } } -export class SuppressFieldAbilitiesAbAttr extends AbAttr { - constructor() { - super(false); - } - - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ability = (args[0] as Ability); - if (!ability.hasAttr(UnsuppressableAbilityAbAttr) && !ability.hasAttr(SuppressFieldAbilitiesAbAttr)) { - cancelled.value = true; - return true; - } - return false; - } -} - export class AlwaysHitAbAttr extends AbAttr { } /** Attribute for abilities that allow moves that make contact to ignore protection (i.e. Unseen Fist) */ @@ -5946,10 +5979,10 @@ export function applyOnGainAbAttrs(pokemon: Pokemon, passive: boolean = false, s } /** - * Clears primal weather during the turn if {@linkcode pokemon}'s ability corresponds to one + * Clears primal weather/neutralizing gas during the turn if {@linkcode pokemon}'s ability corresponds to one */ -export function applyOnLoseClearWeatherAbAttrs(pokemon: Pokemon, passive: boolean = false, simulated: boolean = false, ...args: any[]): void { - applySingleAbAttrs(pokemon, passive, PreLeaveFieldClearWeatherAbAttr, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), args, true, simulated); +export function applyOnLoseAbAttrs(pokemon: Pokemon, passive: boolean = false, simulated: boolean = false, ...args: any[]): void { + applySingleAbAttrs(pokemon, passive, PreLeaveFieldAbAttr, (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), args, true, simulated); } function queueShowAbility(pokemon: Pokemon, passive: boolean): void { globalScene.unshiftPhase(new ShowAbilityPhase(pokemon.id, passive)); @@ -6838,12 +6871,11 @@ export function initAbilities() { new Ability(Abilities.GORILLA_TACTICS, 8) .attr(GorillaTacticsAbAttr), new Ability(Abilities.NEUTRALIZING_GAS, 8) - .attr(SuppressFieldAbilitiesAbAttr) + .attr(PostSummonAddArenaTagAbAttr, ArenaTagType.NEUTRALIZING_GAS, 0) + .attr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonNeutralizingGas", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) - .partial(), // A bunch of weird interactions with other abilities being suppressed then unsuppressed + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.PASTEL_VEIL, 8) .attr(PostSummonUserFieldRemoveStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 2fa4593fd6c..d034ccf83b8 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -8,7 +8,7 @@ import type Pokemon from "#app/field/pokemon"; import { HitResult, PokemonMove } from "#app/field/pokemon"; import { StatusEffect } from "#enums/status-effect"; import type { BattlerIndex } from "#app/battle"; -import { BlockNonDirectDamageAbAttr, InfiltratorAbAttr, ProtectStatAbAttr, applyAbAttrs } from "#app/data/ability"; +import { BlockNonDirectDamageAbAttr, InfiltratorAbAttr, PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, ProtectStatAbAttr, applyAbAttrs, applyOnGainAbAttrs, applyOnLoseAbAttrs } from "#app/data/ability"; import { Stat } from "#enums/stat"; import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; import i18next from "i18next"; @@ -1221,6 +1221,69 @@ export class FairyLockTag extends ArenaTag { } +/** + * Arena tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Neutralizing_Gas_(Ability) Neutralizing Gas} + * + * Keeps track of the number of pokemon on the field with Neutralizing Gas - If it drops to zero, the effect is ended and abilities are reactivated + * + * Additionally ends onLose abilities when it is activated + */ +export class SuppressAbilitiesTag extends ArenaTag { + private sourceCount: number; + + constructor(sourceId: number) { + super(ArenaTagType.NEUTRALIZING_GAS, 0, undefined, sourceId); + this.sourceCount = 1; + } + + public override onAdd(arena: Arena): void { + const pokemon = this.getSourcePokemon(); + if (pokemon) { + globalScene.queueMessage(i18next.t("arenaTag:neutralizingGasOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + + for (const fieldPokemon of globalScene.getField()) { + if (fieldPokemon && fieldPokemon.id !== pokemon.id) { + [ true, false ].forEach((passive) => applyOnLoseAbAttrs(fieldPokemon, passive)); + } + } + } + } + + public override onOverlap(arena: Arena): void { + this.sourceCount++; + } + + public onSourceLeave(arena: Arena): void { + this.sourceCount--; + if (this.sourceCount <= 0) { + arena.removeTag(ArenaTagType.NEUTRALIZING_GAS); + } else if (this.sourceCount === 1) { + // With 1 source left, that pokemon's other abilities should reactivate + // This may be confusing for players but would be the most accurate gameplay-wise + // Could have a custom message that plays when a specific pokemon's NG ends? This entire thing exists due to passives after all + const setter = globalScene.getField().filter((p) => p && p.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false))[0]; + applyOnGainAbAttrs(setter, setter.getAbility().hasAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr)); + } + } + + public override onRemove(arena: Arena, quiet: boolean = false) { + if (!quiet) { + globalScene.queueMessage(i18next.t("arenaTag:neutralizingGasOnRemove")); + } + + for (const pokemon of globalScene.getField()) { + // There is only one pokemon with this attr on the field on removal, so its abilities are already active + if (pokemon && !pokemon.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false)) { + [ true, false ].forEach((passive) => applyOnGainAbAttrs(pokemon, passive)); + } + } + } + + public shouldApplyToSelf(): boolean { + return this.sourceCount > 1; + } +} + // TODO: swap `sourceMove` and `sourceId` and make `sourceMove` an optional parameter export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null { switch (tagType) { @@ -1281,6 +1344,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove return new GrassWaterPledgeTag(sourceId, side); case ArenaTagType.FAIRY_LOCK: return new FairyLockTag(turnCount, sourceId); + case ArenaTagType.NEUTRALIZING_GAS: + return new SuppressAbilitiesTag(sourceId); default: return null; } diff --git a/src/data/move.ts b/src/data/move.ts index d9ceb0f3dce..26b182ec5db 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -7811,11 +7811,12 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { return false; } - target.summonData.abilitySuppressed = true; - globalScene.arena.triggerWeatherBasedFormChangesToNormal(); - globalScene.queueMessage(i18next.t("moveTriggers:suppressAbilities", { pokemonName: getPokemonNameWithAffix(target) })); + target.suppressAbility(); + + globalScene.arena.triggerWeatherBasedFormChangesToNormal(); + return true; } diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts index 1c62ccb14a6..4180aa00ef5 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -29,4 +29,5 @@ export enum ArenaTagType { WATER_FIRE_PLEDGE = "WATER_FIRE_PLEDGE", GRASS_WATER_PLEDGE = "GRASS_WATER_PLEDGE", FAIRY_LOCK = "FAIRY_LOCK", + NEUTRALIZING_GAS = "NEUTRALIZING_GAS" } diff --git a/src/field/arena.ts b/src/field/arena.ts index 60ee4b5b03c..752eef81596 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -588,8 +588,8 @@ export class Arena { // creates a new tag object const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side); if (newTag) { - this.tags.push(newTag); newTag.onAdd(this, quiet); + this.tags.push(newTag); const { layers = 0, maxLayers = 0 } = newTag instanceof ArenaTrapTag ? newTag : {}; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 17917ad9b40..bc3b9b1403f 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -63,8 +63,9 @@ import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "#app/data/balance/ import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, SubstituteTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag, AutotomizedTag, PowerTrickTag } from "../data/battler-tags"; import { WeatherType } from "#enums/weather-type"; import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "#app/data/arena-tag"; +import type { SuppressAbilitiesTag } from "#app/data/arena-tag"; import type { Ability, AbAttr } from "#app/data/ability"; -import { StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs, InfiltratorAbAttr, AlliedFieldDamageReductionAbAttr, PostDamageAbAttr, applyPostDamageAbAttrs, CommanderAbAttr, applyPostItemLostAbAttrs, PostItemLostAbAttr, applyOnGainAbAttrs, PreLeaveFieldAbAttr, applyPreLeaveFieldAbAttrs, applyOnLoseClearWeatherAbAttrs } from "#app/data/ability"; +import { StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs, InfiltratorAbAttr, AlliedFieldDamageReductionAbAttr, PostDamageAbAttr, applyPostDamageAbAttrs, CommanderAbAttr, applyPostItemLostAbAttrs, PostItemLostAbAttr, applyOnGainAbAttrs, PreLeaveFieldAbAttr, applyPreLeaveFieldAbAttrs, applyOnLoseAbAttrs, PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr } from "#app/data/ability"; import type PokemonData from "#app/system/pokemon-data"; import { BattlerIndex } from "#app/battle"; import { Mode } from "#app/ui/ui"; @@ -1487,7 +1488,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ability New Ability */ public setTempAbility(ability: Ability, passive: boolean = false): void { - applyOnLoseClearWeatherAbAttrs(this, passive); + applyOnLoseAbAttrs(this, passive); if (passive) { this.summonData.passiveAbility = ability.id; } else { @@ -1496,6 +1497,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyOnGainAbAttrs(this, passive); } + /** + * Suppresses an ability and calls its onlose attributes + */ + public suppressAbility() { + this.summonData.abilitySuppressed = true; + [ true, false ].forEach((passive) => applyOnLoseAbAttrs(this, passive)); + } + /** * Checks if a pokemon has a passive either from: * - bought with starter candy @@ -1553,17 +1562,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.summonData?.abilitySuppressed && !ability.hasAttr(UnsuppressableAbilityAbAttr)) { return false; } - if (this.isOnField() && !ability.hasAttr(SuppressFieldAbilitiesAbAttr)) { - const suppressed = new Utils.BooleanHolder(false); - globalScene.getField(true).filter(p => p !== this).map(p => { - if (p.getAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility()) { - p.getAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, false, false, suppressed, [ ability ])); - } - if (p.getPassiveAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility(true)) { - p.getPassiveAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, true, false, suppressed, [ ability ])); - } - }); - if (suppressed.value) { + const suppressAbilitiesTag = arena.getTag(ArenaTagType.NEUTRALIZING_GAS) as SuppressAbilitiesTag; + if (this.isOnField() && suppressAbilitiesTag) { + const thisAbilitySuppressing = ability.hasAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr); + const hasSuppressingAbility = this.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false); + // Neutralizing gas is up - suppress abilities unless they are unsuppressable or this pokemon is responsible for the gas + // (Balance decided that the other ability of a neutralizing gas pokemon should not be neutralized) + // If the ability itself is neutralizing gas, don't suppress it (handled through arena tag) + const unsuppressable = ability.hasAttr(UnsuppressableAbilityAbAttr) || thisAbilitySuppressing || (hasSuppressingAbility && !suppressAbilitiesTag.shouldApplyToSelf()); + if (!unsuppressable) { return false; } } diff --git a/test/abilities/neutralizing_gas.test.ts b/test/abilities/neutralizing_gas.test.ts new file mode 100644 index 00000000000..8b9c374f1cc --- /dev/null +++ b/test/abilities/neutralizing_gas.test.ts @@ -0,0 +1,138 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Neutralizing Gas", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH ]) + .ability(Abilities.NEUTRALIZING_GAS) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should prevent other abilities from activating", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + // Intimidate is suppressed, so the attack stat should not be lowered + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should allow the user's passive to activate", async () => { + game.override.passiveAbility(Abilities.INTREPID_SWORD); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(1); + }); + + it.todo("should activate before other abilities", async () => { + game.override.enemySpecies(Species.ACCELGOR) + .enemyLevel(100) + .enemyAbility(Abilities.INTIMIDATE); + + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + // Intimidate is suppressed even when the user's speed is lower + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should activate other abilities when removed", async () => { + game.override.enemyAbility(Abilities.INTREPID_SWORD) + .enemyPassiveAbility(Abilities.DAUNTLESS_SHIELD) + .enemyMoveset(Moves.ENTRAINMENT); + + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(0); + expect(enemyPokemon?.getStatStage(Stat.DEF)).toBe(0); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + // Enemy removes user's ability, so both abilities are activated + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(1); + expect(enemyPokemon?.getStatStage(Stat.DEF)).toBe(1); + }); + + it("should not activate the user's other ability when removed", async () => { + game.override.passiveAbility(Abilities.INTIMIDATE) + .enemyMoveset(Moves.ENTRAINMENT); + + await game.classicMode.startBattle([ Species.FEEBAS ]); + // Neutralising gas user's passive is still active + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + // Intimidate did not reactivate after neutralizing gas was removed + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should only deactivate when all setters are off the field", async () => { + game.override.enemyMoveset([ Moves.ENTRAINMENT, Moves.SPLASH ]) + .battleType("double"); + + await game.classicMode.startBattle([ Species.ACCELGOR, Species.ACCELGOR ]); + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.ENTRAINMENT, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); // Now one neut gas user is left + + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.ENTRAINMENT, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); // No neut gas users are left + }); + + it("should deactivate when suppressed by gastro acid", async () => { + game.override.enemyMoveset(Moves.GASTRO_ACID); + + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + }); + +}); From 2cc0ac90f88ac6cc1e79a439a4cdf4392d1a650a Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:22:32 -0800 Subject: [PATCH 39/83] [Bug] Fix canApplyAbility check #5413 --- src/data/ability.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 5f19af8cea4..dcbaa4026f4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -5152,6 +5152,10 @@ function applySingleAbAttrs( showAbilityInstant: boolean = false, messages: string[] = [] ) { + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { + return; + } + const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); if (gainedMidTurn && ability.getAttrs(attrType).some(attr => attr instanceof PostSummonAbAttr && !attr.shouldActivateOnGain())) { return; @@ -5445,12 +5449,10 @@ function applyAbAttrsInternal( gainedMidTurn: boolean = false ) { for (const passive of [ false, true ]) { - if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { - continue; + if (pokemon) { + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); + globalScene.clearPhaseQueueSplice(); } - - applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); - globalScene.clearPhaseQueueSplice(); } } From aa3f92463344c1c1aff3081e4095095dba8394bb Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 25 Feb 2025 21:05:18 -0600 Subject: [PATCH 40/83] Revert "[Bug] Fix canApplyAbility check #5413" (#5417) This reverts commit 2cc0ac90f88ac6cc1e79a439a4cdf4392d1a650a. --- src/data/ability.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index dcbaa4026f4..5f19af8cea4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -5152,10 +5152,6 @@ function applySingleAbAttrs( showAbilityInstant: boolean = false, messages: string[] = [] ) { - if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { - return; - } - const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); if (gainedMidTurn && ability.getAttrs(attrType).some(attr => attr instanceof PostSummonAbAttr && !attr.shouldActivateOnGain())) { return; @@ -5449,10 +5445,12 @@ function applyAbAttrsInternal( gainedMidTurn: boolean = false ) { for (const passive of [ false, true ]) { - if (pokemon) { - applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); - globalScene.clearPhaseQueueSplice(); + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { + continue; } + + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); + globalScene.clearPhaseQueueSplice(); } } From ca5e578954f9907cc75044d368eb5d2ead0a42f3 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Wed, 26 Feb 2025 14:27:20 +1100 Subject: [PATCH 41/83] [Bug] Fix AI func save/loads. #5414 Co-authored-by: damocleas --- src/battle-scene.ts | 2 -- src/phases/encounter-phase.ts | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 962b9c8ca91..8205c1fcebc 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -3448,8 +3448,6 @@ 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) => { diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 9485e77e5aa..ea8e43faeeb 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -253,7 +253,10 @@ export class EncounterPhase extends BattlePhase { globalScene.getEnemyField().forEach(enemy => { overrideHeldItems(enemy, false); }); + } + if (battle.battleType === BattleType.TRAINER) { + globalScene.currentBattle.trainer!.genAI(globalScene.getEnemyParty()); } globalScene.ui.setMode(Mode.MESSAGE).then(() => { From 92ee9d06caf8f68c24e85acc5c5dde81c31ce57a Mon Sep 17 00:00:00 2001 From: damocleas Date: Tue, 25 Feb 2025 23:02:04 -0500 Subject: [PATCH 42/83] [Balance] February 2025 Passive/Egg Move/Cost Changes 2 #5416 * Update egg-moves.ts * Update starters.ts cost changes * Update passives.ts * Update mystery-encounter-utils.test.ts --- src/data/balance/egg-moves.ts | 34 +++++++++---------- src/data/balance/passives.ts | 6 ++-- src/data/balance/starters.ts | 4 +-- .../mystery-encounter-utils.test.ts | 6 ++-- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index 35ec6f934a4..ae61acbd32e 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -46,7 +46,7 @@ export const speciesEggMoves = { [Species.DROWZEE]: [ Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.LUMINA_CRASH, Moves.DARK_VOID ], [Species.KRABBY]: [ Moves.DIRE_CLAW, Moves.DRAGON_HAMMER, Moves.IVY_CUDGEL, Moves.JET_PUNCH ], [Species.VOLTORB]: [ Moves.NASTY_PLOT, Moves.FUSION_FLARE, Moves.FROST_BREATH, Moves.ELECTRO_DRIFT ], - [Species.EXEGGCUTE]: [ Moves.FICKLE_BEAM, Moves.APPLE_ACID, Moves.TRICK_ROOM, Moves.LUMINA_CRASH ], + [Species.EXEGGCUTE]: [ Moves.FICKLE_BEAM, Moves.APPLE_ACID, Moves.HEAT_WAVE, Moves.LUMINA_CRASH ], [Species.CUBONE]: [ Moves.HEAD_SMASH, Moves.WOOD_HAMMER, Moves.SHADOW_SNEAK, Moves.BITTER_BLADE ], [Species.LICKITUNG]: [ Moves.CRUSH_GRIP, Moves.FIRE_LASH, Moves.SLACK_OFF, Moves.MAGICAL_TORQUE ], [Species.KOFFING]: [ Moves.SCALD, Moves.RECOVER, Moves.BODY_PRESS, Moves.MALIGNANT_CHAIN ], @@ -59,7 +59,7 @@ export const speciesEggMoves = { [Species.SCYTHER]: [ Moves.MIGHTY_CLEAVE, Moves.GEAR_GRIND, Moves.STORM_THROW, Moves.BITTER_BLADE ], [Species.PINSIR]: [ Moves.HEADLONG_RUSH, Moves.LEECH_LIFE, Moves.CRUSH_GRIP, Moves.EXTREME_SPEED ], [Species.TAUROS]: [ Moves.SWORDS_DANCE, Moves.FIRE_LASH, Moves.WICKED_TORQUE, Moves.COLLISION_COURSE ], - [Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.DRAGON_ASCENT, Moves.SURGING_STRIKES ], + [Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.KNOCK_OFF, Moves.DRAGON_ASCENT ], [Species.LAPRAS]: [ Moves.RECOVER, Moves.FREEZE_DRY, Moves.SCALD, Moves.SHELL_SMASH ], [Species.DITTO]: [ Moves.MIMIC, Moves.SKETCH, Moves.METRONOME, Moves.IMPRISON ], [Species.EEVEE]: [ Moves.WISH, Moves.NO_RETREAT, Moves.ZIPPY_ZAP, Moves.BOOMBURST ], @@ -76,7 +76,7 @@ export const speciesEggMoves = { [Species.CHIKORITA]: [ Moves.SAPPY_SEED, Moves.STONE_AXE, Moves.DRAGON_DANCE, Moves.SPORE ], [Species.CYNDAQUIL]: [ Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.FIERY_DANCE, Moves.ELECTRO_DRIFT ], - [Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.SURGING_STRIKES ], + [Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.PLAY_ROUGH, Moves.SURGING_STRIKES ], [Species.SENTRET]: [ Moves.TIDY_UP, Moves.FAKE_OUT, Moves.NUZZLE, Moves.EXTREME_SPEED ], [Species.HOOTHOOT]: [ Moves.CALM_MIND, Moves.ESPER_WING, Moves.AEROBLAST, Moves.BOOMBURST ], [Species.LEDYBA]: [ Moves.POLLEN_PUFF, Moves.MAT_BLOCK, Moves.PARTING_SHOT, Moves.SPORE ], @@ -159,7 +159,7 @@ export const speciesEggMoves = { [Species.VOLBEAT]: [ Moves.BATON_PASS, Moves.STICKY_WEB, Moves.DECORATE, Moves.VICTORY_DANCE ], [Species.ILLUMISE]: [ Moves.PARTING_SHOT, Moves.GLITZY_GLOW, Moves.POWDER, Moves.QUIVER_DANCE ], [Species.GULPIN]: [ Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.STRENGTH_SAP ], - [Species.CARVANHA]: [ Moves.THUNDER_FANG, Moves.SWORDS_DANCE, Moves.OBSTRUCT, Moves.SURGING_STRIKES ], + [Species.CARVANHA]: [ Moves.THUNDER_FANG, Moves.GUNK_SHOT, Moves.OBSTRUCT, Moves.SURGING_STRIKES ], [Species.WAILMER]: [ Moves.TAKE_HEART, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ], [Species.NUMEL]: [ Moves.TRICK_ROOM, Moves.ENERGY_BALL, Moves.SLACK_OFF, Moves.BLUE_FLARE ], [Species.TORKOAL]: [ Moves.MORNING_SUN, Moves.BURNING_BULWARK, Moves.BODY_PRESS, Moves.HYDRO_STEAM ], @@ -235,7 +235,7 @@ export const speciesEggMoves = { [Species.RIOLU]: [ Moves.THUNDEROUS_KICK, Moves.TACHYON_CUTTER, Moves.TRIPLE_AXEL, Moves.SUNSTEEL_STRIKE ], [Species.HIPPOPOTAS]: [ Moves.SHORE_UP, Moves.STONE_AXE, Moves.BULK_UP, Moves.SALT_CURE ], [Species.SKORUPI]: [ Moves.COIL, Moves.DIRE_CLAW, Moves.CRABHAMMER, Moves.WICKED_BLOW ], - [Species.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.ICE_SPINNER, Moves.THUNDEROUS_KICK, Moves.VICTORY_DANCE ], + [Species.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.TRIPLE_AXEL, Moves.THUNDEROUS_KICK, Moves.VICTORY_DANCE ], [Species.CARNIVINE]: [ Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.COIL, Moves.SAPPY_SEED ], [Species.FINNEON]: [ Moves.QUIVER_DANCE, Moves.SPLISHY_SPLASH, Moves.FREEZE_DRY, Moves.OBLIVION_WING ], [Species.MANTYKE]: [ Moves.SPLISHY_SPLASH, Moves.FREEZY_FROST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], @@ -267,7 +267,7 @@ export const speciesEggMoves = { [Species.PANSEAR]: [ Moves.NASTY_PLOT, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.ERUPTION ], [Species.PANPOUR]: [ Moves.NASTY_PLOT, Moves.ENERGY_BALL, Moves.EARTH_POWER, Moves.WATER_SPOUT ], [Species.MUNNA]: [ Moves.COSMIC_POWER, Moves.AURA_SPHERE, Moves.LUNAR_BLESSING, Moves.MYSTICAL_POWER ], - [Species.PIDOVE]: [ Moves.GUNK_SHOT, Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], + [Species.PIDOVE]: [ Moves.SLASH, Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], [Species.BLITZLE]: [ Moves.HORN_LEECH, Moves.SWORDS_DANCE, Moves.FLARE_BLITZ, Moves.BOLT_STRIKE ], [Species.ROGGENROLA]: [ Moves.BODY_PRESS, Moves.CURSE, Moves.SHORE_UP, Moves.DIAMOND_STORM ], [Species.WOOBAT]: [ Moves.ESPER_WING, Moves.STORED_POWER, Moves.MYSTICAL_FIRE, Moves.OBLIVION_WING ], @@ -282,7 +282,7 @@ export const speciesEggMoves = { [Species.COTTONEE]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.SLEEP_POWDER, Moves.SEED_FLARE ], [Species.PETILIL]: [ Moves.THUNDEROUS_KICK, Moves.SPARKLING_ARIA, Moves.FIERY_DANCE, Moves.FLOWER_TRICK ], [Species.BASCULIN]: [ Moves.LAST_RESPECTS, Moves.CLOSE_COMBAT, Moves.SPLISHY_SPLASH, Moves.NO_RETREAT ], - [Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.HEADLONG_RUSH, Moves.FIRE_LASH, Moves.WICKED_BLOW ], + [Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.SUCKER_PUNCH, Moves.FIRE_LASH, Moves.HEADLONG_RUSH ], [Species.DARUMAKA]: [ Moves.DRAIN_PUNCH, Moves.ZIPPY_ZAP, Moves.HEADLONG_RUSH, Moves.PYRO_BALL ], [Species.MARACTUS]: [ Moves.EARTH_POWER, Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.SEED_FLARE ], [Species.DWEBBLE]: [ Moves.CRABHAMMER, Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.MIGHTY_CLEAVE ], @@ -327,8 +327,8 @@ export const speciesEggMoves = { [Species.DEINO]: [ Moves.FIERY_WRATH, Moves.ESPER_WING, Moves.SLUDGE_BOMB, Moves.FICKLE_BEAM ], [Species.LARVESTA]: [ Moves.THUNDERBOLT, Moves.DAZZLING_GLEAM, Moves.EARTH_POWER, Moves.HYDRO_STEAM ], [Species.COBALION]: [ Moves.BEHEMOTH_BLADE, Moves.MIGHTY_CLEAVE, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], - [Species.TERRAKION]: [ Moves.MIGHTY_CLEAVE, Moves.HEADLONG_RUSH, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], - [Species.VIRIZION]: [ Moves.SAPPY_SEED, Moves.PSYBLADE, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], + [Species.TERRAKION]: [ Moves.MIGHTY_CLEAVE, Moves.HEADLONG_RUSH, Moves.KNOCK_OFF, Moves.VICTORY_DANCE ], + [Species.VIRIZION]: [ Moves.SAPPY_SEED, Moves.PSYBLADE, Moves.STONE_AXE, Moves.VICTORY_DANCE ], [Species.TORNADUS]: [ Moves.SANDSEAR_STORM, Moves.PARTING_SHOT, Moves.SPLISHY_SPLASH, Moves.OBLIVION_WING ], [Species.THUNDURUS]: [ Moves.SANDSEAR_STORM, Moves.HURRICANE, Moves.FROST_BREATH, Moves.ELECTRO_SHOT ], [Species.RESHIRAM]: [ Moves.ENERGY_BALL, Moves.TAKE_HEART, Moves.FICKLE_BEAM, Moves.ERUPTION ], @@ -342,7 +342,7 @@ export const speciesEggMoves = { [Species.CHESPIN]: [ Moves.COMBAT_TORQUE, Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED ], [Species.FENNEKIN]: [ Moves.TWIN_BEAM, Moves.FIERY_DANCE, Moves.THUNDERBOLT, Moves.SPARKLY_SWIRL ], [Species.FROAKIE]: [ Moves.MOONBLAST, Moves.SHELL_SIDE_ARM, Moves.FIERY_WRATH, Moves.STEAM_ERUPTION ], - [Species.BUNNELBY]: [ Moves.DRAIN_PUNCH, Moves.TIDY_UP, Moves.FACADE, Moves.EXTREME_SPEED ], + [Species.BUNNELBY]: [ Moves.DRAIN_PUNCH, Moves.TIDY_UP, Moves.LANDS_WRATH, Moves.EXTREME_SPEED ], [Species.FLETCHLING]: [ Moves.DRILL_RUN, Moves.BURNING_BULWARK, Moves.HEAD_SMASH, Moves.VOLT_TACKLE ], [Species.SCATTERBUG]: [ Moves.FOCUS_BLAST, Moves.AFTER_YOU, Moves.DECORATE, Moves.BLIZZARD ], [Species.LITLEO]: [ Moves.EARTH_POWER, Moves.NASTY_PLOT, Moves.BURNING_BULWARK, Moves.BLUE_FLARE ], @@ -372,7 +372,7 @@ export const speciesEggMoves = { [Species.NOIBAT]: [ Moves.AEROBLAST, Moves.OVERDRIVE, Moves.NASTY_PLOT, Moves.CLANGING_SCALES ], [Species.XERNEAS]: [ Moves.EARTH_POWER, Moves.SPRINGTIDE_STORM, Moves.STRENGTH_SAP, Moves.TAIL_GLOW ], [Species.YVELTAL]: [ Moves.SLUDGE_WAVE, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ], - [Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.HEAL_ORDER, Moves.CLANGOROUS_SOUL, Moves.DOUBLE_IRON_BASH ], + [Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.V_CREATE, Moves.CLANGOROUS_SOUL, Moves.HEAL_ORDER ], [Species.DIANCIE]: [ Moves.MAGICAL_TORQUE, Moves.FIERY_DANCE, Moves.SHORE_UP, Moves.GEOMANCY ], [Species.HOOPA]: [ Moves.PHOTON_GEYSER, Moves.SECRET_SWORD, Moves.FIERY_WRATH, Moves.SHELL_SMASH ], [Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.SEARING_SHOT, Moves.THUNDERCLAP ], @@ -415,7 +415,7 @@ export const speciesEggMoves = { [Species.JANGMO_O]: [ Moves.BODY_PRESS, Moves.SHELL_SIDE_ARM, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ], [Species.TAPU_KOKO]: [ Moves.MAGICAL_TORQUE, Moves.TRIPLE_AXEL, Moves.SWORDS_DANCE, Moves.BOLT_STRIKE ], [Species.TAPU_LELE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.HEAT_WAVE, Moves.EXPANDING_FORCE ], - [Species.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.DRAIN_PUNCH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ], + [Species.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.LANDS_WRATH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ], [Species.TAPU_FINI]: [ Moves.SPRINGTIDE_STORM, Moves.EARTH_POWER, Moves.RECOVER, Moves.QUIVER_DANCE ], [Species.COSMOG]: [ Moves.PHOTON_GEYSER, Moves.PRECIPICE_BLADES, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE ], [Species.NIHILEGO]: [ Moves.STRENGTH_SAP, Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.QUIVER_DANCE ], @@ -505,7 +505,7 @@ export const speciesEggMoves = { [Species.HISUI_VOLTORB]: [ Moves.FROST_BREATH, Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.ELECTRO_DRIFT ], [Species.HISUI_QWILFISH]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.RECOVER, Moves.FISHIOUS_REND ], [Species.HISUI_SNEASEL]: [ Moves.DRAIN_PUNCH, Moves.KNOCK_OFF, Moves.PSYCHIC_FANGS, Moves.TRIPLE_AXEL ], - [Species.HISUI_ZORUA]: [ Moves.MOONBLAST, Moves.HYPER_VOICE, Moves.PARTING_SHOT, Moves.BLOOD_MOON ], + [Species.HISUI_ZORUA]: [ Moves.MOONBLAST, Moves.SECRET_SWORD, Moves.PARTING_SHOT, Moves.BLOOD_MOON ], [Species.SPRIGATITO]: [ Moves.FIRE_LASH, Moves.TRIPLE_AXEL, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ], [Species.FUECOCO]: [ Moves.ALLURING_VOICE, Moves.SLACK_OFF, Moves.OVERDRIVE, Moves.MOONGEIST_BEAM ], @@ -538,7 +538,7 @@ export const speciesEggMoves = { [Species.CYCLIZAR]: [ Moves.PARTING_SHOT, Moves.FIRE_LASH, Moves.MAGICAL_TORQUE, Moves.GLAIVE_RUSH ], [Species.ORTHWORM]: [ Moves.SIZZLY_SLIDE, Moves.COIL, Moves.BODY_PRESS, Moves.SHORE_UP ], [Species.GLIMMET]: [ Moves.CALM_MIND, Moves.GIGA_DRAIN, Moves.FIERY_DANCE, Moves.MALIGNANT_CHAIN ], - [Species.GREAVARD]: [ Moves.SHADOW_BONE, Moves.YAWN, Moves.SHORE_UP, Moves.COLLISION_COURSE ], + [Species.GREAVARD]: [ Moves.SHADOW_BONE, Moves.SIZZLY_SLIDE, Moves.SHORE_UP, Moves.COLLISION_COURSE ], [Species.FLAMIGO]: [ Moves.THUNDEROUS_KICK, Moves.TRIPLE_AXEL, Moves.FLOATY_FALL, Moves.VICTORY_DANCE ], [Species.CETODDLE]: [ Moves.ZING_ZAP, Moves.HIGH_HORSEPOWER, Moves.SLACK_OFF, Moves.DRAGON_DANCE ], [Species.VELUZA]: [ Moves.PSYBLADE, Moves.LEAF_BLADE, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE ], @@ -550,7 +550,7 @@ export const speciesEggMoves = { [Species.FLUTTER_MANE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.MOONGEIST_BEAM ], [Species.SLITHER_WING]: [ Moves.MIGHTY_CLEAVE, Moves.THUNDEROUS_KICK, Moves.FIRE_LASH, Moves.VICTORY_DANCE ], [Species.SANDY_SHOCKS]: [ Moves.MORNING_SUN, Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.THUNDERCLAP ], - [Species.IRON_TREADS]: [ Moves.FUSION_BOLT, Moves.BULK_UP, Moves.SHORE_UP, Moves.SUNSTEEL_STRIKE ], + [Species.IRON_TREADS]: [ Moves.FUSION_BOLT, Moves.SHIFT_GEAR, Moves.SHORE_UP, Moves.SUNSTEEL_STRIKE ], [Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.SPLISHY_SPLASH, Moves.VOLT_SWITCH, Moves.NASTY_PLOT ], [Species.IRON_HANDS]: [ Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS, Moves.ICE_HAMMER ], [Species.IRON_JUGULIS]: [ Moves.FIERY_WRATH, Moves.ROOST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], @@ -562,7 +562,7 @@ export const speciesEggMoves = { [Species.CHIEN_PAO]: [ Moves.KNOCK_OFF, Moves.PARTING_SHOT, Moves.TRIPLE_AXEL, Moves.BITTER_BLADE ], [Species.TING_LU]: [ Moves.SHORE_UP, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED, Moves.PRECIPICE_BLADES ], [Species.CHI_YU]: [ Moves.FIERY_WRATH, Moves.HYDRO_STEAM, Moves.MORNING_SUN, Moves.BLUE_FLARE ], - [Species.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ], + [Species.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.METEOR_MASH, Moves.DRAGON_ASCENT ], [Species.IRON_VALIANT]: [ Moves.PLASMA_FISTS, Moves.NO_RETREAT, Moves.SECRET_SWORD, Moves.MAGICAL_TORQUE ], [Species.KORAIDON]: [ Moves.SUNSTEEL_STRIKE, Moves.SOLAR_BLADE, Moves.DRAGON_DARTS, Moves.BITTER_BLADE ], [Species.MIRAIDON]: [ Moves.ICE_BEAM, Moves.CLANGOROUS_SOUL, Moves.CORE_ENFORCER, Moves.RISING_VOLTAGE ], @@ -577,7 +577,7 @@ export const speciesEggMoves = { [Species.RAGING_BOLT]: [ Moves.NASTY_PLOT, Moves.FLAMETHROWER, Moves.MORNING_SUN, Moves.ELECTRO_DRIFT ], [Species.IRON_BOULDER]: [ Moves.PSYBLADE, Moves.KOWTOW_CLEAVE, Moves.STONE_AXE, Moves.BITTER_BLADE ], [Species.IRON_CROWN]: [ Moves.NASTY_PLOT, Moves.SECRET_SWORD, Moves.PSYSTRIKE, Moves.ELECTRO_DRIFT ], - [Species.TERAPAGOS]: [ Moves.MOONBLAST, Moves.RECOVER, Moves.ICE_BEAM, Moves.SHELL_SMASH ], + [Species.TERAPAGOS]: [ Moves.MOONBLAST, Moves.NASTY_PLOT, Moves.ASTRAL_BARRAGE, Moves.RECOVER ], [Species.PECHARUNT]: [ Moves.TAKE_HEART, Moves.BODY_PRESS, Moves.SAPPY_SEED, Moves.ASTRAL_BARRAGE ], [Species.PALDEA_TAUROS]: [ Moves.NO_RETREAT, Moves.BLAZING_TORQUE, Moves.AQUA_STEP, Moves.THUNDEROUS_KICK ], [Species.PALDEA_WOOPER]: [ Moves.STONE_AXE, Moves.RECOVER, Moves.BANEFUL_BUNKER, Moves.BARB_BARRAGE ], diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index df347909d49..c613be0137b 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -555,7 +555,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.FLUTTER_MANE]: { 0: Abilities.DAZZLING }, [Species.SLITHER_WING]: { 0: Abilities.SCRAPPY }, [Species.SANDY_SHOCKS]: { 0: Abilities.ELECTRIC_SURGE }, - [Species.IRON_TREADS]: { 0: Abilities.STEELY_SPIRIT }, + [Species.IRON_TREADS]: { 0: Abilities.DAUNTLESS_SHIELD }, [Species.IRON_BUNDLE]: { 0: Abilities.SNOW_WARNING }, [Species.IRON_HANDS]: { 0: Abilities.IRON_FIST }, [Species.IRON_JUGULIS]: { 0: Abilities.LIGHTNING_ROD }, @@ -567,7 +567,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.CHIEN_PAO]: { 0: Abilities.INTIMIDATE }, [Species.TING_LU]: { 0: Abilities.STAMINA }, [Species.CHI_YU]: { 0: Abilities.BERSERK }, - [Species.ROARING_MOON]: { 0: Abilities.TOUGH_CLAWS }, + [Species.ROARING_MOON]: { 0: Abilities.INTIMIDATE }, [Species.IRON_VALIANT]: { 0: Abilities.NEUROFORCE }, [Species.KORAIDON]: { 0: Abilities.OPPORTUNIST }, [Species.MIRAIDON]: { 0: Abilities.OPPORTUNIST }, @@ -582,7 +582,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.RAGING_BOLT]: { 0: Abilities.BEAST_BOOST }, [Species.IRON_BOULDER]: { 0: Abilities.SHARPNESS }, [Species.IRON_CROWN]: { 0: Abilities.SHARPNESS }, - [Species.TERAPAGOS]: { 0: Abilities.SOUL_HEART }, + [Species.TERAPAGOS]: { 0: Abilities.SHIELD_DUST }, [Species.PECHARUNT]: { 0: Abilities.TOXIC_CHAIN }, [Species.PALDEA_TAUROS]: { 0: Abilities.ADAPTABILITY }, [Species.PALDEA_WOOPER]: { 0: Abilities.THICK_FAT }, diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts index dcf0766d005..10263f895b3 100644 --- a/src/data/balance/starters.ts +++ b/src/data/balance/starters.ts @@ -290,7 +290,7 @@ export const speciesStarterCosts = { [Species.SHAYMIN]: 6, [Species.ARCEUS]: 9, - [Species.VICTINI]: 7, + [Species.VICTINI]: 6, [Species.SNIVY]: 3, [Species.TEPIG]: 3, [Species.OSHAWOTT]: 3, @@ -611,7 +611,7 @@ export const speciesStarterCosts = { [Species.RAGING_BOLT]: 7, [Species.IRON_BOULDER]: 7, [Species.IRON_CROWN]: 7, - [Species.TERAPAGOS]: 8, + [Species.TERAPAGOS]: 9, [Species.PECHARUNT]: 6, [Species.PALDEA_TAUROS]: 5, [Species.PALDEA_WOOPER]: 3, diff --git a/test/mystery-encounter/mystery-encounter-utils.test.ts b/test/mystery-encounter/mystery-encounter-utils.test.ts index dacfb5cc96e..6b467b9fa81 100644 --- a/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -223,14 +223,14 @@ describe("Mystery Encounter Utils", () => { }); it("excludes species from search", () => { - // Only 9 tiers are: Koraidon, Miraidon, Arceus, Rayquaza, Kyogre, Groudon, Zacian - const result = getRandomSpeciesByStarterCost(9, [ Species.KORAIDON, Species.MIRAIDON, Species.ARCEUS, Species.RAYQUAZA, Species.KYOGRE, Species.GROUDON ]); + // Only 9 tiers are: Kyogre, Groudon, Rayquaza, Arceus, Zacian, Koraidon, Miraidon, Terapagos + const result = getRandomSpeciesByStarterCost(9, [ Species.KYOGRE, Species.GROUDON, Species.RAYQUAZA, Species.ARCEUS, Species.KORAIDON, Species.MIRAIDON, Species.TERAPAGOS ]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.ZACIAN); }); it("gets species of specified types", () => { - // Only 9 tiers are: Koraidon, Miraidon, Arceus, Rayquaza, Kyogre, Groudon, Zacian + // Only 9 tiers are: Kyogre, Groudon, Rayquaza, Arceus, Zacian, Koraidon, Miraidon, Terapagos const result = getRandomSpeciesByStarterCost(9, undefined, [ Type.GROUND ]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.GROUDON); From b9a853ed2e61c7dddfb786e2b7249e81ca481422 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Tue, 25 Feb 2025 21:48:44 -0800 Subject: [PATCH 43/83] [Bug] Fix canApplyAbility check but for real this time (#5418) * Move canApplyAbility check * Fix suppressed abilities not activated properly * Move canApplyAbility to applySingleAbAttrs --------- Co-authored-by: damocleas --- src/data/ability.ts | 12 +++++++----- src/data/arena-tag.ts | 7 +++++++ src/field/pokemon.ts | 4 ++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 5f19af8cea4..dcbaa4026f4 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -5152,6 +5152,10 @@ function applySingleAbAttrs( showAbilityInstant: boolean = false, messages: string[] = [] ) { + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { + return; + } + const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); if (gainedMidTurn && ability.getAttrs(attrType).some(attr => attr instanceof PostSummonAbAttr && !attr.shouldActivateOnGain())) { return; @@ -5445,12 +5449,10 @@ function applyAbAttrsInternal( gainedMidTurn: boolean = false ) { for (const passive of [ false, true ]) { - if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { - continue; + if (pokemon) { + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); + globalScene.clearPhaseQueueSplice(); } - - applySingleAbAttrs(pokemon, passive, attrType, applyFunc, args, gainedMidTurn, simulated, showAbilityInstant, messages); - globalScene.clearPhaseQueueSplice(); } } diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index d034ccf83b8..580ede9596c 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1230,10 +1230,12 @@ export class FairyLockTag extends ArenaTag { */ export class SuppressAbilitiesTag extends ArenaTag { private sourceCount: number; + private beingRemoved: boolean; constructor(sourceId: number) { super(ArenaTagType.NEUTRALIZING_GAS, 0, undefined, sourceId); this.sourceCount = 1; + this.beingRemoved = false; } public override onAdd(arena: Arena): void { @@ -1267,6 +1269,7 @@ export class SuppressAbilitiesTag extends ArenaTag { } public override onRemove(arena: Arena, quiet: boolean = false) { + this.beingRemoved = true; if (!quiet) { globalScene.queueMessage(i18next.t("arenaTag:neutralizingGasOnRemove")); } @@ -1282,6 +1285,10 @@ export class SuppressAbilitiesTag extends ArenaTag { public shouldApplyToSelf(): boolean { return this.sourceCount > 1; } + + public isBeingRemoved() { + return this.beingRemoved; + } } // TODO: swap `sourceMove` and `sourceId` and make `sourceMove` an optional parameter diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index bc3b9b1403f..f0486a8f111 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1501,8 +1501,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * Suppresses an ability and calls its onlose attributes */ public suppressAbility() { - this.summonData.abilitySuppressed = true; [ true, false ].forEach((passive) => applyOnLoseAbAttrs(this, passive)); + this.summonData.abilitySuppressed = true; } /** @@ -1563,7 +1563,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } const suppressAbilitiesTag = arena.getTag(ArenaTagType.NEUTRALIZING_GAS) as SuppressAbilitiesTag; - if (this.isOnField() && suppressAbilitiesTag) { + if (this.isOnField() && suppressAbilitiesTag && !suppressAbilitiesTag.isBeingRemoved()) { const thisAbilitySuppressing = ability.hasAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr); const hasSuppressingAbility = this.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false); // Neutralizing gas is up - suppress abilities unless they are unsuppressable or this pokemon is responsible for the gas From 6e8a4b287c228d6978ce67a461929105c18d0327 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Wed, 26 Feb 2025 07:05:39 +0100 Subject: [PATCH 44/83] [UI/UX] Pressing B on filter bar resets filters (#5404) * Make dropdown update selection when reset to default * Function to resect selection in filter bar * Pressing B on filter now closes it or resets instead of going to top of starters * Filter changes to starter select screen * Method to get column at a given index in filter bar * Specific reset behavior for caught filter in starter select menu * Apply suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/ui/starter-select-ui-handler.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: damocleas Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> --- src/ui/dropdown.ts | 2 ++ src/ui/filter-bar.ts | 14 ++++++++++++++ src/ui/pokedex-ui-handler.ts | 13 ++++--------- src/ui/starter-select-ui-handler.ts | 29 ++++++++++++++++++----------- 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index 718058c7f99..ec433a35733 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -629,6 +629,8 @@ export class DropDown extends Phaser.GameObjects.Container { } } } + + this.onChange(); } } diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index 1eba81247d4..8ef910f954a 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -86,6 +86,15 @@ export class FilterBar extends Phaser.GameObjects.Container { return this.dropDowns[this.columns.indexOf(col)]; } + /** + * Get the DropDownColumn associated to a given index + * @param index the index of the column to retrieve + * @returns the associated DropDownColumn if it exists, undefined otherwise + */ + public getColumn(index: number): DropDownColumn { + return this.columns[index]; + } + /** * Highlight the labels of the FilterBar if the filters are different from their default values */ @@ -185,6 +194,11 @@ export class FilterBar extends Phaser.GameObjects.Container { return this.getFilter(col).getVals(); } + public resetSelection(col: DropDownColumn): void { + this.dropDowns[col].resetToDefault(); + this.updateFilterLabels(); + } + setValsToDefault(): void { for (const dropDown of this.dropDowns) { dropDown.resetToDefault(); diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index b3655d80fa1..a18f138e4f7 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -898,16 +898,11 @@ export default class PokedexUiHandler extends MessageUiHandler { if (this.filterMode && this.filterBar.openDropDown) { // CANCEL with a filter menu open > close it this.filterBar.toggleDropDown(this.filterBarCursor); - - // if there are possible pokemon go the first one of the list - if (numberOfStarters > 0) { - this.setFilterMode(false); - this.scrollCursor = 0; - this.updateScroll(); - this.setCursor(0); - } success = true; - + } else if (this.filterMode && !this.filterBar.getFilter(this.filterBarCursor).hasDefaultValues()) { + this.filterBar.resetSelection(this.filterBarCursor); + this.updateStarters(); + success = true; } else if (this.filterTextMode && !(this.filterText.getValue(this.filterTextCursor) === this.filterText.defaultText)) { this.filterText.resetSelection(this.filterTextCursor); success = true; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 80a2baf7f55..771554f18de 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1080,10 +1080,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { /** * Set the selections for all filters to their default starting value */ - resetFilters() : void { + public resetFilters(): void { + this.filterBar.setValsToDefault(); + this.resetCaughtDropdown(); + } + + /** + * Set default value for the caught dropdown, which only shows caught mons + */ + public resetCaughtDropdown(): void { const caughtDropDown: DropDown = this.filterBar.getFilter(DropDownColumn.CAUGHT); - this.filterBar.setValsToDefault(); + caughtDropDown.resetToDefault(); // initial setting, in caught filter, select the options excluding the uncaught option for (let i = 0; i < caughtDropDown.options.length; i++) { @@ -1323,16 +1331,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.filterMode && this.filterBar.openDropDown) { // CANCEL with a filter menu open > close it this.filterBar.toggleDropDown(this.filterBarCursor); - - // if there are possible starters go the first one of the list - if (numberOfStarters > 0) { - this.setFilterMode(false); - this.scrollCursor = 0; - this.updateScroll(); - this.setCursor(0); - } success = true; - + } else if (this.filterMode && !this.filterBar.getFilter(this.filterBar.getColumn(this.filterBarCursor)).hasDefaultValues()) { + if (this.filterBar.getColumn(this.filterBarCursor) === DropDownColumn.CAUGHT) { + this.resetCaughtDropdown(); + } else { + this.filterBar.resetSelection(this.filterBarCursor); + } + this.updateStarters(); + success = true; } else if (this.statsMode) { this.toggleStatsMode(false); success = true; From 883bf45bc02009c1bbfa02fa25cb3b1c6f4c3819 Mon Sep 17 00:00:00 2001 From: Esca Date: Wed, 26 Feb 2025 09:45:29 +0100 Subject: [PATCH 45/83] [Bug][Move] Shed Tail now rounds incurred damage up, not down (#5219) * Shed Tail rounds incurred damage up * Altered Substitute/Shed Tail success condition to account for rounding up * Altered the test to match correct functionality * Update src/data/move.ts Removed default value in constructor due to it having become redundant Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> --- src/data/move.ts | 14 +++++++++----- test/moves/shed_tail.test.ts | 7 ++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 26b182ec5db..18f4b220911 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1866,11 +1866,14 @@ export class HalfSacrificialAttr extends MoveEffectAttr { export class AddSubstituteAttr extends MoveEffectAttr { /** The ratio of the user's max HP that is required to apply this effect */ private hpCost: number; + /** Whether the damage taken should be rounded up (Shed Tail rounds up) */ + private roundUp: boolean; - constructor(hpCost: number = 0.25) { + constructor(hpCost: number, roundUp: boolean) { super(true); this.hpCost = hpCost; + this.roundUp = roundUp; } /** @@ -1886,7 +1889,8 @@ export class AddSubstituteAttr extends MoveEffectAttr { return false; } - user.damageAndUpdate(Math.floor(user.getMaxHp() * this.hpCost), HitResult.OTHER, false, true, true); + const damageTaken = this.roundUp ? Math.ceil(user.getMaxHp() * this.hpCost) : Math.floor(user.getMaxHp() * this.hpCost); + user.damageAndUpdate(damageTaken, HitResult.OTHER, false, true, true); user.addTag(BattlerTagType.SUBSTITUTE, 0, move.id, user.id); return true; } @@ -1899,7 +1903,7 @@ export class AddSubstituteAttr extends MoveEffectAttr { } getCondition(): MoveConditionFunc { - return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > Math.floor(user.getMaxHp() * this.hpCost) && user.getMaxHp() > 1; + return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > (this.roundUp ? Math.ceil(user.getMaxHp() * this.hpCost) : Math.floor(user.getMaxHp() * this.hpCost)) && user.getMaxHp() > 1; } /** @@ -9036,7 +9040,7 @@ export function initMoves() { .attr(HighCritAttr) .slicingMove(), new SelfStatusMove(Moves.SUBSTITUTE, Type.NORMAL, -1, 10, -1, 0, 1) - .attr(AddSubstituteAttr), + .attr(AddSubstituteAttr, 0.25, false), new AttackMove(Moves.STRUGGLE, Type.NORMAL, MoveCategory.PHYSICAL, 50, -1, 1, -1, 0, 1) .attr(RecoilAttr, true, 0.25, true) .attr(TypelessAttr) @@ -11382,7 +11386,7 @@ export function initMoves() { .attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2 ? 5461 / 4096 : 1) .makesContact(), new SelfStatusMove(Moves.SHED_TAIL, Type.NORMAL, -1, 10, -1, 0, 9) - .attr(AddSubstituteAttr, 0.5) + .attr(AddSubstituteAttr, 0.5, true) .attr(ForceSwitchOutAttr, true, SwitchType.SHED_TAIL) .condition(failIfLastInPartyCondition), new SelfStatusMove(Moves.CHILLY_RECEPTION, Type.ICE, -1, 10, -1, 0, 9) diff --git a/test/moves/shed_tail.test.ts b/test/moves/shed_tail.test.ts index 37f046ba2fa..be746aacd78 100644 --- a/test/moves/shed_tail.test.ts +++ b/test/moves/shed_tail.test.ts @@ -46,11 +46,8 @@ describe("Moves - Shed Tail", () => { expect(feebas).not.toBe(magikarp); expect(feebas.hp).toBe(feebas.getMaxHp()); - // Note: Shed Tail's HP cost is currently not accurate to mainline, as it - // should cost ceil(maxHP / 2) instead of max(floor(maxHp / 2), 1). The current - // implementation is consistent with Substitute's HP cost logic, but that's not - // the case in mainline for some reason :regiDespair:. - expect(magikarp.hp).toBe(Math.ceil(magikarp.getMaxHp() / 2)); + // Note: Altered the test to be consistent with the correct HP cost :yipeevee_static: + expect(magikarp.hp).toBe(Math.floor(magikarp.getMaxHp() / 2)); expect(substituteTag).toBeDefined(); expect(substituteTag?.hp).toBe(Math.floor(magikarp.getMaxHp() / 4)); }); From 71f644c453d2c73ce384900bc4885ff945f7538c Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Thu, 27 Feb 2025 04:03:22 +1100 Subject: [PATCH 46/83] [UI] Tera type on summary screen (#5419) --- src/ui/summary-ui-handler.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index b952037a079..31dee6bb46c 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -28,6 +28,7 @@ import { modifierSortFunc } from "#app/modifier/modifier"; import { PlayerGender } from "#enums/player-gender"; import { Stat, PERMANENT_STATS, getStatKey } from "#enums/stat"; import { Nature } from "#enums/nature"; +import { achvs } from "#app/system/achv"; enum Page { PROFILE, @@ -783,9 +784,6 @@ export default class SummaryUiHandler extends UiHandler { if (types.length > 1) { profileContainer.add(getTypeIcon(1, types[1])); } - if (this.pokemon?.isTerastallized) { - profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); - } if (this.pokemon?.getLuck()) { const luckLabelText = addTextObject(141, 28, i18next.t("common:luckIndicator"), TextStyle.SUMMARY_ALT); @@ -798,6 +796,13 @@ export default class SummaryUiHandler extends UiHandler { profileContainer.add(luckText); } + if (globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(this.pokemon)) { + const teraIcon = globalScene.add.sprite(123, 26, "button_tera"); + teraIcon.setName("terrastallize-icon"); + teraIcon.setFrame(Type[this.pokemon.getTeraType()].toLowerCase()); + profileContainer.add(teraIcon); + } + this.abilityContainer = { labelImage: globalScene.add.image(0, 0, "summary_profile_ability"), ability: this.pokemon?.getAbility(true)!, // TODO: is this bang correct? From 85f8c59036b9c7f0791fb4859d5746c7b648ff8c Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Wed, 26 Feb 2025 14:11:46 -0500 Subject: [PATCH 47/83] [Balance] Paldean Gym Leader, E4, and other Tera-related trainer adjustments #5367 --- src/data/trainer-config.ts | 281 +++++++++++++++++++------------------ src/field/trainer.ts | 11 +- 2 files changed, 152 insertions(+), 140 deletions(-) diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 1b646fc6478..b7d99ad7ef3 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -26,6 +26,9 @@ import { Gender } from "#app/data/gender"; /** Minimum BST for Pokemon generated onto the Elite Four's teams */ const ELITE_FOUR_MINIMUM_BST = 460; +/** The wave at which (non-Paldean) Gym Leaders start having Tera mons*/ +const GYM_LEADER_TERA_WAVE = 100; + export enum TrainerPoolTier { COMMON, UNCOMMON, @@ -211,8 +214,8 @@ export class TrainerAI { } /** - * Sets a pokemon on this AI to just instantly tera on first move used - * @param index The index of the pokemon to instantly 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; @@ -251,7 +254,7 @@ export class TrainerConfig { public partyMemberFuncs: PartyMemberFuncs = {}; public speciesPools: TrainerTierPools; public speciesFilter: PokemonSpeciesFilter; - public specialtyTypes: Type[] = []; + public specialtyType: Type; public hasVoucher: boolean = false; public trainerAI: TrainerAI; @@ -583,8 +586,8 @@ export class TrainerConfig { return this; } - setSpecialtyTypes(...specialtyTypes: Type[]): TrainerConfig { - this.specialtyTypes = specialtyTypes; + setSpecialtyType(specialtyType: Type): TrainerConfig { + this.specialtyType = specialtyType; return this; } @@ -594,18 +597,22 @@ export class TrainerConfig { } /** - * 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 + * Sets random pokemon from the trainer's team to instant tera. Also sets Tera type to specialty type and checks for Shedinja as appropriate. + * @param count A callback (yucky) to see how many teras should be used + * @param slot Optional, a specified slot that should be terastallized. Wraps to match party size (-1 will get the last slot and so on). * @returns this */ - setRandomTeraModifiers(count: () => integer): TrainerConfig { + setRandomTeraModifiers(count: () => number, slot?: number): TrainerConfig { this.genAIFuncs.push((party: EnemyPokemon[]) => { - const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); + const shedinjaCanTera = !this.hasSpecialtyType() || this.specialtyType === Type.BUG; // Better to check one time than 6 + const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i) + .filter(i => shedinjaCanTera || party[i].species.speciesId !== Species.SHEDINJA); // Shedinja can only Tera on Bug specialty type (or no specialty type) + const setPartySlot = !Utils.isNullOrUndefined(slot) ? Phaser.Math.Wrap(slot, 0, party.length - 1) : -1; // If we have a tera slot defined, wrap it to party size. for (let t = 0; t < Math.min(count(), party.length); t++) { - const randomIndex = Utils.randSeedItem(partyMemberIndexes); + const randomIndex = partyMemberIndexes.indexOf(setPartySlot) > -1 ? setPartySlot : Utils.randSeedItem(partyMemberIndexes); partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); - if (this.specialtyTypes?.length) { - party[randomIndex].teraType = Utils.randSeedItem(this.specialtyTypes); + if (this.hasSpecialtyType()) { + party[randomIndex].teraType = this.specialtyType; } this.trainerAI.setInstantTera(randomIndex); } @@ -614,8 +621,8 @@ export class TrainerConfig { } /** - * Sets a specific pokemon to instant tera - * @param index The index within the team to have instant tera + * Sets a specific pokemon to instantly Tera + * @param index The index within the team to have instant Tera. * @returns this */ setInstantTera(index: number): TrainerConfig { @@ -779,12 +786,18 @@ export class TrainerConfig { * @param title The title of the evil team admin. * @param poolName The evil team the admin belongs to. * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. + * @param specialtyType The specialty Type of the admin, if they have one * @returns {TrainerConfig} The updated TrainerConfig instance. * **/ - initForEvilTeamAdmin(title: string, poolName: string, signatureSpecies: (Species | Species[])[],): TrainerConfig { + initForEvilTeamAdmin(title: string, poolName: string, signatureSpecies: (Species | Species[])[], specialtyType?: Type): TrainerConfig { if (!getIsInitialized()) { initI18n(); } + + if (!Utils.isNullOrUndefined(specialtyType)) { + this.setSpecialtyType(specialtyType); + } + this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); // Set the species pools for the evil team admin. @@ -812,28 +825,16 @@ export class TrainerConfig { /** * Initializes the trainer configuration for a Stat Trainer, as part of the Trainer's Test Mystery Encounter. - * @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member. - * @param {Type[]} specialtyTypes The specialty types for the Stat Trainer. - * @param isMale Whether the Elite Four Member is Male or Female (for localization of the title). + * @param isMale Whether the stat trainer is Male or Female (for localization of the title). * @returns {TrainerConfig} The updated TrainerConfig instance. **/ - initForStatTrainer(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig { + initForStatTrainer(isMale: boolean = false): TrainerConfig { if (!getIsInitialized()) { initI18n(); } this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR); - signatureSpecies.forEach((speciesPool, s) => { - if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; - } - this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); - }); - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); - this.setSpecialtyTypes(...specialtyTypes); - } const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); this.setMoneyMultiplier(2); @@ -850,11 +851,11 @@ export class TrainerConfig { /** * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. - * @param {Type[]} specialtyTypes The specialty types for the evil team Leader. + * @param {Type} specialtyType The specialty type for the evil team Leader. * @param boolean Whether or not this is the rematch fight * @returns {TrainerConfig} The updated TrainerConfig instance. * **/ - initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, ...specialtyTypes: Type[]): TrainerConfig { + initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, specialtyType?: Type): TrainerConfig { if (!getIsInitialized()) { initI18n(); } @@ -869,9 +870,9 @@ export class TrainerConfig { } this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); - this.setSpecialtyTypes(...specialtyTypes); + if (!Utils.isNullOrUndefined(specialtyType)) { + this.setSpeciesFilter(p => p.isOfType(specialtyType)); + this.setSpecialtyType(specialtyType); } const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); @@ -888,12 +889,14 @@ export class TrainerConfig { /** * Initializes the trainer configuration for a Gym Leader. - * @param {Species | Species[]} signatureSpecies The signature species for the Gym Leader. - * @param {Type[]} specialtyTypes The specialty types for the Gym Leader. + * @param {Species | Species[]} signatureSpecies The signature species for the Gym Leader. Added to party in reverse order. * @param isMale Whether the Gym Leader is Male or Not (for localization of the title). + * @param {Type} specialtyType The specialty type for the Gym Leader. + * @param ignoreMinTeraWave Whether the Gym Leader always uses Tera (true), or only Teras after {@linkcode GYM_LEADER_TERA_WAVE} (false). Defaults to false. + * @param teraSlot Optional, sets the party member in this slot to Terastallize. Wraps based on party size. * @returns {TrainerConfig} The updated TrainerConfig instance. * **/ - initForGymLeader(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig { + initForGymLeader(signatureSpecies: (Species | Species[])[], isMale: boolean, specialtyType: Type, ignoreMinTeraWave: boolean = false, teraSlot?: number): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -912,11 +915,9 @@ export class TrainerConfig { this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); - // If specialty types are provided, set species filter and specialty types. - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); - this.setSpecialtyTypes(...specialtyTypes); - } + // If specialty type is provided, set species filter and specialty type. + this.setSpeciesFilter(p => p.isOfType(specialtyType)); + this.setSpecialtyType(specialtyType); // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); @@ -935,7 +936,7 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_gym"); this.setVictoryBgm("victory_gym"); - this.setRandomTeraModifiers(() => globalScene.currentBattle.waveIndex >= 100 ? 1 : 0); + this.setRandomTeraModifiers(() => (ignoreMinTeraWave || globalScene.currentBattle.waveIndex >= GYM_LEADER_TERA_WAVE) ? 1 : 0, teraSlot); return this; } @@ -943,11 +944,12 @@ export class TrainerConfig { /** * Initializes the trainer configuration for an Elite Four member. * @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member. - * @param {Type[]} specialtyTypes The specialty types for the Elite Four member. * @param isMale Whether the Elite Four Member is Male or Female (for localization of the title). + * @param specialtyType {Type} The specialty type for the Elite Four member. + * @param teraSlot Optional, sets the party member in this slot to Terastallize. * @returns {TrainerConfig} The updated TrainerConfig instance. **/ - initForEliteFour(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig { + initForEliteFour(signatureSpecies: (Species | Species[])[], isMale: boolean, specialtyType?: Type, teraSlot?: number): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -966,10 +968,10 @@ export class TrainerConfig { this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); - // Set species filter and specialty types if provided, otherwise filter by base total. - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.some(t => p.isOfType(t)) && p.baseTotal >= ELITE_FOUR_MINIMUM_BST); - this.setSpecialtyTypes(...specialtyTypes); + // Set species filter and specialty type if provided, otherwise filter by base total. + if (!Utils.isNullOrUndefined(specialtyType)) { + this.setSpeciesFilter(p => p.isOfType(specialtyType) && p.baseTotal >= ELITE_FOUR_MINIMUM_BST); + this.setSpecialtyType(specialtyType); } else { this.setSpeciesFilter(p => p.baseTotal >= ELITE_FOUR_MINIMUM_BST); } @@ -991,7 +993,7 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_elite"); this.setVictoryBgm("victory_gym"); - this.setRandomTeraModifiers(() => 1); + this.setRandomTeraModifiers(() => 1, teraSlot); return this; } @@ -1142,6 +1144,14 @@ export class TrainerConfig { }); } + /** + * Helper function to check if a specialty type is set + * @returns true if specialtyType is defined and not Type.UNKNOWN + */ + hasSpecialtyType(): boolean { + return !Utils.isNullOrUndefined(this.specialtyType) && this.specialtyType !== Type.UNKNOWN; + } + /** * Creates a shallow copy of a trainer config so that it can be modified without affecting the {@link trainerConfigs} source map */ @@ -1183,9 +1193,7 @@ export class TrainerConfig { clone = this.speciesPools ? clone.setSpeciesPools(this.speciesPools) : clone; clone = this.speciesFilter ? clone.setSpeciesFilter(this.speciesFilter) : clone; - if (this.specialtyTypes) { - clone.specialtyTypes = this.specialtyTypes.slice(0); - } + clone.specialtyType = this.specialtyType; clone.encounterMessages = this.encounterMessages?.slice(0); clone.victoryMessages = this.victoryMessages?.slice(0); @@ -1352,28 +1360,28 @@ export const signatureSpecies: SignatureSpecies = { PIERS: [ Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY ], MARNIE: [ Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO ], RAIHAN: [ Species.DURALUDON, Species.TURTONATOR, Species.GOOMY ], - KATY: [ Species.NYMBLE, Species.TAROUNTULA, Species.HERACROSS ], - BRASSIUS: [ Species.SMOLIV, Species.SHROOMISH, Species.ODDISH ], - IONO: [ Species.TADBULB, Species.WATTREL, Species.VOLTORB ], - KOFU: [ Species.VELUZA, Species.WIGLETT, Species.WINGULL ], - LARRY: [ Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA ], - RYME: [ Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU ], - TULIP: [ Species.GIRAFARIG, Species.FLITTLE, Species.RALTS ], - GRUSHA: [ Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO ], - LORELEI: [ Species.JYNX, [ Species.SLOWBRO, Species.GALAR_SLOWBRO ], Species.LAPRAS, [ Species.ALOLA_SANDSLASH, Species.CLOYSTER ]], - BRUNO: [ Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [ Species.ALOLA_GOLEM, Species.GOLEM ]], + KATY: [ Species.TEDDIURSA, Species.NYMBLE, Species.TAROUNTULA ], // Tera Bug Teddiursa + BRASSIUS: [ Species.SUDOWOODO, Species.BRAMBLIN, Species.SMOLIV ], // Tera Grass Sudowoodo + IONO: [ Species.MISDREAVUS, Species.TADBULB, Species.WATTREL ], // Tera Ghost Misdreavus + KOFU: [ Species.CRABRAWLER, Species.VELUZA, Species.WIGLETT, Species.WINGULL ], // Tera Water Crabrawler + LARRY: [ Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA ], // Tera Normal Starly + RYME: [ Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU ], // Tera Ghost Toxel + TULIP: [ Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG ], // Tera Psychic Flabebe + GRUSHA: [ Species.SWABLU, Species.CETODDLE, Species.CUBCHOO, Species.ALOLA_VULPIX ], // Tera Ice Swablu + LORELEI: [ Species.JYNX, [ Species.SLOWBRO, Species.GALAR_SLOWBRO ], Species.LAPRAS, [ Species.CLOYSTER, Species.ALOLA_SANDSLASH ]], + BRUNO: [ Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [ Species.GOLEM, Species.ALOLA_GOLEM ]], AGATHA: [ Species.GENGAR, [ Species.ARBOK, Species.WEEZING ], Species.CROBAT, Species.ALOLA_MAROWAK ], LANCE: [ Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR ], WILL: [ Species.XATU, Species.JYNX, [ Species.SLOWBRO, Species.SLOWKING ], Species.EXEGGUTOR ], - KOGA: [[ Species.WEEZING, Species.MUK ], [ Species.VENOMOTH, Species.ARIADOS ], Species.CROBAT, Species.TENTACRUEL ], + KOGA: [[ Species.MUK, Species.WEEZING ], [ Species.VENOMOTH, Species.ARIADOS ], Species.CROBAT, Species.TENTACRUEL ], KAREN: [ Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE ], SIDNEY: [[ Species.SHIFTRY, Species.CACTURNE ], [ Species.SHARPEDO, Species.CRAWDAUNT ], Species.ABSOL, Species.MIGHTYENA ], - PHOEBE: [ Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [ Species.MISMAGIUS, Species.DRIFBLIM ]], + PHOEBE: [ Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [ Species.DRIFBLIM, Species.MISMAGIUS ]], GLACIA: [ Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW ], DRAKE: [ Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA ], AARON: [[ Species.SCIZOR, Species.KLEAVOR ], Species.HERACROSS, [ Species.VESPIQUEN, Species.YANMEGA ], Species.DRAPION ], BERTHA: [ Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR ], - FLINT: [[ Species.FLAREON, Species.RAPIDASH ], Species.MAGMORTAR, [ Species.STEELIX, Species.LOPUNNY ], Species.INFERNAPE ], + FLINT: [[ Species.RAPIDASH, Species.FLAREON ], Species.MAGMORTAR, [ Species.STEELIX, Species.LOPUNNY ], Species.INFERNAPE ], // Tera Fire Steelix or Lopunny LUCIAN: [ Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [ Species.ALAKAZAM, Species.ESPEON ]], SHAUNTAL: [ Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT ], MARSHAL: [ Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK ], @@ -1389,18 +1397,18 @@ export const signatureSpecies: SignatureSpecies = { ACEROLA: [[ Species.BANETTE, Species.DRIFBLIM ], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND ], KAHILI: [[ Species.BRAVIARY, Species.MANDIBUZZ ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON ], MARNIE_ELITE: [ Species.MORPEKO, Species.LIEPARD, [ Species.TOXICROAK, Species.SCRAFTY ], Species.GRIMMSNARL ], - NESSA_ELITE: [ Species.GOLISOPOD, [ Species.PELIPPER, Species.QUAGSIRE ], Species.TOXAPEX, Species.DREDNAW ], + NESSA_ELITE: [ Species.GOLISOPOD, [ Species.QUAGSIRE, Species.PELIPPER ], Species.TOXAPEX, Species.DREDNAW ], BEA_ELITE: [ Species.HAWLUCHA, [ Species.GRAPPLOCT, Species.SIRFETCHD ], Species.FALINKS, Species.MACHAMP ], ALLISTER_ELITE: [ Species.DUSKNOIR, [ Species.POLTEAGEIST, Species.RUNERIGUS ], Species.CURSOLA, Species.GENGAR ], RAIHAN_ELITE: [ Species.GOODRA, [ Species.TORKOAL, Species.TURTONATOR ], Species.FLYGON, Species.ARCHALUDON ], - RIKA: [ Species.WHISCASH, [ Species.DONPHAN, Species.DUGTRIO ], Species.CAMERUPT, Species.CLODSIRE ], - POPPY: [ Species.COPPERAJAH, Species.BRONZONG, Species.CORVIKNIGHT, Species.TINKATON ], - LARRY_ELITE: [ Species.STARAPTOR, Species.FLAMIGO, Species.ALTARIA, Species.TROPIUS ], - HASSEL: [ Species.NOIVERN, [ Species.FLAPPLE, Species.APPLETUN ], Species.DRAGALGE, Species.BAXCALIBUR ], - CRISPIN: [ Species.TALONFLAME, Species.CAMERUPT, Species.MAGMORTAR, Species.BLAZIKEN ], - AMARYS: [ Species.SKARMORY, Species.EMPOLEON, Species.SCIZOR, Species.METAGROSS ], - LACEY: [ Species.EXCADRILL, Species.PRIMARINA, [ Species.ALCREMIE, Species.GRANBULL ], Species.WHIMSICOTT ], - DRAYTON: [ Species.DRAGONITE, Species.ARCHALUDON, Species.HAXORUS, Species.SCEPTILE ], + RIKA: [ Species.CLODSIRE, [ Species.DUGTRIO, Species.DONPHAN ], Species.CAMERUPT, Species.WHISCASH ], // Tera Ground Clodsire + POPPY: [ Species.TINKATON, Species.BRONZONG, Species.CORVIKNIGHT, Species.COPPERAJAH ], // Tera Steel Tinkaton + LARRY_ELITE: [ Species.FLAMIGO, Species.STARAPTOR, [ Species.ALTARIA, Species.TROPIUS ], Species.ORICORIO ], // Tera Flying Flamigo; random Oricorio + HASSEL: [ Species.BAXCALIBUR, [ Species.FLAPPLE, Species.APPLETUN ], Species.DRAGALGE, Species.NOIVERN ], // Tera Dragon Baxcalibur + CRISPIN: [ Species.BLAZIKEN, Species.MAGMORTAR, [ Species.CAMERUPT, Species.TALONFLAME ], Species.ROTOM ], // Tera Fire Blaziken; Heat Rotom + AMARYS: [ Species.METAGROSS, Species.SCIZOR, Species.EMPOLEON, Species.SKARMORY ], // Tera Steel Metagross + LACEY: [ Species.EXCADRILL, Species.PRIMARINA, [ Species.WHIMSICOTT, Species.ALCREMIE ], Species.GRANBULL ], // Tera Fairy Excadrill + DRAYTON: [ Species.ARCHALUDON, Species.DRAGONITE, Species.HAXORUS, Species.SCEPTILE ], // Tera Dragon Archaludon }; export const trainerConfigs: TrainerConfigs = { @@ -1421,7 +1429,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(Type.GRASS) || s.isOfType(Type.FIRE)), [TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY), [TrainerType.BIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON)), - [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.FIGHTING) + [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyType(Type.FIGHTING) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_STRONG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_AVG_ONE_STRONG) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR ], @@ -1461,7 +1469,7 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.HEAL_PULSE)), [TrainerType.FIREBREATHER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK) .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SMOG) || s.isOfType(Type.FIRE)), - [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyTypes(Type.WATER) + [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyType(Type.WATER) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.THREE_WEAK_SAME, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.SIX_WEAKER) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA ], @@ -1469,7 +1477,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA ], [TrainerPoolTier.SUPER_RARE]: [ Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO ] }), - [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.ELECTRIC).setSpeciesFilter(s => s.isOfType(Type.ELECTRIC)), + [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyType(Type.ELECTRIC).setSpeciesFilter(s => s.isOfType(Type.ELECTRIC)), [TrainerType.HARLEQUIN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.PSYCHIC).setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1), [TrainerType.HIKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.BACKPACKER) .setPartyTemplates(trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.ONE_STRONG) @@ -1548,7 +1556,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.TANGELA, Species.EEVEE, Species.YANMA ], [TrainerPoolTier.SUPER_RARE]: [ Species.TADBULB ] }), - [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyTypes(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)), + [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyType(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)), [TrainerType.TWINS]: new TrainerConfig(++t).setDoubleOnly().setMoneyMultiplier(0.65).setUseSameSeedForAllMembers() .setPartyTemplateFunc(() => getWavePartyTemplate(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_STRONG)) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE ])) @@ -1654,27 +1662,27 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.MANKEY, Species.PAWNIARD, Species.CHARCADET, Species.FLITTLE, Species.VAROOM, Species.ORTHWORM ], [TrainerPoolTier.SUPER_RARE]: [ Species.DONDOZO, Species.GIMMIGHOUL ] }), - [TrainerType.GIACOMO]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_1", [ Species.KINGAMBIT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.GIACOMO]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_1", [ Species.KINGAMBIT ], Type.DARK).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // Segin Starmobile p.moveset = [ new PokemonMove(Moves.WICKED_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.MELA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_2", [ Species.ARMAROUGE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.MELA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_2", [ Species.ARMAROUGE ], Type.FIRE).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 2; // Schedar Starmobile p.moveset = [ new PokemonMove(Moves.BLAZING_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.ATTICUS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_3", [ Species.REVAVROOM ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.ATTICUS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_3", [ Species.REVAVROOM ], Type.POISON).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 3; // Navi Starmobile p.moveset = [ new PokemonMove(Moves.NOXIOUS_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.ORTEGA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_4", [ Species.DACHSBUN ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.ORTEGA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_4", [ Species.DACHSBUN ], Type.FAIRY).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 4; // Ruchbah Starmobile p.moveset = [ new PokemonMove(Moves.MAGICAL_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; })), - [TrainerType.ERI]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_5", [ Species.ANNIHILAPE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + [TrainerType.ERI]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_5", [ Species.ANNIHILAPE ], Type.FIGHTING).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = 5; // Caph Starmobile p.moveset = [ new PokemonMove(Moves.COMBAT_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; @@ -1746,14 +1754,14 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PIERS"], true, Type.DARK).setHasDouble("piers_marnie_double").setDoubleTrainerType(TrainerType.MARNIE).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), [TrainerType.MARNIE]: new TrainerConfig(++t).setName("Marnie").initForGymLeader(signatureSpecies["MARNIE"], false, Type.DARK).setHasDouble("marnie_piers_double").setDoubleTrainerType(TrainerType.PIERS).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), [TrainerType.RAIHAN]: new TrainerConfig(++t).setName("Raihan").initForGymLeader(signatureSpecies["RAIHAN"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], false, Type.BUG).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], true, Type.GRASS).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], false, Type.ELECTRIC).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], true, Type.WATER).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], true, Type.NORMAL).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], false, Type.GHOST).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], false, Type.PSYCHIC).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], true, Type.ICE).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], false, Type.BUG, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], true, Type.GRASS, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], false, Type.ELECTRIC, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], true, Type.WATER, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], true, Type.NORMAL, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], false, Type.GHOST, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], false, Type.PSYCHIC, true, -1).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], true, Type.ICE, true, -1).setMixedBattleBgm("battle_paldea_gym"), [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"], false, Type.ICE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BRUNO"], true, Type.FIGHTING).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), @@ -1768,7 +1776,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAKE"], true, Type.DRAGON).setMixedBattleBgm("battle_hoenn_elite"), [TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AARON"], true, Type.BUG).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), [TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BERTHA"], false, Type.GROUND).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], true, Type.FIRE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], true, Type.FIRE, 3).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), [TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LUCIAN"], true, Type.PSYCHIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), [TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SHAUNTAL"], false, Type.GHOST).setMixedBattleBgm("battle_unova_elite"), [TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MARSHAL"], true, Type.FIGHTING).setMixedBattleBgm("battle_unova_elite"), @@ -1788,14 +1796,14 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.BEA_ELITE]: new TrainerConfig(++t).setName("Bea").initForEliteFour(signatureSpecies["BEA_ELITE"], false, Type.FIGHTING).setMixedBattleBgm("battle_galar_elite"), [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t).setName("Allister").initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, Type.GHOST).setMixedBattleBgm("battle_galar_elite"), [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t).setName("Raihan").initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], false, Type.GROUND).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], false, Type.STEEL).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], true, Type.NORMAL, Type.FLYING).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], true, Type.DRAGON).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], true, Type.FIRE).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], false, Type.STEEL).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], false, Type.FAIRY).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], true, Type.DRAGON).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], false, Type.GROUND, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], false, Type.STEEL, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], true, Type.FLYING, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], true, Type.DRAGON, 5).setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], true, Type.FIRE, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], false, Type.STEEL, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], false, Type.FAIRY, 5).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], true, Type.DRAGON, 5).setMixedBattleBgm("battle_bb_elite"), [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(true).setBattleBgm("battle_kanto_champion").setMixedBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALAKAZAM ])) @@ -1815,7 +1823,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Ground or Rock Rhyperior / Electric Electivire / Fire Magmortar [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 @@ -1839,7 +1847,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Grass Meganium / Fire Typhlosion / Water Feraligatr [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 ])) @@ -1850,14 +1858,15 @@ export const trainerConfigs: TrainerConfigs = { })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CHARIZARD ])) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.GARCHOMP, Species.KOMMO_O ], TrainerSlot.TRAINER, true, p => { - p.teraType = p.species.type1; + p.teraType = Type.DRAGON; + p.abilityIndex = p.species.speciesId === Species.KOMMO_O ? 1 : 2; // Soundproof Kommo-o, Unnerve Tyranitar, Rough Skin Garchomp })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DRAGONITE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Dragon Tyranitar / Garchomp / Kommo-o [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 ])) @@ -1875,7 +1884,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Rock Regirock / Ice Regice / Steel Registeel [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 @@ -1898,7 +1907,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; p.setBoss(true, 2); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Electric Regieleki / Dragon Regidrago [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(); @@ -1921,7 +1930,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.FEMALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Water Milotic / Grass Roserade / Fire Hisuian Arcanine [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 => { @@ -1944,7 +1953,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Ghost Chandelure / Dark Krookodile / Psychic Reuniclus / Fighting Conkeldurr [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 ])) @@ -1966,7 +1975,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; p.setBoss(true, 2); })) - .setInstantTera(3), + .setInstantTera(3), // Tera Dragon Salamence / Hydreigon / Archaludon [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_kalos_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.HAWLUCHA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1979,7 +1988,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; + p.teraType = p.species.type2!; })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GOODRA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1991,7 +2000,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.FEMALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Dragon Tyrantrum / Ice Aurorus [TrainerType.KUKUI]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_champion_kukui") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -1999,7 +2008,7 @@ export const trainerConfigs: TrainerConfigs = { })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MAGNEZONE, Species.ALOLA_NINETALES ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TORNADUS, Species.THUNDURUS, Species.LANDORUS ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Therian Forms + p.formIndex = 1; // Therian Formes p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) @@ -2015,9 +2024,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; + p.teraType = p.species.type2!; })) - .setInstantTera(5), + .setInstantTera(5), // Tera Dark Incineroar / Fighting Hisuian Decidueye [TrainerType.HAU]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_alola_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALOLA_RAICHU ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2042,7 +2051,7 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); p.gender = p.species.speciesId === Species.PRIMARINA ? Gender.FEMALE : Gender.MALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Psychic Tapu Lele / Grass Tapu Bulu [TrainerType.LEON]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_galar_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AEGISLASH ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2063,7 +2072,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.gender = Gender.MALE; })) - .setInstantTera(3), + .setInstantTera(3), // Tera Dragapult to Ghost or Dragon [TrainerType.MUSTARD]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_mustard") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2094,7 +2103,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; p.pokeball = PokeballType.ULTRA_BALL; })) - .setInstantTera(2), + .setInstantTera(2), // Tera Psychic Galar-Slowbro / Galar-Slowking [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(false).setMixedBattleBgm("battle_champion_geeta") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GLIMMORA ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2113,7 +2122,7 @@ export const trainerConfigs: TrainerConfigs = { p.abilityIndex = 1; // Supreme Overlord p.teraType = Type.FLYING; })) - .setInstantTera(5), + .setInstantTera(5), // Tera Flying Kingambit [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 @@ -2126,25 +2135,21 @@ export const trainerConfigs: TrainerConfigs = { })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GHOLDENGO ])) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.ARMAROUGE, Species.CERULEDGE ], TrainerSlot.TRAINER, true, p => { - p.teraType = p.species.speciesId === Species.ARMAROUGE ? Type.PSYCHIC : Type.GHOST; + p.teraType = p.species.type2!; })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Psychic Armarouge / Ghost Ceruledge [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(true).setMixedBattleBgm("battle_champion_kieran") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.POLIWRATH, Species.POLITOED ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.INCINEROAR, Species.GRIMMSNARL ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.INCINEROAR) { - p.abilityIndex = 2; // Intimidate - } else if (p.species.speciesId === Species.GRIMMSNARL) { - p.abilityIndex = 0; // Prankster - } + p.abilityIndex = p.species.speciesId === Species.INCINEROAR ? 2 : 0; // Intimidate Incineroar, Prankster Grimmsnarl })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TERAPAGOS ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2167,7 +2172,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; p.setBoss(true, 2); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Ogerpon [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) @@ -2198,7 +2203,7 @@ export const trainerConfigs: TrainerConfigs = { .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) - .setInstantTera(0), + .setInstantTera(0), // Tera starter to primary type [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 => { @@ -2215,7 +2220,7 @@ export const trainerConfigs: TrainerConfigs = { p.shiny = true; p.variant = 1; })) - .setInstantTera(0), + .setInstantTera(0), // Tera starter to primary type [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 => { @@ -2240,7 +2245,7 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 1; // Mega Rayquaza p.generateName(); })) - .setInstantTera(0), + .setInstantTera(0), // Tera starter to primary type [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 => { @@ -2638,7 +2643,7 @@ export const trainerConfigs: TrainerConfigs = { })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CRAWDAUNT, Species.HISUI_SAMUROTT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Sharpness Hisui Samurott, Adaptability Crawdaunt + p.abilityIndex = 2; // Sharpness Hisuian Samurott, Adaptability Crawdaunt })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.XURKITREE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2738,7 +2743,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.generateName(); })) - .setInstantTera(4), + .setInstantTera(4), // Tera Fairy Sylveon [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); @@ -2776,8 +2781,8 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })) - .setInstantTera(0), - [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer([], true) + .setInstantTera(0), // Tera Fairy Sylveon + [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer(true) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); p.generateAndPopulateMoveset(); @@ -2809,7 +2814,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.CHERYL]: new TrainerConfig(++t).setName("Cheryl").initForStatTrainer([], false) + [TrainerType.CHERYL]: new TrainerConfig(++t).setName("Cheryl").initForStatTrainer() .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BLISSEY ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); p.generateAndPopulateMoveset(); @@ -2837,7 +2842,7 @@ export const trainerConfigs: TrainerConfigs = { } p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.MARLEY]: new TrainerConfig(++t).setName("Marley").initForStatTrainer([], false) + [TrainerType.MARLEY]: new TrainerConfig(++t).setName("Marley").initForStatTrainer() .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCANINE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); p.generateAndPopulateMoveset(); @@ -2861,7 +2866,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.MIRA]: new TrainerConfig(++t).setName("Mira").initForStatTrainer([], false) + [TrainerType.MIRA]: new TrainerConfig(++t).setName("Mira").initForStatTrainer() .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALAKAZAM ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2883,7 +2888,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.RILEY]: new TrainerConfig(++t).setName("Riley").initForStatTrainer([], true) + [TrainerType.RILEY]: new TrainerConfig(++t).setName("Riley").initForStatTrainer(true) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LUCARIO ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 5bce08afae6..ab247716e15 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -416,14 +416,16 @@ export default class Trainer extends Phaser.GameObjects.Container { } } - if (!retry && this.config.specialtyTypes.length && !this.config.specialtyTypes.find(t => ret.isOfType(t))) { + // Prompts reroll of party member species if doesn't fit specialty type. + // Can be removed by adding a type parameter to getTrainerSpeciesForLevel and filtering the list of evolutions for that type. + if (!retry && this.config.hasSpecialtyType() && !ret.isOfType(this.config.specialtyType)) { retry = true; console.log("Attempting reroll of species evolution to fit specialty type..."); let evoAttempt = 0; while (retry && evoAttempt++ < 10) { ret = getPokemonSpecies(baseSpecies.getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex)); console.log(ret.name); - if (this.config.specialtyTypes.find(t => ret.isOfType(t))) { + if (ret.isOfType(this.config.specialtyType)) { retry = false; } } @@ -677,6 +679,11 @@ export default class Trainer extends Phaser.GameObjects.Container { }); } + /** + * Determines whether a Trainer should Terastallize their Pokemon + * @param pokemon {@linkcode EnemyPokemon} Trainer Pokemon in question + * @returns boolean Whether the EnemyPokemon should Terastalize this turn + */ shouldTera(pokemon: EnemyPokemon): boolean { if (this.config.trainerAI.teraMode === TeraAIMode.INSTANT_TERA) { if (!pokemon.isTerastallized && this.config.trainerAI.instantTeras.includes(pokemon.initialTeamIndex)) { From 035aed3e856c5811fe4397ece474c600f7fffeaa Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Thu, 27 Feb 2025 06:16:07 +1100 Subject: [PATCH 48/83] [Bug][UI] Fix arena flyout (#5421) --- src/ui-inputs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 951aec2a3b6..d5c4529470b 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -109,7 +109,7 @@ export class UiInputs { [Button.CYCLE_GENDER]: () => undefined, [Button.CYCLE_ABILITY]: () => undefined, [Button.CYCLE_NATURE]: () => undefined, - [Button.CYCLE_TERA]: () => undefined, + [Button.CYCLE_TERA]: () => this.buttonInfo(false), [Button.SPEED_UP]: () => undefined, [Button.SLOW_DOWN]: () => undefined, }; From 905fec92e9655822d050b6062828237efb417245 Mon Sep 17 00:00:00 2001 From: Dean <69436131+emdeann@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:39:08 -0800 Subject: [PATCH 49/83] [Bug] Fix Neutralizing Gas not Deactivating on Faint and Capture (#5423) --- src/data/ability.ts | 3 ++- test/abilities/neutralizing_gas.test.ts | 27 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index dcbaa4026f4..8c4b2ba380a 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6877,7 +6877,8 @@ export function initAbilities() { .attr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr), + .attr(NoTransformAbilityAbAttr) + .bypassFaint(), new Ability(Abilities.PASTEL_VEIL, 8) .attr(PostSummonUserFieldRemoveStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) diff --git a/test/abilities/neutralizing_gas.test.ts b/test/abilities/neutralizing_gas.test.ts index 8b9c374f1cc..a0612078e64 100644 --- a/test/abilities/neutralizing_gas.test.ts +++ b/test/abilities/neutralizing_gas.test.ts @@ -2,6 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; +import { PokeballType } from "#enums/pokeball"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import GameManager from "#test/testUtils/gameManager"; @@ -135,4 +136,30 @@ describe("Abilities - Neutralizing Gas", () => { expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); }); + it("should deactivate when the pokemon faints", async () => { + game.override.ability(Abilities.BALL_FETCH) + .enemyAbility(Abilities.NEUTRALIZING_GAS); + + await game.classicMode.startBattle([ Species.FEEBAS ]); + game.move.select(Moves.SPLASH); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); + await game.doKillOpponents(); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + }); + + it("should deactivate upon catching a wild pokemon", async () => { + game.override + .battleType("single") + .enemyAbility(Abilities.NEUTRALIZING_GAS) + .ability(Abilities.BALL_FETCH); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); + + game.scene.pokeballCounts[PokeballType.MASTER_BALL] = 1; + game.doThrowPokeball(PokeballType.MASTER_BALL); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + }); }); From 13373a63912b35ab0f3bf830015a108c574eb108 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Wed, 26 Feb 2025 22:57:05 +0100 Subject: [PATCH 50/83] =?UTF-8?q?[UI/UX]=20Pok=C3=A9dex=20-=20New=20locale?= =?UTF-8?q?s=20keys=20for=20standalone=20battle=20forms=20(#5386)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/locales | 2 +- src/data/pokemon-species.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/locales b/public/locales index ef43efffe5f..5e7fc5ef196 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit ef43efffe5fe454862c350f1b9393c3ad755bcc2 +Subproject commit 5e7fc5ef1968652f2335b17c354db62d8cbec314 diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 06704666153..c0ca9bf4b62 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -749,7 +749,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali if (this.speciesId === Species.ARCEUS) { ret = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); } else if ([ SpeciesFormKey.MEGA, SpeciesFormKey.MEGA_X, SpeciesFormKey.MEGA_Y, SpeciesFormKey.PRIMAL, SpeciesFormKey.GIGANTAMAX, SpeciesFormKey.GIGANTAMAX_RAPID, SpeciesFormKey.GIGANTAMAX_SINGLE, SpeciesFormKey.ETERNAMAX ].includes(formKey as SpeciesFormKey)) { - return i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: (append ? this.name : "") }); + return append ? i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: this.name }) : i18next.t(`pokemonForm:battleForm.${formKey}`); } else if (region === Region.NORMAL || (this.speciesId === Species.GALAR_DARMANITAN && formIndex > 0) || this.speciesId === Species.PALDEA_TAUROS) { // More special cases can be added here const i18key = `pokemonForm:${speciesName}${formText}`; if (i18next.exists(i18key)) { From de148277ea11aed28993675c7005e99a3e21409f Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Wed, 26 Feb 2025 19:14:15 -0500 Subject: [PATCH 51/83] [Balance] [Bug] Set trainer mons to forms matching specialty type (#5409) Co-authored-by: damocleas --- src/battle-scene.ts | 63 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 8205c1fcebc..996c3b0de87 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1865,6 +1865,58 @@ export default class BattleScene extends SceneBase { this.getCurrentPhase()?.constructor.name ?? "", ); + if ( // Give trainers with specialty types an appropriately-typed form for Wormadam, Rotom, Arceus, Oricorio, Silvally, or Paldean Tauros. + !isEggPhase && + this.currentBattle?.battleType === BattleType.TRAINER && !isNullOrUndefined(this.currentBattle.trainer) && + this.currentBattle.trainer.config.hasSpecialtyType() + ) { + if (species.speciesId === Species.WORMADAM) { + switch (this.currentBattle.trainer.config.specialtyType) { + case Type.GROUND: + return 1; // Sandy Cloak + case Type.STEEL: + return 2; // Trash Cloak + case Type.GRASS: + return 0; // Plant Cloak + } + } else if (species.speciesId === Species.ROTOM) { + switch (this.currentBattle.trainer.config.specialtyType) { + case Type.FLYING: + return 4; // Fan Rotom + case Type.GHOST: + return 0; // Lightbulb Rotom + case Type.FIRE: + return 1; // Heat Rotom + case Type.GRASS: + return 5; // Mow Rotom + case Type.WATER: + return 2; // Wash Rotom + case Type.ICE: + return 3; // Frost Rotom + } + } else if (species.speciesId === Species.ORICORIO) { + switch (this.currentBattle.trainer.config.specialtyType) { + case Type.GHOST: + return 3; // Sensu Style + case Type.FIRE: + return 0; // Baile Style + case Type.ELECTRIC: + return 1; // Pom-Pom Style + case Type.PSYCHIC: + return 2; // Pa'u Style + } + } else if (species.speciesId === Species.PALDEA_TAUROS) { + switch (this.currentBattle.trainer.config.specialtyType) { + case Type.FIRE: + return 1; // Blaze Breed + case Type.WATER: + return 2; // Aqua Breed + } + } else if (species.speciesId === Species.SILVALLY || species.speciesId === Species.ARCEUS) { // Would probably never happen, but might as well + return this.currentBattle.trainer.config.specialtyType; + } + } + switch (species.speciesId) { case Species.UNOWN: case Species.SHELLOS: @@ -1872,8 +1924,6 @@ export default class BattleScene extends SceneBase { case Species.BASCULIN: case Species.DEERLING: case Species.SAWSBUCK: - case Species.FROAKIE: - case Species.FROGADIER: case Species.SCATTERBUG: case Species.SPEWPA: case Species.VIVILLON: @@ -1907,9 +1957,14 @@ export default class BattleScene extends SceneBase { return 0; // No Partner Eevee for Wave 12 Preschoolers } return Utils.randSeedInt(2); + case Species.FROAKIE: + case Species.FROGADIER: case Species.GRENINJA: - if (this.currentBattle?.battleType === BattleType.TRAINER) { - return 0; // Don't give trainers Battle Bond Greninja + if ( + this.currentBattle?.battleType === BattleType.TRAINER && + !isEggPhase + ) { + return 0; // Don't give trainers Battle Bond Greninja, Froakie or Frogadier } return Utils.randSeedInt(2); case Species.URSHIFU: From d12aa635af223ce818c7b39e355dcb516b52730b Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 27 Feb 2025 00:56:01 -0500 Subject: [PATCH 52/83] [Balance] Follow Cost Change from #5416 (#5430) --- src/data/balance/starters.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts index 10263f895b3..3468163c988 100644 --- a/src/data/balance/starters.ts +++ b/src/data/balance/starters.ts @@ -461,7 +461,7 @@ export const speciesStarterCosts = { [Species.GUZZLORD]: 6, [Species.NECROZMA]: 8, [Species.MAGEARNA]: 7, - [Species.MARSHADOW]: 7, + [Species.MARSHADOW]: 8, [Species.POIPOLE]: 8, [Species.STAKATAKA]: 6, [Species.BLACEPHALON]: 7, From 32ae72150f976b2c4f1e6affb9b2709c0e436587 Mon Sep 17 00:00:00 2001 From: Lugiad <2070109+Adri1@users.noreply.github.com> Date: Thu, 27 Feb 2025 19:59:33 +0100 Subject: [PATCH 53/83] =?UTF-8?q?Pok=C3=A9mon=20Day=202025=20Event=20banne?= =?UTF-8?q?rs=20(#5432)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/events/pkmnday2025event-de.png | Bin 0 -> 24691 bytes public/images/events/pkmnday2025event-en.png | Bin 0 -> 21866 bytes public/images/events/pkmnday2025event-es-ES.png | Bin 0 -> 23815 bytes public/images/events/pkmnday2025event-fr.png | Bin 0 -> 24215 bytes public/images/events/pkmnday2025event-it.png | Bin 0 -> 24156 bytes public/images/events/pkmnday2025event-ja.png | Bin 0 -> 30374 bytes public/images/events/pkmnday2025event-ko.png | Bin 0 -> 25896 bytes public/images/events/pkmnday2025event-pt-BR.png | Bin 0 -> 24099 bytes public/images/events/pkmnday2025event-zh-CN.png | Bin 0 -> 29185 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/events/pkmnday2025event-de.png create mode 100644 public/images/events/pkmnday2025event-en.png create mode 100644 public/images/events/pkmnday2025event-es-ES.png create mode 100644 public/images/events/pkmnday2025event-fr.png create mode 100644 public/images/events/pkmnday2025event-it.png create mode 100644 public/images/events/pkmnday2025event-ja.png create mode 100644 public/images/events/pkmnday2025event-ko.png create mode 100644 public/images/events/pkmnday2025event-pt-BR.png create mode 100644 public/images/events/pkmnday2025event-zh-CN.png diff --git a/public/images/events/pkmnday2025event-de.png b/public/images/events/pkmnday2025event-de.png new file mode 100644 index 0000000000000000000000000000000000000000..4cc535467528ae172ab8c7283afc1845c7f7c4b0 GIT binary patch literal 24691 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 H&QbpZqAcIM literal 0 HcmV?d00001 diff --git a/public/images/events/pkmnday2025event-ja.png b/public/images/events/pkmnday2025event-ja.png new file mode 100644 index 0000000000000000000000000000000000000000..94b02ad93a0d45cd764fc2d09f50a4ec93c7cfec GIT binary patch literal 30374 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 Sin{qG*~cnRl}i;Z-u@qa@nXmT literal 0 HcmV?d00001 diff --git a/public/images/events/pkmnday2025event-ko.png b/public/images/events/pkmnday2025event-ko.png new file mode 100644 index 0000000000000000000000000000000000000000..aed9ee3fb282f77ab92a3b4aec9807558d81ceb9 GIT binary patch literal 25896 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 z z%SX|&YPXBKrqD0l*U>1zx)7(g2$FTOM>@Qx)KfA+ZfqCRWI<}Ng&D412|yuC4pPud zc)Q2TVg#5hg1ZYM;NFPOCqsS*));WrW^7owBVYYden%vX8QcQhQO;`{GA%IL3TCGf z>@6>h%tVcIq@M+Ktj`+S9j`+VVuwRs(uMB+SzA*E)IT*GK22+Q0+R^3@$+>_s+XU5 z#Rrcyo!p>L-#rKO&OXwJd!szoOS|dwl`=b?QUtyXkZxWZe8OIUtXX||E1BqIn{!~x z^S0QH1CkGeHx{8T)TI+=xPPGfNSrW2YdM<` zgOyCOJm~NQOwg*asg}H>Q-+C~QmU%%fHA{1ai-ir8Ni{L#zU?L#<85Gs5-bTC)(Vm z8n-mxfdR17LK6VlA*tD<)?Pp`-!CnP6P!Vw2WmBYshg~jRD=p2nN;+(Od;Gz*SwSQ z9*Egw3+d1{Yv${**M^1e=TUQLrqvP~NY^csYYUMra)}XOGo+JC&o&yjNXszQKduPB zU$fuCNkqR)FsQZY`$}=4$VuAQ2`5diHY>}{&Dy1#KG%7Op*ie*heO3mL+N9I(nK)B zSNIR&j<4Q|4iVG1>^4<;vWU+O97|ugZg=+XWmLj~3n5#&ju z9C0>{Xr`o!QAR5JPKEY(JGrkc8k@AFIESi#=wrJxo~&_)sD+WepvfNnP2h3eHP1~! zt|P|BJz_Be_Mb+1J&yBD(q^$V$%j#Lqv#z^x$t%%FAtS-s^+7P)_{9-BZi(0qjclomh3jLC0~gZKl(!`b6R;jp<4g|_nysi zkS^1nc&*QoFG&#hyC~!AHT?r@)g{{s+nYMMw4xF`Z@6&k^dbv|GTE(vp1o6{%^0iC zKW-k=_^=xwx!$OnpQswbAc3l|6)!Q##%U7Me)dLW#i}MtUut^b-ui=gBp$3f^?QJT z6ZZb{7a9DN1aUXE_Y0T$k5oxG#J?be$)b+;P6gT7v=*xDhk8Z$Cbv)DM|<0`h=H|R z%uec_9b>;EoYKIwz!OacbyP+^0}&QiWjVXT_)80*>#-DDbCp7K9+G^^uNY?#>L&od ziG3HqN!oVMT^+yg#*z7Z=Ox1wFBW3f=sxB$)y(%rNatN=%XdoVE%lnuh*d!g>)4jY zabItuhJK4q8}uIGuLG{Ov_0Ik@wF{M!kg|?z2s}`XKRrL?rUw`ueApCqVqHgVwqv4 zxe0GXJXk#uTAZ-vMF*gh2$eK(J$kfYJO@8VnbDFu9vQImZXrlIR97m~ug@^H+0rnn zp@E4$vSnU6ah0%MnKL;e2^sYIfP?O*$Y3bP@$RSGac_rEt3aD%9VwttS8U^I_ zcjcy93NOgP-Ji;&)pIua_#ySGwfzHqr~2Cb>N}eH`s>aL!`o_f1{m5GM~SOzm_8Qr#@ z)Zm}M_iKRJ`L6({dFuC48W8xaQRkpiFwGvjPM<0Y?wEnKw^JeZXACo4{%>{~!{j!M z)xiT^&96zX3Py6Ex^cF(uBf9(nS?hQZx zlzNTm*HmtOOOSL`C@Ux1^R$zJ9D49uIbG8x(O8UyI%xlK$5Nj}pP!BHbbX;e)pM(# zUFalNWjipA(J(&p0<2acXO4Wp)3e8XWSMhgEWn@^EXttD?JoR5*w&hqANpm@rX{`= zGJU3^kQ5O<22=!c){2am&JtAL-8GKNuV&uLGhl7=}z_bO}7aOF+<(7^o7t9ELTdWtwx?+U;if1KvkuRWl} zk|8|smT_q{gXFO;6-3C>$~aTA!zKMSq1mQ8z~!BS^5~*bAE{H`Qu03sVqPz2T4WMj zEd@IMubR#}s>%O-4|r!D;RFk1W8zs+VD-B9qXtwJ3^d#Gr8F#j=?wtx8Wq|q1j z4L(X-R1(KbMwTAUCE%HLWj#*pua5@qS4Y!}zZX+EhKC3;en0b%xFPSz7XnUEI zFwfnXN?C!a9zPs=bSn2K_THV4y;)R2Mf%U#%F(Ta{mNU}7wJ=sKc!-dEpNUKM1l>i z-c#CE#z~KfeD3*q|41zE({G#GUIspRkdJnkNW8Co%~@;y%1(r0Ttqq=K4hNIG4}S6 zz;>71&5F6LCveZzH6WF#3 zxTi;$*+YJTKt%UzYshBcdIxa(Ss*v!A@(Lz`5R)oXVrGoPP#R^{n))odCx<#K+T*?NjRO&n$h1)>&LLIFd==ZKxd$ER}k z519TwV2*9x3&MfT9M>yM-S|%Ed85cm%Z*<_?skQz;+X@*{F;7^=vM`R>vt9ovr|ZTi>5ov{qn3!|8cwkV#N_|FJDaWWIqQ_pIDW; z5w{%_wDdTw4ldhE`x_?*e(m8{Kz`OY7kP-$pRQoQ63YtmT(mH835@nl+T-_lhvfPR zwV;Ob99w8U*7uR%T*^YF_Vs@ASB(yRkH2Pz2dIVH@<2VOn-o!oA8P`55kKb+(F=`h6RE77Q zN<8P9?AP@~QNy~fJ1VO%QdB;eUQSESQBG4#DuY}rAvn_QJnsSbnZLLIHPda|ojGEL zwbqql4N#4nABQIkl27oX;U$c}_qK`Dx3SleFY^A%a_0qP16w=rzPtB3u>^x5#_lt* z+ew5YX1BLs9tMV}o)Mg*i-_Guk0t(DWBDslW_q>DUVS2b0v?2>`{qFL^u(=8-DQ-Y z&nmqB#t!_{A2Ulhu-%QmX99c7A3_+2nL;Eezt%j%%u1k6-q^rLTJBE)kpd*@PJ4^) zG)rJmbF`k@ndULrPSn9wLItMC#&&y7yotf>w1ld>R%P{t5z&>BwoBle1<5;vleW^Z zH2)QCxM~4;TZpN>!eiJG-p-s12sP6swa=+(EAG8DE1cSVRs+xrLb9egqhh4+HFQC; zyU_e!KHi~c5I#maKL4&x0^jnu?PmxB=vc5lNnXn=uET0BL9eNu| zsrE5^929&Zgi^s0JX0>yv^3_JT7xK_yN(Nn&SnJ6Rg#N#WbYS$%AUI$K>Go=czVy+ z=KcgNEHm(;WLL}~r6c+}gXJ7Vpai;PcFgM62GFZTWTyR^IO@OSR`QDM@9&B*kK*}6 zV)u;{`%r z+9bv}Bj|DXt1j*FEdC33I&%>X3(s?0q&x_ETeGFC2=Wj+>Luh_9^d3&`fw#u=-Aqx ztvlXHoF_Xs_mvh|?(VLadNuB?1`)k~t{CKZUyUY2=dDO4^|g30YI@_M)4M`E_Uq5Z zz*m}d0zX7NC@*rOdDJ7@K#*UrE1n8%AQLq?l&c{&Aay{4WBWhA?8W8&&Bd>pwBR1b zehyPFDq@L5Y0{Dim=RUERPN%Szf^I?igmS{3M?Lh#3E1qYJkc>tTrc{Q(%FRwx_9n zgr_4K!#eMQG-03ZLo!q8N94@rwEpsTRAf1D(f`71Z#$WWp)o;=uG!}*UP=p13Wz3^ zm~{oL^lE9g({)*l2{N38pmFUwMnFSm)>t&VwvruI;QU9X&h-@l)*ZQ-hQ5%i^mSQ8~E z3m^{Wa+1iQs#Abxi{1Jr6}tkFHj%yisC;KP^S|Za@q+h_7I1(ftnRH# zA7L~2_Tb~6bb;G}yO;7EhZ#Yi%!i$#^DYtnD(-VGsg~2&W=o6(06dd5U3|Dd^9)cc zqAV3-vS|~C@`8@l*zG}*nviyLId7L+Oory#^u2C>VlflY6G8>0e^<04|VceAYR z!i(Y%gVVY>fQ$RjHHT7&33g|#(eI}_!C`XYqXv}UtZ31&nx={w7~~m2=I|_=ZbQZm zJ0HOQ5j;YqG@Q;tA(VgAz)DxKT}@a4;K{o3iGKL55FwFr?5J^VJJ-n$6^wu#){ z%v)t~oYqWWk@Tql^o-FrhEhK!#iY6k;QG`VNTr)E3{`r#u0tcPl+LzD+m3;!yB zX0pr^oT7ypINL?8!#Lo=9Y<4S{hF6=G%B_JR(vD%THi56S+z6g`AFklfLq7+*1pz% zZ^AL=#I^R?VTM@wcJdpOG`^IUqU+=EtPdZln1S@cK47G3L&b&)WUwUU)n7}1C>~g3 zsW(2^=9yRU|+HT_Az=}h1MR)c{WO39K;J@=i8(VR$JME@<2e`1K`TGB#HbOb~4D{uoCWj~*H znh-C(sPG|cK%U=&hQ1D7bz7=#qz&$)#0$&#amu%hBlyj=TIu&63c6tViv!U}8?0MT ziS2&iE-t_484u#UKgW_Kmj_6MsHa6-Pcya*1 z*PJ7Iw5z~ta%2LB?x8mQpGu)D>T9dbI28Y7zT@SxHuUob#99(QhaI%=(F%nS#_P*) z12LmSwHalnajkfVrn=KMFcXjB$Ujz+8xL&N5g3&M%Ie^wD`2L5u@X1j$Z{}or7qkC z>&no#poSt?a*}@&Wu@oG;09)K&czt?XA4UEaXTsUk;4RtK@G9R2H_PQh+K(41LP1C zbR>_*L0}vF{Ne83Z}Z7CT}9}uzg>$_Cu+XHj026$i>9IGC-^JslZ#nqy4Eo(AY%Zi z2@@kMCHa`qgsXcD#nMG?B|HcqNAwB$s0vv_ z-4A8HA}-To!GzaBWPK0xV z*cMdF#9w*6K;)lD=(m*fe(%lNl1aQ_7^NU3sR2Fz?b7U z8;}nWX>%OtjZc>Djk$d|O5N7C#ebLrQ)uT{jg~y=!=<9axIn;f$Yqo?Ty3g?)kp9pqm+_ zeH4g&xg-vY*Sukuza%>Ee#rgiusCPBuo?qKj8&)JVf zZo!_+PAg1oKb>?{yhSxf`%J5HEz28mn1G8MWHlJUqTC};fMWtv`R>a0{S2LcM1OkB z4yFy6s&ZYy4iZmT^AvgeKEr1Zbp2p#Max7T`~c5-Dhzs-H?Y+m2&*A{N(Yc+BZU$` zK{#%Pn|Kx_2W6zYxoXB}G8__~O&*v7udSxY0qv0@api(*QkczB?6O_1KPBR$#$2t; z*5YxZ7xBpE7$#;DcjOCZ`cbVQ%1mT`vhFZf_+LdG?lNRiF8&oK&WNg=XG0~U9FA{WLu4K!TcB#^;qzmJx${;g^t@DU$*+7@4o zBiGf1mzv3#X0J|)ds7I^rMtIKJ*@)w@&HhTRJMt zfF~aGZFi?BmRTaF-+w=+iBDXR^4H5?TU;OEAOSVWgK5wQMjBsfR}xGr!@OG~@K3_+ zH@rH*dJb%z`h^}8XawwR+hk=LJVX--nGu-FA-2V35OFucwG$E}+#1U$Enjuhlc;)K z=BQVoCL+$C_fG_w2NUl^ZH}IvhKGjj$OFGI<5r56#4c$%YU(SziXI9GHUKtrR?76akFN->PqS2SreL7^7kVs z60OmOaPtXlSAQ#xJn*hpJ+Eh(AjE0UZjf6@rSiJ!(!`40ClP@-3Q92%jclc@HJytB zxqMQe@sJW%2xHZdl+X@tJ4rcWeGvo&8-t>G=iI)SPtQ*RgJ0@M+L_@4FW2FT=vtM6 zlYgPLT&va@2a(Hkuqw!Eom4kxOfv9-jgIe*JY)?2YW^da!@u(f+2Jj??mmaSOlN?r z;y|6mCl;Wfegj&34&)ZLX*Bujl@!66MVNO5`QwUrxr`TB-eMm3tCv6qMS(~=bw3uq zZe`@^A6``K(Cv2!DKZGFC4!C0Xe-+OK0SN*13tS$p;*e_3H#x~u6n5;eyQ2nBeJyV zSP+bGzaxYQ2(vplxU!aeIm8kR54B-H>@*getuQ8gl2&f>@-};d2~hP~c=F3S3@{_R z8&a-OPj*Y=sFyXlh8QUrLU?B>Av#UZpPQUHS>SBuuim`pxC0M3nS3;)w{#lNGwKYsBq8$)|`mL3Cp*eob6?TOLvqCQ%1xe|q&e?+5us$o{mJ168{eIqiE} zEz>y@;aWUKkD`3R_x>W}Ya#Dik48z_T9>q!`KnZ4 z;i?n}<I*^K$*=8cr*lr~z+iCT#xu@0+z!IHGNHXW^Oyp6#dM;j;Bzy!+Q z8PY7ato;6tH#W!p^fyb7^S2LVo zri!fZtL6t;;lQ-b$sh%~L}T?F+b#}R(kXNr=loAd42nN%7&CTmm*egVRABt8R{)s2 zKnXm9rzMJ|^a*RhiPYmM%N$7aA2$lbJ3JS&4`l-}NF1>SwDWdxUtPhE$fR$uusLgt z4nm1voGjJC1wb&#Vd1F%koS5&F7@V0!YZ?h@m;j}!(CihfJA*}siWA3C5rDOS9yk8!EvzcmU}~HuYV% zSYkf*-&j3*qH~7SURHKs4l^3j7HlKnCV|}65^~VW-!p8wf>`UQh&H@H^pd6iycpIs z!XcGTelvDT60iC*TxIg09&i=f*vgpG0GG+EwWj#nhb}bIJO3>bkJMdI&VhREI|HUj z{7xCQJ=qp!byi9Z)Wdu5tq(2B&p_Q#Q|Ze&hUVpZdKp+FO?mGI@oW&S78-F=u1@sW zYl-SYAFP!Wl177a`koY6{2V@Gf8E<8-W@O)TJ7JR?&OEjXYV8AJoU`pUlvGx<@J0F z*^Ki=-hs&X9SA4VT`fB;&BtEv?BSzNnPX+8qvbe1*_TNhwZax-!lX zviou=k>W8vBX6Wvq&*pU*c}Yv+gW}*FvxB;EExsQjGCcVs%BMD4J-4fM1tYo?}Hrq z37JyiBeTI4TYuw|Y$9H4w+UbDac6N1eSf5;FmeMJ{Ym&$EBkfomM}ybp2k=G-w8H> zrKr9GfD(T@8V4EVen*#o-W~yj2=cZw$!-(9HKaHFW6GlOI4>$}4q(e-dQHP-^;J?# zwbN1zABe~@y(V{EFh$(RjXpAyYD-y&#Bj-fR0kVec*}x9Z+Nn4aR1s7|LeQe&xYAw zY6~!e)6rzd{oQ381ERjgz0q&pPKJv9_;NX<_J<{*l*o{(9TnL>9J>5E!6_C}0{TGuS+C8Wm52vm=^1$mW| zP*4b6@}?w=7r`=1lon3GCm0C;#sbwR?u_JP+h^6L1QXU{j~o?B$?Ib%{Oq0>Krbp1vK7#i!s z>9cr#%FL5k5a~u^5WyVwSB^bo`!0osJG6Ut0WWPv^r!L58*vYX8WOojAq;!a6hTqW z^u|`>i43(4_|5yF`!}CQDs+8FSU#(+<2R%=C-ClOpr}lk{R990mx;E9o_fU{`^f(T D{DrZp literal 0 HcmV?d00001 diff --git a/public/images/events/pkmnday2025event-pt-BR.png b/public/images/events/pkmnday2025event-pt-BR.png new file mode 100644 index 0000000000000000000000000000000000000000..2190bbac535875796c837a448fc419180d3e2e6e GIT binary patch literal 24099 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
$1rX^xtfm-Xza89Sg$}!FitxkR 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 Date: Thu, 27 Feb 2025 20:05:37 +0100 Subject: [PATCH 54/83] [Sprite] Froakie static scuff (#5434) --- public/images/pokemon/656.png | Bin 507 -> 528 bytes public/images/pokemon/variant/656.json | 12 ++++++------ public/images/pokemon/variant/back/656.json | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/images/pokemon/656.png b/public/images/pokemon/656.png index 6acfe282dca78abc3dbe0bca782d1ef398c4fcb5..06a9cd58268d670587cbe7a090c7a3375d9110e8 100644 GIT binary patch delta 486 zcmVhOjJc$l+6$j5PQx4IckH=&E}k(#rXL6gM*a)>WIv}aLKYk z7e$i)|NkwS>^}ei01b3fPE-H?|NsC0|NsC0|Nj6z=pu#y00DbRL_t(IjfInqlEWYf zghAqO^Zw6!yP%0_uXjv46XM6J3z75Rko91Q^Veh{mJsu`34fl&-VjS7ive*b8zQaA zg$z&Rftd8xy12R%OqR?Mrjpejn+KRCfdBvh znVXTr0000BbW%=J|NsC0|NsC0|Nj6=PXY1(00C}EL_t(IjfIm7k^>56% z4d|%ZWS2@RqK}U)!TqmcE|hkEbS9z~ZEP#JhQ1+s0h1xIoPP~LYj}_z4h|%CJ0g3m z-I-|y;za8k(mo(vdI!YUTsG(BKw1-%iE!y@ej{}u^-o0P8`8ayLSC=eDAXZ#>cVzQ zQ4&CBsz_37&%!jNR{vaA+=xY?$zVQEuW8OiC;kLx0}+41Yaz^o*n(6W2nLgd9%DO| zOcWZ-Y4C<0w&XQT*)5lTy-*qS;kI;l8MpxC`5G#N%Gd|SFCV`Z7? z%&{RHr5Vg0m$sa56ay}1t_<^oH)L;mAbbOXTIg%u@a0#N6Y=|O2%OmwFN0))&`2Z4 zyj-pd#-2kE>KrAqcLi=^`R5ST&8zrG_r6%@oz zvTV)KVS73YxkqHGNZ$gg5tAb&`F)s(m{IGEPTQisA)EaG#Z4R++|&Y500000NkvXX Hu0mjf?_}7x diff --git a/public/images/pokemon/variant/656.json b/public/images/pokemon/variant/656.json index 68743a4c9f1..5037f86f22a 100644 --- a/public/images/pokemon/variant/656.json +++ b/public/images/pokemon/variant/656.json @@ -3,12 +3,12 @@ "838394": "4d7dc5", "62ace6": "8363af", "7bcdff": "9c75c2", - "ffec8c": "ddfff9", + "fdea88": "ddfff9", "a1a1c4": "7ab7ec", "c9b241": "97d6e2", - "dfcf77": "bae7e8", + "ccbd70": "bae7e8", "174592": "37408c", - "fdfdfd": "b1e5ff", + "f8f8f8": "b1e5ff", "9c9cc5": "5385c7", "cdcde6": "7eb7e8", "396a83": "362864", @@ -18,12 +18,12 @@ "838394": "cc6845", "62ace6": "c44848", "7bcdff": "dd6155", - "ffec8c": "ddfff9", + "fdea88": "ddfff9", "a1a1c4": "f7c685", "c9b241": "97d6e2", - "dfcf77": "bae7e8", + "ccbd70": "bae7e8", "174592": "198158", - "fdfdfd": "fff4bd", + "f8f8f8": "fff4bd", "9c9cc5": "c96a48", "cdcde6": "f7b785", "396a83": "5c0d33", diff --git a/public/images/pokemon/variant/back/656.json b/public/images/pokemon/variant/back/656.json index 34b11bfab78..f41398f3154 100644 --- a/public/images/pokemon/variant/back/656.json +++ b/public/images/pokemon/variant/back/656.json @@ -1,17 +1,17 @@ { "1": { - "838394": "4d7dc5", + "848496": "4d7dc5", "7bcdff": "9c75c2", "62ace6": "8363af", "ffffff": "b1e5ff", "396a83": "362864", "9c9cc5": "5385c7", "cdcde6": "7eb7e8", - "174592": "198158", + "174592": "37408c", "5a94cd": "7054a4" }, "2": { - "838394": "cc6845", + "848496": "cc6845", "7bcdff": "dd6155", "62ace6": "c44848", "ffffff": "fff4bd", From 02edfb673e6018adfe3c92fd175eb36fcac3a772 Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 27 Feb 2025 14:12:57 -0500 Subject: [PATCH 55/83] =?UTF-8?q?Data=20for=20possible=20Pok=C3=A9mon=20Da?= =?UTF-8?q?y=202025=20Event=20(#5433)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modifier/modifier-type.ts | 2 +- src/timed-event-manager.ts | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 112a3c9aa35..ae8b9a45c0d 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -2554,7 +2554,7 @@ export function getPartyLuckValue(party: Pokemon[]): number { return DailyLuck.value; } const eventSpecies = globalScene.eventManager.getEventLuckBoostedSpecies(); - const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 3 : 0) : 0) + const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 1 : 0) : 0) .reduce((total: number, value: number) => total += value, 0), 0, 14); return Math.min(globalScene.eventManager.getEventLuckBoost() + (luck ?? 0), 14); } diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index bebacf87ebc..c12f9d569c0 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -169,7 +169,7 @@ const timedEvents: TimedEvent[] = [ { species: Species.WOOBAT }, { species: Species.FRILLISH }, { species: Species.ALOMOMOLA }, - { species: Species.FURFROU, formIndex: 1 }, // Heart trim + { species: Species.FURFROU, formIndex: 1 }, // Heart Trim { species: Species.ESPURR }, { species: Species.SPRITZEE }, { species: Species.SWIRLIX }, @@ -180,6 +180,33 @@ const timedEvents: TimedEvent[] = [ { species: Species.ENAMORUS } ], luckBoostedSpecies: [ Species.LUVDISC ] + }, + { + name: "PKMNDAY2025", + eventType: EventType.LUCK, + startDate: new Date(Date.UTC(2025, 1, 27)), + endDate: new Date(Date.UTC(2025, 2, 4)), + classicFriendshipMultiplier: 4, + bannerKey: "pkmnday2025event-", + scale: 0.21, + availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ], + eventEncounters: [ + { species: Species.PIKACHU, formIndex: 1, blockEvolution: true }, // Partner Form + { species: Species.EEVEE, formIndex: 1, blockEvolution: true }, // Partner Form + { species: Species.CHIKORITA }, + { species: Species.TOTODILE }, + { species: Species.TEPIG } + ], + luckBoostedSpecies: [ + Species.PICHU, Species.PIKACHU, Species.RAICHU, Species.ALOLA_RAICHU, + Species.PSYDUCK, Species.GOLDUCK, + Species.EEVEE, Species.FLAREON, Species.JOLTEON, Species.VAPOREON, Species.ESPEON, Species.UMBREON, Species.LEAFEON, Species.GLACEON, Species.SYLVEON, + Species.CHIKORITA, Species.BAYLEEF, Species.MEGANIUM, + Species.TOTODILE, Species.CROCONAW, Species.FERALIGATR, + Species.TEPIG, Species.PIGNITE, Species.EMBOAR, + Species.ZYGARDE, + Species.ETERNAL_FLOETTE + ] } ]; From 3124aeb810f7dd3bfe687b0b284c73ede304217a Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 27 Feb 2025 14:59:24 -0500 Subject: [PATCH 56/83] [Misc] Event Banner Fix (#5435) --- src/loading-scene.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/loading-scene.ts b/src/loading-scene.ts index fc685fc2332..de1df784b2b 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -250,9 +250,9 @@ export class LoadingScene extends SceneBase { } const availableLangs = [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ]; if (lang && availableLangs.includes(lang)) { - this.loadImage("valentines2025event-" + lang, "events"); + this.loadImage("pkmnday2025event-" + lang, "events"); } else { - this.loadImage("valentines2025event-en", "events"); + this.loadImage("pkmnday2025event-en", "events"); } this.loadAtlas("statuses", ""); From 922a17048c07b99c5b3d315c14f6ac68c7d4e936 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Thu, 27 Feb 2025 22:50:46 +0100 Subject: [PATCH 57/83] [Bug] Save data migrator to fix starters with no selectable forms (#5425) Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> --- .../version_migration/versions/v1_7_0.ts | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/system/version_migration/versions/v1_7_0.ts b/src/system/version_migration/versions/v1_7_0.ts index 2acb9d8151a..bdb9e6aab9f 100644 --- a/src/system/version_migration/versions/v1_7_0.ts +++ b/src/system/version_migration/versions/v1_7_0.ts @@ -1,8 +1,29 @@ -import { getPokemonSpeciesForm } from "#app/data/pokemon-species"; -import type { SessionSaveData } from "#app/system/game-data"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import { globalScene } from "#app/global-scene"; +import { DexAttr, type SessionSaveData, type SystemSaveData } from "#app/system/game-data"; import * as Utils from "#app/utils"; -export const systemMigrators = [] as const; +export const systemMigrators = [ + /** + * If a starter is caught, but the only forms registered as caught are not starterSelectable, + * unlock the default form. + * @param data {@linkcode SystemSaveData} + */ + function migrateUnselectableForms(data: SystemSaveData) { + if (data.starterData && data.dexData) { + Object.keys(data.starterData).forEach(sd => { + const caughtAttr = data.dexData[sd]?.caughtAttr; + const species = getPokemonSpecies(Number(sd)); + if (caughtAttr && species.forms?.length > 1) { + const selectableForms = species.forms.filter((form, formIndex) => form.isStarterSelectable && (caughtAttr & globalScene.gameData.getFormAttr(formIndex))); + if (selectableForms.length === 0) { + data.dexData[sd].caughtAttr += DexAttr.DEFAULT_FORM; + } + } + }); + } + }, +] as const; export const settingsMigrators = [] as const; From 9ff20af8b7d86f6a6d656b78b67cbf7b38bd3e0c Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 28 Feb 2025 09:13:35 +1100 Subject: [PATCH 58/83] [UI] Make fight cursor tera icon while tera-ing (#5402) Co-authored-by: damocleas Co-authored-by: Madmadness65 --- public/images/ui/cursor_tera.png | Bin 0 -> 253 bytes public/images/ui/legacy/cursor_tera.png | Bin 0 -> 262 bytes src/loading-scene.ts | 1 + src/ui/fight-ui-handler.ts | 4 +++- 4 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 public/images/ui/cursor_tera.png create mode 100644 public/images/ui/legacy/cursor_tera.png diff --git a/public/images/ui/cursor_tera.png b/public/images/ui/cursor_tera.png new file mode 100644 index 0000000000000000000000000000000000000000..34cbe0958959da88b819c9b1f129e59b1d71810e GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CP!3HERJk;|9QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4uUY_j)~cCfr67fT^vI+g69S~3N^G+E}p8jB0L%+mh$DfK`n%1(6 z8&0lEvSho~cJJZ=ucAp$G?#8xSFMn`xN@(2xz6%U?4KTM?9f!$SbaIr^6>Y_w@Ys^ yq#8b-?eu)Tw@}d4UB-W>+i2fq+qs+V0PoflXZB9)_bvgtj=|H_&t;ucLK6UAH)56m literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/cursor_tera.png b/public/images/ui/legacy/cursor_tera.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e77046137c64e4bb015ce419eecbb4ac00b246 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CP!3HERJk;|9QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4uLSEsD@VqP;j=Vi(`mJaPK5XzGed+mbo480}9^=e^Tj_ zsg!aLkqg;!QO{7b(@N+__RYwgME@mI_Wj;htC8}MmR`z(1D$~vkp-uLbJ{We{FYNkAQN}vatF}LW-V_#`_u;7S6_W)w z_#^M1F?eoxdchK%Z1bmoAK2UEx|jS{-9J}v?d`K?{N&~oew@^qbQ|bQ22WQ%mvv4F FO#q|#Vr>8b literal 0 HcmV?d00001 diff --git a/src/loading-scene.ts b/src/loading-scene.ts index de1df784b2b..183b38c49e5 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -101,6 +101,7 @@ export class LoadingScene extends SceneBase { this.loadImage("icon_lock", "ui", "icon_lock.png"); this.loadImage("icon_stop", "ui", "icon_stop.png"); this.loadImage("icon_tera", "ui"); + this.loadImage("cursor_tera", "ui"); this.loadImage("type_tera", "ui"); this.loadAtlas("type_bgs", "ui"); this.loadAtlas("button_tera", "ui"); diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 1c1dceb24a5..8e8b197117c 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -226,7 +226,9 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { } if (!this.cursorObj) { - this.cursorObj = globalScene.add.image(0, 0, "cursor"); + const isTera = this.fromCommand === Command.TERA; + this.cursorObj = globalScene.add.image(0, 0, isTera ? "cursor_tera" : "cursor"); + this.cursorObj.setScale(isTera ? 0.7 : 1); ui.add(this.cursorObj); } From 078c3d00ce4b800f33f632a426de85de3f9338e0 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 28 Feb 2025 09:22:09 +1100 Subject: [PATCH 59/83] [UI][Enhancement] Implement keybind migrator (#5431) Co-authored-by: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> --- src/inputs-controller.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index d382caf6cb6..392761cf8e4 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -564,6 +564,15 @@ export class InputsController { if (!this.configs[selectedDevice]) { this.configs[selectedDevice] = {}; } + // A proper way of handling migrating keybinds would be much better + const mappingOverrides = { + "BUTTON_CYCLE_VARIANT": "BUTTON_CYCLE_TERA", + }; + for (const key in mappingConfigs.custom) { + if (mappingConfigs.custom[key] in mappingOverrides) { + mappingConfigs.custom[key] = mappingOverrides[mappingConfigs.custom[key]]; + } + } this.configs[selectedDevice].custom = mappingConfigs.custom; } From 2b535622ac5c22377ce78beceb37ac063ee4f73a Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Thu, 27 Feb 2025 15:33:01 -0800 Subject: [PATCH 60/83] [i18n] Update locales submodule --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 5e7fc5ef196..b4534f03ba8 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 5e7fc5ef1968652f2335b17c354db62d8cbec314 +Subproject commit b4534f03ba8eb8709486ee967257b6f3725702dd From 9701f27c630e9a3cd5c111bc75562cc434519e25 Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Thu, 27 Feb 2025 20:05:11 -0600 Subject: [PATCH 61/83] [Bug] [Hotfix] Remove Penny's Extra Zamazenta (#5439) Co-authored-by: damocleas --- package-lock.json | 4 ++-- package.json | 2 +- src/data/trainer-config.ts | 5 ----- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 739ce18496d..4abfe1c0666 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.0", + "version": "1.7.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.0", + "version": "1.7.1", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 5a191b3ec99..ca9cf8f2b27 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.0", + "version": "1.7.1", "type": "module", "scripts": { "start": "vite", diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index b7d99ad7ef3..a0158f28238 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -2776,11 +2776,6 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.ZAMAZENTA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) .setInstantTera(0), // Tera Fairy Sylveon [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer(true) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { From 5941cfb001aa7f486184368612afd50ed39ae867 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 28 Feb 2025 03:49:27 +0100 Subject: [PATCH 62/83] [Bug][Hotfix] Fix bug with transferring all items (#5440) --- package-lock.json | 4 ++-- package.json | 2 +- src/ui/party-ui-handler.ts | 18 ++++++++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4abfe1c0666..9e2c0d3a61b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.1", + "version": "1.7.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.1", + "version": "1.7.2", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index ca9cf8f2b27..418c22073c3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.1", + "version": "1.7.2", "type": "module", "scripts": { "start": "vite", diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 136f098df7e..0af94053ceb 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -422,7 +422,10 @@ export default class PartyUiHandler extends MessageUiHandler { if (option === PartyOption.TRANSFER) { if (this.transferCursor !== this.cursor) { if (this.transferAll) { - getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor]).forEach((_, i) => (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, i, this.transferQuantitiesMax[i], this.cursor)); + getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor]).forEach((_, i, array) => { + const invertedIndex = array.length - 1 - i; + (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, invertedIndex, this.transferQuantitiesMax[invertedIndex], this.cursor); + }); } else { (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, this.transferOptionCursor, this.transferQuantities[this.transferOptionCursor], this.cursor); } @@ -1187,7 +1190,6 @@ class PartySlot extends Phaser.GameObjects.Container { public slotHpText: Phaser.GameObjects.Text; public slotDescriptionLabel: Phaser.GameObjects.Text; // this is used to show text instead of the HP bar i.e. for showing "Able"/"Not Able" for TMs when you try to learn them - private pokemonIcon: Phaser.GameObjects.Container; private iconAnimHandler: PokemonIconAnimHandler; @@ -1208,6 +1210,10 @@ class PartySlot extends Phaser.GameObjects.Container { } setup(partyUiMode: PartyUiMode, tmMoveId: Moves) { + + const currentLanguage = i18next.resolvedLanguage ?? "en"; + const offsetJa = currentLanguage === "ja"; + const battlerCount = globalScene.currentBattle.getBattlerCount(); const slotKey = `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`; @@ -1246,15 +1252,15 @@ class PartySlot extends Phaser.GameObjects.Container { nameSizeTest.destroy(); this.slotName = addTextObject(0, 0, displayName, TextStyle.PARTY); - this.slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, this.slotIndex >= battlerCount ? 2 : 10); + this.slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, (this.slotIndex >= battlerCount ? 2 : 10) + (offsetJa ? 2 : 0)); this.slotName.setOrigin(0, 0); const slotLevelLabel = globalScene.add.image(0, 0, "party_slot_overlay_lv"); - slotLevelLabel.setPositionRelative(this.slotName, 8, 12); + slotLevelLabel.setPositionRelative(slotBg, (this.slotIndex >= battlerCount ? 21 : 24) + 8, (this.slotIndex >= battlerCount ? 2 : 10) + 12); slotLevelLabel.setOrigin(0, 0); const slotLevelText = addTextObject(0, 0, this.pokemon.level.toString(), this.pokemon.level < globalScene.getMaxExpLevel() ? TextStyle.PARTY : TextStyle.PARTY_RED); - slotLevelText.setPositionRelative(slotLevelLabel, 9, 0); + slotLevelText.setPositionRelative(slotLevelLabel, 9, offsetJa ? 1.5 : 0); slotLevelText.setOrigin(0, 0.25); slotInfoContainer.add([ this.slotName, slotLevelLabel, slotLevelText ]); @@ -1331,7 +1337,7 @@ class PartySlot extends Phaser.GameObjects.Container { this.slotHpOverlay.setVisible(false); this.slotHpText = addTextObject(0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY); - this.slotHpText.setPositionRelative(this.slotHpBar, this.slotHpBar.width - 3, this.slotHpBar.height - 2); + this.slotHpText.setPositionRelative(this.slotHpBar, this.slotHpBar.width - 3, this.slotHpBar.height - 2 + (offsetJa ? 2 : 0)); this.slotHpText.setOrigin(1, 0); this.slotHpText.setVisible(false); From b33ffb29b36a5bfa9d003a95daba7406314745a2 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 28 Feb 2025 14:08:55 +1100 Subject: [PATCH 63/83] [Bug] Fix mycelium might softlock (#5441) --- package-lock.json | 4 ++-- package.json | 2 +- src/data/ability.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e2c0d3a61b..b74d12ecd35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.2", + "version": "1.7.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.2", + "version": "1.7.3", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 418c22073c3..de543ce2bf2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.2", + "version": "1.7.3", "type": "module", "scripts": { "start": "vite", diff --git a/src/data/ability.ts b/src/data/ability.ts index 8c4b2ba380a..2b73fea60bc 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -5054,7 +5054,7 @@ export class PreventBypassSpeedChanceAbAttr extends AbAttr { const turnCommand = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; const isCommandFight = turnCommand?.command === Command.FIGHT; const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; - if (this.condition(pokemon, move!) && isCommandFight) { + if (isCommandFight && this.condition(pokemon, move!)) { bypassSpeed.value = false; canCheckHeldItems.value = false; return false; From 13429446d35dd42377b16ec76825ff3b6effc6f1 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Fri, 28 Feb 2025 01:18:58 -0500 Subject: [PATCH 64/83] [Bug] Fix tera slot wrapping (#5437) --- package-lock.json | 4 ++-- package.json | 2 +- src/data/trainer-config.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b74d12ecd35..c6dfdd7be04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.3", + "version": "1.7.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.3", + "version": "1.7.4", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index de543ce2bf2..19f64b56157 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.3", + "version": "1.7.4", "type": "module", "scripts": { "start": "vite", diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index a0158f28238..21b04c182e6 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -607,7 +607,7 @@ export class TrainerConfig { const shedinjaCanTera = !this.hasSpecialtyType() || this.specialtyType === Type.BUG; // Better to check one time than 6 const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i) .filter(i => shedinjaCanTera || party[i].species.speciesId !== Species.SHEDINJA); // Shedinja can only Tera on Bug specialty type (or no specialty type) - const setPartySlot = !Utils.isNullOrUndefined(slot) ? Phaser.Math.Wrap(slot, 0, party.length - 1) : -1; // If we have a tera slot defined, wrap it to party size. + const setPartySlot = !Utils.isNullOrUndefined(slot) ? Phaser.Math.Wrap(slot, 0, party.length) : -1; // If we have a tera slot defined, wrap it to party size. for (let t = 0; t < Math.min(count(), party.length); t++) { const randomIndex = partyMemberIndexes.indexOf(setPartySlot) > -1 ? setPartySlot : Utils.randSeedItem(partyMemberIndexes); partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); From 942bcacb56a5e3d6364c408a124e09a16a6a4c23 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 28 Feb 2025 22:22:22 +0100 Subject: [PATCH 65/83] =?UTF-8?q?[Bug][Hotfix]=20Restrict=20Use=20Candies?= =?UTF-8?q?=20option=20in=20the=20Pok=C3=A9dex=20during=20Shop=20(#5446)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 4 ++-- package.json | 2 +- src/ui/pokedex-page-ui-handler.ts | 11 +++++++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index c6dfdd7be04..d31469f4a45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.4", + "version": "1.7.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.4", + "version": "1.7.5", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 19f64b56157..1953b886c80 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.4", + "version": "1.7.5", "type": "module", "scripts": { "start": "vite", diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 99b25c3c383..49bb52dddbb 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -250,6 +250,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { private availableVariants: number; private unlockedVariants: boolean[]; + private canUseCandies: boolean; + constructor() { super(Mode.POKEDEX_PAGE); } @@ -556,6 +558,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { show(args: any[]): boolean { + // Allow the use of candies if we are in one of the whitelisted phases + this.canUseCandies = [ "TitlePhase", "SelectStarterPhase", "CommandPhase" ].includes(globalScene.getCurrentPhase()?.constructor.name ?? ""); + if (args.length >= 1 && args[0] === "refresh") { return false; } else { @@ -1626,7 +1631,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { } break; case Button.STATS: - if (!isCaught || !isFormCaught) { + if (!isCaught || !isFormCaught || !this.canUseCandies) { error = true; } else { const ui = this.getUi(); @@ -1888,7 +1893,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (this.isCaught()) { if (isFormCaught) { - this.updateButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.candyUpgradeIconElement, this.candyUpgradeLabel); + if (this.canUseCandies) { + this.updateButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.candyUpgradeIconElement, this.candyUpgradeLabel); + } if (this.canCycleShiny) { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Shiny, gamepadType, this.shinyIconElement, this.shinyLabel); } From 118bdcc49ea317785c8e67e7e62ee94fcbf7807a Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 01:15:11 +0100 Subject: [PATCH 66/83] =?UTF-8?q?[Bug][UI/UX]=20Never=20select=20invisible?= =?UTF-8?q?=20containers=20in=20Pok=C3=A9dex=20(#5449)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-ui-handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index a18f138e4f7..02c19f11813 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -986,7 +986,7 @@ export default class PokedexUiHandler extends MessageUiHandler { this.updateScroll(); const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); const targetCol = Math.min(8, proportion < 0.5 ? Math.floor(proportion * 8) : Math.ceil(proportion * 8)); - this.setCursor(Math.min(targetCol, numberOfStarters)); + this.setCursor(Math.min(targetCol, numberOfStarters - 1)); success = true; } break; @@ -1108,7 +1108,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } break; case Button.DOWN: - if (currentRow < numOfRows - 1) { // not last row + if ((currentRow < numOfRows - 1) && (this.cursor + 9 < this.filteredPokemonData.length)) { // not last row if (currentRow - this.scrollCursor === 8) { // last row of visible pokemon this.scrollCursor++; this.updateScroll(); From 7cc5f40af8f0b37fc2e790f8d23c9310b0f72907 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 01:55:22 +0100 Subject: [PATCH 67/83] =?UTF-8?q?[Bug][UI/UX]=20Restore=20egg/tm=20move=20?= =?UTF-8?q?and=20passive=20icons=20when=20using=20filters=20in=20Pok=C3=A9?= =?UTF-8?q?dex=20(#5450)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-ui-handler.ts | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 02c19f11813..83739ba26a8 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -1577,6 +1577,37 @@ export default class PokedexUiHandler extends MessageUiHandler { container.icon.setTint(0); } + if (data.eggMove1) { + container.eggMove1Icon.setVisible(true); + } else { + container.eggMove1Icon.setVisible(false); + } + if (data.eggMove2) { + container.eggMove2Icon.setVisible(true); + } else { + container.eggMove2Icon.setVisible(false); + } + if (data.tmMove1) { + container.tmMove1Icon.setVisible(true); + } else { + container.tmMove1Icon.setVisible(false); + } + if (data.tmMove2) { + container.tmMove2Icon.setVisible(true); + } else { + container.tmMove2Icon.setVisible(false); + } + if (data.passive1) { + container.passive1Icon.setVisible(true); + } else { + container.passive1Icon.setVisible(false); + } + if (data.passive2) { + container.passive2Icon.setVisible(true); + } else { + container.passive2Icon.setVisible(false); + } + if (this.showDecorations) { if (this.pokerusSpecies.includes(data.species)) { From b348626ec2257352dc758e5aecaf4dcdd153fff7 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 02:00:56 +0100 Subject: [PATCH 68/83] [Bug][UI/UX] Make candy icons show up again in starter select screen (#5451) --- src/ui/abstact-option-select-ui-handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index 07e43a344dd..a462ed158cb 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -147,7 +147,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { itemIcon.setScale(3 * this.scale); this.optionSelectIcons.push(itemIcon); - this.optionSelectContainer.add(itemIcon); + this.optionSelectTextContainer.add(itemIcon); itemIcon.setPositionRelative(this.optionSelectText, 36 * this.scale, 7 + i * (114 * this.scale - 3)); @@ -156,7 +156,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { itemOverlayIcon.setScale(3 * this.scale); this.optionSelectIcons.push(itemOverlayIcon); - this.optionSelectContainer.add(itemOverlayIcon); + this.optionSelectTextContainer.add(itemOverlayIcon); itemOverlayIcon.setPositionRelative(this.optionSelectText, 36 * this.scale, 7 + i * (114 * this.scale - 3)); From d16197e950bbe59bf86976a5245a10a34c4c6af4 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 04:34:49 +0100 Subject: [PATCH 69/83] =?UTF-8?q?[Bug]=20Gendered=20forms=20display=20corr?= =?UTF-8?q?ect=20information=20in=20Pok=C3=A9dex=20(#5452)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-page-ui-handler.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 49bb52dddbb..e9060fb43b6 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -602,6 +602,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.battleForms = []; const species = this.species; + + let formKey = this.species?.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""; + this.isFormGender = formKey === "male" || formKey === "female"; + if (this.isFormGender && ((this.savedStarterAttributes.female === true && formKey === "male") || (this.savedStarterAttributes.female === false && formKey === "female"))) { + this.formIndex = (this.formIndex + 1) % 2; + formKey = this.species.forms[this.formIndex].formKey; + } + const formIndex = this.formIndex ?? 0; this.starterId = this.getStarterSpeciesId(this.species.speciesId); @@ -635,12 +643,9 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.eggMoves = speciesEggMoves[this.starterId] ?? []; this.hasEggMoves = Array.from({ length: 4 }, (_, em) => (globalScene.gameData.starterData[this.starterId].eggMoves & (1 << em)) !== 0); - const formKey = this.species?.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""; this.tmMoves = speciesTmMoves[species.speciesId]?.filter(m => Array.isArray(m) ? (m[0] === formKey ? true : false ) : true) .map(m => Array.isArray(m) ? m[1] : m).sort((a, b) => allMoves[a].name > allMoves[b].name ? 1 : -1) ?? []; - this.isFormGender = formKey === "male" || formKey === "female"; - const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) ? species.speciesId : starterPassiveAbilities.hasOwnProperty(this.starterId) ? this.starterId : pokemonPrevolutions[this.starterId]; const passives = starterPassiveAbilities[passiveId]; From 89e8085c39c4f193124b731b5ea26b12734a367d Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 05:22:51 +0100 Subject: [PATCH 70/83] =?UTF-8?q?[Bug]=20Display=20Pok=C3=A9mon=20name=20i?= =?UTF-8?q?n=20Focus=20Punch=20lost=20focus=20message=20(#5448)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/move.ts | 2 +- test/moves/focus_punch.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 18f4b220911..11ce7069664 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -9384,7 +9384,7 @@ export function initMoves() { .attr(BypassBurnDamageReductionAttr), new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) .attr(MessageHeaderAttr, (user, move) => i18next.t("moveTriggers:isTighteningFocus", { pokemonName: getPokemonNameWithAffix(user) })) - .attr(PreUseInterruptAttr, i18next.t("moveTriggers:lostFocus"), user => !!user.turnData.attacksReceived.find(r => r.damage)) + .attr(PreUseInterruptAttr, (user, target, move) => i18next.t("moveTriggers:lostFocus", { pokemonName: getPokemonNameWithAffix(user) }), user => !!user.turnData.attacksReceived.find(r => r.damage)) .punchingMove(), new AttackMove(Moves.SMELLING_SALTS, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.PARALYSIS ? 2 : 1) diff --git a/test/moves/focus_punch.test.ts b/test/moves/focus_punch.test.ts index 9bf858dfda5..1f14a19fbd7 100644 --- a/test/moves/focus_punch.test.ts +++ b/test/moves/focus_punch.test.ts @@ -140,6 +140,6 @@ describe("Moves - Focus Punch", () => { await game.phaseInterceptor.to("MessagePhase", false); const consoleSpy = vi.spyOn(console, "log"); await game.phaseInterceptor.to("MoveEndPhase", true); - expect(consoleSpy).nthCalledWith(1, i18next.t("moveTriggers:lostFocus")); + expect(consoleSpy).nthCalledWith(1, i18next.t("moveTriggers:lostFocus", { pokemonName: "Charizard" })); }); }); From c7df847e661727c02bc0980337cd767f99dcb048 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 20:33:31 +0100 Subject: [PATCH 71/83] [Bug] Unlocking correct base form of Zygarde when captured (#5453) --- src/system/game-data.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 57e25325ba4..aefc583a98a 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1645,11 +1645,19 @@ export class GameData { } else if (formIndex === 3) { dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(1); } - } - const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : []; - const toCurrentFormChanges = allFormChanges.filter(f => (f.formKey === formKey)); - if (toCurrentFormChanges.length > 0) { - dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); + } else if (pokemon.species.speciesId === Species.ZYGARDE) { + if (formIndex === 4) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(2); + } else if (formIndex === 5) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(3); + } + } else { + const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : []; + const toCurrentFormChanges = allFormChanges.filter(f => (f.formKey === formKey)); + if (toCurrentFormChanges.length > 0) { + // Needs to do this or Castform can unlock the wrong form, etc. + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); + } } } From 5c73a1ea46033d011ef2f1884a2b41e9cd88d31b Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 21:43:18 +0100 Subject: [PATCH 72/83] [Bug][UI/UX] Starter select screen now looks for and displays form-specific abilities (#5454) --- src/ui/starter-select-ui-handler.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 771554f18de..12dd668af39 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -8,6 +8,7 @@ import i18next from "i18next"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { starterColors } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; +import type { Ability } from "#app/data/ability"; import { allAbilities } from "#app/data/ability"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { GrowthRate, getGrowthRateColor } from "#app/data/exp"; @@ -3364,7 +3365,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } if (dexEntry.caughtAttr) { - const ability = allAbilities[this.lastSpecies.getAbility(abilityIndex!)]; // TODO: is this bang correct? + let ability: Ability; + if (this.lastSpecies.forms?.length > 1) { + ability = allAbilities[this.lastSpecies.forms[formIndex ?? 0].getAbility(abilityIndex!)]; + } else { + ability = allAbilities[this.lastSpecies.getAbility(abilityIndex!)]; // TODO: is this bang correct? + } this.pokemonAbilityText.setText(ability.name); const isHidden = abilityIndex === (this.lastSpecies.ability2 ? 2 : 1); From 04ac5c376241b7026a244fff3faec429b1ade729 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 21:54:29 +0100 Subject: [PATCH 73/83] [Bug][UI/UX] Shiny button can cycle variants even if non-shiny form is uncaught (#5457) --- src/ui/pokedex-page-ui-handler.ts | 12 ++++++------ src/ui/starter-select-ui-handler.ts | 19 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index e9060fb43b6..68df02c191d 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -1580,15 +1580,14 @@ export default class PokedexPageUiHandler extends MessageUiHandler { starterAttributes.variant = newVariant; // store the selected variant this.savedStarterAttributes.variant = starterAttributes.variant; - if (newVariant > props.variant) { - this.setSpeciesDetails(this.species, { variant: newVariant as Variant }); - success = true; - } else { + if ((this.isCaught() & DexAttr.NON_SHINY) && (newVariant <= props.variant)) { this.setSpeciesDetails(this.species, { shiny: false, variant: 0 }); success = true; - starterAttributes.shiny = false; this.savedStarterAttributes.shiny = starterAttributes.shiny; + } else { + this.setSpeciesDetails(this.species, { variant: newVariant as Variant }); + success = true; } } } @@ -2201,7 +2200,8 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); - this.canCycleShiny = isNonShinyCaught && isShinyCaught; + const caughtVariants = [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => caughtAttr & v); + this.canCycleShiny = (isNonShinyCaught && isShinyCaught) || (isShinyCaught && caughtVariants.length > 1); const isMaleCaught = !!(caughtAttr & DexAttr.MALE); const isFemaleCaught = !!(caughtAttr & DexAttr.FEMALE); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 12dd668af39..543e24d3b97 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -2068,20 +2068,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } while (newVariant !== props.variant); starterAttributes.variant = newVariant; // store the selected variant - // If going to a higher variant, display that - if (newVariant > props.variant) { + if ((this.speciesStarterDexEntry!.caughtAttr & DexAttr.NON_SHINY) && (newVariant <= props.variant)) { + // If we have run out of variants, go back to non shiny + this.setSpeciesDetails(this.lastSpecies, { shiny: false, variant: 0 }); + this.pokemonShinyIcon.setVisible(false); + success = true; + starterAttributes.shiny = false; + } else { + // If going to a higher variant, or only shiny forms are caught, go to next variant this.setSpeciesDetails(this.lastSpecies, { variant: newVariant as Variant }); // Cycle tint based on current sprite tint const tint = getVariantTint(newVariant as Variant); this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); this.pokemonShinyIcon.setTint(tint); success = true; - // If we have run out of variants, go back to non shiny - } else { - this.setSpeciesDetails(this.lastSpecies, { shiny: false, variant: 0 }); - this.pokemonShinyIcon.setVisible(false); - success = true; - starterAttributes.shiny = false; } } } @@ -3328,7 +3328,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); - this.canCycleShiny = isNonShinyCaught && isShinyCaught; + const caughtVariants = [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => caughtAttr & v); + this.canCycleShiny = (isNonShinyCaught && isShinyCaught) || (isShinyCaught && caughtVariants.length > 1); const isMaleCaught = !!(caughtAttr & DexAttr.MALE); const isFemaleCaught = !!(caughtAttr & DexAttr.FEMALE); From 8f280bec498568396662240231d487e64e61a9d4 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 22:11:05 +0100 Subject: [PATCH 74/83] [Bug][UI/UX] Restore V button in battle (#5459) --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 91367cf73ec..111464b5e5c 100644 --- a/index.html +++ b/index.html @@ -133,7 +133,7 @@ V

-
+
V
From b50d2c07834c0cab0b39ab90ca489fc3636f6677 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 1 Mar 2025 22:24:15 +0100 Subject: [PATCH 75/83] =?UTF-8?q?[Bug][UI/UX]=20Fix=20bug=20in=20Pok=C3=A9?= =?UTF-8?q?dex=20for=20Mothim=20and=20other=20niche=20cases=20(#5458)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/pokedex-page-ui-handler.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 68df02c191d..eee900d411e 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -789,6 +789,10 @@ export default class PokedexPageUiHandler extends MessageUiHandler { const formIndex = otherFormIndex !== undefined ? otherFormIndex : this.formIndex; const caughtAttr = this.isCaught(species); + if (caughtAttr && (!species.forms.length || species.forms.length === 1)) { + return true; + } + const isFormCaught = (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n; return isFormCaught; } From 882b965da101c992e18752b22e77f203f8e9b9be Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sun, 2 Mar 2025 02:46:38 +0100 Subject: [PATCH 76/83] [Bug] Pledge moves in summary do not break the game (#5461) --- src/data/move.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/move.ts b/src/data/move.ts index 11ce7069664..677ad9f0ebc 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -5236,7 +5236,7 @@ export class CombinedPledgeTypeAttr extends VariableMoveTypeAttr { return false; } - const combinedPledgeMove = user.turnData.combiningPledge; + const combinedPledgeMove = user?.turnData?.combiningPledge; if (!combinedPledgeMove) { return false; } From 659bc82676ec23dd0193ce54ba459cff5c422084 Mon Sep 17 00:00:00 2001 From: damocleas Date: Sun, 2 Mar 2025 12:19:17 -0500 Subject: [PATCH 77/83] [i18n] Up version to 1.7.6, Update locales submodule --- package-lock.json | 4 ++-- package.json | 2 +- public/locales | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index d31469f4a45..453a525581b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.7.5", + "version": "1.7.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.7.5", + "version": "1.7.6", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index 1953b886c80..4c9204f60f9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.7.5", + "version": "1.7.6", "type": "module", "scripts": { "start": "vite", diff --git a/public/locales b/public/locales index b4534f03ba8..0e5c6096ba2 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit b4534f03ba8eb8709486ee967257b6f3725702dd +Subproject commit 0e5c6096ba26f6b87aed1aab3fe9b0b23f6cbb7b From 73afb35c4d745d136287199225a04a6b8ea3db26 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 2 Mar 2025 12:40:40 -0600 Subject: [PATCH 78/83] [GitHub] Update CODEOWNERS to fix team ownership (#5465) --- .github/CODEOWNERS | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8e7606f0a48..79ab1bdc38a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,4 +4,19 @@ * @pagefaultgames/junior-dev-team # github actions/templates etc. - Dev Leads -/.github @pagefaultgames/dev-leads +/.github @pagefaultgames/senior-dev-team + +# Art Team +/public/**/*.png @pagefaultgames/art-team +/public/**/*.json @pagefaultgames/art-team +/public/images @pagefaultgames/art-team +/public/battle-anims @pagefaultgames/art-team + +# Audio files +*.mp3 @pagefaultgames/composer-team +*.wav @pagefaultgames/composer-team +*.ogg @pagefaultgames/composer-team +/public/audio @pagefaultgames/composer-team + +# Balance Files; contain actual code logic and must also be owned by dev team +/src/data/balance @pagefaultgames/balance-team @pagefaultgames/junior-dev-team \ No newline at end of file From 6f686a05e39cb75c2ee110ab996b2b4ed0735cb0 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sun, 2 Mar 2025 20:35:59 +0100 Subject: [PATCH 79/83] [UI/UX] [Bug] Hiding tera button when toggling on stats mode (#5466) --- src/ui/starter-select-ui-handler.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 543e24d3b97..34a29411de4 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -3353,7 +3353,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.canCycleForm = species.forms.filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) .map((_, f) => dexEntry.caughtAttr & globalScene.gameData.getFormAttr(f)).filter(f => f).length > 1; this.canCycleNature = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1; - this.canCycleTera = globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(getPokemonSpeciesForm(species.speciesId, formIndex ?? 0).type2); + this.canCycleTera = !this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(getPokemonSpeciesForm(species.speciesId, formIndex ?? 0).type2); } if (dexEntry.caughtAttr && species.malePercent !== null) { @@ -3858,12 +3858,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.showStats(); this.statsMode = true; this.pokemonSprite.setVisible(false); + this.teraIcon.setVisible(false); + this.canCycleTera = false; + this.updateInstructions(); } else { this.statsMode = false; this.statsContainer.setVisible(false); this.pokemonSprite.setVisible(!!this.speciesStarterDexEntry?.caughtAttr); //@ts-ignore this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. !?!? + this.teraIcon.setVisible(globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id)); + const props = globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); + const formIndex = props.formIndex; + this.canCycleTera = !this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && !Utils.isNullOrUndefined(getPokemonSpeciesForm(this.lastSpecies.speciesId, formIndex ?? 0).type2); + this.updateInstructions(); } } From 5e469620ef8ed098d22c79d279ecdfdbaed0ba22 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 2 Mar 2025 19:15:51 -0600 Subject: [PATCH 80/83] [Bug] Fix battle-anims crashing in certain cases (#5337) --- src/data/battle-anims.ts | 132 +++++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 62 deletions(-) diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index a179f3a3e9b..a42779563f2 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -1,7 +1,20 @@ import { globalScene } from "#app/global-scene"; -import { AttackMove, BeakBlastHeaderAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move"; +import { + AttackMove, + BeakBlastHeaderAttr, + DelayedAttackAttr, + MoveFlags, + SelfStatusMove, + allMoves, +} from "./move"; import type Pokemon from "../field/pokemon"; -import * as Utils from "../utils"; +import { + type nil, + getFrameMs, + getEnumKeys, + getEnumValues, + animationFileName, +} from "../utils"; import type { BattlerIndex } from "../battle"; import type { Element } from "json-stable-stringify"; import { Moves } from "#enums/moves"; @@ -401,7 +414,7 @@ class AnimTimedUpdateBgEvent extends AnimTimedBgEvent { if (Object.keys(tweenProps).length) { globalScene.tweens.add(Object.assign({ targets: moveAnim.bgSprite, - duration: Utils.getFrameMs(this.duration * 3) + duration: getFrameMs(this.duration * 3) }, tweenProps)); } return this.duration * 2; @@ -437,7 +450,7 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent { globalScene.tweens.add({ targets: moveAnim.bgSprite, - duration: Utils.getFrameMs(this.duration * 3) + duration: getFrameMs(this.duration * 3) }); return this.duration * 2; @@ -455,8 +468,8 @@ export const encounterAnims = new Map(); export function initCommonAnims(): Promise { return new Promise(resolve => { - const commonAnimNames = Utils.getEnumKeys(CommonAnim); - const commonAnimIds = Utils.getEnumValues(CommonAnim); + const commonAnimNames = getEnumKeys(CommonAnim); + const commonAnimIds = getEnumValues(CommonAnim); const commonAnimFetches: Promise>[] = []; for (let ca = 0; ca < commonAnimIds.length; ca++) { const commonAnimId = commonAnimIds[ca]; @@ -493,7 +506,7 @@ export function initMoveAnim(move: Moves): Promise { const defaultMoveAnim = allMoves[move] instanceof AttackMove ? Moves.TACKLE : allMoves[move] instanceof SelfStatusMove ? Moves.FOCUS_ENERGY : Moves.TAIL_WHIP; const fetchAnimAndResolve = (move: Moves) => { - globalScene.cachedFetch(`./battle-anims/${Utils.animationFileName(move)}.json`) + globalScene.cachedFetch(`./battle-anims/${animationFileName(move)}.json`) .then(response => { const contentType = response.headers.get("content-type"); if (!response.ok || contentType?.indexOf("application/json") === -1) { @@ -550,7 +563,7 @@ function useDefaultAnim(move: Moves, defaultMoveAnim: Moves) { * @remarks use {@linkcode useDefaultAnim} to use a default animation */ function logMissingMoveAnim(move: Moves, ...optionalParams: any[]) { - const moveName = Utils.animationFileName(move); + const moveName = animationFileName(move); console.warn(`Could not load animation file for move '${moveName}'`, ...optionalParams); } @@ -560,7 +573,7 @@ function logMissingMoveAnim(move: Moves, ...optionalParams: any[]) { */ export async function initEncounterAnims(encounterAnim: EncounterAnim | EncounterAnim[]): Promise { const anims = Array.isArray(encounterAnim) ? encounterAnim : [ encounterAnim ]; - const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); + const encounterAnimNames = getEnumKeys(EncounterAnim); const encounterAnimFetches: Promise>[] = []; for (const anim of anims) { if (encounterAnims.has(anim) && !isNullOrUndefined(encounterAnims.get(anim))) { @@ -922,7 +935,7 @@ export abstract class BattleAnim { let f = 0; globalScene.tweens.addCounter({ - duration: Utils.getFrameMs(3), + duration: getFrameMs(3), repeat: anim?.frames.length ?? 0, onRepeat: () => { if (!f) { @@ -994,47 +1007,39 @@ export abstract class BattleAnim { const moveSprite = sprites[graphicIndex]; if (spritePriorities[graphicIndex] !== frame.priority) { spritePriorities[graphicIndex] = frame.priority; + /** Move the position that the moveSprite is rendered in based on the priority. + * @param priority The priority level to draw the sprite. + * - 0: Draw the sprite in front of the pokemon on the field. + * - 1: Draw the sprite in front of the user pokemon. + * - 2: Draw the sprite in front of its `bgSprite` (if it has one), or its + * `AnimFocus` (if that is user/target), otherwise behind everything. + * - 3: Draw the sprite behind its `AnimFocus` (if that is user/target), otherwise in front of everything. + */ const setSpritePriority = (priority: number) => { - switch (priority) { - case 0: - globalScene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, globalScene.getEnemyPokemon(false) ?? globalScene.getPlayerPokemon(false)!); // TODO: is this bang correct? - break; - case 1: - globalScene.field.moveTo(moveSprite, globalScene.field.getAll().length - 1); - break; - case 2: - switch (frame.focus) { - case AnimFocus.USER: - if (this.bgSprite) { - globalScene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.bgSprite); - } else { - globalScene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? - } - break; - case AnimFocus.TARGET: - globalScene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? - break; - default: - setSpritePriority(1); - break; - } - break; - case 3: - switch (frame.focus) { - case AnimFocus.USER: - globalScene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? - break; - case AnimFocus.TARGET: - globalScene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? - break; - default: - setSpritePriority(1); - break; - } - break; - default: - setSpritePriority(1); + /** The sprite we are moving the moveSprite in relation to */ + let targetSprite: Phaser.GameObjects.GameObject | nil; + /** The method that is being used to move the sprite.*/ + let moveFunc: ((sprite: Phaser.GameObjects.GameObject, target: Phaser.GameObjects.GameObject) => void) | + ((sprite: Phaser.GameObjects.GameObject) => void) = globalScene.field.bringToTop; + + if (priority === 0) { // Place the sprite in front of the pokemon on the field. + targetSprite = globalScene.getEnemyField().find(p => p) ?? globalScene.getPlayerField().find(p => p); + console.log(typeof targetSprite); + moveFunc = globalScene.field.moveBelow; + } else if (priority === 2 && this.bgSprite) { + moveFunc = globalScene.field.moveAbove; + targetSprite = this.bgSprite; + } else if (priority === 2 || priority === 3) { + moveFunc = priority === 2 ? globalScene.field.moveBelow : globalScene.field.moveAbove; + if (frame.focus === AnimFocus.USER) { + targetSprite = this.user; + } else if (frame.focus === AnimFocus.TARGET) { + targetSprite = this.target; + } } + // If target sprite is not undefined and exists in the field container, then move the sprite using the moveFunc. + // Otherwise, default to just bringing it to the top. + targetSprite && globalScene.field.exists(targetSprite) ? moveFunc.bind(globalScene.field)(moveSprite as Phaser.GameObjects.GameObject, targetSprite) : globalScene.field.bringToTop(moveSprite as Phaser.GameObjects.GameObject); }; setSpritePriority(frame.priority); } @@ -1052,11 +1057,13 @@ export abstract class BattleAnim { } } if (anim?.frameTimedEvents.has(f)) { - for (const event of anim.frameTimedEvents.get(f)!) { // TODO: is this bang correct? - r = Math.max((anim.frames.length - f) + event.execute(this), r); + const base = anim.frames.length - f; + // Bang is correct due to `has` check above, which cannot return true for an undefined / null `f` + for (const event of anim.frameTimedEvents.get(f)!) { + r = Math.max(base + event.execute(this), r); } } - const targets = Utils.getEnumValues(AnimFrameTarget); + const targets = getEnumValues(AnimFrameTarget); for (const i of targets) { const count = i === AnimFrameTarget.GRAPHIC ? g : i === AnimFrameTarget.USER ? u : t; if (count < spriteCache[i].length) { @@ -1084,7 +1091,7 @@ export abstract class BattleAnim { } if (r) { globalScene.tweens.addCounter({ - duration: Utils.getFrameMs(r), + duration: getFrameMs(r), onComplete: () => cleanUpAndComplete() }); } else { @@ -1166,7 +1173,7 @@ export abstract class BattleAnim { let existingFieldSprites = globalScene.field.getAll().slice(0); globalScene.tweens.addCounter({ - duration: Utils.getFrameMs(3) * frameTimeMult, + duration: getFrameMs(3) * frameTimeMult, repeat: anim!.frames.length, onRepeat: () => { existingFieldSprites = globalScene.field.getAll().slice(0); @@ -1215,11 +1222,12 @@ export abstract class BattleAnim { } } if (anim?.frameTimedEvents.get(frameCount)) { + const base = anim.frames.length - frameCount; for (const event of anim.frameTimedEvents.get(frameCount)!) { - totalFrames = Math.max((anim.frames.length - frameCount) + event.execute(this, frameTimedEventPriority), totalFrames); + totalFrames = Math.max(base + event.execute(this, frameTimedEventPriority), totalFrames); } } - const targets = Utils.getEnumValues(AnimFrameTarget); + const targets = getEnumValues(AnimFrameTarget); for (const i of targets) { const count = graphicFrameCount; if (count < spriteCache[i].length) { @@ -1244,7 +1252,7 @@ export abstract class BattleAnim { } if (totalFrames) { globalScene.tweens.addCounter({ - duration: Utils.getFrameMs(totalFrames), + duration: getFrameMs(totalFrames), onComplete: () => cleanUpAndComplete() }); } else { @@ -1342,15 +1350,15 @@ export class EncounterBattleAnim extends BattleAnim { } export async function populateAnims() { - const commonAnimNames = Utils.getEnumKeys(CommonAnim).map(k => k.toLowerCase()); + const commonAnimNames = getEnumKeys(CommonAnim).map(k => k.toLowerCase()); const commonAnimMatchNames = commonAnimNames.map(k => k.replace(/\_/g, "")); - const commonAnimIds = Utils.getEnumValues(CommonAnim) as CommonAnim[]; - const chargeAnimNames = Utils.getEnumKeys(ChargeAnim).map(k => k.toLowerCase()); + const commonAnimIds = getEnumValues(CommonAnim) as CommonAnim[]; + const chargeAnimNames = getEnumKeys(ChargeAnim).map(k => k.toLowerCase()); const chargeAnimMatchNames = chargeAnimNames.map(k => k.replace(/\_/g, " ")); - const chargeAnimIds = Utils.getEnumValues(ChargeAnim) as ChargeAnim[]; + const chargeAnimIds = getEnumValues(ChargeAnim) as ChargeAnim[]; const commonNamePattern = /name: (?:Common:)?(Opp )?(.*)/; const moveNameToId = {}; - for (const move of Utils.getEnumValues(Moves).slice(1)) { + for (const move of getEnumValues(Moves).slice(1)) { const moveName = Moves[move].toUpperCase().replace(/\_/g, ""); moveNameToId[moveName] = move; } From cabcfcbd39968c01cb03e4e76288a716926687b1 Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Mon, 3 Mar 2025 13:22:37 +1100 Subject: [PATCH 81/83] [Balance] Make megas/max player pokemon unable to tera (#5469) Co-authored-by: damocleas --- src/field/pokemon.ts | 14 ++++++++++++-- src/ui/command-ui-handler.ts | 5 ++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index f0486a8f111..53d4b6c54d2 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1226,10 +1226,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Checks if the {@linkcode Pokemon} has is the specified {@linkcode Species} or is fused with it. * @param species the pokemon {@linkcode Species} to check + * @param formKey If provided, requires the species to be in that form * @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; + hasSpecies(species: Species, formKey?: string): boolean { + if (Utils.isNullOrUndefined(formKey)) { + return this.species.speciesId === species || this.fusionSpecies?.speciesId === species; + } + + return (this.species.speciesId === species && this.getFormKey() === formKey) || (this.fusionSpecies?.speciesId === species && this.getFusionFormKey() === formKey); } abstract isBoss(): boolean; @@ -3204,6 +3209,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return maxForms.includes(this.getFormKey()) || (!!this.getFusionFormKey() && maxForms.includes(this.getFusionFormKey()!)); } + isMega(): boolean { + const megaForms = [ SpeciesFormKey.MEGA, SpeciesFormKey.MEGA_X, SpeciesFormKey.MEGA_Y, SpeciesFormKey.PRIMAL ] as string[]; + return megaForms.includes(this.getFormKey()) || (!!this.getFusionFormKey() && megaForms.includes(this.getFusionFormKey()!)); + } + canAddTag(tagType: BattlerTagType): boolean { if (this.getTag(tagType)) { return false; diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index f23cc78c9f7..20cffbbe30a 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -10,6 +10,7 @@ import { globalScene } from "#app/global-scene"; import { TerastallizeAccessModifier } from "#app/modifier/modifier"; import { Type } from "#app/enums/type"; import { getTypeRgb } from "#app/data/type"; +import { Species } from "#enums/species"; export enum Command { FIGHT = 0, @@ -180,9 +181,11 @@ export default class CommandUiHandler extends UiHandler { canTera(): boolean { const hasTeraMod = !!globalScene.getModifiers(TerastallizeAccessModifier).length; + const activePokemon = globalScene.getField()[this.fieldIndex]; + const isBlockedForm = activePokemon.isMega() || activePokemon.isMax() || activePokemon.hasSpecies(Species.NECROZMA, "ultra"); const currentTeras = globalScene.arena.playerTerasUsed; const plannedTera = globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA && this.fieldIndex > 0 ? 1 : 0; - return hasTeraMod && (currentTeras + plannedTera) < 1; + return hasTeraMod && !isBlockedForm && (currentTeras + plannedTera) < 1; } toggleTeraButton() { From ff4184e23f99cd918ce867ea1577a040ea481e28 Mon Sep 17 00:00:00 2001 From: damocleas Date: Mon, 3 Mar 2025 19:33:53 -0500 Subject: [PATCH 82/83] [Balance] Make Pickup and Honey Gather Unsuppressable (#5476) --- src/data/ability.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 2b73fea60bc..37b97ffb5e6 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -6186,7 +6186,8 @@ export function initAbilities() { .attr(ProtectStatAbAttr, Stat.ATK) .ignorable(), new Ability(Abilities.PICKUP, 3) - .attr(PostBattleLootAbAttr), + .attr(PostBattleLootAbAttr) + .attr(UnsuppressableAbilityAbAttr), new Ability(Abilities.TRUANT, 3) .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false), new Ability(Abilities.HUSTLE, 3) @@ -6378,7 +6379,8 @@ export function initAbilities() { .attr(PostSummonWeatherChangeAbAttr, WeatherType.SNOW) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SNOW), new Ability(Abilities.HONEY_GATHER, 4) - .attr(MoneyAbAttr), + .attr(MoneyAbAttr) + .attr(UnsuppressableAbilityAbAttr), new Ability(Abilities.FRISK, 4) .attr(FriskAbAttr), new Ability(Abilities.RECKLESS, 4) From 6181afc6d2c311c569882306ed7c6478b69ebc85 Mon Sep 17 00:00:00 2001 From: David Yang Date: Tue, 4 Mar 2025 08:40:04 +0800 Subject: [PATCH 83/83] [UI/UX] Make left button also go back to run history from run info (#5474) --- src/ui/run-info-ui-handler.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index bf07374e21a..f1fe9ac8194 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -889,7 +889,7 @@ export default class RunInfoUiHandler extends UiHandler { /** * Takes input from the user to perform a desired action. * @param button - Button object to be processed - * Button.CANCEL - removes all containers related to RunInfo and returns the user to Run History + * Button.CANCEL, Button.LEFT - removes all containers related to RunInfo and returns the user to Run History * Button.CYCLE_FORM, Button.CYCLE_SHINY, Button.CYCLE_ABILITY - runs the function buttonCycleOption() */ override processInput(button: Button): boolean { @@ -900,6 +900,7 @@ export default class RunInfoUiHandler extends UiHandler { switch (button) { case Button.CANCEL: + case Button.LEFT: success = true; if (this.pageMode === RunInfoUiMode.MAIN) { this.runInfoContainer.removeAll(true);