From 515aa367bfeb542e1cfa888ebf4b86351e9946e9 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Sat, 30 Dec 2023 10:10:21 +0000 Subject: [PATCH 01/19] VSync BENCHMARKs and avoid AdvanceRandom in tests (#3867) --- include/test/test.h | 3 +++ src/main.c | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/test/test.h b/include/test/test.h index 918d00399b..72bc36ee77 100644 --- a/include/test/test.h +++ b/include/test/test.h @@ -165,6 +165,9 @@ struct Benchmark { s32 ticks; }; static inline void BenchmarkStart(void) { gTestRunnerState.inBenchmark = TRUE; + // Wait for a v-blank so that comparing two benchmarks is not affected + // by the v-count (different numbers of IRQs may run). + VBlankIntrWait(); REG_TM3CNT = (TIMER_ENABLE | TIMER_64CLK) << 16; } diff --git a/src/main.c b/src/main.c index d850bc27bc..1f2b712750 100644 --- a/src/main.c +++ b/src/main.c @@ -23,6 +23,7 @@ #include "intro.h" #include "main.h" #include "trainer_hill.h" +#include "test_runner.h" #include "constants/rgb.h" static void VBlankIntr(void); @@ -372,7 +373,7 @@ static void VBlankIntr(void) m4aSoundMain(); TryReceiveLinkBattleData(); - if (!gMain.inBattle || !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_RECORDED))) + if (!gTestRunnerEnabled && (!gMain.inBattle || !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_RECORDED)))) Random(); UpdateWirelessStatusIndicatorSprite(); From 00e7038061b823c6aba314f7f05cd38777a9c9af Mon Sep 17 00:00:00 2001 From: Katy Date: Sat, 30 Dec 2023 15:29:32 -0600 Subject: [PATCH 02/19] Pokemon GFX Upgrades/Fixes (#3805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Tyrantrum GFX Upgrade * Duraludon Pal Fixes * Zigzagoon Sprite fixes * Linoone Sprite Fixes * Togepi Icon Fix missing pixel * Gen 9 Pokemon Icons For #3553 Did a bunch of research (looking at how old icons generally look) to help decide specific icons to choose from. Generally icons are more 'chibi' like, with large heads (exceptions being 'scary' fully evolved pokemon) and the animations usually move up and down with some character. Some touches as well. * Litwick Front Fix Missing Pixel * Krookodile Front Fix Stray pixel * Switch to Shiny pal Switch to shiny pal on Tyrantrum’s back sprite png --------- Co-authored-by: Bassoonian --- graphics/pokemon/annihilape/icon.png | Bin 624 -> 475 bytes graphics/pokemon/arctibax/icon.png | Bin 412 -> 408 bytes graphics/pokemon/armarouge/icon.png | Bin 455 -> 476 bytes graphics/pokemon/baxcalibur/icon.png | Bin 567 -> 501 bytes graphics/pokemon/bellibolt/icon.png | Bin 383 -> 326 bytes graphics/pokemon/brambleghast/icon.png | Bin 502 -> 350 bytes graphics/pokemon/bramblin/icon.png | Bin 338 -> 323 bytes graphics/pokemon/ceruledge/icon.png | Bin 413 -> 458 bytes graphics/pokemon/cetitan/icon.png | Bin 416 -> 456 bytes graphics/pokemon/cetoddle/icon.png | Bin 369 -> 327 bytes graphics/pokemon/charcadet/icon.png | Bin 332 -> 319 bytes graphics/pokemon/chi_yu/icon.png | Bin 531 -> 388 bytes graphics/pokemon/chien_pao/icon.png | Bin 511 -> 463 bytes graphics/pokemon/clodsire/icon.png | Bin 468 -> 361 bytes graphics/pokemon/crocalor/icon.png | Bin 418 -> 375 bytes graphics/pokemon/dolliv/icon.png | Bin 364 -> 343 bytes graphics/pokemon/dudunsparce/icon.png | Bin 494 -> 423 bytes graphics/pokemon/duraludon/back.png | Bin 642 -> 600 bytes graphics/pokemon/duraludon/front.png | Bin 951 -> 891 bytes graphics/pokemon/duraludon/normal.pal | 4 ++-- graphics/pokemon/duraludon/shiny.pal | 4 ++-- graphics/pokemon/espathra/icon.png | Bin 533 -> 466 bytes graphics/pokemon/krookodile/anim_front.png | Bin 1618 -> 1626 bytes graphics/pokemon/linoone/anim_front.png | Bin 1001 -> 999 bytes graphics/pokemon/linoone/back.png | Bin 507 -> 463 bytes graphics/pokemon/linoone/normal.pal | 6 +++--- graphics/pokemon/linoone/shiny.pal | 14 +++++++------- graphics/pokemon/litwick/anim_front.png | Bin 597 -> 476 bytes graphics/pokemon/togepi/icon.png | Bin 337 -> 353 bytes graphics/pokemon/tyrantrum/anim_front.png | Bin 1823 -> 1774 bytes graphics/pokemon/tyrantrum/back.png | Bin 625 -> 811 bytes graphics/pokemon/zigzagoon/anim_front.png | Bin 989 -> 999 bytes graphics/pokemon/zigzagoon/back.png | Bin 679 -> 619 bytes src/data/pokemon/species_info/gen_6.h | 2 +- src/data/pokemon/species_info/gen_8.h | 2 +- 35 files changed, 16 insertions(+), 16 deletions(-) diff --git a/graphics/pokemon/annihilape/icon.png b/graphics/pokemon/annihilape/icon.png index a516d2d5e92c9c6eeaae7cbcf78db5b93798e6b1..561a4afedd2003b1b1b6ee3e3941a15adca8ebc0 100755 GIT binary patch delta 390 zcmV;10eSxL1lt3UBnkm@Qb$4nuFf3kks&^R0a-~zK~zYI%~Zjz!ypW65{Uzc0kxUnlV=w&sUePk zyK_gIhH-gNy~?>A0P`y8wAd``=%A^eJH$_C2Y!$m6!pEZVyZ#d{|P9^PC~+xwtzqk zv*L1~({M}}D5Ta3xD+R&20b+bKdcs9UB~&C1_g+YT582Al+d3q zLVR&}t*sCxJtgK(0;arvGVP{p!7==Cgx#R#ul{U=*v&ThOnq#@uZ~X##Bt|ClKS0z z$av0&6d;>?7@O;LJ~X+P`M?kP0LDW;93RPtsr`5PklTOBhfVvZe8}y;=0k4(ln+b$ kFZqz$f6a$9emNih0QjySnyVIJuJ|J$X(C}^^~W6dN{pg|K(DgPWmz8^DmpXj~B#pQ;sGw9V8 zZSA)61~bw;9LC}bwT0eVGad9j6IX!7p*PpTEYUSJ)*UD_V#0P{f2+gZfMY+M`*a)V zw3Sh~iaUWl^gRQHp-qpN;Z8kLc#d@DGul%in|%{2Lqp3Iaua43{zNpr9t-j&G(^OH z*JW=^BZ6Hti5l#BN!7b#0YR4wpU>yQu5Yjs;a6C zO*X_G>ikaCF5tg;e>_WMU5uLa8k(;F> zcv}1BZkcv({lN!>n8*htKBQbzAn;)WNLigR`QQkO?VDPAe`H)Td~O>b4#ND#hw{jW zDDc3C)Vw(P(6$#!kHm-LMVZ6mgC5I95Cg>GgJntz`jJIG^!!CyY~lm9Px=o&uoE8m z5CKBjgAc0+n@HvZi4hPpI%)9%&XlkV>(s>uiq`0Xzz0u}@sRjnu*rBh`LN;Pfe$+# hp7~H-#&>-96#>i7EuMx0K#*eL+SI%a!U##u;iCi>3)-^#K?Xz%;5NB$}ukrm+@f zRjE({&5{Nzcc4)Tzz=NZLrDPk3@8Bu0bvV>i0uJ&V4klWL=g3T3rI{rL3~;{yeOJ~ zf35ywpEvm<(0nvP6*XyKJej-VlR$QYT_+37cY^GMIqDGKSqAuq?Q#+0i=v)g3%@XI zHBIAtQ-=5IuOHEe^I>cMJRes3r}?nA|4BZq_K$oxxBopK2KMjyFtC5*!_ofB#{Q{$ zu`Em2KhFpEb=cqQ*$EH(3r+yHfA8ZiL~j4chgez$lzToD4~S7dL_iGv|KeV~uN#QYuJ7mD)GI5p?yXCz9 z|D%uT1s1Q4$h^;BA39g~{;YFvzpZU7-?dNi8iPb=_-sxN<+#HfCp=o#y~=E9h+P^2CquG2K`ftfIZ|jqO#n=TgT+ zr(Otm5SVlCm#FEkoIpwOUzN!l-hE`*9=^(Z!T-MfKm7mvS@^ZRZbPg60_L>(7y9<^ zz8`HN7YSuTXU1o2? YxK~`}dTQLGJO&`}boFyt=akR{0E8Ty0ssI2 diff --git a/graphics/pokemon/armarouge/icon.png b/graphics/pokemon/armarouge/icon.png index a1b9e9b90fc897537e646e1e689f0abf32d5c02f..2a348cab51a130f8eec2bfa789c5fe4b4066eac0 100755 GIT binary patch delta 391 zcmV;20eJq$1Kb0UBnkm@Qb$4nuFf3kks&^R0a{5!K~zYI&6L5i!ypJnYZTdZxc~pR z1x#Znf_th{8RO$L~J?`#5voDKx%UpqpY_LKQ@5BY;RJCewuBuAhk35D66M zML!J-!b2eCFoj(rYyotbfTbtbgdBy$YIKPzz+&P8X;FuoOr?xA!+2{WouAr9krYi~f_@c;kq8Jc^T0_nDglTJD&wNveYLx_*#g8;C{&1}bjn+@-iaQ%qr zb6kuLr#^Q>Fe(ZHF~xzQS|kbh9G(oQE(DmL4EGTj3c{)UF_LgBe zN23ss1m>W&G3>NXIw|3$hmDJZvCB%pu_tN0bW+|J6^(1G7(8%*> z=h4h_CcRNEG$X_uKU~eF}&g{k?dIOoXI|F&wAHD&NEgEOT SS`a1x0000yTQty{j=M_ifuhTZXmNi%3~GEQzG_Y=EAy=*iLaQrI0)D+XP@MHB{n z9xdj2(J$z3NHq3h_&d&k7ZYg`njIw-(W0mT1KvnRhYI@!zBDpy#;NP166oG&*IC1V z0>)E>wiW$d;yzKhfrnAmDZcH6^;RV$Ek&c-}m z8-8+~(M!%p)~U^;jJw3bB(qLBZczO)pc8H_(07!^v@r~CMW;F1PJR$Kz~RT32W|CH zGOkBmJ-fToyu+@{*Q)B`~yA=@elZLiGRq4A^rg$YW#CcXUvDq z)9_0^aL5P0hco>=7ijT+@qtG^)c9ZcK-0C>V0AvU__w-43ylvg{&ojQpJwMnjsF0U z8y`IWJn9(b$p=!`1Ax5wz_acEQMvG80g#vv9Uu!nyfX0zeE0!mmLFdR;PQnG00000 LNkvXXu0mjfU&6~1 delta 485 zcmVD)u)_BL|7~ZuYz%u*^VWx=sERt1u`zI#<@d`BAN;x0vslg=uN)?# zIcK?a7?YJ>$FO(tkjxHQ6G>uU6je-V_;N(ozag=g9X zL~9XiP#txSNT{QQ7t<_!#}G7NPESB2*w7Q5k?P)t1_C8OamtEMw2 zai8-p63;4AERLZA$jB{*=13MkEno!E={=$x89nyaw?fy%S(heNw~dFzj;aHCtO?A3 z41=X4Edt-eZm4tGe>VI|+?=q*PYDYsiju>9!2kCWC=S^N@GKA^)cZJXGUS{T6==w{ zPMRhu*a_cFn`b%J!0RD}RG*%m=~Zz%x_p4tAMtUg4`E-fe?BZbAKrI- zz)i0D86R->H<7LC=X@9da>9oZASVePAXj{_TRtrJd>}viTl;T@Ft#xBA^DqQl`rM- zIy|@$5g?8a6%XyF&EWvj@!$zV!Z|)PJbVb#XV6O&Jn*f`a27{CjD{0F$aG;2e3%Q6Bnkm@Qb$4nuFf3kks&{S#7RU!R7i>Kl+g}@APhwXa`C~m{r|sR z3plq?aapotSvarvP(<`D%j6S88HU@o<}*cNWX%oNkO(GPS2DbfBr<_2j1)UV7$y`4 zg5(J{UM)~Uas;v`P*fl{XJUnRq+73P2;r_cLJWnb@UtPdz8d}rDf59QurKK0n!(*# z7HS-VkzdbQM;v)4lo9O|-T)PHdk+Qg!u5)o2l+0EoP02k);OR12D3jd`s2L002ovPDHLkV1lUQWhwvw delta 299 zcmX@c^q*;h%0xq(dV!K4zu^C9;H=`NDGUq@?>t=`Lp(a)PPxl<*nq=rwwtnv%D(@% z{bF}doi+ci=r+#1zxcA8s-`_S~ z+HLWjybKQ<*T_9s@K{iAO2!jc|C6cf3shD3>!b9KFrJSQ?3UJ5alXNsw{?Pzn@K~o z^A_d=3kLh<*O{ELSM@gvUuE;qukWim)p@653d_nee#HQV^69@ga=z6iUjNe@y7J%V z;Io%*k&VqV%ldjF^_w0OpPlYp7bB-bSO{|2xxSOSNPHCz_6U@;5vs2 rHGyhgXT?StfqvGc(>^Rk&GK?PLd7pE{O5iU=ywKBS3j3^P6v*1Kt9VBnkm@Qb$4nuFf3kks&{S+(|@1R7i>Kl+6xl19FCJ1L&lr1kuJ0y(0zKmF`W2h@J?u zb=_LoRB$3_O&dU}sE~nB5yON7Gy<3iLO|Gi_a7EPch5pNQe2J16A;%~hEW8px!RO+ zBQO){wtkLUYBFNoTgE-r!HR?>;p@Zqm(?I#743|s!R2JYdJ}GJDsp`%e0}EM+sgWp zt2>mr&&&t?u5aq<{9h3NNcbONihsz3Ee0OrAM_D!-Q)ka>HqQYKLFUd8=RD#rwIT6 N002ovPDHLkV1l$HeEa|a delta 419 zcmV;U0bKsx0`>!tB#|*Ze-Lz1PE-H?|NsC0|NsC0|NsC0|NqS)vXlS-0cA-KRnPGcCf6UDQFDGkCN@D^H zR|2d8#YH0^2=)jz;|~=Nt2^CjyXIJOF21Za@+MBP4dC2moCR zhKyh|$go60J~CKu5d>oYs7H4l1fW4gqfE%PWb9!Jg8hl+G33eF_=k`{ZbGum`UJ!^ zg699}v5Q;1g+zBuf8mKNE=_A1Iaa`m{vY2TKk-8z|8qa29zO9y)kE{c{rN}T;~G>y z+yub~WAPrEA211`-SN&37z9!EfYA@=1(ABdc83Bnkm@Qb$4nuFf3kks&{S!AV3xR7i>Kl+g;qAPhzGX0(v||9`vO zq_8ogZ0w;h8d@#A2dx&5$X)+gIPYcNkvA3?y1@t>#45lJBjAM11mHP5;t0m>9q_l2 zMZ@QUz&SR%iGaTvOmc`m5d<_w7`~eFD}9OxG=Me(t(i4W;cG2c!EI>TNU&XOl$vK( zs*5}c^=p-LJJn3F{iE2%cir_x;iWC}I7}OZ&>tcjgU}C>XRaF(0ZM9&L|FT(yDH+S=-M;9+7VCK<(dfm` zQ@#$R6V}KuEnqZQ(I*yXrnQ5W>D2k3N-S}X#Xpkn95=O4m>?{{d&x=QWSrZpxlEUi z$O}7cyYTpt+0C4f48~dt|BtKuJhkSl`ajL8$7lOp?B9ik$9#RW>DHVC>yA~G_V<#@ y%R4{++#r4Cx%0YgTlpd*ooCEnXY!XHmsa~PoOEr5{#l@J7(8A5T-G@yGywpS41RI| diff --git a/graphics/pokemon/ceruledge/icon.png b/graphics/pokemon/ceruledge/icon.png index 7687030bd74c1065957a884595b998c5feafda6c..329d5ede3174a7e2deb717d8d220458e3b56b175 100755 GIT binary patch delta 373 zcmV-*0gC>e1Ih!CBnkm@Qb$4nuFf3kks&^R0Z2(iK~zYI?Uc=K!!Qhkn@Kv!5a0i8 zOL@g&FS2v!2JA4O3izvj=#Y=cFC5?wXnO*F1CY>77x0*wE(kzFBTN?nlz$G@ShRq< zTSP4DD}m6gu_zGXs-9g+0MWuDyYwNh3<2eRR?#pi0A6!KcWzqU_a)dxAtvR0Zow6Q z8-Z$z9Et>G6f1Rtq|9*~YPrdUfMtCoL8(~@({}@iXg*LDaSBQ~F${{<#7wAPe`)2L zQHm4bz2#>>BG`zfQ*tovlG#m%p$EK*v@mwoU8y| zf*ShIlK4~&)AVJTzkXJ;pTMpC+f9jJZ9e?R!@Kd2cG|~-U>gtV{%`Scb^ja>h5P4t zDBM5C!(i^yKXW`3%VviU8Z(_;n)@psdfrsl9r9se?jau*<{t84b8rj%Y(6{zu8AD* TLKDsq00000NkvXXu0mjfYq_dU delta 330 zcmX@bJePTb%0xr!dIo`#Aiv=MXyB~krYQ^zj69w$jv*eMZ>Jp0J7U1$k}T<`@a+Hp zGWJQ^-l=W5l$YPDtU9rx$1u72cAP}oe#U=#2Y3A8S&`x1kbK)knn6NY8TFG{nxRr?Ek|Z@7sUZ0g3uTdm9Gb Wy|Nd*mNQl`0D-5gpUXO@geCwfG?{7u diff --git a/graphics/pokemon/cetitan/icon.png b/graphics/pokemon/cetitan/icon.png index 81cf0a3e246e355c96c88e3122a61aaf9a81f28f..2a0db87041a92b6a36fa69c4337226477f14a598 100755 GIT binary patch delta 371 zcmV-(0gV2j1IPoABnkm@Qb$4nuFf3kks&^R0Y*tgK~zYI?Uli@!ypJn6?TpT|NpnW zfF@C6+UerGO_@nM>AgW9dYaNNhERQHpzcuF7)aIAC?Ae%S`}dgJj|j^#=U>Xa}k6~ zu$((xPg-l-LGdgkg_KJv+*W`?vg=h`7ow}~j_kS{ED?D*XMwrmhnlndV6Zx`4X8bT z0zKE#O66f}O17{Wa zWljJYfkwSkX>Vjm;4e|p0^7wgq%?(!IV>vLy;Rq1j?RQHd|F*qc-Ewk0#ydPe>E`mJ`PkccPT-dxn9GY0T=RlEVwTE?wftel?*x zQRV1`VDrQ`2Wk)GwreJ-h9pbBYxJFT^lapl%m-&$+4lDDK4vLsb#Tjuh<}E%Kc)Zm z&+j-co94V>M(g1ovCRcDP9}-*8AqKtl&IFd)A~$`VR^gbpGAj{l($c8jN$uy(7~_0 b@}5JSmWJ5OrdqcP3_#%N>gTe~DWM4fg~Fa% diff --git a/graphics/pokemon/cetoddle/icon.png b/graphics/pokemon/cetoddle/icon.png index 330b5c56d24fc839754d4f1557d77b40774877b1..b123bf1f8159ac12e4c5b3266a7608cb5c99af86 100755 GIT binary patch delta 240 zcmV=W7Bnkm@Qb$4nuFf3kks&{S#Ysd#R7i>Kl(7y2F$hC1cw;dC|F;Fw zlX``uV=MK%+JS)dIF4KYDobsAf&i8g6AHu=VzXHBK?y$+7M0!u3QuGJRF&#;nyQhg zzKPApnPB|@VHhL&L!15*6SzHmNT`%ROhxx2gB+#Vg{8r$#YJL>iymp$kbN?Oxyb5U z&#zef_8Qvzw{D&Kb^PrE{to{Z|Dbz|zjp}yRZsjIx=h^H!6*MM-0JNUf3$FWiD(k| qv&Y|mDkBeoE%1N24=a7=JUjsXj|@=UQa?EW0000wM@Y3t*{8{+HcGxBT*RbtJEeX7A?%XCHX!9)hZ+y;HM>#he@ z9l4`)WFz09e@5LF8}0jRwzf3r?A5)(8c_1Kev^9A=IOQvzI$B!mYHGNu5e4Q+mp@l zwhkB56plB=r9y)CrzhNweICp`s$yK#}^lWYYtBo(yRi%t3&#e3@fzOP?B6-u0!IAo|zNSVj- e$1)~Bnkm@Qb$4nuFf3kks&{Sy-7qtR7i>KR5236FbE6IzuD7qPG(`%0?G>i*8&5{VafXJsj!R-{DUGY4S?HO!qVWSf~4w{*VIJo-X5m7;`_g i>Hcj$H1WUces}=Xa1ObVnidNH000035N delta 247 zcmdnbbcShy%0xq(dV!K4zu^C9;H=`NDGUq@yFFbTLp(a)PT45bY{283DPa@&>;L|v zX5Q^y2Gin7bE-OJi?3~~UD?2Ge_4?sOl(pA`mG7;R{Wm*BWF{KQV8QQj!X4hCoFt5 z-y!Y7PhCfW(*L{)CI-)6vzjnST9-~YUMj1Z`{y0gf{*6|FaP>0ZE_$bW$H!UDY6&m z=WS|NiMMp+DvS-A{V=Xl>E8d>vE`o*%Dt~Ccy0gl0aFUc#{2sx@h3K|{ qQ2{&07@IR&a&3ISBnkm@Qb$4nuFf3kks&^R0Rl-xK~zYI?UdV!!!Qg)4F(xRGV}j` zyCdh)u5W$WrBJE|2Rvg*w!%s28~+sKV;$fA+2I1X1#Q1a^kgkr%c3kI_^_tfM zw8P?4sI4cg*#&ciD}{e-*z}?t$3L~o6TlTIv39=DCl<_e=}6|yH2z<;MJ-x!zeYw zDvbK1eQXRtSq7jIAny!Cv!^DSGMMHDa|ogh4$T>oe+juwpLg-(f6SZ}Mj`h$gI*V8 z(>Z7RMKbA_aRZxbI-Fes(-D(JgxS)IJ0FLho>L^Hjd$+xL0 zR%&dbTSV!e)k*3}fAARQXd6NQF}z#&OFXorb=*UEOA%l?G|!Z3IRlG>{ryh;ukjN? zG<_EY^SZ2am5a7BlsmiE3nCm4y8sOk8$>lgEch@0BJg1eh(5v!5Q9DeqUXaJ5P={o zKtzD70MQvXfOs+tfS~FA+m#D|potGFKnxg0hyaMd2Qy$@HxUq_6+noBI|UH<8~NZ! r=m3FbM?Q>%IQGY~P44*c8-(}(*!L!oHOen@00000NkvXXu0mjfB$dqI diff --git a/graphics/pokemon/chien_pao/icon.png b/graphics/pokemon/chien_pao/icon.png index 02d7bbe93d9e55aecc0d6c7157d9379b06038add..eaad400548515f66f40c5f88b2440400036f8e76 100755 GIT binary patch delta 378 zcmV-=0fqkm1J47HBnkm@Qb$4nuFf3kks&^R0ZmCnK~zYI?Ucc?!ypJn18i6*{Quwf zqP0=9?Yi@xlgT7rxPp%7y8hB||DrRy&q3>7=qggmYc?iqj&Hi+#eLS5d3^VY0$oH% zhJ`zi@Axs1(3#ex5v|5h#q8133sdizPP@({!24OLC%tmlWo-799DLT_4KG|i1{|FK$1jY0ZuuAk z5Q!j(FaX4KbvD9;J88>;KYXjNOaRuPkcZ?>-PQq_8;cM Y12J0)V(8msm-H|)v%Dwcp)RJLXjtAQ3r!l#uXe^>&k^S!s=WrVy~ z3Rr#Mra#0UFc(4pyjh8tCWAtQ#Z$Zqz@@3;A?QV**e1wudz)ajVfbJw6G$}$+yraX z_0S9#1-k7kA-X$r4dxK%ump;%=_zZoq@L%L?#6J%(p-8v_1ti)%eCFp-d{ag;tFcd zxSc%czG>n@-q9^?f8SH{oh=2P;<~^|r=2%5p}6*@fRNDex9FcF#qgg^hpdQWY{IaY z>r>EY{ow04mn4DB(%SIkhT!FH{=)dP{0Ia|`Eemg#*avloF9Q8Z~R!-|CJv>k@F)6 zHb3rbRNVLx0Wt{^_;CfuAjsrLTZ$V%5`NqO^2U!1kjRgBBY-GBJ^%#AKR{L;KLN-W Xy#yiGGeR-_00000NkvXXu0mjfR6N;` diff --git a/graphics/pokemon/clodsire/icon.png b/graphics/pokemon/clodsire/icon.png index 09fa007c68146e54add8b59c716533258a0e50e7..bcc0e34e5047df603c7fc74c7cd3ae5ce1c71c5e 100755 GIT binary patch delta 274 zcmV+t0qy?O1L*>gBnkm@Qb$4nuFf3kks&{S=Sf6CR7i>KRm&2CKnN2&z<414|F?zh zT3uwF-r9qi(Sr%Fk4apX2Y(6#?nq;1s}%q-lR22HKCRXjw5~1zTk6yKCg9cBh?0P) z(ScAn1_fvUhrn(GQBO&LQJ|{h2=%YxFYNqf7veB+R>iATMDsSyq``tUf6__8hqkqS zdv})=Hv&X!jYAgA<-4TU-CXE{2j2rbW^}XvG#|RXr}=QUf0YlgkNxX>7_3|5LvsH$ zA3)juDIX3Nbw1$j+o*H<7x@6&-st|m<^#6vkd*mwQcUszeHA`nk`G6KO!MLPSMXE3 Y0ESBuNTHPSSpWb407*qoM6N<$g0K37HUIzs delta 384 zcmV-`0e}AK0@MSLB#|*Ze-Lz1PE-H?|NsC0|NsC0|NsC0|NqS)vXlS-0YgbdK~zYI z?Nq_8gD?yOCMD9OIsgB+OPaJv3+%MZo}Le^)UFGx_O|^bL}VE(GytiCWic9Zu&^w5$wipdGLT4f!u%ueFY;F1X6?n$ykT60U?it zDyJvobWeqZMy-9D^&qs1g9xi&IaMa0dp^8A@c;N4Zu+7B12_E;b#U7c5nkN&LkVx` zhfM#6@Va6aoclp$cJ|y4r*s#P$G?U*@;&!M3GWDa?T0D6wAX}rKQNvO4=)Of9zaq0 zrBEBaOcC9>;5C5W52Zk)@Zn$~E(P*5cND($Ll(%WnDPXmS|Gh+toJSo!Wv-|$Ynv) e0@?m(LA(KI0w7B=JZKlu-}DFbIU#(ZWL$?*IQ= zfxS4&W@6%#BSsVN+dn$HT=ZmPOQG3L4lRsTKQy)f{_XltS^^kSK4 zts!h`J^nE91~gk*0VMRP-_{fVHU0~b;-9y+#6MjSYy6=Jc#D6;PjBKMvn=bf_T=^! n|BL&<9yI^^`+@%Ves}?J;}h#up7O{H00000NkvXXu0mjfZYqjQ delta 334 zcmey)w1|0v%0xq(dV!K4zu^C9;H=`NDGUsZf}SppAs(Gir`+yqHsEoYZLv{a>+GNZ z_ur|6gr01D_jr-1Ld&xUEKJWo{>WynIhnmzWlFq|i|J|wbHnb2sM0v0HA_Xb^p~#V z*!sTZQ&70e{*CFW*PXU6?q!~GR;7U_l;v7~{lPiCx0K9wZe6r9I#y7ZU)ErID)%lS z<|8)Amz{*SocYsZUQqWk$8fXz4@3V?Hq-RJE<4C)ar-EPii)nQ*TH+KXG~kn89Z&P zrfV+W{W|$Y<&OUOtga?U{xXD}c76M3!nV^NXRUdq6h8fkx5J6YR{z;c%k8J+*B!|J zd*JtP#dCEo67vrow)<zr-TA#0fUEu!PC{xWt~$(696G)q9p(T diff --git a/graphics/pokemon/dolliv/icon.png b/graphics/pokemon/dolliv/icon.png index 37bd0eb19f1d51fa3d4c440150b6d3c5642c160b..932b6e62ebc351543ed626aecb3dd60b00a100c2 100755 GIT binary patch delta 256 zcmV+b0ssE&0@nhNBnkm@Qb$4nuFf3kks&{S)k#D_R7i>KlerE9F$hE*EkeQ|=KudT zL$+8c@lkA(VrhBi7(A^#@f83XR{7p76$Os-)_YG?KocVdW|k>RCXe2K2?QHRMOLp7 z!MF8ZgsnzE1M@~m#a?NH3e3Ap0cnFg0de;zBFCE|4ia2MCvw3+;E2qbp73x-#9VJ{ zY7sG-@7g0|TK}9vZ8~CIQBoEaP{*RsIyrY8BPo;2b!d>%aUp{Q$5;&c`D-|0L7db& z|HL-1v46Syru}1Mf0o$TzdiQ9_PA&Nzw!Ul{`J}Z(*AG!%@UrR=l|gV0000|it delta 280 zcmcc4^oD7I%0xq(dV!K4zu^C9;H=`NDGUq@w>@1PLp(a)PC3hU#DJrPTidC_;{E?^ z)=}Tu!!}R9w~ejpM2%sZR^ILTtPNZ9p8eRMKI2!x(RF;r)M*M{FRhr&$S?FK!r38l z;=!1uo{s$L{pD7xL+<&j@4DY*(&bmm>GV8l(Jr@-JC$E#r%d%M2@B#%$huy8hu!~w z*14rs$5{){w{NdI-@Zoh^iPJLv-nLPuK%g9Vr|#Qh8J8yrN58r6*-u!uPDs^`KyBI Z9H)42#$mo6&Onbcc)I$ztaD0e0st+jhP40y diff --git a/graphics/pokemon/dudunsparce/icon.png b/graphics/pokemon/dudunsparce/icon.png index e2a375ebf8fe99c2b03ad1417085699dd2246748..cf9c3501fec3e85400f755c75c0209d4cafef313 100755 GIT binary patch delta 338 zcmV-Y0j>V-1E&L!Bnkm@Qb$4nuFf3kks&^R0VPR9K~zYI?Ud1ugFpyH8(|U>$>sn5 zc7d_&Ds+79COeOE1O_}l9^ZTHF0O0BRM&(-u>uTZj1^(*0JnfyJhs8iqX%f4#OUKe zkZ17(B|ei!gCa@{yAsdjI}xd1^Gr>0e;){hCVnB{dBqDj!YE@fqY>jl6adN?Og-&? zNQ9yRTmU1TaaAX1D{&y-9*!yETnp?v<8cQ?9h2!R!S0)G#yE04NeGuA2EqOf1tIcb z&EkM}z}=d%huD!HH1!kkEht1qy82JXJkN~|ckwSfe_HNo;6m=hz=hn0-t1=KV~1h4 zyHkMU=aP1#lXq5s+1-2_Sv~Czvzj?Qr2a>NYWG|J{JSjmhs#~#zxD6pXZ;(yFZ$OR kob_*Rc-Ftf|MkB=Kcn;(!pX~ttpET307*qoM6N<$f;?-W_y7O^ delta 412 zcmV;N0b~BB1MUNmB#|*Ye*h44QchF<|NsC0|NsC0|NsC0|NsBZA+nSJ00CV|L_t(Y ziS1O;Zp1JMt3r?>EyDl*w=<+^>0Os@d%nC>iVY4>ylwwKc*6Udfxaf7wYFj~zW26D z0kggmfvTFVB-GCx0~olOsTFx+K#EgfwN?|!ggumZ#Tm7th$M{}f9g@-2fzh)#L8g6 z*k#I(i$oX!yeG#KUGOtS3?byNxVJ7kyF3!TtVm& z?~%a3kzm0b2^JujGa!T`fq*N7W5ApOVH=Jv z;Oj6o2pG@SfjW<{BV+)BfAv5DeTVvw!{P@eKqUY%fL5^HV_pFjAbz*BwHXB%l$x01cptkOD9O8Gu!wjB$fz1$ux6ZJvh~c)uM>e}i}j?*V0u=Q{x2 zfgB)?MQI(l$MPBM0uK$|fxE#rPy+a;6}$p5K+~WD{L3Hq(qIU@TnIIQ1fWfz1JcQV z00P_`r~$SB*$_w35ZYud7W|^`7@yZK=9## zRW=Z>?GCMv&wW>Lt|w%G2>?lOju+V&1E604{aT*q6z(>L0eS#Pi0_{idR|F}7Knm# dkXw|M{s6Z_N|wWZMf3mw002ovPDHLkV1f`u;c)-} delta 582 zcmV-M0=fOz1cC*SBn~i8OjJcfcerhr%$(Askv}JYuPpQJ0000GbW%=J|NsC0|NsC0 z|NsC0|NsC0%^|Xs0005;NklVZm;Ipz*RJ31Hx*{UR2TxF=fVKE0G$2?I5!u@!0p^;Kz{|?F+elC8PIqP z_yEp-eFrQb9{@`~_uUib0N2xw=m}kb_hIP3p+DOPo_d6VFaywC7D%AKP+SfXxbP3( z05t)K4kSSWE^9H4fEplx1nlhy89;afFcl8o5la9EcmN+@8$gI7h#fqDuo4ph4uDt> zzPt#5$T0fY{q03@LWiU0*5Mo@Kq z0w4mg3#2mcpcuhAK!sPVhZ2w;M^)9^G`VI3i$E&l`U-$K5Cix!FYN=lES|wBAapPX zatFsi3SgxXOaULD=%50u^ub;OT-gJ}jiAc<8h|pv8W2v}00fvZ@B}yl-W~LTwg(Y^ zi1k~56yO-(-{BN0Ko~*>@@*4P1sDQ3Kz{@bw1NQS4%UHUaOc3Q18IhS2F)@gAO(1J zumQX}7>t0QM$)-os zXG}q;GQa?UAQ;1g%tjxmM?n7;>p6ujNrvhNr~x3s-#;kyzQV>j;00qKc9BN<57c;D U9v=moIsgCw07*qoM6N<$g7nDqi2wiq diff --git a/graphics/pokemon/duraludon/front.png b/graphics/pokemon/duraludon/front.png index 39e39798e9df2408897e2aed2729b5f9ba53fe1f..fd22d471ee530a6cc3ac9d62a2a6720402842cde 100644 GIT binary patch delta 833 zcmV-H1HSyX2m1z)BpU&9Qb$4nuFf3k0000mP)t-soYJIXg{(1Mi;*%Xe^*ygfB*mj z`AI}UR9J;M1ub|srQA)&?5Ovxm$4|y#K`t@}dx7+RX{BQ9i zKR5jlkUs%10oy(xFafhq07$?_Q&3U8DUV|*sEMVFW41AZnkC%aHkvR1fHWfWpfU{D z0+6o~dOckn1#GlYvt9;-e?D)?gaE`<08@AUHvrhq5khAE|Aqm!`TD=L6d3^^1*l+O znW4847kFE^@A?sdyP&zql57ybR?3oWu|a}J63>4bP62uXNEib!2pA-M4%ixiCS0#2 z)M5qrHl)ibcn>1#K3-2jx6PhYxCk)oO;FVJ9|-ENs1ooCnMvP=sivOgQ?pHj|i zSWqb)2q zQIRXRNalDRqpmst?GZQtib$3>t&MZyvyh-^CBciLj+87+e?xqcCymYbDm+l8X)U$3 zbDfG<`xN@K!Qk&@D)T&fZC8LTkfVg90p1eSUu!Y|BzS260QC}0B$m$!8czTxpe`6- z;D@C)VT|Xu0AGO5Vwqb^)8u>b1b9to3FK4>@RB=UO4+By89?_tuv4Vgjm!5@ahk#% zkW)p3TJEpDe`kPBpKHH*v~v;Ld%&t4|Ec2-fOI6FU-b^i4}k7jzlHk6bBf)(d)#bz zOdwSNXKs21+~>(2^0rQCb`~2su_jW^cU# zya^Dv#s;7Z*Zz@GAB&~EwxZ+ZQUY9>4+x)!hZX*r8}St$J^uV3xSdPawhZhr00000 LNkvXXu0mjfY$AR~ delta 893 zcmV-@1A_ef2Db;0Bn~i8OjJcNU5jFcten!Mkv}JYc};s60000GbW%=J|NsC0|NsC0 z|NsC0|NsC0%^|Xs0009fNkl8I~PU(A(6M(^~Qw(K$JAv zmGy>yFa&7C!!=nD9snRM#&!{U3`hmQ7lczlueT^Z1*FKPmLCI(o>NpZ0PLp#bKUiS z0MK|zINw5IHvj)V259pA|B;;O2>>oYh4AG7yeaP> z4xooAdoIkKCId~9)>v0=f2#T?vjTS#Kx!q$06=O%J zF_^GcG^VGfk5tmQWRr&+IzXfiuuM4wf|V8!ibby_ECApM(Dwi=b^tTGp`2ra*qPn} zUxKh?BjhkOfaUX8iAz}Zh<;*^;tBwNAx{~Ph&F0wO`%ZTCp?+EYk7&jz0rL{^&;Zt84(?0lKq36}6lIY^E{q z2z!7NeBxnL#v@>xC#%tZ2XTpHHH!FbZ}1IJ0!E#>t9Oqt_81)ytzRX6Or)Me`xC4H zLIbe%)&MXt5NwYPU{N@n3*P{srrK*OI-X7{@ydvNK=?e|@9>)dXS_;`_J98adA3}Z TllNqo00000NkvXXu0mjfx$2TN diff --git a/graphics/pokemon/duraludon/normal.pal b/graphics/pokemon/duraludon/normal.pal index 3b8dca287f..1324d92ad2 100644 --- a/graphics/pokemon/duraludon/normal.pal +++ b/graphics/pokemon/duraludon/normal.pal @@ -1,9 +1,9 @@ JASC-PAL 0100 16 -49 93 139 -98 133 172 156 210 164 +98 133 172 +49 93 139 106 52 57 16 16 16 123 129 148 diff --git a/graphics/pokemon/duraludon/shiny.pal b/graphics/pokemon/duraludon/shiny.pal index 583a51f2a4..19e7323e31 100644 --- a/graphics/pokemon/duraludon/shiny.pal +++ b/graphics/pokemon/duraludon/shiny.pal @@ -1,9 +1,9 @@ JASC-PAL 0100 16 -67 119 184 -109 151 204 156 210 164 +109 151 204 +67 119 184 112 105 107 16 16 16 81 96 101 diff --git a/graphics/pokemon/espathra/icon.png b/graphics/pokemon/espathra/icon.png index b82af0c6e2dbe7117c2da5a339c65ecb331fe908..cdca05731167ba390d13d370a03dd9899488c2ff 100755 GIT binary patch delta 381 zcmV-@0fPRO1kwYLBnkm@Qb$4nuFf3kks&^R0Z>UqK~zYI?Ucci#2^Sn9XwcS0ssHE z+n~uLkz{XEbC^D*iWUg+OzEei6nczP&h+5W?7DT>d6VS`OCdqeFBnL*wYFN!K*;hU zX|BLQ*$nCi5xFK&Bw b_dfgqsnyg{ zXZ~1%2A-BYhM@!^bc@nf=rYit?FzTUZ4(=|V2)}Ljnt-K7uiYunuZwDuutfD)?3Hs zM@dP>&LfL?*zg#mf3W6guo-Mtl$a96mTLyoe`ZK2xqE|pA1#ksyn*#`<@rpXp^oA0 z{WW>sE${j-;=ceS{{WC2@+&~{1(1oM2gnRDJwO~{27t%}F?LlhfRG>#F>3k-$VCv3 z7#)8I;t=Bq;t>PgYeNu^7<;xW#5jUX5Hk?OEpi};M@&bMIm(#fpjv_`e>^~Xf=mGN t5M%+6h9Fabv;>&~q$kMy8U6`Dz5w00D6;`ZH2nYo002ovPDHLkV1f*Z(Cq*K diff --git a/graphics/pokemon/krookodile/anim_front.png b/graphics/pokemon/krookodile/anim_front.png index 530488b9b250777d61cfbde3b94bb92fc7826b94..7b8e76e56da75962110dedf78672b8811f5b9564 100644 GIT binary patch delta 1562 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 Ef|`}PBme*a diff --git a/graphics/pokemon/linoone/anim_front.png b/graphics/pokemon/linoone/anim_front.png index f2882dd048416982d3e184a50bc1e0427c141635..5ec89b95c056ed8806189c63c51efdfde9ffc2ed 100644 GIT binary patch delta 967 zcmV;&133KY2j>Tn7#0Wv0001tU!Pb20004VQb$4nuFf3kks%s?PCzmk7#NU%crbXF zXt3D$`1o*ea9~e900000008?8;^Y7T17%4>K~!jg?U?Iw>mUq-BM?zioA-a+vyuQq z5?^xqt23ybwqvuOg)FCD-EK2x%$PCbF9aci$FIa8GJgr##F3K*Yg}bOouaAJ5X!jU z4}?boZ9c^#;hj+;<_dWZTJqd&Hx5QX%9p$Z-ow+r~}F zBtrtsJ%DSevUP)RAiiGL2@pMa3lY&<7^5xEmIL}H=uLdKF4C1~trESSQFUe5m85JT zMCjx5`6HpFiaTUl0ft7s70seGK~()BKe_D`AhCQOKuAXz`oHR}9Qi3vs#k{wRb!Y5j=XNx%`BHfm=2 z+v)(-cMr>fzP1wx`f#jvFXYzOd0|>k^eE=)*AVN3ezh#Loa>i0=^C*H99IkUa-s*o z*5KDVd{p?!Q@JhjJl2KR3(I#Y%aUaMZ~g6Jwlijb%$PA_#*Duczx>xuboM57q8BzB zMAZ4YFGAnXq_~;*Jw#Ni-c3E78;`FTc*SUrXI1i8ab$fKIP z4RQftwk;0AF3u5Re!usO?*o8CeM$A%R}YY$6AuvXncTH~Hm>&izE2Q_Wy?!``i zCh!4&0VmD1!SSXzQi>1tBz6gkP}i2Y8g-IZ0d^7}1238HX%Ps%%lYIh%jn?viNVsp_(u31$HOmAxhEo-GwC~AW1_Tm%59WH?W zcEa$mBUk#3vLr&BbQ|R|9ycl}1N?u%hS<|B;w|3rJjD6rJ%Zpgtdds6rXF#ZC&J(p z3C|A?L3cw9w#sV>wx8euDfrk!<2VGv(F|@FUxWaF(=eC1m+xDyUh!*J7taT)7yay%H#M5MgH#0KA#pD-CQif zk)amj%Uag5UTd)z@Iq65((d%EUO-NC>{>`KEHd#}K3t%5jZnB3LC{18W)AQef>cxkd0F=aKIjHA+wlPPV#%C@00 r15LAL^Fxj>n;&vDCqFD}S!w+T$W%8kMDhHs00000NkvXXu0mjf9l6QE diff --git a/graphics/pokemon/linoone/back.png b/graphics/pokemon/linoone/back.png index c0c30a69d2f3f96aa3b0d22de440fb945b714929..1c8f19af26ae4d0f29c45ed1b29d6f67c5a7ff79 100644 GIT binary patch delta 449 zcmV;y0Y3iw1J47H7=H)@0001;w}I>c0004VQb$4nuFf3k0000mP)t-sn9!g?F(J-l zA>M>B#if+q&b6F602mk;n0Rp5m;m_TF!=cRaBy(FP7MG600000>z{2@0003^NklxvgO_O<8GjiW`5yuBqmH}7Oh8qz zaKFHK$_4;f`V9=lAcot)DSZ_zEGT62n~T-c;jjwKGa|~eP?FhM5%sacaOX`xR17-n zV}tydpz}n`=DadB?}oNBhTm;4$E@ar<<)1^m><9~M9-9v<>lfO|ai z5dKK`vH&KHUE{*{6~L^a4IdXc@>GUpGR7pfZRDVdv?UO-HgFqC9(FJa6 zLVJL5qF7cJKsgQ^Hy08xtLNEw`gO=t=DY%8+JDtjyAii7*E%+T;`@hoCx;hlnsl7r zKWp0Cg5ggcC#oe@_5u%S`e<{Kz_u6A=k^Mr5KVx^bLV*!LI~zB*8Nhs0Ybvzy$x7s z&d1_32!NuqQ5dc~0sH{F0Q;E3vyjWY3$V}VuK{QSvSwaD(_nViOA5jhQau7F7ORybHIn10Yd jf?8x4{r;!9+62Kbg-)gCj0rq>00000NkvXXu0mjfxT)5n diff --git a/graphics/pokemon/linoone/normal.pal b/graphics/pokemon/linoone/normal.pal index 4f2dce5d15..11578944ae 100644 --- a/graphics/pokemon/linoone/normal.pal +++ b/graphics/pokemon/linoone/normal.pal @@ -7,13 +7,13 @@ JASC-PAL 160 136 120 184 160 144 216 200 184 -88 72 56 -24 24 24 +59 48 38 +13 13 13 144 128 120 48 120 152 104 176 216 248 248 248 112 112 112 -0 0 0 +96 79 62 0 0 0 0 0 0 diff --git a/graphics/pokemon/linoone/shiny.pal b/graphics/pokemon/linoone/shiny.pal index 37008b1e53..367107a3bb 100644 --- a/graphics/pokemon/linoone/shiny.pal +++ b/graphics/pokemon/linoone/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -88 72 56 -200 104 48 -216 136 72 -192 160 144 -216 200 176 -152 72 24 +66 49 33 +206 99 33 +222 132 49 +197 165 148 +222 206 181 +156 58 0 24 24 24 152 120 112 216 152 0 248 224 48 248 248 248 112 112 112 -0 0 0 +189 78 13 0 0 0 0 0 0 diff --git a/graphics/pokemon/litwick/anim_front.png b/graphics/pokemon/litwick/anim_front.png index 10189cd52b71a2a07b0097757dc80f10f99431ce..7de1f01b5de4ee5ed63a8b37d96161ca1af80ef5 100644 GIT binary patch delta 402 zcmV;D0d4-(1l$9V7#0Wv0001tU!Pb20004VQb$4nuFf3kks&{ST1iAfRA_ zAPhuR*Z}SS|8GeU>(xFGGo7(_vM>7J9z#lTHq+#CxxTI0>R)Vxd0A`(23QEY9Q4Im`|R{@~`V!VV9LJ)ry=^5)jSOG{`NkE)sFE@V$q@p5#U30gy zUq>LsogjW4AOV|yyV+C9<82^*9!;sMXaNUR|1jX}ufJlp0Fa>rloOy4h5>m;DBY~- zVST>z#)AA))nIJmQMY6(XGA1yjN6KWUe(z_3o zYo9ik%jI&pZmD0N0Nh~!z!Lz|03g`&yDh#4E5Mxp*9pY+{2#*N`QP)u=YP-tTiX0z w`CkV(<$vA$;GF-p^MmO_{`dKT%jLSeUj6|eF;&@vasU7T07*qoM6N<$f*yUf$^ZZW delta 524 zcmV+n0`vXc1JwkO7zqRe0000V4e5JlNysl$pK0Fx6S zE&%bSrogPrGz8}W$k3%R8t5Z90!nU>TrRUVAc`5gNGKxhZ~xmFvoiaCtJUbA>Mr4D zy#!E*#E3$~M`S|8M`U6U2MX~R-%$ve1mZgo7>oN!3>c0@x8#XT^anjDpA-)Wfk1z` z;$}=cqSr;hzSDj#We0s(*)=_4F1?iHfQ3T4MBlC)<+rU>N>%9F0|%V61`=4D{R-m1 z(lNm6830WKW*_#W4dl->utyu+4^Yn(kV7q}ci+bixgr1>YJl8v1u%!u=)W1jGq^eB zd%(d4nAZ??%sjwcn6|@n# zgMYkHqeeGVmI8`I{AY>y|BHUmPxXW0@A?65NC6KBu+i=T>?krq6#ap~^q#XHx&q$= z0u}cq&PRpl)bY=Rduu93wO?AMK(wd69+VXeENjB&Kb<)XyTpDF;+Fx=I*@q4r9UiJ zbgW$ftr=i{1{?!y!+x|i-CfGPrav^grG5aykqQHq6r7C! O0000Kl*!~7AkVvZQf zYEB8K1WZjGg0kg+DC=M}2fT-OVJA#70O+O~?Z2Ci zu-gTj+bvhx?eWy^m;OFJ2g2^5zg7A#C;bb%5B&?f&-xe3eCwa)U(g>K|MHpsam+!L cz(M`Eo<8vne9Bf#UjP6A07*qoM6N<$f=rEoDgXcg delta 262 zcmV+h0r~#n0?`7H7zqRe0001qplF?uE!w7$ze& zZp1FI+5x*jB8iXUJ29ES;FB0e21%qYCY%rkf4ey7V(j>(z3bioG4|_+*A_78E24l* ziVtKVg95H_eNFC-1dwH#q5?p;O0)*RjES;DL6a&@v*WWU->k=amqXEZxj2_4cA0Vt zPlyYEy?+v32tT{IzHkWIw(emz$LSj7OrS)+4hrmz5c{KJ4NIJAL|l?osg-{7Y5K-W zUsbVA0I;^xAx9lXOVR0o>GwKd`hyP8WzYe`eXoO2mJYn;+b{a@0F5DS`ZA+OIRF3v M07*qoM6N<$f=vK+@&Et; diff --git a/graphics/pokemon/tyrantrum/anim_front.png b/graphics/pokemon/tyrantrum/anim_front.png index 22f83b3bcb1a43ae6acf77a5386d15edf84d2ced..1031b510f4f02dbfe81bec93b55b6f77dcadf19d 100644 GIT binary patch delta 1712 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 D){Q#V diff --git a/graphics/pokemon/tyrantrum/back.png b/graphics/pokemon/tyrantrum/back.png index f857bfbfd1657320c9c45c67f71b9a701a99edfa..0500b874af0fd5f5e2ef3e7a2c0cbc4e25580f2e 100644 GIT binary patch delta 741 zcmVc0004VQb$4nuFf3kks&^R0;x$vK~z|U?bq9G zgdh+G;ML!WKr-+Dx}5`Z65MU}rWYk?yGc8rKO>-hz5d5v8H8^E#&-lUb0Z9auzdtH z0&yo`e=8VJtEhg~t7HGI(98(iCSNK%PsD+%s+o}hTLvCuWFS|SJb(i#yqQQRRA5sf z1KUS{31vcFtts|@T_^IeSPG!R0+0x^41}9d=HngE@0$VB2zeQ=0C*z}mB6NUe@Sg$@K8n!Xkr6mG#7!7~BlLg>_9GbJ!bs2~5M#JT zlnAGQV+gM}Y8!h&2Emo+;}&9wa06t=g#0nd2r9(*F+h6EUVsWANs5&2!W1CiEhvo$ z$q^HDwLSq%RHSA|y?n(ahmPS`00%W|O0O0A5%u8oUt<~J0&vLCMX)u3rU$PY*aKQm z>?br@APXOV0c>Xk{IJ3WTp4uEv$fO)P{95icF>ncXs%{HeLMh1ZkjmFf`*o#-BDCWi$+$n_TEeNlIIm6lJ43wR|VpKx_h0_O(3gI1Z}6zQBL5qyk7d5 zCqS;EZu7!tb-;I?ZD0YQ-}3dNJUNn_dgc7+b|G@DR}Bu(Lm9TJT1*;OSYE>T?=rbG8Ih+@(l_- zW$#EywpmHux+FIU6z|jj|Ky3W=UCC|8jxHAU`_({BbbvweFSDCB3Lt?%t>&u;>mw> ziY4QaAP`S}pG6?J;FBI4)&LyRNsoxyfWVYQ1dX*8VwjY$k8Ru9Czz0kU0-XHj$c+R z1QOZpk^(mmmexns64{LbGZ*2SL=Ma!5Sqh@)fDZ?I)0oHBr~ycfww%WW z0y>2ZNh;O!5>E!-GR%(|bh^xRUtNFPg>k$C8ofQ1MF4c~DbT`f%5vBBJBx+ZmNb-D z(zC?sL-YcTaVD7<0BbcKTlE4)EAR2P1FHNkh2Q4=suR#2Pzg$J2-r#aMZEdu=C<%| z?m^Z)ATud{5n!p&_@fU%nM*1M(5CvR17PQfdT`Jo;7sKG7@z{6I0w`QI0-5B`_0oLg}zuTn7#0Wv0001tU!Pb20004VQb$4nuFf3kks&^R17%4>K~!jg?U;#f z<1h?FE$VXE^#6Z%Ii%#PlI3iH1r`w76uD;1p=H;8%Q9=$tXcoC935YI??01!7Y+vA zhv1%znHDDsF(9HMztwYnB3(PTaAZ;mk-Ffy=zTW@N7AjzW=R_77^4`Z1R*}*l!CkK z0tRX#YLP_eBBd06spw-&!K#-+zCtjN+(<4qF-6tOE86v;BWD=EgQ3yBougtPFH%hM z9lYNj0w;uyY7^AMg2W`HG4QGHr;rhuT>nDBtfHvH^n{O1?Ok&U;-K=FEIC{xgp)T^ zFAxYq&g`pDXeguw9BA^0MHXRM@_1FdULCf|Eu(zkNf z5LGTkO#`V6{hma#OE2WrVUu_D=1{825|PPD2kjA5gQJ5EoD#XJuOXVtK$435#pb|- zqe%`Xk!8~}4ky+CKO?Lwf~WP1iQidQpENF=JKZjoxrr@ta~G^RubB21!JzDL+8d`m zxtKH@5FXQiet+@17?jDuL7z4Tf60K#?@jOhw$Hk|{xn3Zobz$T$qcAWW8@%vOJr+# zlpd%Y0fgzbR?pR8)gNtuwh`)sc_3E@(J~&;`)!0s@IE9F)8u@$uQm+PP&6+i9)~s3oLw!sSmJ@&YkRF(3=MO`A(A@maABObcN6EFN z-}%Fs9vn8i@e93R(;Ke`^k4%Z7k&{g`VKuf0+1j4qVR`XdawhK7Qc8v4^9B2!7t!& zOAju80OZ0iaN#!H4i~F0fJ^m!2OBR07*qoM6N;t FV1mx=#e4t& delta 921 zcmV;K17`f^2i*sd7zqRe0000(G0unLjZxrno7>UImszZ0 zOsc{w8P4dG=TcT@C}Tuu-{o>Rd)BhS1{`VOX;uqhQ_m@^ks zW1(YDo_X1Pf^?Kzm6*u0nChA##>;;*T{1zINGUTB$`NA9j8!U6N+l=rEMZU{jM&>%7 zMM|nbgoV!YUBSz$s;+cCr*4+brcpI7-s!FO~->IMs z^n75fZxc_}N`3l$O@F1u30j2UtvivLUwqh{y&2FTofcuJ*7Ttk5nYDT0caHr%GGM6 zQ~`R%Q29>hb`RIZx=@Zjzp8%(#ybTAeSyOwn7INFiGE3+QP4&@&k)7Tu?U_dfHtUv0XNqyAmN;r4CX-=JRUt5bM*YZ<_C zdp*W6{)6b{18pS_@quEN)cF=4_IESj9X>Pw5jY3*JAANq02yflboqavg>nxNM8Cs_ zjZp3Zg2}Yahgv8NK)QU`2&DlCPFsA~3I(?S5mB2DJE7nfAZL$p=#?TY&8I!4%2{AT2(aLa70w=QsIa z3S|Qjwtpj-La71Lez||`2_>qBY;~yeMkw@hhqgdWp%6fP2CcXAy-*5Q)Bx%7pj0b; zfj3Ax1P~s64ynWmwgBn+;Tdz*;{rASIphZolu|hf&B)=9AKZk50wqG951yaCx55de vqVN4~Q`c0004VQb$4nuFf3kkv=|u0qIFZK~z|U?Uvnc zgD?z*D~H&~in{lI+u2S?OiCbZ7rPj~psLFGdi)c^>-EGFPyEl|-|F!W0nvQ{z7K%t z2%u6%1MnmTq9XtjD**KhS5h?h0%!zKE$W4E0w7AcEf#|Ez|@6u2~a`_CdpZOfHfv+ zpa5W&501>NBnP;EHedv;p^5P)0E)Q;QN@@I-N?ZDuTIN5c{JH4)q5G7;Yu$`lo-G*GmUU80hte@GfAir(Ak7A)*QhVGkJOzcsF|0RX3W ziH!8MXk8;JtT{Tl|aPHzQ meJgsdTl;C|x%|Xm#5ajc9ldX{Yj6Mn002ovPDHK)LSTX=G3?v` delta 608 zcmV-m0-ycs1g8a%7$yV*00013M{Ml?0004VQb$4nuFf3k00004XF*Lt006O%3;baP zkuE-e010qNS#tmY4#NNd4#NS*Z>VGd00IC>L_t(Y$L-RwYTQ5&0MJE^#eGGX^C?24 zl2W)nZ*f%$!(o&1ie5JnLfGLf^c7*@bj#q6NR@!OugG_#@XTtBC9O>AfTu9{ z=4p0jcEx+VhY;mI^06KNedGQ{<(pu3>3|h~wH5K$DYJ72_GOJ_{b88JA7ZxT5)oR& z2MoaOE6$eZVuDePh;;}iONxujSYbv0Z5e{IYImV4r5rF}i@P&rD`npX-&RU#wQf|( zpbGM_Qi)PqrPPW+(4(Mi`U-3aqD0Xd94ngBj4U!rbi?^I&zWg4BDSso@+R>%ED_g# zEm(7pc=#FSX$3TA3-(Wc1Ar#oTy5PMh>yQM1)HcVDKnoZkgf)kR+OK=2Mz>QyTO;cg z*j)21fGbgW(CvWd<7>VfM{H4(P!(%z+2FFI;43 znl5lh@LM1NEr3M#3%C_4ya(%m$)hd+fX@WzU_b}*X)e+Zh;UlS(;Ur5YypukZi^x# uK)=B>V*vb5@2Ny+{AWBqU;zI65aJn$95~C&s$Vt$0000 Date: Sat, 30 Dec 2023 22:53:46 +0100 Subject: [PATCH 03/19] Fix weird stat drop anim (#3870) * Fix weird stat drop anim * PACKED define --- include/gba/defines.h | 1 + include/gba/types.h | 2 +- src/battle_intro.c | 28 ++++++++++++++-------------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/include/gba/defines.h b/include/gba/defines.h index fbe0a60706..0601f1b47e 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -17,6 +17,7 @@ #endif #define ALIGNED(n) __attribute__((aligned(n))) +#define PACKED __attribute__((packed)) #define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0) #define INTR_CHECK (*(u16 *)0x3007FF8) diff --git a/include/gba/types.h b/include/gba/types.h index 2e92bbe86e..4acaee2d23 100644 --- a/include/gba/types.h +++ b/include/gba/types.h @@ -41,7 +41,7 @@ struct BgCnt u16 screenBaseBlock:5; u16 areaOverflowMode:1; u16 screenSize:2; -}; +} PACKED; typedef volatile struct BgCnt vBgCnt; struct PlttData diff --git a/src/battle_intro.c b/src/battle_intro.c index 90ff736f00..2166421787 100644 --- a/src/battle_intro.c +++ b/src/battle_intro.c @@ -42,25 +42,25 @@ void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value) switch (attributeId) { case BG_ANIM_SCREEN_SIZE: - ((struct BgCnt *)&bgCnt)->screenSize = value; + ((vBgCnt *)&bgCnt)->screenSize = value; break; case BG_ANIM_AREA_OVERFLOW_MODE: - ((struct BgCnt *)&bgCnt)->areaOverflowMode = value; + ((vBgCnt *)&bgCnt)->areaOverflowMode = value; break; case BG_ANIM_MOSAIC: - ((struct BgCnt *)&bgCnt)->mosaic = value; + ((vBgCnt *)&bgCnt)->mosaic = value; break; case BG_ANIM_CHAR_BASE_BLOCK: - ((struct BgCnt *)&bgCnt)->charBaseBlock = value; + ((vBgCnt *)&bgCnt)->charBaseBlock = value; break; case BG_ANIM_PRIORITY: - ((struct BgCnt *)&bgCnt)->priority = value; + ((vBgCnt *)&bgCnt)->priority = value; break; case BG_ANIM_PALETTES_MODE: - ((struct BgCnt *)&bgCnt)->palettes = value; + ((vBgCnt *)&bgCnt)->palettes = value; break; case BG_ANIM_SCREEN_BASE_BLOCK: - ((struct BgCnt *)&bgCnt)->screenBaseBlock = value; + ((vBgCnt *)&bgCnt)->screenBaseBlock = value; break; } @@ -78,19 +78,19 @@ int GetAnimBgAttribute(u8 bgId, u8 attributeId) switch (attributeId) { case BG_ANIM_SCREEN_SIZE: - return ((struct BgCnt *)&bgCnt)->screenSize; + return ((vBgCnt *)&bgCnt)->screenSize; case BG_ANIM_AREA_OVERFLOW_MODE: - return ((struct BgCnt *)&bgCnt)->areaOverflowMode; + return ((vBgCnt *)&bgCnt)->areaOverflowMode; case BG_ANIM_MOSAIC: - return ((struct BgCnt *)&bgCnt)->mosaic; + return ((vBgCnt *)&bgCnt)->mosaic; case BG_ANIM_CHAR_BASE_BLOCK: - return ((struct BgCnt *)&bgCnt)->charBaseBlock; + return ((vBgCnt *)&bgCnt)->charBaseBlock; case BG_ANIM_PRIORITY: - return ((struct BgCnt *)&bgCnt)->priority; + return ((vBgCnt *)&bgCnt)->priority; case BG_ANIM_PALETTES_MODE: - return ((struct BgCnt *)&bgCnt)->palettes; + return ((vBgCnt *)&bgCnt)->palettes; case BG_ANIM_SCREEN_BASE_BLOCK: - return ((struct BgCnt *)&bgCnt)->screenBaseBlock; + return ((vBgCnt *)&bgCnt)->screenBaseBlock; } } From a3c25114b7e1671f309164eb1db0d8a2e303d01f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 30 Dec 2023 23:08:17 +0100 Subject: [PATCH 04/19] Fixes small ai bulldoze effect bug (#3872) Co-authored-by: DizzyEggg Co-authored-by: Bassoonian --- src/battle_ai_util.c | 1 + test/battle/ai.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 37abe521a9..14016684dd 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -926,6 +926,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 if (ShouldLowerStat(battlerDef, abilityDef, STAT_DEF) && noOfHitsToKo != 1) return TRUE; break; + case EFFECT_BULLDOZE: case EFFECT_SPEED_DOWN_HIT: if (ShouldLowerStat(battlerDef, abilityDef, STAT_SPEED) && noOfHitsToKo != 1) return TRUE; diff --git a/test/battle/ai.c b/test/battle/ai.c index 88e516fe3e..953cf639f7 100644 --- a/test/battle/ai.c +++ b/test/battle/ai.c @@ -466,6 +466,21 @@ AI_DOUBLE_BATTLE_TEST("AI without any flags chooses moves at random - doubles") } } +AI_SINGLE_BATTLE_TEST("AI will choose either Rock Tomb or Bulldoze if Stat drop effect will activate and they kill with the same number of hits") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { HP(46); Speed(20); } + PLAYER(SPECIES_WYNAUT) { Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); Moves(MOVE_BULLDOZE, MOVE_ROCK_TOMB); } + } WHEN { + TURN { EXPECT_MOVES(opponent, MOVE_BULLDOZE, MOVE_ROCK_TOMB); } + TURN { EXPECT_MOVES(opponent, MOVE_BULLDOZE, MOVE_ROCK_TOMB); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + } +} + AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will not switch in a Pokemon which is slower and gets 1HKOed after fainting") { bool32 alakazamFirst; From c50777d88ba8be9aa43fb745586ee6ea39ece558 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Sun, 31 Dec 2023 21:21:03 -0300 Subject: [PATCH 05/19] Fixed Egg graphical data not being properly read. (#3879) --- src/pokemon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon.c b/src/pokemon.c index c6b1c0dae6..f46a443389 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5985,7 +5985,7 @@ u16 SanitizeSpeciesId(u16 species) bool32 IsSpeciesEnabled(u16 species) { - return gSpeciesInfo[species].baseHP > 0; + return gSpeciesInfo[species].baseHP > 0 || species == SPECIES_EGG; } void TryToSetBattleFormChangeMoves(struct Pokemon *mon, u16 method) From 281cd0e20d939ebfed16aaafc00cfac2b939ec2f Mon Sep 17 00:00:00 2001 From: Damon Murdoch Date: Mon, 1 Jan 2024 19:07:04 +1100 Subject: [PATCH 06/19] Removed battle frontier z-move usage restriction (#3883) Removed battle frontier z-move usage restriction --- src/battle_z_move.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 7069d17386..346fac3a08 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -171,7 +171,8 @@ bool32 IsViableZMove(u8 battler, u16 move) if (gBattleStruct->zmove.used[battler]) return FALSE; - if (gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FRONTIER)) + // Add '| BATTLE_TYPE_FRONTIER' to below if issues occur + if (gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_WALLY_TUTORIAL)) return FALSE; if ((GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT || (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT)) && !CheckBagHasItem(ITEM_Z_POWER_RING, 1)) From 9191c22c6388c1ff09f2382a75586a05987a30a3 Mon Sep 17 00:00:00 2001 From: Damon Murdoch Date: Mon, 1 Jan 2024 21:28:52 +1100 Subject: [PATCH 07/19] Fixed genie signature moves (#3884) * Fixed genie signature moves Fixed genie signature moves * Condensed rain move checks into a single 'if' Condensed rain move checks into a single 'if' --- src/battle_script_commands.c | 6 ++++-- src/data/battle_moves.h | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0bcde61666..fdf3da1912 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1586,9 +1586,11 @@ static bool32 AccuracyCalcHelper(u16 move) if (WEATHER_HAS_EFFECT) { - if ((IsBattlerWeatherAffected(gBattlerTarget, B_WEATHER_RAIN) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE))) + if (IsBattlerWeatherAffected(gBattlerTarget, B_WEATHER_RAIN) && + (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE || + move == MOVE_BLEAKWIND_STORM || move == MOVE_WILDBOLT_STORM || move == MOVE_SANDSEAR_STORM)) { - // thunder/hurricane ignore acc checks in rain unless target is holding utility umbrella + // thunder/hurricane/genie moves ignore acc checks in rain unless target is holding utility umbrella JumpIfMoveFailed(7, move); return TRUE; } diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 1fb2923c53..3675234b8e 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -13466,7 +13466,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 80, .secondaryEffectChance = 30, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_BOTH, .priority = 0, .split = SPLIT_SPECIAL, .zMoveEffect = Z_EFFECT_NONE, @@ -13487,7 +13487,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 80, .secondaryEffectChance = 20, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_BOTH, .priority = 0, .split = SPLIT_SPECIAL, .zMoveEffect = Z_EFFECT_NONE, @@ -13508,7 +13508,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 80, .secondaryEffectChance = 20, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_BOTH, .priority = 0, .split = SPLIT_SPECIAL, .zMoveEffect = Z_EFFECT_NONE, From 58a93a544f9dad80e9170513ce96473c36ab18a6 Mon Sep 17 00:00:00 2001 From: lordraindance2 <47706100+lordraindance2@users.noreply.github.com> Date: Tue, 2 Jan 2024 03:44:15 -0500 Subject: [PATCH 08/19] Refactored SetMoveEffect Inner Focus Case (#3885) * Rollbacked SetMoveEffect Inner Focus logic Co-authored-by: poetahto * Refactored else if --------- Co-authored-by: poetahto --- src/battle_script_commands.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index fdf3da1912..b9ff7f63c8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3128,20 +3128,25 @@ void SetMoveEffect(bool32 primary, u32 certain) } break; case MOVE_EFFECT_FLINCH: - if (battlerAbility == ABILITY_INNER_FOCUS - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + if (battlerAbility == ABILITY_INNER_FOCUS) { - gLastUsedAbility = ABILITY_INNER_FOCUS; - gBattlerAbility = gEffectBattler; - RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS); - gBattlescriptCurrInstr = BattleScript_FlinchPrevention; + if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN) + { + gLastUsedAbility = ABILITY_INNER_FOCUS; + gBattlerAbility = gEffectBattler; + RecordAbilityBattle(gEffectBattler, ABILITY_INNER_FOCUS); + gBattlescriptCurrInstr = BattleScript_FlinchPrevention; + } else + { + gBattlescriptCurrInstr++; + } } else if (GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber - && !IsDynamaxed(gEffectBattler)) + && !IsDynamaxed(gEffectBattler)) { - gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; + gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]; + gBattlescriptCurrInstr++; } - gBattlescriptCurrInstr++; break; case MOVE_EFFECT_UPROAR: if (!(gBattleMons[gEffectBattler].status2 & STATUS2_UPROAR)) From d3b29406a57a45bf90beb0759b258dd244e6062e Mon Sep 17 00:00:00 2001 From: Frank DeBlasio <35279583+fdeblasio@users.noreply.github.com> Date: Tue, 2 Jan 2024 04:05:31 -0500 Subject: [PATCH 09/19] Fixed Collision Course and Electro Drift PP (#3890) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/data/battle_moves.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 3675234b8e..d33469a9fa 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -13967,7 +13967,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 100, .type = TYPE_FIGHTING, .accuracy = 100, - .pp = 10, + .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, @@ -13983,7 +13983,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 100, .type = TYPE_ELECTRIC, .accuracy = 100, - .pp = 10, + .pp = 5, .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, From f24deb930131819e5ff3be401742b41162e4829a Mon Sep 17 00:00:00 2001 From: aronson Date: Tue, 2 Jan 2024 07:46:01 -0600 Subject: [PATCH 10/19] Allocate initialized sections for EWRAM and IWRAM (#3877) --- Makefile | 2 +- include/crt0.h | 2 ++ include/gba/defines.h | 6 +++-- ld_script.ld | 38 ++++++++++++++++++++++++--- ld_script_modern.ld | 44 ++++++++++++++++++++++++++----- ld_script_test.ld | 41 +++++++++++++++++++++++++---- src/crt0.s | 61 +++++++++++++++++++++++++++++++++++++++++-- src/main.c | 5 ---- src/reload_save.c | 2 ++ 9 files changed, 175 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index d899015225..ea7adb0e66 100644 --- a/Makefile +++ b/Makefile @@ -473,7 +473,7 @@ endif $(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS) cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld -LDFLAGS = -Map ../../$(MAP) +LDFLAGS = -Map ../../$(MAP) --no-warn-rwx-segments $(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ " @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat diff --git a/include/crt0.h b/include/crt0.h index a4a5c7f79b..c60ed3b0b7 100644 --- a/include/crt0.h +++ b/include/crt0.h @@ -3,4 +3,6 @@ extern u32 IntrMain[]; +extern void ReInitializeEWRAM(); + #endif //GUARD_CRT0_H diff --git a/include/gba/defines.h b/include/gba/defines.h index 0601f1b47e..6366355875 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -6,8 +6,10 @@ #define TRUE 1 #define FALSE 0 -#define IWRAM_DATA __attribute__((section("iwram_data"))) -#define EWRAM_DATA __attribute__((section("ewram_data"))) +#define IWRAM_DATA __attribute__((section(".bss"))) +#define EWRAM_DATA __attribute__((section(".sbss"))) +#define IWRAM_INIT __attribute__((section(".iwram"))) +#define EWRAM_INIT __attribute__((section(".ewram"))) #define UNUSED __attribute__((unused)) #if MODERN diff --git a/ld_script.ld b/ld_script.ld index 642480d35d..e9cbae8957 100644 --- a/ld_script.ld +++ b/ld_script.ld @@ -13,19 +13,35 @@ MEMORY SECTIONS { - ewram 0x2000000 (NOLOAD) : + .ewram ORIGIN(EWRAM) : AT (__ewram_lma) + ALIGN(4) + { + __ewram_start = .; + *(.ewram*) + __ewram_end = .; + } > EWRAM + + .ewram.sbss (NOLOAD) : ALIGN(4) { INCLUDE "sym_ewram.ld" - src/*.o(ewram_data); - gflib/*.o(ewram_data); + src/*.o(.sbss); + gflib/*.o(.sbss); *libc.a:impure.o(.data); *libc.a:locale.o(.data); *libc.a:mallocr.o(.data); } > EWRAM - iwram 0x3000000 (NOLOAD) : + .iwram ORIGIN(IWRAM) : AT (__iwram_lma) + ALIGN(4) + { + __iwram_start = .; + *(.iwram*); + __iwram_end = .; + } > IWRAM + + .iwram.bss (NOLOAD) : ALIGN(4) { /* .bss starts at 0x3000000 */ @@ -1324,6 +1340,20 @@ SECTIONS { data/*.o(.rodata); } > ROM = 0 + .data.iwram : + ALIGN(4) + { + __iwram_lma = .; + . = . + (__iwram_end - __iwram_start); + } > ROM = 0 + + .data.ewram : + ALIGN(4) + { + __ewram_lma = .; + . = . + (__ewram_end - __ewram_start); + } > ROM = 0 + __rom_end = .; /* DWARF debug sections. diff --git a/ld_script_modern.ld b/ld_script_modern.ld index f3bf7b6798..fd35a1ca31 100644 --- a/ld_script_modern.ld +++ b/ld_script_modern.ld @@ -12,15 +12,32 @@ MEMORY } SECTIONS { - ewram 0x2000000 (NOLOAD) : + + + .ewram ORIGIN(EWRAM) : AT (__ewram_lma) ALIGN(4) { - src/*.o(ewram_data); - gflib/*.o(ewram_data); - + __ewram_start = .; + *(.ewram*) + __ewram_end = .; } > EWRAM - iwram 0x3000000 (NOLOAD) : + .ewram.sbss (NOLOAD) : + ALIGN(4) + { + src/*.o(.sbss); + gflib/*.o(.sbss); + } > EWRAM + + .iwram ORIGIN(IWRAM) : AT (__iwram_lma) + ALIGN(4) + { + __iwram_start = .; + *(.iwram*); + __iwram_end = .; + } > IWRAM + + .iwram.bss (NOLOAD) : ALIGN(4) { src/*.o(.bss); @@ -38,9 +55,8 @@ SECTIONS { } > IWRAM /* BEGIN ROM DATA */ - . = 0x8000000; - .text : + .text ORIGIN(ROM) : ALIGN(4) { src/rom_header.o(.text*); @@ -125,6 +141,20 @@ SECTIONS { src/graphics.o(.rodata); } > ROM =0 + .data.iwram : + ALIGN(4) + { + __iwram_lma = .; + . = . + (__iwram_end - __iwram_start); + } > ROM = 0 + + .data.ewram : + ALIGN(4) + { + __ewram_lma = .; + . = . + (__ewram_end - __ewram_start); + } > ROM = 0 + __rom_end = .; /* DWARF debug sections. diff --git a/ld_script_test.ld b/ld_script_test.ld index 49a0ec35b0..ec99609a7e 100644 --- a/ld_script_test.ld +++ b/ld_script_test.ld @@ -12,15 +12,32 @@ MEMORY } SECTIONS { - ewram 0x2000000 (NOLOAD) : + + .ewram ORIGIN(EWRAM) : AT (__ewram_lma) ALIGN(4) { - src/*.o(ewram_data); - gflib/*.o(ewram_data); - test/*.o(ewram_data); + __ewram_start = .; + *(.ewram*) + __ewram_end = .; } > EWRAM - iwram 0x3000000 (NOLOAD) : + .ewram.sbss (NOLOAD) : + ALIGN(4) + { + src/*.o(.sbss); + gflib/*.o(.sbss); + test/*.o(.sbss); + } > EWRAM + + .iwram ORIGIN(IWRAM) : AT (__iwram_lma) + ALIGN(4) + { + __iwram_start = .; + *(.iwram*); + __iwram_end = .; + } > IWRAM + + .iwram.sbss (NOLOAD) : ALIGN(4) { src/*.o(.bss); @@ -97,6 +114,20 @@ SECTIONS { src/libisagbprn.o(.rodata); } > ROM =0 + .data.iwram : + ALIGN(4) + { + __iwram_lma = .; + . = . + (__iwram_end - __iwram_start); + } > ROM = 0 + + .data.ewram : + ALIGN(4) + { + __ewram_lma = .; + . = . + (__ewram_end - __ewram_start); + } > ROM = 0 + tests : ALIGN(4) { diff --git a/src/crt0.s b/src/crt0.s index 5808147220..af6ea0bc95 100644 --- a/src/crt0.s +++ b/src/crt0.s @@ -6,22 +6,28 @@ .align 2, 0 Init:: +@ Set up location for IRQ stack mov r0, #PSR_IRQ_MODE msr cpsr_cf, r0 ldr sp, sp_irq +@ Set up location for system stack mov r0, #PSR_SYS_MODE msr cpsr_cf, r0 ldr sp, sp_sys +@ Prepare for interrupt handling ldr r1, =INTR_VECTOR adr r0, IntrMain str r0, [r1] - .if MODERN +@ Dispatch memory reset request to hardware mov r0, #255 @ RESET_ALL svc #1 << 16 - .endif @ MODERN +@ Fill RAM areas with appropriate data + bl InitializeWorkingMemory +@ Jump to AgbMain ldr r1, =AgbMain + 1 mov lr, pc bx r1 +@ Re-init if AgbMain exits b Init .align 2, 0 @@ -124,3 +130,54 @@ IntrMain_RetAddr: .pool .align 2, 0 @ Don't pad with nop. + +@ Fills initialized IWRAM and EWRAM sections in RAM from LMA areas in ROM +InitializeWorkingMemory: + push {r0-r3,lr} + ldr r0, =__iwram_lma + ldr r1, =__iwram_start + ldr r2, =__iwram_end + cmp r1, r2 + beq skip_iwram_copy + bl CopyMemory_DMA +skip_iwram_copy: + ldr r0, =__ewram_lma + ldr r1, =__ewram_start + ldr r2, =__ewram_end + cmp r1, r2 + beq skip_ewram_copy + bl CopyMemory_DMA +skip_ewram_copy: + pop {r0-r3,lr} + bx lr + +@ Uses a DMA transfer to load from r0 into r1 until r2 +CopyMemory_DMA: + subs r2, r2, r1 + lsr r2, r2, #2 + mov r4, #0x80000000 + orr r4, r4, #(1 << 26) + orr r2, r2, r4 + ldr r3, =REG_DMA3 + stmia r3, {r0, r1, r2} + bx lr + +.thumb +@ Called from C code to reinitialize working memory after a link connection failure +ReInitializeEWRAM:: + ldr r0, =__ewram_lma + ldr r1, =__ewram_start + ldr r2, =__ewram_end + cmp r1, r2 + beq EndReinitializeEWRAM + subs r2, r1 + movs r3, #1 + lsls r3, r3, #26 + orrs r2, r2, r3 + swi 0x0B +EndReinitializeEWRAM: + bx lr + + .pool + + .align 2, 0 @ Don't pad with nop. diff --git a/src/main.c b/src/main.c index 1f2b712750..1d23daa3e3 100644 --- a/src/main.c +++ b/src/main.c @@ -93,11 +93,6 @@ void EnableVCountIntrAtLine150(void); void AgbMain() { - // Modern compilers are liberal with the stack on entry to this function, - // so RegisterRamReset may crash if it resets IWRAM. -#if !MODERN - RegisterRamReset(RESET_ALL); -#endif //MODERN *(vu16 *)BG_PLTT = RGB_WHITE; // Set the backdrop to white on startup InitGpuRegManager(); REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; diff --git a/src/reload_save.c b/src/reload_save.c index 5425d1c7c4..f6104c1db7 100644 --- a/src/reload_save.c +++ b/src/reload_save.c @@ -1,5 +1,6 @@ #include "global.h" #include "main.h" +#include "crt0.h" #include "gpu_regs.h" #include "m4a.h" #include "load_save.h" @@ -15,6 +16,7 @@ void ReloadSave(void) u16 imeBackup = REG_IME; REG_IME = 0; RegisterRamReset(RESET_EWRAM); + ReInitializeEWRAM(); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); REG_IME = imeBackup; gMain.inBattle = FALSE; From d1ab5255529ecdf7cb374a0d56dafe58944feea7 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Tue, 2 Jan 2024 13:54:42 +0000 Subject: [PATCH 11/19] Revert "Allocate initialized sections for EWRAM and IWRAM (#3877)" (#3891) This reverts commit f24deb930131819e5ff3be401742b41162e4829a. --- Makefile | 2 +- include/crt0.h | 2 -- include/gba/defines.h | 6 ++--- ld_script.ld | 38 +++------------------------ ld_script_modern.ld | 44 +++++-------------------------- ld_script_test.ld | 41 ++++------------------------- src/crt0.s | 61 ++----------------------------------------- src/main.c | 5 ++++ src/reload_save.c | 2 -- 9 files changed, 26 insertions(+), 175 deletions(-) diff --git a/Makefile b/Makefile index ea7adb0e66..d899015225 100644 --- a/Makefile +++ b/Makefile @@ -473,7 +473,7 @@ endif $(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS) cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld -LDFLAGS = -Map ../../$(MAP) --no-warn-rwx-segments +LDFLAGS = -Map ../../$(MAP) $(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ " @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat diff --git a/include/crt0.h b/include/crt0.h index c60ed3b0b7..a4a5c7f79b 100644 --- a/include/crt0.h +++ b/include/crt0.h @@ -3,6 +3,4 @@ extern u32 IntrMain[]; -extern void ReInitializeEWRAM(); - #endif //GUARD_CRT0_H diff --git a/include/gba/defines.h b/include/gba/defines.h index 6366355875..0601f1b47e 100644 --- a/include/gba/defines.h +++ b/include/gba/defines.h @@ -6,10 +6,8 @@ #define TRUE 1 #define FALSE 0 -#define IWRAM_DATA __attribute__((section(".bss"))) -#define EWRAM_DATA __attribute__((section(".sbss"))) -#define IWRAM_INIT __attribute__((section(".iwram"))) -#define EWRAM_INIT __attribute__((section(".ewram"))) +#define IWRAM_DATA __attribute__((section("iwram_data"))) +#define EWRAM_DATA __attribute__((section("ewram_data"))) #define UNUSED __attribute__((unused)) #if MODERN diff --git a/ld_script.ld b/ld_script.ld index e9cbae8957..642480d35d 100644 --- a/ld_script.ld +++ b/ld_script.ld @@ -13,35 +13,19 @@ MEMORY SECTIONS { - .ewram ORIGIN(EWRAM) : AT (__ewram_lma) - ALIGN(4) - { - __ewram_start = .; - *(.ewram*) - __ewram_end = .; - } > EWRAM - - .ewram.sbss (NOLOAD) : + ewram 0x2000000 (NOLOAD) : ALIGN(4) { INCLUDE "sym_ewram.ld" - src/*.o(.sbss); - gflib/*.o(.sbss); + src/*.o(ewram_data); + gflib/*.o(ewram_data); *libc.a:impure.o(.data); *libc.a:locale.o(.data); *libc.a:mallocr.o(.data); } > EWRAM - .iwram ORIGIN(IWRAM) : AT (__iwram_lma) - ALIGN(4) - { - __iwram_start = .; - *(.iwram*); - __iwram_end = .; - } > IWRAM - - .iwram.bss (NOLOAD) : + iwram 0x3000000 (NOLOAD) : ALIGN(4) { /* .bss starts at 0x3000000 */ @@ -1340,20 +1324,6 @@ SECTIONS { data/*.o(.rodata); } > ROM = 0 - .data.iwram : - ALIGN(4) - { - __iwram_lma = .; - . = . + (__iwram_end - __iwram_start); - } > ROM = 0 - - .data.ewram : - ALIGN(4) - { - __ewram_lma = .; - . = . + (__ewram_end - __ewram_start); - } > ROM = 0 - __rom_end = .; /* DWARF debug sections. diff --git a/ld_script_modern.ld b/ld_script_modern.ld index fd35a1ca31..f3bf7b6798 100644 --- a/ld_script_modern.ld +++ b/ld_script_modern.ld @@ -12,32 +12,15 @@ MEMORY } SECTIONS { - - - .ewram ORIGIN(EWRAM) : AT (__ewram_lma) + ewram 0x2000000 (NOLOAD) : ALIGN(4) { - __ewram_start = .; - *(.ewram*) - __ewram_end = .; + src/*.o(ewram_data); + gflib/*.o(ewram_data); + } > EWRAM - .ewram.sbss (NOLOAD) : - ALIGN(4) - { - src/*.o(.sbss); - gflib/*.o(.sbss); - } > EWRAM - - .iwram ORIGIN(IWRAM) : AT (__iwram_lma) - ALIGN(4) - { - __iwram_start = .; - *(.iwram*); - __iwram_end = .; - } > IWRAM - - .iwram.bss (NOLOAD) : + iwram 0x3000000 (NOLOAD) : ALIGN(4) { src/*.o(.bss); @@ -55,8 +38,9 @@ SECTIONS { } > IWRAM /* BEGIN ROM DATA */ + . = 0x8000000; - .text ORIGIN(ROM) : + .text : ALIGN(4) { src/rom_header.o(.text*); @@ -141,20 +125,6 @@ SECTIONS { src/graphics.o(.rodata); } > ROM =0 - .data.iwram : - ALIGN(4) - { - __iwram_lma = .; - . = . + (__iwram_end - __iwram_start); - } > ROM = 0 - - .data.ewram : - ALIGN(4) - { - __ewram_lma = .; - . = . + (__ewram_end - __ewram_start); - } > ROM = 0 - __rom_end = .; /* DWARF debug sections. diff --git a/ld_script_test.ld b/ld_script_test.ld index ec99609a7e..49a0ec35b0 100644 --- a/ld_script_test.ld +++ b/ld_script_test.ld @@ -12,32 +12,15 @@ MEMORY } SECTIONS { - - .ewram ORIGIN(EWRAM) : AT (__ewram_lma) + ewram 0x2000000 (NOLOAD) : ALIGN(4) { - __ewram_start = .; - *(.ewram*) - __ewram_end = .; + src/*.o(ewram_data); + gflib/*.o(ewram_data); + test/*.o(ewram_data); } > EWRAM - .ewram.sbss (NOLOAD) : - ALIGN(4) - { - src/*.o(.sbss); - gflib/*.o(.sbss); - test/*.o(.sbss); - } > EWRAM - - .iwram ORIGIN(IWRAM) : AT (__iwram_lma) - ALIGN(4) - { - __iwram_start = .; - *(.iwram*); - __iwram_end = .; - } > IWRAM - - .iwram.sbss (NOLOAD) : + iwram 0x3000000 (NOLOAD) : ALIGN(4) { src/*.o(.bss); @@ -114,20 +97,6 @@ SECTIONS { src/libisagbprn.o(.rodata); } > ROM =0 - .data.iwram : - ALIGN(4) - { - __iwram_lma = .; - . = . + (__iwram_end - __iwram_start); - } > ROM = 0 - - .data.ewram : - ALIGN(4) - { - __ewram_lma = .; - . = . + (__ewram_end - __ewram_start); - } > ROM = 0 - tests : ALIGN(4) { diff --git a/src/crt0.s b/src/crt0.s index af6ea0bc95..5808147220 100644 --- a/src/crt0.s +++ b/src/crt0.s @@ -6,28 +6,22 @@ .align 2, 0 Init:: -@ Set up location for IRQ stack mov r0, #PSR_IRQ_MODE msr cpsr_cf, r0 ldr sp, sp_irq -@ Set up location for system stack mov r0, #PSR_SYS_MODE msr cpsr_cf, r0 ldr sp, sp_sys -@ Prepare for interrupt handling ldr r1, =INTR_VECTOR adr r0, IntrMain str r0, [r1] -@ Dispatch memory reset request to hardware + .if MODERN mov r0, #255 @ RESET_ALL svc #1 << 16 -@ Fill RAM areas with appropriate data - bl InitializeWorkingMemory -@ Jump to AgbMain + .endif @ MODERN ldr r1, =AgbMain + 1 mov lr, pc bx r1 -@ Re-init if AgbMain exits b Init .align 2, 0 @@ -130,54 +124,3 @@ IntrMain_RetAddr: .pool .align 2, 0 @ Don't pad with nop. - -@ Fills initialized IWRAM and EWRAM sections in RAM from LMA areas in ROM -InitializeWorkingMemory: - push {r0-r3,lr} - ldr r0, =__iwram_lma - ldr r1, =__iwram_start - ldr r2, =__iwram_end - cmp r1, r2 - beq skip_iwram_copy - bl CopyMemory_DMA -skip_iwram_copy: - ldr r0, =__ewram_lma - ldr r1, =__ewram_start - ldr r2, =__ewram_end - cmp r1, r2 - beq skip_ewram_copy - bl CopyMemory_DMA -skip_ewram_copy: - pop {r0-r3,lr} - bx lr - -@ Uses a DMA transfer to load from r0 into r1 until r2 -CopyMemory_DMA: - subs r2, r2, r1 - lsr r2, r2, #2 - mov r4, #0x80000000 - orr r4, r4, #(1 << 26) - orr r2, r2, r4 - ldr r3, =REG_DMA3 - stmia r3, {r0, r1, r2} - bx lr - -.thumb -@ Called from C code to reinitialize working memory after a link connection failure -ReInitializeEWRAM:: - ldr r0, =__ewram_lma - ldr r1, =__ewram_start - ldr r2, =__ewram_end - cmp r1, r2 - beq EndReinitializeEWRAM - subs r2, r1 - movs r3, #1 - lsls r3, r3, #26 - orrs r2, r2, r3 - swi 0x0B -EndReinitializeEWRAM: - bx lr - - .pool - - .align 2, 0 @ Don't pad with nop. diff --git a/src/main.c b/src/main.c index 1d23daa3e3..1f2b712750 100644 --- a/src/main.c +++ b/src/main.c @@ -93,6 +93,11 @@ void EnableVCountIntrAtLine150(void); void AgbMain() { + // Modern compilers are liberal with the stack on entry to this function, + // so RegisterRamReset may crash if it resets IWRAM. +#if !MODERN + RegisterRamReset(RESET_ALL); +#endif //MODERN *(vu16 *)BG_PLTT = RGB_WHITE; // Set the backdrop to white on startup InitGpuRegManager(); REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; diff --git a/src/reload_save.c b/src/reload_save.c index f6104c1db7..5425d1c7c4 100644 --- a/src/reload_save.c +++ b/src/reload_save.c @@ -1,6 +1,5 @@ #include "global.h" #include "main.h" -#include "crt0.h" #include "gpu_regs.h" #include "m4a.h" #include "load_save.h" @@ -16,7 +15,6 @@ void ReloadSave(void) u16 imeBackup = REG_IME; REG_IME = 0; RegisterRamReset(RESET_EWRAM); - ReInitializeEWRAM(); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); REG_IME = imeBackup; gMain.inBattle = FALSE; From 91dfa93d3bc54bc629309301d3a9b18ffdbf48f8 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Tue, 2 Jan 2024 17:46:07 -0500 Subject: [PATCH 12/19] fix genie storm move anims for both targets, add AnimEllipticalGustCentered, AnimParticleInVortex handles multiple targets, add dynamic pals based on move target in UnpackSelectedBattlePalettes (#3895) Co-authored-by: ghoulslash --- data/battle_anim_scripts.s | 122 +++++++++++++++++++------------------ include/battle_anim.h | 1 + src/battle_anim_flying.c | 21 +++++++ src/battle_anim_new.c | 2 +- src/battle_anim_normal.c | 17 ++++++ src/battle_anim_rock.c | 6 +- 6 files changed, 104 insertions(+), 65 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 0611dee786..4145679f34 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -7022,6 +7022,10 @@ HurricaneGust: createsprite gEllipticalGustSpriteTemplate, ANIM_ATTACKER, 2, 0, -16 createvisualtask AnimTask_AnimateGustTornadoPalette, 5, 1, 70 return +HurricaneGustCentered: + createsprite gEllipticalGustCenteredSpriteTemplate, ANIM_ATTACKER, 2, 0, -16 + createvisualtask AnimTask_AnimateGustTornadoPalette, 5, 1, 70 + return Move_HEAD_CHARGE: loadspritegfx ANIM_TAG_IMPACT @@ -15915,36 +15919,36 @@ Move_SPRINGTIDE_STORM:: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_RED_HEART playsewithpan SE_M_GUST, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 88, 1 - createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_TARGET, 2, 6, 0, 11, RGB(31, 22, 30) - call HurricaneGust + createvisualtaskontargets AnimTask_ShakeMon2, 2, 0, ANIM_TARGET, 0, 4, 0x58, 1 + createvisualtask AnimTask_BlendColorCycle, 0x2, F_PAL_TARGET, 0x2, 0x6, 0x0, 0xB, 0x7ADF + call HurricaneGustCentered call SpringtideStormHeartSwirl - call HurricaneGust + call HurricaneGustCentered call SpringtideStormHeartSwirl - call HurricaneGust + call HurricaneGustCentered call SpringtideStormHeartSwirl - call HurricaneGust + call HurricaneGustCentered call SpringtideStormHeartSwirl - call HurricaneGust + call HurricaneGustCentered call SpringtideStormHeartSwirl - call HurricaneGust + call HurricaneGustCentered call SpringtideStormHeartSwirl waitforvisualfinish stopsound end SpringtideStormHeartSwirl: - createsprite gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET + createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET + createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET + createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET + createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET + createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET + createspriteontargets gSpriteTemplate_SpringtideHeart, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET return @@ -16485,37 +16489,37 @@ Move_BLEAKWIND_STORM:: loadspritegfx ANIM_TAG_GUST loadspritegfx ANIM_TAG_ICE_CRYSTALS playsewithpan SE_M_GUST, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 88, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xB, 0x7FFF - call HurricaneGust + createvisualtaskontargets AnimTask_ShakeMon2, 2, 0, ANIM_TARGET, 0, 4, 0x58, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xB, 0x7FFF + call HurricaneGustCentered call BleakwindStormIceSwirl - call HurricaneGust + call HurricaneGustCentered call BleakwindStormIceSwirl - call HurricaneGust + call HurricaneGustCentered call BleakwindStormIceSwirl - call HurricaneGust + call HurricaneGustCentered call BleakwindStormIceSwirl - call HurricaneGust + call HurricaneGustCentered call BleakwindStormIceSwirl - call HurricaneGust + call HurricaneGustCentered call BleakwindStormIceSwirl waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xB, 0x0, 0x7FFF + createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xB, 0x0, 0x7FFF waitforvisualfinish end BleakwindStormIceSwirl: - createsprite gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET + createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET + createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET + createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET + createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET + createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET + createspriteontargets gSpriteTemplate_BleakwindIce, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET return @@ -16528,39 +16532,39 @@ Move_WILDBOLT_STORM:: createvisualtask AnimTask_StartSlidingBg, 0x5, 0xff00, 0x0, 0x1, 0xffff waitbgfadein playsewithpan SE_M_GUST, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 88, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xB, 0x07FE - call HurricaneGust + createvisualtaskontargets AnimTask_ShakeMon2, 2, 0, ANIM_TARGET, 0, 4, 0x58, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_TARGET, 0x4, 0x0, 0xB, 0x07FE + call HurricaneGustCentered call WildboltStormSparkSwirl - call HurricaneGust + call HurricaneGustCentered call WildboltStormSparkSwirl - call HurricaneGust + call HurricaneGustCentered call WildboltStormSparkSwirl - call HurricaneGust + call HurricaneGustCentered call WildboltStormSparkSwirl - call HurricaneGust + call HurricaneGustCentered call WildboltStormSparkSwirl - call HurricaneGust + call HurricaneGustCentered call WildboltStormSparkSwirl waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xB, 0x0, 0x07FE + createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xB, 0x0, 0x07FE call UnsetPsychicBg waitforvisualfinish end WildboltStormSparkSwirl: - createsprite gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET + createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x210, 0x1e, 0xa, 0x32, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET + createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x24, 0x1e0, 0x14, 0xd, 0xffd2, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET + createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x240, 0x14, 0x5, 0x2a, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET + createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x23, 0x190, 0x19, 0x8, 0xffd6, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET + createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x200, 0x19, 0xd, 0x2e, ANIM_TARGET delay 0x2 - createsprite gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET + createspriteontargets gSpriteTemplate_WildboltStormSpark, ANIM_TARGET, 2, 6, 0x0, 0x25, 0x1d0, 0x1e, 0xc, 0xffce, ANIM_TARGET return @@ -16570,38 +16574,38 @@ Move_SANDSEAR_STORM:: loadspritegfx ANIM_TAG_SMALL_EMBER createvisualtask AnimTask_BlendParticle, 0x5, ANIM_TAG_GUST, 0x0, 0xA, 0xA, 0x190B playsewithpan SE_M_GUST, SOUND_PAN_TARGET - createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 4, 88, 1 - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xB, 0x1F - call HurricaneGust + createvisualtaskontargets AnimTask_ShakeMon2, 2, 0, ANIM_TARGET, 0, 4, 0x58, 1 + createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x4, 0x0, 0xB, 0x1F + call HurricaneGustCentered call SandsearStormFireSpin - call HurricaneGust + call HurricaneGustCentered call SandsearStormFireSpin - call HurricaneGust + call HurricaneGustCentered call SandsearStormFireSpin - call HurricaneGust + call HurricaneGustCentered call SandsearStormFireSpin - call HurricaneGust + call HurricaneGustCentered call SandsearStormFireSpin - call HurricaneGust + call HurricaneGustCentered call SandsearStormFireSpin waitforvisualfinish stopsound - createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xB, 0x0, 0x1F + createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x1, 0xB, 0x0, 0x1F waitforvisualfinish end SandsearStormFireSpin: - createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_TARGET + createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x1c, 0x210, 0x1e, 0xd, 0x32, ANIM_TARGET delay 0x2 - createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_TARGET + createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x20, 0x1e0, 0x14, 0x10, 0xffd2, ANIM_TARGET delay 0x2 - createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_TARGET + createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x21, 0x240, 0x14, 0x8, 0x2a, ANIM_TARGET delay 0x2 - createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_TARGET + createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x1f, 0x190, 0x19, 0xb, 0xffd6, ANIM_TARGET delay 0x2 - createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_TARGET + createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x1c, 0x200, 0x19, 0x10, 0x2e, ANIM_TARGET delay 0x2 - createsprite gFireSpinSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_TARGET + createspriteontargets gFireSpinSpriteTemplate, ANIM_TARGET, 2, 6, 0x0, 0x21, 0x1d0, 0x1e, 0xf, 0xffce, ANIM_TARGET return diff --git a/include/battle_anim.h b/include/battle_anim.h index 7aaa099518..f8f0dff969 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -548,5 +548,6 @@ void AnimOutrageFlame(struct Sprite *sprite); // battle_anim_new.c void CoreEnforcerLoadBeamTarget(struct Sprite *sprite); void SpriteCB_RandomCentredHits(struct Sprite *sprite); +void InitSpritePosToAnimTargetsCentre(struct Sprite *sprite, bool32 respectMonPicOffsets); #endif // GUARD_BATTLE_ANIM_H diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index 91ac5e7841..f58aa97ee2 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -10,6 +10,7 @@ extern const struct SpriteTemplate gFlashingHitSplatSpriteTemplate; +static void AnimEllipticalGustCentered(struct Sprite *sprite); static void AnimEllipticalGust_Step(struct Sprite *); static void AnimGustToTarget(struct Sprite *); static void AnimGustToTarget_Step(struct Sprite *); @@ -32,6 +33,17 @@ static void AnimSkyAttackBird_Step(struct Sprite *); static void AnimTask_AnimateGustTornadoPalette_Step(u8); static void AnimTask_LoadWindstormBackground_Step(u8 taskId); +const struct SpriteTemplate gEllipticalGustCenteredSpriteTemplate = +{ + .tileTag = ANIM_TAG_GUST, + .paletteTag = ANIM_TAG_GUST, + .oam = &gOamData_AffineOff_ObjNormal_32x64, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimEllipticalGustCentered, +}; + const struct SpriteTemplate gEllipticalGustSpriteTemplate = { .tileTag = ANIM_TAG_GUST, @@ -344,6 +356,15 @@ const struct SpriteTemplate gSkyAttackBirdSpriteTemplate = .callback = AnimSkyAttackBird, }; +// same as AnimEllipticalGust but centered on targets +static void AnimEllipticalGustCentered(struct Sprite *sprite) +{ + InitSpritePosToAnimTargetsCentre(sprite, FALSE); + sprite->y += 20; + sprite->data[1] = 191; + sprite->callback = AnimEllipticalGust_Step; + sprite->callback(sprite); +} void AnimEllipticalGust(struct Sprite *sprite) { diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 5faa0a696a..1d4a0bd562 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -7247,7 +7247,7 @@ static void InitSpritePosToGivenTarget(struct Sprite *sprite, u8 target) sprite->y2 = gBattleAnimArgs[1]; } -static void InitSpritePosToAnimTargetsCentre(struct Sprite *sprite, bool8 respectMonPicOffsets) +void InitSpritePosToAnimTargetsCentre(struct Sprite *sprite, bool32 respectMonPicOffsets) { if (!respectMonPicOffsets) { diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c index f710409229..3b2de5ddbb 100644 --- a/src/battle_anim_normal.c +++ b/src/battle_anim_normal.c @@ -413,6 +413,23 @@ u32 UnpackSelectedBattlePalettes(s16 selector) bool8 targetPartner = (selector >> 4) & 1; bool8 anim1 = (selector >> 5) & 1; bool8 anim2 = (selector >> 6) & 1; + u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gAnimMoveIndex); + + switch (moveTarget) + { + case MOVE_TARGET_BOTH: + if (target) { + targetPartner |= 1; + } + break; + case MOVE_TARGET_FOES_AND_ALLY: + if (target) { + targetPartner |= 1; + attackerPartner |= 1; + } + break; + } + return GetBattlePalettesMask(battleBackground, attacker, target, attackerPartner, targetPartner, anim1, anim2); } diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 6811c857b3..7a84757cd9 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -456,11 +456,7 @@ void AnimRockFragment(struct Sprite *sprite) // Swirls particle in vortex. Used for moves like Fire Spin or Sand Tomb void AnimParticleInVortex(struct Sprite *sprite) { - if (gBattleAnimArgs[6] == ANIM_ATTACKER) - InitSpritePosToAnimAttacker(sprite, FALSE); - else - InitSpritePosToAnimTarget(sprite, FALSE); - + InitSpritePosToAnimBattler(gBattleAnimArgs[6], sprite, FALSE); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[4]; From ef6e8ba2eae8da9fa19895f9295c8bfce751214a Mon Sep 17 00:00:00 2001 From: kaisermg5 Date: Wed, 3 Jan 2024 13:07:39 -0300 Subject: [PATCH 13/19] Added Dugtrio's footprint and formSpeciedIdTable. (#3897) --- src/data/pokemon/species_info/gen_1.h | 28 ++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/data/pokemon/species_info/gen_1.h b/src/data/pokemon/species_info/gen_1.h index b502422c0b..af319cab9b 100644 --- a/src/data/pokemon/species_info/gen_1.h +++ b/src/data/pokemon/species_info/gen_1.h @@ -3723,19 +3723,21 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sDiglettFormSpeciesIdTable, \ DIGLETT_FAMILY_MISC_INFO -#define DUGTRIO_MISC_INFO \ - .catchRate = 50, \ - .expYield = 149, \ - .evYield_Speed = 2, \ - .speciesName = _("Dugtrio"), \ - .cryId = CRY_DUGTRIO, \ - .natDexNum = NATIONAL_DEX_DUGTRIO, \ - .categoryName = _("Mole"), \ - .height = 7, \ - .pokemonScale = 406, \ - .pokemonOffset = 18, \ - .trainerScale = 256, \ - .trainerOffset = 0, \ +#define DUGTRIO_MISC_INFO \ + .catchRate = 50, \ + .expYield = 149, \ + .evYield_Speed = 2, \ + .speciesName = _("Dugtrio"), \ + .cryId = CRY_DUGTRIO, \ + .natDexNum = NATIONAL_DEX_DUGTRIO, \ + .categoryName = _("Mole"), \ + .height = 7, \ + .pokemonScale = 406, \ + .pokemonOffset = 18, \ + .trainerScale = 256, \ + .trainerOffset = 0, \ + .footprint = gMonFootprint_Dugtrio, \ + .formSpeciesIdTable = sDugtrioFormSpeciesIdTable, \ DIGLETT_FAMILY_MISC_INFO #define DUGTRIO_ATTACK (P_UPDATED_STATS >= GEN_7 ? 100 : 80) From e2c8edeaa64e58763321d6a78556852e063fb617 Mon Sep 17 00:00:00 2001 From: kaisermg5 Date: Wed, 3 Jan 2024 13:20:00 -0300 Subject: [PATCH 14/19] Fix HGSS pokedex preevolutions (#3894) * Fix pre-evolution search in pokedex plus. * Fix mega-evolution search in pokedex plus. --------- Co-authored-by: Bassoonian --- src/pokedex_plus_hgss.c | 48 +++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index d5258362ab..301836867c 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6481,13 +6481,37 @@ static u8 PrintPreEvolutions(u8 taskId, u16 species) u16 preEvolutionTwo = 0; u8 numPreEvolutions = 0; - bool8 isMega = FALSE; + u16 baseFormSpecies; sPokedexView->sEvoScreenData.isMega = FALSE; + //Check if it's a mega + baseFormSpecies = GetFormSpeciesId(species, 0); + if (baseFormSpecies != species) + { + const struct FormChange *formChanges = GetSpeciesFormChanges(baseFormSpecies); + for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) + { + if (formChanges[i].method == FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM + && formChanges[i].targetSpecies == species) + { + preEvolutionOne = baseFormSpecies; + numPreEvolutions += 1; + sPokedexView->numPreEvolutions = numPreEvolutions; + sPokedexView->sEvoScreenData.numAllEvolutions += numPreEvolutions; + sPokedexView->sEvoScreenData.isMega = TRUE; + + CopyItemName(GetSpeciesFormChanges(species)->param1, gStringVar2); //item + CreateCaughtBallEvolutionScreen(preEvolutionOne, base_x - 9 - 8, base_y + base_y_offset*(numPreEvolutions - 1), 0); + HandlePreEvolutionSpeciesPrint(taskId, preEvolutionOne, species, base_x - 8, base_y, base_y_offset, numPreEvolutions - 1); + return numPreEvolutions; + } + } + } + //Calculate previous evolution for (i = 0; i < NUM_SPECIES; i++) { - const struct Evolution *evolutions = GetSpeciesEvolutions(species); + const struct Evolution *evolutions = GetSpeciesEvolutions(i); if (evolutions == NULL) continue; @@ -6497,35 +6521,17 @@ static u8 PrintPreEvolutions(u8 taskId, u16 species) { preEvolutionOne = i; numPreEvolutions += 1; - - if (GetSpeciesFormChanges(species) != NULL - && GetSpeciesFormChanges(species)->method == FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM) - { - CopyItemName(GetSpeciesFormChanges(species)->param1, gStringVar2); //item - isMega = TRUE; - } break; } } } - if (isMega) - { - sPokedexView->numPreEvolutions = numPreEvolutions; - sPokedexView->sEvoScreenData.numAllEvolutions += numPreEvolutions; - sPokedexView->sEvoScreenData.isMega = isMega; - - CreateCaughtBallEvolutionScreen(preEvolutionOne, base_x - 9 - 8, base_y + base_y_offset*(numPreEvolutions - 1), 0); - HandlePreEvolutionSpeciesPrint(taskId, preEvolutionOne, species, base_x - 8, base_y, base_y_offset, numPreEvolutions - 1); - return numPreEvolutions; - } - //Calculate if previous evolution also has a previous evolution if (numPreEvolutions != 0) { for (i = 0; i < NUM_SPECIES; i++) { - const struct Evolution *evolutions = GetSpeciesEvolutions(species); + const struct Evolution *evolutions = GetSpeciesEvolutions(i); if (evolutions == NULL) continue; From 973dae73be0df69b1b4f2ee6d133edd9ee9e22e2 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Wed, 3 Jan 2024 18:48:22 +0000 Subject: [PATCH 15/19] Fix HoF dex numbers (#3901) --- src/hall_of_fame.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index caa497e395..d0cf6ac9b0 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -1128,6 +1128,12 @@ static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u dexNumber = SpeciesToPokedexNum(currMon->species); if (dexNumber != 0xFFFF) { + if (IsNationalPokedexEnabled()) + { + stringPtr[0] = (dexNumber / 1000) + CHAR_0; + stringPtr++; + dexNumber %= 1000; + } stringPtr[0] = (dexNumber / 100) + CHAR_0; stringPtr++; dexNumber %= 100; From e9e46d8272b19f86496a731b619d4784a11a5495 Mon Sep 17 00:00:00 2001 From: ravepossum <145081120+ravepossum@users.noreply.github.com> Date: Wed, 3 Jan 2024 17:27:10 -0500 Subject: [PATCH 16/19] Fix debug menu flags not redrawing correctly after PR 3796 (#3916) * Fix debug menu flags not redrawing correctly after PR 3796 * Update src/debug.c Co-authored-by: Bassoonian --------- Co-authored-by: ravepossum Co-authored-by: Bassoonian --- src/debug.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/debug.c b/src/debug.c index a298e31b0e..103f3fd2ea 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1437,8 +1437,16 @@ static void DebugTask_HandleMenuInput_FlagsVars(u8 taskId) PlaySE(SE_SELECT); if ((func = sDebugMenu_Actions_Flags[input]) != NULL) { - Debug_RedrawListMenu(taskId); - func(taskId); + if (input == DEBUG_FLAGVAR_MENU_ITEM_FLAGS || input == DEBUG_FLAGVAR_MENU_ITEM_VARS) + { + Debug_RedrawListMenu(taskId); + func(taskId); + } + else + { + func(taskId); + Debug_RedrawListMenu(taskId); + } // Remove TRUE/FALSE window for functions that haven't been assigned flags if (gTasks[taskId].tInput == 0xFF) From f9c21afb757aa4c494cec734e952fb1e0b833aba Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Fri, 5 Jan 2024 08:47:28 +0000 Subject: [PATCH 17/19] Dynamic regional dex rating (#3900) --- include/birch_pc.h | 6 +++ src/birch_pc.c | 96 ++++++++++++++++++++-------------------------- src/match_call.c | 84 +--------------------------------------- 3 files changed, 49 insertions(+), 137 deletions(-) create mode 100644 include/birch_pc.h diff --git a/include/birch_pc.h b/include/birch_pc.h new file mode 100644 index 0000000000..5e0e8d9c16 --- /dev/null +++ b/include/birch_pc.h @@ -0,0 +1,6 @@ +#ifndef GUARD_BIRCH_PC_H +#define GUARD_BIRCH_PC_H + +const u8 *GetPokedexRatingText(u16 count); + +#endif // GUARD_BIRCH_PC_H diff --git a/src/birch_pc.c b/src/birch_pc.c index 1f0ab23498..b656dd1de6 100644 --- a/src/birch_pc.c +++ b/src/birch_pc.c @@ -20,66 +20,52 @@ bool16 ScriptGetPokedexInfo(void) return IsNationalPokedexEnabled(); } +// Species in this array are ignored in the progress towards a full regional dex +static const u16 sRegionalNotCountedList[] = { + SPECIES_JIRACHI, + SPECIES_DEOXYS, + SPECIES_NONE +}; + +#define BIRCH_DEX_STRINGS 21 + +static const u8 *const sBirchDexRatingTexts[BIRCH_DEX_STRINGS] = +{ + gBirchDexRatingText_LessThan10, + gBirchDexRatingText_LessThan20, + gBirchDexRatingText_LessThan30, + gBirchDexRatingText_LessThan40, + gBirchDexRatingText_LessThan50, + gBirchDexRatingText_LessThan60, + gBirchDexRatingText_LessThan70, + gBirchDexRatingText_LessThan80, + gBirchDexRatingText_LessThan90, + gBirchDexRatingText_LessThan100, + gBirchDexRatingText_LessThan110, + gBirchDexRatingText_LessThan120, + gBirchDexRatingText_LessThan130, + gBirchDexRatingText_LessThan140, + gBirchDexRatingText_LessThan150, + gBirchDexRatingText_LessThan160, + gBirchDexRatingText_LessThan170, + gBirchDexRatingText_LessThan180, + gBirchDexRatingText_LessThan190, + gBirchDexRatingText_LessThan200, + gBirchDexRatingText_DexCompleted, +}; + // This shows your Hoenn Pokedex rating and not your National Dex. const u8 *GetPokedexRatingText(u16 count) { - if (count < 10) - return gBirchDexRatingText_LessThan10; - if (count < 20) - return gBirchDexRatingText_LessThan20; - if (count < 30) - return gBirchDexRatingText_LessThan30; - if (count < 40) - return gBirchDexRatingText_LessThan40; - if (count < 50) - return gBirchDexRatingText_LessThan50; - if (count < 60) - return gBirchDexRatingText_LessThan60; - if (count < 70) - return gBirchDexRatingText_LessThan70; - if (count < 80) - return gBirchDexRatingText_LessThan80; - if (count < 90) - return gBirchDexRatingText_LessThan90; - if (count < 100) - return gBirchDexRatingText_LessThan100; - if (count < 110) - return gBirchDexRatingText_LessThan110; - if (count < 120) - return gBirchDexRatingText_LessThan120; - if (count < 130) - return gBirchDexRatingText_LessThan130; - if (count < 140) - return gBirchDexRatingText_LessThan140; - if (count < 150) - return gBirchDexRatingText_LessThan150; - if (count < 160) - return gBirchDexRatingText_LessThan160; - if (count < 170) - return gBirchDexRatingText_LessThan170; - if (count < 180) - return gBirchDexRatingText_LessThan180; - if (count < 190) - return gBirchDexRatingText_LessThan190; - if (count < 200) - return gBirchDexRatingText_LessThan200; - if (count == 200) + u32 i; + u16 maxDex = HOENN_DEX_COUNT - 1; + for(i = 0; sRegionalNotCountedList[i] != SPECIES_NONE; i++) { - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), FLAG_GET_CAUGHT) - || GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), FLAG_GET_CAUGHT)) // Jirachi or Deoxys is not counted towards the dex completion. If either of these flags are enabled, it means the actual count is less than 200. - return gBirchDexRatingText_LessThan200; - return gBirchDexRatingText_DexCompleted; + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(sRegionalNotCountedList[i]), FLAG_GET_CAUGHT)) + count--; + maxDex--; } - if (count == HOENN_DEX_COUNT - 1) - { - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), FLAG_GET_CAUGHT) - && GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), FLAG_GET_CAUGHT)) // If both of these flags are enabled, it means the actual count is less than 200. - return gBirchDexRatingText_LessThan200; - return gBirchDexRatingText_DexCompleted; - } - if (count == HOENN_DEX_COUNT) - return gBirchDexRatingText_DexCompleted; - return gBirchDexRatingText_LessThan10; + return sBirchDexRatingTexts[(count * (BIRCH_DEX_STRINGS - 1)) / maxDex]; } void ShowPokedexRatingMessage(void) diff --git a/src/match_call.c b/src/match_call.c index 0c1176486e..2b2e5fc3c3 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -3,6 +3,7 @@ #include "battle.h" #include "battle_setup.h" #include "bg.h" +#include "birch_pc.h" #include "data.h" #include "event_data.h" #include "event_object_movement.h" @@ -1965,90 +1966,10 @@ static u16 GetFrontierStreakInfo(u16 facilityId, u32 *topicTextId) return streak; } -static u8 GetPokedexRatingLevel(u16 numSeen) -{ - if (numSeen < 10) - return 0; - if (numSeen < 20) - return 1; - if (numSeen < 30) - return 2; - if (numSeen < 40) - return 3; - if (numSeen < 50) - return 4; - if (numSeen < 60) - return 5; - if (numSeen < 70) - return 6; - if (numSeen < 80) - return 7; - if (numSeen < 90) - return 8; - if (numSeen < 100) - return 9; - if (numSeen < 110) - return 10; - if (numSeen < 120) - return 11; - if (numSeen < 130) - return 12; - if (numSeen < 140) - return 13; - if (numSeen < 150) - return 14; - if (numSeen < 160) - return 15; - if (numSeen < 170) - return 16; - if (numSeen < 180) - return 17; - if (numSeen < 190) - return 18; - if (numSeen < 200) - return 19; - - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), FLAG_GET_CAUGHT)) - numSeen--; - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), FLAG_GET_CAUGHT)) - numSeen--; - - if (numSeen < 200) - return 19; - else - return 20; -} - -static const u8 *const sBirchDexRatingTexts[] = -{ - gBirchDexRatingText_LessThan10, - gBirchDexRatingText_LessThan20, - gBirchDexRatingText_LessThan30, - gBirchDexRatingText_LessThan40, - gBirchDexRatingText_LessThan50, - gBirchDexRatingText_LessThan60, - gBirchDexRatingText_LessThan70, - gBirchDexRatingText_LessThan80, - gBirchDexRatingText_LessThan90, - gBirchDexRatingText_LessThan100, - gBirchDexRatingText_LessThan110, - gBirchDexRatingText_LessThan120, - gBirchDexRatingText_LessThan130, - gBirchDexRatingText_LessThan140, - gBirchDexRatingText_LessThan150, - gBirchDexRatingText_LessThan160, - gBirchDexRatingText_LessThan170, - gBirchDexRatingText_LessThan180, - gBirchDexRatingText_LessThan190, - gBirchDexRatingText_LessThan200, - gBirchDexRatingText_DexCompleted, -}; - void BufferPokedexRatingForMatchCall(u8 *destStr) { int numSeen, numCaught; u8 *str; - u8 dexRatingLevel; u8 *buffer = Alloc(sizeof(gStringVar4)); if (!buffer) @@ -2061,12 +1982,11 @@ void BufferPokedexRatingForMatchCall(u8 *destStr) numCaught = GetHoennPokedexCount(FLAG_GET_CAUGHT); ConvertIntToDecimalStringN(gStringVar1, numSeen, STR_CONV_MODE_LEFT_ALIGN, 3); ConvertIntToDecimalStringN(gStringVar2, numCaught, STR_CONV_MODE_LEFT_ALIGN, 3); - dexRatingLevel = GetPokedexRatingLevel(numCaught); str = StringCopy(buffer, gBirchDexRatingText_AreYouCurious); *(str++) = CHAR_PROMPT_CLEAR; str = StringCopy(str, gBirchDexRatingText_SoYouveSeenAndCaught); *(str++) = CHAR_PROMPT_CLEAR; - StringCopy(str, sBirchDexRatingTexts[dexRatingLevel]); + StringCopy(str, GetPokedexRatingText(numCaught)); str = StringExpandPlaceholders(destStr, buffer); if (IsNationalPokedexEnabled()) From 338740e256d35c2b938188abb5f254a96fe5c6ad Mon Sep 17 00:00:00 2001 From: johannakullmann <151456919+johannakullmann@users.noreply.github.com> Date: Fri, 5 Jan 2024 17:56:38 +0100 Subject: [PATCH 18/19] Fixed bug that prevents field moves from being displayed when adding more field moves (#3933) When adding a new field move, no field moves will be displayed in the party menu screen at all. This fixes this issue. --- src/party_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/party_menu.c b/src/party_menu.c index f333db02fb..1573c71a64 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -2787,7 +2787,7 @@ static void SetPartyMonFieldSelectionActions(struct Pokemon *mons, u8 slotId) // Add field moves to action list for (i = 0; i < MAX_MON_MOVES; i++) { - for (j = 0; sFieldMoves[j] != FIELD_MOVES_COUNT; j++) + for (j = 0; j != FIELD_MOVES_COUNT; j++) { if (GetMonData(&mons[slotId], i + MON_DATA_MOVE1) == sFieldMoves[j]) { From 396f2c9565082757361bb26e5c63a40fdb3c9fd8 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Sat, 6 Jan 2024 10:52:48 -0500 Subject: [PATCH 19/19] some pledge combo fixes (#3934) Co-authored-by: ghoulslash Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- src/battle_main.c | 2 ++ src/battle_util.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_main.c b/src/battle_main.c index 1216d8dd37..f647ae5569 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4932,6 +4932,8 @@ static void TurnValuesCleanUp(bool8 var0) gSideStatuses[B_SIDE_OPPONENT] &= ~(SIDE_STATUS_QUICK_GUARD | SIDE_STATUS_WIDE_GUARD | SIDE_STATUS_CRAFTY_SHIELD | SIDE_STATUS_MAT_BLOCK); gSideTimers[B_SIDE_PLAYER].followmeTimer = 0; gSideTimers[B_SIDE_OPPONENT].followmeTimer = 0; + + gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceller } void SpecialStatusesClear(void) diff --git a/src/battle_util.c b/src/battle_util.c index ff8a7f5dc8..81a5c82d8c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3165,7 +3165,7 @@ u8 DoBattlerEndTurnEffects(void) gBattleStruct->turnEffectsTracker++; break; case ENDTURN_SEA_OF_FIRE_DAMAGE: - if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE) + if (IsBattlerAlive(battler) && gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE) { gBattleMoveDamage = gBattleMons[battler].maxHP / 8; BtlController_EmitStatusAnimation(battler, BUFFER_A, FALSE, STATUS1_BURN);