From b56158428eb09bbf10df609df79f070fc65e7ea0 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 21 Jan 2024 16:56:45 -0500 Subject: [PATCH 01/12] Added new follower pokeballs & toggle. Credit: shikashipx --- .../object_events/pics/misc/animated_ball.png | Bin 8227 -> 9365 bytes .../object_events/pics/misc/ball_beast.png | Bin 0 -> 8767 bytes .../object_events/pics/misc/ball_cherish.png | Bin 0 -> 8380 bytes .../object_events/pics/misc/ball_dive.png | Bin 0 -> 8183 bytes .../object_events/pics/misc/ball_dream.png | Bin 0 -> 8091 bytes .../object_events/pics/misc/ball_dusk.png | Bin 0 -> 8408 bytes .../object_events/pics/misc/ball_fast.png | Bin 0 -> 8418 bytes .../object_events/pics/misc/ball_friend.png | Bin 0 -> 8369 bytes .../object_events/pics/misc/ball_great.png | Bin 0 -> 8519 bytes .../object_events/pics/misc/ball_heal.png | Bin 0 -> 8373 bytes .../object_events/pics/misc/ball_heavy.png | Bin 0 -> 8365 bytes .../object_events/pics/misc/ball_level.png | Bin 0 -> 8374 bytes .../object_events/pics/misc/ball_love.png | Bin 0 -> 8306 bytes .../object_events/pics/misc/ball_lure.png | Bin 0 -> 8434 bytes .../object_events/pics/misc/ball_luxury.png | Bin 0 -> 8409 bytes .../object_events/pics/misc/ball_master.png | Bin 0 -> 8489 bytes .../object_events/pics/misc/ball_moon.png | Bin 0 -> 8420 bytes .../object_events/pics/misc/ball_nest.png | Bin 0 -> 8329 bytes graphics/object_events/pics/misc/ball_net.png | Bin 0 -> 8357 bytes .../object_events/pics/misc/ball_park.png | Bin 0 -> 8457 bytes .../object_events/pics/misc/ball_premier.png | Bin 0 -> 8463 bytes .../object_events/pics/misc/ball_quick.png | Bin 0 -> 8529 bytes .../object_events/pics/misc/ball_repeat.png | Bin 0 -> 8435 bytes .../object_events/pics/misc/ball_safari.png | Bin 0 -> 8346 bytes .../object_events/pics/misc/ball_sport.png | Bin 0 -> 8469 bytes .../object_events/pics/misc/ball_strange.png | Bin 0 -> 9074 bytes .../object_events/pics/misc/ball_timer.png | Bin 0 -> 8501 bytes .../object_events/pics/misc/ball_ultra.png | Bin 0 -> 8426 bytes include/constants/event_objects.h | 4 + spritesheet_rules.mk | 3 + .../object_events/object_event_graphics.h | 86 ++++++++++++ .../object_event_graphics_info_followers.h | 68 +++++++++ .../object_events/object_event_pic_tables.h | 129 +++++++++++++++++- src/event_object_movement.c | 108 ++++++++++++++- 34 files changed, 395 insertions(+), 3 deletions(-) create mode 100644 graphics/object_events/pics/misc/ball_beast.png create mode 100644 graphics/object_events/pics/misc/ball_cherish.png create mode 100644 graphics/object_events/pics/misc/ball_dive.png create mode 100644 graphics/object_events/pics/misc/ball_dream.png create mode 100644 graphics/object_events/pics/misc/ball_dusk.png create mode 100644 graphics/object_events/pics/misc/ball_fast.png create mode 100644 graphics/object_events/pics/misc/ball_friend.png create mode 100644 graphics/object_events/pics/misc/ball_great.png create mode 100644 graphics/object_events/pics/misc/ball_heal.png create mode 100644 graphics/object_events/pics/misc/ball_heavy.png create mode 100644 graphics/object_events/pics/misc/ball_level.png create mode 100644 graphics/object_events/pics/misc/ball_love.png create mode 100644 graphics/object_events/pics/misc/ball_lure.png create mode 100644 graphics/object_events/pics/misc/ball_luxury.png create mode 100644 graphics/object_events/pics/misc/ball_master.png create mode 100644 graphics/object_events/pics/misc/ball_moon.png create mode 100644 graphics/object_events/pics/misc/ball_nest.png create mode 100644 graphics/object_events/pics/misc/ball_net.png create mode 100644 graphics/object_events/pics/misc/ball_park.png create mode 100644 graphics/object_events/pics/misc/ball_premier.png create mode 100644 graphics/object_events/pics/misc/ball_quick.png create mode 100644 graphics/object_events/pics/misc/ball_repeat.png create mode 100644 graphics/object_events/pics/misc/ball_safari.png create mode 100644 graphics/object_events/pics/misc/ball_sport.png create mode 100644 graphics/object_events/pics/misc/ball_strange.png create mode 100644 graphics/object_events/pics/misc/ball_timer.png create mode 100644 graphics/object_events/pics/misc/ball_ultra.png diff --git a/graphics/object_events/pics/misc/animated_ball.png b/graphics/object_events/pics/misc/animated_ball.png index 534e66c7b4258dea4c7866063725614ae31a4af8..03216113ba9975155614d705ad66c629afa4cb8b 100644 GIT binary patch delta 5872 zcmVK#h+hMY&$2@8-u}3Rc|NcEdnNw)ee`7Q9s9>1zy6&Y(c6U&Eu~}8 z0?*0vX9A{w-~8C%P2@RRNqX0KpWjc+>eoyN$nWA5{xGZO*R1?__e)l4{e4on*n7mo z2R{e1{&@ZE=dt`g_|F^SKU~??*Sqxd=OxGZ>vFz-@7?~~dp@fhxf0U)wW#kUzVA42 z5^{S_t2`RNh4<}!bRPaty^HMZu)^fAVvmWm+?eBkjw9Z9-q#fuQ_Sh4#%oF|+54GW zOFb5Rmx1w|59XT>Z28*1L9zFdx9)CH|y()PE z>~HGho1d6es7ynd(=$hrka)lAsJsFGe*F5Qyc!uSZ32tGSk1YpVjk(X0W6t+v*@ z^)}o*d-3Yc{qgRjr*42_>9x1+z4tM==wRf3!P$cY#+Yf^%(Kio+w|GzSd`DotE{@( z@@MrmcG|YViCuTwzWW|09!lxtQ%*hY_~~a{O6}Usx7>Q$_1o|Gk+t}I()y>zf1b7Y zowf94N(Z(dS>x2!zK4i{lcJoFv6LejZ^{4#os_fSG3WFsb;?=jiLNM#Sr#Q{M`etE z4CWJ4x$#Ht{*}3(^7iEX|H@nX&fKHa{WmiAD0P34xj*OaH(A?an-%PNGo&_DP=nEa zXH*}_DYw&ddf$rP{>|(2pC0(Xf&TJ22Qh~eMvtt9E~8mz*-!21lp3b>dTOj5_lB9{q}#0roAI;}fsEbLoHkmRz(8sJrqOEI z^quW~nb8Jp`Xo%&Q}k6xZH3l7+_lPVE!(=g%~r=Lv*dd_utmvYA($>!h8!K!?$7Emqopn88iVfWhXP`9?1{bUr&}nAiJ|urpW;)CU~)=&1rd zz06#6xeFk9y0u4=z3yy4i?_Ogzc#s~-$GdY9I^%;=C)2SU-1Oa*lDbiM{Ao455gZv z)|%}ry5-C}#$E@^TltPqM&9-mAhzyFMK)Db1I;Q$-@qro^B8myc3!7{jxf&JEQj(u zX^h51!ff}XwevVn1%f$rMUaua372z<&up`n-cJiGD9l+31;k%=-fVMJgKx@N=R!S%JeTlbV~`Z|*&fsP zu6;HX_E}`D81%3jZvq#87~r(o4l~o>W9fpmLIHs)I^LhMps!6VuN3n_A&N4X#i=*$ zGfyXbbSlNWV;N=MHSTCD@0qL@ziUp45bme&?0UW&cfF~TZes<9j@SgI)^+W~+#BR( zQv}@Tp1bQDKua!0%2%zA^+vBXJ2#Stv`8IL)SM|?1=2Isy(yG`tDIHe*8+=by-#{G zHb6P8`=_zTTHGs`?h&36g1E6WF ze@+!zJo_Z0ZCFEpM^#s;-F)eTV57A7BFqG{OQ$rva2Y4vO{?1bs^Iq8f$Z?nT4UDu z5`Db`eiz+`oO!iO4O?I50YDaK&VsokwvH-}_8C!I<_1{}tGlp-W*$f@6l z3hhkvIMJ>XQ7~{b84J^y6Hd5nmFU9zCmESn40NJ@8#=`fsjoaY9%eoZfJ$`rgikNs zSrLVupwnK+&Xp73PtaB`1+;8o7!{2F0fZ+MGXdX4R>rebO~?vN6ETTk$Hk@=wVE$r zWUdDObo2)lCCDoR36KQHG2g=u7lj4G#By1RbP-?3;6$>F`Wll-bR;y+b zPYfx4K-4ltcOz-{r)!nSqA89@1*a{x8We(WX#&zTPeytNucYTJ+Hh;0ED0}enIr+! z?cqFHhpJej@2x4OVE}e3@XS&8r)|hT48+Nse#|kVb_j z)^rM~9^532Ggkmy;>9)!+@Emm{Mxqxw@nLrPl`?Y=2s;vg zR+C0M`{~(UwUapMYNOzUN*pO-1JuEWR;G08;Wchuy`Y0i!ltxKFZO%id_3?^p@6uC zcffijNX4jVAaV;5`iozQu0QZPBC^mDNC>czxF7hRdOJ{d+Y#1kZNZAr42AufI_iK@ zqDdejTDO6tP*bN#FL-9~4AP|qdX^7=P{_}?*)W=wn3Dt778?+=IN8)Lo2BfHlvr^N zj3%Cv+8^kR6&YuV!NQSZ>&?Y=LB)iHCGOB9%i?l0FRVfW@UXsJ}RW(}OS> zH&XJzD~gy!K|&0e;$GSY0~rb-00CI(pqmf2RWBPmGeAJ_5}N7wewa1$KzM|I}4=DuWEQMG*{v`h=avPn=`dV4%hs!syJ07sW&MQzuk!UTsV zoxr6zC?H;je`;sOiV`3tL>iG!)@TvXk}jegt&rlJnHxH{)#bI|Iw(=nJ;or_d_tK} z3SGGa*8`P|z+xzthNX3XrvN1WppJ;7z#4arMu1=(N;GGh5O$+R(*$7qGJG7O9BsBz zI{37w$ppc&Ire{LZK5T@j(`VnGs=(D5U-GLrrUc>xfy_B}r$P$0`Y4 z3e^ER0$!ZAob-0I9tGuCfEXe3;TlQ4F1;vHK>$AOA;#=sX(WpQIVr*+YtO` z6nGS~lv1T2qL@X1L4QM#fYAhoku&Jn5vbqVW58HeXO= zAeIfpMJ^yC8jv|q0!~O8jG{Kp zoYV2!1i{~U5otz;lrTy-9__b`3U?ZfmFt+}p?sId5SSEy5C-VQ)2&zDd&u|&DJ=f! zhKBs{-Cb&-QPvm$$OI*Ejz1TWK{fO%9~`OhDZ3sjU57d2JCIfT6kS{3R2Vkg5v=jJ z9PK!ea^U(4Ra@zXp=|@Yke)2m{n=QF6I8M}Hj+7Vt0YuK0HLrXkX)wHjCg}Wp*?we z!#^>PFo9oxkRZlzJJoq1-IRnQ5Dj|EWu8j`>mkh9GRwDhUNA=^J+}|a>p;o$6C^;m zQPFsMcphXlQ&*34tYO^-u0m>m(E(M;X|_6bK1PGa)lQC-wIf~O zEYO$oj4d0IfT((>*CudrBvtpGIb5*-n}RhWkqss)g*&=!lJcrOq( zRRxb_%rAAFIz@leR0227K)0h-KoMzA1PTKC&?AKXNHJlg;Oe3NXx=QR`?x$H8I@H7 zp`nC-*AnNphj0>jPKKTaB(ZKR&9yB^g%Kiy-sGvlcec%N>)}vg1 zy)<#gtVr(nc^2nFsFPGK6rPj>GN{s7O;Q4z1=^FUk~=l1o!@%rXM}4#9*hWobPXQlbyu16G1yW<$Nu63Xu*X%%da@aX8F6B z3SeQU7N_9)+T7YV+o-GEK=>(LfcE-Gn5DZqR3Tm!p^6|AIz3A^6p68rA-U3OfWmOt zQ!sxAo`7huY=l+QGExJhNL74GQrn9g001HN=Lm6VW0$OC5SrLfBmfK6{~QB<6Z@v6 zqqbBIMGsM@fZm?(js_Km0Dx()ZtpmJR^ZMqsR@$o4LwPEpy6OSM#|)t4sMbo23GmA!;lFx*cx&Y<=V-nU0=)kfKC#@^Tu@ zZ52qwOQZK}G$;-!%pgE2ZeHpDofS=$jt-kR0o@){5*T!-*gWtVW5Hdfz3|v%eYA7FQU0AaK*5kq%95mNCI!qKHckK8L3;*~z~M%* z5EGQqmb=_5l}fF0eQ?;-B2eQkQ)|h2$Y&m09wUKLslLG~+M?%wyl2pvsGTt(KJ0p9 z_Dd%DCJ~Tstq``MGmHXxx7j1eDtGa@aS(ALXtd`vZF1fXQtCc8REGuBb~UyHVJ+dm z^`BAX^~1Yuu3IKV0ZK`#8cw3H{k<(lt`h6k9usXeic|9_Vt@m~fiRD6sUc*BZuC&& zRTdDDI<$eqeD6Jf51jEX>4Tx0C=2zkv&MmP!xqv zQ$>+VhZYra$WWauh>AE$6^me@v=v%)FnQ@8G-*guTpR^|*MfsTi&X~~XI&j!1wrr! z#M!|~(M3wUFDbN$@xtSMoOjRRz54*6QDLgtH36uaWu)RUF`HWzdtTu~5Ca%QNMfd* zNH1pKSzq_mO?4OLS>AnrR=<)r8Q>F%=a_C-#2dsjo0iUbpE%4)l0tk=JZ{hhi66Nx zyZpwv=&-f8NYQ!B!$0i!ljM@gRR$x+0;*6UIezdz_&r;*Fg58W z1!6$=i*0|50zJDxvu@kp$F|)(0sPOvmDcuG8^G*TC+YRJ7C8cf+rY(jTa)*I%N=0o zNtX=Ck^HoTLIHR`qi@OqpY z=m8HFDI_y4u2BF00OLtSK~y-)?a(m~0WlZ`;BFSJpJx$98y31q{V;df420X|#6pLQ zw-yX1#n-!V5<>?AiErqW^nLT?u8jTXcSm>^H@?lyr#F7}H)e(MqBil`G*!C)z7WTm z>ph)ZN-d+8AeRq^?w%uwTv6r4N07UJGHK`>B_!`D-OPey9v0-mqBe_2fUHPB9$XO2 zvmkeTY@|+WNOlGWw5Sp+FSEl_ZjCimv;Zkuz>faEbUC$`ox4|SuA~BVK~V>`u4qne zO989_sR30`RDrI0QDv-t@&0fH1?h^V`nKaEV^aF*H#fURt2dpC5ZnL&002n`MNUMn GLSTX`yAGBB delta 4887 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 JPDHLkV1m_OJ3RmZ diff --git a/graphics/object_events/pics/misc/ball_beast.png b/graphics/object_events/pics/misc/ball_beast.png new file mode 100644 index 0000000000000000000000000000000000000000..f3733d11aec1432b1f944cc16d66c7a770eb34db GIT binary patch literal 8767 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 literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_cherish.png b/graphics/object_events/pics/misc/ball_cherish.png new file mode 100644 index 0000000000000000000000000000000000000000..a93cab30c5bcbaf9204f07810cb66a29eba86ddb GIT binary patch literal 8380 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 Wq?Kn@^|O;H1sLdF)Tz*N4*wr3br3TE literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_dive.png b/graphics/object_events/pics/misc/ball_dive.png new file mode 100644 index 0000000000000000000000000000000000000000..1349ffa3ff04db47d03fde784676e2d826b0a50f GIT binary patch literal 8183 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 literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_dusk.png b/graphics/object_events/pics/misc/ball_dusk.png new file mode 100644 index 0000000000000000000000000000000000000000..824557003d5b4492ab696f99f4d7b20f71a98387 GIT binary patch literal 8408 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 OfWEegR>c|T$o~OAEE?wk literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_friend.png b/graphics/object_events/pics/misc/ball_friend.png new file mode 100644 index 0000000000000000000000000000000000000000..f22d7f78a28ff405d748fb4dbf67afb8ca88651a GIT binary patch literal 8369 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 Qg(5HjrE8>9qU8|zKSBin=Kufz literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_great.png b/graphics/object_events/pics/misc/ball_great.png new file mode 100644 index 0000000000000000000000000000000000000000..5a70a505fefb8a2414b009e1fa919a5a2698568f GIT binary patch literal 8519 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 L76uRWT%!L6mBBmr literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_heal.png b/graphics/object_events/pics/misc/ball_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb2272e51deafdcb9d6bedf29fcce5aaa2fbaf7 GIT binary patch literal 8373 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 Hbc*~RD_!b( literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_level.png b/graphics/object_events/pics/misc/ball_level.png new file mode 100644 index 0000000000000000000000000000000000000000..9050ad5588c316ec4af95a6a40bc15de23b61d2e GIT binary patch literal 8374 zcmeHLXH=6*w+_7tNRtjBG(iJNfDn4`T|hxl3?V>-0Fuyq6OgXbiy%l*ibzp&wlpa&+M6%nOIX}9eP?WS^xk*ucxbd zf%xk|e1PO+#BYS^ToM3qTGZdd3V#9V1N888cf`1&fp|X;G!X5JaRdN-C%ZDSZbA+8 zH;=}}JjwM~_0|ykU`AsH%11>;rQQ<7vs)7JLd+x{W+BW;woKksS$GukQ^xHB= zcU&xkoA)1x*B#w3BPd@|Y~J2+oJ?9#2~_zgxfw$Lz1ikRw!+JOf6L(DdmnP`(svGn zHr)nWR%#l}62Ns;T0xTAL0wUIy7~^F3v+?zst$wjd>bS!akn>XhZd_n2cw?6v)vgG zd>=TolFDvgzQnrHaMyA%s46!7YFbhB^-57PR!fUai!3A@~H#4%@9!~t1aG# z^;4VQ&FX#xzSwW-v8%fLv+}avIX3qFq=(yP-!=t2dtZv|KYRMShXuQ!Z+ z)?B;qSjKKu5M_Ox)oG=agRNYYy=6~lporuu`Nxd!XA4-+k4KD72H^@*EI6e}5_7kc_mMhp&cajGIS9TbzFX4><@K6r%6 zrHVr=B{ru>&eTq&at)e!o0pVN1yv-Ubb<(#kJr$Lumo6E}d2K2sSs z3_=fi)6(S2ToneqzmD=ZU=0jIc%N<4N9}-#mthhOw zR&%+yw&wzP+@Z>d(!N=4{UXwvqHpM(;N7mfxt>!j>Q^#?%p#}i!D(rCzdTms#cCdw z>7DKh=O=vjda=r4Ig=Y@CHJMDiluaR~xTLOb1xn+2P55f197KJmO~%Pl)xo~KRu zdMB4xcnF=+#p~6b90V>0rQ-;%YqT%g=0T*`v+L%_(CDDP!l&qXH$~Kfr*7w{^_a*_ z`lXeIzTGIbfE#;LlgnV^^GtRQ|Fy)GQd{)H6^&%!SF9_!Mr@aMKaUyGDFPM98JWt= zgT%N`4UqHZIC^O?DgK}>y%l`HUj38KGfPLbDYkbEsF%&%UQut7dM5zA;&COWnLey} zBUAXX=bimemnu^DM7X$KSfy<&U>VU}!*Mt3c}vNP*yA-m`_Jcbe6XOM?ro{T^=eHR3x7XMXm^1L_NJx~K&4 z(Ghn%{E6i-!rd{X!e!2)`IwpQ!gaBW8Grv@>%#X@P96O(I3HLFY4)+$Slv z-xxZnMX>|nSDpDyIxI9ge|%NHEaogxM@za5qJ0mG>g4Y`S7=r!ZVsChnTCnuSTZ2n zG7qVz&z@z{)q_5w**smWxhH*Hkd8Y>C_%USn?>s0qaE3^b3N6x-UfW1c|;Hk#U5PM z3lixwxugrB5vQW{nFimE54ah7X6bK)77iNX!~1Q6hEVE|m-IGMTR+sDNSXb^ML_53 z==POZO>HW`MKRqjH4fK9#JXA{$?BJtWxh4VpN^)q$D$+e)YEK$7@G4{)3m3~154JT z*E)kvwS@B{10QEIgyL@*-BwWOPu6pJJwqc=Vn;=;v?~R37tS2=GaJj}br|R0As2DdXv0Bv9diyWOKhxRR0nz)=6%M+bcf zrqSr8@-1Ms_E(xU9Uc(WZ2VWa0i%Vx{+8@ec0u4 zxqx*2aTTx28bM&tBxyv3p>MPPJ8)}^yVai(bq!F%NvZ2?3lW3!2RX0;K2VpvL_1ke zM?_|iys?HC(W+4x5{}}mJD5QG_HtZGBwV^)JrwCdWnX%geKd_{yKseQ)l+b>o>Exc zZ3trMJ#M z5}G8<)C72b^8h(Q&DMp9AjBnz2F16A1L^h{9_qHSf!?j>;hy)$m>KKZGqP0c3Z8`o zs5A3@n2UwXoyB|+Km(GEoi!&hgR2iwHD|gR*0)|kl-KWmrJ;`x;@k{l8<2BJSY@`c zWGxXk|ME^K=d1W>Y7?hf63S#|S~(W2356S*9pa8W6a)U( z>gHQDlR>xgY(R}L{QDFP=0*u$vrA>>d0l?-6~E6H5pjAG&;i{bXSp0!auL3)#51G{ zuR#3_@&JFkIEIiN1%cG76pb~}uvi){B_?|%Gv?LtOvkv3t7^-ijZd#EdSjfp)`dOD zxuRwi83roDcKhy8Q01$IE@i7GbXO@>BF`GYDLD(;2x`3dX&Ag$xSuf@ypa!QQKgTq zC=2D{bnomqeRcvV45g-X9dvw!duH-hdYPWUbl|_r9=O{P9pO>+Nx&A8K9o{-I(Vi; zA?%Zy%D_~vAUc0~FzotK5H(U@56)+{(z z3s_Mk>xENs7Tm=4?ySDf8fhIGa8vf z?`my_pwjx)A4Eu)J343D_0_1?rD=mFY&rCQ#%t%^J+o{ODhk|&lDo5{-gs=P$hDUz zem~ae)l-?IUE9~|kyfWqy`HSg;JIicAOpLhqZRmCix9a^chyQtmysoO*-BY$8^H4U zK(%H;Ra66}8Ky8_T6>q>tr7HWywB`$YsAIx+90v#lybTEBN&Gm`%CBOk@phU^$?5KgK49WrcLQf@4k-BxrAlq} zaF89{hAOp3M!p>18T}W`g)E$MPn7SeYR53x3PcI%n2V5=MYZ}Y*syCRI*&4tKd9nz zaVHOR(_7`GgC_1X>z=Yn7acfDU77FLGnWORG_>d&?d89Nu2KyYNMw$*eO^0O=FEVp zeD1hRH8u|*!6^XAlOXbGoUNg*1-!kalN#FZqe`{;+6WBE_d=+1)IHV5jp0 z2&_~}9@486MhSx9#ukHbp8MgIqNA@A-xyoE6T!VmmHoa!?8VaNk)UqQi(m$VH_!Wd zwf6jh$0dX_Ebe0llIkwq@44QD&SA#4`FQvlK)V6WPHJU$_uP)eUqu-6F*PZnKmVlJ z5eUp5*F7f&^ekKz7z=f=;AoLd4YY)0FkOLbC+M36t>@ho8hE?9L_%+qyn233$_y$d}y5`UWce&S;U(QXs???4I&bp&LfvzBFE% zYnkavgzT<&?tsJ?$*4}wynZS&3$=IBO*{rn1DD89pKp7f#xziI?t>6R2hWMhf6_`HrK7yBU94fK4*DdnADZv zb4lk`FkSf6cn5lqXS`mB-OT?d4QCsBe|oIU5dc6Eh0)M3)zi@U9&*EIKh%q@gITimsRTDHqx5Wh8kX^id#TONw>@CcPSODcA!E4;Q8 zYFku+0}4D zl5P5x;00T})oiAK;GHZ{2Bx?!hBSqY)KjUxS%~|kTuXG;>1+cwIivasb)Wj|I9|D& z!&DB_3ML8*B}YX*G_GLs-K8=I~*9|9gdZep*+eRD}i)yw?|9(Vvlcn002c5Uk@b81&s&Vqn$8r zN}$cAHV_cwpai-kV+1ks&_Fw5bp1Wi=KjVOD1R4}oC8QjnO4zPo=AX2pLtg9PN z-d729!YfaFKkk+U0Z$-!7bTFDkttBa-4hLzmXMZ!fVF%v-Y}3dEl|C3$FwM5yydl#E11TGWwI=4fk6Gq8^gINDoP<1Vj>xmHev(4zJ}+ zB>5fCf3?6_5U;`{FQ9SmUY;nlmN(iBFZfpq2h^YT9$ucVC+Rq#B+;&DED?$$dWHVY zrH-DF>7N$I5;$S79w$~rvHym|V;uh@*56_~9yv+puYnNF|K$A}`j6aCz(kahk-Vlm z%Ii2hJxwLhv4437cNE4!{^ZpW>L}#^N7#d5a7Q#)8itetBhhkjFajeF<7J%TGGSK>15zoaCtRTJtYuK0`i|8Q&%M3k!V0%0~j|4cOTq;hAc2x zv^gGmtS3|!A|nll$-$rqgbWn^E9w)*i)c?Au@;Y6p%4k!FG-FkMxK}sQCj42r4k8F zXo=a#Yj~oOcy~_=cXwAM&@lz@*z%;nfr`JTMHho3BK(eP{&&@zqi_6b{aOUBn3EwO z@T73%k*Hrza7b^o!-*rJ-LD~(Gt$ioOOX`n)%zv3K2oeEBAfd8gBm#v5OC#-( zV0#n<1(uS9I>;blvIv+1>hJ70cSpPr(i5%bM9h?!4Y7nyvH_m`EvDGt@jlMzW2GQ4 zX)pu|hQcjiFnMX1JOm1o{GF`i@tXc4TSdwLrHA4P;4hm1(e76tadRQ=Rg!;hR=@Q+ zmhk`a^LrltA3YGM|8??@^!-<^f93i|3j8DRzt#1xT>nUce+2%wy8h4PqW#Zt2kl1u z2joLM%v>IcyG%R?378sMXn7Kf*xA{^V0jZ0yKx94E-bn|M&;?lC)-`F+uPemM@RBS zi;+YyiM@f2CLo4_SC`nJ@zAx#0RVI?#}5f0D~E&FNrl%l(xO@=VImVJ**ot%PqdNJ z(^RuSyxbUunslnNQf*C&@VbGJ?J$|#e3nJ=o0W&;-3hTpu@T(zYa+vPpok~A6@&sU!c+kDVKUPNP39}g3DYjByX9f6mjus_eFfvrQ_?lhsqU`nb=hTmH3E$*z>Hqh7xH@#XoltKhWj9dY57MR@c4Qwi&Qz9qo2 zh|xNKla@FE3fT^Ojmoex;U?SZcn$Dx|oWPG@oyZ@|xy3{L9}yknwQF VsU~rUJtHa#(9<&3tW>`i{yzuO@{<4n literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_love.png b/graphics/object_events/pics/misc/ball_love.png new file mode 100644 index 0000000000000000000000000000000000000000..9584b6c797d9a1f6ccfe9da30ce4f2e1c3d05639 GIT binary patch literal 8306 zcmeHLc{tSF+n?+a60$Q!q8PIn%h+Y#*H9F*GGQ>rzAsr43W?AnQg$MxWM4w|>}%OV zwv?iHho|TH^<3}opXa*X_rGVZ>pSy3=X~zZeczvRpL5MQv8Kj4%#6H@004klPgm2N z^6O4{fHc&UZ+W$uL;!$w+~3lMY>x5)x|7`S1Q#5T?B|XH;(Q5s0Kj*&Io&yl&w!}C zzi{?dWFU~ejq)Qeq?O8(ovM!ck2z<&yW8Rqc0JgYOWG`rbt) z-u%wSRg%n=S{ppS;PYnl`_J#aYl+{s-PZDUK18(J#xH#RV!}7oy6;>2L#ckKfA;+T zoaVDyRh!z7>CK?v-4B{m*2J=G-=Nnfvr}SMzAQ&<28DmGEK(ZZ8Uh#YehCa-X?nf) z=$q)*-SYiSw_N``&n&BD*IZoi&}n-nrwwcKj9216q+FZAl<>*jYke!bSdQ7XrIe5h z=Xah;sM`PR<=m)s)916-IW_sMChfz*=c(8BJ3?zA_n<-gKRRxW?FF9?3E3YH8Q2~I zwN7m(+GClWXFW!>_41jZ_=wAO-)a|4T)?{$1a z+kN9mD7>0{Ytd^5@ndTJTb`Id1Zdw*U%K~%b2(p~F_kSVZi-(^qkT8*;oh0`#MXPN zy+hjcyLp{0bdHzp^K5DYF%s?rD)B`AVZXii7kfVkQJrk6RE#?l&oXOv5%LgQbl%`W zf_BJhF?ftQ7g)SzsPSw8VmSNV6}yZzr|0YClu-e$Aa#6PNN8OyN_FAWpoq}F&^ zB~`QCTWPzkqQeK@;nvWJnHqSMeJMKsPPMV~=|R`DJEEQ$murL*CZY>6UUt9H5_7y8 z7(lAaEGT}4{UVbpW&3)bPQ})H3bXvIBBZpyO7VDb>pSP6wLrB` zm0~5e8(Slv+8=W#HbW4+Z(E#%AY?{kN_soIgXhdq@qa z*6uFnym=?vtM};&r`1;b*#N{s$|AQwitUw>qnET0{z+CAdNEFxRcz4LY(^Qwce* z8C+ZTdD(L+Qfqt%k8I;|OIXMfEV+>Am0P4!!(TV{9i?c(1QrLO|b z3o}jngoO7S)mO7{VAh@`Ccb)tW@~=YPTMd?e(0^&J2YBWQMQU^+8q4q53~_F8^AE{ z#O3Gf*y%NTRr7smMSJ#B?^~puuLF0pPIgRj5r2e+1VhTSu^lM>-YDH2*!nD#Vzv{r!6hVIZwlB0FPtfx=Zu_(vgp z^sti5u#Q1@rGFNkw@1-SF4aD^+g`;nla?K$2F#FlD#3!0@>en0)Tb`o#lBvA?Ye6x z?`+RHqa@30;|1BC_m0c!N^sErEH-`Y##x)0WF|IodF9ImS?7L;pS+kD6Lq4}Y|=^l zBpkv1-B>)Y{AyeuEjWQnfkDjC(myZqjwiMZmd-*g|0Ou(R%AK1F3xz=XP;HZwjY|!hO@CO6T7>zU25KIDC9n%YKU?AGD|MT2ta@bLy(dM&&|4 zCGYTr~C!#D>v+H}}kk83I7 z*Sb_!Dix@GIhwG95c;FSDo-+PQ-#f_R9}1x$2)x-u{>j@wv^E-YOiA}*yVSo<ht(wF{jz3PBQdPI-zpkKRTX{AxVTcVjm2(A13AP` zkBO%GVI@|1yoCYkP?#oXMP`fq#Cn})Z*AelC93ZGEKis&h*Ntj#15$5^Qkaaao?;B ztBN8Cwr}Fwq8(BBX_A?f`qPuqEi@VOgwui#(t;nfotW+^D~jJ?m$BIq-=-yGbC%n`@Uz+X1iF4a6d|vu9%Bkh5{{~Gv!Ji+lMAg^s)lErz7Lb6vjPE7?etdosf_> zk#tKb?X**&tv127grd9K+COa|*}6@OH4oBT3|Ru8jpds34Gmq!ZQG%)rbouK?YLzm z%g-5avDzwsu6J(`I_4p--uL;b(=y6}(`719x?ZFHWWJXg5y%#+C0ort(zo8p0Hemv z4p(Pw;24%WZaotYtzynKJOUmJZ!Y`BDxL6o1uAlKaFO?eT1oQp*0br`ouaQQEFYaN zXV_I!v|a=;b*Kx4)n4cSPL__cP;rU!o)T<8T=h*laC{HG18j$U_1^rCAxHilk+u7V2wJX1egpqqwrN-LT zHB^=?M2{pfcJc?*JqNE`KW3kQw6EA%d66|^WCB!tW|C%{=bZ!A*)D*s{>G2H?}KSI z9*M*bBo|=Bn;1Z3oXCSG4D2RF@_-r|R)+}hiAOhsh0TRII&Z=2gwHi8Gy&n#ynEE? z@4K21B<6Isp;R6gfYW++bxh=U0E+xvhW~@z7QVai*26R%rv#yo+B*?F(3WY{WFpRKat5LAD8}1h)X)CyCGKUk?b*R`Q znArq66Ke{5@4O20zyJAuj|fBl{iNH~jeZ(V>2}`Z$j=O$H`(UQ`R3oXxOB~`_eS|Q z)R&v&SPdvf+?0mf*qOK7uSeiLzQ%Nxqg1hPbGSe%`>vE;$9w6VZ$ zAQIgS<-h9KIU318qwvkQ*T*G2Y~(S^Q(0Mv<+iV3-g`VBItgWf zPdz6D<+Am=h+jU2p3z6hA)Amj$XP$YAo4llXpq@O( zoveWFvTlpW=6x8FpLXRmM|G1?6i?L~v4|tW&yywjCXlorm=c2vW*!_12i6VC)kI5c zj~_!t2uu^TN z>|1$+y6q&A2hZu0)*M=S2}BZ?2B?U3#IS5mUNr(4V`wDTs%3xGfi6kpBX24#H;|bC z@V$2{{RGmZalZAg#hQ`ZoB;mI3xR&*$tIWhi)PWKf(=$}(b+UU;g*wJoj;|ySWnwb zJbp4C2|mG}U5L;{*Dzc+%+`%36lp>h`8p6goq_I{<_{37%D&RgyH`0lU5& zX%1WU3SI{}mTm1T>DxeSjZcp1_M?Ev%*T3|LF|`g(A#dC%dey6j&8Uc;yI#~JrZ5n zYgsP94c)a;Pw$mmyi`1+6qKOS&7E=6+LT>xgyv@>1Gl)C+RYz*{ao$L`Wewui>^kjIzs@g-o1GWUY%#sn=4u$`-IXvy>#?EMxU!zpvd?je>^U-$?2>i08i-g) zzOL1PN?JOCYrkn_c3-c-0bLJkSV%|r_9&l)qBiF%?Dj$}Vjr*EmkA->X{6@Qguc;y zZk`jsxP82NgF9`hv6|sCR$fi#0^8*k8UbzV*wP~JDDtDij!~h|nm%qyY%BD2S~Di_YOCgAoA0TC=jwG` zrPC)a#F#RFrC+JKX7%>Dn|u1p*tzR3Z-|msGdM-ob<5hE9niHA?2t!mdK`F%j$`ni zdyeL=)400brP=7WvZ>ASJ9oG@T!(w?UF_r*OY2ZdA~P}PZFsE7^c=SqAv1TnO+q3K*w5m{;0)Yid~1plP1KCgfkw9&0Z5sc$(U>M`kZkN z4=Ok>dO`g@3Lyx(=63wFL*Wssap&o|94`sj(WlS0?;uQ9WT5F+sV-@TNq&+n0hr*pY3f(}hKn?})Lm#Wk~} zDyH2!cFXsUeD-7BIi?G@IlF8#-|5F!uD-G7?sS$Q6!$ZVB#5565y`+KlVTQjRs0k0 znbYQE!O!cgihHMCU`e;?+sZ=ETIwbU{a_959+WgRs@ALL?)ixx6MCrTz~waPy1P64 zEJG}GpXYhs=-w6Tw4bMHCI>+}YWuS89utGJ%F`rzZvQ?}4bmx9@B>r8WcOkQscstF z^K!nc$Sa|r9;os3;_D+UEMa9JTuH#ImwBGV{jU}C+tlXVq&rM+)mAANGTa2p#fy!R zp#sLuRSJc5L*t};T@S8j001RbUw0J78Ak@9agGF{GHC5(EeJ@!Dub+LjG#vD8aO9{ zu0IK9;csk-@pr}`u^?3yMkQYb3V|z*i~{<)x)41Te3e0myb6@}gKh{2cnBdoD}!u| zOo1A1BpeVSg^+@RwR{QQaF7ZkP>F=aE0}9)|DvF@ltE5pvbzEV;^X5Z(b1H!rd>2t*kN{u!UE zyOGgf^hD2JDp2%*_@dk)Fexa+)fMu)g(q3dn?mv{p#N&&X-T=if|%nx-MmN`oR&9^ zNEZ2>0*m>}-rbAja+nSl1HrlATq#gbidWd*T1is14*V-%-7o~K!r`kN3NDSo z$jO7DC@2h!K**!OXnCYG7>7eZkr)_41}%sBjY^N`Nk$PdxC1H*xfFrI1CxbeF$fGE zOd&#p5qNo7FcL2h2V-P0cxfaSfkeZkf1@xV5hzuOa``=~11c=kZ7Dk44}@I2-~34+~cTh55sYC(0X#J#<8|`(p^>gd#fPC@cI| zN&VSR_%G9i#$jPtI9djbl*Yip2ssoAjKZK~!EhN_X(R?I2a`q1{hi&@4Nvw#k#Opc zluRkvP)g`98=&|vG0*%R@8g6!Pznl1fGITvleL7y6%cR*m^=vbD_O|Fn*K9eCCLBM zL+KFk+a^G<`=gJtxlr~h$X}b)FTD;V{D1uXnuq^K4;1Quo%|zx|CQ@sx&Dy?{|NkV zb^R;XKT_Zyf&ZsL!4VN;;!Nv60i$RJWAx_|y+GiBRL9cW)P!sxqbTt22kR zq?O+wFHYw;i`9k=N2-f)31qqtxb?)dw7><1xj*c8_^~FCj^#XS(F&rj1*~hS4Qo!$lni6umHG(Srx7O~25;g_`P02k_!A{eE`Mx` z6xY`+%)tLjA-OChsYOT`Yhj>c>&vJm8avIp@m$`X@T^>9?`7RNOq9^wT!7 z3vUyZ^lP*Xgbk5r;+L1ph3uoohEtA@eXrS}v0u1pxygkLr>F|h(=yg9KIahrKRTuD Al>h($ literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_lure.png b/graphics/object_events/pics/misc/ball_lure.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f6c1ffd9d0f9f35be02b5074378e02efb85bbb GIT binary patch literal 8434 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 V);CMq<*W8{V5D!ZSE}O@@jv}uAcg<{ literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_luxury.png b/graphics/object_events/pics/misc/ball_luxury.png new file mode 100644 index 0000000000000000000000000000000000000000..f04e816cb305f5bb8785f040e446ab7d043c07f8 GIT binary patch literal 8409 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 N-f1JPhnkLI{{w3W7bgG! literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_nest.png b/graphics/object_events/pics/misc/ball_nest.png new file mode 100644 index 0000000000000000000000000000000000000000..48a409183b1718811ba15340364fba1aa1989ca1 GIT binary patch literal 8329 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 A1ONa4 literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_park.png b/graphics/object_events/pics/misc/ball_park.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc3f1a9b0f4c2e2ee3086f914b0efedbac98d57 GIT binary patch literal 8457 zcmeHLXH-*Lw~bV#_pXE@MGS-l0)*bANk>2tF@yl2B#;CMAiXycLWK?P>T7kX`GwD3VYlN&8(F6cCH1WIQOR!_d>up&OAc>*QQi5X zkl5c6X*AGboEmTI5=NA`_p%Se|TGGf6w^alidyVx#G9@z1{hqZ!-1A})Q|ezxzoX=Am!zxPJz;DOQ9+si#` zQ*24&#rNIGGq>SEzaed`Ztc?-TZ1W|<9UWYD_W|wS{B%0n=Z>}aEUyWEd%)t2*6g6 z0l_(E4QrzFQ|Z!Pl%uUoFZBWIQJpn01!?r@l^1ve+IkSkJn7c^Ua&UP$42SMu4)cW z+YH~e<(3n!%Qd4bHkFuBWOpsYs=`6r2c%OTw7X`rlGgZYt#@mtkFV#0*-tG4ol(Yi zjQO=&ySJZoj}teF?QA8!6cq>kI2d|m8CYYfni)&JY&En~IMOYy-xH(Ny1FkU%cB#7<;ag2W4%u_r6W!I$GBAOyqbf`sy9pS31AP~@w--x`$39H%aRq| zlytV;xlBHMsYMr+Wyk+5i%1wB z9PepN5h{5|C=#;0$Bg_oGgk1!q@|aB?i@pS`yKV=v=7q8$S^6C_^20( zW=#h-eyv{qkYOx8SZMrFEPy9ECoJR5?Ae8GXP|DuWeU0-Usj%`Hefoy0l|>ci zyi~QA0Hm<2J@s}anAdoeUF8!MyOIQ(MRnfN$9ogpeG@|~U*lVGs~xiE09i#}tH~QZ z7hkROp*1&=<9%o)OBXh3fOWM$+Fn~`@a6N}$zahU@F>(VaVeYm%auTr;CM%pyX z)9R<6(M@%Vj6Ze5`WtKcW@Kg-otC)8BN|U8P{I11AQ!onk_rBhl{sh}eXIM+ihwDd zju{4(ihp{^OQ$Zld+OrWDQ-5$gv#Ylp{sKGHYIxeAKH1}6Fb@RKJ1>dz%T%_x{DR2QbcMusE1a-M(t|#kIn-0DASCKYR99iia(;fc~1hU9LTCl*7p0 zoLO61ZO7avFzkPBl zwo!7s??Lbzs$nVa#j?)$aY#v3qHKF0-Ac$BzazQX8;#GNWO@eKx;S6yE+4qT z?G@QNAJ!@o`95s#xlGYiLOA#5 zbig``qQ|L?Ij_^T@+mO`%VytldRw2^nrU1qb#dY6u56$%74V*B&lJ%$YV4Yf z^RB*r1@<~GcqIqa+tbUeCaxvoxQK;Rv4K25d zqu_{2LB!i8N@@tRMnyN3%@Bh+PvEasPEO##w9Sd)eGcn;X7zq6U2J`uT(uqr?o$4dAo{I>g{tuHcGAw1^n{L z8Pks6JpN#N(5(|dD*;9kK4sn!JGO!QKLIfX)0h}fb80zxvN|YX22O0@xLmdSn&R`E$D@&9 zcNe=`5uX?$?+y0qROLxt@DhD1c!jaQ@jJ8<7Xx%t6MJ$zExu+Y1)pb&ef zVY$$-BsiU%nI~bvK2-!Abvmc9`NYEq(PUaD@1*$vwt`QNN}Oj%ZeBD;xj97{-8m1j z%I{$q7=ngFJ`Vx*pC+Bw036I%6iOG*k~N|g;!hDqCCuzIBbF$9_vW-)0(`?Z#U42f z%BT_&gd>HTK8e@Sagx!A+%U=$$E!S#&Gow`n&VK{D9ebyxMUtBH{TM(Rl90b33ucQ zeHG98Lj6!*SkYQ9>5&mpV`wF!^MPdx6p+N@cS+=Cauowok(|wC_{$8L=5V43i>4_} zXGE?v1FN3Chrv`ypqOKflLKvfj0I4YNAltbA8d{SpdXfxOLQ**vqILsiY;cvC`Fq- zfe0*}r@=HgpXt4nuiDCV?Fans2y+BN!>&ceUPa-qg(auQoxEXi0dIGd@;Uvc=6I!{ z0+on^VgFq&5qe=Y(b}Sil+WmsYK%^#kx}2$p$r0Si@99aYQEq;$*%SE&8e$5?}uD} z9Sr8pc(W#?zSd7}<9+>ulhEaXT8;KxV9s3pw=5o+oBkq{x#Jh{`(z+B{SEL5U_nGN zA)4)yf|RK_Rg{W4p-g3;<1IEfG*9s4i7G*?jC$~uh7`3DrR2Mg;a!@NTnl609ekkq zK(VphMoM-5;TCn;wTEmOJD>cjjGWKiFsQO;y6`c|8xl@4a4%~Tvu~~d5#%m5Labi8 zXQ%>~b@8QkG~J2FJM;2G7R!z2_LJ1f@rbDR;#;@VnCM19GW$KcQ6 zEg~K_RPa@(_@sPobp?Jmk=^AK$z7oH{o>RO*$@)%tg=+HQaA4;q#EtnI zcc45I{EWarw5Hkn$h5Gv4{RDNJfr-NBTA#wPu&R7p-69L<#>csi%G{A3W!7s3nnB1 zdZ~(pEeds#l}cu?X|c*D9V4YLr||J5f6P~OP8qLFvDS+DSx5KH>a+LRcq&?f?n#K) zS%OVkHkqIo+gXDp#>Bg!~2WO-eHdTco3s=!^?ctdkkmJq^vT_*Iau89d)OF*6FY%5>#tscF2Y(F_h;Krnk zz^muqLtK5y-{0ZstG2TLG<^DI(+z;UMf|=+8HXC)fYIiKC$B*<=Vk62QZvodUt9^T;yg2tgO`JHPtZSn*|U~u67ZH$&%hc* zU!qMu{g{ydafgNz z7{#9&U;0SgBHc5m`Q|Dn3D$Rchn zKIJD4qZv_W9!{LnQKr|yfK4c<1wnMw#kXtM9ykMsu7$vIMH}cZT8O1GaSD-NWV)Gb zd)siThBq;mQ^#apV8(1DZa(Z}K?hCg_02&p#-4hQG{i;en_>aiO#L^T12y<{Pspex zD7c70Vn9n;4S6%mOzt~XZw*yDt~r?1=I_RxO(H88uST=Dueu^!O(pnXcr8~Z;}Ob< zQp=0DvAoa>d2fW<8MQ|Lu6IUUZcp7@`9tWi8XgG?X06`T9OodTppi{g0$WobxHk5866$27hm-8`bEb2KR+vZ{Phk~OY3>Ih`XBBslFSuq-yqMYV z$3s=BF7?t4M_7QCekz09#Fk2-SK9lpkIQ0Iq!b+h)+xg-9flh82)oeB=2!s`1v^!2 zz_nZY(eR6`Y^T&EVXUowV@ypzk2>X%e1szN*mgT;VWYO~0fnvrk zzo9k=%bdbdQ@MJ8eIDW^ zAVE0uL|^+9HKno&Vkw08M{4ztRQ|T?%XyJK&2IrOpQQ;`(WjS$Kc#;5?omau^P3tf z*h#2~=U8sMKj*8UPpXE}XyJewdgD@u^ArrXnSb$XZ71@H2!}~RgdA~^S|BpJvuBJon7lHHI(&RrN)=`FcZnbHF9u$)y$oSz z7r|e$Prw&cz2aG~)+lwBl^59#cHmQY%cu76`0=t{s>8c79nie(-nUyZk~He?^Z1Y| z2BC5Pu8r6b0B|B4t*L3Er>XhJ`2*?HAtNA3S+~iAEyCFRksye{lF75pB=dZ9th~Mi zM}r1hqI~iCdatT;@2$Kld75XG)Il6Y43b?n@G6?nNyg~1u-mzDDMULnXXY9D#2Xnt z-BY!DfSk*y!V&1H{QIapR%z*bcI@OOtBB}2rW-8KO$SG5+V0(&Cz!%lV%_U2du1B> z4GzJ^!dXr=2xcr(H|7d_K42OwVL-E{uokXPEgU#ov$W1TpWH;&O~*Sz$dJEy{%(!+ zioGSwVw!t8I@cvdYWAw7Jl4~)$ZJqVv>x&NL9s)Xkt^G&^8zt!T5b6cL(iSp`cjf) zFKD&n>2J^28@3z?!h-pNTOE-BNkn%3IAn)xlPv45bd5IZhvet+JUbWX&DCY=Xa8(xGX zvF?%x2dq6xlIVVPY6Ji%sS-U9NLLgAXpeG2W0VEIy{Z=kq8*e4tz-?sh8~(IXSA*# z4rT6VWP$W^MJhN5s;bZ^5#b~PcN75uB)Yp{@NlBC;4v?pbbmA~B?vr*5L}f7tqo0p znphkPC?hE&2?l8s(cTb26&j!t&cP9Grgh;r1?fpy(3wE+fJ;gF`1nZrKqav_Cn;$K z1qCTEL<#}{kq{ufFNT01f-rcYBZ^-fS|~gchxQ<#u^8YHC&C`LjBwl@kx z5c(^H1M*LM4=2(yIo|dxUk$<=Y7KwI%AKyyL%gaDu z_An5_-ccGP`_oT z1(3YGg91nfDF*{7KpasZB*I<+hP0Q1ImkHvg~AwzCUqsk?XOWCQ8|#P9HCH0S$l-+ z5fua^qW}hj6y#)NK?pEu0Op7QBV}cdsT`2-3s{^xf>chlJHiPi<$-ZJo;VU5u5O~I zEC`VV|7XO+4MA`u8IaZh8smWV!T)E<0_~16Cm@dWl$Ha_%F9X1L1blQq0+Eli61js zqHuUpFCMWKfmkn|LB24{jZaMr0>6S{VUf$Qs5tf z|Lv}S<@!eo{3Gzc-SvMa7tMcOcTgD8KOi5{%S>s|&0NxpkbucW3vFC;9w#R!7z{Qs zxgHl1RUF3rvhc;u8}Z#)$+fk$!^1;mDA<(*K4EX5qXmejJgrN5IOU;x84m!^vL0P0 z0QWPvNQ2Y_Jwt8kg%j-TjNEtpoZpgc;Cfo>7V_=OeYFNnYFt#SsknASO1USua^@hH zj6j|FHcx^n^jitNrs54F0xi;%6*jty)ZKPpYTpf9jWn_GG@Y2Eo(fnW*Rj8RxH%N- zWLSSyt#A4E7K7uSq^#>&tH?S>P|KMjDi}R^-?D!{w(fhJdEZtH!df9foLcX4Tkv;- zgvrOI?Hq9~Xd>fN_#2uBbdKr9D`lpNdV3qaQF6(dJ1vxyLvO69i)@XuW~v1YR{a?i5o5Cc&3@gPhm|B@0ead-TF*4DhyD-X C@vm-hOzHkb`r`mW(LDB%#6LVMnuV0$sUm{R6w4ySo^w9;=f3aHxzCw7C*IQBkcE+-5dZ+N7#rzX zlka}y3rI~x{#MqSz77DerG?tsldO?JKtBTB9gD*NNg;k1ASM{=4gdtddwCn1B2v#{ zaIheCf!Y_)F`G=yH!bkv$0egPkBh_HzrkpfLPr zPB3o--nh1nvrIqH&pJd$=G~NI9Gp_yN9%0YBWr5`ze);^?Xz|+mH|N3a0K|vz ztm|KK*)M zww#m;;#MBqVXhVpA0AofCW&Wh)VeZ{TM&+)47===1t zQQv2?y+RJ%eG(PV!hU`)pI<3YSF-Uh*ze%KnR)Tp4Jva{g25}3ZuB^aijx$dRg`n? zltrN|A;Td5RH5AI__^R~i8r1H5^mfHpIdghy(@*c@IE***%kCL$7tdJM6@Vewt#Kz zHtuVWsExT7?==RAFjWhURqC^YMro23(_z6}O6iDFsDJJcf zdQs%=g`o9YDIaG;A5PStd&?4KHZ&prgg9)IX_Ml-;w*ZH@^kxEzGa_OO%GuEVnFdJ zVlG{R@_g@?79P6qtitWy+$(N{!#?QZ;FrtXCgG5`8c&APpG$0gDHeU!*0E{*`3}vK zi}WVdFKbBKlS|;38(Tdy`x^nUS>}d&EKR_PWRa(96-%j4sqaYWy>h=+-1|7*NeOTkK)~YX^Hc?3?4Vlznr9UxvGV2=yhZGTB)8e=vpvR3-72FnwoCt zo&Vmi=hI(Q1ctr8&fZ(yZiC3C^z?o(d7+=IbewTb1_J7@~8hLxV0 z)1Tr}BMt4UW4RfNd&<1IZm(}zEpzxh>yGKzS`%oQ$AU}JjjS1??4zG03#J!-526ek zH+S+`_H^hBDatTDfO37{z(#D|Wfd2DKhBe95Ve+B|*q0ok3W<~7Z~>Ywz9huX^sj^lDO zGlF*F_+z&hIgZyuLAOTiJSsk$PnF3s$LJ5D04HEkxKb2^-aC7_^aH}oI8y&gTs8c zt?D|h^DP~l)*5}xt%hC&_$z;%p>?ooN&=*Pxp*Nn?j-Fp-)u#t-C2dt9U)G2Gt)Ue z$<-S_>iFwy9<@?XjpS67_L_8cHFv(kazaoNV{^;(J0s(dthv_f_0M|4`@Fqsv;`U) zUN}oI?pCVdQ-QTiy4js^ja1&T1D7!7X=?o&bFM;G(yn!jfJ?IoO;Y=B< z?4QmIOtBc-!=e`>)S?YbVavj^8Y&Z1-v#Eqd_(%m@ z3K%-4a{Pzu!>l3_``A#+WzS_DLq)MQ7GFET(Zazn-Wu2m2b$)$uk`{b7L(3dfR9yV z`2%|Ehm7fUS|X+O!RA9U`7%pC9Ns@>Z@)WCtnbb9+0lVUyjpDy7C(JniAqRsy-MNh z0wB6M=ba^B$Z1OD6<;u5pDPD-G3nuS9qt!-joMsCH<)b&Kbjt%zI8ziZq`j}m zu`E^ewU@p1@M#`Htx&|$$q?wN3Ob#2XH5%7+9^PqU=y(CM--cDD)qV6OY~BD!nJ#L z=FwhR%ZoiqP8$PV9^lkeo(Yrse#V8YMQPjXwe#9sZ6_{@@nY(3juNvKjUI3`=YMez z$33Y&9#5-6e3#?(UH{zx4m+NJyGy%X$C4zkl}0Q5e88H=FznN*gdvDZSU;Zvh}W{; z>uOw}j;EZTGjY1Ih3PEwGCexn3E_A9g>m(eSnIp%np-`kh2RNV<1_Zi+Lyx3W@)Kb z1TIO~1Z(a#b5)e~x%)b>DF&Ct3MZkFcRM-}6jswM#eMa{)wfw*2HS2@lqlyHd=;Oa z3wCZu2o;o!3=4E}>r=V5sh?+EI+ugsD&=sZa!R&pm{+{AY8WT_blU*jKjgt`8Pb!? zl8DH)5$GRK6E>=ANXb~eZ_3AB;1Nx)4$R$XOD`;)hD6E~n7?4x*E+Vpt6ajM%HyfZ zZq&vi`H--DS*-&4T+%Q_MgN_2Cg&>y3L+%*dr?SHlam8K;%1a7wuDH@qIo>1kjHxI z73h&x6Nl*HO?ksr?z-0(?tbob(wS$t<&?E#ssex+hJHx^8aBPOSBloYhIc1C;vjgi zr|S~~^sL5wdM;1a+&@cOFy3f=qoBBpq#YGg^^VzeA!*85VIH=c>GvF{1%uOb)w0Xp zlhiT7srkLskF{dJu%IXNwNFPI`?^*E)hqi*cZ94!vIdNb0RM44UpJhKW;1=KIhtMz1Q>}s=p+qxKHT1#P= zshDJbvV;B&1pdHtd`v0E;8T?4_sat{S;nzGZOiPCUKd`&agK4l*sH2*r^I7x!0W=t zjl^9_YWn3{a$V?c?K(p3o1&=<)~FpvOg>`@IkGy6PbLLtBrm4saExg)cnLcp7nywv zz1VAcW(Rb+ye+L4g)Vf~d<~1?7mO)2?86ADYj)tUaC#baHQbu+9b=(-QRSkTGP^(5 zQ*9ayr- zTZJMxB`zQTsU}7FV|L0!WP4VzlPxv66d+$|pUk~(Ajp2L$~g=aqL5Q4xx}I7wegMq z;A&QWrsZn@c+zW1259C^MW9=#iL%`82U1Q67xTzl)Y~Mdzgpqd$b6xytP~+-HN;{x z&L%FvpvMp~xX4Al>FSH^G1WOK09{?IQvp8L8fB`_yF0aft(J12beh3UH!?E+OZ+nZ zs2)R%X5NzF@K{CUJ?ocA!+E#@oz$hLP_2cn_to@_b%G`8UX(0N)I5==+d>?1GH;yT zp!>!*kTWz`RXvIl$vruYoedCWc;e3Gg$1R*D*wvPTM&P z+5%L0g>l3Q$~Za^!(wU-=|b+A8mO@L~{?q2g#ox7gqZ5E`ZCf0Pky#+tVUXhUPT3fZdR{qHYGp^`+BYu74=-&5pit?#w(pSz{x^%YQHD0w(N zaW=5^7M2c^PJ3GE4v3h3pxlUwj}gnOW7g9du5Cq;mXGx;>%ZkyH05L9U_+&dcVU}; znUCbO4DZ`!hM}H6Kckj#qRx^|l3W7rIr?(;{4O>e$e&O|eO$^~AfP8gsZhSEAlp1T z+X3CW_hsy1H0Vw1Wa7_$<2wEl-izawk##Cb$$rvZ+Mee*DT?64)#Eq)sJ`s8?q593 z$MGP&B!^ChEy+x_5EO^xj_Gpck`bZNEr{$clQP1II)2z^r>3M{sIE2~aPU6HOlu;i z`<#a_+mY=li>lPXooP)m=@8(;z@XJNWGhhQ+Ei^zIqP(l!n?TR;@-DH8>LHMrnCT5 z3qAH$0X3J^T86bM)2L{os!Ff8XHw%;C!nRV{CxQ&kktSrqu3aQqOuVU6WS0qX`#o8={ z%3Pux=Kw{eQ7Q*C!-r_}ea}C$dRH3qlACiM+B(V{nqoU(U$g##-Ml4G%U!e&OHHAW ztUM*nCD36?ZTMv-v?KD=lMA&CZg;pj@pPO061u8me1I!m6V)^nv)Veg8gJBl*ajQ( zyN!4yTpv_53kXx}wBXM8Qo4TRAW?(>HjQHHBHkBN%Z{l#4uQpN?*VH{G{?+N!FZIt zS#3wE=z%-;cUJGW2$4))dOxB>j>s_x__$Rwwev@n@^TI6?9;TwU43Do+bSS&#^8&t zo!}YPm4vZ;9b@h*lr?z|BE|+gsm17aTdoAR7@UZej1AF3WV{Xn4>v|Qu>UfdqI^kh@Kk_qh!`oHyjA?wV8?7K$JL#c0 zXiX-;HImg;o$bUk=1ponIEf+q6U~PdRQRdd{m#;32|xfJ9Mq+`=?V^f#MXMnK4pDb z-}MUmGMHs6;#>iZeHVQ~F@yvMi3)+sYq($Ix-m$AzB zHmKAwMok^N@-RBJ;A&d1i?t{F?B(`d<&~TlVOtbB54&vTt?x(`-` z0l+JHZKmqC9eP?HHZR}5^GWvA!^Yj8<(G4+P@WE9Zz_B> ztk&J%>x~&>dt?sJ`=7itI#0FAkncaV*G{NV?De&zk9-@=Z22Owlyr?-oszaT^6KYn z;wuz4Ra^Q~W%*J>wy_K^L93SxKBUpn;v<_CgM7advort>nZs)=etz_c>5^d+vlC4d z#N8*w>d%ClYY8r2t=YTD=SaL*@_CWHnW+j2?<0#u)L>K#Rv{DkU`R+{ zun*3cs1mFWI^tC!KOZ(jK)@pi$y*&{Z)OS9#S<_<1z81IIk0{(HV_8VU<9fW(C#YM zdIrBK$ZzT(PZG&b1p)~Q3X%5jyJ6_ngzU}Y4>9qg{8q@VzW!4)vd z3V)+A_9c>#z9`Hg6`5QXOXh(pq21teC=?jut{?|ia6==&2zeMBj8sA(P*6n_$_=LU zHwp^^mRyxc+~1=*q(YOa6x@(VxDrYc?2bYzffW!iMKBVEM1$dQs5~5{C?_X}MjTP0 zQ7Q&_f)A2BoLC>E2L|Hj>v7a^D7cEYrLj5)CM)+>izN<8awi**=K$6hjSnLJ)n$wI z!PtRvYbMmkB{ZFp{1^%zP{=dn^_}6v^<4gVr z6hz+4OqNzwkvBrZmZrA)gtkH+9v%n;(kBNrIdks%_1q_=HGO@f-@bj@+S)oeI4FEn zZ$bt$_!&760RSeB!;1otnZ-+Pq$3%d>C-JzFwt;GoJ=hHLf#02jrFu`mAk(VHkrSW z-vefmf$fM)1)S@~ab&L21v+!QF?{w9G zpl#02Ip^P-L`^;W=?ER(oT7ZUoJ%5DW;dJ}p1y8|KJha_euTwJ!}P*d?m*MF$)doA z<@l^oMjtx=$`BpKGM;g`3Q9`C4kxb7aYey3+H1G-D}VOjd@yEzEP0@!{}|_aDtVrA z3q(3$p069HjlUwMmE$je-$Q{zzmF+XyT+H4;c&xoJ%PD5(%Y+1tI6Td;BjkVv}{zo=34D#Wg*(_^YP z^+suk@1?nJ*hR0-dWcB+ljgG3Z$;sWW-PSr+f6%^Ip?n>og~qM$yx%8_09DvbzGzV E2NhEwhyVZp literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_quick.png b/graphics/object_events/pics/misc/ball_quick.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6c64b1b1b30a3a6586ffdb2692c92e07c9c4ad GIT binary patch literal 8529 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 Std&Sa19VV^8jsW*BK`;YT|mYF literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_repeat.png b/graphics/object_events/pics/misc/ball_repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..36186b094c5feaa4e609e0b32321aa0951b4ca33 GIT binary patch literal 8435 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 literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_sport.png b/graphics/object_events/pics/misc/ball_sport.png new file mode 100644 index 0000000000000000000000000000000000000000..1c32d2609ce47454e295bb5d06173a0659e84de8 GIT binary patch literal 8469 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 K`B42_#Qy-z%NvOR literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_strange.png b/graphics/object_events/pics/misc/ball_strange.png new file mode 100644 index 0000000000000000000000000000000000000000..ee09679dc2259c7a5ae162157037418f0ccb0776 GIT binary patch literal 9074 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

I3kqK)0{?V8^haeh~@fa;l zmJBoEF_vQYYS1r`*)>4fASx=u`7Qv*D-&%g`YMY!>m8vHoW&6%n{u`vivsbb$Ld!# zmSS}f^RU_(LEYq*WAYZ&RAVFbjXhp5&@TF^KRX8+c%5U=ZROQqOq;+nyYR+{YZitE zSKM7DqK{16SubzR3x#tt9|ttLPee%{8W4mCsT?E*}Trml~qjQ%s1N)5-F-W zcITO9W6Ac`O}}nb9I#7lES|%r(p^$k1U6oCepo`46*ci;rL=fJ_7*g zB8ggBX8KxMe;jks4!7g38nh8XiS{8vJ+}6CFy=GZ*F>xq^lS1v9#FMoj9X5u} zxD2HfHlWxmnOH)F%DClUG@%>VBW8GFYObW^$EW*UvT)&h&y^f>$9G`1We<>NOSm_# zz*c&jP{4QdCVJhNMQ@_1m_soZ7Lz(YnB<<_`Fx6Y0!=jGnLMEZo=}p z^A3>DqZfkT!A=^oudA#_YOqL$d}#W#A+~U>lYW3xY@B)rWh8f_$>y`8wUX64k#{lq zm(!siE?A@7J*~^UN7atEV(;fx;2TU_1=!>yV+An1r3DePa+sy6R7bG!9-QZA%zM*R z!(-=|5)N~eYD9hb+WvNC$F2X}W_qST0$mHVejm=v=o4<;S>KvWYWAl8niGDq;(e83 zc%$i%m^g&O$mzx)JSJ{D%^>d^HhcUcLRxp@)uA};nf-)p+S|l5{l4qx$%#EwFyH~Q zY)))uh8GAm-)?%+ve&e*?QR+vaz;v!620(!;Ueug5=f*SJKE5u2+o}(kHxz?66F0z z2ZxgY!09u79$1_!feLaYI1|aL;ML|MW{2GVk;5I{(Iq&y6w z?ML)MfYsPRrzv@8L~x z`;`tJ2PL=>NHkL~npgNgT#r{vHSo z{wME0tpCXUmod%C*cgp*$9W%wr;kwuANWV(-El-b`qwQMg@8FKD#9R0CpZFvL@GK# z9AQ`l1c7i=#w+0!@CapvzftLvy{K3+j&MLlBbO)AcnC^JBur670fI!}un;6l2@XLa zVG0nK5{|~Hh(su1k$m0^k~Ww^4kvJxBxLm>V#vL;ZxXtj923Wv!fe#_@z zV9>O5XwqU2DwRg?3qi{UtwkYVsqPdjcXu~c@Ig?Z1LUs)2c7e;GqTzn)!nt6{&IH;F|GlLCXea(J!=l<(xX{)r=%0(#?|L0b_<#8MeH{J|Ju`(N7~0-5#(=BTuS>8Pcen+-)+r{S{PN`wQ&w0J$R|8}e+w?nH^;XFM$?p=G!LJH zALqyMUO=L;NJI`p$XYK;t|n5W#c%FL;)@?E-Cce=`W?0w7tPni*L#>&y2U_FqN7P5&r`czDf@O literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_timer.png b/graphics/object_events/pics/misc/ball_timer.png new file mode 100644 index 0000000000000000000000000000000000000000..878d6ea5ba1c1461ae8797331b3145a0048d6588 GIT binary patch literal 8501 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 literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/ball_ultra.png b/graphics/object_events/pics/misc/ball_ultra.png new file mode 100644 index 0000000000000000000000000000000000000000..171281666fc509754e1facbd7c831d38951b2a05 GIT binary patch literal 8426 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 literal 0 HcmV?d00001 diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 0397e2409a..9e56392fe6 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -285,6 +285,10 @@ // will display correctly under bridges, etc. #define LARGE_OW_SUPPORT TRUE +// Followers will emerge from the pokeball they are stored in, +// instead of a normal pokeball +#define OW_MON_POKEBALLS TRUE + #define SHADOW_SIZE_S 0 #define SHADOW_SIZE_M 1 #define SHADOW_SIZE_L 2 diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index 438f517c97..902eb1c892 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -1938,5 +1938,8 @@ $(OBJEVENTGFXDIR)/pokemon/deoxys.4bpp: %.4bpp: %.png $(MISCGFXDIR)/emotes.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 2 +# All pokeballs are 16x32 +$(OBJEVENTGFXDIR)/misc/ball_%.4bpp: $(OBJEVENTGFXDIR)/misc/ball_%.png ; $(GFX) $< $@ -mwidth 2 -mheight 4 + graphics/door_anims/battle_tower_multi_corridor.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 2 -mheight 4 diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 3d37376682..3a658aa15e 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -343,6 +343,55 @@ const u32 gObjectEventPic_Noland[] = INCBIN_U32("graphics/object_events/pics/peo const u32 gObjectEventPic_Lucy[] = INCBIN_U32("graphics/object_events/pics/people/frontier_brains/lucy.4bpp"); const u32 gObjectEventPic_Brandon[] = INCBIN_U32("graphics/object_events/pics/people/frontier_brains/brandon.4bpp"); const u32 gObjectEventPic_AnimatedBall[] = INCBIN_U32("graphics/object_events/pics/misc/animated_ball.4bpp"); + +#if OW_MON_POKEBALLS +// Vanilla +const u32 gObjectEventPic_MasterBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_master.4bpp"); +const u32 gObjectEventPic_UltraBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_ultra.4bpp"); +const u32 gObjectEventPic_GreatBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_great.4bpp"); +const u32 gObjectEventPic_SafariBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_safari.4bpp"); +const u32 gObjectEventPic_NetBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_net.4bpp"); +const u32 gObjectEventPic_DiveBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_dive.4bpp"); +const u32 gObjectEventPic_NestBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_nest.4bpp"); +const u32 gObjectEventPic_RepeatBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_repeat.4bpp"); +const u32 gObjectEventPic_TimerBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_timer.4bpp"); +const u32 gObjectEventPic_LuxuryBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_luxury.4bpp"); +const u32 gObjectEventPic_PremierBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_premier.4bpp"); +// Gen IV/Sinnoh +#ifdef ITEM_DUSK_BALL +const u32 gObjectEventPic_DuskBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_dusk.4bpp"); +const u32 gObjectEventPic_HealBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_heal.4bpp"); +const u32 gObjectEventPic_QuickBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_quick.4bpp"); +const u32 gObjectEventPic_CherishBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_cherish.4bpp"); +#endif +#ifdef ITEM_PARK_BALL +const u32 gObjectEventPic_ParkBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_park.4bpp"); +#endif +// Gen II/Johto Apricorns +#ifdef ITEM_FAST_BALL +const u32 gObjectEventPic_FastBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_fast.4bpp"); +const u32 gObjectEventPic_LevelBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_level.4bpp"); +const u32 gObjectEventPic_LureBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_lure.4bpp"); +const u32 gObjectEventPic_HeavyBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_heavy.4bpp"); +const u32 gObjectEventPic_LoveBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_love.4bpp"); +const u32 gObjectEventPic_FriendBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_friend.4bpp"); +const u32 gObjectEventPic_MoonBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_moon.4bpp"); +const u32 gObjectEventPic_SportBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_sport.4bpp"); +#endif +// Gen V +#ifdef ITEM_DREAM_BALL +const u32 gObjectEventPic_DreamBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_dream.4bpp"); +#endif +// Gen VII +#ifdef ITEM_BEAST_BALL +const u32 gObjectEventPic_BeastBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_beast.4bpp"); +#endif +// Gen VIII +#ifdef ITEM_STRANGE_BALL +const u32 gObjectEventPic_StrangeBall[] = INCBIN_U32("graphics/object_events/pics/misc/ball_strange.4bpp"); +#endif +#endif + const u32 gObjectEventPic_Bulbasaur[] = INCBIN_U32("graphics/object_events/pics/pokemon/bulbasaur.4bpp"); const u32 gObjectEventPic_Ivysaur[] = INCBIN_U32("graphics/object_events/pics/pokemon/ivysaur.4bpp"); const u32 gObjectEventPic_Venusaur[] = INCBIN_U32("graphics/object_events/pics/pokemon/venusaur.4bpp"); @@ -788,3 +837,40 @@ const u16 gObjectEventPal_HoOh[] = INCBIN_U16("graphics/object_events/palettes/h const u16 gObjectEventPal_Lugia[] = INCBIN_U16("graphics/object_events/palettes/lugia.gbapal"); const u16 gObjectEventPaletteEmotes[] = INCBIN_U16("graphics/misc/emotes.gbapal"); + +#if OW_MON_POKEBALLS +// Palettes are small, so always include all of the palettes (no #ifdef) +// Vanilla +const u16 gObjectEventPal_MasterBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_master.gbapal"); +const u16 gObjectEventPal_UltraBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_ultra.gbapal"); +const u16 gObjectEventPal_GreatBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_great.gbapal"); +const u16 gObjectEventPal_SafariBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_safari.gbapal"); +const u16 gObjectEventPal_NetBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_net.gbapal"); +const u16 gObjectEventPal_DiveBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_dive.gbapal"); +const u16 gObjectEventPal_NestBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_nest.gbapal"); +const u16 gObjectEventPal_RepeatBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_repeat.gbapal"); +const u16 gObjectEventPal_TimerBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_timer.gbapal"); +const u16 gObjectEventPal_LuxuryBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_luxury.gbapal"); +const u16 gObjectEventPal_PremierBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_premier.gbapal"); +// Gen IV/Sinnoh +const u16 gObjectEventPal_DuskBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_dusk.gbapal"); +const u16 gObjectEventPal_HealBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_heal.gbapal"); +const u16 gObjectEventPal_QuickBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_quick.gbapal"); +const u16 gObjectEventPal_CherishBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_cherish.gbapal"); +const u16 gObjectEventPal_ParkBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_park.gbapal"); +// Gen II/Johto Apricorns +const u16 gObjectEventPal_FastBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_fast.gbapal"); +const u16 gObjectEventPal_LevelBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_level.gbapal"); +const u16 gObjectEventPal_LureBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_lure.gbapal"); +const u16 gObjectEventPal_HeavyBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_heavy.gbapal"); +const u16 gObjectEventPal_LoveBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_love.gbapal"); +const u16 gObjectEventPal_FriendBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_friend.gbapal"); +const u16 gObjectEventPal_MoonBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_moon.gbapal"); +const u16 gObjectEventPal_SportBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_sport.gbapal"); +// Gen V +const u16 gObjectEventPal_DreamBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_dream.gbapal"); +// Gen VII +const u16 gObjectEventPal_BeastBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_beast.gbapal"); +// Gen VIII +const u16 gObjectEventPal_StrangeBall[] = INCBIN_U16("graphics/object_events/pics/misc/ball_strange.gbapal"); +#endif diff --git a/src/data/object_events/object_event_graphics_info_followers.h b/src/data/object_events/object_event_graphics_info_followers.h index eb53f60d2c..6eeccde765 100644 --- a/src/data/object_events/object_event_graphics_info_followers.h +++ b/src/data/object_events/object_event_graphics_info_followers.h @@ -422,3 +422,71 @@ const struct ObjectEventGraphicsInfo gCastformObjectGraphics[] = { {0xFFFF, OBJ_EVENT_PAL_TAG_CASTFORM_RAINY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformRainy, gDummySpriteAffineAnimTable}, {0xFFFF, OBJ_EVENT_PAL_TAG_CASTFORM_SNOWY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSnowy, gDummySpriteAffineAnimTable}, }; + +#if OW_MON_POKEBALLS + +#define POKEBALL_GFX_INFO(NAME) \ + [BALL_##NAME] = { \ + .tileTag = TAG_NONE, \ + .paletteTag = OBJ_EVENT_PAL_TAG_BALL_##NAME, \ + .size = 256, \ + .width = 16, \ + .height = 32, \ + .shadowSize = SHADOW_SIZE_M, \ + .inanimate = TRUE, \ + .oam = &gObjectEventBaseOam_16x32, \ + .subspriteTables = sOamTables_16x32, \ + .anims = sAnimTable_Following, \ + .images = sPicTable_Ball_##NAME, \ + .affineAnims = gDummySpriteAffineAnimTable, \ + } + + +const struct ObjectEventGraphicsInfo gPokeballGraphics[POKEBALL_COUNT] = { + // Vanilla + POKEBALL_GFX_INFO(MASTER), + POKEBALL_GFX_INFO(ULTRA), + POKEBALL_GFX_INFO(GREAT), + POKEBALL_GFX_INFO(SAFARI), + POKEBALL_GFX_INFO(NET), + POKEBALL_GFX_INFO(DIVE), + POKEBALL_GFX_INFO(NEST), + POKEBALL_GFX_INFO(REPEAT), + POKEBALL_GFX_INFO(TIMER), + POKEBALL_GFX_INFO(LUXURY), + POKEBALL_GFX_INFO(PREMIER), + // Gen IV/Sinnoh pokeballs + #ifdef ITEM_DUSK_BALL + POKEBALL_GFX_INFO(DUSK), + POKEBALL_GFX_INFO(HEAL), + POKEBALL_GFX_INFO(QUICK), + POKEBALL_GFX_INFO(CHERISH), + #endif + #ifdef ITEM_PARK_BALL + POKEBALL_GFX_INFO(PARK), + #endif + // Gen II/Johto Apricorn pokeballs + #ifdef ITEM_FAST_BALL + POKEBALL_GFX_INFO(FAST), + POKEBALL_GFX_INFO(LEVEL), + POKEBALL_GFX_INFO(LURE), + POKEBALL_GFX_INFO(HEAVY), + POKEBALL_GFX_INFO(LOVE), + POKEBALL_GFX_INFO(FRIEND), + POKEBALL_GFX_INFO(MOON), + POKEBALL_GFX_INFO(SPORT), + #endif + // Gen V + #ifdef ITEM_DREAM_BALL + POKEBALL_GFX_INFO(DREAM), + #endif + // Gen VII + #ifdef ITEM_BEAST_BALL + POKEBALL_GFX_INFO(BEAST), + #endif + // Gen VIII + #ifdef ITEM_STRANGE_BALL + POKEBALL_GFX_INFO(STRANGE), + #endif +}; +#endif diff --git a/src/data/object_events/object_event_pic_tables.h b/src/data/object_events/object_event_pic_tables.h index 975694de11..bcd5f64e90 100755 --- a/src/data/object_events/object_event_pic_tables.h +++ b/src/data/object_events/object_event_pic_tables.h @@ -1987,9 +1987,136 @@ static const struct SpriteFrameImage sPicTable_AnimatedBall[] = { overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 2), overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 3), overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 4), - overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 5), + overworld_frame(gObjectEventPic_AnimatedBall, 2, 4, 0), }; +#if OW_MON_POKEBALLS + +#define POKEBALL_PIC_FRAMES(name) \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 0), \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 1), \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 2), \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 3), \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 4), \ + overworld_frame(gObjectEventPic_##name##Ball, 2, 4, 0) + + +static const struct SpriteFrameImage sPicTable_Ball_MASTER[] = { + POKEBALL_PIC_FRAMES(Master), +}; + +static const struct SpriteFrameImage sPicTable_Ball_ULTRA[] = { + POKEBALL_PIC_FRAMES(Ultra), +}; + +static const struct SpriteFrameImage sPicTable_Ball_GREAT[] = { + POKEBALL_PIC_FRAMES(Great), +}; + +static const struct SpriteFrameImage sPicTable_Ball_SAFARI[] = { + POKEBALL_PIC_FRAMES(Safari), +}; + +static const struct SpriteFrameImage sPicTable_Ball_NET[] = { + POKEBALL_PIC_FRAMES(Net), +}; + +static const struct SpriteFrameImage sPicTable_Ball_DIVE[] = { + POKEBALL_PIC_FRAMES(Dive), +}; + +static const struct SpriteFrameImage sPicTable_Ball_NEST[] = { + POKEBALL_PIC_FRAMES(Nest), +}; + +static const struct SpriteFrameImage sPicTable_Ball_REPEAT[] = { + POKEBALL_PIC_FRAMES(Repeat), +}; + +static const struct SpriteFrameImage sPicTable_Ball_TIMER[] = { + POKEBALL_PIC_FRAMES(Timer), +}; + +static const struct SpriteFrameImage sPicTable_Ball_LUXURY[] = { + POKEBALL_PIC_FRAMES(Luxury), +}; + +static const struct SpriteFrameImage sPicTable_Ball_PREMIER[] = { + POKEBALL_PIC_FRAMES(Premier), +}; + +// Gen IV/Sinnoh +#ifdef ITEM_DUSK_BALL +static const struct SpriteFrameImage sPicTable_Ball_DUSK[] = { + POKEBALL_PIC_FRAMES(Dusk), +}; +static const struct SpriteFrameImage sPicTable_Ball_HEAL[] = { + POKEBALL_PIC_FRAMES(Heal), +}; +static const struct SpriteFrameImage sPicTable_Ball_QUICK[] = { + POKEBALL_PIC_FRAMES(Quick), +}; +static const struct SpriteFrameImage sPicTable_Ball_CHERISH[] = { + POKEBALL_PIC_FRAMES(Cherish), +}; +#endif +#ifdef ITEM_PARK_BALL +static const struct SpriteFrameImage sPicTable_Ball_PARK[] = { + POKEBALL_PIC_FRAMES(Park), +}; +#endif + +// Gen II/Johto Apricorns +#ifdef ITEM_FAST_BALL +static const struct SpriteFrameImage sPicTable_Ball_FAST[] = { + POKEBALL_PIC_FRAMES(Fast), +}; +static const struct SpriteFrameImage sPicTable_Ball_LEVEL[] = { + POKEBALL_PIC_FRAMES(Level), +}; +static const struct SpriteFrameImage sPicTable_Ball_LURE[] = { + POKEBALL_PIC_FRAMES(Lure), +}; +static const struct SpriteFrameImage sPicTable_Ball_HEAVY[] = { + POKEBALL_PIC_FRAMES(Heavy), +}; +static const struct SpriteFrameImage sPicTable_Ball_LOVE[] = { + POKEBALL_PIC_FRAMES(Love), +}; +static const struct SpriteFrameImage sPicTable_Ball_FRIEND[] = { + POKEBALL_PIC_FRAMES(Friend), +}; +static const struct SpriteFrameImage sPicTable_Ball_MOON[] = { + POKEBALL_PIC_FRAMES(Moon), +}; +static const struct SpriteFrameImage sPicTable_Ball_SPORT[] = { + POKEBALL_PIC_FRAMES(Sport), +}; +#endif + +// Gen V +#ifdef ITEM_DREAM_BALL +static const struct SpriteFrameImage sPicTable_Ball_DREAM[] = { + POKEBALL_PIC_FRAMES(Dream), +}; +#endif + +// Gen VII +#ifdef ITEM_BEAST_BALL +static const struct SpriteFrameImage sPicTable_Ball_BEAST[] = { + POKEBALL_PIC_FRAMES(Beast), +}; +#endif + +// Gen VIII +#ifdef ITEM_STRANGE_BALL +static const struct SpriteFrameImage sPicTable_Ball_STRANGE[] = { + POKEBALL_PIC_FRAMES(Strange), +}; +#endif + +#endif + static const struct SpriteFrameImage sPicTable_Bulbasaur[] = { overworld_frame(gObjectEventPic_Bulbasaur, 4, 4, 0), overworld_frame(gObjectEventPic_Bulbasaur, 4, 4, 1), diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 6d498aee5f..0c2116437f 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1,5 +1,6 @@ #include "global.h" #include "malloc.h" +#include "battle_anim.h" #include "battle_pyramid.h" #include "battle_script_commands.h" #include "berry.h" @@ -23,6 +24,7 @@ #include "overworld.h" #include "palette.h" #include "pokemon.h" +#include "pokeball.h" #include "random.h" #include "region_map.h" #include "script.h" @@ -483,6 +485,41 @@ const u8 gInitialMovementTypeFacingDirections[] = { #define OBJ_EVENT_PAL_TAG_CASTFORM_SUNNY 0x1125 #define OBJ_EVENT_PAL_TAG_CASTFORM_RAINY 0x1126 #define OBJ_EVENT_PAL_TAG_CASTFORM_SNOWY 0x1127 +#if OW_MON_POKEBALLS +// Vanilla +#define OBJ_EVENT_PAL_TAG_BALL_MASTER 0x1150 +#define OBJ_EVENT_PAL_TAG_BALL_ULTRA 0x1151 +#define OBJ_EVENT_PAL_TAG_BALL_GREAT 0x1152 +#define OBJ_EVENT_PAL_TAG_BALL_SAFARI 0x1153 +#define OBJ_EVENT_PAL_TAG_BALL_NET 0x1154 +#define OBJ_EVENT_PAL_TAG_BALL_DIVE 0x1155 +#define OBJ_EVENT_PAL_TAG_BALL_NEST 0x1156 +#define OBJ_EVENT_PAL_TAG_BALL_REPEAT 0x1157 +#define OBJ_EVENT_PAL_TAG_BALL_TIMER 0x1158 +#define OBJ_EVENT_PAL_TAG_BALL_LUXURY 0x1159 +#define OBJ_EVENT_PAL_TAG_BALL_PREMIER 0x115A +// Gen IV/Sinnoh +#define OBJ_EVENT_PAL_TAG_BALL_DUSK 0x115B +#define OBJ_EVENT_PAL_TAG_BALL_HEAL 0x115C +#define OBJ_EVENT_PAL_TAG_BALL_QUICK 0x115D +#define OBJ_EVENT_PAL_TAG_BALL_CHERISH 0x115E +#define OBJ_EVENT_PAL_TAG_BALL_PARK 0x115F +// Gen II/Johto Apricorns +#define OBJ_EVENT_PAL_TAG_BALL_FAST 0x1160 +#define OBJ_EVENT_PAL_TAG_BALL_LEVEL 0x1161 +#define OBJ_EVENT_PAL_TAG_BALL_LURE 0x1162 +#define OBJ_EVENT_PAL_TAG_BALL_HEAVY 0x1163 +#define OBJ_EVENT_PAL_TAG_BALL_LOVE 0x1164 +#define OBJ_EVENT_PAL_TAG_BALL_FRIEND 0x1165 +#define OBJ_EVENT_PAL_TAG_BALL_MOON 0x1166 +#define OBJ_EVENT_PAL_TAG_BALL_SPORT 0x1167 +// Gen V +#define OBJ_EVENT_PAL_TAG_BALL_DREAM 0x1168 +// Gen VII +#define OBJ_EVENT_PAL_TAG_BALL_BEAST 0x1169 +// Gen VIII +#define OBJ_EVENT_PAL_TAG_BALL_STRANGE 0x116A +#endif #define OBJ_EVENT_PAL_TAG_EMOTES 0x8002 // Not a real OW palette tag; used for the white flash applied to followers #define OBJ_EVENT_PAL_TAG_WHITE (OBJ_EVENT_PAL_TAG_NONE - 1) @@ -536,6 +573,53 @@ static const struct SpritePalette sObjectEventSpritePalettes[] = { {gObjectEventPal_CastformSunny, OBJ_EVENT_PAL_TAG_CASTFORM_SUNNY}, {gObjectEventPal_CastformRainy, OBJ_EVENT_PAL_TAG_CASTFORM_RAINY}, {gObjectEventPal_CastformSnowy, OBJ_EVENT_PAL_TAG_CASTFORM_SNOWY}, + #if OW_MON_POKEBALLS + // Vanilla + {gObjectEventPal_MasterBall, OBJ_EVENT_PAL_TAG_BALL_MASTER}, + {gObjectEventPal_UltraBall, OBJ_EVENT_PAL_TAG_BALL_ULTRA}, + {gObjectEventPal_GreatBall, OBJ_EVENT_PAL_TAG_BALL_GREAT}, + {gObjectEventPal_SafariBall, OBJ_EVENT_PAL_TAG_BALL_SAFARI}, + {gObjectEventPal_NetBall, OBJ_EVENT_PAL_TAG_BALL_NET}, + {gObjectEventPal_DiveBall, OBJ_EVENT_PAL_TAG_BALL_DIVE}, + {gObjectEventPal_NestBall, OBJ_EVENT_PAL_TAG_BALL_NEST}, + {gObjectEventPal_RepeatBall, OBJ_EVENT_PAL_TAG_BALL_REPEAT}, + {gObjectEventPal_TimerBall, OBJ_EVENT_PAL_TAG_BALL_TIMER}, + {gObjectEventPal_LuxuryBall, OBJ_EVENT_PAL_TAG_BALL_LUXURY}, + {gObjectEventPal_PremierBall, OBJ_EVENT_PAL_TAG_BALL_PREMIER}, + // Gen IV/Sinnoh pokeballs + #ifdef ITEM_DUSK_BALL + {gObjectEventPal_DuskBall, OBJ_EVENT_PAL_TAG_BALL_DUSK}, + {gObjectEventPal_HealBall, OBJ_EVENT_PAL_TAG_BALL_HEAL}, + {gObjectEventPal_QuickBall, OBJ_EVENT_PAL_TAG_BALL_QUICK}, + {gObjectEventPal_CherishBall, OBJ_EVENT_PAL_TAG_BALL_CHERISH}, + #endif + #ifdef ITEM_PARK_BALL + {gObjectEventPal_ParkBall, OBJ_EVENT_PAL_TAG_BALL_PARK}, + #endif + // Gen II/Johto Apricorn pokeballs + #ifdef ITEM_FAST_BALL + {gObjectEventPal_FastBall, OBJ_EVENT_PAL_TAG_BALL_FAST}, + {gObjectEventPal_LevelBall, OBJ_EVENT_PAL_TAG_BALL_LEVEL}, + {gObjectEventPal_LureBall, OBJ_EVENT_PAL_TAG_BALL_LURE}, + {gObjectEventPal_HeavyBall, OBJ_EVENT_PAL_TAG_BALL_HEAVY}, + {gObjectEventPal_LoveBall, OBJ_EVENT_PAL_TAG_BALL_LOVE}, + {gObjectEventPal_FriendBall, OBJ_EVENT_PAL_TAG_BALL_FRIEND}, + {gObjectEventPal_MoonBall, OBJ_EVENT_PAL_TAG_BALL_MOON}, + {gObjectEventPal_SportBall, OBJ_EVENT_PAL_TAG_BALL_SPORT}, + #endif + // Gen V + #ifdef ITEM_DREAM_BALL + {gObjectEventPal_DreamBall, OBJ_EVENT_PAL_TAG_BALL_DREAM}, + #endif + // Gen VII + #ifdef ITEM_BEAST_BALL + {gObjectEventPal_BeastBall, OBJ_EVENT_PAL_TAG_BALL_BEAST}, + #endif + // Gen VIII + #ifdef ITEM_STRANGE_BALL + {gObjectEventPal_StrangeBall, OBJ_EVENT_PAL_TAG_BALL_STRANGE}, + #endif + #endif {gObjectEventPaletteEmotes, OBJ_EVENT_PAL_TAG_EMOTES}, {NULL, OBJ_EVENT_PAL_TAG_NONE}, }; @@ -6669,6 +6753,26 @@ static u8 LoadFillColorPalette(u16 color, u16 paletteTag, struct Sprite *sprite) return UpdateSpritePalette(&dynamicPalette, sprite); } +static void ObjectEventSetPokeballGfx(struct ObjectEvent *objEvent) { + #if OW_MON_POKEBALLS + u32 ball = BALL_POKE; + if (objEvent->localId == OBJ_EVENT_ID_FOLLOWER) { + struct Pokemon *mon = GetFirstLiveMon(); + if (mon) + ball = ItemIdToBallId(GetMonData(mon, MON_DATA_POKEBALL)); + } + + if (ball != BALL_POKE && ball < POKEBALL_COUNT) { + const struct ObjectEventGraphicsInfo *info = &gPokeballGraphics[ball]; + if (info->tileTag == TAG_NONE) { + ObjectEventSetGraphics(objEvent, info); + return; + } + } + #endif + ObjectEventSetGraphicsId(objEvent, OBJ_EVENT_GFX_ANIMATED_BALL); +} + bool8 MovementAction_ExitPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 direction = gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; objectEvent->invisible = FALSE; @@ -6682,7 +6786,7 @@ bool8 MovementAction_ExitPokeball_Step0(struct ObjectEvent *objectEvent, struct sprite->data[6] = 1; // slow speed } sprite->data[6] |= (direction == DIR_EAST ? 1 : 0) << 4; - ObjectEventSetGraphicsId(objectEvent, OBJ_EVENT_GFX_ANIMATED_BALL); + ObjectEventSetPokeballGfx(objectEvent); objectEvent->inanimate = FALSE; return MovementAction_ExitPokeball_Step1(objectEvent, sprite); } @@ -6801,7 +6905,7 @@ bool8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *objectEvent, struct sprite->affineAnimEnded = TRUE; FreeSpriteOamMatrix(sprite); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; - ObjectEventSetGraphicsId(objectEvent, OBJ_EVENT_GFX_ANIMATED_BALL); + ObjectEventSetPokeballGfx(objectEvent); objectEvent->inanimate = FALSE; } return FALSE; From ebbcb7d025cff716eec5008b5dd2b7d55aa8c3f3 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 22 Jan 2024 19:09:44 -0300 Subject: [PATCH 02/12] Whitespace, documentation and style --- data/event_scripts.s | 4 +- data/field_effect_scripts.s | 2 +- data/maps/AncientTomb/map.json | 6 +- data/maps/AncientTomb/scripts.inc | 3 +- .../scripts.inc | 6 +- .../map.json | 14 +- .../scripts.inc | 2 +- .../scripts.inc | 8 +- .../scripts.inc | 6 +- .../scripts.inc | 7 +- .../scripts.inc | 9 +- .../scripts.inc | 9 +- .../scripts.inc | 10 +- data/maps/DesertRuins/scripts.inc | 3 +- data/maps/FortreeCity_Gym/scripts.inc | 2 +- data/maps/IslandCave/map.json | 6 +- data/maps/IslandCave/scripts.inc | 2 +- data/maps/MossdeepCity_Gym/scripts.inc | 6 +- data/maps/Route123/map.json | 2 +- data/maps/RusturfTunnel/scripts.inc | 1 + .../scripts.inc | 3 +- data/maps/SootopolisCity/scripts.inc | 2 +- data/maps/TrainerHill_Entrance/scripts.inc | 4 +- data/maps/map_groups.json | 1 - data/scripts/battle_pike.inc | 6 +- data/scripts/day_care.inc | 2 +- data/scripts/field_move_scripts.inc | 2 +- data/scripts/flash.inc | 2 +- data/scripts/follower.inc | 958 +++++++-------- data/scripts/pkmn_center_nurse.inc | 2 +- data/scripts/secret_base.inc | 2 +- data/scripts/trainer_battle.inc | 6 +- gflib/sprite.c | 8 +- include/constants/field_effects.h | 10 +- include/field_effect_helpers.h | 6 +- include/follower_helper.h | 24 +- src/data/field_effects/field_effect_objects.h | 239 ++-- src/data/object_events/object_event_anims.h | 10 +- .../object_event_graphics_info_followers.h | 840 ++++++------- src/event_object_movement.c | 1080 +++++++++-------- src/field_effect.c | 2 +- src/field_effect_helpers.c | 22 +- src/field_screen_effect.c | 8 +- src/load_save.c | 10 +- src/main.c | 12 +- src/overworld.c | 13 +- src/palette.c | 38 +- src/party_menu.c | 4 +- src/pokeball.c | 3 +- src/rayquaza_scene.c | 2 + src/scrcmd.c | 28 +- src/shop.c | 5 +- src/trainer_pokemon_sprites.c | 2 +- src/trainer_see.c | 115 +- 54 files changed, 1910 insertions(+), 1669 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index fbd69ca133..070baa7641 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -720,7 +720,7 @@ Common_EventScript_OutOfCenterPartyHeal:: playfanfare MUS_HEAL waitfanfare special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon fadescreen FADE_FROM_BLACK return @@ -1054,7 +1054,7 @@ Common_EventScript_LegendaryFlewAway:: .include "data/scripts/move_tutors.inc" .include "data/scripts/trainer_hill.inc" .include "data/scripts/test_signpost.inc" - .include "data/scripts/follower.inc" + .include "data/scripts/follower.inc" .include "data/text/frontier_brain.inc" .include "data/text/save.inc" .include "data/text/birch_speech.inc" diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index 117ae710ca..c1890358d5 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -72,7 +72,7 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_RayquazaSpotlight @ FLDEFF_RAYQUAZA_SPOTLIGHT .4byte gFieldEffectScript_DestroyDeoxysRock @ FLDEFF_DESTROY_DEOXYS_ROCK .4byte gFieldEffectScript_MoveDeoxysRock @ FLDEFF_MOVE_DEOXYS_ROCK - .4byte gFieldEffectScript_TracksSlither @ FLDEFF_TRACKS_SLITHER + .4byte gFieldEffectScript_TracksSlither @ FLDEFF_TRACKS_SLITHER .4byte gFieldEffectScript_TracksBug @ FLDEFF_TRACKS_BUG .4byte gFieldEffectScript_TracksSpot @ FLDEFF_TRACKS_SPOT diff --git a/data/maps/AncientTomb/map.json b/data/maps/AncientTomb/map.json index 16df613a49..818dbf23a0 100644 --- a/data/maps/AncientTomb/map.json +++ b/data/maps/AncientTomb/map.json @@ -12,7 +12,7 @@ "allow_running": true, "show_map_name": true, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", - "connections": 0, + "connections": null, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_OW_MON", @@ -51,9 +51,7 @@ "dest_warp_id": "1" } ], - "coord_events": [ - - ], + "coord_events": [], "bg_events": [ { "type": "sign", diff --git a/data/maps/AncientTomb/scripts.inc b/data/maps/AncientTomb/scripts.inc index ca9464f7ee..906d64ecf5 100644 --- a/data/maps/AncientTomb/scripts.inc +++ b/data/maps/AncientTomb/scripts.inc @@ -55,7 +55,7 @@ AncientTomb_EventScript_CaveEntranceSide:: end AncientTomb_EventScript_Registeel:: - bufferspeciesname 0, SPECIES_REGISTEEL + bufferspeciesname 0, SPECIES_REGISTEEL lock faceplayer waitse @@ -84,3 +84,4 @@ AncientTomb_EventScript_RanFromRegisteel:: setvar VAR_0x8004, SPECIES_REGISTEEL goto Common_EventScript_LegendaryFlewAway end + diff --git a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc index 08e749b4a6..61dcb79e99 100644 --- a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc @@ -75,7 +75,7 @@ BattleFrontier_BattleArenaLobby_EventScript_SaveAfterChallenge:: frontier_checkairshow special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon arena_save 0 playse SE_SAVE waitse @@ -134,7 +134,7 @@ BattleFrontier_BattleArenaLobby_EventScript_TryEnterChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleArenaLobby_Text_SelectThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -196,7 +196,7 @@ BattleFrontier_BattleArenaLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattleArenaLobby_EventScript_LoadPartyAndCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattleArenaLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattleArenaLobby_Text_AwaitAnotherChallenge, MSGBOX_DEFAULT BattleFrontier_BattleArenaLobby_EventScript_EndCancelChallenge:: diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json b/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json index f4c52ce05f..c2b427cbe3 100644 --- a/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json +++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json @@ -12,7 +12,7 @@ "allow_running": false, "show_map_name": false, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", - "connections": 0, + "connections": null, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_REPORTER_M", @@ -210,13 +210,7 @@ "flag": "0" } ], - "warp_events": [ - - ], - "coord_events": [ - - ], - "bg_events": [ - - ] + "warp_events": [], + "coord_events": [], + "bg_events": [] } diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc index 31314b5982..6279cacf27 100644 --- a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc @@ -17,7 +17,7 @@ BattleFrontier_BattleDomeBattleRoom_MapScripts:: .byte 0 BattleFrontier_BattleDomeBattleRoom_OnTransition: - setflag FLAG_TEMP_HIDE_FOLLOWER + setflag FLAG_TEMP_HIDE_FOLLOWER dome_setopponentgfx frontier_get FRONTIER_DATA_BATTLE_NUM copyvar VAR_TEMP_F, VAR_RESULT diff --git a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc index edc651287c..fb28b7ad75 100644 --- a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc @@ -68,7 +68,7 @@ BattleFrontier_BattleDomeLobby_EventScript_GiveBattlePoints:: dome_set DOME_DATA_WIN_STREAK_ACTIVE, TRUE special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon goto BattleFrontier_BattleDomeLobby_EventScript_AskRecordBattle BattleFrontier_BattleDomeLobby_EventScript_LostChallenge:: @@ -83,7 +83,7 @@ BattleFrontier_BattleDomeLobby_EventScript_LostChallenge:: dome_set DOME_DATA_ATTEMPTED_CHALLENGE, TRUE special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattleDomeLobby_EventScript_AskRecordBattle:: dome_save 0 playse SE_SAVE @@ -162,7 +162,7 @@ BattleFrontier_BattleDomeLobby_EventScript_TryEnterChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleDomeLobby_Text_SelectThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -225,7 +225,7 @@ BattleFrontier_BattleDomeLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattleDomeLobby_EventScript_LoadPartyCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattleDomeLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattleDomeLobby_Text_HopeToSeeYouAgain, MSGBOX_DEFAULT BattleFrontier_BattleDomeLobby_EventScript_EndCancelChallenge:: diff --git a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc index d41741d13b..5475fc146f 100644 --- a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc @@ -59,7 +59,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_GiveBattlePoints:: waitmessage frontier_checkairshow special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon factory_save 0 playse SE_SAVE waitse @@ -72,7 +72,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_LostChallenge:: waitmessage frontier_checkairshow special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon factory_set FACTORY_DATA_WIN_STREAK_ACTIVE, FALSE factory_save 0 playse SE_SAVE @@ -198,7 +198,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattleFactoryLobby_EventScript_LoadPartyAndCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattleFactoryLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattleFactoryLobby_Text_LookForwardToNextVisit, MSGBOX_DEFAULT release diff --git a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc index 9f80421e14..33d3735884 100644 --- a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc @@ -76,7 +76,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_SaveAfterChallenge:: frontier_checkairshow special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon palace_save 0 playse SE_SAVE waitse @@ -152,7 +152,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_TryEnterChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattlePalaceLobby_Text_NowSelectThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -217,7 +217,7 @@ BattleFrontier_BattlePalaceLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattlePalaceLobby_EventScript_LoadPartyAndCancelChallenge:: special LoadPlayerParty - callnative LoadPlayerParty + callnative LoadPlayerParty BattleFrontier_BattlePalaceLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattlePalaceLobby_Text_ReturnWhenFortified, MSGBOX_DEFAULT BattleFrontier_BattlePalaceLobby_EventScript_EndCancelChallenge:: @@ -650,3 +650,4 @@ BattleFrontier_BattlePalaceLobby_Text_ExplainRulesWhenInDanger: .string "nature when it is in trouble.\p" .string "If a POKéMON begins behaving oddly\n" .string "in a pinch, watch it carefully.$" + diff --git a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc index 0b7cd130e6..b37100bc0a 100644 --- a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc @@ -59,7 +59,7 @@ BattleFrontier_BattlePikeLobby_EventScript_GiveBattlePoints:: pike_set PIKE_DATA_TOTAL_STREAKS, VAR_RESULT special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon pike_resethelditems message BattleFrontier_BattlePikeLobby_Text_ShallRecordResults waitmessage @@ -81,7 +81,7 @@ BattleFrontier_BattlePikeLobby_EventScript_LostChallenge:: pike_set PIKE_DATA_WIN_STREAK_ACTIVE, FALSE special LoadPlayerParty special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon pike_resethelditems pike_save 0 playse SE_SAVE @@ -121,7 +121,7 @@ BattleFrontier_BattlePikeLobby_EventScript_TryEnterChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattlePikeLobby_Text_PleaseChooseThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -186,7 +186,7 @@ BattleFrontier_BattlePikeLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattlePikeLobby_EventScript_LoadPartyAndCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattlePikeLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattlePikeLobby_Text_LookForwardToSeeingYou, MSGBOX_DEFAULT BattleFrontier_BattlePikeLobby_EventScript_EndCancelChallenge:: @@ -434,3 +434,4 @@ BattleFrontier_BattlePikeLobby_Text_ExplainMonOrderRules: .string "changed.\p" .string "The sequence must be set before\n" .string "starting your challenge.$" + diff --git a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc index 12734a2947..1768411616 100644 --- a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc @@ -59,7 +59,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_GiveBattlePoints:: special LoadPlayerParty pyramid_clearhelditems special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon message BattleFrontier_BattlePyramidLobby_Text_UsedBattleBagWillBeKept waitmessage playse SE_EXP_MAX @@ -84,7 +84,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_LostChallenge:: special LoadPlayerParty pyramid_clearhelditems special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon lockall message BattleFrontier_BattlePyramidLobby_Text_DisappointingHereIsBag waitmessage @@ -134,7 +134,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_TryEnterChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattlePyramidLobby_Text_SelectThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -199,7 +199,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattlePyramidLobby_EventScript_LoadPartyAndCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattlePyramidLobby_EventScript_CancelChallenge:: msgbox BattleFrontier_BattlePyramidLobby_Text_AwaitFutureChallenge, MSGBOX_DEFAULT BattleFrontier_BattlePyramidLobby_EventScript_EndCancelChallenge:: @@ -904,3 +904,4 @@ BattleFrontier_BattlePyramidLobby_Text_ExplainBagRules: .string "of ten kinds of items.\p" .string "The contents of the BATTLE BAG are\n" .string "lost if you fail in your quest.$" + diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index 27591cc6b4..d18e2629a1 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -202,7 +202,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterSinglesChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleTowerLobby_Text_SelectThreeMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_PARTY_SIZE @@ -266,7 +266,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterDoublesChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleTowerLobby_Text_PleaseSelectFourMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_DOUBLES_PARTY_SIZE @@ -331,7 +331,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterMultisChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleTowerLobby_Text_PleaseSelectTwoMons, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_MULTI_PARTY_SIZE @@ -395,7 +395,7 @@ BattleFrontier_BattleTowerLobby_EventScript_TryEnterLinkMultisChallenge:: frontier_set FRONTIER_DATA_LVL_MODE, VAR_RESULT msgbox BattleFrontier_BattleTowerLobby_Text_PleaseSelectTwoMons2, MSGBOX_DEFAULT fadescreen FADE_TO_BLACK - callnative RemoveFollowingPokemon + callnative RemoveFollowingPokemon call BattleFrontier_EventScript_GetLvlMode copyvar VAR_0x8004, VAR_RESULT setvar VAR_0x8005, FRONTIER_MULTI_PARTY_SIZE @@ -588,7 +588,7 @@ BattleFrontier_BattleTowerLobby_EventScript_CancelChallengeSaveFailed:: BattleFrontier_BattleTowerLobby_EventScript_LoadPartyCancelChallenge:: special LoadPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon BattleFrontier_BattleTowerLobby_EventScript_CancelChallenge:: special CloseLink msgbox BattleFrontier_BattleTowerLobby_Text_LookForwardToAnotherChallenge, MSGBOX_DEFAULT diff --git a/data/maps/DesertRuins/scripts.inc b/data/maps/DesertRuins/scripts.inc index c5759ea52d..913eb497c8 100644 --- a/data/maps/DesertRuins/scripts.inc +++ b/data/maps/DesertRuins/scripts.inc @@ -55,7 +55,7 @@ DesertRuins_EventScript_CaveEntranceSide:: end DesertRuins_EventScript_Regirock:: - bufferspeciesname 0, SPECIES_REGIROCK + bufferspeciesname 0, SPECIES_REGIROCK lock faceplayer waitse @@ -84,3 +84,4 @@ DesertRuins_EventScript_RanFromRegirock:: setvar VAR_0x8004, SPECIES_REGIROCK goto Common_EventScript_LegendaryFlewAway end + diff --git a/data/maps/FortreeCity_Gym/scripts.inc b/data/maps/FortreeCity_Gym/scripts.inc index 6812dc4345..1c9a2756d4 100644 --- a/data/maps/FortreeCity_Gym/scripts.inc +++ b/data/maps/FortreeCity_Gym/scripts.inc @@ -5,7 +5,7 @@ FortreeCity_Gym_MapScripts:: FortreeCity_Gym_OnTransition: special RotatingGate_InitPuzzle - setflag FLAG_TEMP_HIDE_FOLLOWER @ Hide follower bc of rotating gates + setflag FLAG_TEMP_HIDE_FOLLOWER @ Hide follower bc of rotating gates end FortreeCity_Gym_OnWarp: diff --git a/data/maps/IslandCave/map.json b/data/maps/IslandCave/map.json index 24c6e0cd27..3ed75460d0 100644 --- a/data/maps/IslandCave/map.json +++ b/data/maps/IslandCave/map.json @@ -12,7 +12,7 @@ "allow_running": true, "show_map_name": true, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", - "connections": 0, + "connections": null, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_OW_MON", @@ -51,9 +51,7 @@ "dest_warp_id": "1" } ], - "coord_events": [ - - ], + "coord_events": [], "bg_events": [ { "type": "sign", diff --git a/data/maps/IslandCave/scripts.inc b/data/maps/IslandCave/scripts.inc index 1fe8ae22cf..e2fb2534ba 100644 --- a/data/maps/IslandCave/scripts.inc +++ b/data/maps/IslandCave/scripts.inc @@ -88,7 +88,7 @@ IslandCave_EventScript_ClearSteps:: return IslandCave_EventScript_Regice:: - bufferspeciesname 0, SPECIES_REGICE + bufferspeciesname 0, SPECIES_REGICE lock faceplayer waitse diff --git a/data/maps/MossdeepCity_Gym/scripts.inc b/data/maps/MossdeepCity_Gym/scripts.inc index 5033bc6e57..a7b6aaa2bd 100644 --- a/data/maps/MossdeepCity_Gym/scripts.inc +++ b/data/maps/MossdeepCity_Gym/scripts.inc @@ -1,13 +1,13 @@ MossdeepCity_Gym_MapScripts:: - map_script MAP_SCRIPT_ON_TRANSITION, MossdeepCity_Gym_OnTransition + map_script MAP_SCRIPT_ON_TRANSITION, MossdeepCity_Gym_OnTransition map_script MAP_SCRIPT_ON_LOAD, MossdeepCity_Gym_OnLoad .byte 0 @ NOTE: Mossdeep Gym was redesigned between R/S and E. Leftover (and now functionally unused) scripts are commented below MossdeepCity_Gym_OnTransition: - setflag FLAG_TEMP_HIDE_FOLLOWER @ Hide follower since it can collide with moving statues - end + setflag FLAG_TEMP_HIDE_FOLLOWER @ Hide follower since it can collide with moving statues + end @ All the below checks are leftover from RS. FLAG_MOSSDEEP_GYM_SWITCH_X is never set MossdeepCity_Gym_OnLoad: diff --git a/data/maps/Route123/map.json b/data/maps/Route123/map.json index ca0d757e3a..11798b95d4 100644 --- a/data/maps/Route123/map.json +++ b/data/maps/Route123/map.json @@ -559,7 +559,7 @@ "flag": "0" }, { - "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", + "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", "x": 14, "y": 12, "elevation": 3, diff --git a/data/maps/RusturfTunnel/scripts.inc b/data/maps/RusturfTunnel/scripts.inc index f0dd37805f..7c6100a009 100644 --- a/data/maps/RusturfTunnel/scripts.inc +++ b/data/maps/RusturfTunnel/scripts.inc @@ -530,3 +530,4 @@ RusturfTunnel_Text_MikePostBattle: .string "They halted development here to\n" .string "protect POKéMON, right?\l" .string "There's a feel-good story!$" + diff --git a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc index cf3767d0ed..541cb68db9 100644 --- a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc +++ b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc @@ -79,7 +79,7 @@ SlateportCity_OceanicMuseum_2F_EventScript_CaptStern:: playfanfare MUS_HEAL waitfanfare special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon removeobject LOCALID_CAPT_STERN setflag FLAG_HIDE_ROUTE_110_TEAM_AQUA call_if_eq VAR_REGISTER_BIRCH_STATE, 0, SlateportCity_OceanicMuseum_2F_EventScript_ReadyRegisterBirch @@ -438,3 +438,4 @@ SlateportCity_OceanicMuseum_2F_Text_SSAnneReplica: .string "“S.S. ANNE\p" .string "“A replica of the luxury liner that\n" .string "circles the globe.”$" + diff --git a/data/maps/SootopolisCity/scripts.inc b/data/maps/SootopolisCity/scripts.inc index 5b72e77be5..938fd96c69 100644 --- a/data/maps/SootopolisCity/scripts.inc +++ b/data/maps/SootopolisCity/scripts.inc @@ -495,7 +495,7 @@ SootopolisCity_EventScript_RayquazaSceneFromPokeCenter:: removeobject LOCALID_GROUDON removeobject LOCALID_KYOGRE addobject LOCALID_RAYQUAZA - hideobjectat LOCALID_RAYQUAZA, MAP_SOOTOPOLIS_CITY + hideobjectat LOCALID_RAYQUAZA, MAP_SOOTOPOLIS_CITY setvar VAR_0x8004, TRUE special Script_DoRayquazaScene waitstate diff --git a/data/maps/TrainerHill_Entrance/scripts.inc b/data/maps/TrainerHill_Entrance/scripts.inc index 75e2619d9e..2a208f9139 100644 --- a/data/maps/TrainerHill_Entrance/scripts.inc +++ b/data/maps/TrainerHill_Entrance/scripts.inc @@ -96,7 +96,7 @@ TrainerHill_Entrance_EventScript_PlayerExitChallenge:: waitmovement 0 setvar VAR_TRAINER_HILL_IS_ACTIVE, 0 special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon releaseall TrainerHill_Entrance_EventScript_EndExitChallenge:: end @@ -162,7 +162,7 @@ TrainerHill_Entrance_EventScript_ChooseChallenge:: setvar VAR_TRAINER_HILL_IS_ACTIVE, 1 setvar VAR_TEMP_5, 0 special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon msgbox TrainerHill_Entrance_Text_TimeProgessGetSetGo, MSGBOX_DEFAULT trainerhill_start releaseall diff --git a/data/maps/map_groups.json b/data/maps/map_groups.json index d0a6a8b55c..ebef431b30 100644 --- a/data/maps/map_groups.json +++ b/data/maps/map_groups.json @@ -1,5 +1,4 @@ { - "layouts_table_label": "gMapLayouts", "group_order": [ "gMapGroup_TownsAndRoutes", "gMapGroup_IndoorLittleroot", diff --git a/data/scripts/battle_pike.inc b/data/scripts/battle_pike.inc index e0a8c3feb1..3393f808d3 100644 --- a/data/scripts/battle_pike.inc +++ b/data/scripts/battle_pike.inc @@ -133,7 +133,7 @@ BattleFrontier_BattlePikeThreePathRoom_EventScript_NoTurningBack:: lockall msgbox BattleFrontier_BattlePike_Text_PathBlockedNoTurningBack, MSGBOX_DEFAULT closemessage - releaseall + releaseall end BattleFrontier_BattlePikeRoomNormal_EventScript_SetEnteredRoom:: @@ -147,7 +147,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_NoTurningBack:: lockall msgbox BattleFrontier_BattlePike_Text_PathBlockedNoTurningBack, MSGBOX_DEFAULT closemessage - releaseall + releaseall end BattleFrontier_BattlePikeRoomNormal_EventScript_Exit:: @@ -216,7 +216,7 @@ BattleFrontier_BattlePikeRoomWildMons_EventScript_NoTurningBack:: lockall msgbox BattleFrontier_BattlePike_Text_PathBlockedNoTurningBack, MSGBOX_DEFAULT closemessage - releaseall + releaseall end BattleFrontier_BattlePike_EventScript_Retire:: diff --git a/data/scripts/day_care.inc b/data/scripts/day_care.inc index 32a1b18922..ce5c02a935 100644 --- a/data/scripts/day_care.inc +++ b/data/scripts/day_care.inc @@ -103,7 +103,7 @@ Route117_PokemonDayCare_EventScript_GiveMonToRaise:: msgbox Route117_PokemonDayCare_Text_WellRaiseYourMon, MSGBOX_DEFAULT waitmoncry special StoreSelectedPokemonInDaycare - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon incrementgamestat GAME_STAT_USED_DAYCARE specialvar VAR_RESULT, GetDaycareState goto_if_eq VAR_RESULT, DAYCARE_ONE_MON, Route117_PokemonDayCare_EventScript_CanRaiseOneMore diff --git a/data/scripts/field_move_scripts.inc b/data/scripts/field_move_scripts.inc index ead669c6b2..b2c5dc84d4 100644 --- a/data/scripts/field_move_scripts.inc +++ b/data/scripts/field_move_scripts.inc @@ -18,7 +18,7 @@ EventScript_CutTreeCommon: dofieldeffect FLDEFF_USE_CUT_ON_TREE waitstate EventScript_CutTreeDown:: @ fallthrough - setflag FLAG_SAFE_FOLLOWER_MOVEMENT + setflag FLAG_SAFE_FOLLOWER_MOVEMENT call_if_eq VAR_0x8004, TRUE, EventScript_FollowerFieldMove applymovement VAR_LAST_TALKED, Movement_CutTreeDown waitmovement 0 diff --git a/data/scripts/flash.inc b/data/scripts/flash.inc index 7444dcd5ea..5e8d7160a9 100644 --- a/data/scripts/flash.inc +++ b/data/scripts/flash.inc @@ -1,5 +1,5 @@ EventScript_UseFlash:: animateflash 1 setflashlevel 1 - releaseall + releaseall end diff --git a/data/scripts/follower.inc b/data/scripts/follower.inc index 3a81e6fabf..3713e0da46 100644 --- a/data/scripts/follower.inc +++ b/data/scripts/follower.inc @@ -1,14 +1,14 @@ gText_FollowerLovesYou:: - .string "123456789012345678901234567890123\n$" + .string "123456789012345678901234567890123\n$" gText_FollowerLostInThought:: - .string "{STR_VAR_1} seems lost in thought.$" + .string "{STR_VAR_1} seems lost in thought.$" gText_FollowerDefault:: - .string "ERROR 404: Script not found.$" + .string "ERROR 404: Script not found.$" gText_WantsToFly:: - .string "{STR_VAR_1} looks up at the\nsky restlessly.\pWould you like to use FLY?$" + .string "{STR_VAR_1} looks up at the\nsky restlessly.\pWould you like to use FLY?$" .macro playfirstmoncry callfunc ScrFunc_playfirstmoncry @@ -26,649 +26,649 @@ callfunc ScrFunc_emote .endm EventScript_Follower:: - lock - bufferlivemonnickname 0 - playfirstmoncry - callfunc ScrFunc_getfolloweraction - checkpartymove MOVE_FLY - compare VAR_RESULT 6 - goto_if_eq EventScript_FollowerEnd - bufferlivemonnickname 0 - msgbox gText_WantsToFly, MSGBOX_YESNO - switch VAR_RESULT - case NO, EventScript_FollowerEnd - case YES, EventScript_FollowerFly - case MULTI_B_PRESSED, EventScript_FollowerEnd + lock + bufferlivemonnickname 0 + playfirstmoncry + callfunc ScrFunc_getfolloweraction + checkpartymove MOVE_FLY + compare VAR_RESULT 6 + goto_if_eq EventScript_FollowerEnd + bufferlivemonnickname 0 + msgbox gText_WantsToFly, MSGBOX_YESNO + switch VAR_RESULT + case NO, EventScript_FollowerEnd + case YES, EventScript_FollowerFly + case MULTI_B_PRESSED, EventScript_FollowerEnd EventScript_FollowerFly:: - callfunc ScrFunc_followerfly + callfunc ScrFunc_FollowerFly EventScript_FollowerEnd:: - waitfieldeffect FLDEFF_EMOTE - release - end + waitfieldeffect FLDEFF_EMOTE + release + end EventScript_FollowerLovesYou:: - applymovement 0xFE ContestHall_Movement_Heart - waitmovement 0xFE - waitmoncry - msgbox gText_FollowerLovesYou, MSGBOX_DEFAULT - return + applymovement 0xFE ContestHall_Movement_Heart + waitmovement 0xFE + waitmoncry + msgbox gText_FollowerLovesYou, MSGBOX_DEFAULT + return @ Message address must be loaded into bank 0 EventScript_FollowerGeneric:: @ similar to Std_MsgboxDefault - faceplayer + faceplayer EventScript_FollowerGenericSkipFace: - waitfieldeffect FLDEFF_EMOTE - message 0x0 - waitmessage - waitbuttonpress - return + waitfieldeffect FLDEFF_EMOTE + message 0x0 + waitmessage + waitbuttonpress + return EventScript_FollowerJump:: - faceplayer - applymovement 0xFE FollowerSplashMovement - waitmovement 0xFE - waitfieldeffect FLDEFF_EMOTE - message 0x0 - waitmessage - waitbuttonpress - return + faceplayer + applymovement 0xFE FollowerSplashMovement + waitmovement 0xFE + waitfieldeffect FLDEFF_EMOTE + message 0x0 + waitmessage + waitbuttonpress + return EnterPokeballMovement:: - enter_pokeball - step_end + enter_pokeball + step_end @ Movement scripts below, movements are defined in movement.inc FollowerSplashMovement:: - jump_in_place_down - delay_4 - jump_in_place_down - face_player - step_end + jump_in_place_down + delay_4 + jump_in_place_down + face_player + step_end FollowerShiverVerticalMovement: - lock_facing_direction - slide_left - slide_right - slide_right - slide_left - unlock_facing_direction - step_end + lock_facing_direction + slide_left + slide_right + slide_right + slide_left + unlock_facing_direction + step_end FollowerShiverHorizontalMovement: - lock_facing_direction - slide_up - slide_down - slide_down - slide_up - unlock_facing_direction - step_end + lock_facing_direction + slide_up + slide_down + slide_down + slide_up + unlock_facing_direction + step_end FollowerNostalgiaMovement: - face_away_player - lock_facing_direction - jump_in_place_down - jump_in_place_down - jump_in_place_down - unlock_facing_direction - face_player - lock_facing_direction - jump_in_place_down - unlock_facing_direction - step_end + face_away_player + lock_facing_direction + jump_in_place_down + jump_in_place_down + jump_in_place_down + unlock_facing_direction + face_player + lock_facing_direction + jump_in_place_down + unlock_facing_direction + step_end FollowerSkippingMovement: - lock_facing_direction - jump_in_place_down - delay_4 - jump_in_place_down - unlock_facing_direction - step_end + lock_facing_direction + jump_in_place_down + delay_4 + jump_in_place_down + unlock_facing_direction + step_end FollowerJumpOnPlayerNorth: - jump_up - delay_4 - lock_facing_direction - walk_fast_down - unlock_facing_direction - step_end + jump_up + delay_4 + lock_facing_direction + walk_fast_down + unlock_facing_direction + step_end FollowerJumpOnPlayerSouth: - jump_down - delay_4 - lock_facing_direction - walk_fast_up - unlock_facing_direction - step_end + jump_down + delay_4 + lock_facing_direction + walk_fast_up + unlock_facing_direction + step_end FollowerJumpOnPlayerEast: - jump_right - delay_4 - lock_facing_direction - walk_fast_left - unlock_facing_direction - step_end + jump_right + delay_4 + lock_facing_direction + walk_fast_left + unlock_facing_direction + step_end FollowerJumpOnPlayerWest: - jump_left - delay_4 - lock_facing_direction - walk_fast_right - unlock_facing_direction - step_end + jump_left + delay_4 + lock_facing_direction + walk_fast_right + unlock_facing_direction + step_end FollowerCuddlingNorth: - face_left - lock_facing_direction - walk_up - walk_in_place_left - walk_in_place_left - unlock_facing_direction - walk_down - face_player - step_end + face_left + lock_facing_direction + walk_up + walk_in_place_left + walk_in_place_left + unlock_facing_direction + walk_down + face_player + step_end FollowerCuddlingSouth: - face_right - lock_facing_direction - walk_down - walk_in_place_right - walk_in_place_right - unlock_facing_direction - walk_up - face_player - step_end + face_right + lock_facing_direction + walk_down + walk_in_place_right + walk_in_place_right + unlock_facing_direction + walk_up + face_player + step_end FollowerCuddlingEast: - face_down - lock_facing_direction - walk_right - walk_in_place_down - walk_in_place_down - unlock_facing_direction - walk_left - face_player - step_end + face_down + lock_facing_direction + walk_right + walk_in_place_down + walk_in_place_down + unlock_facing_direction + walk_left + face_player + step_end FollowerCuddlingWest: - face_down - lock_facing_direction - walk_left - walk_in_place_down - walk_in_place_down - unlock_facing_direction - walk_right - face_player - step_end + face_down + lock_facing_direction + walk_left + walk_in_place_down + walk_in_place_down + unlock_facing_direction + walk_right + face_player + step_end FollowerGetCloserNorth: - walk_up - delay_16 - lock_facing_direction - walk_down - unlock_facing_direction - step_end + walk_up + delay_16 + lock_facing_direction + walk_down + unlock_facing_direction + step_end FollowerGetCloserSouth: - walk_down - delay_16 - lock_facing_direction - walk_up - unlock_facing_direction - step_end + walk_down + delay_16 + lock_facing_direction + walk_up + unlock_facing_direction + step_end FollowerGetCloserEast: - walk_right - delay_16 - lock_facing_direction - walk_left - unlock_facing_direction - step_end + walk_right + delay_16 + lock_facing_direction + walk_left + unlock_facing_direction + step_end FollowerGetCloserWest: - walk_left - delay_16 - lock_facing_direction - walk_right - unlock_facing_direction - step_end + walk_left + delay_16 + lock_facing_direction + walk_right + unlock_facing_direction + step_end FollowerPokeNorth: - walk_faster_up - delay_8 - lock_facing_direction - walk_faster_down - delay_4 - walk_faster_up - delay_4 - walk_faster_down - unlock_facing_direction - step_end + walk_faster_up + delay_8 + lock_facing_direction + walk_faster_down + delay_4 + walk_faster_up + delay_4 + walk_faster_down + unlock_facing_direction + step_end FollowerPokeSouth: - walk_faster_down - delay_8 - lock_facing_direction - walk_faster_up - delay_4 - walk_faster_down - delay_4 - walk_faster_up - unlock_facing_direction - step_end + walk_faster_down + delay_8 + lock_facing_direction + walk_faster_up + delay_4 + walk_faster_down + delay_4 + walk_faster_up + unlock_facing_direction + step_end FollowerPokeEast: - walk_faster_right - delay_8 - lock_facing_direction - walk_faster_left - delay_4 - walk_faster_right - delay_4 - walk_faster_left - unlock_facing_direction - step_end + walk_faster_right + delay_8 + lock_facing_direction + walk_faster_left + delay_4 + walk_faster_right + delay_4 + walk_faster_left + unlock_facing_direction + step_end FollowerPokeWest: - walk_faster_left - delay_8 - lock_facing_direction - walk_faster_right - delay_4 - walk_faster_left - delay_4 - walk_faster_right - unlock_facing_direction - step_end + walk_faster_left + delay_8 + lock_facing_direction + walk_faster_right + delay_4 + walk_faster_left + delay_4 + walk_faster_right + unlock_facing_direction + step_end FollowerLookAround: - face_away_player - delay_16 - delay_16 - face_left - delay_16 - delay_16 - face_up - delay_16 - delay_16 - face_down - delay_16 - delay_16 - step_end + face_away_player + delay_16 + delay_16 + face_left + delay_16 + delay_16 + face_up + delay_16 + delay_16 + face_down + delay_16 + delay_16 + step_end FollowerLookAway: - face_away_player - delay_16 - delay_16 - step_end + face_away_player + delay_16 + delay_16 + step_end FollowerLookAwayBark: - face_away_player - lock_facing_direction - jump_in_place_down - jump_in_place_down - unlock_facing_direction - step_end + face_away_player + lock_facing_direction + jump_in_place_down + jump_in_place_down + unlock_facing_direction + step_end FollowerLookAwayPokeG: - face_away_player - lock_facing_direction - walk_in_place_down - walk_in_place_down - walk_in_place_down - unlock_facing_direction - step_end + face_away_player + lock_facing_direction + walk_in_place_down + walk_in_place_down + walk_in_place_down + unlock_facing_direction + step_end FollowerPokeGround: - lock_facing_direction - walk_in_place_down - walk_in_place_down - walk_in_place_down - unlock_facing_direction - step_end + lock_facing_direction + walk_in_place_down + walk_in_place_down + walk_in_place_down + unlock_facing_direction + step_end FollowerStartled: - face_away_player - lock_facing_direction - jump_in_place_down - unlock_facing_direction - face_player - step_end + face_away_player + lock_facing_direction + jump_in_place_down + unlock_facing_direction + face_player + step_end FollowerHopFast: - jump_in_place_up - jump_in_place_down - jump_in_place_left - jump_in_place_right - face_player - step_end + jump_in_place_up + jump_in_place_down + jump_in_place_left + jump_in_place_right + face_player + step_end FollowerDizzy: - walk_in_place_left - walk_in_place_fast_right - walk_in_place_slow_up - walk_in_place_fast_down - delay_4 - face_away_player - step_end + walk_in_place_left + walk_in_place_fast_right + walk_in_place_slow_up + walk_in_place_fast_down + delay_4 + face_away_player + step_end FollowerLookAroundScared: - face_up - delay_16 - face_down - delay_16 - face_left - delay_16 - face_right - delay_16 - face_up - delay_16 - face_down - delay_16 - face_left - delay_16 - face_right - delay_16 - face_player - step_end + face_up + delay_16 + face_down + delay_16 + face_left + delay_16 + face_right + delay_16 + face_up + delay_16 + face_down + delay_16 + face_left + delay_16 + face_right + delay_16 + face_player + step_end FollowerDance: - lock_facing_direction - jump_in_place_up - unlock_facing_direction - walk_in_place_fast_up - walk_in_place_fast_left - walk_in_place_fast_down - walk_in_place_fast_right - walk_in_place_fast_up - walk_in_place_fast_left - walk_in_place_fast_down - walk_in_place_fast_right - jump_in_place_up - jump_in_place_down - jump_in_place_up - face_player - step_end + lock_facing_direction + jump_in_place_up + unlock_facing_direction + walk_in_place_fast_up + walk_in_place_fast_left + walk_in_place_fast_down + walk_in_place_fast_right + walk_in_place_fast_up + walk_in_place_fast_left + walk_in_place_fast_down + walk_in_place_fast_right + jump_in_place_up + jump_in_place_down + jump_in_place_up + face_player + step_end @ Movement scripts EventScript_FollowerIsShivering:: - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq ShiverVertical - compare VAR_FACING, DIR_SOUTH - call_if_eq ShiverVertical - compare VAR_FACING, DIR_WEST - call_if_eq ShiverHorizontal - compare VAR_FACING, DIR_EAST - call_if_eq ShiverHorizontal - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq ShiverVertical + compare VAR_FACING, DIR_SOUTH + call_if_eq ShiverVertical + compare VAR_FACING, DIR_WEST + call_if_eq ShiverHorizontal + compare VAR_FACING, DIR_EAST + call_if_eq ShiverHorizontal + goto EventScript_FollowerGeneric ShiverVertical: - applymovement 0xFE FollowerShiverVerticalMovement - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverVerticalMovement + waitmovement 0xFE + return ShiverHorizontal: - applymovement 0xFE FollowerShiverHorizontalMovement - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverHorizontalMovement + waitmovement 0xFE + return EventScript_FollowerNostalgia:: - applymovement 0xFE FollowerNostalgiaMovement - waitmovement 0xFE - goto EventScript_FollowerGeneric + applymovement 0xFE FollowerNostalgiaMovement + waitmovement 0xFE + goto EventScript_FollowerGeneric EventScript_FollowerHopping:: - faceplayer - applymovement 0xFE FollowerSkippingMovement - waitmovement 0xFE - goto EventScript_FollowerGeneric + faceplayer + applymovement 0xFE FollowerSkippingMovement + waitmovement 0xFE + goto EventScript_FollowerGeneric JumpOnN: - applymovement 0xFE FollowerJumpOnPlayerNorth - waitmovement 0xFE - return + applymovement 0xFE FollowerJumpOnPlayerNorth + waitmovement 0xFE + return JumpOnS: - applymovement 0xFE FollowerJumpOnPlayerSouth - waitmovement 0xFE - return + applymovement 0xFE FollowerJumpOnPlayerSouth + waitmovement 0xFE + return JumpOnE: - applymovement 0xFE FollowerJumpOnPlayerEast - waitmovement 0xFE - return + applymovement 0xFE FollowerJumpOnPlayerEast + waitmovement 0xFE + return JumpOnW: - applymovement 0xFE FollowerJumpOnPlayerWest - waitmovement 0xFE - return + applymovement 0xFE FollowerJumpOnPlayerWest + waitmovement 0xFE + return EventScript_FollowerJumpOnPlayer:: - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq JumpOnS - compare VAR_FACING, DIR_SOUTH - call_if_eq JumpOnN - compare VAR_FACING, DIR_WEST - call_if_eq JumpOnE - compare VAR_FACING, DIR_EAST - call_if_eq JumpOnW - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq JumpOnS + compare VAR_FACING, DIR_SOUTH + call_if_eq JumpOnN + compare VAR_FACING, DIR_WEST + call_if_eq JumpOnE + compare VAR_FACING, DIR_EAST + call_if_eq JumpOnW + goto EventScript_FollowerGeneric CuddleN: - applymovement 0xFE FollowerCuddlingNorth - waitmovement 0xFE - return + applymovement 0xFE FollowerCuddlingNorth + waitmovement 0xFE + return CuddleS: - applymovement 0xFE FollowerCuddlingSouth - waitmovement 0xFE - return + applymovement 0xFE FollowerCuddlingSouth + waitmovement 0xFE + return CuddleE: - applymovement 0xFE FollowerCuddlingEast - waitmovement 0xFE - return + applymovement 0xFE FollowerCuddlingEast + waitmovement 0xFE + return CuddleW: - applymovement 0xFE FollowerCuddlingWest - waitmovement 0xFE - return + applymovement 0xFE FollowerCuddlingWest + waitmovement 0xFE + return EventScript_FollowerCuddling:: @ similar to Std_MsgboxDefault - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq CuddleS - compare VAR_FACING, DIR_SOUTH - call_if_eq CuddleN - compare VAR_FACING, DIR_WEST - call_if_eq CuddleE - compare VAR_FACING, DIR_EAST - call_if_eq CuddleW - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq CuddleS + compare VAR_FACING, DIR_SOUTH + call_if_eq CuddleN + compare VAR_FACING, DIR_WEST + call_if_eq CuddleE + compare VAR_FACING, DIR_EAST + call_if_eq CuddleW + goto EventScript_FollowerGeneric ShCuddleN: - applymovement 0xFE FollowerShiverVerticalMovement - waitmovement 0xFE - applymovement 0xFE FollowerCuddlingNorth - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverVerticalMovement + waitmovement 0xFE + applymovement 0xFE FollowerCuddlingNorth + waitmovement 0xFE + return ShCuddleS: - applymovement 0xFE FollowerShiverVerticalMovement - waitmovement 0xFE - applymovement 0xFE FollowerCuddlingSouth - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverVerticalMovement + waitmovement 0xFE + applymovement 0xFE FollowerCuddlingSouth + waitmovement 0xFE + return ShCuddleE: - applymovement 0xFE FollowerShiverHorizontalMovement - waitmovement 0xFE - applymovement 0xFE FollowerCuddlingEast - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverHorizontalMovement + waitmovement 0xFE + applymovement 0xFE FollowerCuddlingEast + waitmovement 0xFE + return ShCuddleW: - applymovement 0xFE FollowerShiverHorizontalMovement - waitmovement 0xFE - applymovement 0xFE FollowerCuddlingWest - waitmovement 0xFE - return + applymovement 0xFE FollowerShiverHorizontalMovement + waitmovement 0xFE + applymovement 0xFE FollowerCuddlingWest + waitmovement 0xFE + return EventScript_FollowerShiverCuddling:: - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq ShCuddleS - compare VAR_FACING, DIR_SOUTH - call_if_eq ShCuddleN - compare VAR_FACING, DIR_WEST - call_if_eq ShCuddleE - compare VAR_FACING, DIR_EAST - call_if_eq ShCuddleW - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq ShCuddleS + compare VAR_FACING, DIR_SOUTH + call_if_eq ShCuddleN + compare VAR_FACING, DIR_WEST + call_if_eq ShCuddleE + compare VAR_FACING, DIR_EAST + call_if_eq ShCuddleW + goto EventScript_FollowerGeneric CreepCloserN: - applymovement 0xFE FollowerGetCloserNorth - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserNorth + waitmovement 0xFE + return CreepCloserS: - applymovement 0xFE FollowerGetCloserSouth - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserSouth + waitmovement 0xFE + return CreepCloserE: - applymovement 0xFE FollowerGetCloserEast - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserEast + waitmovement 0xFE + return CreepCloserW: - applymovement 0xFE FollowerGetCloserWest - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserWest + waitmovement 0xFE + return EventScript_FollowerGetCloser:: - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq CreepCloserS - compare VAR_FACING, DIR_SOUTH - call_if_eq CreepCloserN - compare VAR_FACING, DIR_WEST - call_if_eq CreepCloserE - compare VAR_FACING, DIR_EAST - call_if_eq CreepCloserW - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq CreepCloserS + compare VAR_FACING, DIR_SOUTH + call_if_eq CreepCloserN + compare VAR_FACING, DIR_WEST + call_if_eq CreepCloserE + compare VAR_FACING, DIR_EAST + call_if_eq CreepCloserW + goto EventScript_FollowerGeneric PokePlayerN: - applymovement 0xFE FollowerGetCloserNorth - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserNorth + waitmovement 0xFE + return PokePlayerS: - applymovement 0xFE FollowerGetCloserSouth - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserSouth + waitmovement 0xFE + return PokePlayerE: - applymovement 0xFE FollowerGetCloserEast - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserEast + waitmovement 0xFE + return PokePlayerW: - applymovement 0xFE FollowerGetCloserWest - waitmovement 0xFE - return + applymovement 0xFE FollowerGetCloserWest + waitmovement 0xFE + return EventScript_FollowerPokingPlayer:: - faceplayer - compare VAR_FACING, DIR_NORTH - call_if_eq PokePlayerS - compare VAR_FACING, DIR_SOUTH - call_if_eq PokePlayerN - compare VAR_FACING, DIR_WEST - call_if_eq PokePlayerE - compare VAR_FACING, DIR_EAST - call_if_eq PokePlayerW - goto EventScript_FollowerGeneric + faceplayer + compare VAR_FACING, DIR_NORTH + call_if_eq PokePlayerS + compare VAR_FACING, DIR_SOUTH + call_if_eq PokePlayerN + compare VAR_FACING, DIR_WEST + call_if_eq PokePlayerE + compare VAR_FACING, DIR_EAST + call_if_eq PokePlayerW + goto EventScript_FollowerGeneric EventScript_FollowerLookAround:: - applymovement 0xFE FollowerLookAround - waitmovement 0xFE - goto EventScript_FollowerGeneric + applymovement 0xFE FollowerLookAround + waitmovement 0xFE + goto EventScript_FollowerGeneric EventScript_FollowerLookAway:: - applymovement 0xFE FollowerLookAway - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerLookAway + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerLookAwayBark:: - applymovement 0xFE FollowerLookAwayBark - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerLookAwayBark + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerLookAwayPoke:: - applymovement 0xFE FollowerLookAwayPokeG - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerLookAwayPokeG + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerPokeGround:: - faceplayer - applymovement 0xFE FollowerPokeGround - waitmovement 0xFE - goto EventScript_FollowerGeneric + faceplayer + applymovement 0xFE FollowerPokeGround + waitmovement 0xFE + goto EventScript_FollowerGeneric EventScript_FollowerStartled:: - applymovement 0xFE FollowerStartled - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerStartled + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerFastHopping:: - applymovement 0xFE FollowerHopFast - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerHopFast + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerDizzy:: - applymovement 0xFE FollowerDizzy - waitmovement 0 - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE FollowerDizzy + waitmovement 0 + goto EventScript_FollowerGenericSkipFace EventScript_FollowerLookAroundScared:: - applymovement 0xFE FollowerLookAroundScared - waitmovement 0xFE - goto EventScript_FollowerGeneric + applymovement 0xFE FollowerLookAroundScared + waitmovement 0xFE + goto EventScript_FollowerGeneric EventScript_FollowerDance:: - faceplayer - applymovement 0xFE FollowerDance - waitmovement 0 - goto EventScript_FollowerGenericSkipFace + faceplayer + applymovement 0xFE FollowerDance + waitmovement 0 + goto EventScript_FollowerGenericSkipFace EventScript_FollowerFaceUp:: - applymovement 0xFE Common_Movement_FaceUp - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE Common_Movement_FaceUp + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerFaceResult:: @ Face towards direction in VAR_RESULT - switch VAR_RESULT - case DIR_SOUTH, EventScript_FollowerFaceDown + switch VAR_RESULT + case DIR_SOUTH, EventScript_FollowerFaceDown case DIR_NORTH, EventScript_FollowerFaceUp case DIR_WEST, EventScript_FollowerFaceLeft case DIR_EAST, EventScript_FollowerFaceRight - goto EventScript_FollowerGeneric + goto EventScript_FollowerGeneric EventScript_FollowerFaceDown: - applymovement 0xFE Common_Movement_FaceDown - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE Common_Movement_FaceDown + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerFaceLeft: - applymovement 0xFE Common_Movement_FaceLeft - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE Common_Movement_FaceLeft + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace EventScript_FollowerFaceRight: - applymovement 0xFE Common_Movement_FaceRight - waitmovement 0xFE - goto EventScript_FollowerGenericSkipFace + applymovement 0xFE Common_Movement_FaceRight + waitmovement 0xFE + goto EventScript_FollowerGenericSkipFace diff --git a/data/scripts/pkmn_center_nurse.inc b/data/scripts/pkmn_center_nurse.inc index 925666a275..c0fe80a994 100644 --- a/data/scripts/pkmn_center_nurse.inc +++ b/data/scripts/pkmn_center_nurse.inc @@ -40,7 +40,7 @@ EventScript_PkmnCenterNurse_TakeAndHealPkmn:: applymovement VAR_0x800B, Common_Movement_WalkInPlaceFasterDown waitmovement 0 special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon return EventScript_PkmnCenterNurse_CheckTrainerHillAndUnionRoom:: diff --git a/data/scripts/secret_base.inc b/data/scripts/secret_base.inc index 17801e85a0..9a6fd77253 100644 --- a/data/scripts/secret_base.inc +++ b/data/scripts/secret_base.inc @@ -646,7 +646,7 @@ SecretBase_EventScript_BattleTrainer:: call_if_eq VAR_RESULT, B_OUTCOME_WON, SecretBase_EventScript_WonSecretBaseBattle call_if_eq VAR_RESULT, B_OUTCOME_LOST, SecretBase_EventScript_LostSecretBaseBattle special HealPlayerParty - callnative UpdateFollowingPokemon + callnative UpdateFollowingPokemon release end diff --git a/data/scripts/trainer_battle.inc b/data/scripts/trainer_battle.inc index cbbdaac291..900e5da8f8 100644 --- a/data/scripts/trainer_battle.inc +++ b/data/scripts/trainer_battle.inc @@ -10,7 +10,7 @@ EventScript_TrainerApproach:: EventScript_TryDoNormalTrainerBattle:: lock faceplayer - setflag FLAG_SAFE_FOLLOWER_MOVEMENT + setflag FLAG_SAFE_FOLLOWER_MOVEMENT applymovement VAR_LAST_TALKED, Movement_RevealTrainer waitmovement 0 clearflag FLAG_SAFE_FOLLOWER_MOVEMENT @@ -46,7 +46,7 @@ EventScript_NoDoubleTrainerBattle:: gotopostbattlescript EventScript_DoNoIntroTrainerBattle:: - setflag FLAG_SAFE_FOLLOWER_MOVEMENT + setflag FLAG_SAFE_FOLLOWER_MOVEMENT applymovement VAR_LAST_TALKED, Movement_RevealTrainer waitmovement 0 clearflag FLAG_SAFE_FOLLOWER_MOVEMENT @@ -97,7 +97,7 @@ EventScript_NotEnoughMonsForDoubleRematchBattle:: end EventScript_RevealTrainer:: - setflag FLAG_SAFE_FOLLOWER_MOVEMENT + setflag FLAG_SAFE_FOLLOWER_MOVEMENT applymovement VAR_LAST_TALKED, Movement_RevealTrainer waitmovement 0 clearflag FLAG_SAFE_FOLLOWER_MOVEMENT diff --git a/gflib/sprite.c b/gflib/sprite.c index 4540f59cc0..5184d15fb1 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -1652,10 +1652,10 @@ void FreeSpritePaletteByTag(u16 tag) { u8 index = IndexOfSpritePaletteTag(tag); if (index != 0xFF) { - sSpritePaletteTags[index] = TAG_NONE; - #if DEBUG - FillPalette(0, index * 16 + 0x100, 32); - #endif + sSpritePaletteTags[index] = TAG_NONE; + #if DEBUG + FillPalette(0, index * 16 + 0x100, 32); + #endif } } diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index e6a0b8058c..58fc991a5e 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -110,7 +110,6 @@ #define FLDEFFOBJ_BUBBLES 34 #define FLDEFFOBJ_SMALL_SPARKLE 35 #define FLDEFFOBJ_RAYQUAZA 36 - #define FLDEFFOBJ_TRACKS_SLITHER 37 #define FLDEFFOBJ_TRACKS_SPOT 38 #define FLDEFFOBJ_TRACKS_BUG 39 @@ -128,11 +127,10 @@ #define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010 #define FLDEFF_PAL_TAG_UNKNOWN 0x1011 - // Duplicates of event_object_movement tags -#define FLDEFF_PAL_TAG_MAY 0x1110 // OBJ_EVENT_PAL_TAG_MAY -#define FLDEFF_PAL_TAG_BRENDAN 0x1100 // OBJ_EVENT_PAL_TAG_BRENDAN -#define FLDEFF_PAL_TAG_NPC_1 0x1103 // OBJ_EVENT_PAL_TAG_NPC_1 -#define FLDEFF_PAL_TAG_NPC_2 0x1104 // OBJ_EVENT_PAL_TAG_NPC_2 +#define FLDEFF_PAL_TAG_MAY 0x1110 // OBJ_EVENT_PAL_TAG_MAY +#define FLDEFF_PAL_TAG_BRENDAN 0x1100 // OBJ_EVENT_PAL_TAG_BRENDAN +#define FLDEFF_PAL_TAG_NPC_1 0x1103 // OBJ_EVENT_PAL_TAG_NPC_1 +#define FLDEFF_PAL_TAG_NPC_2 0x1104 // OBJ_EVENT_PAL_TAG_NPC_2 #endif // GUARD_FIELD_EFFECT_CONSTANTS_H diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h index 71920d22f5..22dcb119a4 100644 --- a/include/field_effect_helpers.h +++ b/include/field_effect_helpers.h @@ -20,9 +20,9 @@ void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset); bool8 UpdateRevealDisguise(struct ObjectEvent *); void StartRevealDisguise(struct ObjectEvent *); void StartAshFieldEffect(s16, s16, u16, s16); -void SetUpReflection(struct ObjectEvent*, struct Sprite*, u8); -void SetUpShadow(struct ObjectEvent*, struct Sprite*); -u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent*); +void SetUpReflection(struct ObjectEvent *, struct Sprite *, u8); +void SetUpShadow(struct ObjectEvent *, struct Sprite *); +u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent *); u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); void UpdateRayquazaSpotlightEffect(struct Sprite *); void UpdateShadowFieldEffect(struct Sprite *); diff --git a/include/follower_helper.h b/include/follower_helper.h index 115242fdb9..64ef44c269 100644 --- a/include/follower_helper.h +++ b/include/follower_helper.h @@ -2,18 +2,18 @@ #define GUARD_FOLLOWER_HELPER_H enum { - FOLLOWER_EMOTION_HAPPY = 0, - FOLLOWER_EMOTION_NEUTRAL, // Also called "No emotion" - FOLLOWER_EMOTION_SAD, - FOLLOWER_EMOTION_UPSET, - FOLLOWER_EMOTION_ANGRY, - FOLLOWER_EMOTION_PENSIVE, - FOLLOWER_EMOTION_LOVE, - FOLLOWER_EMOTION_SURPRISE, - FOLLOWER_EMOTION_CURIOUS, - FOLLOWER_EMOTION_MUSIC, - FOLLOWER_EMOTION_POISONED, - FOLLOWER_EMOTION_LENGTH, + FOLLOWER_EMOTION_HAPPY = 0, + FOLLOWER_EMOTION_NEUTRAL, // Also called "No emotion" + FOLLOWER_EMOTION_SAD, + FOLLOWER_EMOTION_UPSET, + FOLLOWER_EMOTION_ANGRY, + FOLLOWER_EMOTION_PENSIVE, + FOLLOWER_EMOTION_LOVE, + FOLLOWER_EMOTION_SURPRISE, + FOLLOWER_EMOTION_CURIOUS, + FOLLOWER_EMOTION_MUSIC, + FOLLOWER_EMOTION_POISONED, + FOLLOWER_EMOTION_LENGTH, }; // This struct is optimized for size diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index 0aef3d0d8a..b3a3ffbac5 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -12,31 +12,36 @@ static const union AnimCmd *const sAnimTable_Shadow[] = sAnim_Shadow, }; -static const struct SpriteFrameImage sPicTable_ShadowSmall[] = { +static const struct SpriteFrameImage sPicTable_ShadowSmall[] = +{ obj_frame_tiles(gFieldEffectObjectPic_ShadowSmall), }; -static const struct SpriteFrameImage sPicTable_ShadowMedium[] = { +static const struct SpriteFrameImage sPicTable_ShadowMedium[] = +{ obj_frame_tiles(gFieldEffectObjectPic_ShadowMedium), }; -static const struct SpriteFrameImage sPicTable_ShadowLarge[] = { +static const struct SpriteFrameImage sPicTable_ShadowLarge[] = +{ obj_frame_tiles(gFieldEffectObjectPic_ShadowLarge), }; -static const struct SpriteFrameImage sPicTable_ShadowExtraLarge[] = { +static const struct SpriteFrameImage sPicTable_ShadowExtraLarge[] = +{ obj_frame_tiles(gFieldEffectObjectPic_ShadowExtraLarge), }; -const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = {0xFFFF, TAG_WEATHER_START, &gObjectEventBaseOam_8x8, sAnimTable_Shadow, sPicTable_ShadowSmall, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = {TAG_NONE, TAG_WEATHER_START, &gObjectEventBaseOam_8x8, sAnimTable_Shadow, sPicTable_ShadowSmall, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; -const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = {0xFFFF, TAG_WEATHER_START, &gObjectEventBaseOam_16x8, sAnimTable_Shadow, sPicTable_ShadowMedium, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = {TAG_NONE, TAG_WEATHER_START, &gObjectEventBaseOam_16x8, sAnimTable_Shadow, sPicTable_ShadowMedium, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; -const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = {0xFFFF, TAG_WEATHER_START, &gObjectEventBaseOam_32x8, sAnimTable_Shadow, sPicTable_ShadowLarge, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = {TAG_NONE, TAG_WEATHER_START, &gObjectEventBaseOam_32x8, sAnimTable_Shadow, sPicTable_ShadowLarge, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; -const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = {0xFFFF, TAG_WEATHER_START, &gObjectEventBaseOam_64x32, sAnimTable_Shadow, sPicTable_ShadowExtraLarge, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = {TAG_NONE, TAG_WEATHER_START, &gObjectEventBaseOam_64x32, sAnimTable_Shadow, sPicTable_ShadowExtraLarge, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; -static const struct SpriteFrameImage sPicTable_TallGrass[] = { +static const struct SpriteFrameImage sPicTable_TallGrass[] = +{ overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 2), @@ -59,7 +64,8 @@ static const union AnimCmd *const sAnimTable_TallGrass[] = sAnim_TallGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass = { +const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -69,7 +75,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass = { .callback = UpdateTallGrassFieldEffect, }; -static const struct SpriteFrameImage sPicTable_Ripple[] = { +static const struct SpriteFrameImage sPicTable_Ripple[] = +{ overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 2), @@ -95,7 +102,8 @@ static const union AnimCmd *const sAnimTable_Ripple[] = sAnim_Ripple, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple = { +const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -105,7 +113,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple = { .callback = WaitFieldEffectSpriteAnim, }; -static const struct SpriteFrameImage sPicTable_Ash[] = { +static const struct SpriteFrameImage sPicTable_Ash[] = +{ overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 2), @@ -128,7 +137,8 @@ static const union AnimCmd *const sAnimTable_Ash[] = sAnim_Ash, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Ash = { +const struct SpriteTemplate gFieldEffectObjectTemplate_Ash = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -138,7 +148,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Ash = { .callback = UpdateAshFieldEffect, }; -static const struct SpriteFrameImage sPicTable_SurfBlob[] = { +static const struct SpriteFrameImage sPicTable_SurfBlob[] = +{ overworld_frame(gFieldEffectObjectPic_SurfBlob, 4, 4, 0), overworld_frame(gFieldEffectObjectPic_SurfBlob, 4, 4, 1), overworld_frame(gFieldEffectObjectPic_SurfBlob, 4, 4, 2), @@ -176,7 +187,8 @@ static const union AnimCmd *const sAnimTable_SurfBlob[] = sSurfBlobAnim_FaceEast, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = { +const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = +{ .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_MAY, .oam = &gObjectEventBaseOam_32x32, @@ -186,7 +198,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = { .callback = UpdateSurfBlobFieldEffect, }; -static const struct SpriteFrameImage sPicTable_Arrow[] = { +static const struct SpriteFrameImage sPicTable_Arrow[] = +{ overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 2), @@ -233,7 +246,8 @@ static const union AnimCmd *const sAnimTable_Arrow[] = sArrowAnim_East, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow = { +const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow = +{ .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_MAY, .oam = &gObjectEventBaseOam_16x16, @@ -243,7 +257,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow = { .callback = SpriteCallbackDummy, }; -static const struct SpriteFrameImage sPicTable_GroundImpactDust[] = { +static const struct SpriteFrameImage sPicTable_GroundImpactDust[] = +{ overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 2), @@ -262,7 +277,8 @@ static const union AnimCmd *const sAnimTable_GroundImpactDust[] = sAnim_GroundImpactDust, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust = { +const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, @@ -272,7 +288,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust = { .callback = UpdateJumpImpactEffect, }; -static const struct SpriteFrameImage sPicTable_JumpTallGrass[] = { +static const struct SpriteFrameImage sPicTable_JumpTallGrass[] = +{ overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 2), @@ -293,7 +310,8 @@ static const union AnimCmd *const sAnimTable_JumpTallGrass[] = sAnim_JumpTallGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass = { +const struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x8, @@ -303,7 +321,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass = { .callback = UpdateJumpImpactEffect, }; -static const struct SpriteFrameImage sPicTable_SandFootprints[] = { +static const struct SpriteFrameImage sPicTable_SandFootprints[] = +{ overworld_frame(gFieldEffectObjectPic_SandFootprints, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_SandFootprints, 2, 2, 1), }; @@ -341,7 +360,8 @@ static const union AnimCmd *const sAnimTable_SandFootprints[] = sSandFootprintsAnim_East, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints = { +const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -351,7 +371,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints = { .callback = UpdateFootprintsTireTracksFieldEffect, }; -static const struct SpriteFrameImage sPicTable_DeepSandFootprints[] = { +static const struct SpriteFrameImage sPicTable_DeepSandFootprints[] = +{ overworld_frame(gFieldEffectObjectPic_DeepSandFootprints, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_DeepSandFootprints, 2, 2, 1), }; @@ -389,7 +410,8 @@ static const union AnimCmd *const sAnimTable_DeepSandFootprints[] = sDeepSandFootprintsAnim_East, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints = { +const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -399,18 +421,21 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints = { .callback = UpdateFootprintsTireTracksFieldEffect, }; -static const struct SpriteFrameImage sPicTable_BugTracks[] = { +static const struct SpriteFrameImage sPicTable_BugTracks[] = +{ overworld_frame(gFieldEffectObjectPic_BugTracks, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_BugTracks, 2, 2, 1), }; -static const struct SpriteFrameImage sPicTable_SpotTracks[] = { +static const struct SpriteFrameImage sPicTable_SpotTracks[] = +{ overworld_frame(gFieldEffectObjectPic_SpotTracks, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_SpotTracks, 2, 2, 1), }; -const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks = { - .tileTag = 0xFFFF, +const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks = +{ + .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_DeepSandFootprints, @@ -419,8 +444,9 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks = { .callback = UpdateFootprintsTireTracksFieldEffect, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks = { - .tileTag = 0xFFFF, +const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks = +{ + .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_DeepSandFootprints, @@ -429,7 +455,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks = { .callback = UpdateFootprintsTireTracksFieldEffect, }; -static const struct SpriteFrameImage sPicTable_BikeTireTracks[] = { +static const struct SpriteFrameImage sPicTable_BikeTireTracks[] = +{ overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 2), @@ -437,7 +464,8 @@ static const struct SpriteFrameImage sPicTable_BikeTireTracks[] = { }; -static const struct SpriteFrameImage sPicTable_SlitherTracks[] = { +static const struct SpriteFrameImage sPicTable_SlitherTracks[] = +{ overworld_frame(gFieldEffectObjectPic_SlitherTracks, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_SlitherTracks, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_SlitherTracks, 2, 2, 2), @@ -505,7 +533,8 @@ static const union AnimCmd *const sAnimTable_BikeTireTracks[] = sBikeTireTracksAnim_NECornerTurn, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks = { +const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -516,8 +545,9 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks = { }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SlitherTracks = { - .tileTag = 0xFFFF, +const struct SpriteTemplate gFieldEffectObjectTemplate_SlitherTracks = +{ + .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_BikeTireTracks, @@ -526,7 +556,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SlitherTracks = { .callback = UpdateFootprintsTireTracksFieldEffect, }; -static const struct SpriteFrameImage sPicTable_JumpBigSplash[] = { +static const struct SpriteFrameImage sPicTable_JumpBigSplash[] = +{ overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 2), @@ -547,7 +578,8 @@ static const union AnimCmd *const sAnimTable_JumpBigSplash[] = sAnim_JumpBigSplash, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash = { +const struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -557,7 +589,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash = { .callback = UpdateJumpImpactEffect, }; -static const struct SpriteFrameImage sPicTable_Splash[] = { +static const struct SpriteFrameImage sPicTable_Splash[] = +{ overworld_frame(gFieldEffectObjectPic_Splash, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_Splash, 2, 1, 1), }; @@ -588,7 +621,8 @@ static const union AnimCmd *const sAnimTable_Splash[] = sAnim_Splash_1, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Splash = { +const struct SpriteTemplate gFieldEffectObjectTemplate_Splash = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, @@ -598,7 +632,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Splash = { .callback = UpdateSplashFieldEffect, }; -static const struct SpriteFrameImage sPicTable_JumpSmallSplash[] = { +static const struct SpriteFrameImage sPicTable_JumpSmallSplash[] = +{ overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 2), @@ -617,7 +652,8 @@ static const union AnimCmd *const sAnimTable_JumpSmallSplash[] = sAnim_JumpSmallSplash, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash = { +const struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, @@ -627,7 +663,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash = { .callback = UpdateJumpImpactEffect, }; -static const struct SpriteFrameImage sPicTable_LongGrass[] = { +static const struct SpriteFrameImage sPicTable_LongGrass[] = +{ overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 2), @@ -651,7 +688,8 @@ static const union AnimCmd *const sAnimTable_LongGrass[] = sAnim_LongGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass = { +const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -661,7 +699,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass = { .callback = UpdateLongGrassFieldEffect, }; -static const struct SpriteFrameImage sPicTable_JumpLongGrass[] = { +static const struct SpriteFrameImage sPicTable_JumpLongGrass[] = +{ overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 2), @@ -686,7 +725,8 @@ static const union AnimCmd *const sAnimTable_JumpLongGrass[] = sAnim_JumpLongGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_JumpLongGrass = { +const struct SpriteTemplate gFieldEffectObjectTemplate_JumpLongGrass = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -696,7 +736,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_JumpLongGrass = { .callback = UpdateJumpImpactEffect, }; -static const struct SpriteFrameImage sPicTable_UnusedGrass[] = { +static const struct SpriteFrameImage sPicTable_UnusedGrass[] = +{ overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 6), overworld_frame(gFieldEffectObjectPic_Unknown17, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Unknown17, 2, 2, 1), @@ -727,7 +768,8 @@ static const union AnimCmd *const sAnimTable_UnusedGrass[] = sAnim_UnusedGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass = { +const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -737,7 +779,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass = { .callback = WaitFieldEffectSpriteAnim, }; -static const struct SpriteFrameImage sPicTable_UnusedGrass2[] = { +static const struct SpriteFrameImage sPicTable_UnusedGrass2[] = +{ overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 2), @@ -760,7 +803,8 @@ static const union AnimCmd *const sAnimTable_UnusedGrass2[] = sAnim_UnusedGrass2, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass2 = { +const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass2 = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -770,7 +814,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass2 = { .callback = WaitFieldEffectSpriteAnim, }; -static const struct SpriteFrameImage sPicTable_UnusedSand[] = { +static const struct SpriteFrameImage sPicTable_UnusedSand[] = +{ overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 2), @@ -791,7 +836,8 @@ static const union AnimCmd *const sAnimTable_UnusedSand[] = sAnim_UnusedSand, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedSand = { +const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedSand = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -801,7 +847,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedSand = { .callback = WaitFieldEffectSpriteAnim, }; -static const struct SpriteFrameImage sPicTable_SandPile[] = { +static const struct SpriteFrameImage sPicTable_SandPile[] = +{ overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 2), @@ -820,7 +867,8 @@ static const union AnimCmd *const sAnimTable_SandPile[] = sAnim_SandPile, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SandPile = { +const struct SpriteTemplate gFieldEffectObjectTemplate_SandPile = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, @@ -830,7 +878,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SandPile = { .callback = UpdateSandPileFieldEffect, }; -static const struct SpriteFrameImage sPicTable_WaterSurfacing[] = { +static const struct SpriteFrameImage sPicTable_WaterSurfacing[] = +{ overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 2), @@ -853,7 +902,8 @@ static const union AnimCmd *const sAnimTable_WaterSurfacing[] = sAnim_WaterSurfacing, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_WaterSurfacing = { +const struct SpriteTemplate gFieldEffectObjectTemplate_WaterSurfacing = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -897,7 +947,8 @@ static const union AffineAnimCmd *const sAffineAnims_ReflectionDistortion[] = sAffineAnim_ReflectionDistortion_1, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_ReflectionDistortion = { +const struct SpriteTemplate gFieldEffectObjectTemplate_ReflectionDistortion = +{ .tileTag = 0x0, .paletteTag = TAG_NONE, .oam = &gDummyOamData, @@ -907,7 +958,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ReflectionDistortion = { .callback = SpriteCallbackDummy, }; -static const struct SpriteFrameImage sPicTable_Sparkle[] = { +static const struct SpriteFrameImage sPicTable_Sparkle[] = +{ overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 2), @@ -946,7 +998,8 @@ static const union AnimCmd *const sAnimTable_Sparkle[] = sAnim_Sparkle, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle = { +const struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_NPC_2, .oam = &gObjectEventBaseOam_16x16, @@ -956,7 +1009,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle = { .callback = WaitFieldEffectSpriteAnim, }; -static const struct SpriteFrameImage sPicTable_TreeDisguise[] = { +static const struct SpriteFrameImage sPicTable_TreeDisguise[] = +{ overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 2), @@ -990,7 +1044,8 @@ static const union AnimCmd *const sAnimTable_TreeDisguise[] = sAnim_TreeDisguiseReveal, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise = { +const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise = +{ .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_3, .oam = &gObjectEventBaseOam_16x32, @@ -1000,7 +1055,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise = { .callback = UpdateDisguiseFieldEffect, }; -static const struct SpriteFrameImage sPicTable_MountainDisguise[] = { +static const struct SpriteFrameImage sPicTable_MountainDisguise[] = +{ overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 2), @@ -1034,7 +1090,8 @@ static const union AnimCmd *const sAnimTable_MountainDisguise[] = sAnim_MountainDisguiseReveal, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise = { +const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise = +{ .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_2, .oam = &gObjectEventBaseOam_16x32, @@ -1044,7 +1101,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise = { .callback = UpdateDisguiseFieldEffect, }; -static const struct SpriteFrameImage sPicTable_SandDisguisePlaceholder[] = { +static const struct SpriteFrameImage sPicTable_SandDisguisePlaceholder[] = +{ overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 2), @@ -1054,7 +1112,8 @@ static const struct SpriteFrameImage sPicTable_SandDisguisePlaceholder[] = { overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 6), }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder = { +const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder = +{ .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_16x32, @@ -1064,7 +1123,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder = .callback = UpdateDisguiseFieldEffect, }; -static const struct SpriteFrameImage sPicTable_Bird[] = { +static const struct SpriteFrameImage sPicTable_Bird[] = +{ obj_frame_tiles(gFieldEffectObjectPic_Bird), }; @@ -1079,7 +1139,8 @@ static const union AnimCmd *const sAnimTable_Bird[] = sAnim_Bird, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Bird = { +const struct SpriteTemplate gFieldEffectObjectTemplate_Bird = +{ .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_MAY, .oam = &gObjectEventBaseOam_32x32, @@ -1089,7 +1150,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Bird = { .callback = SpriteCallbackDummy, }; -static const struct SpriteFrameImage sPicTable_ShortGrass[] = { +static const struct SpriteFrameImage sPicTable_ShortGrass[] = +{ overworld_frame(gFieldEffectObjectPic_ShortGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_ShortGrass, 2, 2, 1), }; @@ -1106,7 +1168,8 @@ static const union AnimCmd *const sAnimTable_ShortGrass[] = sAnim_ShortGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass = { +const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -1116,7 +1179,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass = { .callback = UpdateShortGrassFieldEffect, }; -static const struct SpriteFrameImage sPicTable_HotSpringsWater[] = { +static const struct SpriteFrameImage sPicTable_HotSpringsWater[] = +{ obj_frame_tiles(gFieldEffectObjectPic_HotSpringsWater), }; @@ -1131,7 +1195,8 @@ static const union AnimCmd *const sAnimTable_HotSpringsWater[] = sAnim_HotSpringsWater, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater = { +const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -1141,7 +1206,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater = { .callback = UpdateHotSpringsWaterFieldEffect, }; -static const struct SpriteFrameImage sPicTable_AshPuff[] = { +static const struct SpriteFrameImage sPicTable_AshPuff[] = +{ overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 2), @@ -1177,7 +1243,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_AshPuff = const struct SpritePalette gSpritePalette_Ash = {gFieldEffectPal_Ash, FLDEFF_PAL_TAG_ASH}; -static const struct SpriteFrameImage sPicTable_AshLaunch[] = { +static const struct SpriteFrameImage sPicTable_AshLaunch[] = +{ overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 2), @@ -1211,7 +1278,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_AshLaunch = .callback = SpriteCB_AshLaunch }; -static const struct SpriteFrameImage sPicTable_Bubbles[] = { +static const struct SpriteFrameImage sPicTable_Bubbles[] = +{ overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 2), @@ -1240,7 +1308,8 @@ static const union AnimCmd *const sAnimTable_Bubbles[] = sAnim_Bubbles, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles = { +const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x32, @@ -1250,7 +1319,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles = { .callback = UpdateBubblesFieldEffect, }; -static const struct SpriteFrameImage sPicTable_SmallSparkle[] = { +static const struct SpriteFrameImage sPicTable_SmallSparkle[] = +{ overworld_frame(gFieldEffectObjectPic_SmallSparkle, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_SmallSparkle, 2, 2, 1), }; @@ -1268,7 +1338,8 @@ static const union AnimCmd *const sAnimTable_SmallSparkle[] = sAnim_SmallSparkle, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle = { +const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle = +{ .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_SMALL_SPARKLE, .oam = &gObjectEventBaseOam_16x16, @@ -1280,20 +1351,24 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle = { const struct SpritePalette gSpritePalette_SmallSparkle = {gFieldEffectPal_SmallSparkle, FLDEFF_PAL_TAG_SMALL_SPARKLE}; -static const union AnimCmd sAnim_RayquazaSpotlightEffect[] = { +static const union AnimCmd sAnim_RayquazaSpotlightEffect[] = +{ ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -static const union AnimCmd *const sAnimTable_RayquazaSpotlightEffect[] = { +static const union AnimCmd *const sAnimTable_RayquazaSpotlightEffect[] = +{ sAnim_RayquazaSpotlightEffect, }; -static const struct SpriteFrameImage sPicTable_RayquazaSpotlightEffect[] = { +static const struct SpriteFrameImage sPicTable_RayquazaSpotlightEffect[] = +{ overworld_frame(gObjectEventPic_Rayquaza, 4, 4, 0), }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = { +const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = +{ .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_32x32, diff --git a/src/data/object_events/object_event_anims.h b/src/data/object_events/object_event_anims.h index 8bb579e01b..5557287dce 100755 --- a/src/data/object_events/object_event_anims.h +++ b/src/data/object_events/object_event_anims.h @@ -246,11 +246,11 @@ static const union AnimCmd sAnim_GoNorth[] = static const union AnimCmd sAnim_GoNorth2F[] = { - ANIMCMD_FRAME(2, 6), - ANIMCMD_FRAME(3, 6), - ANIMCMD_FRAME(3, 6), - ANIMCMD_FRAME(2, 6), - ANIMCMD_JUMP(0), + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(2, 6), + ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoWest[] = diff --git a/src/data/object_events/object_event_graphics_info_followers.h b/src/data/object_events/object_event_graphics_info_followers.h index eb53f60d2c..4bbffe3d60 100644 --- a/src/data/object_events/object_event_graphics_info_followers.h +++ b/src/data/object_events/object_event_graphics_info_followers.h @@ -1,424 +1,426 @@ // Species-indexed pokemon object event table -const struct ObjectEventGraphicsInfo gPokemonObjectGraphics[] = { - [SPECIES_BULBASAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bulbasaur, gDummySpriteAffineAnimTable}, - [SPECIES_IVYSAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ivysaur, gDummySpriteAffineAnimTable}, - [SPECIES_VENUSAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venusaur, gDummySpriteAffineAnimTable}, - [SPECIES_CHARMANDER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charmander, gDummySpriteAffineAnimTable}, - [SPECIES_CHARMELEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charmeleon, gDummySpriteAffineAnimTable}, - [SPECIES_CHARIZARD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charizard, gDummySpriteAffineAnimTable}, - [SPECIES_SQUIRTLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Squirtle, gDummySpriteAffineAnimTable}, - [SPECIES_WARTORTLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wartortle, gDummySpriteAffineAnimTable}, - [SPECIES_BLASTOISE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blastoise, gDummySpriteAffineAnimTable}, - [SPECIES_CATERPIE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Caterpie, gDummySpriteAffineAnimTable}, - [SPECIES_METAPOD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metapod, gDummySpriteAffineAnimTable}, - [SPECIES_BUTTERFREE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Butterfree, gDummySpriteAffineAnimTable}, - [SPECIES_WEEDLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weedle, gDummySpriteAffineAnimTable}, - [SPECIES_KAKUNA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kakuna, gDummySpriteAffineAnimTable}, - [SPECIES_BEEDRILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beedrill, gDummySpriteAffineAnimTable}, - [SPECIES_PIDGEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgey, gDummySpriteAffineAnimTable}, - [SPECIES_PIDGEOTTO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgeotto, gDummySpriteAffineAnimTable}, - [SPECIES_PIDGEOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgeot, gDummySpriteAffineAnimTable}, - [SPECIES_RATTATA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rattata, gDummySpriteAffineAnimTable}, - [SPECIES_RATICATE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raticate, gDummySpriteAffineAnimTable}, - [SPECIES_SPEAROW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spearow, gDummySpriteAffineAnimTable}, - [SPECIES_FEAROW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Fearow, gDummySpriteAffineAnimTable}, - [SPECIES_EKANS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ekans, gDummySpriteAffineAnimTable}, - [SPECIES_ARBOK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Arbok, gDummySpriteAffineAnimTable}, - [SPECIES_PIKACHU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pikachu, gDummySpriteAffineAnimTable}, - [SPECIES_RAICHU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raichu, gDummySpriteAffineAnimTable}, - [SPECIES_SANDSHREW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sandshrew, gDummySpriteAffineAnimTable}, - [SPECIES_SANDSLASH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sandslash, gDummySpriteAffineAnimTable}, - [SPECIES_NIDORAN_F] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoran_f, gDummySpriteAffineAnimTable}, - [SPECIES_NIDORINA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidorina, gDummySpriteAffineAnimTable}, - [SPECIES_NIDOQUEEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoqueen, gDummySpriteAffineAnimTable}, - [SPECIES_NIDORAN_M] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoran_m, gDummySpriteAffineAnimTable}, - [SPECIES_NIDORINO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidorino, gDummySpriteAffineAnimTable}, - [SPECIES_NIDOKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoking, gDummySpriteAffineAnimTable}, - [SPECIES_CLEFAIRY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clefairy, gDummySpriteAffineAnimTable}, - [SPECIES_CLEFABLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clefable, gDummySpriteAffineAnimTable}, - [SPECIES_VULPIX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vulpix, gDummySpriteAffineAnimTable}, - [SPECIES_NINETALES] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ninetales, gDummySpriteAffineAnimTable}, - [SPECIES_JIGGLYPUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jigglypuff, gDummySpriteAffineAnimTable}, - [SPECIES_WIGGLYTUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wigglytuff, gDummySpriteAffineAnimTable}, - [SPECIES_ZUBAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zubat, gDummySpriteAffineAnimTable}, - [SPECIES_GOLBAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golbat, gDummySpriteAffineAnimTable}, - [SPECIES_ODDISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Oddish, gDummySpriteAffineAnimTable}, - [SPECIES_GLOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gloom, gDummySpriteAffineAnimTable}, - [SPECIES_VILEPLUME] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vileplume, gDummySpriteAffineAnimTable}, - [SPECIES_PARAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Paras, gDummySpriteAffineAnimTable}, - [SPECIES_PARASECT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Parasect, gDummySpriteAffineAnimTable}, - [SPECIES_VENONAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venonat, gDummySpriteAffineAnimTable}, - [SPECIES_VENOMOTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venomoth, gDummySpriteAffineAnimTable}, - [SPECIES_DIGLETT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Diglett, gDummySpriteAffineAnimTable}, - [SPECIES_DUGTRIO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dugtrio, gDummySpriteAffineAnimTable}, - [SPECIES_MEOWTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meowth, gDummySpriteAffineAnimTable}, - [SPECIES_PERSIAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Persian, gDummySpriteAffineAnimTable}, - [SPECIES_PSYDUCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Psyduck, gDummySpriteAffineAnimTable}, - [SPECIES_GOLDUCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golduck, gDummySpriteAffineAnimTable}, - [SPECIES_MANKEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mankey, gDummySpriteAffineAnimTable}, - [SPECIES_PRIMEAPE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Primeape, gDummySpriteAffineAnimTable}, - [SPECIES_GROWLITHE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Growlithe, gDummySpriteAffineAnimTable}, - [SPECIES_ARCANINE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Arcanine, gDummySpriteAffineAnimTable}, - [SPECIES_POLIWAG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwag, gDummySpriteAffineAnimTable}, - [SPECIES_POLIWHIRL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwhirl, gDummySpriteAffineAnimTable}, - [SPECIES_POLIWRATH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwrath, gDummySpriteAffineAnimTable}, - [SPECIES_ABRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Abra, gDummySpriteAffineAnimTable}, - [SPECIES_KADABRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kadabra, gDummySpriteAffineAnimTable}, - [SPECIES_ALAKAZAM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Alakazam, gDummySpriteAffineAnimTable}, - [SPECIES_MACHOP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machop, gDummySpriteAffineAnimTable}, - [SPECIES_MACHOKE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machoke, gDummySpriteAffineAnimTable}, - [SPECIES_MACHAMP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machamp, gDummySpriteAffineAnimTable}, - [SPECIES_BELLSPROUT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bellsprout, gDummySpriteAffineAnimTable}, - [SPECIES_WEEPINBELL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weepinbell, gDummySpriteAffineAnimTable}, - [SPECIES_VICTREEBEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Victreebel, gDummySpriteAffineAnimTable}, - [SPECIES_TENTACOOL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tentacool, gDummySpriteAffineAnimTable}, - [SPECIES_TENTACRUEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tentacruel, gDummySpriteAffineAnimTable}, - [SPECIES_GEODUDE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Geodude, gDummySpriteAffineAnimTable}, - [SPECIES_GRAVELER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Graveler, gDummySpriteAffineAnimTable}, - [SPECIES_GOLEM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golem, gDummySpriteAffineAnimTable}, - [SPECIES_PONYTA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ponyta, gDummySpriteAffineAnimTable}, - [SPECIES_RAPIDASH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rapidash, gDummySpriteAffineAnimTable}, - [SPECIES_SLOWPOKE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowpoke, gDummySpriteAffineAnimTable}, - [SPECIES_SLOWBRO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowbro, gDummySpriteAffineAnimTable}, - [SPECIES_MAGNEMITE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magnemite, gDummySpriteAffineAnimTable}, - [SPECIES_MAGNETON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magneton, gDummySpriteAffineAnimTable}, - [SPECIES_FARFETCHD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Farfetchd, gDummySpriteAffineAnimTable}, - [SPECIES_DODUO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Doduo, gDummySpriteAffineAnimTable}, - [SPECIES_DODRIO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dodrio, gDummySpriteAffineAnimTable}, - [SPECIES_SEEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seel, gDummySpriteAffineAnimTable}, - [SPECIES_DEWGONG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dewgong, gDummySpriteAffineAnimTable}, - [SPECIES_GRIMER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grimer, gDummySpriteAffineAnimTable}, - [SPECIES_MUK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Muk, gDummySpriteAffineAnimTable}, - [SPECIES_SHELLDER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shellder, gDummySpriteAffineAnimTable}, - [SPECIES_CLOYSTER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cloyster, gDummySpriteAffineAnimTable}, - [SPECIES_GASTLY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gastly, gDummySpriteAffineAnimTable}, - [SPECIES_HAUNTER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Haunter, gDummySpriteAffineAnimTable}, - [SPECIES_GENGAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gengar, gDummySpriteAffineAnimTable}, - [SPECIES_ONIX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Onix, gDummySpriteAffineAnimTable}, - [SPECIES_DROWZEE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Drowzee, gDummySpriteAffineAnimTable}, - [SPECIES_HYPNO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hypno, gDummySpriteAffineAnimTable}, - [SPECIES_KRABBY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Krabby, gDummySpriteAffineAnimTable}, - [SPECIES_KINGLER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kingler, gDummySpriteAffineAnimTable}, - [SPECIES_VOLTORB] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Voltorb, gDummySpriteAffineAnimTable}, - [SPECIES_ELECTRODE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electrode, gDummySpriteAffineAnimTable}, - [SPECIES_EXEGGCUTE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exeggcute, gDummySpriteAffineAnimTable}, - [SPECIES_EXEGGUTOR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exeggutor, gDummySpriteAffineAnimTable}, - [SPECIES_CUBONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cubone, gDummySpriteAffineAnimTable}, - [SPECIES_MAROWAK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marowak, gDummySpriteAffineAnimTable}, - [SPECIES_HITMONLEE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmonlee, gDummySpriteAffineAnimTable}, - [SPECIES_HITMONCHAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmonchan, gDummySpriteAffineAnimTable}, - [SPECIES_LICKITUNG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lickitung, gDummySpriteAffineAnimTable}, - [SPECIES_KOFFING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Koffing, gDummySpriteAffineAnimTable}, - [SPECIES_WEEZING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weezing, gDummySpriteAffineAnimTable}, - [SPECIES_RHYHORN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rhyhorn, gDummySpriteAffineAnimTable}, - [SPECIES_RHYDON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rhydon, gDummySpriteAffineAnimTable}, - [SPECIES_CHANSEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chansey, gDummySpriteAffineAnimTable}, - [SPECIES_TANGELA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tangela, gDummySpriteAffineAnimTable}, - [SPECIES_KANGASKHAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kangaskhan, gDummySpriteAffineAnimTable}, - [SPECIES_HORSEA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Horsea, gDummySpriteAffineAnimTable}, - [SPECIES_SEADRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seadra, gDummySpriteAffineAnimTable}, - [SPECIES_GOLDEEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Goldeen, gDummySpriteAffineAnimTable}, - [SPECIES_SEAKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seaking, gDummySpriteAffineAnimTable}, - [SPECIES_STARYU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Staryu, gDummySpriteAffineAnimTable}, - [SPECIES_STARMIE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Starmie, gDummySpriteAffineAnimTable}, - [SPECIES_MR_MIME] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mr_Mime, gDummySpriteAffineAnimTable}, - [SPECIES_SCYTHER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Scyther, gDummySpriteAffineAnimTable}, - [SPECIES_JYNX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jynx, gDummySpriteAffineAnimTable}, - [SPECIES_ELECTABUZZ] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electabuzz, gDummySpriteAffineAnimTable}, - [SPECIES_MAGMAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magmar, gDummySpriteAffineAnimTable}, - [SPECIES_PINSIR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pinsir, gDummySpriteAffineAnimTable}, - [SPECIES_TAUROS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tauros, gDummySpriteAffineAnimTable}, - [SPECIES_MAGIKARP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magikarp, gDummySpriteAffineAnimTable}, - [SPECIES_GYARADOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gyarados, gDummySpriteAffineAnimTable}, - [SPECIES_LAPRAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lapras, gDummySpriteAffineAnimTable}, - [SPECIES_DITTO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ditto, gDummySpriteAffineAnimTable}, - [SPECIES_EEVEE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Eevee, gDummySpriteAffineAnimTable}, - [SPECIES_VAPOREON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vaporeon, gDummySpriteAffineAnimTable}, - [SPECIES_JOLTEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jolteon, gDummySpriteAffineAnimTable}, - [SPECIES_FLAREON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flareon, gDummySpriteAffineAnimTable}, - [SPECIES_PORYGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Porygon, gDummySpriteAffineAnimTable}, - [SPECIES_OMANYTE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Omanyte, gDummySpriteAffineAnimTable}, - [SPECIES_OMASTAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Omastar, gDummySpriteAffineAnimTable}, - [SPECIES_KABUTO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kabuto, gDummySpriteAffineAnimTable}, - [SPECIES_KABUTOPS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kabutops, gDummySpriteAffineAnimTable}, - [SPECIES_AERODACTYL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aerodactyl, gDummySpriteAffineAnimTable}, - [SPECIES_SNORLAX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snorlax, gDummySpriteAffineAnimTable}, - [SPECIES_ARTICUNO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Articuno, gDummySpriteAffineAnimTable}, - [SPECIES_ZAPDOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zapdos, gDummySpriteAffineAnimTable}, - [SPECIES_MOLTRES] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Moltres, gDummySpriteAffineAnimTable}, - [SPECIES_DRATINI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dratini, gDummySpriteAffineAnimTable}, - [SPECIES_DRAGONAIR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dragonair, gDummySpriteAffineAnimTable}, - [SPECIES_DRAGONITE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dragonite, gDummySpriteAffineAnimTable}, - [SPECIES_MEWTWO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mewtwo, gDummySpriteAffineAnimTable}, - [SPECIES_MEW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mew, gDummySpriteAffineAnimTable}, - [SPECIES_CHIKORITA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chikorita, gDummySpriteAffineAnimTable}, - [SPECIES_BAYLEEF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bayleef, gDummySpriteAffineAnimTable}, - [SPECIES_MEGANIUM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meganium, gDummySpriteAffineAnimTable}, - [SPECIES_CYNDAQUIL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cyndaquil, gDummySpriteAffineAnimTable}, - [SPECIES_QUILAVA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Quilava, gDummySpriteAffineAnimTable}, - [SPECIES_TYPHLOSION] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Typhlosion, gDummySpriteAffineAnimTable}, - [SPECIES_TOTODILE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Totodile, gDummySpriteAffineAnimTable}, - [SPECIES_CROCONAW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Croconaw, gDummySpriteAffineAnimTable}, - [SPECIES_FERALIGATR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Feraligatr, gDummySpriteAffineAnimTable}, - [SPECIES_SENTRET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sentret, gDummySpriteAffineAnimTable}, - [SPECIES_FURRET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Furret, gDummySpriteAffineAnimTable}, - [SPECIES_HOOTHOOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hoothoot, gDummySpriteAffineAnimTable}, - [SPECIES_NOCTOWL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Noctowl, gDummySpriteAffineAnimTable}, - [SPECIES_LEDYBA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ledyba, gDummySpriteAffineAnimTable}, - [SPECIES_LEDIAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ledian, gDummySpriteAffineAnimTable}, - [SPECIES_SPINARAK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spinarak, gDummySpriteAffineAnimTable}, - [SPECIES_ARIADOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ariados, gDummySpriteAffineAnimTable}, - [SPECIES_CROBAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Crobat, gDummySpriteAffineAnimTable}, - [SPECIES_CHINCHOU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chinchou, gDummySpriteAffineAnimTable}, - [SPECIES_LANTURN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lanturn, gDummySpriteAffineAnimTable}, - [SPECIES_PICHU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pichu, gDummySpriteAffineAnimTable}, - [SPECIES_CLEFFA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cleffa, gDummySpriteAffineAnimTable}, - [SPECIES_IGGLYBUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Igglybuff, gDummySpriteAffineAnimTable}, - [SPECIES_TOGEPI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togepi, gDummySpriteAffineAnimTable}, - [SPECIES_TOGETIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togetic, gDummySpriteAffineAnimTable}, - [SPECIES_NATU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Natu, gDummySpriteAffineAnimTable}, - [SPECIES_XATU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Xatu, gDummySpriteAffineAnimTable}, - [SPECIES_MAREEP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mareep, gDummySpriteAffineAnimTable}, - [SPECIES_FLAAFFY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flaaffy, gDummySpriteAffineAnimTable}, - [SPECIES_AMPHAROS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ampharos, gDummySpriteAffineAnimTable}, - [SPECIES_BELLOSSOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bellossom, gDummySpriteAffineAnimTable}, - [SPECIES_MARILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marill, gDummySpriteAffineAnimTable}, - [SPECIES_AZUMARILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Azumarill, gDummySpriteAffineAnimTable}, - [SPECIES_SUDOWOODO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sudowoodo, gDummySpriteAffineAnimTable}, - [SPECIES_POLITOED] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Politoed, gDummySpriteAffineAnimTable}, - [SPECIES_HOPPIP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hoppip, gDummySpriteAffineAnimTable}, - [SPECIES_SKIPLOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skiploom, gDummySpriteAffineAnimTable}, - [SPECIES_JUMPLUFF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jumpluff, gDummySpriteAffineAnimTable}, - [SPECIES_AIPOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aipom, gDummySpriteAffineAnimTable}, - [SPECIES_SUNKERN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sunkern, gDummySpriteAffineAnimTable}, - [SPECIES_SUNFLORA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sunflora, gDummySpriteAffineAnimTable}, - [SPECIES_YANMA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Yanma, gDummySpriteAffineAnimTable}, - [SPECIES_WOOPER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wooper, gDummySpriteAffineAnimTable}, - [SPECIES_QUAGSIRE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Quagsire, gDummySpriteAffineAnimTable}, - [SPECIES_ESPEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Espeon, gDummySpriteAffineAnimTable}, - [SPECIES_UMBREON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Umbreon, gDummySpriteAffineAnimTable}, - [SPECIES_MURKROW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Murkrow, gDummySpriteAffineAnimTable}, - [SPECIES_SLOWKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowking, gDummySpriteAffineAnimTable}, - [SPECIES_MISDREAVUS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Misdreavus, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_A, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_B] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_B, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_C] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_C, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_D] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_D, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_E] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_E, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_F] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_F, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_G] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_G, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_H] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_H, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_I] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_I, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_J] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_J, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_K] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_K, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_L] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_L, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_M] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_M, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_N] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_N, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_O] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_O, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_P] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_P, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_Q] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Q, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_R] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_R, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_S] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_S, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_T] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_T, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_U] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_U, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_V] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_V, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_W] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_W, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_X] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_X, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_Y] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Y, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_Z] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Z, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_EMARK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Exclamation, gDummySpriteAffineAnimTable}, - [SPECIES_UNOWN_QMARK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Question, gDummySpriteAffineAnimTable}, - [SPECIES_WOBBUFFET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wobbuffet, gDummySpriteAffineAnimTable}, - [SPECIES_GIRAFARIG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Girafarig, gDummySpriteAffineAnimTable}, - [SPECIES_PINECO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pineco, gDummySpriteAffineAnimTable}, - [SPECIES_FORRETRESS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Forretress, gDummySpriteAffineAnimTable}, - [SPECIES_DUNSPARCE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dunsparce, gDummySpriteAffineAnimTable}, - [SPECIES_GLIGAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gligar, gDummySpriteAffineAnimTable}, - [SPECIES_STEELIX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Steelix, gDummySpriteAffineAnimTable}, - [SPECIES_SNUBBULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snubbull, gDummySpriteAffineAnimTable}, - [SPECIES_GRANBULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Granbull, gDummySpriteAffineAnimTable}, - [SPECIES_QWILFISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Qwilfish, gDummySpriteAffineAnimTable}, - [SPECIES_SCIZOR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Scizor, gDummySpriteAffineAnimTable}, - [SPECIES_SHUCKLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shuckle, gDummySpriteAffineAnimTable}, - [SPECIES_HERACROSS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Heracross, gDummySpriteAffineAnimTable}, - [SPECIES_SNEASEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sneasel, gDummySpriteAffineAnimTable}, - [SPECIES_TEDDIURSA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Teddiursa, gDummySpriteAffineAnimTable}, - [SPECIES_URSARING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ursaring, gDummySpriteAffineAnimTable}, - [SPECIES_SLUGMA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slugma, gDummySpriteAffineAnimTable}, - [SPECIES_MAGCARGO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magcargo, gDummySpriteAffineAnimTable}, - [SPECIES_SWINUB] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swinub, gDummySpriteAffineAnimTable}, - [SPECIES_PILOSWINE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Piloswine, gDummySpriteAffineAnimTable}, - [SPECIES_CORSOLA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Corsola, gDummySpriteAffineAnimTable}, - [SPECIES_REMORAID] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Remoraid, gDummySpriteAffineAnimTable}, - [SPECIES_OCTILLERY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Octillery, gDummySpriteAffineAnimTable}, - [SPECIES_DELIBIRD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Delibird, gDummySpriteAffineAnimTable}, - [SPECIES_MANTINE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mantine, gDummySpriteAffineAnimTable}, - [SPECIES_SKARMORY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skarmory, gDummySpriteAffineAnimTable}, - [SPECIES_HOUNDOUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Houndour, gDummySpriteAffineAnimTable}, - [SPECIES_HOUNDOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Houndoom, gDummySpriteAffineAnimTable}, - [SPECIES_KINGDRA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kingdra, gDummySpriteAffineAnimTable}, - [SPECIES_PHANPY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Phanpy, gDummySpriteAffineAnimTable}, - [SPECIES_DONPHAN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Donphan, gDummySpriteAffineAnimTable}, - [SPECIES_PORYGON2] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Porygon2, gDummySpriteAffineAnimTable}, - [SPECIES_STANTLER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Stantler, gDummySpriteAffineAnimTable}, - [SPECIES_SMEARGLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Smeargle, gDummySpriteAffineAnimTable}, - [SPECIES_TYROGUE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tyrogue, gDummySpriteAffineAnimTable}, - [SPECIES_HITMONTOP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmontop, gDummySpriteAffineAnimTable}, - [SPECIES_SMOOCHUM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Smoochum, gDummySpriteAffineAnimTable}, - [SPECIES_ELEKID] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Elekid, gDummySpriteAffineAnimTable}, - [SPECIES_MAGBY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magby, gDummySpriteAffineAnimTable}, - [SPECIES_MILTANK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Miltank, gDummySpriteAffineAnimTable}, - [SPECIES_BLISSEY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blissey, gDummySpriteAffineAnimTable}, - [SPECIES_RAIKOU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raikou, gDummySpriteAffineAnimTable}, - [SPECIES_ENTEI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Entei, gDummySpriteAffineAnimTable}, - [SPECIES_SUICUNE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Suicune, gDummySpriteAffineAnimTable}, - [SPECIES_LARVITAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Larvitar, gDummySpriteAffineAnimTable}, - [SPECIES_PUPITAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pupitar, gDummySpriteAffineAnimTable}, - [SPECIES_TYRANITAR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tyranitar, gDummySpriteAffineAnimTable}, - [SPECIES_LUGIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lugia, gDummySpriteAffineAnimTable}, - [SPECIES_HO_OH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ho_oh, gDummySpriteAffineAnimTable}, - [SPECIES_CELEBI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Celebi, gDummySpriteAffineAnimTable}, - [SPECIES_TREECKO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Treecko, gDummySpriteAffineAnimTable}, - [SPECIES_GROVYLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grovyle, gDummySpriteAffineAnimTable}, - [SPECIES_SCEPTILE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sceptile, gDummySpriteAffineAnimTable}, - [SPECIES_TORCHIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Torchic, gDummySpriteAffineAnimTable}, - [SPECIES_COMBUSKEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Combusken, gDummySpriteAffineAnimTable}, - [SPECIES_BLAZIKEN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blaziken, gDummySpriteAffineAnimTable}, - [SPECIES_MUDKIP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mudkip, gDummySpriteAffineAnimTable}, - [SPECIES_MARSHTOMP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marshtomp, gDummySpriteAffineAnimTable}, - [SPECIES_SWAMPERT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swampert, gDummySpriteAffineAnimTable}, - [SPECIES_POOCHYENA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poochyena, gDummySpriteAffineAnimTable}, - [SPECIES_MIGHTYENA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mightyena, gDummySpriteAffineAnimTable}, - [SPECIES_ZIGZAGOON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zigzagoon, gDummySpriteAffineAnimTable}, - [SPECIES_LINOONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Linoone, gDummySpriteAffineAnimTable}, - [SPECIES_WURMPLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wurmple, gDummySpriteAffineAnimTable}, - [SPECIES_SILCOON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Silcoon, gDummySpriteAffineAnimTable}, - [SPECIES_BEAUTIFLY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beautifly, gDummySpriteAffineAnimTable}, - [SPECIES_CASCOON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cascoon, gDummySpriteAffineAnimTable}, - [SPECIES_DUSTOX] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dustox, gDummySpriteAffineAnimTable}, - [SPECIES_LOTAD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lotad, gDummySpriteAffineAnimTable}, - [SPECIES_LOMBRE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lombre, gDummySpriteAffineAnimTable}, - [SPECIES_LUDICOLO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ludicolo, gDummySpriteAffineAnimTable}, - [SPECIES_SEEDOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seedot, gDummySpriteAffineAnimTable}, - [SPECIES_NUZLEAF] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nuzleaf, gDummySpriteAffineAnimTable}, - [SPECIES_SHIFTRY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shiftry, gDummySpriteAffineAnimTable}, - [SPECIES_TAILLOW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Taillow, gDummySpriteAffineAnimTable}, - [SPECIES_SWELLOW] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swellow, gDummySpriteAffineAnimTable}, - [SPECIES_WINGULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wingull, gDummySpriteAffineAnimTable}, - [SPECIES_PELIPPER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pelipper, gDummySpriteAffineAnimTable}, - [SPECIES_RALTS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ralts, gDummySpriteAffineAnimTable}, - [SPECIES_KIRLIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kirlia, gDummySpriteAffineAnimTable}, - [SPECIES_GARDEVOIR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gardevoir, gDummySpriteAffineAnimTable}, - [SPECIES_SURSKIT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Surskit, gDummySpriteAffineAnimTable}, - [SPECIES_MASQUERAIN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Masquerain, gDummySpriteAffineAnimTable}, - [SPECIES_SHROOMISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shroomish, gDummySpriteAffineAnimTable}, - [SPECIES_BRELOOM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Breloom, gDummySpriteAffineAnimTable}, - [SPECIES_SLAKOTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slakoth, gDummySpriteAffineAnimTable}, - [SPECIES_VIGOROTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vigoroth, gDummySpriteAffineAnimTable}, - [SPECIES_SLAKING] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slaking, gDummySpriteAffineAnimTable}, - [SPECIES_NINCADA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nincada, gDummySpriteAffineAnimTable}, - [SPECIES_NINJASK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ninjask, gDummySpriteAffineAnimTable}, - [SPECIES_SHEDINJA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shedinja, gDummySpriteAffineAnimTable}, - [SPECIES_WHISMUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Whismur, gDummySpriteAffineAnimTable}, - [SPECIES_LOUDRED] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Loudred, gDummySpriteAffineAnimTable}, - [SPECIES_EXPLOUD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exploud, gDummySpriteAffineAnimTable}, - [SPECIES_MAKUHITA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Makuhita, gDummySpriteAffineAnimTable}, - [SPECIES_HARIYAMA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hariyama, gDummySpriteAffineAnimTable}, - [SPECIES_AZURILL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Azurill, gDummySpriteAffineAnimTable}, - [SPECIES_NOSEPASS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nosepass, gDummySpriteAffineAnimTable}, - [SPECIES_SKITTY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skitty, gDummySpriteAffineAnimTable}, - [SPECIES_DELCATTY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Delcatty, gDummySpriteAffineAnimTable}, - [SPECIES_SABLEYE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sableye, gDummySpriteAffineAnimTable}, - [SPECIES_MAWILE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mawile, gDummySpriteAffineAnimTable}, - [SPECIES_ARON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aron, gDummySpriteAffineAnimTable}, - [SPECIES_LAIRON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lairon, gDummySpriteAffineAnimTable}, - [SPECIES_AGGRON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aggron, gDummySpriteAffineAnimTable}, - [SPECIES_MEDITITE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meditite, gDummySpriteAffineAnimTable}, - [SPECIES_MEDICHAM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Medicham, gDummySpriteAffineAnimTable}, - [SPECIES_ELECTRIKE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electrike, gDummySpriteAffineAnimTable}, - [SPECIES_MANECTRIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Manectric, gDummySpriteAffineAnimTable}, - [SPECIES_PLUSLE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Plusle, gDummySpriteAffineAnimTable}, - [SPECIES_MINUN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Minun, gDummySpriteAffineAnimTable}, - [SPECIES_VOLBEAT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Volbeat, gDummySpriteAffineAnimTable}, - [SPECIES_ILLUMISE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Illumise, gDummySpriteAffineAnimTable}, - [SPECIES_ROSELIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Roselia, gDummySpriteAffineAnimTable}, - [SPECIES_GULPIN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gulpin, gDummySpriteAffineAnimTable}, - [SPECIES_SWALOT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swalot, gDummySpriteAffineAnimTable}, - [SPECIES_CARVANHA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Carvanha, gDummySpriteAffineAnimTable}, - [SPECIES_SHARPEDO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sharpedo, gDummySpriteAffineAnimTable}, - [SPECIES_WAILMER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wailmer, gDummySpriteAffineAnimTable}, - [SPECIES_WAILORD] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wailord, gDummySpriteAffineAnimTable}, - [SPECIES_NUMEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Numel, gDummySpriteAffineAnimTable}, - [SPECIES_CAMERUPT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Camerupt, gDummySpriteAffineAnimTable}, - [SPECIES_TORKOAL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Torkoal, gDummySpriteAffineAnimTable}, - [SPECIES_SPOINK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spoink, gDummySpriteAffineAnimTable}, - [SPECIES_GRUMPIG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grumpig, gDummySpriteAffineAnimTable}, - [SPECIES_SPINDA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spinda, gDummySpriteAffineAnimTable}, - [SPECIES_TRAPINCH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Trapinch, gDummySpriteAffineAnimTable}, - [SPECIES_VIBRAVA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vibrava, gDummySpriteAffineAnimTable}, - [SPECIES_FLYGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flygon, gDummySpriteAffineAnimTable}, - [SPECIES_CACNEA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cacnea, gDummySpriteAffineAnimTable}, - [SPECIES_CACTURNE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cacturne, gDummySpriteAffineAnimTable}, - [SPECIES_SWABLU] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swablu, gDummySpriteAffineAnimTable}, - [SPECIES_ALTARIA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Altaria, gDummySpriteAffineAnimTable}, - [SPECIES_ZANGOOSE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zangoose, gDummySpriteAffineAnimTable}, - [SPECIES_SEVIPER] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seviper, gDummySpriteAffineAnimTable}, - [SPECIES_LUNATONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lunatone, gDummySpriteAffineAnimTable}, - [SPECIES_SOLROCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Solrock, gDummySpriteAffineAnimTable}, - [SPECIES_BARBOACH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Barboach, gDummySpriteAffineAnimTable}, - [SPECIES_WHISCASH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Whiscash, gDummySpriteAffineAnimTable}, - [SPECIES_CORPHISH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Corphish, gDummySpriteAffineAnimTable}, - [SPECIES_CRAWDAUNT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Crawdaunt, gDummySpriteAffineAnimTable}, - [SPECIES_BALTOY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Baltoy, gDummySpriteAffineAnimTable}, - [SPECIES_CLAYDOL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Claydol, gDummySpriteAffineAnimTable}, - [SPECIES_LILEEP] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lileep, gDummySpriteAffineAnimTable}, - [SPECIES_CRADILY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cradily, gDummySpriteAffineAnimTable}, - [SPECIES_ANORITH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Anorith, gDummySpriteAffineAnimTable}, - [SPECIES_ARMALDO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Armaldo, gDummySpriteAffineAnimTable}, - [SPECIES_FEEBAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Feebas, gDummySpriteAffineAnimTable}, - [SPECIES_MILOTIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Milotic, gDummySpriteAffineAnimTable}, - [SPECIES_CASTFORM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Castform, gDummySpriteAffineAnimTable}, - [SPECIES_KECLEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kecleon, gDummySpriteAffineAnimTable}, - [SPECIES_SHUPPET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shuppet, gDummySpriteAffineAnimTable}, - [SPECIES_BANETTE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Banette, gDummySpriteAffineAnimTable}, - [SPECIES_DUSKULL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Duskull, gDummySpriteAffineAnimTable}, - [SPECIES_DUSCLOPS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dusclops, gDummySpriteAffineAnimTable}, - [SPECIES_TROPIUS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tropius, gDummySpriteAffineAnimTable}, - [SPECIES_CHIMECHO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chimecho, gDummySpriteAffineAnimTable}, - [SPECIES_ABSOL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Absol, gDummySpriteAffineAnimTable}, - [SPECIES_WYNAUT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wynaut, gDummySpriteAffineAnimTable}, - [SPECIES_SNORUNT] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snorunt, gDummySpriteAffineAnimTable}, - [SPECIES_GLALIE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Glalie, gDummySpriteAffineAnimTable}, - [SPECIES_SPHEAL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spheal, gDummySpriteAffineAnimTable}, - [SPECIES_SEALEO] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sealeo, gDummySpriteAffineAnimTable}, - [SPECIES_WALREIN] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Walrein, gDummySpriteAffineAnimTable}, - [SPECIES_CLAMPERL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clamperl, gDummySpriteAffineAnimTable}, - [SPECIES_HUNTAIL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Huntail, gDummySpriteAffineAnimTable}, - [SPECIES_GOREBYSS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gorebyss, gDummySpriteAffineAnimTable}, - [SPECIES_RELICANTH] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Relicanth, gDummySpriteAffineAnimTable}, - [SPECIES_LUVDISC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Luvdisc, gDummySpriteAffineAnimTable}, - [SPECIES_BAGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bagon, gDummySpriteAffineAnimTable}, - [SPECIES_SHELGON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shelgon, gDummySpriteAffineAnimTable}, - [SPECIES_SALAMENCE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Salamence, gDummySpriteAffineAnimTable}, - [SPECIES_BELDUM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beldum, gDummySpriteAffineAnimTable}, - [SPECIES_METANG] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metang, gDummySpriteAffineAnimTable}, - [SPECIES_METAGROSS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metagross, gDummySpriteAffineAnimTable}, - [SPECIES_REGIROCK] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Regirock, gDummySpriteAffineAnimTable}, - [SPECIES_REGICE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Regice, gDummySpriteAffineAnimTable}, - [SPECIES_REGISTEEL] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Registeel, gDummySpriteAffineAnimTable}, - [SPECIES_LATIAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Latias, gDummySpriteAffineAnimTable}, - [SPECIES_LATIOS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Latios, gDummySpriteAffineAnimTable}, - [SPECIES_KYOGRE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kyogre, gDummySpriteAffineAnimTable}, - [SPECIES_GROUDON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Groudon, gDummySpriteAffineAnimTable}, - [SPECIES_RAYQUAZA] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rayquaza, gDummySpriteAffineAnimTable}, - [SPECIES_JIRACHI] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jirachi, gDummySpriteAffineAnimTable}, - [SPECIES_DEOXYS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Deoxys, gDummySpriteAffineAnimTable}, +const struct ObjectEventGraphicsInfo gPokemonObjectGraphics[] = +{ + [SPECIES_BULBASAUR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bulbasaur, gDummySpriteAffineAnimTable}, + [SPECIES_IVYSAUR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ivysaur, gDummySpriteAffineAnimTable}, + [SPECIES_VENUSAUR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venusaur, gDummySpriteAffineAnimTable}, + [SPECIES_CHARMANDER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charmander, gDummySpriteAffineAnimTable}, + [SPECIES_CHARMELEON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charmeleon, gDummySpriteAffineAnimTable}, + [SPECIES_CHARIZARD] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Charizard, gDummySpriteAffineAnimTable}, + [SPECIES_SQUIRTLE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Squirtle, gDummySpriteAffineAnimTable}, + [SPECIES_WARTORTLE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wartortle, gDummySpriteAffineAnimTable}, + [SPECIES_BLASTOISE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blastoise, gDummySpriteAffineAnimTable}, + [SPECIES_CATERPIE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Caterpie, gDummySpriteAffineAnimTable}, + [SPECIES_METAPOD] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metapod, gDummySpriteAffineAnimTable}, + [SPECIES_BUTTERFREE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Butterfree, gDummySpriteAffineAnimTable}, + [SPECIES_WEEDLE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weedle, gDummySpriteAffineAnimTable}, + [SPECIES_KAKUNA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kakuna, gDummySpriteAffineAnimTable}, + [SPECIES_BEEDRILL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beedrill, gDummySpriteAffineAnimTable}, + [SPECIES_PIDGEY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgey, gDummySpriteAffineAnimTable}, + [SPECIES_PIDGEOTTO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgeotto, gDummySpriteAffineAnimTable}, + [SPECIES_PIDGEOT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pidgeot, gDummySpriteAffineAnimTable}, + [SPECIES_RATTATA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rattata, gDummySpriteAffineAnimTable}, + [SPECIES_RATICATE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raticate, gDummySpriteAffineAnimTable}, + [SPECIES_SPEAROW] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spearow, gDummySpriteAffineAnimTable}, + [SPECIES_FEAROW] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Fearow, gDummySpriteAffineAnimTable}, + [SPECIES_EKANS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ekans, gDummySpriteAffineAnimTable}, + [SPECIES_ARBOK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Arbok, gDummySpriteAffineAnimTable}, + [SPECIES_PIKACHU] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pikachu, gDummySpriteAffineAnimTable}, + [SPECIES_RAICHU] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raichu, gDummySpriteAffineAnimTable}, + [SPECIES_SANDSHREW] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sandshrew, gDummySpriteAffineAnimTable}, + [SPECIES_SANDSLASH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sandslash, gDummySpriteAffineAnimTable}, + [SPECIES_NIDORAN_F] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoran_f, gDummySpriteAffineAnimTable}, + [SPECIES_NIDORINA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidorina, gDummySpriteAffineAnimTable}, + [SPECIES_NIDOQUEEN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoqueen, gDummySpriteAffineAnimTable}, + [SPECIES_NIDORAN_M] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoran_m, gDummySpriteAffineAnimTable}, + [SPECIES_NIDORINO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidorino, gDummySpriteAffineAnimTable}, + [SPECIES_NIDOKING] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nidoking, gDummySpriteAffineAnimTable}, + [SPECIES_CLEFAIRY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clefairy, gDummySpriteAffineAnimTable}, + [SPECIES_CLEFABLE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clefable, gDummySpriteAffineAnimTable}, + [SPECIES_VULPIX] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vulpix, gDummySpriteAffineAnimTable}, + [SPECIES_NINETALES] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ninetales, gDummySpriteAffineAnimTable}, + [SPECIES_JIGGLYPUFF] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jigglypuff, gDummySpriteAffineAnimTable}, + [SPECIES_WIGGLYTUFF] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wigglytuff, gDummySpriteAffineAnimTable}, + [SPECIES_ZUBAT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zubat, gDummySpriteAffineAnimTable}, + [SPECIES_GOLBAT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golbat, gDummySpriteAffineAnimTable}, + [SPECIES_ODDISH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Oddish, gDummySpriteAffineAnimTable}, + [SPECIES_GLOOM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gloom, gDummySpriteAffineAnimTable}, + [SPECIES_VILEPLUME] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vileplume, gDummySpriteAffineAnimTable}, + [SPECIES_PARAS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Paras, gDummySpriteAffineAnimTable}, + [SPECIES_PARASECT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Parasect, gDummySpriteAffineAnimTable}, + [SPECIES_VENONAT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venonat, gDummySpriteAffineAnimTable}, + [SPECIES_VENOMOTH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venomoth, gDummySpriteAffineAnimTable}, + [SPECIES_DIGLETT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Diglett, gDummySpriteAffineAnimTable}, + [SPECIES_DUGTRIO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dugtrio, gDummySpriteAffineAnimTable}, + [SPECIES_MEOWTH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meowth, gDummySpriteAffineAnimTable}, + [SPECIES_PERSIAN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Persian, gDummySpriteAffineAnimTable}, + [SPECIES_PSYDUCK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Psyduck, gDummySpriteAffineAnimTable}, + [SPECIES_GOLDUCK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golduck, gDummySpriteAffineAnimTable}, + [SPECIES_MANKEY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mankey, gDummySpriteAffineAnimTable}, + [SPECIES_PRIMEAPE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Primeape, gDummySpriteAffineAnimTable}, + [SPECIES_GROWLITHE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Growlithe, gDummySpriteAffineAnimTable}, + [SPECIES_ARCANINE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Arcanine, gDummySpriteAffineAnimTable}, + [SPECIES_POLIWAG] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwag, gDummySpriteAffineAnimTable}, + [SPECIES_POLIWHIRL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwhirl, gDummySpriteAffineAnimTable}, + [SPECIES_POLIWRATH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poliwrath, gDummySpriteAffineAnimTable}, + [SPECIES_ABRA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Abra, gDummySpriteAffineAnimTable}, + [SPECIES_KADABRA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kadabra, gDummySpriteAffineAnimTable}, + [SPECIES_ALAKAZAM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Alakazam, gDummySpriteAffineAnimTable}, + [SPECIES_MACHOP] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machop, gDummySpriteAffineAnimTable}, + [SPECIES_MACHOKE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machoke, gDummySpriteAffineAnimTable}, + [SPECIES_MACHAMP] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Machamp, gDummySpriteAffineAnimTable}, + [SPECIES_BELLSPROUT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bellsprout, gDummySpriteAffineAnimTable}, + [SPECIES_WEEPINBELL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weepinbell, gDummySpriteAffineAnimTable}, + [SPECIES_VICTREEBEL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Victreebel, gDummySpriteAffineAnimTable}, + [SPECIES_TENTACOOL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tentacool, gDummySpriteAffineAnimTable}, + [SPECIES_TENTACRUEL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tentacruel, gDummySpriteAffineAnimTable}, + [SPECIES_GEODUDE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Geodude, gDummySpriteAffineAnimTable}, + [SPECIES_GRAVELER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Graveler, gDummySpriteAffineAnimTable}, + [SPECIES_GOLEM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Golem, gDummySpriteAffineAnimTable}, + [SPECIES_PONYTA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ponyta, gDummySpriteAffineAnimTable}, + [SPECIES_RAPIDASH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rapidash, gDummySpriteAffineAnimTable}, + [SPECIES_SLOWPOKE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowpoke, gDummySpriteAffineAnimTable}, + [SPECIES_SLOWBRO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowbro, gDummySpriteAffineAnimTable}, + [SPECIES_MAGNEMITE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magnemite, gDummySpriteAffineAnimTable}, + [SPECIES_MAGNETON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magneton, gDummySpriteAffineAnimTable}, + [SPECIES_FARFETCHD] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Farfetchd, gDummySpriteAffineAnimTable}, + [SPECIES_DODUO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Doduo, gDummySpriteAffineAnimTable}, + [SPECIES_DODRIO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dodrio, gDummySpriteAffineAnimTable}, + [SPECIES_SEEL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seel, gDummySpriteAffineAnimTable}, + [SPECIES_DEWGONG] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dewgong, gDummySpriteAffineAnimTable}, + [SPECIES_GRIMER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grimer, gDummySpriteAffineAnimTable}, + [SPECIES_MUK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Muk, gDummySpriteAffineAnimTable}, + [SPECIES_SHELLDER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shellder, gDummySpriteAffineAnimTable}, + [SPECIES_CLOYSTER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cloyster, gDummySpriteAffineAnimTable}, + [SPECIES_GASTLY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gastly, gDummySpriteAffineAnimTable}, + [SPECIES_HAUNTER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Haunter, gDummySpriteAffineAnimTable}, + [SPECIES_GENGAR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gengar, gDummySpriteAffineAnimTable}, + [SPECIES_ONIX] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Onix, gDummySpriteAffineAnimTable}, + [SPECIES_DROWZEE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Drowzee, gDummySpriteAffineAnimTable}, + [SPECIES_HYPNO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hypno, gDummySpriteAffineAnimTable}, + [SPECIES_KRABBY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Krabby, gDummySpriteAffineAnimTable}, + [SPECIES_KINGLER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kingler, gDummySpriteAffineAnimTable}, + [SPECIES_VOLTORB] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Voltorb, gDummySpriteAffineAnimTable}, + [SPECIES_ELECTRODE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electrode, gDummySpriteAffineAnimTable}, + [SPECIES_EXEGGCUTE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exeggcute, gDummySpriteAffineAnimTable}, + [SPECIES_EXEGGUTOR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exeggutor, gDummySpriteAffineAnimTable}, + [SPECIES_CUBONE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cubone, gDummySpriteAffineAnimTable}, + [SPECIES_MAROWAK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marowak, gDummySpriteAffineAnimTable}, + [SPECIES_HITMONLEE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmonlee, gDummySpriteAffineAnimTable}, + [SPECIES_HITMONCHAN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmonchan, gDummySpriteAffineAnimTable}, + [SPECIES_LICKITUNG] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lickitung, gDummySpriteAffineAnimTable}, + [SPECIES_KOFFING] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Koffing, gDummySpriteAffineAnimTable}, + [SPECIES_WEEZING] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Weezing, gDummySpriteAffineAnimTable}, + [SPECIES_RHYHORN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rhyhorn, gDummySpriteAffineAnimTable}, + [SPECIES_RHYDON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rhydon, gDummySpriteAffineAnimTable}, + [SPECIES_CHANSEY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chansey, gDummySpriteAffineAnimTable}, + [SPECIES_TANGELA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tangela, gDummySpriteAffineAnimTable}, + [SPECIES_KANGASKHAN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kangaskhan, gDummySpriteAffineAnimTable}, + [SPECIES_HORSEA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Horsea, gDummySpriteAffineAnimTable}, + [SPECIES_SEADRA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seadra, gDummySpriteAffineAnimTable}, + [SPECIES_GOLDEEN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Goldeen, gDummySpriteAffineAnimTable}, + [SPECIES_SEAKING] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seaking, gDummySpriteAffineAnimTable}, + [SPECIES_STARYU] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Staryu, gDummySpriteAffineAnimTable}, + [SPECIES_STARMIE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Starmie, gDummySpriteAffineAnimTable}, + [SPECIES_MR_MIME] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mr_Mime, gDummySpriteAffineAnimTable}, + [SPECIES_SCYTHER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Scyther, gDummySpriteAffineAnimTable}, + [SPECIES_JYNX] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jynx, gDummySpriteAffineAnimTable}, + [SPECIES_ELECTABUZZ] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electabuzz, gDummySpriteAffineAnimTable}, + [SPECIES_MAGMAR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magmar, gDummySpriteAffineAnimTable}, + [SPECIES_PINSIR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pinsir, gDummySpriteAffineAnimTable}, + [SPECIES_TAUROS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tauros, gDummySpriteAffineAnimTable}, + [SPECIES_MAGIKARP] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magikarp, gDummySpriteAffineAnimTable}, + [SPECIES_GYARADOS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gyarados, gDummySpriteAffineAnimTable}, + [SPECIES_LAPRAS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lapras, gDummySpriteAffineAnimTable}, + [SPECIES_DITTO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ditto, gDummySpriteAffineAnimTable}, + [SPECIES_EEVEE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Eevee, gDummySpriteAffineAnimTable}, + [SPECIES_VAPOREON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vaporeon, gDummySpriteAffineAnimTable}, + [SPECIES_JOLTEON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jolteon, gDummySpriteAffineAnimTable}, + [SPECIES_FLAREON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flareon, gDummySpriteAffineAnimTable}, + [SPECIES_PORYGON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Porygon, gDummySpriteAffineAnimTable}, + [SPECIES_OMANYTE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Omanyte, gDummySpriteAffineAnimTable}, + [SPECIES_OMASTAR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Omastar, gDummySpriteAffineAnimTable}, + [SPECIES_KABUTO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kabuto, gDummySpriteAffineAnimTable}, + [SPECIES_KABUTOPS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kabutops, gDummySpriteAffineAnimTable}, + [SPECIES_AERODACTYL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aerodactyl, gDummySpriteAffineAnimTable}, + [SPECIES_SNORLAX] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snorlax, gDummySpriteAffineAnimTable}, + [SPECIES_ARTICUNO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Articuno, gDummySpriteAffineAnimTable}, + [SPECIES_ZAPDOS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zapdos, gDummySpriteAffineAnimTable}, + [SPECIES_MOLTRES] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Moltres, gDummySpriteAffineAnimTable}, + [SPECIES_DRATINI] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dratini, gDummySpriteAffineAnimTable}, + [SPECIES_DRAGONAIR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dragonair, gDummySpriteAffineAnimTable}, + [SPECIES_DRAGONITE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dragonite, gDummySpriteAffineAnimTable}, + [SPECIES_MEWTWO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mewtwo, gDummySpriteAffineAnimTable}, + [SPECIES_MEW] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mew, gDummySpriteAffineAnimTable}, + [SPECIES_CHIKORITA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chikorita, gDummySpriteAffineAnimTable}, + [SPECIES_BAYLEEF] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bayleef, gDummySpriteAffineAnimTable}, + [SPECIES_MEGANIUM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meganium, gDummySpriteAffineAnimTable}, + [SPECIES_CYNDAQUIL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cyndaquil, gDummySpriteAffineAnimTable}, + [SPECIES_QUILAVA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Quilava, gDummySpriteAffineAnimTable}, + [SPECIES_TYPHLOSION] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Typhlosion, gDummySpriteAffineAnimTable}, + [SPECIES_TOTODILE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Totodile, gDummySpriteAffineAnimTable}, + [SPECIES_CROCONAW] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Croconaw, gDummySpriteAffineAnimTable}, + [SPECIES_FERALIGATR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Feraligatr, gDummySpriteAffineAnimTable}, + [SPECIES_SENTRET] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sentret, gDummySpriteAffineAnimTable}, + [SPECIES_FURRET] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Furret, gDummySpriteAffineAnimTable}, + [SPECIES_HOOTHOOT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hoothoot, gDummySpriteAffineAnimTable}, + [SPECIES_NOCTOWL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Noctowl, gDummySpriteAffineAnimTable}, + [SPECIES_LEDYBA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ledyba, gDummySpriteAffineAnimTable}, + [SPECIES_LEDIAN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ledian, gDummySpriteAffineAnimTable}, + [SPECIES_SPINARAK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spinarak, gDummySpriteAffineAnimTable}, + [SPECIES_ARIADOS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ariados, gDummySpriteAffineAnimTable}, + [SPECIES_CROBAT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Crobat, gDummySpriteAffineAnimTable}, + [SPECIES_CHINCHOU] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chinchou, gDummySpriteAffineAnimTable}, + [SPECIES_LANTURN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lanturn, gDummySpriteAffineAnimTable}, + [SPECIES_PICHU] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pichu, gDummySpriteAffineAnimTable}, + [SPECIES_CLEFFA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cleffa, gDummySpriteAffineAnimTable}, + [SPECIES_IGGLYBUFF] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Igglybuff, gDummySpriteAffineAnimTable}, + [SPECIES_TOGEPI] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togepi, gDummySpriteAffineAnimTable}, + [SPECIES_TOGETIC] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togetic, gDummySpriteAffineAnimTable}, + [SPECIES_NATU] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Natu, gDummySpriteAffineAnimTable}, + [SPECIES_XATU] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Xatu, gDummySpriteAffineAnimTable}, + [SPECIES_MAREEP] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mareep, gDummySpriteAffineAnimTable}, + [SPECIES_FLAAFFY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flaaffy, gDummySpriteAffineAnimTable}, + [SPECIES_AMPHAROS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ampharos, gDummySpriteAffineAnimTable}, + [SPECIES_BELLOSSOM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bellossom, gDummySpriteAffineAnimTable}, + [SPECIES_MARILL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marill, gDummySpriteAffineAnimTable}, + [SPECIES_AZUMARILL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Azumarill, gDummySpriteAffineAnimTable}, + [SPECIES_SUDOWOODO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sudowoodo, gDummySpriteAffineAnimTable}, + [SPECIES_POLITOED] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Politoed, gDummySpriteAffineAnimTable}, + [SPECIES_HOPPIP] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hoppip, gDummySpriteAffineAnimTable}, + [SPECIES_SKIPLOOM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skiploom, gDummySpriteAffineAnimTable}, + [SPECIES_JUMPLUFF] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jumpluff, gDummySpriteAffineAnimTable}, + [SPECIES_AIPOM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aipom, gDummySpriteAffineAnimTable}, + [SPECIES_SUNKERN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sunkern, gDummySpriteAffineAnimTable}, + [SPECIES_SUNFLORA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sunflora, gDummySpriteAffineAnimTable}, + [SPECIES_YANMA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Yanma, gDummySpriteAffineAnimTable}, + [SPECIES_WOOPER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wooper, gDummySpriteAffineAnimTable}, + [SPECIES_QUAGSIRE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Quagsire, gDummySpriteAffineAnimTable}, + [SPECIES_ESPEON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Espeon, gDummySpriteAffineAnimTable}, + [SPECIES_UMBREON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Umbreon, gDummySpriteAffineAnimTable}, + [SPECIES_MURKROW] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Murkrow, gDummySpriteAffineAnimTable}, + [SPECIES_SLOWKING] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slowking, gDummySpriteAffineAnimTable}, + [SPECIES_MISDREAVUS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Misdreavus, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_A, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_B] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_B, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_C] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_C, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_D] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_D, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_E] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_E, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_F] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_F, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_G] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_G, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_H] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_H, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_I] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_I, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_J] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_J, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_K] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_K, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_L] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_L, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_M] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_M, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_N] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_N, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_O] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_O, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_P] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_P, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_Q] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Q, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_R] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_R, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_S] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_S, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_T] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_T, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_U] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_U, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_V] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_V, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_W] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_W, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_X] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_X, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_Y] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Y, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_Z] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Z, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_EMARK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Exclamation, gDummySpriteAffineAnimTable}, + [SPECIES_UNOWN_QMARK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Unown_Question, gDummySpriteAffineAnimTable}, + [SPECIES_WOBBUFFET] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wobbuffet, gDummySpriteAffineAnimTable}, + [SPECIES_GIRAFARIG] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Girafarig, gDummySpriteAffineAnimTable}, + [SPECIES_PINECO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pineco, gDummySpriteAffineAnimTable}, + [SPECIES_FORRETRESS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Forretress, gDummySpriteAffineAnimTable}, + [SPECIES_DUNSPARCE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dunsparce, gDummySpriteAffineAnimTable}, + [SPECIES_GLIGAR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gligar, gDummySpriteAffineAnimTable}, + [SPECIES_STEELIX] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Steelix, gDummySpriteAffineAnimTable}, + [SPECIES_SNUBBULL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snubbull, gDummySpriteAffineAnimTable}, + [SPECIES_GRANBULL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Granbull, gDummySpriteAffineAnimTable}, + [SPECIES_QWILFISH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Qwilfish, gDummySpriteAffineAnimTable}, + [SPECIES_SCIZOR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Scizor, gDummySpriteAffineAnimTable}, + [SPECIES_SHUCKLE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shuckle, gDummySpriteAffineAnimTable}, + [SPECIES_HERACROSS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Heracross, gDummySpriteAffineAnimTable}, + [SPECIES_SNEASEL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sneasel, gDummySpriteAffineAnimTable}, + [SPECIES_TEDDIURSA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Teddiursa, gDummySpriteAffineAnimTable}, + [SPECIES_URSARING] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ursaring, gDummySpriteAffineAnimTable}, + [SPECIES_SLUGMA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slugma, gDummySpriteAffineAnimTable}, + [SPECIES_MAGCARGO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magcargo, gDummySpriteAffineAnimTable}, + [SPECIES_SWINUB] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swinub, gDummySpriteAffineAnimTable}, + [SPECIES_PILOSWINE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Piloswine, gDummySpriteAffineAnimTable}, + [SPECIES_CORSOLA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Corsola, gDummySpriteAffineAnimTable}, + [SPECIES_REMORAID] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Remoraid, gDummySpriteAffineAnimTable}, + [SPECIES_OCTILLERY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Octillery, gDummySpriteAffineAnimTable}, + [SPECIES_DELIBIRD] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Delibird, gDummySpriteAffineAnimTable}, + [SPECIES_MANTINE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mantine, gDummySpriteAffineAnimTable}, + [SPECIES_SKARMORY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skarmory, gDummySpriteAffineAnimTable}, + [SPECIES_HOUNDOUR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Houndour, gDummySpriteAffineAnimTable}, + [SPECIES_HOUNDOOM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Houndoom, gDummySpriteAffineAnimTable}, + [SPECIES_KINGDRA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kingdra, gDummySpriteAffineAnimTable}, + [SPECIES_PHANPY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Phanpy, gDummySpriteAffineAnimTable}, + [SPECIES_DONPHAN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Donphan, gDummySpriteAffineAnimTable}, + [SPECIES_PORYGON2] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Porygon2, gDummySpriteAffineAnimTable}, + [SPECIES_STANTLER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Stantler, gDummySpriteAffineAnimTable}, + [SPECIES_SMEARGLE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Smeargle, gDummySpriteAffineAnimTable}, + [SPECIES_TYROGUE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tyrogue, gDummySpriteAffineAnimTable}, + [SPECIES_HITMONTOP] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hitmontop, gDummySpriteAffineAnimTable}, + [SPECIES_SMOOCHUM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Smoochum, gDummySpriteAffineAnimTable}, + [SPECIES_ELEKID] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Elekid, gDummySpriteAffineAnimTable}, + [SPECIES_MAGBY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Magby, gDummySpriteAffineAnimTable}, + [SPECIES_MILTANK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Miltank, gDummySpriteAffineAnimTable}, + [SPECIES_BLISSEY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blissey, gDummySpriteAffineAnimTable}, + [SPECIES_RAIKOU] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Raikou, gDummySpriteAffineAnimTable}, + [SPECIES_ENTEI] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Entei, gDummySpriteAffineAnimTable}, + [SPECIES_SUICUNE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Suicune, gDummySpriteAffineAnimTable}, + [SPECIES_LARVITAR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Larvitar, gDummySpriteAffineAnimTable}, + [SPECIES_PUPITAR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pupitar, gDummySpriteAffineAnimTable}, + [SPECIES_TYRANITAR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tyranitar, gDummySpriteAffineAnimTable}, + [SPECIES_LUGIA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lugia, gDummySpriteAffineAnimTable}, + [SPECIES_HO_OH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ho_oh, gDummySpriteAffineAnimTable}, + [SPECIES_CELEBI] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Celebi, gDummySpriteAffineAnimTable}, + [SPECIES_TREECKO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Treecko, gDummySpriteAffineAnimTable}, + [SPECIES_GROVYLE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grovyle, gDummySpriteAffineAnimTable}, + [SPECIES_SCEPTILE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sceptile, gDummySpriteAffineAnimTable}, + [SPECIES_TORCHIC] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Torchic, gDummySpriteAffineAnimTable}, + [SPECIES_COMBUSKEN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Combusken, gDummySpriteAffineAnimTable}, + [SPECIES_BLAZIKEN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Blaziken, gDummySpriteAffineAnimTable}, + [SPECIES_MUDKIP] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mudkip, gDummySpriteAffineAnimTable}, + [SPECIES_MARSHTOMP] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Marshtomp, gDummySpriteAffineAnimTable}, + [SPECIES_SWAMPERT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swampert, gDummySpriteAffineAnimTable}, + [SPECIES_POOCHYENA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Poochyena, gDummySpriteAffineAnimTable}, + [SPECIES_MIGHTYENA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mightyena, gDummySpriteAffineAnimTable}, + [SPECIES_ZIGZAGOON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zigzagoon, gDummySpriteAffineAnimTable}, + [SPECIES_LINOONE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Linoone, gDummySpriteAffineAnimTable}, + [SPECIES_WURMPLE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wurmple, gDummySpriteAffineAnimTable}, + [SPECIES_SILCOON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Silcoon, gDummySpriteAffineAnimTable}, + [SPECIES_BEAUTIFLY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beautifly, gDummySpriteAffineAnimTable}, + [SPECIES_CASCOON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cascoon, gDummySpriteAffineAnimTable}, + [SPECIES_DUSTOX] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dustox, gDummySpriteAffineAnimTable}, + [SPECIES_LOTAD] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lotad, gDummySpriteAffineAnimTable}, + [SPECIES_LOMBRE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lombre, gDummySpriteAffineAnimTable}, + [SPECIES_LUDICOLO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ludicolo, gDummySpriteAffineAnimTable}, + [SPECIES_SEEDOT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seedot, gDummySpriteAffineAnimTable}, + [SPECIES_NUZLEAF] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nuzleaf, gDummySpriteAffineAnimTable}, + [SPECIES_SHIFTRY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shiftry, gDummySpriteAffineAnimTable}, + [SPECIES_TAILLOW] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Taillow, gDummySpriteAffineAnimTable}, + [SPECIES_SWELLOW] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swellow, gDummySpriteAffineAnimTable}, + [SPECIES_WINGULL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wingull, gDummySpriteAffineAnimTable}, + [SPECIES_PELIPPER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Pelipper, gDummySpriteAffineAnimTable}, + [SPECIES_RALTS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ralts, gDummySpriteAffineAnimTable}, + [SPECIES_KIRLIA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kirlia, gDummySpriteAffineAnimTable}, + [SPECIES_GARDEVOIR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gardevoir, gDummySpriteAffineAnimTable}, + [SPECIES_SURSKIT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Surskit, gDummySpriteAffineAnimTable}, + [SPECIES_MASQUERAIN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Masquerain, gDummySpriteAffineAnimTable}, + [SPECIES_SHROOMISH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shroomish, gDummySpriteAffineAnimTable}, + [SPECIES_BRELOOM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Breloom, gDummySpriteAffineAnimTable}, + [SPECIES_SLAKOTH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slakoth, gDummySpriteAffineAnimTable}, + [SPECIES_VIGOROTH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vigoroth, gDummySpriteAffineAnimTable}, + [SPECIES_SLAKING] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Slaking, gDummySpriteAffineAnimTable}, + [SPECIES_NINCADA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nincada, gDummySpriteAffineAnimTable}, + [SPECIES_NINJASK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ninjask, gDummySpriteAffineAnimTable}, + [SPECIES_SHEDINJA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shedinja, gDummySpriteAffineAnimTable}, + [SPECIES_WHISMUR] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Whismur, gDummySpriteAffineAnimTable}, + [SPECIES_LOUDRED] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Loudred, gDummySpriteAffineAnimTable}, + [SPECIES_EXPLOUD] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Exploud, gDummySpriteAffineAnimTable}, + [SPECIES_MAKUHITA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Makuhita, gDummySpriteAffineAnimTable}, + [SPECIES_HARIYAMA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Hariyama, gDummySpriteAffineAnimTable}, + [SPECIES_AZURILL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Azurill, gDummySpriteAffineAnimTable}, + [SPECIES_NOSEPASS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Nosepass, gDummySpriteAffineAnimTable}, + [SPECIES_SKITTY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Skitty, gDummySpriteAffineAnimTable}, + [SPECIES_DELCATTY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Delcatty, gDummySpriteAffineAnimTable}, + [SPECIES_SABLEYE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sableye, gDummySpriteAffineAnimTable}, + [SPECIES_MAWILE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Mawile, gDummySpriteAffineAnimTable}, + [SPECIES_ARON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aron, gDummySpriteAffineAnimTable}, + [SPECIES_LAIRON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lairon, gDummySpriteAffineAnimTable}, + [SPECIES_AGGRON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Aggron, gDummySpriteAffineAnimTable}, + [SPECIES_MEDITITE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Meditite, gDummySpriteAffineAnimTable}, + [SPECIES_MEDICHAM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Medicham, gDummySpriteAffineAnimTable}, + [SPECIES_ELECTRIKE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Electrike, gDummySpriteAffineAnimTable}, + [SPECIES_MANECTRIC] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Manectric, gDummySpriteAffineAnimTable}, + [SPECIES_PLUSLE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Plusle, gDummySpriteAffineAnimTable}, + [SPECIES_MINUN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Minun, gDummySpriteAffineAnimTable}, + [SPECIES_VOLBEAT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Volbeat, gDummySpriteAffineAnimTable}, + [SPECIES_ILLUMISE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Illumise, gDummySpriteAffineAnimTable}, + [SPECIES_ROSELIA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Roselia, gDummySpriteAffineAnimTable}, + [SPECIES_GULPIN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gulpin, gDummySpriteAffineAnimTable}, + [SPECIES_SWALOT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swalot, gDummySpriteAffineAnimTable}, + [SPECIES_CARVANHA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Carvanha, gDummySpriteAffineAnimTable}, + [SPECIES_SHARPEDO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sharpedo, gDummySpriteAffineAnimTable}, + [SPECIES_WAILMER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wailmer, gDummySpriteAffineAnimTable}, + [SPECIES_WAILORD] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wailord, gDummySpriteAffineAnimTable}, + [SPECIES_NUMEL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Numel, gDummySpriteAffineAnimTable}, + [SPECIES_CAMERUPT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Camerupt, gDummySpriteAffineAnimTable}, + [SPECIES_TORKOAL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Torkoal, gDummySpriteAffineAnimTable}, + [SPECIES_SPOINK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spoink, gDummySpriteAffineAnimTable}, + [SPECIES_GRUMPIG] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Grumpig, gDummySpriteAffineAnimTable}, + [SPECIES_SPINDA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spinda, gDummySpriteAffineAnimTable}, + [SPECIES_TRAPINCH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Trapinch, gDummySpriteAffineAnimTable}, + [SPECIES_VIBRAVA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Vibrava, gDummySpriteAffineAnimTable}, + [SPECIES_FLYGON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Flygon, gDummySpriteAffineAnimTable}, + [SPECIES_CACNEA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cacnea, gDummySpriteAffineAnimTable}, + [SPECIES_CACTURNE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cacturne, gDummySpriteAffineAnimTable}, + [SPECIES_SWABLU] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Swablu, gDummySpriteAffineAnimTable}, + [SPECIES_ALTARIA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Altaria, gDummySpriteAffineAnimTable}, + [SPECIES_ZANGOOSE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Zangoose, gDummySpriteAffineAnimTable}, + [SPECIES_SEVIPER] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Seviper, gDummySpriteAffineAnimTable}, + [SPECIES_LUNATONE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lunatone, gDummySpriteAffineAnimTable}, + [SPECIES_SOLROCK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Solrock, gDummySpriteAffineAnimTable}, + [SPECIES_BARBOACH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Barboach, gDummySpriteAffineAnimTable}, + [SPECIES_WHISCASH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Whiscash, gDummySpriteAffineAnimTable}, + [SPECIES_CORPHISH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Corphish, gDummySpriteAffineAnimTable}, + [SPECIES_CRAWDAUNT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Crawdaunt, gDummySpriteAffineAnimTable}, + [SPECIES_BALTOY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Baltoy, gDummySpriteAffineAnimTable}, + [SPECIES_CLAYDOL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Claydol, gDummySpriteAffineAnimTable}, + [SPECIES_LILEEP] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Lileep, gDummySpriteAffineAnimTable}, + [SPECIES_CRADILY] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Cradily, gDummySpriteAffineAnimTable}, + [SPECIES_ANORITH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BUG, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Anorith, gDummySpriteAffineAnimTable}, + [SPECIES_ARMALDO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Armaldo, gDummySpriteAffineAnimTable}, + [SPECIES_FEEBAS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Feebas, gDummySpriteAffineAnimTable}, + [SPECIES_MILOTIC] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Milotic, gDummySpriteAffineAnimTable}, + [SPECIES_CASTFORM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Castform, gDummySpriteAffineAnimTable}, + [SPECIES_KECLEON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kecleon, gDummySpriteAffineAnimTable}, + [SPECIES_SHUPPET] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shuppet, gDummySpriteAffineAnimTable}, + [SPECIES_BANETTE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Banette, gDummySpriteAffineAnimTable}, + [SPECIES_DUSKULL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Duskull, gDummySpriteAffineAnimTable}, + [SPECIES_DUSCLOPS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Dusclops, gDummySpriteAffineAnimTable}, + [SPECIES_TROPIUS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Tropius, gDummySpriteAffineAnimTable}, + [SPECIES_CHIMECHO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Chimecho, gDummySpriteAffineAnimTable}, + [SPECIES_ABSOL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Absol, gDummySpriteAffineAnimTable}, + [SPECIES_WYNAUT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Wynaut, gDummySpriteAffineAnimTable}, + [SPECIES_SNORUNT] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Snorunt, gDummySpriteAffineAnimTable}, + [SPECIES_GLALIE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Glalie, gDummySpriteAffineAnimTable}, + [SPECIES_SPHEAL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Spheal, gDummySpriteAffineAnimTable}, + [SPECIES_SEALEO] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Sealeo, gDummySpriteAffineAnimTable}, + [SPECIES_WALREIN] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Walrein, gDummySpriteAffineAnimTable}, + [SPECIES_CLAMPERL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Clamperl, gDummySpriteAffineAnimTable}, + [SPECIES_HUNTAIL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Huntail, gDummySpriteAffineAnimTable}, + [SPECIES_GOREBYSS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Gorebyss, gDummySpriteAffineAnimTable}, + [SPECIES_RELICANTH] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Relicanth, gDummySpriteAffineAnimTable}, + [SPECIES_LUVDISC] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Luvdisc, gDummySpriteAffineAnimTable}, + [SPECIES_BAGON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bagon, gDummySpriteAffineAnimTable}, + [SPECIES_SHELGON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shelgon, gDummySpriteAffineAnimTable}, + [SPECIES_SALAMENCE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Salamence, gDummySpriteAffineAnimTable}, + [SPECIES_BELDUM] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Beldum, gDummySpriteAffineAnimTable}, + [SPECIES_METANG] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metang, gDummySpriteAffineAnimTable}, + [SPECIES_METAGROSS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Metagross, gDummySpriteAffineAnimTable}, + [SPECIES_REGIROCK] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Regirock, gDummySpriteAffineAnimTable}, + [SPECIES_REGICE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Regice, gDummySpriteAffineAnimTable}, + [SPECIES_REGISTEEL] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Registeel, gDummySpriteAffineAnimTable}, + [SPECIES_LATIAS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Latias, gDummySpriteAffineAnimTable}, + [SPECIES_LATIOS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Latios, gDummySpriteAffineAnimTable}, + [SPECIES_KYOGRE] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kyogre, gDummySpriteAffineAnimTable}, + [SPECIES_GROUDON] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Groudon, gDummySpriteAffineAnimTable}, + [SPECIES_RAYQUAZA] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Rayquaza, gDummySpriteAffineAnimTable}, + [SPECIES_JIRACHI] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Jirachi, gDummySpriteAffineAnimTable}, + [SPECIES_DEOXYS] = {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Deoxys, gDummySpriteAffineAnimTable}, }; // Normal, sunny, rainy, snowy -const struct ObjectEventGraphicsInfo gCastformObjectGraphics[] = { - {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Castform, gDummySpriteAffineAnimTable}, - {0xFFFF, OBJ_EVENT_PAL_TAG_CASTFORM_SUNNY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSunny, gDummySpriteAffineAnimTable}, - {0xFFFF, OBJ_EVENT_PAL_TAG_CASTFORM_RAINY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformRainy, gDummySpriteAffineAnimTable}, - {0xFFFF, OBJ_EVENT_PAL_TAG_CASTFORM_SNOWY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSnowy, gDummySpriteAffineAnimTable}, +const struct ObjectEventGraphicsInfo gCastformObjectGraphics[] = +{ + {TAG_NONE, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Castform, gDummySpriteAffineAnimTable}, + {TAG_NONE, OBJ_EVENT_PAL_TAG_CASTFORM_SUNNY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSunny, gDummySpriteAffineAnimTable}, + {TAG_NONE, OBJ_EVENT_PAL_TAG_CASTFORM_RAINY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformRainy, gDummySpriteAffineAnimTable}, + {TAG_NONE, OBJ_EVENT_PAL_TAG_CASTFORM_SNOWY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSnowy, gDummySpriteAffineAnimTable}, }; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 6d498aee5f..a323d0ae12 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1491,50 +1491,54 @@ static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEven return objectEventId; } -static u8 -TrySpawnObjectEventTemplate(const struct ObjectEventTemplate *objectEventTemplate, - u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) { - u8 objectEventId; - struct SpriteTemplate spriteTemplate; - struct SpriteFrameImage spriteFrameImage; - const struct ObjectEventGraphicsInfo *graphicsInfo; - const struct SubspriteTable *subspriteTables = NULL; +static u8 TrySpawnObjectEventTemplate(const struct ObjectEventTemplate *objectEventTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) +{ + u8 objectEventId; + struct SpriteTemplate spriteTemplate; + struct SpriteFrameImage spriteFrameImage; + const struct ObjectEventGraphicsInfo *graphicsInfo; + const struct SubspriteTable *subspriteTables = NULL; - graphicsInfo = GetObjectEventGraphicsInfo(objectEventTemplate->graphicsId); - MakeSpriteTemplateFromObjectEventTemplate(objectEventTemplate, &spriteTemplate, &subspriteTables); - spriteFrameImage.size = graphicsInfo->size; - spriteTemplate.images = &spriteFrameImage; - objectEventId = TrySetupObjectEventSprite(objectEventTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY); - if (objectEventId == OBJECT_EVENTS_COUNT) - return OBJECT_EVENTS_COUNT; + graphicsInfo = GetObjectEventGraphicsInfo(objectEventTemplate->graphicsId); + MakeSpriteTemplateFromObjectEventTemplate(objectEventTemplate, &spriteTemplate, &subspriteTables); + spriteFrameImage.size = graphicsInfo->size; + spriteTemplate.images = &spriteFrameImage; + objectEventId = TrySetupObjectEventSprite(objectEventTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY); + if (objectEventId == OBJECT_EVENTS_COUNT) + return OBJECT_EVENTS_COUNT; - gSprites[gObjectEvents[objectEventId].spriteId].images = graphicsInfo->images; - if (subspriteTables) - SetSubspriteTables(&gSprites[gObjectEvents[objectEventId].spriteId], subspriteTables); + gSprites[gObjectEvents[objectEventId].spriteId].images = graphicsInfo->images; + if (subspriteTables) + SetSubspriteTables(&gSprites[gObjectEvents[objectEventId].spriteId], subspriteTables); - // Set species based on script header - if (objectEventTemplate->graphicsId == OBJ_EVENT_GFX_OW_MON && objectEventTemplate->script) { - const u8 *script = objectEventTemplate->script; - if (script[0] == 0x7d) { // bufferspeciesname - u16 species; - u8 form; - bool8 shiny; - gObjectEvents[objectEventId].extra.asU16 = script[2] | script[3] << 8; - species = gObjectEvents[objectEventId].extra.mon.species; - form = gObjectEvents[objectEventId].extra.mon.form; - shiny = gObjectEvents[objectEventId].extra.mon.shiny; - FollowerSetGraphics(&gObjectEvents[objectEventId], species, form, shiny); + // Set species based on script header + if (objectEventTemplate->graphicsId == OBJ_EVENT_GFX_OW_MON && objectEventTemplate->script) + { + const u8 *script = objectEventTemplate->script; + if (script[0] == 0x7d) // bufferspeciesname + { + u16 species; + u8 form; + bool8 shiny; + gObjectEvents[objectEventId].extra.asU16 = script[2] | script[3] << 8; + species = gObjectEvents[objectEventId].extra.mon.species; + form = gObjectEvents[objectEventId].extra.mon.form; + shiny = gObjectEvents[objectEventId].extra.mon.shiny; + FollowerSetGraphics(&gObjectEvents[objectEventId], species, form, shiny); + } + // Set runtime species based on VAR_TEMP_4, if template has a dynamic graphics ID + } + else if (objectEventTemplate->graphicsId >= OBJ_EVENT_GFX_VARS + && VarGetObjectEventGraphicsId(objectEventTemplate->graphicsId - OBJ_EVENT_GFX_VARS) == OBJ_EVENT_GFX_OW_MON) + { + gObjectEvents[objectEventId].extra.asU16 = VarGet(VAR_TEMP_4); + FollowerSetGraphics(&gObjectEvents[objectEventId], + gObjectEvents[objectEventId].extra.mon.species, + gObjectEvents[objectEventId].extra.mon.form, + gObjectEvents[objectEventId].extra.mon.form); } - // Set runtime species based on VAR_TEMP_4, if template has a dynamic graphics ID - } else if (objectEventTemplate->graphicsId >= OBJ_EVENT_GFX_VARS && VarGetObjectEventGraphicsId(objectEventTemplate->graphicsId - OBJ_EVENT_GFX_VARS) == OBJ_EVENT_GFX_OW_MON) { - gObjectEvents[objectEventId].extra.asU16 = VarGet(VAR_TEMP_4); - FollowerSetGraphics(&gObjectEvents[objectEventId], - gObjectEvents[objectEventId].extra.mon.species, - gObjectEvents[objectEventId].extra.mon.form, - gObjectEvents[objectEventId].extra.mon.form); - } - return objectEventId; + return objectEventId; } u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *objectEventTemplate) @@ -1697,39 +1701,44 @@ u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevatio } struct Pokemon * GetFirstLiveMon(void) { // Return address of first conscious party mon or NULL - u8 i; - for (i=0; i 0 && !(gPlayerParty[i].box.isEgg || gPlayerParty[i].box.isBadEgg)) - return &gPlayerParty[i]; - } - return NULL; + u8 i; + for (i=0; i 0 && !(gPlayerParty[i].box.isEgg || gPlayerParty[i].box.isBadEgg)) + return &gPlayerParty[i]; + } + return NULL; } -struct ObjectEvent * GetFollowerObject(void) { // Return follower ObjectEvent or NULL - u8 i; - for (i=0; i < OBJECT_EVENTS_COUNT; i++) { - if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && gObjectEvents[i].active) - return &gObjectEvents[i]; - } - return NULL; +// Return follower ObjectEvent or NULL +struct ObjectEvent * GetFollowerObject(void) +{ + u8 i; + for (i=0; i < OBJECT_EVENTS_COUNT; i++) + { + if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && gObjectEvents[i].active) + return &gObjectEvents[i]; + } + return NULL; } // Return graphicsInfo for a pokemon species & form -static const struct ObjectEventGraphicsInfo * SpeciesToGraphicsInfo(u16 species, u8 form) { - const struct ObjectEventGraphicsInfo *graphicsInfo; - switch (species) { +static const struct ObjectEventGraphicsInfo * SpeciesToGraphicsInfo(u16 species, u8 form) +{ + const struct ObjectEventGraphicsInfo *graphicsInfo; + switch (species) + { case SPECIES_UNOWN: // Letters >A are defined as species >= NUM_SPECIES, so are not contiguous with A - form %= NUM_UNOWN_FORMS; - graphicsInfo = &gPokemonObjectGraphics[form ? SPECIES_UNOWN_B + form - 1 : species]; - break; + form %= NUM_UNOWN_FORMS; + graphicsInfo = &gPokemonObjectGraphics[form ? SPECIES_UNOWN_B + form - 1 : species]; + break; case SPECIES_CASTFORM: // Sunny, rainy, snowy forms stored separately - graphicsInfo = &gCastformObjectGraphics[form % NUM_CASTFORM_FORMS]; - break; + graphicsInfo = &gCastformObjectGraphics[form % NUM_CASTFORM_FORMS]; + break; default: - graphicsInfo = &gPokemonObjectGraphics[species]; - break; - } - return graphicsInfo->tileTag == 0xFFFF ? graphicsInfo : &gPokemonObjectGraphics[SPECIES_PORYGON]; // avoid OOB access + graphicsInfo = &gPokemonObjectGraphics[species]; + break; + } + return graphicsInfo->tileTag == 0xFFFF ? graphicsInfo : &gPokemonObjectGraphics[SPECIES_PORYGON]; // avoid OOB access } // Find, or load, the palette for the specified pokemon info @@ -1738,33 +1747,42 @@ static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool8 shiny) { // Note that the shiny palette tag is `species + SPECIES_SHINY_TAG`, which must be increased with more pokemon // so that palette tags do not overlap const struct CompressedSpritePalette *spritePalette = &(shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species]; - if ((paletteNum = IndexOfSpritePaletteTag(spritePalette->tag)) == 0xFF) { // Load compressed palette - LoadCompressedSpritePalette(spritePalette); - paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present - if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog - UpdateSpritePaletteWithWeather(paletteNum); + if ((paletteNum = IndexOfSpritePaletteTag(spritePalette->tag)) == 0xFF) + { + // Load compressed palette + LoadCompressedSpritePalette(spritePalette); + paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present + if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog + UpdateSpritePaletteWithWeather(paletteNum); } return paletteNum; } // Set graphics & sprite for a follower object event by species & shininess. -static void FollowerSetGraphics(struct ObjectEvent *objEvent, u16 species, u8 form, bool8 shiny) { - const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); - objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; - ObjectEventSetGraphics(objEvent, graphicsInfo); - objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; - objEvent->extra.mon.species = species; - objEvent->extra.mon.form = form; - objEvent->extra.mon.shiny = shiny; - if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { // Use palette from species palette table - struct Sprite *sprite = &gSprites[objEvent->spriteId]; - // Free palette if otherwise unused - sprite->inUse = FALSE; - FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); - sprite->inUse = TRUE; - sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny); - } else if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog - UpdateSpritePaletteWithWeather(gSprites[objEvent->spriteId].oam.paletteNum); +static void FollowerSetGraphics(struct ObjectEvent *objEvent, u16 species, u8 form, bool8 shiny) +{ + const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); + objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; + ObjectEventSetGraphics(objEvent, graphicsInfo); + objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; + objEvent->extra.mon.species = species; + objEvent->extra.mon.form = form; + objEvent->extra.mon.shiny = shiny; + if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) + { + // Use palette from species palette table + struct Sprite *sprite = &gSprites[objEvent->spriteId]; + // Free palette if otherwise unused + sprite->inUse = FALSE; + FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); + sprite->inUse = TRUE; + sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny); + } + else if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) + { + // don't want to weather blend in fog + UpdateSpritePaletteWithWeather(gSprites[objEvent->spriteId].oam.paletteNum); + } } // Like FollowerSetGraphics, but does not reposition sprite; intended to be used for mid-movement form changes, etc. @@ -1786,20 +1804,24 @@ static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) { sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { + if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) + { sprite->inUse = FALSE; FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); sprite->inUse = TRUE; sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny); - } else if (i != 0xFF) { + } + else if (i != 0xFF) + { UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog - UpdateSpritePaletteWithWeather(sprite->oam.paletteNum); + UpdateSpritePaletteWithWeather(sprite->oam.paletteNum); } } // Like CastformDataTypeChange, but for overworld weather -static u8 GetOverworldCastformForm(void) { +static u8 GetOverworldCastformForm(void) +{ switch (GetCurrentWeather()) { case WEATHER_SUNNY_CLOUDS: @@ -1816,7 +1838,8 @@ static u8 GetOverworldCastformForm(void) { } // Retrieve graphic information about the following pokemon, if any -static bool8 GetFollowerInfo(u16 *species, u8 *form, u8 *shiny) { +static bool8 GetFollowerInfo(u16 *species, u8 *form, u8 *shiny) +{ struct Pokemon *mon = GetFirstLiveMon(); if (!mon) { *species = SPECIES_NONE; @@ -1839,136 +1862,178 @@ static bool8 GetFollowerInfo(u16 *species, u8 *form, u8 *shiny) { return TRUE; } -void UpdateFollowingPokemon(void) { // Update following pokemon if any - struct ObjectEvent *objEvent = GetFollowerObject(); - struct Sprite *sprite; - u16 species; - bool8 shiny; - u8 form; - // Avoid spawning large (>32x32) follower pokemon inside buildings - if (GetFollowerInfo(&species, &form, &shiny) && !(gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, 0)->height > 32) && !FlagGet(FLAG_TEMP_HIDE_FOLLOWER)) { - if (objEvent == NULL) { // Spawn follower - struct ObjectEventTemplate template = { - .localId = OBJ_EVENT_ID_FOLLOWER, - .graphicsId = OBJ_EVENT_GFX_OW_MON, - .flagId = 0, - .x = gSaveBlock1Ptr->pos.x, - .y = gSaveBlock1Ptr->pos.y, - // If player active, copy player elevation - .elevation = gObjectEvents[gPlayerAvatar.objectEventId].active ? gObjectEvents[gPlayerAvatar.objectEventId].currentElevation : 3, - .movementType = MOVEMENT_TYPE_FOLLOW_PLAYER, - }; - objEvent = &gObjectEvents[SpawnSpecialObjectEvent(&template)]; - objEvent->invisible = TRUE; +void UpdateFollowingPokemon(void) +{ + // Update following pokemon if any + struct ObjectEvent *objEvent = GetFollowerObject(); + struct Sprite *sprite; + u16 species; + bool8 shiny; + u8 form; + // Avoid spawning large (>32x32) follower pokemon inside buildings + if (GetFollowerInfo(&species, &form, &shiny) + && !(gMapHeader.mapType == MAP_TYPE_INDOOR + && SpeciesToGraphicsInfo(species, 0)->height > 32) + && !FlagGet(FLAG_TEMP_HIDE_FOLLOWER)) + { + if (objEvent == NULL) + { + // Spawn follower + struct ObjectEventTemplate template = + { + .localId = OBJ_EVENT_ID_FOLLOWER, + .graphicsId = OBJ_EVENT_GFX_OW_MON, + .flagId = 0, + .x = gSaveBlock1Ptr->pos.x, + .y = gSaveBlock1Ptr->pos.y, + // If player active, copy player elevation + .elevation = gObjectEvents[gPlayerAvatar.objectEventId].active ? gObjectEvents[gPlayerAvatar.objectEventId].currentElevation : 3, + .movementType = MOVEMENT_TYPE_FOLLOW_PLAYER, + }; + objEvent = &gObjectEvents[SpawnSpecialObjectEvent(&template)]; + objEvent->invisible = TRUE; + } + sprite = &gSprites[objEvent->spriteId]; + // Follower appearance changed; move to player and set invisible + if (species != objEvent->extra.mon.species || shiny != objEvent->extra.mon.shiny || form != objEvent->extra.mon.form) + { + MoveObjectEventToMapCoords(objEvent, + gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, + gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); + objEvent->invisible = TRUE; + } + FollowerSetGraphics(objEvent, species, form, shiny); + sprite->data[6] = 0; // set animation data + objEvent->extra.mon.species = species; + objEvent->extra.mon.shiny = shiny; + objEvent->extra.mon.form = form; } - sprite = &gSprites[objEvent->spriteId]; - // Follower appearance changed; move to player and set invisible - if (species != objEvent->extra.mon.species || shiny != objEvent->extra.mon.shiny || form != objEvent->extra.mon.form) { - MoveObjectEventToMapCoords(objEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); - objEvent->invisible = TRUE; + else + { + RemoveFollowingPokemon(); } - FollowerSetGraphics(objEvent, species, form, shiny); - sprite->data[6] = 0; // set animation data - objEvent->extra.mon.species = species; - objEvent->extra.mon.shiny = shiny; - objEvent->extra.mon.form = form; - } else { - RemoveFollowingPokemon(); - } } -void RemoveFollowingPokemon(void) { // Remove follower object. Idempotent. - struct ObjectEvent *objectEvent = GetFollowerObject(); - if (objectEvent == NULL) - return; - RemoveObjectEvent(objectEvent); +// Remove follower object. Idempotent. +void RemoveFollowingPokemon(void) +{ + struct ObjectEvent *objectEvent = GetFollowerObject(); + if (objectEvent == NULL) + return; + RemoveObjectEvent(objectEvent); } -static bool8 IsFollowerVisible(void) { // Determine whether follower *should* be visible - return - !(TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE) - || MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) - || MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior) - || MetatileBehavior_IsForcedMovementTile(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) - || MetatileBehavior_IsForcedMovementTile(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior) - || gWeatherPtr->currWeather == WEATHER_UNDERWATER - || gWeatherPtr->currWeather == WEATHER_UNDERWATER_BUBBLES); +// Determine whether follower *should* be visible +static bool8 IsFollowerVisible(void) +{ + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE)) + return FALSE; + if (MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior)) + return FALSE; + if (MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior)) + return FALSE; + if (MetatileBehavior_IsForcedMovementTile(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior)) + return FALSE; + if (MetatileBehavior_IsForcedMovementTile(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior)) + return FALSE; + if (gWeatherPtr->currWeather == WEATHER_UNDERWATER) + return FALSE; + if (gWeatherPtr->currWeather == WEATHER_UNDERWATER_BUBBLES) + return FALSE; + return TRUE; } -static bool8 SpeciesHasType(u16 species, u8 type) { - return gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type; +static bool8 SpeciesHasType(u16 species, u8 type) +{ + return gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type; } // Returns a random index according to a list of weights -static u8 RandomWeightedIndex(u8 *weights, u8 length) { - u8 i; - u16 random_value; - u16 cum_weight = 0; - for (i = 0; i < length; i++) - cum_weight += weights[i]; - random_value = Random() % cum_weight; - cum_weight = 0; - for (i = 0; i < length; i++) { - cum_weight += weights[i]; - if (random_value <= cum_weight) - return i; - } +static u8 RandomWeightedIndex(u8 *weights, u8 length) +{ + u8 i; + u16 random_value; + u16 cum_weight = 0; + for (i = 0; i < length; i++) + cum_weight += weights[i]; + random_value = Random() % cum_weight; + cum_weight = 0; + for (i = 0; i < length; i++) + { + cum_weight += weights[i]; + if (random_value <= cum_weight) + return i; + } } // Pool of "unconditional" follower messages TODO: Should this be elsewhere ? -static const struct FollowerMessagePool followerBasicMessages[] = { - [FOLLOWER_EMOTION_HAPPY] = {gFollowerHappyMessages, EventScript_FollowerGeneric, N_FOLLOWER_HAPPY_MESSAGES}, - [FOLLOWER_EMOTION_NEUTRAL] = {gFollowerNeutralMessages, EventScript_FollowerGeneric, N_FOLLOWER_NEUTRAL_MESSAGES}, - [FOLLOWER_EMOTION_SAD] = {gFollowerSadMessages, EventScript_FollowerGeneric, N_FOLLOWER_SAD_MESSAGES}, - [FOLLOWER_EMOTION_UPSET] = {gFollowerUpsetMessages, EventScript_FollowerGeneric, N_FOLLOWER_UPSET_MESSAGES}, - [FOLLOWER_EMOTION_ANGRY] = {gFollowerAngryMessages, EventScript_FollowerGeneric, N_FOLLOWER_ANGRY_MESSAGES}, - [FOLLOWER_EMOTION_PENSIVE] = {gFollowerPensiveMessages, EventScript_FollowerGeneric, N_FOLLOWER_PENSIVE_MESSAGES}, - [FOLLOWER_EMOTION_LOVE] = {gFollowerLoveMessages, EventScript_FollowerGeneric, N_FOLLOWER_LOVE_MESSAGES}, - [FOLLOWER_EMOTION_SURPRISE] = {gFollowerSurpriseMessages, EventScript_FollowerGeneric, N_FOLLOWER_SURPRISE_MESSAGES}, - [FOLLOWER_EMOTION_CURIOUS] = {gFollowerCuriousMessages, EventScript_FollowerGeneric, N_FOLLOWER_CURIOUS_MESSAGES}, - [FOLLOWER_EMOTION_MUSIC] = {gFollowerMusicMessages, EventScript_FollowerGeneric, N_FOLLOWER_MUSIC_MESSAGES}, - [FOLLOWER_EMOTION_POISONED] = {gFollowerPoisonedMessages, EventScript_FollowerGeneric, N_FOLLOWER_POISONED_MESSAGES}, +static const struct FollowerMessagePool followerBasicMessages[] = +{ + [FOLLOWER_EMOTION_HAPPY] = {gFollowerHappyMessages, EventScript_FollowerGeneric, N_FOLLOWER_HAPPY_MESSAGES}, + [FOLLOWER_EMOTION_NEUTRAL] = {gFollowerNeutralMessages, EventScript_FollowerGeneric, N_FOLLOWER_NEUTRAL_MESSAGES}, + [FOLLOWER_EMOTION_SAD] = {gFollowerSadMessages, EventScript_FollowerGeneric, N_FOLLOWER_SAD_MESSAGES}, + [FOLLOWER_EMOTION_UPSET] = {gFollowerUpsetMessages, EventScript_FollowerGeneric, N_FOLLOWER_UPSET_MESSAGES}, + [FOLLOWER_EMOTION_ANGRY] = {gFollowerAngryMessages, EventScript_FollowerGeneric, N_FOLLOWER_ANGRY_MESSAGES}, + [FOLLOWER_EMOTION_PENSIVE] = {gFollowerPensiveMessages, EventScript_FollowerGeneric, N_FOLLOWER_PENSIVE_MESSAGES}, + [FOLLOWER_EMOTION_LOVE] = {gFollowerLoveMessages, EventScript_FollowerGeneric, N_FOLLOWER_LOVE_MESSAGES}, + [FOLLOWER_EMOTION_SURPRISE] = {gFollowerSurpriseMessages,EventScript_FollowerGeneric, N_FOLLOWER_SURPRISE_MESSAGES}, + [FOLLOWER_EMOTION_CURIOUS] = {gFollowerCuriousMessages, EventScript_FollowerGeneric, N_FOLLOWER_CURIOUS_MESSAGES}, + [FOLLOWER_EMOTION_MUSIC] = {gFollowerMusicMessages, EventScript_FollowerGeneric, N_FOLLOWER_MUSIC_MESSAGES}, + [FOLLOWER_EMOTION_POISONED] = {gFollowerPoisonedMessages,EventScript_FollowerGeneric, N_FOLLOWER_POISONED_MESSAGES}, }; // Display an emote above an object event // Note that this is not a movement action -static void ObjectEventEmote(struct ObjectEvent *objEvent, u8 emotion) { - emotion %= FOLLOWER_EMOTION_LENGTH; - ObjectEventGetLocalIdAndMap(objEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - gFieldEffectArguments[7] = emotion; - FieldEffectStart(FLDEFF_EMOTE); +static void ObjectEventEmote(struct ObjectEvent *objEvent, u8 emotion) +{ + emotion %= FOLLOWER_EMOTION_LENGTH; + ObjectEventGetLocalIdAndMap(objEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + gFieldEffectArguments[7] = emotion; + FieldEffectStart(FLDEFF_EMOTE); } // Script-accessible version of the above -bool8 ScrFunc_emote(struct ScriptContext *ctx) { - u8 localId = ScriptReadByte(ctx); - u8 emotion = ScriptReadByte(ctx) % FOLLOWER_EMOTION_LENGTH; - u8 i = GetObjectEventIdByLocalId(localId); - if (i < OBJECT_EVENTS_COUNT) - ObjectEventEmote(&gObjectEvents[i], emotion); - return FALSE; +bool8 ScrFunc_emote(struct ScriptContext *ctx) +{ + u8 localId = ScriptReadByte(ctx); + u8 emotion = ScriptReadByte(ctx) % FOLLOWER_EMOTION_LENGTH; + u8 i = GetObjectEventIdByLocalId(localId); + if (i < OBJECT_EVENTS_COUNT) + ObjectEventEmote(&gObjectEvents[i], emotion); + return FALSE; } -struct SpecialEmote { // Used for storing conditional emotes - u16 index; - u8 emotion; +// Used for storing conditional emotes +struct SpecialEmote +{ + u16 index; + u8 emotion; }; // Find and return direction of metatile behavior within distance -static u32 FindMetatileBehaviorWithinRange(s32 x, s32 y, u32 mb, u8 distance) { +static u32 FindMetatileBehaviorWithinRange(s32 x, s32 y, u32 mb, u8 distance) +{ s32 i; - for (i = y+1; i <= y + distance; i++) + for (i = y + 1; i <= y + distance; i++) + { if (MapGridGetMetatileBehaviorAt(x, i) == mb) return DIR_SOUTH; - for (i = y-1; i >= y - distance; i--) + } + for (i = y - 1; i >= y - distance; i--) + { if (MapGridGetMetatileBehaviorAt(x, i) == mb) return DIR_NORTH; - for (i = x+1; i <= x + distance; i++) + } + for (i = x + 1; i <= x + distance; i++) + { if (MapGridGetMetatileBehaviorAt(i, y) == mb) return DIR_EAST; - for (i = x-1; i >= x - distance; i--) + } + for (i = x - 1; i >= x - distance; i--) + { if (MapGridGetMetatileBehaviorAt(i, y) == mb) return DIR_WEST; + } return DIR_NONE; } @@ -1976,184 +2041,203 @@ static u32 FindMetatileBehaviorWithinRange(s32 x, s32 y, u32 mb, u8 distance) { // Call an applicable follower message script bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big switch for follower messages { - u16 species; - s32 multi, multi2; - struct SpecialEmote cond_emotes[16] = {0}; - u8 emotion, n_choices = 0; - struct ObjectEvent *objEvent = GetFollowerObject(); - struct Pokemon *mon = GetFirstLiveMon(); - u8 emotion_weight[FOLLOWER_EMOTION_LENGTH] = { - [FOLLOWER_EMOTION_HAPPY] = 10, - [FOLLOWER_EMOTION_NEUTRAL] = 15, - [FOLLOWER_EMOTION_SAD] = 5, - [FOLLOWER_EMOTION_UPSET] = 15, - [FOLLOWER_EMOTION_ANGRY] = 15, - [FOLLOWER_EMOTION_PENSIVE] = 15, - [FOLLOWER_EMOTION_SURPRISE] = 10, // TODO: Scale this with how long the follower has been out? - [FOLLOWER_EMOTION_CURIOUS] = 10, // TODO: Increase this if there is an item nearby? - [FOLLOWER_EMOTION_MUSIC] = 15, - }; - u32 i, j; - bool32 pickedCondition = FALSE; - if (mon == NULL) { - ScriptCall(ctx, EventScript_FollowerLovesYou); - return FALSE; - } - // If map is not flyable, set the script to jump past the fly check TODO: Should followers ask to fly? - if (TRUE || !Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType)) - ScriptJump(ctx, EventScript_FollowerEnd); - species = GetMonData(mon, MON_DATA_SPECIES); - multi = GetMonData(mon, MON_DATA_FRIENDSHIP); - if (multi > 80) { - emotion_weight[FOLLOWER_EMOTION_HAPPY] = 20; - emotion_weight[FOLLOWER_EMOTION_UPSET] = 5; - emotion_weight[FOLLOWER_EMOTION_ANGRY] = 5; - emotion_weight[FOLLOWER_EMOTION_LOVE] = 20; - emotion_weight[FOLLOWER_EMOTION_MUSIC] = 20; - } - if (multi > 170) { - emotion_weight[FOLLOWER_EMOTION_HAPPY] = 30; - emotion_weight[FOLLOWER_EMOTION_LOVE] = 30; - } - // Conditional messages follow - // Weather-related - if (GetCurrentWeather() == WEATHER_SUNNY_CLOUDS) - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=31}; - // Health & status-related - multi = mon->hp * 100 / mon->maxHP; - if (multi < 20) { - emotion_weight[FOLLOWER_EMOTION_SAD] = 30; - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=4}; - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=5}; - } - if (multi < 50 || mon->status & STATUS1_PARALYSIS) { - emotion_weight[FOLLOWER_EMOTION_SAD] = 30; - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=6}; - } - // Gym type advantage/disadvantage scripts - if (GetCurrentMapMusic() == MUS_GYM || GetCurrentMapMusic() == MUS_RG_GYM) { - switch (gMapHeader.regionMapSectionId) + u16 species; + s32 multi, multi2; + struct SpecialEmote cond_emotes[16] = {0}; + u8 emotion, n_choices = 0; + struct ObjectEvent *objEvent = GetFollowerObject(); + struct Pokemon *mon = GetFirstLiveMon(); + u8 emotion_weight[FOLLOWER_EMOTION_LENGTH] = { - case MAPSEC_RUSTBORO_CITY: - case MAPSEC_PEWTER_CITY: - multi = TYPE_ROCK; - break; - case MAPSEC_DEWFORD_TOWN: - multi = TYPE_FIGHTING; - break; - case MAPSEC_MAUVILLE_CITY: - case MAPSEC_VERMILION_CITY: - multi = TYPE_ELECTRIC; - break; - case MAPSEC_LAVARIDGE_TOWN: - case MAPSEC_CINNABAR_ISLAND: - multi = TYPE_FIRE; - break; - case MAPSEC_PETALBURG_CITY: - multi = TYPE_NORMAL; - break; - case MAPSEC_FORTREE_CITY: - multi = TYPE_FLYING; - break; - case MAPSEC_MOSSDEEP_CITY: - case MAPSEC_SAFFRON_CITY: - multi = TYPE_PSYCHIC; - break; - case MAPSEC_SOOTOPOLIS_CITY: - case MAPSEC_CERULEAN_CITY: - multi = TYPE_WATER; - break; - case MAPSEC_CELADON_CITY: - multi = TYPE_GRASS; - break; - case MAPSEC_FUCHSIA_CITY: - multi = TYPE_POISON; - break; - case MAPSEC_VIRIDIAN_CITY: - multi = TYPE_GROUND; - break; - default: - multi = NUMBER_OF_MON_TYPES; + [FOLLOWER_EMOTION_HAPPY] = 10, + [FOLLOWER_EMOTION_NEUTRAL] = 15, + [FOLLOWER_EMOTION_SAD] = 5, + [FOLLOWER_EMOTION_UPSET] = 15, + [FOLLOWER_EMOTION_ANGRY] = 15, + [FOLLOWER_EMOTION_PENSIVE] = 15, + [FOLLOWER_EMOTION_SURPRISE] = 10, // TODO: Scale this with how long the follower has been out? + [FOLLOWER_EMOTION_CURIOUS] = 10, // TODO: Increase this if there is an item nearby? + [FOLLOWER_EMOTION_MUSIC] = 15, + }; + u32 i, j; + bool32 pickedCondition = FALSE; + if (mon == NULL) + { + ScriptCall(ctx, EventScript_FollowerLovesYou); + return FALSE; } - if (multi < NUMBER_OF_MON_TYPES) { - multi = GetTypeEffectiveness(mon, multi); - if (multi & (MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_NO_EFFECT)) - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=32}; - else if (multi & MOVE_RESULT_SUPER_EFFECTIVE) - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=7}; + // If map is not flyable, set the script to jump past the fly check TODO: Should followers ask to fly? + if (TRUE || !Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType)) + ScriptJump(ctx, EventScript_FollowerEnd); + species = GetMonData(mon, MON_DATA_SPECIES); + multi = GetMonData(mon, MON_DATA_FRIENDSHIP); + if (multi > 80) + { + emotion_weight[FOLLOWER_EMOTION_HAPPY] = 20; + emotion_weight[FOLLOWER_EMOTION_UPSET] = 5; + emotion_weight[FOLLOWER_EMOTION_ANGRY] = 5; + emotion_weight[FOLLOWER_EMOTION_LOVE] = 20; + emotion_weight[FOLLOWER_EMOTION_MUSIC] = 20; + } + if (multi > 170) + { + emotion_weight[FOLLOWER_EMOTION_HAPPY] = 30; + emotion_weight[FOLLOWER_EMOTION_LOVE] = 30; + } + // Conditional messages follow + // Weather-related + if (GetCurrentWeather() == WEATHER_SUNNY_CLOUDS) + cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=31}; + // Health & status-related + multi = mon->hp * 100 / mon->maxHP; + if (multi < 20) + { + emotion_weight[FOLLOWER_EMOTION_SAD] = 30; + cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=4}; + cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=5}; + } + if (multi < 50 || mon->status & STATUS1_PARALYSIS) + { + emotion_weight[FOLLOWER_EMOTION_SAD] = 30; + cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=6}; + } + // Gym type advantage/disadvantage scripts + if (GetCurrentMapMusic() == MUS_GYM || GetCurrentMapMusic() == MUS_RG_GYM) + { + switch (gMapHeader.regionMapSectionId) + { + case MAPSEC_RUSTBORO_CITY: + case MAPSEC_PEWTER_CITY: + multi = TYPE_ROCK; + break; + case MAPSEC_DEWFORD_TOWN: + multi = TYPE_FIGHTING; + break; + case MAPSEC_MAUVILLE_CITY: + case MAPSEC_VERMILION_CITY: + multi = TYPE_ELECTRIC; + break; + case MAPSEC_LAVARIDGE_TOWN: + case MAPSEC_CINNABAR_ISLAND: + multi = TYPE_FIRE; + break; + case MAPSEC_PETALBURG_CITY: + multi = TYPE_NORMAL; + break; + case MAPSEC_FORTREE_CITY: + multi = TYPE_FLYING; + break; + case MAPSEC_MOSSDEEP_CITY: + case MAPSEC_SAFFRON_CITY: + multi = TYPE_PSYCHIC; + break; + case MAPSEC_SOOTOPOLIS_CITY: + case MAPSEC_CERULEAN_CITY: + multi = TYPE_WATER; + break; + case MAPSEC_CELADON_CITY: + multi = TYPE_GRASS; + break; + case MAPSEC_FUCHSIA_CITY: + multi = TYPE_POISON; + break; + case MAPSEC_VIRIDIAN_CITY: + multi = TYPE_GROUND; + break; + default: + multi = NUMBER_OF_MON_TYPES; + } + if (multi < NUMBER_OF_MON_TYPES) + { + multi = GetTypeEffectiveness(mon, multi); + if (multi & (MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_NO_EFFECT)) + cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=32}; + else if (multi & MOVE_RESULT_SUPER_EFFECTIVE) + cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=7}; + } } - } - emotion = RandomWeightedIndex(emotion_weight, FOLLOWER_EMOTION_LENGTH); - #ifdef BATTLE_ENGINE - if ((mon->status & STATUS1_PSN_ANY) && GetMonAbility(mon) != ABILITY_POISON_HEAL) - #else - if (mon->status & STATUS1_PSN_ANY) - #endif - emotion = FOLLOWER_EMOTION_POISONED; - multi = Random() % followerBasicMessages[emotion].length; - // With 50% chance, select special message using reservoir sampling - for (i = (Random() & 1) ? n_choices : 0, j = 1; i < n_choices; i++) { - if (cond_emotes[i].emotion == emotion && (Random() < 0x10000 / (j++))) // Replace item with 1/j chance - multi = cond_emotes[i].index; - } - // Match scripted conditional messages - // With 50% chance, try to match scripted conditional messages - for (i = (Random() & 1) ? COND_MSG_COUNT : 0, j = 1; i < COND_MSG_COUNT; i++) { - const struct FollowerMsgInfoExtended *info = &gFollowerConditionalMessages[i]; - if (info->stFlags == 1 && species != info->st.species) - continue; - if (info->stFlags == 2 && (info->st.types.type2 >= NUMBER_OF_MON_TYPES ? SpeciesHasType(species, info->st.types.type1) : !(SpeciesHasType(species, info->st.types.type1) || SpeciesHasType(species, info->st.types.type2)))) - continue; - if (info->stFlags == 3 && !(mon->status & info->st.status)) - continue; - if (info->mmFlags == 1 && gMapHeader.regionMapSectionId != info->mm.mapSec.mapSec) - continue; - if (info->mmFlags == 2 && !(gSaveBlock1Ptr->location.mapNum == info->mm.map.mapNum && gSaveBlock1Ptr->location.mapGroup == info->mm.map.mapGroup)) - continue; - if (info->mmFlags == 3 && !(objEvent->currentMetatileBehavior == info->mm.mb.behavior1 || objEvent->currentMetatileBehavior == info->mm.mb.behavior2)) - continue; - if (info->wtFlags == 1 && !(GetCurrentWeather() == info->wt.weather.weather1 || GetCurrentWeather() == info->wt.weather.weather2)) - continue; - if (info->wtFlags == 2 && GetCurrentMapMusic() != info->wt.song) - continue; - if (info->nearFlags == 1) { - if ((multi2 = FindMetatileBehaviorWithinRange(objEvent->currentCoords.x, objEvent->currentCoords.y, info->near.mb.behavior, info->near.mb.distance))) - gSpecialVar_Result = multi2; - else - continue; - } + emotion = RandomWeightedIndex(emotion_weight, FOLLOWER_EMOTION_LENGTH); + #ifdef BATTLE_ENGINE + if ((mon->status & STATUS1_PSN_ANY) && GetMonAbility(mon) != ABILITY_POISON_HEAL) + #else + if (mon->status & STATUS1_PSN_ANY) + #endif + emotion = FOLLOWER_EMOTION_POISONED; + multi = Random() % followerBasicMessages[emotion].length; + // With 50% chance, select special message using reservoir sampling + for (i = (Random() & 1) ? n_choices : 0, j = 1; i < n_choices; i++) + { + if (cond_emotes[i].emotion == emotion && (Random() < 0x10000 / (j++))) // Replace item with 1/j chance + multi = cond_emotes[i].index; + } + // Match scripted conditional messages + // With 50% chance, try to match scripted conditional messages + for (i = (Random() & 1) ? COND_MSG_COUNT : 0, j = 1; i < COND_MSG_COUNT; i++) + { + const struct FollowerMsgInfoExtended *info = &gFollowerConditionalMessages[i]; + if (info->stFlags == 1 && species != info->st.species) + continue; + if (info->stFlags == 2 && (info->st.types.type2 >= NUMBER_OF_MON_TYPES ? SpeciesHasType(species, info->st.types.type1) : !(SpeciesHasType(species, info->st.types.type1) || SpeciesHasType(species, info->st.types.type2)))) + continue; + if (info->stFlags == 3 && !(mon->status & info->st.status)) + continue; + if (info->mmFlags == 1 && gMapHeader.regionMapSectionId != info->mm.mapSec.mapSec) + continue; + if (info->mmFlags == 2 && !(gSaveBlock1Ptr->location.mapNum == info->mm.map.mapNum && gSaveBlock1Ptr->location.mapGroup == info->mm.map.mapGroup)) + continue; + if (info->mmFlags == 3 && !(objEvent->currentMetatileBehavior == info->mm.mb.behavior1 || objEvent->currentMetatileBehavior == info->mm.mb.behavior2)) + continue; + if (info->wtFlags == 1 && !(GetCurrentWeather() == info->wt.weather.weather1 || GetCurrentWeather() == info->wt.weather.weather2)) + continue; + if (info->wtFlags == 2 && GetCurrentMapMusic() != info->wt.song) + continue; + if (info->nearFlags == 1) + { + if ((multi2 = FindMetatileBehaviorWithinRange(objEvent->currentCoords.x, objEvent->currentCoords.y, info->near.mb.behavior, info->near.mb.distance))) + gSpecialVar_Result = multi2; + else + continue; + } - // replace choice with weight/j chance - if (Random() < (0x10000 / (j++)) * (info->weight ? info->weight : 1)) { - multi = i; - pickedCondition = TRUE; - } - } - if (pickedCondition) { // conditional message was chosen - emotion = gFollowerConditionalMessages[multi].emotion; - ObjectEventEmote(objEvent, emotion); - ctx->data[0] = (u32) gFollowerConditionalMessages[multi].text; - // text choices are spread across array; pick a random one - if (gFollowerConditionalMessages[multi].textSpread) { - for (i = 0; i < 4; i++) - if (!((u32*)gFollowerConditionalMessages[multi].text)[i]) - break; - ctx->data[0] = i ? ((u32*)gFollowerConditionalMessages[multi].text)[Random() % i] : 0; - } - ScriptCall(ctx, gFollowerConditionalMessages[multi].script ? gFollowerConditionalMessages[multi].script : followerBasicMessages[emotion].script); - return FALSE; - } - ObjectEventEmote(objEvent, emotion); - ctx->data[0] = (u32) followerBasicMessages[emotion].messages[multi].text; // Load message text - ScriptCall(ctx, followerBasicMessages[emotion].messages[multi].script ? - followerBasicMessages[emotion].messages[multi].script : followerBasicMessages[emotion].script); - return FALSE; + // replace choice with weight/j chance + if (Random() < (0x10000 / (j++)) * (info->weight ? info->weight : 1)) + { + multi = i; + pickedCondition = TRUE; + } + } + + // conditional message was chosen + if (pickedCondition) + { + emotion = gFollowerConditionalMessages[multi].emotion; + ObjectEventEmote(objEvent, emotion); + ctx->data[0] = (u32) gFollowerConditionalMessages[multi].text; + // text choices are spread across array; pick a random one + if (gFollowerConditionalMessages[multi].textSpread) + { + for (i = 0; i < 4; i++) + { + if (!((u32*)gFollowerConditionalMessages[multi].text)[i]) + break; + } + ctx->data[0] = i ? ((u32*)gFollowerConditionalMessages[multi].text)[Random() % i] : 0; + } + ScriptCall(ctx, gFollowerConditionalMessages[multi].script ? gFollowerConditionalMessages[multi].script : followerBasicMessages[emotion].script); + return FALSE; + } + ObjectEventEmote(objEvent, emotion); + ctx->data[0] = (u32) followerBasicMessages[emotion].messages[multi].text; // Load message text + ScriptCall(ctx, followerBasicMessages[emotion].messages[multi].script ? + followerBasicMessages[emotion].messages[multi].script : followerBasicMessages[emotion].script); + return FALSE; } -bool8 ScrFunc_followerfly(struct ScriptContext *ctx) { - SetMainCallback2(CB2_OpenFlyMap); - return FALSE; +bool8 ScrFunc_FollowerFly(struct ScriptContext *ctx) +{ + SetMainCallback2(CB2_OpenFlyMap); + return FALSE; } void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) @@ -2263,8 +2347,9 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) spriteFrameImage.size = graphicsInfo->size; CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables); spriteTemplate.images = &spriteFrameImage; - if (spriteTemplate.paletteTag != TAG_NONE) { - LoadObjectEventPalette(spriteTemplate.paletteTag); + if (spriteTemplate.paletteTag != TAG_NONE) + { + LoadObjectEventPalette(spriteTemplate.paletteTag); } i = CreateSprite(&spriteTemplate, 0, 0, 0); if (i != MAX_SPRITES) @@ -2287,8 +2372,10 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) sprite->coordOffsetEnabled = TRUE; sprite->sObjEventId = objectEventId; objectEvent->spriteId = i; - if (objectEvent->graphicsId == OBJ_EVENT_GFX_OW_MON) { // Set pokemon graphics - FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny); + if (objectEvent->graphicsId == OBJ_EVENT_GFX_OW_MON) + { + // Set pokemon graphics + FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny); } if (!objectEvent->inanimate && objectEvent->movementType != MOVEMENT_TYPE_PLAYER) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection)); @@ -2320,44 +2407,45 @@ static void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteI } // Update sprite's palette, freeing old palette if necessary -static u8 UpdateSpritePalette(const struct SpritePalette * spritePalette, struct Sprite * sprite) { - // Free palette if otherwise unused - sprite->inUse = FALSE; - FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); - sprite->inUse = TRUE; - return sprite->oam.paletteNum = LoadSpritePalette(spritePalette); +static u8 UpdateSpritePalette(const struct SpritePalette * spritePalette, struct Sprite * sprite) +{ + // Free palette if otherwise unused + sprite->inUse = FALSE; + FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); + sprite->inUse = TRUE; + return sprite->oam.paletteNum = LoadSpritePalette(spritePalette); } // Find and update based on template's paletteTag // TODO: Add a better way to associate tags -> palettes besides listing them in sObjectEventSpritePalettes -u8 UpdateSpritePaletteByTemplate(const struct SpriteTemplate * template, struct Sprite * sprite) { - u8 i = FindObjectEventPaletteIndexByTag(template->paletteTag); - if (i == 0xFF) - return i; - return UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); +u8 UpdateSpritePaletteByTemplate(const struct SpriteTemplate * template, struct Sprite * sprite) +{ + u8 i = FindObjectEventPaletteIndexByTag(template->paletteTag); + if (i == 0xFF) + return i; + return UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); } // Set graphics *by info* -static void ObjectEventSetGraphics(struct ObjectEvent *objectEvent, const struct ObjectEventGraphicsInfo *graphicsInfo) { - struct Sprite *sprite = &gSprites[objectEvent->spriteId]; - u8 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); - if (i != 0xFF) - UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); - sprite->oam.shape = graphicsInfo->oam->shape; - sprite->oam.size = graphicsInfo->oam->size; - sprite->images = graphicsInfo->images; - sprite->anims = graphicsInfo->anims; - sprite->subspriteTables = graphicsInfo->subspriteTables; - objectEvent->inanimate = graphicsInfo->inanimate; - SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->x += 8; - sprite->y += 16 + sprite->centerToCornerVecY; - if (objectEvent->trackedByCamera) - { - CameraObjectReset1(); - } +static void ObjectEventSetGraphics(struct ObjectEvent *objectEvent, const struct ObjectEventGraphicsInfo *graphicsInfo) +{ + struct Sprite *sprite = &gSprites[objectEvent->spriteId]; + u8 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); + if (i != 0xFF) + UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); + sprite->oam.shape = graphicsInfo->oam->shape; + sprite->oam.size = graphicsInfo->oam->size; + sprite->images = graphicsInfo->images; + sprite->anims = graphicsInfo->anims; + sprite->subspriteTables = graphicsInfo->subspriteTables; + objectEvent->inanimate = graphicsInfo->inanimate; + SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); + sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); + sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); + sprite->x += 8; + sprite->y += 16 + sprite->centerToCornerVecY; + if (objectEvent->trackedByCamera) + CameraObjectReset1(); } void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) @@ -2398,27 +2486,26 @@ void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction) ObjectEventTurn(&gObjectEvents[playerAvatar->objectEventId], direction); } -static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, u8 berryId, u8 berryStage) { - const u8 graphicsId = gBerryTreeObjectEventGraphicsIdTablePointers[berryId][berryStage]; - const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - struct Sprite *sprite = &gSprites[objectEvent->spriteId]; - UpdateSpritePalette(&sObjectEventSpritePalettes[gBerryTreePaletteSlotTablePointers[berryId][berryStage]-2], sprite); - sprite->oam.shape = graphicsInfo->oam->shape; - sprite->oam.size = graphicsInfo->oam->size; - sprite->images = gBerryTreePicTablePointers[berryId]; - sprite->anims = graphicsInfo->anims; - sprite->subspriteTables = graphicsInfo->subspriteTables; - objectEvent->inanimate = graphicsInfo->inanimate; - objectEvent->graphicsId = graphicsId; - SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->x += 8; - sprite->y += 16 + sprite->centerToCornerVecY; - if (objectEvent->trackedByCamera) - { - CameraObjectReset1(); - } +static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, u8 berryId, u8 berryStage) +{ + const u8 graphicsId = gBerryTreeObjectEventGraphicsIdTablePointers[berryId][berryStage]; + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); + struct Sprite *sprite = &gSprites[objectEvent->spriteId]; + UpdateSpritePalette(&sObjectEventSpritePalettes[gBerryTreePaletteSlotTablePointers[berryId][berryStage]-2], sprite); + sprite->oam.shape = graphicsInfo->oam->shape; + sprite->oam.size = graphicsInfo->oam->size; + sprite->images = gBerryTreePicTablePointers[berryId]; + sprite->anims = graphicsInfo->anims; + sprite->subspriteTables = graphicsInfo->subspriteTables; + objectEvent->inanimate = graphicsInfo->inanimate; + objectEvent->graphicsId = graphicsId; + SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); + sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); + sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); + sprite->x += 8; + sprite->y += 16 + sprite->centerToCornerVecY; + if (objectEvent->trackedByCamera) + CameraObjectReset1(); } static void get_berry_tree_graphics(struct ObjectEvent *objectEvent, struct Sprite *sprite) @@ -2906,9 +2993,8 @@ void SetObjectEventDirection(struct ObjectEvent *objectEvent, u8 direction) static const u8 *GetObjectEventScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { - if (localId == OBJ_EVENT_ID_FOLLOWER) { - return EventScript_Follower; - } + if (localId == OBJ_EVENT_ID_FOLLOWER) + return EventScript_Follower; return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script; } @@ -4950,16 +5036,23 @@ movement_type_def(MovementType_FollowPlayer, gMovementTypeFuncs_FollowPlayer) bool8 MovementType_FollowPlayer_Shadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - if (!IsFollowerVisible()) { // Shadow player's position - objectEvent->invisible = TRUE; - MoveObjectEventToMapCoords(objectEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); - objectEvent->triggerGroundEffectsOnMove = FALSE; // Stop endless reflection spawning - return FALSE; + if (!IsFollowerVisible()) + { + // Shadow player's position + objectEvent->invisible = TRUE; + MoveObjectEventToMapCoords(objectEvent, + gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, + gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); + objectEvent->triggerGroundEffectsOnMove = FALSE; // Stop endless reflection spawning + return FALSE; } // Move follower to player, in case we end up in the shadowing state for only 1 frame // This way the player cannot talk to the invisible follower before it appears - if (objectEvent->invisible) { - MoveObjectEventToMapCoords(objectEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); + if (objectEvent->invisible) + { + MoveObjectEventToMapCoords(objectEvent, + gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, + gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); objectEvent->triggerGroundEffectsOnMove = FALSE; // Stop endless reflection spawning } sprite->sTypeFuncId = 1; // Enter active state; if the player moves the follower will appear @@ -4968,8 +5061,11 @@ bool8 MovementType_FollowPlayer_Shadow(struct ObjectEvent *objectEvent, struct S bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (!IsFollowerVisible()) { - if (objectEvent->invisible) { // Return to shadowing state + if (!IsFollowerVisible()) + { + if (objectEvent->invisible) + { + // Return to shadowing state sprite->sTypeFuncId = 0; return FALSE; } @@ -4998,12 +5094,12 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S if (sprite->sTypeFuncId) { // restore nonzero state sprite->sTypeFuncId = 1; } - } else if (objectEvent->movementActionId < MOVEMENT_ACTION_EXIT_POKEBALL) { + } + else if (objectEvent->movementActionId < MOVEMENT_ACTION_EXIT_POKEBALL) + { UpdateFollowerTransformEffect(objectEvent, sprite); - #if OW_MON_BOBBING == TRUE - if ((sprite->data[5] & 7) == 2) + if (OW_MON_BOBBING == TRUE && (sprite->data[5] & 7) == 2) sprite->y2 ^= -1; - #endif } return FALSE; } @@ -5011,20 +5107,22 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { if (!objectEvent->singleMovementActive) - { // walk in place - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 1; - objectEvent->singleMovementActive = 1; - return TRUE; + { + // walk in place + ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); + sprite->sTypeFuncId = 1; + objectEvent->singleMovementActive = 1; + return TRUE; } else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { // finish movement action + { + // finish movement action objectEvent->singleMovementActive = 0; } - #if OW_MON_BOBBING == TRUE - else if ((sprite->data[3] & 7) == 2) + else if (OW_MON_BOBBING == TRUE && (sprite->data[3] & 7) == 2) + { sprite->y2 ^= -1; - #endif + } UpdateFollowerTransformEffect(objectEvent, sprite); return FALSE; } @@ -5045,29 +5143,36 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; - if ((x == targetX && y == targetY) || !IsFollowerVisible()) { // don't move on player collision or if not visible - return FALSE; + // don't move on player collision or if not visible + if ((x == targetX && y == targetY) || !IsFollowerVisible()) + { + return FALSE; } x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; ClearObjectEventMovement(objectEvent, sprite); - if (objectEvent->invisible) { // Animate exiting pokeball - // Player is jumping, but follower is invisible - if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) { - sprite->sTypeFuncId = 0; // return to shadowing state + if (objectEvent->invisible) + { + // Animate exiting pokeball + // Player is jumping, but follower is invisible + if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) + { + sprite->sTypeFuncId = 0; // return to shadowing state + return FALSE; + } + MoveObjectEventToMapCoords(objectEvent, targetX, targetY); + ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL); + objectEvent->singleMovementActive = 1; + sprite->sTypeFuncId = 2; + if (OW_MON_BOBBING == TRUE) + sprite->y2 = 0; + return TRUE; + } + else if (x == targetX && y == targetY) + { + // don't move if already in the player's last position return FALSE; - } - MoveObjectEventToMapCoords(objectEvent, targetX, targetY); - ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL); - objectEvent->singleMovementActive = 1; - sprite->sTypeFuncId = 2; - #if OW_MON_BOBBING == TRUE - sprite->y2 = 0; - #endif - return TRUE; - } else if (x == targetX && y == targetY) { // don't move if already in the player's last position - return FALSE; } // Follow player @@ -5075,40 +5180,59 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri MoveCoords(direction, &x, &y); #ifdef MB_SIDEWAYS_STAIRS_RIGHT_SIDE // https://github.com/ghoulslash/pokeemerald/tree/sideways_stairs GetCollisionAtCoords(objectEvent, x, y, direction); // Sets directionOverwrite for stairs - if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) // InitJumpRegular will set the proper speed + if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) + { + // InitJumpRegular will set the proper speed ObjectEventSetSingleMovement(objectEvent, sprite, GetJump2MovementAction(direction)); - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { // Set follow speed according to player's speed + } + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) + { + // Set follow speed according to player's speed if (playerAction >= MOVEMENT_ACTION_RUN_DOWN_SLOW && playerAction <= MOVEMENT_ACTION_RUN_RIGHT_SLOW) objectEvent->movementActionId = GetWalkNormalMovementAction(direction); else objectEvent->movementActionId = GetWalkFastMovementAction(direction); - } else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) { + } + else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) + { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction)); - } else { + } + else + { if (playerAction >= MOVEMENT_ACTION_WALK_SLOW_DOWN && playerAction <= MOVEMENT_ACTION_WALK_SLOW_RIGHT) + { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction)); - else { + } + else + { objectEvent->movementActionId = GetWalkNormalMovementAction(direction); - #if OW_MON_BOBBING == TRUE - sprite->y2 = -1; - #endif + if (OW_MON_BOBBING == TRUE) + sprite->y2 = -1; } } sprite->sActionFuncId = 0; #else - if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) // InitJumpRegular will set the proper speed + if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) + { + // InitJumpRegular will set the proper speed ObjectEventSetSingleMovement(objectEvent, sprite, GetJump2MovementAction(direction)); - else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) // Set follow speed according to player's speed + } + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) + { + // Set follow speed according to player's speed ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFastMovementAction(direction)); - // If *player* jumps, make step take twice as long + } else if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) + { + // If *player* jumps, make step take twice as long ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction)); - else { + } + else + { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(direction)); - #if OW_MON_BOBBING == TRUE - sprite->y2 = -1; - #endif + if (OW_MON_BOBBING == TRUE) + sprite->y2 = -1; } #endif objectEvent->singleMovementActive = 1; @@ -6662,11 +6786,12 @@ bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct ObjectEvent *objectEvent, } // Update sprite with a palette filled with a solid color -static u8 LoadFillColorPalette(u16 color, u16 paletteTag, struct Sprite *sprite) { - u16 paletteData[16]; - struct SpritePalette dynamicPalette = {.tag = paletteTag, .data = paletteData}; - CpuFill16(color, paletteData, PLTT_SIZE_4BPP); - return UpdateSpritePalette(&dynamicPalette, sprite); +static u8 LoadFillColorPalette(u16 color, u16 paletteTag, struct Sprite *sprite) +{ + u16 paletteData[16]; + struct SpritePalette dynamicPalette = {.tag = paletteTag, .data = paletteData}; + CpuFill16(color, paletteData, PLTT_SIZE_4BPP); + return UpdateSpritePalette(&dynamicPalette, sprite); } bool8 MovementAction_ExitPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { @@ -9215,8 +9340,9 @@ static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct S GroundEffect_Seaweed // GROUND_EFFECT_FLAG_SEAWEED }; -static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *sprite) { - SetUpShadow(objEvent, sprite); +static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *sprite) +{ + SetUpShadow(objEvent, sprite); } static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) diff --git a/src/field_effect.c b/src/field_effect.c index 69a9a3a8e5..f89dcce2e7 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -3079,7 +3079,7 @@ static void SurfFieldEffect_End(struct Task *task) gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_CONTROLLABLE; ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->movementDirection)); if (followerObject) - ObjectEventClearHeldMovementIfFinished(followerObject); + ObjectEventClearHeldMovementIfFinished(followerObject); SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON); UnfreezeObjectEvents(); UnlockPlayerFieldControls(); diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 7dd55a6262..02b08aee3a 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -54,11 +54,12 @@ u32 FldEff_Shadow(void); #define sReflectionVerticalOffset data[2] #define sIsStillReflection data[7] -void SetUpShadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - gFieldEffectArguments[0] = objectEvent->localId; - gFieldEffectArguments[1] = gSaveBlock1Ptr->location.mapNum; - gFieldEffectArguments[2] = gSaveBlock1Ptr->location.mapGroup; - FldEff_Shadow(); +void SetUpShadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = objectEvent->localId; + gFieldEffectArguments[1] = gSaveBlock1Ptr->location.mapNum; + gFieldEffectArguments[2] = gSaveBlock1Ptr->location.mapGroup; + FldEff_Shadow(); } void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 stillReflection) @@ -325,15 +326,16 @@ u32 FldEff_Shadow(void) const struct ObjectEventGraphicsInfo *graphicsInfo; u8 spriteId; u8 i; - for (i = 0; i < MAX_SPRITES; i++) { - // Return early if a shadow sprite already exists - if (gSprites[i].data[0] == gFieldEffectArguments[0] && gSprites[i].callback == UpdateShadowFieldEffect) - return 0; + for (i = 0; i < MAX_SPRITES; i++) + { + // Return early if a shadow sprite already exists + if (gSprites[i].data[0] == gFieldEffectArguments[0] && gSprites[i].callback == UpdateShadowFieldEffect) + return 0; } objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); if (graphicsInfo->shadowSize == SHADOW_SIZE_NONE) // don't create a shadow at all - return 0; + return 0; spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94); if (spriteId != MAX_SPRITES) { diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index c04884d5ae..9338fe183d 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -687,9 +687,11 @@ static void Task_DoDoorWarp(u8 taskId) FreezeObjectEvents(); PlayerGetDestCoords(x, y); PlaySE(GetDoorSoundEffect(*x, *y - 1)); - if (followerObject) { // Put follower into pokeball - ClearObjectEventMovement(followerObject, &gSprites[followerObject->spriteId]); - ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL); + if (followerObject) + { + // Put follower into pokeball + ClearObjectEventMovement(followerObject, &gSprites[followerObject->spriteId]); + ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL); } task->data[1] = FieldAnimateDoorOpen(*x, *y - 1); task->tState = 1; diff --git a/src/load_save.c b/src/load_save.c index 9c10b4b10e..3ac12c529d 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -182,7 +182,8 @@ void SaveObjectEvents(void) { int i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) + { gSaveBlock1Ptr->objectEvents[i] = gObjectEvents[i]; // To avoid crash on vanilla, save follower as inactive if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER) @@ -194,12 +195,11 @@ void LoadObjectEvents(void) { int i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) + { gObjectEvents[i] = gSaveBlock1Ptr->objectEvents[i]; // Try to restore saved inactive follower - if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && - !gObjectEvents[i].active && - gObjectEvents[i].extra.asU16) + if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && !gObjectEvents[i].active && gObjectEvents[i].extra.asU16) gObjectEvents[i].active = TRUE; } } diff --git a/src/main.c b/src/main.c index d4831b0e24..07fe8e678d 100644 --- a/src/main.c +++ b/src/main.c @@ -444,10 +444,10 @@ void ClearPokemonCrySongs(void) // TODO: Needs to be updated if compiling for a different processor than the GBA's bool8 IsAccurateGBA(void) { // tests to see whether running on either an accurate emulator in >=2020, or real hardware - u32 code[5] = {0xFF1EE12F, 0xE1DF00B0, 0xE12FFF1E, 0xAAAABBBB, 0xCCCCDDDD}; // ARM: _;ldrh r0, [pc];bx lr - u32 func = (u32) &code[0]; - if (func & 3) // not word aligned; safer to just return false here - return FALSE; - func = (func & ~3) | 0x2; // misalign PC to test PC-relative loading - return ((u32 (*)(void)) func)() == code[3] >> 16; + u32 code[5] = {0xFF1EE12F, 0xE1DF00B0, 0xE12FFF1E, 0xAAAABBBB, 0xCCCCDDDD}; // ARM: _;ldrh r0, [pc];bx lr + u32 func = (u32) &code[0]; + if (func & 3) // not word aligned; safer to just return false here + return FALSE; + func = (func & ~3) | 0x2; // misalign PC to test PC-relative loading + return ((u32 (*)(void)) func)() == code[3] >> 16; } diff --git a/src/overworld.c b/src/overworld.c index 4ecb30f45b..5921e9e565 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -203,7 +203,6 @@ EWRAM_DATA static u16 sAmbientCrySpecies = 0; EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE; EWRAM_DATA struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4] = {0}; - static const struct WarpData sDummyWarpData = { .mapGroup = MAP_GROUP(UNDEFINED), @@ -1491,9 +1490,10 @@ void CB2_Overworld(void) if (fading) SetVBlankCallback(NULL); OverworldBasic(); - if (fading) { - SetFieldVBlankCallback(); - return; + if (fading) + { + SetFieldVBlankCallback(); + return; } } @@ -1974,9 +1974,9 @@ static bool32 ReturnToFieldLocal(u8 *state) ResumeMap(FALSE); InitObjectEventsReturnToField(); if (gFieldCallback == FieldCallback_Fly) - RemoveFollowingPokemon(); + RemoveFollowingPokemon(); else - UpdateFollowingPokemon(); + UpdateFollowingPokemon(); SetCameraToTrackPlayer(); (*state)++; break; @@ -1992,6 +1992,7 @@ static bool32 ReturnToFieldLocal(u8 *state) case 3: return TRUE; } + return FALSE; } diff --git a/src/palette.c b/src/palette.c index a9b3d207b3..83590fc3d2 100644 --- a/src/palette.c +++ b/src/palette.c @@ -420,7 +420,7 @@ static u8 UpdateTimeOfDayPaletteFade(void) // Like normal, but respects sprite p return PALETTE_FADE_STATUS_DONE; if (IsSoftwarePaletteFadeFinishing()) - return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; + return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; if (!gPaletteFade.objPaletteToggle) { @@ -444,20 +444,30 @@ static u8 UpdateTimeOfDayPaletteFade(void) // Like normal, but respects sprite p paletteOffset = 256; } - for (paletteNum = 0; paletteNum < 16; paletteNum++, selectedPalettes >>= 1, paletteOffset += 16) { - if (selectedPalettes & 1) { - if (gPaletteFade.yDec) { - if (gPaletteFade.objPaletteToggle) { // sprite palettes - if (gPaletteFade.y >= gPaletteFade.targetY || GetSpritePaletteTagByPaletteNum(paletteNum) & 0x8000) - BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); - // tile palettes - } else if (gPaletteFade.y >= gPaletteFade.targetY || (paletteNum >= 13 && paletteNum <= 15)) { - BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); - } - } else { - BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + for (paletteNum = 0; paletteNum < 16; paletteNum++, selectedPalettes >>= 1, paletteOffset += 16) + { + if (selectedPalettes & 1) + { + if (gPaletteFade.yDec) + { + // sprite palettes + if (gPaletteFade.objPaletteToggle) + { + if (gPaletteFade.y >= gPaletteFade.targetY || GetSpritePaletteTagByPaletteNum(paletteNum) & 0x8000) + BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + + } + // tile palettes + else if (gPaletteFade.y >= gPaletteFade.targetY || (paletteNum >= 13 && paletteNum <= 15)) + { + BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + } + } + else + { + BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + } } - } } gPaletteFade.objPaletteToggle ^= 1; diff --git a/src/party_menu.c b/src/party_menu.c index 41e7fe1021..8e9b1e58f8 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -3821,7 +3821,9 @@ bool8 FieldCallback_PrepareFadeInFromMenu(void) return TRUE; } -bool8 FieldCallback_PrepareFadeInForTeleport(void) { // same as above, but removes follower pokemon +// same as above, but removes follower pokemon +bool8 FieldCallback_PrepareFadeInForTeleport(void) +{ RemoveFollowingPokemon(); return FieldCallback_PrepareFadeInFromMenu(); } diff --git a/src/pokeball.c b/src/pokeball.c index 47335fe4ec..3c95328e14 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -852,7 +852,8 @@ static void HandleBallAnimEnd(struct Sprite *sprite) bool8 affineAnimEnded = FALSE; u8 battlerId = sprite->sBattler; - if (sprite->data[7] == POKEBALL_PLAYER_SLIDEIN) { + if (sprite->data[7] == POKEBALL_PLAYER_SLIDEIN) + { gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = SpriteCB_PlayerMonSlideIn; AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]); gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0x1000; diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index 00b7cdd971..b3e0276f1d 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -1303,8 +1303,10 @@ static void CB2_InitRayquazaScene(void) ClearScheduledBgCopiesToVram(); ScanlineEffect_Stop(); for (i = 0; i < OBJECT_EVENTS_COUNT; i++) + { if (gObjectEvents[i].graphicsId == OBJ_EVENT_GFX_RAYQUAZA) gObjectEvents[i].invisible = FALSE; + } FreeAllSpritePalettes(); ResetPaletteFade(); ResetSpriteData(); diff --git a/src/scrcmd.c b/src/scrcmd.c index abef4a85fe..b1c493cb54 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1004,19 +1004,22 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx) struct ObjectEvent *objEvent; // When applying script movements to follower, it may have frozen animation that must be cleared - if (localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen) { + if (localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen) + { ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); gSprites[objEvent->spriteId].animCmdIndex = 0; // Needed to set start frame of animation } ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); sMovingNpcId = localId; - if (localId != OBJ_EVENT_ID_FOLLOWER && !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) { // Force follower into pokeball - objEvent = GetFollowerObject(); - // return early if no follower or in shadowing state - if (objEvent == NULL || gSprites[objEvent->spriteId].data[1] == 0) - return FALSE; - ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); - ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, EnterPokeballMovement); + // Force follower into pokeball + if (localId != OBJ_EVENT_ID_FOLLOWER && !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) + { + objEvent = GetFollowerObject(); + // return early if no follower or in shadowing state + if (objEvent == NULL || gSprites[objEvent->spriteId].data[1] == 0) + return FALSE; + ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); + ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_FOLLOWER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, EnterPokeballMovement); } return FALSE; } @@ -1035,7 +1038,8 @@ bool8 ScrCmd_applymovementat(struct ScriptContext *ctx) static bool8 WaitForMovementFinish(void) { - if (ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapNum, sMovingNpcMapGroup)) { + if (ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapNum, sMovingNpcMapGroup)) + { struct ObjectEvent *objEvent = GetFollowerObject(); // If the follower is still entering the pokeball, wait for it to finish too // This prevents a `release` after this script command from getting the follower stuck in an intermediate state @@ -2074,9 +2078,9 @@ bool8 ScrCmd_playmoncry(struct ScriptContext *ctx) bool8 ScrFunc_playfirstmoncry(struct ScriptContext *ctx) { - u16 species = GetMonData(GetFirstLiveMon(), MON_DATA_SPECIES); - PlayCry_Script(species, 0); - return FALSE; + u16 species = GetMonData(GetFirstLiveMon(), MON_DATA_SPECIES); + PlayCry_Script(species, 0); + return FALSE; } bool8 ScrCmd_waitmoncry(struct ScriptContext *ctx) diff --git a/src/shop.c b/src/shop.c index 222ee181b7..c105765a75 100644 --- a/src/shop.c +++ b/src/shop.c @@ -867,7 +867,10 @@ static void BuyMenuCollectObjectEventData(void) u8 objEventId = GetObjectEventIdByXY(facingX - 4 + x, facingY - 2 + y); // skip if invalid or an overworld pokemon that is not following the player - if (objEventId != OBJECT_EVENTS_COUNT && !(gObjectEvents[objEventId].active && gObjectEvents[objEventId].graphicsId == OBJ_EVENT_GFX_OW_MON && gObjectEvents[objEventId].localId != OBJ_EVENT_ID_FOLLOWER)) + if (objEventId != OBJECT_EVENTS_COUNT + && !(gObjectEvents[objEventId].active + && gObjectEvents[objEventId].graphicsId == OBJ_EVENT_GFX_OW_MON + && gObjectEvents[objEventId].localId != OBJ_EVENT_ID_FOLLOWER)) { sShopData->viewportObjects[numObjects][OBJ_EVENT_ID] = objEventId; sShopData->viewportObjects[numObjects][X_COORD] = x; diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index b185e87048..a25eaa5fb0 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -339,7 +339,7 @@ u16 FreeAndDestroyMonPicSprite(u16 spriteId) u16 FreeAndDestroyMonPicSpriteNoPalette(u16 spriteId) { - return FreeAndDestroyPicSpriteInternal(spriteId, FALSE); + return FreeAndDestroyPicSpriteInternal(spriteId, FALSE); } static u16 UNUSED LoadMonPicInWindow(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId) diff --git a/src/trainer_see.c b/src/trainer_see.c index 95b11447f2..94180168fc 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -152,101 +152,112 @@ static const struct SpriteFrameImage sSpriteImageTable_HeartIcon[] = static const struct SpriteFrameImage sSpriteImageTable_Emotes[] = { - { .data = (u8 *)sEmotion_Gfx+0*0x80, .size = 0x80}, // FOLLOWER_EMOTION_HAPPY - { .data = (u8 *)sEmotion_Gfx+1*0x80, .size = 0x80}, // FOLLOWER_EMOTION_HAPPY - { .data = (u8 *)sEmotion_Gfx+2*0x80, .size = 0x80}, // FOLLOWER_EMOTION_NEUTRAL - { .data = (u8 *)sEmotion_Gfx+3*0x80, .size = 0x80}, // FOLLOWER_EMOTION_NEUTRAL - { .data = (u8 *)sEmotion_Gfx+4*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SAD - { .data = (u8 *)sEmotion_Gfx+5*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SAD - { .data = (u8 *)sEmotion_Gfx+6*0x80, .size = 0x80}, // FOLLOWER_EMOTION_UPSET - { .data = (u8 *)sEmotion_Gfx+7*0x80, .size = 0x80}, // FOLLOWER_EMOTION_UPSET - { .data = (u8 *)sEmotion_Gfx+8*0x80, .size = 0x80}, // FOLLOWER_EMOTION_ANGRY - { .data = (u8 *)sEmotion_Gfx+9*0x80, .size = 0x80}, // FOLLOWER_EMOTION_ANGRY - { .data = (u8 *)sEmotion_Gfx+10*0x80, .size = 0x80}, // FOLLOWER_EMOTION_PENSIVE - { .data = (u8 *)sEmotion_Gfx+11*0x80, .size = 0x80}, // FOLLOWER_EMOTION_PENSIVE - { .data = (u8 *)sEmotion_Gfx+12*0x80, .size = 0x80}, // FOLLOWER_EMOTION_LOVE - { .data = (u8 *)sEmotion_Gfx+13*0x80, .size = 0x80}, // FOLLOWER_EMOTION_LOVE - { .data = (u8 *)sEmotion_Gfx+14*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SURPRISE - { .data = (u8 *)sEmotion_Gfx+15*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SURPRISE - { .data = (u8 *)sEmotion_Gfx+16*0x80, .size = 0x80}, // FOLLOWER_EMOTION_CURIOUS - { .data = (u8 *)sEmotion_Gfx+17*0x80, .size = 0x80}, // FOLLOWER_EMOTION_CURIOUS - { .data = (u8 *)sEmotion_Gfx+18*0x80, .size = 0x80}, // FOLLOWER_EMOTION_MUSIC - { .data = (u8 *)sEmotion_Gfx+19*0x80, .size = 0x80}, // FOLLOWER_EMOTION_MUSIC - { .data = (u8 *)sEmotion_Gfx+20*0x80, .size = 0x80}, // FOLLOWER_EMOTION_POISONED - { .data = (u8 *)sEmotion_Gfx+21*0x80, .size = 0x80}, // FOLLOWER_EMOTION_POISONED + { .data = (u8 *)sEmotion_Gfx + 0 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_HAPPY + { .data = (u8 *)sEmotion_Gfx + 1 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_HAPPY + { .data = (u8 *)sEmotion_Gfx + 2 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_NEUTRAL + { .data = (u8 *)sEmotion_Gfx + 3 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_NEUTRAL + { .data = (u8 *)sEmotion_Gfx + 4 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_SAD + { .data = (u8 *)sEmotion_Gfx + 5 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_SAD + { .data = (u8 *)sEmotion_Gfx + 6 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_UPSET + { .data = (u8 *)sEmotion_Gfx + 7 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_UPSET + { .data = (u8 *)sEmotion_Gfx + 8 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_ANGRY + { .data = (u8 *)sEmotion_Gfx + 9 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_ANGRY + { .data = (u8 *)sEmotion_Gfx + 10 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_PENSIVE + { .data = (u8 *)sEmotion_Gfx + 11 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_PENSIVE + { .data = (u8 *)sEmotion_Gfx + 12 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_LOVE + { .data = (u8 *)sEmotion_Gfx + 13 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_LOVE + { .data = (u8 *)sEmotion_Gfx + 14 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_SURPRISE + { .data = (u8 *)sEmotion_Gfx + 15 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_SURPRISE + { .data = (u8 *)sEmotion_Gfx + 16 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_CURIOUS + { .data = (u8 *)sEmotion_Gfx + 17 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_CURIOUS + { .data = (u8 *)sEmotion_Gfx + 18 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_MUSIC + { .data = (u8 *)sEmotion_Gfx + 19 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_MUSIC + { .data = (u8 *)sEmotion_Gfx + 20 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_POISONED + { .data = (u8 *)sEmotion_Gfx + 21 * 0x80, .size = 0x80}, // FOLLOWER_EMOTION_POISONED }; -static const union AnimCmd sSpriteAnim_Emotes0[] = { +static const union AnimCmd sSpriteAnim_Emotes0[] = +{ ANIMCMD_FRAME(0*2, 30), ANIMCMD_FRAME(0*2+1, 25), ANIMCMD_FRAME(0*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes1[] = { +static const union AnimCmd sSpriteAnim_Emotes1[] = +{ ANIMCMD_FRAME(1*2, 30), ANIMCMD_FRAME(1*2+1, 25), ANIMCMD_FRAME(1*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes2[] = { +static const union AnimCmd sSpriteAnim_Emotes2[] = +{ ANIMCMD_FRAME(2*2, 30), ANIMCMD_FRAME(2*2+1, 25), ANIMCMD_FRAME(2*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes3[] = { +static const union AnimCmd sSpriteAnim_Emotes3[] = +{ ANIMCMD_FRAME(3*2, 30), ANIMCMD_FRAME(3*2+1, 25), ANIMCMD_FRAME(3*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes4[] = { +static const union AnimCmd sSpriteAnim_Emotes4[] = +{ ANIMCMD_FRAME(4*2, 30), ANIMCMD_FRAME(4*2+1, 25), ANIMCMD_FRAME(4*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes5[] = { +static const union AnimCmd sSpriteAnim_Emotes5[] = +{ ANIMCMD_FRAME(5*2, 30), ANIMCMD_FRAME(5*2+1, 25), ANIMCMD_FRAME(5*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes6[] = { +static const union AnimCmd sSpriteAnim_Emotes6[] = +{ ANIMCMD_FRAME(6*2, 30), ANIMCMD_FRAME(6*2+1, 25), ANIMCMD_FRAME(6*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes7[] = { +static const union AnimCmd sSpriteAnim_Emotes7[] = +{ ANIMCMD_FRAME(7*2, 30), ANIMCMD_FRAME(7*2+1, 25), ANIMCMD_FRAME(7*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes8[] = { +static const union AnimCmd sSpriteAnim_Emotes8[] = +{ ANIMCMD_FRAME(8*2, 30), ANIMCMD_FRAME(8*2+1, 25), ANIMCMD_FRAME(8*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes9[] = { +static const union AnimCmd sSpriteAnim_Emotes9[] = +{ ANIMCMD_FRAME(9*2, 30), ANIMCMD_FRAME(9*2+1, 25), ANIMCMD_FRAME(9*2, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Emotes10[] = { +static const union AnimCmd sSpriteAnim_Emotes10[] = +{ ANIMCMD_FRAME(10*2, 30), ANIMCMD_FRAME(10*2+1, 25), ANIMCMD_FRAME(10*2, 30), @@ -271,7 +282,8 @@ static const union AnimCmd *const sSpriteAnimTable_Icons[] = sSpriteAnim_Icons2 }; -static const union AnimCmd *const sSpriteAnimTable_Emotes[] = { +static const union AnimCmd *const sSpriteAnimTable_Emotes[] = +{ sSpriteAnim_Emotes0, sSpriteAnim_Emotes1, sSpriteAnim_Emotes2, @@ -311,8 +323,9 @@ static const struct SpriteTemplate sSpriteTemplate_HeartIcon = .callback = SpriteCB_TrainerIcons }; -static const struct SpriteTemplate sSpriteTemplate_Emote = { - .tileTag = 0xffff, +static const struct SpriteTemplate sSpriteTemplate_Emote = +{ + .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_EMOTES, .oam = &sOamData_Icons, .anims = sSpriteAnimTable_Emotes, @@ -831,9 +844,10 @@ u8 FldEff_ExclamationMarkIcon(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53); - if (spriteId != MAX_SPRITES) { - SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 0); - UpdateSpritePaletteByTemplate(&sSpriteTemplate_ExclamationQuestionMark, &gSprites[spriteId]); + if (spriteId != MAX_SPRITES) + { + SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 0); + UpdateSpritePaletteByTemplate(&sSpriteTemplate_ExclamationQuestionMark, &gSprites[spriteId]); } return 0; @@ -842,20 +856,23 @@ u8 FldEff_ExclamationMarkIcon(void) u8 FldEff_QuestionMarkIcon(void) { u8 spriteId; - if (gFieldEffectArguments[7] >= 0) { // Use follower emotes - u8 emotion = gFieldEffectArguments[7]; - spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emote, 0, 0, 0x52); - if (spriteId == MAX_SPRITES) + if (gFieldEffectArguments[7] >= 0) + { + // Use follower emotes + u8 emotion = gFieldEffectArguments[7]; + spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emote, 0, 0, 0x52); + if (spriteId == MAX_SPRITES) + return 0; + SetIconSpriteData(&gSprites[spriteId], FLDEFF_EMOTE, emotion); // Set animation based on emotion + UpdateSpritePaletteByTemplate(&sSpriteTemplate_Emote, &gSprites[spriteId]); return 0; - SetIconSpriteData(&gSprites[spriteId], FLDEFF_EMOTE, emotion); // Set animation based on emotion - UpdateSpritePaletteByTemplate(&sSpriteTemplate_Emote, &gSprites[spriteId]); - return 0; } spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x52); - if (spriteId != MAX_SPRITES) { - SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON, 1); - UpdateSpritePaletteByTemplate(&sSpriteTemplate_ExclamationQuestionMark, &gSprites[spriteId]); + if (spriteId != MAX_SPRITES) + { + SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON, 1); + UpdateSpritePaletteByTemplate(&sSpriteTemplate_ExclamationQuestionMark, &gSprites[spriteId]); } return 0; From a407c7223588dd3d188b5d785314e5ebf223e1e2 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Thu, 25 Jan 2024 22:40:00 -0500 Subject: [PATCH 03/12] Cleaned up follower code. Added support for asymmetrical follower pokemon. Fixed bug with changing GraphicsInfo size. Added follower Substitute gfx. Credit: shikashipx --- data/scripts/follower.inc | 11 - gflib/sprite.c | 1 - gflib/sprite.h | 1 + .../object_events/pics/pokemon/substitute.png | Bin 0 -> 8090 bytes .../object_events/pics/pokemon/wailord.png | Bin 10094 -> 1259 bytes include/constants/event_object_movement.h | 5 + include/event_object_movement.h | 1 + include/follower_helper.h | 1 + include/global.fieldmap.h | 5 + remote_build.sh | 22 +- spritesheet_rules.mk | 3 + src/data/object_events/object_event_anims.h | 149 ++- .../object_events/object_event_graphics.h | 3 + .../object_event_graphics_info_followers.h | 2 + .../object_events/object_event_pic_tables.h | 8 + src/data/text/follower_messages.h | 8 +- src/event_object_movement.c | 989 +++++++++--------- src/field_effect_helpers.c | 8 +- src/follower_helper.c | 15 + src/scrcmd.c | 6 +- src/trainer_see.c | 44 +- 21 files changed, 738 insertions(+), 544 deletions(-) create mode 100644 graphics/object_events/pics/pokemon/substitute.png diff --git a/data/scripts/follower.inc b/data/scripts/follower.inc index 3a81e6fabf..6d1d3f0024 100644 --- a/data/scripts/follower.inc +++ b/data/scripts/follower.inc @@ -30,17 +30,6 @@ EventScript_Follower:: bufferlivemonnickname 0 playfirstmoncry callfunc ScrFunc_getfolloweraction - checkpartymove MOVE_FLY - compare VAR_RESULT 6 - goto_if_eq EventScript_FollowerEnd - bufferlivemonnickname 0 - msgbox gText_WantsToFly, MSGBOX_YESNO - switch VAR_RESULT - case NO, EventScript_FollowerEnd - case YES, EventScript_FollowerFly - case MULTI_B_PRESSED, EventScript_FollowerEnd -EventScript_FollowerFly:: - callfunc ScrFunc_followerfly EventScript_FollowerEnd:: waitfieldeffect FLDEFF_EMOTE release diff --git a/gflib/sprite.c b/gflib/sprite.c index 4540f59cc0..0b3447187c 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -56,7 +56,6 @@ static void AddSpritesToOamBuffer(void); static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); static void ResetOamMatrices(void); static void ResetSprite(struct Sprite *sprite); -static s16 AllocSpriteTiles(u16 tileCount); static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images); static void ResetAllSprites(void); static void BeginAnim(struct Sprite *sprite); diff --git a/gflib/sprite.h b/gflib/sprite.h index 86527bc4c0..2b2b083103 100644 --- a/gflib/sprite.h +++ b/gflib/sprite.h @@ -297,6 +297,7 @@ void InitSpriteAffineAnim(struct Sprite *sprite); void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation); u16 LoadSpriteSheet(const struct SpriteSheet *sheet); void LoadSpriteSheets(const struct SpriteSheet *sheets); +s16 AllocSpriteTiles(u16 tileCount); u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet); void AllocTilesForSpriteSheets(struct SpriteSheet *sheets); void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet); diff --git a/graphics/object_events/pics/pokemon/substitute.png b/graphics/object_events/pics/pokemon/substitute.png new file mode 100644 index 0000000000000000000000000000000000000000..6be1e2ddcb7cbebcff17911c34acb44502a8837b GIT binary patch literal 8090 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 V_DMFNP6BQL85x|>FVl6s@PAp&J*ofz literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/pokemon/wailord.png b/graphics/object_events/pics/pokemon/wailord.png index a1fc3a087a2641b82ead18cbd07042531268a140..a7032a856a462d258c35136f14fbb086810819d9 100644 GIT binary patch delta 1218 zcmV;z1U>uiPU{JOiBL{Q4GJ0x0000DNk~Le0004i0000$1Oos70O5AMi~s-t2XskI zMF-^x0uL)7YX%Va0000NbVXQnQ*UN;cVTj607pzjP)ME|7+^2GoE z1P@6>K~#90?U}o7+b|S{H4Einc<3$5fR7F^>Y2z-2ee0+R-e0+R-e0+R- ze0+R-UOMdY&tW`&AdKB(7jW@oQ{+LAXNPlA0Az@viyxg37=y*ZoD|a}8QBe8{P>Vd zfEjiNaW4FX;i3E)!YIW`9OncQ8L)KG#h)dc`Qe-kj+5j9>j281Bl%{YAIw#S*lWba zpCRn(VtkEFqbL`GlO5gxj2|CD>BX2*`z(TUA^7lscL3vmN9S%sW#)GW@en`>f_bKO z@#Ay5p>X~O==|g${_-6l6oeqyYQ(|0;8fK3$ld{zA0Gl`tkWRMxgdy@7A%6>ir<)i zp6AA&J(ZV&;tpdSK)4W8+$c!WiZAsR!Y@fOuBPa)DeK}Qe5VDI9sgsTCGt8qECxzY za+6>{@`~qw8W(=NzOMESFVlAX34+)66(?711%vVlDXu>u;m1e#lq)Vwf-Wuu85b0T zj0-Y@;C5c|jj2W)B_zj4$rl=vOY~%S{s5D4o{MuAZMeKXh5cp=sKKC^Rs7OaWFb68 zYuv@dvgPRx9{#{6-=vVX;ZiVz{ZbEwL6ESD8(*t`usbY*J)vKGkEbRmn2e^oIovbW zhF5}esW%IfiW{e)qN;Jz15%T);#vbmviB1i(dM4l#brWBlwe}IgW;mi4YQbQ7Aoq4 zywO8>Z>kD|=6=h?rC?qc)YptKt@EYc0VSwP#Pr_0t*--(8Y1v-^bX)$3c?l=RpSZV z=+A(EEbBbg8`x&?zWul`Oai3N8$Z_t=dHLBlnZ@XYr3FlqvD29Kt8VD@l!bbaQfXe zNb-s|mzjp(jDG63;_93w7nHAjBS;N`MV*^QX}&)BE(AZ`YJw^i*Dn4Bpr{K*{Z?E? zu4CmqpBdh|!a84=1YfOA#8->k{#T?*=RXHMsdg!j85g{3#~%gDSUZ4mzLKotWg4H_z8)fcHR!(PBM)Xveq7T}y?#4h z3YLnQtphmcxr>V|w!Dy{ob)<_*N~-2!H-oGHJ?(+;mesgbgoXS?y&I|y0|nfGQ=N$ z;j3Y9(CHL6!>G84qNv{-go?9t6^TRVQjizeV9@Q_z8<=`2m`>s?AbV3N4+>cT@Rx^ z_tWpM;xQXW5i@a_P0Sxuw=;|_U*BAuUq-w#V&7KnoE!4=A{j#`U0j{h>vlSW;i+v9 zI=I;NGL|gt9l*F4;_)yt)z6c-Jm)t#@8R%={lk`n2fujJ?97TCoG=wz`z|gbID%dL g=>PEe`26?$1;xtqUc5*DdH?_b07*qoM6N<$f)gM;{{R30 literal 10094 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 diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index f7c2d36284..cac4333689 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -276,6 +276,11 @@ #define ANIM_RUN_WEST (ANIM_STD_COUNT + 2) #define ANIM_RUN_EAST (ANIM_STD_COUNT + 3) +#define ANIM_EXIT_POKEBALL_FAST_SOUTH (ANIM_STD_COUNT + 0) +#define ANIM_EXIT_POKEBALL_FAST_NORTH (ANIM_STD_COUNT + 1) +#define ANIM_EXIT_POKEBALL_FAST_WEST (ANIM_STD_COUNT + 2) +#define ANIM_EXIT_POKEBALL_FAST_EAST (ANIM_STD_COUNT + 3) + #define ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH (ANIM_STD_COUNT + 0) #define ANIM_BUNNY_HOP_BACK_WHEEL_NORTH (ANIM_STD_COUNT + 1) #define ANIM_BUNNY_HOP_BACK_WHEEL_WEST (ANIM_STD_COUNT + 2) diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 1b4f1e1d9f..9c7ab50ede 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -289,6 +289,7 @@ void MovementType_FollowPlayer(struct Sprite *); u8 GetSlideMovementAction(u32); u8 GetJumpMovementAction(u32); u8 GetJump2MovementAction(u32); +u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); u8 MovementType_WanderAround_Step0(struct ObjectEvent *, struct Sprite *); diff --git a/include/follower_helper.h b/include/follower_helper.h index 115242fdb9..d8ab0621b1 100644 --- a/include/follower_helper.h +++ b/include/follower_helper.h @@ -125,5 +125,6 @@ enum { }; extern const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT]; +extern const struct FollowerMessagePool gFollowerBasicMessages[FOLLOWER_EMOTION_LENGTH]; #endif //GUARD_FOLLOWER_HELPER_H diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 0c07148ba2..9f1a210a27 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -272,6 +272,11 @@ enum { #define PLAYER_AVATAR_FLAG_FORCED_MOVE (1 << 6) #define PLAYER_AVATAR_FLAG_DASH (1 << 7) +#define PLAYER_AVATAR_FLAG_BIKE (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE) +// Player avatar flags for which follower pokemon are hidden +#define FOLLOWER_INVISIBLE_FLAGS (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_UNDERWATER | \ + PLAYER_AVATAR_FLAG_BIKE | PLAYER_AVATAR_FLAG_FORCED_MOVE) + enum { ACRO_BIKE_NORMAL, diff --git a/remote_build.sh b/remote_build.sh index 03e3e54b1a..835520290d 100644 --- a/remote_build.sh +++ b/remote_build.sh @@ -11,7 +11,23 @@ remote_path=$(git remote get-url build | sed -nr -e "s/ssh:\/\/\w+@?\w*://p") # make_cmd=$(git config --local remake.make) make_product=$(git config --local remake.src) make_dest=$(git config --local remake.dest) -set -x +old_head=$(git rev-parse --short @) +set +e +# Make a temp commit for unstaged changes +temp_commit_msg="temp build" +git commit -aem "$temp_commit_msg" +retVal=$? +set -e +# set -x git push build --force-with-lease -ssh $remote_host "cd $remote_path && git reset --hard && git checkout $git_branch && $make_cmd" -scp "$remote_host:$remote_path/$make_product" $make_dest +# { set +x; } 2>/dev/null +# Reset temp commit +if [[ $retVal -eq 0 ]]; then + commit_msg=$(git log -1 --pretty=%B) + if [[ "$commit_msg" == "$temp_commit_msg" ]]; then + git reset "$old_head" &>/dev/null + fi +fi +set -x +ssh -o "VisualHostKey=no" $remote_host "cd $remote_path && git reset --hard && git checkout $git_branch && $make_cmd" +scp -o "VisualHostKey=no" "$remote_host:$remote_path/$make_product" $make_dest diff --git a/spritesheet_rules.mk b/spritesheet_rules.mk index 902eb1c892..5eb25228a7 100644 --- a/spritesheet_rules.mk +++ b/spritesheet_rules.mk @@ -687,6 +687,9 @@ $(FLDEFFGFXDIR)/secret_power_tree.4bpp: %.4bpp: %.png $(FLDEFFGFXDIR)/record_mix_lights.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 1 +$(OBJEVENTGFXDIR)/pokemon/substitute.4bpp: %.4bpp: %.png + $(GFX) $< $@ -mwidth 4 -mheight 4 + $(OBJEVENTGFXDIR)/pokemon/bulbasaur.4bpp: %.4bpp: %.png $(GFX) $< $@ -mwidth 4 -mheight 4 diff --git a/src/data/object_events/object_event_anims.h b/src/data/object_events/object_event_anims.h index 8bb579e01b..1faf48e759 100755 --- a/src/data/object_events/object_event_anims.h +++ b/src/data/object_events/object_event_anims.h @@ -217,6 +217,12 @@ static const union AnimCmd sAnim_FaceEast2F[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_FaceEast2F_Asym[] = +{ + ANIMCMD_FRAME(6, 16), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_GoSouth[] = { ANIMCMD_FRAME(3, 8), @@ -246,11 +252,11 @@ static const union AnimCmd sAnim_GoNorth[] = static const union AnimCmd sAnim_GoNorth2F[] = { - ANIMCMD_FRAME(2, 6), - ANIMCMD_FRAME(3, 6), - ANIMCMD_FRAME(3, 6), - ANIMCMD_FRAME(2, 6), - ANIMCMD_JUMP(0), + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(2, 6), + ANIMCMD_JUMP(0), }; static const union AnimCmd sAnim_GoWest[] = @@ -289,6 +295,15 @@ static const union AnimCmd sAnim_GoEast2F[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_GoEast2F_Asym[] = +{ + ANIMCMD_FRAME(6, 6), + ANIMCMD_FRAME(7, 6), + ANIMCMD_FRAME(7, 6), + ANIMCMD_FRAME(6, 6), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_GoFastSouth[] = { ANIMCMD_FRAME(3, 4), @@ -361,6 +376,15 @@ static const union AnimCmd sAnim_GoFastEast2F[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_GoFastEast2F_Asym[] = +{ + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(7, 4), + ANIMCMD_FRAME(7, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_GoFasterSouth[] = { ANIMCMD_FRAME(3, 2), @@ -422,6 +446,19 @@ static const union AnimCmd sAnim_ExitPokeballEast[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_ExitPokeballEast_Asym[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(6, 8), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_EnterSouth[] = { ANIMCMD_FRAME(0, 8), @@ -497,6 +534,18 @@ static const union AnimCmd sAnim_EnterEast[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_EnterEast_Asym[] = +{ + ANIMCMD_FRAME(6, 8), + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(0, 3), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_GoFastestSouth[] = { ANIMCMD_FRAME(3, 1), @@ -554,6 +603,18 @@ static const union AnimCmd sAnim_ExitPokeballFastEast[] = ANIMCMD_JUMP(0), }; +static const union AnimCmd sAnim_ExitPokeballFastEast_Asym[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(6, 2), + ANIMCMD_FRAME(6, 1), + ANIMCMD_JUMP(0), +}; + static const union AnimCmd sAnim_GoFastestNorth[] = { ANIMCMD_FRAME(5, 1), @@ -1084,31 +1145,59 @@ static const union AnimCmd *const sAnimTable_Standard[] = { }; static const union AnimCmd *const sAnimTable_Following[] = { - sAnim_FaceSouth, - sAnim_FaceNorth2F, - sAnim_FaceWest2F, - sAnim_FaceEast2F, - sAnim_GoSouth2F, - sAnim_GoNorth2F, - sAnim_GoWest2F, - sAnim_GoEast2F, - sAnim_GoFastSouth2F, - sAnim_GoFastNorth2F, - sAnim_GoFastWest2F, - sAnim_GoFastEast2F, - sAnim_EnterSouth, - sAnim_EnterNorth, - sAnim_EnterWest, - sAnim_EnterEast, - sAnim_ExitPokeballSouth, - sAnim_ExitPokeballNorth, - sAnim_ExitPokeballWest, - sAnim_ExitPokeballEast, - // ANIM_STD_COUNT = - sAnim_ExitPokeballFastSouth, - sAnim_ExitPokeballFastNorth, - sAnim_ExitPokeballFastWest, - sAnim_ExitPokeballFastEast, + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth2F, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest2F, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast2F, + [ANIM_STD_GO_SOUTH] = sAnim_GoSouth2F, + [ANIM_STD_GO_NORTH] = sAnim_GoNorth2F, + [ANIM_STD_GO_WEST] = sAnim_GoWest2F, + [ANIM_STD_GO_EAST] = sAnim_GoEast2F, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth2F, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth2F, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest2F, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast2F, + // 'Faster' and above used for entering/exiting pokeball + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_EnterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_EnterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_EnterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_EnterEast, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_ExitPokeballSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_ExitPokeballNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_ExitPokeballWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_ExitPokeballEast, + [ANIM_EXIT_POKEBALL_FAST_SOUTH] = sAnim_ExitPokeballFastSouth, + [ANIM_EXIT_POKEBALL_FAST_NORTH] = sAnim_ExitPokeballFastNorth, + [ANIM_EXIT_POKEBALL_FAST_WEST] = sAnim_ExitPokeballFastWest, + [ANIM_EXIT_POKEBALL_FAST_EAST] = sAnim_ExitPokeballFastEast, +}; + +// Like the above, but has separate frames for facing right +static const union AnimCmd *const sAnimTable_Following_Asym[] = { + [ANIM_STD_FACE_SOUTH] = sAnim_FaceSouth, + [ANIM_STD_FACE_NORTH] = sAnim_FaceNorth2F, + [ANIM_STD_FACE_WEST] = sAnim_FaceWest2F, + [ANIM_STD_FACE_EAST] = sAnim_FaceEast2F_Asym, + [ANIM_STD_GO_SOUTH] = sAnim_GoSouth2F, + [ANIM_STD_GO_NORTH] = sAnim_GoNorth2F, + [ANIM_STD_GO_WEST] = sAnim_GoWest2F, + [ANIM_STD_GO_EAST] = sAnim_GoEast2F_Asym, + [ANIM_STD_GO_FAST_SOUTH] = sAnim_GoFastSouth2F, + [ANIM_STD_GO_FAST_NORTH] = sAnim_GoFastNorth2F, + [ANIM_STD_GO_FAST_WEST] = sAnim_GoFastWest2F, + [ANIM_STD_GO_FAST_EAST] = sAnim_GoFastEast2F_Asym, + [ANIM_STD_GO_FASTER_SOUTH] = sAnim_EnterSouth, + [ANIM_STD_GO_FASTER_NORTH] = sAnim_EnterNorth, + [ANIM_STD_GO_FASTER_WEST] = sAnim_EnterWest, + [ANIM_STD_GO_FASTER_EAST] = sAnim_EnterEast_Asym, + [ANIM_STD_GO_FASTEST_SOUTH] = sAnim_ExitPokeballSouth, + [ANIM_STD_GO_FASTEST_NORTH] = sAnim_ExitPokeballNorth, + [ANIM_STD_GO_FASTEST_WEST] = sAnim_ExitPokeballWest, + [ANIM_STD_GO_FASTEST_EAST] = sAnim_ExitPokeballEast_Asym, + [ANIM_EXIT_POKEBALL_FAST_SOUTH] = sAnim_ExitPokeballFastSouth, + [ANIM_EXIT_POKEBALL_FAST_NORTH] = sAnim_ExitPokeballFastNorth, + [ANIM_EXIT_POKEBALL_FAST_WEST] = sAnim_ExitPokeballFastWest, + [ANIM_EXIT_POKEBALL_FAST_EAST] = sAnim_ExitPokeballFastEast_Asym, }; static const union AnimCmd *const sAnimTable_HoOh[] = { diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 3a658aa15e..4d1a2cae1c 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -392,6 +392,7 @@ const u32 gObjectEventPic_StrangeBall[] = INCBIN_U32("graphics/object_events/pic #endif #endif +const u32 gObjectEventPic_Substitute[] = INCBIN_U32("graphics/object_events/pics/pokemon/substitute.4bpp"); const u32 gObjectEventPic_Bulbasaur[] = INCBIN_U32("graphics/object_events/pics/pokemon/bulbasaur.4bpp"); const u32 gObjectEventPic_Ivysaur[] = INCBIN_U32("graphics/object_events/pics/pokemon/ivysaur.4bpp"); const u32 gObjectEventPic_Venusaur[] = INCBIN_U32("graphics/object_events/pics/pokemon/venusaur.4bpp"); @@ -836,6 +837,8 @@ const u32 gObjectEventPic_RayquazaCutscene[] = INCBIN_U32("graphics/object_event const u16 gObjectEventPal_HoOh[] = INCBIN_U16("graphics/object_events/palettes/ho_oh.gbapal"); const u16 gObjectEventPal_Lugia[] = INCBIN_U16("graphics/object_events/palettes/lugia.gbapal"); +const u16 gObjectEventPal_Substitute[] = INCBIN_U16("graphics/object_events/pics/pokemon/substitute.gbapal"); + const u16 gObjectEventPaletteEmotes[] = INCBIN_U16("graphics/misc/emotes.gbapal"); #if OW_MON_POKEBALLS diff --git a/src/data/object_events/object_event_graphics_info_followers.h b/src/data/object_events/object_event_graphics_info_followers.h index 6eeccde765..744df41706 100644 --- a/src/data/object_events/object_event_graphics_info_followers.h +++ b/src/data/object_events/object_event_graphics_info_followers.h @@ -1,5 +1,7 @@ // Species-indexed pokemon object event table const struct ObjectEventGraphicsInfo gPokemonObjectGraphics[] = { + // placeholder gfx, used when other gfx aren't found + [SPECIES_NONE] = {0xFFFF, OBJ_EVENT_PAL_TAG_SUBSTITUTE, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Substitute, gDummySpriteAffineAnimTable}, [SPECIES_BULBASAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Bulbasaur, gDummySpriteAffineAnimTable}, [SPECIES_IVYSAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Ivysaur, gDummySpriteAffineAnimTable}, [SPECIES_VENUSAUR] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Venusaur, gDummySpriteAffineAnimTable}, diff --git a/src/data/object_events/object_event_pic_tables.h b/src/data/object_events/object_event_pic_tables.h index bcd5f64e90..b2d2d15689 100755 --- a/src/data/object_events/object_event_pic_tables.h +++ b/src/data/object_events/object_event_pic_tables.h @@ -2117,6 +2117,14 @@ static const struct SpriteFrameImage sPicTable_Ball_STRANGE[] = { #endif +static const struct SpriteFrameImage sPicTable_Substitute[] = { + overworld_frame(gObjectEventPic_Substitute, 4, 4, 0), + overworld_frame(gObjectEventPic_Substitute, 4, 4, 1), + overworld_frame(gObjectEventPic_Substitute, 4, 4, 2), + overworld_frame(gObjectEventPic_Substitute, 4, 4, 3), + overworld_frame(gObjectEventPic_Substitute, 4, 4, 4), + overworld_frame(gObjectEventPic_Substitute, 4, 4, 5), +}; static const struct SpriteFrameImage sPicTable_Bulbasaur[] = { overworld_frame(gObjectEventPic_Bulbasaur, 4, 4, 0), overworld_frame(gObjectEventPic_Bulbasaur, 4, 4, 1), diff --git a/src/data/text/follower_messages.h b/src/data/text/follower_messages.h index 3fbec109cc..7678992f22 100644 --- a/src/data/text/follower_messages.h +++ b/src/data/text/follower_messages.h @@ -50,7 +50,7 @@ static const u8 sHappyMsg27[] = _("Your POKéMON is smelling the scent\nof flowe static const u8 sHappyMsg28[] = _("{STR_VAR_1} seems very happy to see\nyou!"); static const u8 sHappyMsg29[] = _("{STR_VAR_1} faced this way and\ngrinned."); static const u8 sHappyMsg30[] = _("{STR_VAR_1} happily cuddled up to\nyou!"); - // Conditional messages begin here, index 31 +// Conditional messages begin here, index 31 static const u8 sHappyMsg31[] = _("Your POKéMON seems happy about the\ngreat weather."); static const u8 sHappyMsg32[] = _("{STR_VAR_1} is very composed and\nsure of itself!"); @@ -106,7 +106,7 @@ const struct FollowerMsgInfo gFollowerNeutralMessages[] = { static const u8 sSadMsg00[] = _("{STR_VAR_1} is dizzy."); static const u8 sSadMsg01[] = _("{STR_VAR_1} is stepping on your\nfeet!"); static const u8 sSadMsg02[] = _("{STR_VAR_1} seems a little tired."); - // Conditional messages begin, index 3 +// Conditional messages begin, index 3 static const u8 sSadMsg03[] = _("{STR_VAR_1} is not happy."); static const u8 sSadMsg04[] = _("{STR_VAR_1} is going to fall down!\n"); static const u8 sSadMsg05[] = _("{STR_VAR_1} seems to be about to\nfall over!"); @@ -123,7 +123,7 @@ const struct FollowerMsgInfo gFollowerSadMessages[] = { static const u8 sUpsetMsg00[] = _("{STR_VAR_1} seems unhappy somehow…"); static const u8 sUpsetMsg01[] = _("{STR_VAR_1} is making an unhappy\nface."); static const u8 sUpsetMsg02[] = _("…Your POKéMON seems a little\ncold."); - // Conditional messages, index 3 +// Conditional messages, index 3 static const u8 sUpsetMsg03[] = _("{STR_VAR_1} is taking shelter in the\ngrass from the rain."); const struct FollowerMsgInfo gFollowerUpsetMessages[] = { @@ -225,7 +225,7 @@ static const u8 sSurpriseMsg16[] = _("{STR_VAR_1} sensed something strange\nand static const u8 sSurpriseMsg17[] = _("{STR_VAR_1} is scared and snuggled\nup to you!"); static const u8 sSurpriseMsg18[] = _("{STR_VAR_1} is feeling an unusual\npresence…"); static const u8 sSurpriseMsg19[] = _("{STR_VAR_1} is getting tense with\nnervous energy."); - // Conditional messages, index 20 +// Conditional messages, index 20 static const u8 sSurpriseMsg20[] = _("{STR_VAR_1} seems to be very\nsurprised that it is raining!"); const struct FollowerMsgInfo gFollowerSurpriseMessages[] = { diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 0c2116437f..a428dd2aed 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -520,6 +520,8 @@ const u8 gInitialMovementTypeFacingDirections[] = { // Gen VIII #define OBJ_EVENT_PAL_TAG_BALL_STRANGE 0x116A #endif +// Used as a placeholder follower graphic +#define OBJ_EVENT_PAL_TAG_SUBSTITUTE 0x7611 #define OBJ_EVENT_PAL_TAG_EMOTES 0x8002 // Not a real OW palette tag; used for the white flash applied to followers #define OBJ_EVENT_PAL_TAG_WHITE (OBJ_EVENT_PAL_TAG_NONE - 1) @@ -620,6 +622,7 @@ static const struct SpritePalette sObjectEventSpritePalettes[] = { {gObjectEventPal_StrangeBall, OBJ_EVENT_PAL_TAG_BALL_STRANGE}, #endif #endif + {gObjectEventPal_Substitute, OBJ_EVENT_PAL_TAG_SUBSTITUTE}, {gObjectEventPaletteEmotes, OBJ_EVENT_PAL_TAG_EMOTES}, {NULL, OBJ_EVENT_PAL_TAG_NONE}, }; @@ -1578,47 +1581,47 @@ static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEven static u8 TrySpawnObjectEventTemplate(const struct ObjectEventTemplate *objectEventTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) { - u8 objectEventId; - struct SpriteTemplate spriteTemplate; - struct SpriteFrameImage spriteFrameImage; - const struct ObjectEventGraphicsInfo *graphicsInfo; - const struct SubspriteTable *subspriteTables = NULL; + u8 objectEventId; + struct SpriteTemplate spriteTemplate; + struct SpriteFrameImage spriteFrameImage; + const struct ObjectEventGraphicsInfo *graphicsInfo; + const struct SubspriteTable *subspriteTables = NULL; - graphicsInfo = GetObjectEventGraphicsInfo(objectEventTemplate->graphicsId); - MakeSpriteTemplateFromObjectEventTemplate(objectEventTemplate, &spriteTemplate, &subspriteTables); - spriteFrameImage.size = graphicsInfo->size; - spriteTemplate.images = &spriteFrameImage; - objectEventId = TrySetupObjectEventSprite(objectEventTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY); - if (objectEventId == OBJECT_EVENTS_COUNT) - return OBJECT_EVENTS_COUNT; + graphicsInfo = GetObjectEventGraphicsInfo(objectEventTemplate->graphicsId); + MakeSpriteTemplateFromObjectEventTemplate(objectEventTemplate, &spriteTemplate, &subspriteTables); + spriteFrameImage.size = graphicsInfo->size; + spriteTemplate.images = &spriteFrameImage; + objectEventId = TrySetupObjectEventSprite(objectEventTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY); + if (objectEventId == OBJECT_EVENTS_COUNT) + return OBJECT_EVENTS_COUNT; - gSprites[gObjectEvents[objectEventId].spriteId].images = graphicsInfo->images; - if (subspriteTables) - SetSubspriteTables(&gSprites[gObjectEvents[objectEventId].spriteId], subspriteTables); + gSprites[gObjectEvents[objectEventId].spriteId].images = graphicsInfo->images; + if (subspriteTables) + SetSubspriteTables(&gSprites[gObjectEvents[objectEventId].spriteId], subspriteTables); - // Set species based on script header - if (objectEventTemplate->graphicsId == OBJ_EVENT_GFX_OW_MON && objectEventTemplate->script) { - const u8 *script = objectEventTemplate->script; - if (script[0] == 0x7d) { // bufferspeciesname - u16 species; - u8 form; - bool8 shiny; - gObjectEvents[objectEventId].extra.asU16 = script[2] | script[3] << 8; - species = gObjectEvents[objectEventId].extra.mon.species; - form = gObjectEvents[objectEventId].extra.mon.form; - shiny = gObjectEvents[objectEventId].extra.mon.shiny; - FollowerSetGraphics(&gObjectEvents[objectEventId], species, form, shiny); + // Set species based on script header + if (objectEventTemplate->graphicsId == OBJ_EVENT_GFX_OW_MON && objectEventTemplate->script) { + const u8 *script = objectEventTemplate->script; + if (script[0] == 0x7d) { // bufferspeciesname + u16 species; + u8 form; + bool8 shiny; + gObjectEvents[objectEventId].extra.asU16 = script[2] | script[3] << 8; + species = gObjectEvents[objectEventId].extra.mon.species; + form = gObjectEvents[objectEventId].extra.mon.form; + shiny = gObjectEvents[objectEventId].extra.mon.shiny; + FollowerSetGraphics(&gObjectEvents[objectEventId], species, form, shiny); + } + // Set runtime species based on VAR_TEMP_4, if template has a dynamic graphics ID + } else if (objectEventTemplate->graphicsId >= OBJ_EVENT_GFX_VARS && VarGetObjectEventGraphicsId(objectEventTemplate->graphicsId - OBJ_EVENT_GFX_VARS) == OBJ_EVENT_GFX_OW_MON) { + gObjectEvents[objectEventId].extra.asU16 = VarGet(VAR_TEMP_4); + FollowerSetGraphics(&gObjectEvents[objectEventId], + gObjectEvents[objectEventId].extra.mon.species, + gObjectEvents[objectEventId].extra.mon.form, + gObjectEvents[objectEventId].extra.mon.form); } - // Set runtime species based on VAR_TEMP_4, if template has a dynamic graphics ID - } else if (objectEventTemplate->graphicsId >= OBJ_EVENT_GFX_VARS && VarGetObjectEventGraphicsId(objectEventTemplate->graphicsId - OBJ_EVENT_GFX_VARS) == OBJ_EVENT_GFX_OW_MON) { - gObjectEvents[objectEventId].extra.asU16 = VarGet(VAR_TEMP_4); - FollowerSetGraphics(&gObjectEvents[objectEventId], - gObjectEvents[objectEventId].extra.mon.species, - gObjectEvents[objectEventId].extra.mon.form, - gObjectEvents[objectEventId].extra.mon.form); - } - return objectEventId; + return objectEventId; } u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *objectEventTemplate) @@ -1781,85 +1784,126 @@ u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevatio } struct Pokemon * GetFirstLiveMon(void) { // Return address of first conscious party mon or NULL - u8 i; - for (i=0; i 0 && !(gPlayerParty[i].box.isEgg || gPlayerParty[i].box.isBadEgg)) - return &gPlayerParty[i]; - } - return NULL; + u32 i; + for (i = 0; i < PARTY_SIZE; i++) { + if (gPlayerParty[i].hp > 0 && !(gPlayerParty[i].box.isEgg || gPlayerParty[i].box.isBadEgg)) + return &gPlayerParty[i]; + } + return NULL; } struct ObjectEvent * GetFollowerObject(void) { // Return follower ObjectEvent or NULL - u8 i; - for (i=0; i < OBJECT_EVENTS_COUNT; i++) { - if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && gObjectEvents[i].active) - return &gObjectEvents[i]; - } - return NULL; + u32 i; + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { + if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && gObjectEvents[i].active) + return &gObjectEvents[i]; + } + return NULL; } // Return graphicsInfo for a pokemon species & form static const struct ObjectEventGraphicsInfo * SpeciesToGraphicsInfo(u16 species, u8 form) { - const struct ObjectEventGraphicsInfo *graphicsInfo; - switch (species) { + const struct ObjectEventGraphicsInfo *graphicsInfo; + switch (species) + { case SPECIES_UNOWN: // Letters >A are defined as species >= NUM_SPECIES, so are not contiguous with A - form %= NUM_UNOWN_FORMS; - graphicsInfo = &gPokemonObjectGraphics[form ? SPECIES_UNOWN_B + form - 1 : species]; - break; + form %= NUM_UNOWN_FORMS; + graphicsInfo = &gPokemonObjectGraphics[form ? SPECIES_UNOWN_B + form - 1 : species]; + break; case SPECIES_CASTFORM: // Sunny, rainy, snowy forms stored separately - graphicsInfo = &gCastformObjectGraphics[form % NUM_CASTFORM_FORMS]; - break; + graphicsInfo = &gCastformObjectGraphics[form % NUM_CASTFORM_FORMS]; + break; default: - graphicsInfo = &gPokemonObjectGraphics[species]; - break; - } - return graphicsInfo->tileTag == 0xFFFF ? graphicsInfo : &gPokemonObjectGraphics[SPECIES_PORYGON]; // avoid OOB access + graphicsInfo = &gPokemonObjectGraphics[species]; + break; + } + // Try to avoid OOB or undefined access + if (graphicsInfo->tileTag == 0 && species < NUM_SPECIES) + return &gPokemonObjectGraphics[SPECIES_NONE]; + else if (graphicsInfo->tileTag != TAG_NONE && species >= NUM_SPECIES) + return &gPokemonObjectGraphics[SPECIES_NONE]; + else + return graphicsInfo; } // Find, or load, the palette for the specified pokemon info static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool8 shiny) { - u8 paletteNum; + u32 paletteNum; // Note that the shiny palette tag is `species + SPECIES_SHINY_TAG`, which must be increased with more pokemon // so that palette tags do not overlap const struct CompressedSpritePalette *spritePalette = &(shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species]; if ((paletteNum = IndexOfSpritePaletteTag(spritePalette->tag)) == 0xFF) { // Load compressed palette - LoadCompressedSpritePalette(spritePalette); - paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present - if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog - UpdateSpritePaletteWithWeather(paletteNum); + LoadCompressedSpritePalette(spritePalette); + paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present + if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog + UpdateSpritePaletteWithWeather(paletteNum); } return paletteNum; } // Set graphics & sprite for a follower object event by species & shininess. static void FollowerSetGraphics(struct ObjectEvent *objEvent, u16 species, u8 form, bool8 shiny) { - const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); - objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; - ObjectEventSetGraphics(objEvent, graphicsInfo); - objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; - objEvent->extra.mon.species = species; - objEvent->extra.mon.form = form; - objEvent->extra.mon.shiny = shiny; - if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { // Use palette from species palette table - struct Sprite *sprite = &gSprites[objEvent->spriteId]; - // Free palette if otherwise unused - sprite->inUse = FALSE; - FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); - sprite->inUse = TRUE; - sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny); - } else if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog - UpdateSpritePaletteWithWeather(gSprites[objEvent->spriteId].oam.paletteNum); + const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); + objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; + ObjectEventSetGraphics(objEvent, graphicsInfo); + objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON; + objEvent->extra.mon.species = species; + objEvent->extra.mon.form = form; + objEvent->extra.mon.shiny = shiny; + if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { // Use palette from species palette table + struct Sprite *sprite = &gSprites[objEvent->spriteId]; + // Free palette if otherwise unused + sprite->inUse = FALSE; + FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); + sprite->inUse = TRUE; + sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny); + } else if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog + UpdateSpritePaletteWithWeather(gSprites[objEvent->spriteId].oam.paletteNum); } -// Like FollowerSetGraphics, but does not reposition sprite; intended to be used for mid-movement form changes, etc. -// TODO: Reposition sprite if size changes +// Free a sprite's current tiles and reallocate with a new size +// Used when changing to a gfx info with a larger size +static s16 ReallocSpriteTiles(struct Sprite *sprite, u32 byteSize) { + s16 i; + bool32 wasVisible = sprite->invisible; + sprite->invisible = TRUE; + + i = CopySprite(sprite, sprite->x, sprite->y, 0xFF); + if (i < MAX_SPRITES) { + DestroySprite(&gSprites[i]); + i = AllocSpriteTiles(byteSize / TILE_SIZE_4BPP); + if (i >= 0) { + // Fill the allocated area with zeroes + // To avoid visual glitches if the frame hasn't been copied yet + CpuFastFill16(0, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * i, byteSize); + sprite->oam.tileNum = i; + } + } else { + i = -1; + } + + sprite->invisible = wasVisible; + return i; +} + +// Like FollowerSetGraphics, but does not recenter sprite on a metatile +// Intended to be used for mid-movement form changes, etc. static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) { u16 species = objEvent->extra.mon.species; u8 form = objEvent->extra.mon.form; u8 shiny = objEvent->extra.mon.shiny; const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form); struct Sprite *sprite = &gSprites[objEvent->spriteId]; - u8 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); + u32 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); + + #if LARGE_OW_SUPPORT + // If gfx size changes, we need to reallocate tiles + if (graphicsInfo->oam->size != sprite->oam.size) { + ReallocSpriteTiles(sprite, graphicsInfo->images->size); + // Add difference in Y vectors + sprite->y += -(graphicsInfo->height >> 1) - sprite->centerToCornerVecY; + } + #endif sprite->oam.shape = graphicsInfo->oam->shape; sprite->oam.size = graphicsInfo->oam->size; @@ -1924,118 +1968,112 @@ static bool8 GetFollowerInfo(u16 *species, u8 *form, u8 *shiny) { } void UpdateFollowingPokemon(void) { // Update following pokemon if any - struct ObjectEvent *objEvent = GetFollowerObject(); - struct Sprite *sprite; - u16 species; - bool8 shiny; - u8 form; - // Avoid spawning large (>32x32) follower pokemon inside buildings - if (GetFollowerInfo(&species, &form, &shiny) && !(gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, 0)->height > 32) && !FlagGet(FLAG_TEMP_HIDE_FOLLOWER)) { + struct ObjectEvent *objEvent = GetFollowerObject(); + struct Sprite *sprite; + u16 species; + bool8 shiny; + u8 form; + // Don't spawn follower if: + // 1. GetFollowerInfo returns FALSE + // 2. Map is indoors and gfx is larger than 32x32 + // 3. flag is set + if (!GetFollowerInfo(&species, &form, &shiny) || + (gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, 0)->oam->size > ST_OAM_SIZE_2) || + FlagGet(FLAG_TEMP_HIDE_FOLLOWER)) + { + RemoveFollowingPokemon(); + return; + } + if (objEvent == NULL) { // Spawn follower - struct ObjectEventTemplate template = { - .localId = OBJ_EVENT_ID_FOLLOWER, - .graphicsId = OBJ_EVENT_GFX_OW_MON, - .flagId = 0, - .x = gSaveBlock1Ptr->pos.x, - .y = gSaveBlock1Ptr->pos.y, - // If player active, copy player elevation - .elevation = gObjectEvents[gPlayerAvatar.objectEventId].active ? gObjectEvents[gPlayerAvatar.objectEventId].currentElevation : 3, - .movementType = MOVEMENT_TYPE_FOLLOW_PLAYER, - }; - objEvent = &gObjectEvents[SpawnSpecialObjectEvent(&template)]; - objEvent->invisible = TRUE; + u32 objId = gPlayerAvatar.objectEventId; + struct ObjectEventTemplate template = { + .localId = OBJ_EVENT_ID_FOLLOWER, + .graphicsId = OBJ_EVENT_GFX_OW_MON, + .flagId = 0, + .x = gSaveBlock1Ptr->pos.x, + .y = gSaveBlock1Ptr->pos.y, + // If player active, copy player elevation + .elevation = gObjectEvents[objId].active ? gObjectEvents[objId].currentElevation : 3, + .movementType = MOVEMENT_TYPE_FOLLOW_PLAYER, + }; + if ((objId = SpawnSpecialObjectEvent(&template)) >= OBJECT_EVENTS_COUNT) + return; + objEvent = &gObjectEvents[objId]; + objEvent->invisible = TRUE; } sprite = &gSprites[objEvent->spriteId]; // Follower appearance changed; move to player and set invisible - if (species != objEvent->extra.mon.species || shiny != objEvent->extra.mon.shiny || form != objEvent->extra.mon.form) { - MoveObjectEventToMapCoords(objEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); - objEvent->invisible = TRUE; + if (species != objEvent->extra.mon.species || + shiny != objEvent->extra.mon.shiny || + form != objEvent->extra.mon.form) + { + MoveObjectEventToMapCoords(objEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); + objEvent->invisible = TRUE; } FollowerSetGraphics(objEvent, species, form, shiny); sprite->data[6] = 0; // set animation data objEvent->extra.mon.species = species; objEvent->extra.mon.shiny = shiny; objEvent->extra.mon.form = form; - } else { - RemoveFollowingPokemon(); - } } void RemoveFollowingPokemon(void) { // Remove follower object. Idempotent. - struct ObjectEvent *objectEvent = GetFollowerObject(); - if (objectEvent == NULL) - return; - RemoveObjectEvent(objectEvent); + struct ObjectEvent *objectEvent = GetFollowerObject(); + if (objectEvent == NULL) + return; + RemoveObjectEvent(objectEvent); } -static bool8 IsFollowerVisible(void) { // Determine whether follower *should* be visible - return - !(TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE) - || MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) - || MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior) - || MetatileBehavior_IsForcedMovementTile(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) - || MetatileBehavior_IsForcedMovementTile(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior) - || gWeatherPtr->currWeather == WEATHER_UNDERWATER - || gWeatherPtr->currWeather == WEATHER_UNDERWATER_BUBBLES); +static bool32 IsFollowerVisible(void) { // Determine whether follower *should* be visible + return + !(TestPlayerAvatarFlags(FOLLOWER_INVISIBLE_FLAGS) + || MetatileBehavior_IsSurfableWaterOrUnderwater(gObjectEvents[gPlayerAvatar.objectEventId].previousMetatileBehavior) + || MetatileBehavior_IsForcedMovementTile(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior)); } static bool8 SpeciesHasType(u16 species, u8 type) { - return gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type; + return gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type; } // Returns a random index according to a list of weights static u8 RandomWeightedIndex(u8 *weights, u8 length) { - u8 i; - u16 random_value; - u16 cum_weight = 0; - for (i = 0; i < length; i++) - cum_weight += weights[i]; - random_value = Random() % cum_weight; - cum_weight = 0; - for (i = 0; i < length; i++) { - cum_weight += weights[i]; - if (random_value <= cum_weight) - return i; - } + u32 i; + u16 random_value; + u16 weightSum = 0; + for (i = 0; i < length; i++) + weightSum += weights[i]; + random_value = Random() % weightSum; + weightSum = 0; + for (i = 0; i < length; i++) { + weightSum += weights[i]; + if (random_value <= weightSum) + return i; + } } -// Pool of "unconditional" follower messages TODO: Should this be elsewhere ? -static const struct FollowerMessagePool followerBasicMessages[] = { - [FOLLOWER_EMOTION_HAPPY] = {gFollowerHappyMessages, EventScript_FollowerGeneric, N_FOLLOWER_HAPPY_MESSAGES}, - [FOLLOWER_EMOTION_NEUTRAL] = {gFollowerNeutralMessages, EventScript_FollowerGeneric, N_FOLLOWER_NEUTRAL_MESSAGES}, - [FOLLOWER_EMOTION_SAD] = {gFollowerSadMessages, EventScript_FollowerGeneric, N_FOLLOWER_SAD_MESSAGES}, - [FOLLOWER_EMOTION_UPSET] = {gFollowerUpsetMessages, EventScript_FollowerGeneric, N_FOLLOWER_UPSET_MESSAGES}, - [FOLLOWER_EMOTION_ANGRY] = {gFollowerAngryMessages, EventScript_FollowerGeneric, N_FOLLOWER_ANGRY_MESSAGES}, - [FOLLOWER_EMOTION_PENSIVE] = {gFollowerPensiveMessages, EventScript_FollowerGeneric, N_FOLLOWER_PENSIVE_MESSAGES}, - [FOLLOWER_EMOTION_LOVE] = {gFollowerLoveMessages, EventScript_FollowerGeneric, N_FOLLOWER_LOVE_MESSAGES}, - [FOLLOWER_EMOTION_SURPRISE] = {gFollowerSurpriseMessages, EventScript_FollowerGeneric, N_FOLLOWER_SURPRISE_MESSAGES}, - [FOLLOWER_EMOTION_CURIOUS] = {gFollowerCuriousMessages, EventScript_FollowerGeneric, N_FOLLOWER_CURIOUS_MESSAGES}, - [FOLLOWER_EMOTION_MUSIC] = {gFollowerMusicMessages, EventScript_FollowerGeneric, N_FOLLOWER_MUSIC_MESSAGES}, - [FOLLOWER_EMOTION_POISONED] = {gFollowerPoisonedMessages, EventScript_FollowerGeneric, N_FOLLOWER_POISONED_MESSAGES}, -}; - // Display an emote above an object event // Note that this is not a movement action static void ObjectEventEmote(struct ObjectEvent *objEvent, u8 emotion) { - emotion %= FOLLOWER_EMOTION_LENGTH; - ObjectEventGetLocalIdAndMap(objEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - gFieldEffectArguments[7] = emotion; - FieldEffectStart(FLDEFF_EMOTE); + emotion %= FOLLOWER_EMOTION_LENGTH; + ObjectEventGetLocalIdAndMap(objEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + gFieldEffectArguments[7] = emotion; + FieldEffectStart(FLDEFF_EMOTE); } // Script-accessible version of the above bool8 ScrFunc_emote(struct ScriptContext *ctx) { - u8 localId = ScriptReadByte(ctx); - u8 emotion = ScriptReadByte(ctx) % FOLLOWER_EMOTION_LENGTH; - u8 i = GetObjectEventIdByLocalId(localId); - if (i < OBJECT_EVENTS_COUNT) - ObjectEventEmote(&gObjectEvents[i], emotion); - return FALSE; + u8 localId = ScriptReadByte(ctx); + u8 emotion = ScriptReadByte(ctx) % FOLLOWER_EMOTION_LENGTH; + u8 i = GetObjectEventIdByLocalId(localId); + if (i < OBJECT_EVENTS_COUNT) + ObjectEventEmote(&gObjectEvents[i], emotion); + return FALSE; } struct SpecialEmote { // Used for storing conditional emotes - u16 index; - u8 emotion; + u16 index; + u8 emotion; }; // Find and return direction of metatile behavior within distance @@ -2060,184 +2098,198 @@ static u32 FindMetatileBehaviorWithinRange(s32 x, s32 y, u32 mb, u8 distance) { // Call an applicable follower message script bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big switch for follower messages { - u16 species; - s32 multi, multi2; - struct SpecialEmote cond_emotes[16] = {0}; - u8 emotion, n_choices = 0; - struct ObjectEvent *objEvent = GetFollowerObject(); - struct Pokemon *mon = GetFirstLiveMon(); - u8 emotion_weight[FOLLOWER_EMOTION_LENGTH] = { - [FOLLOWER_EMOTION_HAPPY] = 10, - [FOLLOWER_EMOTION_NEUTRAL] = 15, - [FOLLOWER_EMOTION_SAD] = 5, - [FOLLOWER_EMOTION_UPSET] = 15, - [FOLLOWER_EMOTION_ANGRY] = 15, - [FOLLOWER_EMOTION_PENSIVE] = 15, - [FOLLOWER_EMOTION_SURPRISE] = 10, // TODO: Scale this with how long the follower has been out? - [FOLLOWER_EMOTION_CURIOUS] = 10, // TODO: Increase this if there is an item nearby? - [FOLLOWER_EMOTION_MUSIC] = 15, - }; - u32 i, j; - bool32 pickedCondition = FALSE; - if (mon == NULL) { - ScriptCall(ctx, EventScript_FollowerLovesYou); - return FALSE; - } - // If map is not flyable, set the script to jump past the fly check TODO: Should followers ask to fly? - if (TRUE || !Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType)) + u32 species; + s32 multi, multi2; + struct SpecialEmote condEmotes[16] = {0}; + u32 condCount = 0; + u32 emotion; + struct ObjectEvent *objEvent = GetFollowerObject(); + struct Pokemon *mon = GetFirstLiveMon(); + u8 emotion_weight[FOLLOWER_EMOTION_LENGTH] = { + [FOLLOWER_EMOTION_HAPPY] = 10, + [FOLLOWER_EMOTION_NEUTRAL] = 15, + [FOLLOWER_EMOTION_SAD] = 5, + [FOLLOWER_EMOTION_UPSET] = 15, + [FOLLOWER_EMOTION_ANGRY] = 15, + [FOLLOWER_EMOTION_PENSIVE] = 15, + [FOLLOWER_EMOTION_SURPRISE] = 10, + [FOLLOWER_EMOTION_CURIOUS] = 10, + [FOLLOWER_EMOTION_MUSIC] = 15, + }; + u32 i, j; + bool32 pickedCondition = FALSE; + if (mon == NULL) { // failsafe + ScriptCall(ctx, EventScript_FollowerLovesYou); + return FALSE; + } + // Set the script to the very end; we'll be calling another script dynamically ScriptJump(ctx, EventScript_FollowerEnd); - species = GetMonData(mon, MON_DATA_SPECIES); - multi = GetMonData(mon, MON_DATA_FRIENDSHIP); - if (multi > 80) { - emotion_weight[FOLLOWER_EMOTION_HAPPY] = 20; - emotion_weight[FOLLOWER_EMOTION_UPSET] = 5; - emotion_weight[FOLLOWER_EMOTION_ANGRY] = 5; - emotion_weight[FOLLOWER_EMOTION_LOVE] = 20; - emotion_weight[FOLLOWER_EMOTION_MUSIC] = 20; - } - if (multi > 170) { - emotion_weight[FOLLOWER_EMOTION_HAPPY] = 30; - emotion_weight[FOLLOWER_EMOTION_LOVE] = 30; - } - // Conditional messages follow - // Weather-related - if (GetCurrentWeather() == WEATHER_SUNNY_CLOUDS) - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=31}; - // Health & status-related - multi = mon->hp * 100 / mon->maxHP; - if (multi < 20) { - emotion_weight[FOLLOWER_EMOTION_SAD] = 30; - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=4}; - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=5}; - } - if (multi < 50 || mon->status & STATUS1_PARALYSIS) { - emotion_weight[FOLLOWER_EMOTION_SAD] = 30; - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=6}; - } - // Gym type advantage/disadvantage scripts - if (GetCurrentMapMusic() == MUS_GYM || GetCurrentMapMusic() == MUS_RG_GYM) { - switch (gMapHeader.regionMapSectionId) - { - case MAPSEC_RUSTBORO_CITY: - case MAPSEC_PEWTER_CITY: - multi = TYPE_ROCK; - break; - case MAPSEC_DEWFORD_TOWN: - multi = TYPE_FIGHTING; - break; - case MAPSEC_MAUVILLE_CITY: - case MAPSEC_VERMILION_CITY: - multi = TYPE_ELECTRIC; - break; - case MAPSEC_LAVARIDGE_TOWN: - case MAPSEC_CINNABAR_ISLAND: - multi = TYPE_FIRE; - break; - case MAPSEC_PETALBURG_CITY: - multi = TYPE_NORMAL; - break; - case MAPSEC_FORTREE_CITY: - multi = TYPE_FLYING; - break; - case MAPSEC_MOSSDEEP_CITY: - case MAPSEC_SAFFRON_CITY: - multi = TYPE_PSYCHIC; - break; - case MAPSEC_SOOTOPOLIS_CITY: - case MAPSEC_CERULEAN_CITY: - multi = TYPE_WATER; - break; - case MAPSEC_CELADON_CITY: - multi = TYPE_GRASS; - break; - case MAPSEC_FUCHSIA_CITY: - multi = TYPE_POISON; - break; - case MAPSEC_VIRIDIAN_CITY: - multi = TYPE_GROUND; - break; - default: - multi = NUMBER_OF_MON_TYPES; + species = GetMonData(mon, MON_DATA_SPECIES); + multi = GetMonData(mon, MON_DATA_FRIENDSHIP); + if (multi > 80) { + emotion_weight[FOLLOWER_EMOTION_HAPPY] = 20; + emotion_weight[FOLLOWER_EMOTION_UPSET] = 5; + emotion_weight[FOLLOWER_EMOTION_ANGRY] = 5; + emotion_weight[FOLLOWER_EMOTION_LOVE] = 20; + emotion_weight[FOLLOWER_EMOTION_MUSIC] = 20; } - if (multi < NUMBER_OF_MON_TYPES) { - multi = GetTypeEffectiveness(mon, multi); - if (multi & (MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_NO_EFFECT)) - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=32}; - else if (multi & MOVE_RESULT_SUPER_EFFECTIVE) - cond_emotes[n_choices++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=7}; + if (multi > 170) { + emotion_weight[FOLLOWER_EMOTION_HAPPY] = 30; + emotion_weight[FOLLOWER_EMOTION_LOVE] = 30; + } + // Special C-based conditions follower + // Weather-related + if (GetCurrentWeather() == WEATHER_SUNNY_CLOUDS) + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=31}; + // Health & status-related + multi = mon->hp * 100 / mon->maxHP; + if (multi < 20) { + emotion_weight[FOLLOWER_EMOTION_SAD] = 30; + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=4}; + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=5}; + } + if (multi < 50 || mon->status & STATUS1_PARALYSIS) { + emotion_weight[FOLLOWER_EMOTION_SAD] = 30; + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=6}; + } + // Gym type advantage/disadvantage + if (GetCurrentMapMusic() == MUS_GYM || GetCurrentMapMusic() == MUS_RG_GYM) { + switch (gMapHeader.regionMapSectionId) + { + case MAPSEC_RUSTBORO_CITY: + case MAPSEC_PEWTER_CITY: + multi = TYPE_ROCK; + break; + case MAPSEC_DEWFORD_TOWN: + multi = TYPE_FIGHTING; + break; + case MAPSEC_MAUVILLE_CITY: + case MAPSEC_VERMILION_CITY: + multi = TYPE_ELECTRIC; + break; + case MAPSEC_LAVARIDGE_TOWN: + case MAPSEC_CINNABAR_ISLAND: + multi = TYPE_FIRE; + break; + case MAPSEC_PETALBURG_CITY: + multi = TYPE_NORMAL; + break; + case MAPSEC_FORTREE_CITY: + multi = TYPE_FLYING; + break; + case MAPSEC_MOSSDEEP_CITY: + case MAPSEC_SAFFRON_CITY: + multi = TYPE_PSYCHIC; + break; + case MAPSEC_SOOTOPOLIS_CITY: + case MAPSEC_CERULEAN_CITY: + multi = TYPE_WATER; + break; + case MAPSEC_CELADON_CITY: + multi = TYPE_GRASS; + break; + case MAPSEC_FUCHSIA_CITY: + multi = TYPE_POISON; + break; + case MAPSEC_VIRIDIAN_CITY: + multi = TYPE_GROUND; + break; + default: + multi = NUMBER_OF_MON_TYPES; + } + if (multi < NUMBER_OF_MON_TYPES) { + multi = GetTypeEffectiveness(mon, multi); + if (multi & (MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_NO_EFFECT)) + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_HAPPY, .index=32}; + else if (multi & MOVE_RESULT_SUPER_EFFECTIVE) + condEmotes[condCount++] = (struct SpecialEmote) {.emotion=FOLLOWER_EMOTION_SAD, .index=7}; + } } - } - emotion = RandomWeightedIndex(emotion_weight, FOLLOWER_EMOTION_LENGTH); - #ifdef BATTLE_ENGINE - if ((mon->status & STATUS1_PSN_ANY) && GetMonAbility(mon) != ABILITY_POISON_HEAL) - #else - if (mon->status & STATUS1_PSN_ANY) - #endif - emotion = FOLLOWER_EMOTION_POISONED; - multi = Random() % followerBasicMessages[emotion].length; - // With 50% chance, select special message using reservoir sampling - for (i = (Random() & 1) ? n_choices : 0, j = 1; i < n_choices; i++) { - if (cond_emotes[i].emotion == emotion && (Random() < 0x10000 / (j++))) // Replace item with 1/j chance - multi = cond_emotes[i].index; - } - // Match scripted conditional messages - // With 50% chance, try to match scripted conditional messages - for (i = (Random() & 1) ? COND_MSG_COUNT : 0, j = 1; i < COND_MSG_COUNT; i++) { - const struct FollowerMsgInfoExtended *info = &gFollowerConditionalMessages[i]; - if (info->stFlags == 1 && species != info->st.species) - continue; - if (info->stFlags == 2 && (info->st.types.type2 >= NUMBER_OF_MON_TYPES ? SpeciesHasType(species, info->st.types.type1) : !(SpeciesHasType(species, info->st.types.type1) || SpeciesHasType(species, info->st.types.type2)))) - continue; - if (info->stFlags == 3 && !(mon->status & info->st.status)) - continue; - if (info->mmFlags == 1 && gMapHeader.regionMapSectionId != info->mm.mapSec.mapSec) - continue; - if (info->mmFlags == 2 && !(gSaveBlock1Ptr->location.mapNum == info->mm.map.mapNum && gSaveBlock1Ptr->location.mapGroup == info->mm.map.mapGroup)) - continue; - if (info->mmFlags == 3 && !(objEvent->currentMetatileBehavior == info->mm.mb.behavior1 || objEvent->currentMetatileBehavior == info->mm.mb.behavior2)) - continue; - if (info->wtFlags == 1 && !(GetCurrentWeather() == info->wt.weather.weather1 || GetCurrentWeather() == info->wt.weather.weather2)) - continue; - if (info->wtFlags == 2 && GetCurrentMapMusic() != info->wt.song) - continue; - if (info->nearFlags == 1) { - if ((multi2 = FindMetatileBehaviorWithinRange(objEvent->currentCoords.x, objEvent->currentCoords.y, info->near.mb.behavior, info->near.mb.distance))) - gSpecialVar_Result = multi2; - else - continue; - } + emotion = RandomWeightedIndex(emotion_weight, FOLLOWER_EMOTION_LENGTH); + #ifdef BATTLE_ENGINE + if ((mon->status & STATUS1_PSN_ANY) && GetMonAbility(mon) != ABILITY_POISON_HEAL) + #else + if (mon->status & STATUS1_PSN_ANY) + #endif + emotion = FOLLOWER_EMOTION_POISONED; - // replace choice with weight/j chance - if (Random() < (0x10000 / (j++)) * (info->weight ? info->weight : 1)) { - multi = i; - pickedCondition = TRUE; - } - } - if (pickedCondition) { // conditional message was chosen - emotion = gFollowerConditionalMessages[multi].emotion; - ObjectEventEmote(objEvent, emotion); - ctx->data[0] = (u32) gFollowerConditionalMessages[multi].text; - // text choices are spread across array; pick a random one - if (gFollowerConditionalMessages[multi].textSpread) { - for (i = 0; i < 4; i++) - if (!((u32*)gFollowerConditionalMessages[multi].text)[i]) - break; - ctx->data[0] = i ? ((u32*)gFollowerConditionalMessages[multi].text)[Random() % i] : 0; - } - ScriptCall(ctx, gFollowerConditionalMessages[multi].script ? gFollowerConditionalMessages[multi].script : followerBasicMessages[emotion].script); - return FALSE; - } - ObjectEventEmote(objEvent, emotion); - ctx->data[0] = (u32) followerBasicMessages[emotion].messages[multi].text; // Load message text - ScriptCall(ctx, followerBasicMessages[emotion].messages[multi].script ? - followerBasicMessages[emotion].messages[multi].script : followerBasicMessages[emotion].script); - return FALSE; -} + // end special conditions -bool8 ScrFunc_followerfly(struct ScriptContext *ctx) { - SetMainCallback2(CB2_OpenFlyMap); - return FALSE; + // roll for basic/unconditional message + multi = Random() % gFollowerBasicMessages[emotion].length; + // (50% chance) Select special condition using reservoir sampling + for (i = (Random() & 1) ? condCount : 0, j = 1; i < condCount; i++) { + if (condEmotes[i].emotion == emotion && (Random() < 0x10000 / (j++))) // Replace each item with 1/j chance + multi = condEmotes[i].index; + } + // (50% chance) Match *scripted* conditional messages, from follower_helper.c + for (i = (Random() & 1) ? COND_MSG_COUNT : 0, j = 1; i < COND_MSG_COUNT; i++) { + const struct FollowerMsgInfoExtended *info = &gFollowerConditionalMessages[i]; + if (info->stFlags == 1 && species != info->st.species) + continue; + if (info->stFlags == 2 && + (info->st.types.type2 >= NUMBER_OF_MON_TYPES ? + SpeciesHasType(species, info->st.types.type1) : + !(SpeciesHasType(species, info->st.types.type1) || SpeciesHasType(species, info->st.types.type2))) + ) + continue; + if (info->stFlags == 3 && !(mon->status & info->st.status)) + continue; + if (info->mmFlags == 1 && gMapHeader.regionMapSectionId != info->mm.mapSec.mapSec) + continue; + if (info->mmFlags == 2 && + !(gSaveBlock1Ptr->location.mapNum == info->mm.map.mapNum && + gSaveBlock1Ptr->location.mapGroup == info->mm.map.mapGroup) + ) + continue; + if (info->mmFlags == 3 && + !(objEvent->currentMetatileBehavior == info->mm.mb.behavior1 || + objEvent->currentMetatileBehavior == info->mm.mb.behavior2) + ) + continue; + if (info->wtFlags == 1 && + !(GetCurrentWeather() == info->wt.weather.weather1 || + GetCurrentWeather() == info->wt.weather.weather2) + ) + continue; + if (info->wtFlags == 2 && GetCurrentMapMusic() != info->wt.song) + continue; + if (info->nearFlags == 1) { + if ((multi2 = FindMetatileBehaviorWithinRange(objEvent->currentCoords.x, objEvent->currentCoords.y, info->near.mb.behavior, info->near.mb.distance))) + gSpecialVar_Result = multi2; + else + continue; + } + + // replace choice with weight/j chance + if (Random() < (0x10000 / (j++)) * (info->weight ? info->weight : 1)) { + multi = i; + pickedCondition = TRUE; + } + } + // condition message was chosen + if (pickedCondition) { + emotion = gFollowerConditionalMessages[multi].emotion; + ObjectEventEmote(objEvent, emotion); + ctx->data[0] = (u32) gFollowerConditionalMessages[multi].text; + // text choices are spread across array; pick a random one + if (gFollowerConditionalMessages[multi].textSpread) { + for (i = 0; i < 4; i++) + if (!((u32*)gFollowerConditionalMessages[multi].text)[i]) + break; + ctx->data[0] = i ? ((u32*)gFollowerConditionalMessages[multi].text)[Random() % i] : 0; + } + ScriptCall(ctx, gFollowerConditionalMessages[multi].script ? gFollowerConditionalMessages[multi].script : gFollowerBasicMessages[emotion].script); + return FALSE; + } + // otherwise, a basic or C-based message was picked + ObjectEventEmote(objEvent, emotion); + ctx->data[0] = (u32) gFollowerBasicMessages[emotion].messages[multi].text; // Load message text + ScriptCall(ctx, gFollowerBasicMessages[emotion].messages[multi].script ? + gFollowerBasicMessages[emotion].messages[multi].script : + gFollowerBasicMessages[emotion].script); + return FALSE; } void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) @@ -2371,9 +2423,10 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) sprite->coordOffsetEnabled = TRUE; sprite->sObjEventId = objectEventId; objectEvent->spriteId = i; - if (objectEvent->graphicsId == OBJ_EVENT_GFX_OW_MON) { // Set pokemon graphics - FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny); - } + + if (objectEvent->graphicsId == OBJ_EVENT_GFX_OW_MON) // Set pokemon graphics + FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny); + if (!objectEvent->inanimate && objectEvent->movementType != MOVEMENT_TYPE_PLAYER) StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection)); @@ -2405,43 +2458,47 @@ static void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteI // Update sprite's palette, freeing old palette if necessary static u8 UpdateSpritePalette(const struct SpritePalette * spritePalette, struct Sprite * sprite) { - // Free palette if otherwise unused - sprite->inUse = FALSE; - FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); - sprite->inUse = TRUE; - return sprite->oam.paletteNum = LoadSpritePalette(spritePalette); + // Free palette if otherwise unused + sprite->inUse = FALSE; + FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); + sprite->inUse = TRUE; + return sprite->oam.paletteNum = LoadSpritePalette(spritePalette); } // Find and update based on template's paletteTag -// TODO: Add a better way to associate tags -> palettes besides listing them in sObjectEventSpritePalettes u8 UpdateSpritePaletteByTemplate(const struct SpriteTemplate * template, struct Sprite * sprite) { - u8 i = FindObjectEventPaletteIndexByTag(template->paletteTag); - if (i == 0xFF) - return i; - return UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); + u8 i = FindObjectEventPaletteIndexByTag(template->paletteTag); + if (i == 0xFF) + return i; + return UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); } // Set graphics *by info* static void ObjectEventSetGraphics(struct ObjectEvent *objectEvent, const struct ObjectEventGraphicsInfo *graphicsInfo) { - struct Sprite *sprite = &gSprites[objectEvent->spriteId]; - u8 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); - if (i != 0xFF) - UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); - sprite->oam.shape = graphicsInfo->oam->shape; - sprite->oam.size = graphicsInfo->oam->size; - sprite->images = graphicsInfo->images; - sprite->anims = graphicsInfo->anims; - sprite->subspriteTables = graphicsInfo->subspriteTables; - objectEvent->inanimate = graphicsInfo->inanimate; - SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->x += 8; - sprite->y += 16 + sprite->centerToCornerVecY; - if (objectEvent->trackedByCamera) - { - CameraObjectReset1(); - } + struct Sprite *sprite = &gSprites[objectEvent->spriteId]; + u32 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); + if (i != 0xFF) + UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); + + #if LARGE_OW_SUPPORT + // If gfx size changes, we need to reallocate tiles + if (graphicsInfo->oam->size != sprite->oam.size) + ReallocSpriteTiles(sprite, graphicsInfo->images->size); + #endif + + sprite->oam.shape = graphicsInfo->oam->shape; + sprite->oam.size = graphicsInfo->oam->size; + sprite->images = graphicsInfo->images; + sprite->anims = graphicsInfo->anims; + sprite->subspriteTables = graphicsInfo->subspriteTables; + objectEvent->inanimate = graphicsInfo->inanimate; + SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); + sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); + sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); + sprite->x += 8; + sprite->y += 16 + sprite->centerToCornerVecY; + if (objectEvent->trackedByCamera) + CameraObjectReset1(); } void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) @@ -2483,26 +2540,24 @@ void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction) } static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, u8 berryId, u8 berryStage) { - const u8 graphicsId = gBerryTreeObjectEventGraphicsIdTablePointers[berryId][berryStage]; - const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - struct Sprite *sprite = &gSprites[objectEvent->spriteId]; - UpdateSpritePalette(&sObjectEventSpritePalettes[gBerryTreePaletteSlotTablePointers[berryId][berryStage]-2], sprite); - sprite->oam.shape = graphicsInfo->oam->shape; - sprite->oam.size = graphicsInfo->oam->size; - sprite->images = gBerryTreePicTablePointers[berryId]; - sprite->anims = graphicsInfo->anims; - sprite->subspriteTables = graphicsInfo->subspriteTables; - objectEvent->inanimate = graphicsInfo->inanimate; - objectEvent->graphicsId = graphicsId; - SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->x += 8; - sprite->y += 16 + sprite->centerToCornerVecY; - if (objectEvent->trackedByCamera) - { - CameraObjectReset1(); - } + const u8 graphicsId = gBerryTreeObjectEventGraphicsIdTablePointers[berryId][berryStage]; + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); + struct Sprite *sprite = &gSprites[objectEvent->spriteId]; + UpdateSpritePalette(&sObjectEventSpritePalettes[gBerryTreePaletteSlotTablePointers[berryId][berryStage]-2], sprite); + sprite->oam.shape = graphicsInfo->oam->shape; + sprite->oam.size = graphicsInfo->oam->size; + sprite->images = gBerryTreePicTablePointers[berryId]; + sprite->anims = graphicsInfo->anims; + sprite->subspriteTables = graphicsInfo->subspriteTables; + objectEvent->inanimate = graphicsInfo->inanimate; + objectEvent->graphicsId = graphicsId; + SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); + sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); + sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); + sprite->x += 8; + sprite->y += 16 + sprite->centerToCornerVecY; + if (objectEvent->trackedByCamera) + CameraObjectReset1(); } static void get_berry_tree_graphics(struct ObjectEvent *objectEvent, struct Sprite *sprite) @@ -4962,7 +5017,7 @@ bool8 CopyablePlayerMovement_Jump2(struct ObjectEvent *objectEvent, struct Sprit return TRUE; } -static bool8 EndFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { +static bool32 EndFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (!sprite) return FALSE; SetGpuReg(REG_OFFSET_MOSAIC, 0); @@ -4973,7 +5028,7 @@ static bool8 EndFollowerTransformEffect(struct ObjectEvent *objectEvent, struct return FALSE; } -static bool8 TryStartFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { +static bool32 TryStartFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u32 multi; if (objectEvent->extra.mon.species == SPECIES_CASTFORM && objectEvent->extra.mon.form != (multi = GetOverworldCastformForm())) { sprite->data[7] = TRANSFORM_TYPE_PERMANENT << 8; @@ -5035,10 +5090,10 @@ bool8 MovementType_FollowPlayer_Shadow(struct ObjectEvent *objectEvent, struct S { ClearObjectEventMovement(objectEvent, sprite); if (!IsFollowerVisible()) { // Shadow player's position - objectEvent->invisible = TRUE; - MoveObjectEventToMapCoords(objectEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); - objectEvent->triggerGroundEffectsOnMove = FALSE; // Stop endless reflection spawning - return FALSE; + objectEvent->invisible = TRUE; + MoveObjectEventToMapCoords(objectEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y); + objectEvent->triggerGroundEffectsOnMove = FALSE; // Stop endless reflection spawning + return FALSE; } // Move follower to player, in case we end up in the shadowing state for only 1 frame // This way the player cannot talk to the invisible follower before it appears @@ -5064,7 +5119,6 @@ bool8 MovementType_FollowPlayer_Active(struct ObjectEvent *objectEvent, struct S sprite->sTypeFuncId = 2; // movement action sets state to 0 return TRUE; } - // TODO: Remove dependence on PlayerGetCopyableMovement return gFollowPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), NULL); } @@ -5079,12 +5133,11 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { #endif objectEvent->singleMovementActive = 0; - if (sprite->sTypeFuncId) { // restore nonzero state + if (sprite->sTypeFuncId) // restore nonzero state sprite->sTypeFuncId = 1; - } } else if (objectEvent->movementActionId < MOVEMENT_ACTION_EXIT_POKEBALL) { UpdateFollowerTransformEffect(objectEvent, sprite); - #if OW_MON_BOBBING == TRUE + #if OW_MON_BOBBING if ((sprite->data[5] & 7) == 2) sprite->y2 ^= -1; #endif @@ -5105,7 +5158,7 @@ bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Spri { // finish movement action objectEvent->singleMovementActive = 0; } - #if OW_MON_BOBBING == TRUE + #if OW_MON_BOBBING else if ((sprite->data[3] & 7) == 2) sprite->y2 ^= -1; #endif @@ -5129,29 +5182,29 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; - if ((x == targetX && y == targetY) || !IsFollowerVisible()) { // don't move on player collision or if not visible - return FALSE; - } + if ((x == targetX && y == targetY) || !IsFollowerVisible()) // don't move on player collision or if not visible + return FALSE; + x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; ClearObjectEventMovement(objectEvent, sprite); if (objectEvent->invisible) { // Animate exiting pokeball - // Player is jumping, but follower is invisible - if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) { - sprite->sTypeFuncId = 0; // return to shadowing state - return FALSE; - } - MoveObjectEventToMapCoords(objectEvent, targetX, targetY); - ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL); - objectEvent->singleMovementActive = 1; - sprite->sTypeFuncId = 2; - #if OW_MON_BOBBING == TRUE - sprite->y2 = 0; - #endif - return TRUE; + // Player is jumping, but follower is invisible + if (PlayerGetCopyableMovement() == COPY_MOVE_JUMP2) { + sprite->sTypeFuncId = 0; // return to shadowing state + return FALSE; + } + MoveObjectEventToMapCoords(objectEvent, targetX, targetY); + ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_EXIT_POKEBALL); + objectEvent->singleMovementActive = 1; + sprite->sTypeFuncId = 2; + #if OW_MON_BOBBING + sprite->y2 = 0; + #endif + return TRUE; } else if (x == targetX && y == targetY) { // don't move if already in the player's last position - return FALSE; + return FALSE; } // Follow player @@ -5174,7 +5227,7 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction)); else { objectEvent->movementActionId = GetWalkNormalMovementAction(direction); - #if OW_MON_BOBBING == TRUE + #if OW_MON_BOBBING sprite->y2 = -1; #endif } @@ -5190,7 +5243,7 @@ bool8 FollowablePlayerMovement_Step(struct ObjectEvent *objectEvent, struct Spri ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowMovementAction(direction)); else { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(direction)); - #if OW_MON_BOBBING == TRUE + #if OW_MON_BOBBING sprite->y2 = -1; #endif } @@ -5627,7 +5680,7 @@ bool8 ScrFunc_IsFollowerFieldMoveUser(struct ScriptContext *ctx) { if (follower && obj && !obj->invisible) { u16 followIndex = ((u32)follower - (u32)gPlayerParty) / sizeof(struct Pokemon); *var = userIndex == followIndex; - } else + } return FALSE; } @@ -6747,10 +6800,10 @@ bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct ObjectEvent *objectEvent, // Update sprite with a palette filled with a solid color static u8 LoadFillColorPalette(u16 color, u16 paletteTag, struct Sprite *sprite) { - u16 paletteData[16]; - struct SpritePalette dynamicPalette = {.tag = paletteTag, .data = paletteData}; - CpuFill16(color, paletteData, PLTT_SIZE_4BPP); - return UpdateSpritePalette(&dynamicPalette, sprite); + u16 paletteData[16]; + struct SpritePalette dynamicPalette = {.tag = paletteTag, .data = paletteData}; + CpuFill16(color, paletteData, PLTT_SIZE_4BPP); + return UpdateSpritePalette(&dynamicPalette, sprite); } static void ObjectEventSetPokeballGfx(struct ObjectEvent *objEvent) { @@ -6773,19 +6826,24 @@ static void ObjectEventSetPokeballGfx(struct ObjectEvent *objEvent) { ObjectEventSetGraphicsId(objEvent, OBJ_EVENT_GFX_ANIMATED_BALL); } +#define sDuration data[3] +#define sSpeedFlip data[6] + bool8 MovementAction_ExitPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - u8 direction = gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; + u32 direction = gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; objectEvent->invisible = FALSE; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) { // If player is dashing, the pokemon must come out faster - StartSpriteAnimInDirection(objectEvent, sprite, direction, GetMoveDirectionFastestAnimNum(direction) + 4); - sprite->data[3] = 8; // duration - sprite->data[6] = 0; // fast speed + StartSpriteAnimInDirection(objectEvent, sprite, direction, GetJumpSpecialDirectionAnimNum(direction)); + sprite->sDuration = 8; + sprite->sSpeedFlip = 0; // fast speed } else { StartSpriteAnimInDirection(objectEvent, sprite, direction, GetMoveDirectionFastestAnimNum(direction)); - sprite->data[3] = 16; // duration - sprite->data[6] = 1; // slow speed + sprite->sDuration = 16; + sprite->sSpeedFlip = 1; // normal speed } - sprite->data[6] |= (direction == DIR_EAST ? 1 : 0) << 4; + // If mon's right-facing sprite is h-flipped, we need to use a different affine anim + if (direction == DIR_EAST && sprite->anims[ANIM_STD_FACE_EAST]->frame.hFlip) + sprite->sSpeedFlip |= 1 << 4; ObjectEventSetPokeballGfx(objectEvent); objectEvent->inanimate = FALSE; return MovementAction_ExitPokeball_Step1(objectEvent, sprite); @@ -6837,32 +6895,30 @@ static const union AffineAnimCmd *const sAffineAnims_PokeballFollower[] = bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - u8 duration = sprite->data[6] & 0xF; - sprite->data[3]--; - if (sprite->data[3] == 0) + // for different speeds, anim steps occur on different frame #s + u32 animStepFrame = (sprite->sSpeedFlip & 1) ? 7 : 3; // 0 -> 3, 1 -> 7 + if (--sprite->sDuration == 0) { sprite->sActionFuncId = 2; sprite->animCmdIndex = 0; sprite->animPaused = TRUE; return TRUE; // Set graphics, palette, and affine animation - } else if ((duration == 0 && sprite->data[3] == 3) || (duration == 1 && sprite->data[3] == 7)) { + } else if (sprite->sDuration == animStepFrame) { FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny); LoadFillColorPalette(RGB_WHITE, OBJ_EVENT_PAL_TAG_WHITE, sprite); // Initialize affine animation sprite->affineAnims = sAffineAnims_PokeballFollower; #if LARGE_OW_SUPPORT - if (IS_POW_OF_TWO(-sprite->centerToCornerVecX)) { - #endif - sprite->affineAnims = sAffineAnims_PokeballFollower; - sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; - InitSpriteAffineAnim(sprite); - StartSpriteAffineAnim(sprite, sprite->data[6] >> 4); - #if LARGE_OW_SUPPORT - } + if (!IS_POW_OF_TWO(-sprite->centerToCornerVecX)) + return FALSE; #endif + sprite->affineAnims = sAffineAnims_PokeballFollower; + sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, sprite->sSpeedFlip >> 4); // Restore original palette & disable affine - } else if ((duration == 0 && sprite->data[3] == 1) || (duration == 1 && sprite->data[3] == 3)) { + } else if (sprite->sDuration == (animStepFrame >> 1)) { sprite->affineAnimEnded = TRUE; FreeSpriteOamMatrix(sprite); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; @@ -6872,36 +6928,37 @@ bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct } bool8 MovementAction_EnterPokeball_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - u8 direction = objectEvent->facingDirection; + u32 direction = objectEvent->facingDirection; StartSpriteAnimInDirection(objectEvent, sprite, direction, GetMoveDirectionFasterAnimNum(direction)); - sprite->data[3] = 16; // duration - sprite->data[6] = direction == DIR_EAST ? 3 : 2; // affine animation number + sprite->sDuration = 16; + // If mon's right-facing sprite is h-flipped, we need to use a different affine anim + if (direction == DIR_EAST && sprite->anims[ANIM_STD_FACE_EAST]->frame.hFlip) + sprite->sSpeedFlip = 3; + else + sprite->sSpeedFlip = 2; EndFollowerTransformEffect(objectEvent, sprite); return MovementAction_EnterPokeball_Step1(objectEvent, sprite); } bool8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sprite->data[3]--; - if (sprite->data[3] == 0) { - sprite->data[2] = 2; + if (--sprite->sDuration == 0) { + sprite->sActionFuncId = 2; return FALSE; - } else if (sprite->data[3] == 11) { // Set palette to white & start affine + } else if (sprite->sDuration == 11) { // Set palette to white & start affine LoadFillColorPalette(RGB_WHITE, OBJ_EVENT_PAL_TAG_WHITE, sprite); + sprite->subspriteTableNum = 0; #if LARGE_OW_SUPPORT // Only do affine if sprite width is power of 2 // (effect looks weird on sprites composed of subsprites like 48x48, etc) - if (IS_POW_OF_TWO(-sprite->centerToCornerVecX)) { + if (!IS_POW_OF_TWO(-sprite->centerToCornerVecX)) + return FALSE; #endif - sprite->affineAnims = sAffineAnims_PokeballFollower; - sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; - InitSpriteAffineAnim(sprite); - StartSpriteAffineAnim(sprite, sprite->data[6]); - #if LARGE_OW_SUPPORT - } - #endif - sprite->subspriteTableNum = 0; - } else if (sprite->data[3] == 7) { // Free white palette and change to pokeball, disable affine + sprite->affineAnims = sAffineAnims_PokeballFollower; + sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, sprite->sSpeedFlip); + } else if (sprite->sDuration == 7) { // Free white palette and change to pokeball, disable affine sprite->affineAnimEnded = TRUE; FreeSpriteOamMatrix(sprite); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; @@ -6915,12 +6972,15 @@ bool8 MovementAction_EnterPokeball_Step2(struct ObjectEvent *objectEvent, struct { FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny); objectEvent->invisible = TRUE; - sprite->data[1] = 0; - sprite->data[6] = 0; + sprite->sTypeFuncId = 0; + sprite->sSpeedFlip = 0; sprite->animPaused = TRUE; return TRUE; } +#undef sDuration +#undef sSpeedFlip + bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32); @@ -8927,19 +8987,16 @@ static void UpdateObjectEventElevationAndPriority(struct ObjectEvent *objEvent, return; ObjectEventUpdateElevation(objEvent, sprite); - #if LARGE_OW_SUPPORT if (objEvent->localId == OBJ_EVENT_ID_FOLLOWER) { + #if LARGE_OW_SUPPORT // keep subspriteMode synced with player's // so that it disappears under bridges when they do sprite->subspriteMode |= gSprites[gPlayerAvatar.spriteId].subspriteMode & SUBSPRITES_IGNORE_PRIORITY; + #endif + // if transitioning between elevations, use the player's elevation if (!objEvent->currentElevation) objEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; } - #else - // if transitioning between elevations, use the player's elevation - if (!objEvent->currentElevation && objEvent->localId == OBJ_EVENT_ID_FOLLOWER) - objEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - #endif sprite->subspriteTableNum = sElevationToSubspriteTableNum[objEvent->previousElevation]; sprite->oam.priority = sElevationToPriority[objEvent->previousElevation]; @@ -9320,7 +9377,7 @@ static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct S }; static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *sprite) { - SetUpShadow(objEvent, sprite); + SetUpShadow(objEvent, sprite); } static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 7dd55a6262..2d6b7978a4 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -55,10 +55,10 @@ u32 FldEff_Shadow(void); #define sIsStillReflection data[7] void SetUpShadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - gFieldEffectArguments[0] = objectEvent->localId; - gFieldEffectArguments[1] = gSaveBlock1Ptr->location.mapNum; - gFieldEffectArguments[2] = gSaveBlock1Ptr->location.mapGroup; - FldEff_Shadow(); + gFieldEffectArguments[0] = objectEvent->localId; + gFieldEffectArguments[1] = gSaveBlock1Ptr->location.mapNum; + gFieldEffectArguments[2] = gSaveBlock1Ptr->location.mapGroup; + FldEff_Shadow(); } void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 stillReflection) diff --git a/src/follower_helper.c b/src/follower_helper.c index 2dbf51dadf..ace1eec45c 100644 --- a/src/follower_helper.c +++ b/src/follower_helper.c @@ -295,3 +295,18 @@ const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT .emotion = FOLLOWER_EMOTION_SAD, }, }; + +// Pool of "unconditional" follower messages +const struct FollowerMessagePool gFollowerBasicMessages[FOLLOWER_EMOTION_LENGTH] = { + [FOLLOWER_EMOTION_HAPPY] = {gFollowerHappyMessages, EventScript_FollowerGeneric, N_FOLLOWER_HAPPY_MESSAGES}, + [FOLLOWER_EMOTION_NEUTRAL] = {gFollowerNeutralMessages, EventScript_FollowerGeneric, N_FOLLOWER_NEUTRAL_MESSAGES}, + [FOLLOWER_EMOTION_SAD] = {gFollowerSadMessages, EventScript_FollowerGeneric, N_FOLLOWER_SAD_MESSAGES}, + [FOLLOWER_EMOTION_UPSET] = {gFollowerUpsetMessages, EventScript_FollowerGeneric, N_FOLLOWER_UPSET_MESSAGES}, + [FOLLOWER_EMOTION_ANGRY] = {gFollowerAngryMessages, EventScript_FollowerGeneric, N_FOLLOWER_ANGRY_MESSAGES}, + [FOLLOWER_EMOTION_PENSIVE] = {gFollowerPensiveMessages, EventScript_FollowerGeneric, N_FOLLOWER_PENSIVE_MESSAGES}, + [FOLLOWER_EMOTION_LOVE] = {gFollowerLoveMessages, EventScript_FollowerGeneric, N_FOLLOWER_LOVE_MESSAGES}, + [FOLLOWER_EMOTION_SURPRISE] = {gFollowerSurpriseMessages, EventScript_FollowerGeneric, N_FOLLOWER_SURPRISE_MESSAGES}, + [FOLLOWER_EMOTION_CURIOUS] = {gFollowerCuriousMessages, EventScript_FollowerGeneric, N_FOLLOWER_CURIOUS_MESSAGES}, + [FOLLOWER_EMOTION_MUSIC] = {gFollowerMusicMessages, EventScript_FollowerGeneric, N_FOLLOWER_MUSIC_MESSAGES}, + [FOLLOWER_EMOTION_POISONED] = {gFollowerPoisonedMessages, EventScript_FollowerGeneric, N_FOLLOWER_POISONED_MESSAGES}, +}; diff --git a/src/scrcmd.c b/src/scrcmd.c index abef4a85fe..bb163f650a 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -2074,9 +2074,9 @@ bool8 ScrCmd_playmoncry(struct ScriptContext *ctx) bool8 ScrFunc_playfirstmoncry(struct ScriptContext *ctx) { - u16 species = GetMonData(GetFirstLiveMon(), MON_DATA_SPECIES); - PlayCry_Script(species, 0); - return FALSE; + u16 species = GetMonData(GetFirstLiveMon(), MON_DATA_SPECIES); + PlayCry_Script(species, 0); + return FALSE; } bool8 ScrCmd_waitmoncry(struct ScriptContext *ctx) diff --git a/src/trainer_see.c b/src/trainer_see.c index 95b11447f2..ffa365ef95 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -152,28 +152,28 @@ static const struct SpriteFrameImage sSpriteImageTable_HeartIcon[] = static const struct SpriteFrameImage sSpriteImageTable_Emotes[] = { - { .data = (u8 *)sEmotion_Gfx+0*0x80, .size = 0x80}, // FOLLOWER_EMOTION_HAPPY - { .data = (u8 *)sEmotion_Gfx+1*0x80, .size = 0x80}, // FOLLOWER_EMOTION_HAPPY - { .data = (u8 *)sEmotion_Gfx+2*0x80, .size = 0x80}, // FOLLOWER_EMOTION_NEUTRAL - { .data = (u8 *)sEmotion_Gfx+3*0x80, .size = 0x80}, // FOLLOWER_EMOTION_NEUTRAL - { .data = (u8 *)sEmotion_Gfx+4*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SAD - { .data = (u8 *)sEmotion_Gfx+5*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SAD - { .data = (u8 *)sEmotion_Gfx+6*0x80, .size = 0x80}, // FOLLOWER_EMOTION_UPSET - { .data = (u8 *)sEmotion_Gfx+7*0x80, .size = 0x80}, // FOLLOWER_EMOTION_UPSET - { .data = (u8 *)sEmotion_Gfx+8*0x80, .size = 0x80}, // FOLLOWER_EMOTION_ANGRY - { .data = (u8 *)sEmotion_Gfx+9*0x80, .size = 0x80}, // FOLLOWER_EMOTION_ANGRY - { .data = (u8 *)sEmotion_Gfx+10*0x80, .size = 0x80}, // FOLLOWER_EMOTION_PENSIVE - { .data = (u8 *)sEmotion_Gfx+11*0x80, .size = 0x80}, // FOLLOWER_EMOTION_PENSIVE - { .data = (u8 *)sEmotion_Gfx+12*0x80, .size = 0x80}, // FOLLOWER_EMOTION_LOVE - { .data = (u8 *)sEmotion_Gfx+13*0x80, .size = 0x80}, // FOLLOWER_EMOTION_LOVE - { .data = (u8 *)sEmotion_Gfx+14*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SURPRISE - { .data = (u8 *)sEmotion_Gfx+15*0x80, .size = 0x80}, // FOLLOWER_EMOTION_SURPRISE - { .data = (u8 *)sEmotion_Gfx+16*0x80, .size = 0x80}, // FOLLOWER_EMOTION_CURIOUS - { .data = (u8 *)sEmotion_Gfx+17*0x80, .size = 0x80}, // FOLLOWER_EMOTION_CURIOUS - { .data = (u8 *)sEmotion_Gfx+18*0x80, .size = 0x80}, // FOLLOWER_EMOTION_MUSIC - { .data = (u8 *)sEmotion_Gfx+19*0x80, .size = 0x80}, // FOLLOWER_EMOTION_MUSIC - { .data = (u8 *)sEmotion_Gfx+20*0x80, .size = 0x80}, // FOLLOWER_EMOTION_POISONED - { .data = (u8 *)sEmotion_Gfx+21*0x80, .size = 0x80}, // FOLLOWER_EMOTION_POISONED + overworld_frame(sEmotion_Gfx, 2, 2, 0), // FOLLOWER_EMOTION_HAPPY + overworld_frame(sEmotion_Gfx, 2, 2, 1), // FOLLOWER_EMOTION_HAPPY + overworld_frame(sEmotion_Gfx, 2, 2, 2), // FOLLOWER_EMOTION_NEUTRAL + overworld_frame(sEmotion_Gfx, 2, 2, 3), // FOLLOWER_EMOTION_NEUTRAL + overworld_frame(sEmotion_Gfx, 2, 2, 4), // FOLLOWER_EMOTION_SAD + overworld_frame(sEmotion_Gfx, 2, 2, 5), // FOLLOWER_EMOTION_SAD + overworld_frame(sEmotion_Gfx, 2, 2, 6), // FOLLOWER_EMOTION_UPSET + overworld_frame(sEmotion_Gfx, 2, 2, 7), // FOLLOWER_EMOTION_UPSET + overworld_frame(sEmotion_Gfx, 2, 2, 8), // FOLLOWER_EMOTION_ANGRY + overworld_frame(sEmotion_Gfx, 2, 2, 9), // FOLLOWER_EMOTION_ANGRY + overworld_frame(sEmotion_Gfx, 2, 2, 10), // FOLLOWER_EMOTION_PENSIVE + overworld_frame(sEmotion_Gfx, 2, 2, 11), // FOLLOWER_EMOTION_PENSIVE + overworld_frame(sEmotion_Gfx, 2, 2, 12), // FOLLOWER_EMOTION_LOVE + overworld_frame(sEmotion_Gfx, 2, 2, 13), // FOLLOWER_EMOTION_LOVE + overworld_frame(sEmotion_Gfx, 2, 2, 14), // FOLLOWER_EMOTION_SURPRISE + overworld_frame(sEmotion_Gfx, 2, 2, 15), // FOLLOWER_EMOTION_SURPRISE + overworld_frame(sEmotion_Gfx, 2, 2, 16), // FOLLOWER_EMOTION_CURIOUS + overworld_frame(sEmotion_Gfx, 2, 2, 17), // FOLLOWER_EMOTION_CURIOUS + overworld_frame(sEmotion_Gfx, 2, 2, 18), // FOLLOWER_EMOTION_MUSIC + overworld_frame(sEmotion_Gfx, 2, 2, 19), // FOLLOWER_EMOTION_MUSIC + overworld_frame(sEmotion_Gfx, 2, 2, 20), // FOLLOWER_EMOTION_POISONED + overworld_frame(sEmotion_Gfx, 2, 2, 21), // FOLLOWER_EMOTION_POISONED }; static const union AnimCmd sSpriteAnim_Emotes0[] = { From 915f40c654c5b50a0821f55e800140d56e64378e Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 11 Feb 2024 17:51:36 -0500 Subject: [PATCH 04/12] Improved follower message system. --- include/follower_helper.h | 120 ++++++++++++++++------------------- src/event_object_movement.c | 107 +++++++++++++++++++++---------- src/follower_helper.c | 122 +++++++++++++++--------------------- 3 files changed, 178 insertions(+), 171 deletions(-) diff --git a/include/follower_helper.h b/include/follower_helper.h index d8ab0621b1..bfe19fb2d4 100644 --- a/include/follower_helper.h +++ b/include/follower_helper.h @@ -16,81 +16,67 @@ enum { FOLLOWER_EMOTION_LENGTH, }; -// This struct is optimized for size -// Each "section" can be used to combine multiple conditions, -// i.e, species and map -// Just set the flags accordingly and use the right union member -struct __attribute__((packed)) FollowerMsgInfoExtended { +// Can be either 3 bytes, a u16 and a byte, or a 24-bit value +union __attribute__((packed)) MsgConditionData { + u8 bytes[3]; + struct __attribute__((packed)) { + u16 hw; + u8 b; + } split; + u32 raw:24; +}; // size = 0x3 + +struct __attribute__((packed)) MsgCondition { + u32 type:8; + union MsgConditionData data; +}; // size = 0x4 + +struct FollowerMsgInfoExtended { const u8 *text; const u8 *script; - union __attribute__((packed)) { - u16 species:10; - struct __attribute__((packed)) { - u16 type1:5; - u16 type2:5; // if >= NUMBER_OF_MON_TYPES, inverts checking for type1 - } types; - u16 status:10; - } st; - u16 stFlags:2; // 0 = no matching, 1 = species matching, 2 = type matching, 3 = status - u16 emotion:4; // emotion for this message - - union __attribute__((packed)) { - struct __attribute__((packed)) { - u16 mapSec:8; - } mapSec; - struct __attribute__((packed)) { - u16 mapNum:8; - u16 mapGroup:6; - } map; - struct __attribute__((packed)) { - u16 behavior1:8; - u16 behavior2:6; // not full; only goes up to 0x3F - } mb; - } mm; - u16 mmFlags:2; // 1 = map sec, 2 = map, 3 = metatile behavior - - union __attribute__((packed)) { - struct __attribute__((packed)) { - u16 weather1:5; - u16 weather2:5; - } weather; - u16 song:10; - u16 timeOfDay:10; - } wt; - u16 wtFlags:2; // 1 = weather matching, 2 = song, 3 = time - u16 weight:3; + u32 emotion:4; + u32 weight:3; // if set, `text` is treated as an array of up to 4 texts instead - u16 textSpread:1; + // which one is displayed is chosen at random + u32 textSpread:1; + u32 orFlag:1; // if set, *any* condition can match, rather than all - union __attribute__((packed)) { - struct __attribute__((packed)) { - u16 behavior:8; - u16 distance:6; - } mb; - } near; - u16 nearFlags:2; // 1 = mb within '+'-shaped distance away -}; + struct MsgCondition conditions[5]; +}; // size = 8 + 4 + 5*4 = 32, 0x20 -enum { - ST_FLAGS_SPECIES = 1, - ST_FLAGS_TYPE, - ST_FLAGS_STATUS, -}; +// Follower message conditions +#define MSG_COND_NONE 0 +#define MSG_COND_SPECIES 1 +#define MSG_COND_TYPE 2 +#define MSG_COND_STATUS 3 +#define MSG_COND_MAPSEC 4 +#define MSG_COND_MAP 5 +#define MSG_COND_ON_MB 6 +#define MSG_COND_WEATHER 7 +#define MSG_COND_MUSIC 8 +#define MSG_COND_TIME_OF_DAY 9 +#define MSG_COND_NEAR_MB 10 -enum { - MM_FLAGS_MAPSEC = 1, - MM_FLAGS_MAP, - MM_FLAGS_MB, // (m)etatile (b)ehavior -}; +#define MATCH_U24(type, value) {type, {.raw = value}} +#define MATCH_U16(type, value1, value2) {type, {.split = {.hw = value1, .b = value2}}} +#define MATCH_U8(type, v1, v2, v3) {type, {.bytes = {v1, v2, v3}}} -enum { - WT_FLAGS_WEATHER = 1, - WT_FLAGS_MUSIC, - WT_FLAGS_TIME, -}; - -#define NEAR_FLAGS_MB 1 +#define MATCH_SPECIES(species) MATCH_U24(MSG_COND_SPECIES, species) +#define MATCH_TYPES(type1, type2) MATCH_U8(MSG_COND_TYPE, type1, type2, 0) +// Checks that follower has *neither* of the two types +#define MATCH_NOT_TYPES(type1, type2) MATCH_U8(MSG_COND_TYPE, type1, type2, TYPE_NONE) +#define MATCH_STATUS(status) MATCH_U24(MSG_COND_STATUS, status) +#define MATCH_MAPSEC(mapsec) MATCH_U24(MSG_COND_MAPSEC, mapsec) +#define MATCH_MAP_RAW(mapGroup, mapNum) MATCH_U8(MSG_COND_MAP, mapGroup, mapNum, 0) +#define MATCH_MAP(map) MATCH_U8(MSG_COND_MAP, MAP_GROUP(map), MAP_NUM(map), 0) +// Matches one of two metatile behaviors follower is standing on +#define MATCH_ON_MB(mb1, mb2) MATCH_U8(MSG_COND_ON_MB, mb1, mb2, 0) +#define MATCH_WEATHER(weather1, weather2) MATCH_U8(MSG_COND_WEATHER, weather1, weather2, 0) +#define MATCH_MUSIC(song) MATCH_U24(MSG_COND_MUSIC, song) +#define MATCH_TIME_OF_DAY(time) MATCH_U24(MSG_COND_TIME_OF_DAY, time) +// Matches metatile behavior within a '+' shape of size `distance` +#define MATCH_NEAR_MB(mb, distance) MATCH_U8(MSG_COND_NEAR_MB, mb, distance, 0) enum { COND_MSG_CELEBI, diff --git a/src/event_object_movement.c b/src/event_object_movement.c index a428dd2aed..de5a3c855a 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2095,6 +2095,78 @@ static u32 FindMetatileBehaviorWithinRange(s32 x, s32 y, u32 mb, u8 distance) { return DIR_NONE; } +// Check a single follower message condition +bool32 CheckMsgCondition(const struct MsgCondition *cond, struct Pokemon *mon, u32 species, struct ObjectEvent *obj) { + u32 multi; + if (species == SPECIES_NONE) + species = GetMonData(mon, MON_DATA_SPECIES); + + switch (cond->type) + { + case MSG_COND_SPECIES: + return (cond->data.raw == species); + case MSG_COND_TYPE: + multi = (SpeciesHasType(species, cond->data.bytes[0]) || + SpeciesHasType(species, cond->data.bytes[1])); + // if bytes[2] == TYPE_NONE, + // invert; check that mon has *neither* type! + if (cond->data.bytes[2] == 0) + return multi; + else + return !multi; + break; + case MSG_COND_STATUS: + return (cond->data.raw & mon->status); + case MSG_COND_MAPSEC: + return (cond->data.raw == gMapHeader.regionMapSectionId); + case MSG_COND_MAP: + return (gSaveBlock1Ptr->location.mapGroup == cond->data.bytes[0] && + gSaveBlock1Ptr->location.mapNum == cond->data.bytes[1]); + case MSG_COND_ON_MB: + return (obj->currentMetatileBehavior == cond->data.bytes[0] || + obj->currentMetatileBehavior == cond->data.bytes[1]); + case MSG_COND_WEATHER: + multi = GetCurrentWeather(); + return (multi == cond->data.bytes[0] || multi == cond->data.bytes[1]); + case MSG_COND_MUSIC: + return (cond->data.raw == GetCurrentMapMusic()); + // Added on `lighting` branch + // case MSG_COND_TIME_OF_DAY: + // break; + case MSG_COND_NEAR_MB: + multi = FindMetatileBehaviorWithinRange( + obj->currentCoords.x, obj->currentCoords.y, + cond->data.bytes[0], cond->data.bytes[1]); + if (multi) + gSpecialVar_Result = multi; + return multi; + case MSG_COND_NONE: + // fallthrough + default: + return TRUE; + } +} + +// Check if follower info can be displayed in the current situation; +// i.e, if all its conditions match +bool32 CheckMsgInfo(const struct FollowerMsgInfoExtended *info, struct Pokemon *mon, u32 species, struct ObjectEvent *obj) { + u32 i; + + // any condition matches + if (info->orFlag) { + for (i = 0; i < ARRAY_COUNT(info->conditions) && info->conditions[i].type; i++) + if (CheckMsgCondition(&info->conditions[i], mon, species, obj)) + return TRUE; + return FALSE; + // all conditions must match + } else { + for (i = 0; i < ARRAY_COUNT(info->conditions) && info->conditions[i].type; i++) + if (!CheckMsgCondition(&info->conditions[i], mon, species, obj)) + return FALSE; + return TRUE; + } +} + // Call an applicable follower message script bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big switch for follower messages { @@ -2226,41 +2298,8 @@ bool8 ScrFunc_getfolloweraction(struct ScriptContext *ctx) // Essentially a big // (50% chance) Match *scripted* conditional messages, from follower_helper.c for (i = (Random() & 1) ? COND_MSG_COUNT : 0, j = 1; i < COND_MSG_COUNT; i++) { const struct FollowerMsgInfoExtended *info = &gFollowerConditionalMessages[i]; - if (info->stFlags == 1 && species != info->st.species) + if (!CheckMsgInfo(info, mon, species, objEvent)) continue; - if (info->stFlags == 2 && - (info->st.types.type2 >= NUMBER_OF_MON_TYPES ? - SpeciesHasType(species, info->st.types.type1) : - !(SpeciesHasType(species, info->st.types.type1) || SpeciesHasType(species, info->st.types.type2))) - ) - continue; - if (info->stFlags == 3 && !(mon->status & info->st.status)) - continue; - if (info->mmFlags == 1 && gMapHeader.regionMapSectionId != info->mm.mapSec.mapSec) - continue; - if (info->mmFlags == 2 && - !(gSaveBlock1Ptr->location.mapNum == info->mm.map.mapNum && - gSaveBlock1Ptr->location.mapGroup == info->mm.map.mapGroup) - ) - continue; - if (info->mmFlags == 3 && - !(objEvent->currentMetatileBehavior == info->mm.mb.behavior1 || - objEvent->currentMetatileBehavior == info->mm.mb.behavior2) - ) - continue; - if (info->wtFlags == 1 && - !(GetCurrentWeather() == info->wt.weather.weather1 || - GetCurrentWeather() == info->wt.weather.weather2) - ) - continue; - if (info->wtFlags == 2 && GetCurrentMapMusic() != info->wt.song) - continue; - if (info->nearFlags == 1) { - if ((multi2 = FindMetatileBehaviorWithinRange(objEvent->currentCoords.x, objEvent->currentCoords.y, info->near.mb.behavior, info->near.mb.distance))) - gSpecialVar_Result = multi2; - else - continue; - } // replace choice with weight/j chance if (Random() < (0x10000 / (j++)) * (info->weight ? info->weight : 1)) { diff --git a/src/follower_helper.c b/src/follower_helper.c index ace1eec45c..b2f44e7d1a 100644 --- a/src/follower_helper.c +++ b/src/follower_helper.c @@ -73,226 +73,208 @@ const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT .text = (u8*)sCelebiTexts, .textSpread = 1, .script = EventScript_FollowerDance, - .st = {.species = SPECIES_CELEBI}, - .stFlags = ST_FLAGS_SPECIES, .emotion = FOLLOWER_EMOTION_NEUTRAL, + .conditions = {MATCH_SPECIES(SPECIES_CELEBI)}, }, [COND_MSG_FIRE] = { .text = (u8*)sFireTexts, - .st = {.types = {.type1 = TYPE_FIRE, .type2 = TYPE_FIRE}}, - .stFlags = ST_FLAGS_TYPE, - .emotion = FOLLOWER_EMOTION_NEUTRAL, .textSpread = 1, + .emotion = FOLLOWER_EMOTION_NEUTRAL, + .conditions = {MATCH_TYPES(TYPE_FIRE, TYPE_FIRE)}, }, [COND_MSG_EVER_GRANDE] = { .text = sCondMsg06, .script = EventScript_FollowerFaceUp, - .mm = {.map = {.mapNum = MAP_NUM(EVER_GRANDE_CITY), .mapGroup = MAP_GROUP(EVER_GRANDE_CITY)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_HAPPY, + .conditions = {MATCH_MAP(EVER_GRANDE_CITY)}, }, [COND_MSG_ROUTE_112] = { .text = sCondMsg07, - .mm = {.map = {.mapNum = MAP_NUM(ROUTE112), .mapGroup = MAP_GROUP(ROUTE112)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_HAPPY, + .conditions = {MATCH_MAP(ROUTE112)}, }, [COND_MSG_DAY_CARE] = { .text = sCondMsg08, .script = EventScript_FollowerNostalgia, - .mm = {.map = {.mapNum = MAP_NUM(ROUTE117_POKEMON_DAY_CARE), .mapGroup = MAP_GROUP(ROUTE117_POKEMON_DAY_CARE)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_NEUTRAL, + .conditions = {MATCH_MAP(ROUTE117_POKEMON_DAY_CARE)}, }, [COND_MSG_MART] = { .text = (u8*)sShopTexts, .textSpread = 1, .script = EventScript_FollowerLookAround, - .wt = {.song = MUS_POKE_MART}, - .wtFlags = WT_FLAGS_MUSIC, .emotion = FOLLOWER_EMOTION_NEUTRAL, + .conditions = {MATCH_MUSIC(MUS_POKE_MART)}, }, [COND_MSG_VICTORY_ROAD] = { .text = sCondMsg11, - .wt = {.song = MUS_VICTORY_ROAD}, - .wtFlags = WT_FLAGS_MUSIC, .emotion = FOLLOWER_EMOTION_PENSIVE, + .conditions = {MATCH_MUSIC(MUS_VICTORY_ROAD)}, }, [COND_MSG_BIKE_SHOP] = { .text = sCondMsg12, - .mm = {.map = {.mapNum = MAP_NUM(MAUVILLE_CITY_BIKE_SHOP), .mapGroup = MAP_GROUP(MAUVILLE_CITY_BIKE_SHOP)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_PENSIVE, + .conditions = {MATCH_MAP(MAUVILLE_CITY_BIKE_SHOP)}, }, [COND_MSG_MACHINES] = { .text = (u8*)sMachineTexts, - .mm = {.map = {.mapNum = MAP_NUM(NEW_MAUVILLE_INSIDE), .mapGroup = MAP_GROUP(NEW_MAUVILLE_INSIDE)}}, - .mmFlags = MM_FLAGS_MAP, - .emotion = FOLLOWER_EMOTION_MUSIC, .textSpread = 1, + .emotion = FOLLOWER_EMOTION_MUSIC, + .orFlag = 1, // match any of these maps + .conditions = { + MATCH_MAP(NEW_MAUVILLE_INSIDE), + MATCH_MAP(SLATEPORT_CITY_STERNS_SHIPYARD_1F), + MATCH_MAP(SLATEPORT_CITY_STERNS_SHIPYARD_2F), + } }, [COND_MSG_SAILING] = { .text = (u8*)sBoatTexts, - .script = EventScript_FollowerLookAround, - .wt = {.song = MUS_SAILING}, - .wtFlags = WT_FLAGS_MUSIC, - .emotion = FOLLOWER_EMOTION_MUSIC, .textSpread = 1, + .emotion = FOLLOWER_EMOTION_MUSIC, + .script = EventScript_FollowerLookAround, + .conditions = {MATCH_MUSIC(MUS_SAILING)}, }, [COND_MSG_PUDDLE] = { .text = sCondMsg18, .script = EventScript_FollowerHopping, - .mm = {.mb = {.behavior1 = MB_SHALLOW_WATER, .behavior2 = MB_PUDDLE}}, - .mmFlags = MM_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_ON_MB(MB_SHALLOW_WATER, MB_PUDDLE)}, }, [COND_MSG_SAND] = { .text = sCondMsg19, - .mm = {.mb = {.behavior1 = MB_SAND, .behavior2 = MB_DEEP_SAND}}, - .mmFlags = MM_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_ON_MB(MB_SAND, MB_DEEP_SAND)}, }, [COND_MSG_GRASS] = { .text = sCondMsg20, - .mm = {.mb = {.behavior1 = MB_TALL_GRASS, .behavior2 = MB_LONG_GRASS}}, - .mmFlags = MM_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_ON_MB(MB_TALL_GRASS, MB_LONG_GRASS)}, }, [COND_MSG_FOOTPRINTS] = { .text = sCondMsg21, - .mm = {.mb = {.behavior1 = MB_SAND, .behavior2 = MB_FOOTPRINTS}}, - .mmFlags = MM_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_ON_MB(MB_SAND, MB_FOOTPRINTS)}, }, [COND_MSG_ELEVATOR] = { .text = (u8*)sElevatorTexts, .textSpread = 1, - .mm = {.map = {.mapNum = MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR), .mapGroup = MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_SURPRISE, + .conditions = {MATCH_MAP(LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR)}, }, [COND_MSG_ICE_ROOM] = { .text = (u8*)sColdTexts, .textSpread = 1, - .mm = {.map = {.mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_ICE_ROOM), .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_ICE_ROOM)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_SURPRISE, + .conditions = {MATCH_MAP(SHOAL_CAVE_LOW_TIDE_ICE_ROOM)}, }, [COND_MSG_ROUTE_117] = { .text = sCondMsg27, - .mm = {.map = {.mapNum = MAP_NUM(ROUTE117), .mapGroup = MAP_GROUP(ROUTE117)}}, - .mmFlags = MM_FLAGS_MAP, .emotion = FOLLOWER_EMOTION_SURPRISE, + .conditions = {MATCH_MAP(ROUTE117)}, }, [COND_MSG_DRAGON_GROWL] = { .text = sCondMsg28, - .st = {.types = {.type1 = TYPE_DRAGON, .type2 = TYPE_DRAGON}}, - .stFlags = ST_FLAGS_TYPE, - .mm = {.mapSec = {.mapSec = MAPSEC_SKY_PILLAR}}, - .mmFlags = MM_FLAGS_MAPSEC, .emotion = FOLLOWER_EMOTION_UPSET, + .conditions = { + MATCH_TYPES(TYPE_DRAGON, TYPE_DRAGON), + MATCH_MAPSEC(MAPSEC_SKY_PILLAR), + } }, [COND_MSG_FEAR] = { .text = (u8*)sFearTexts, .textSpread = 1, - .st = {.types = {.type1 = TYPE_GHOST, .type2 = TYPE_NOT_TYPE1}}, - .stFlags = ST_FLAGS_TYPE, - .mm = {.mapSec = {.mapSec = MAPSEC_MT_PYRE}}, - .mmFlags = MM_FLAGS_MAPSEC, - .wt = {.song = MUS_MT_PYRE}, - .wtFlags = WT_FLAGS_MUSIC, .emotion = FOLLOWER_EMOTION_UPSET, + .conditions = { + MATCH_NOT_TYPES(TYPE_GHOST, TYPE_GHOST), + MATCH_MAPSEC(MAPSEC_MT_PYRE), + MATCH_MUSIC(MUS_MT_PYRE), + } }, [COND_MSG_FIRE_RAIN] = { .text = sCondMsg31, - .st = {.types = {.type1 = TYPE_FIRE, .type2 = TYPE_FIRE}}, - .stFlags = ST_FLAGS_TYPE, - .wt = {.weather = {.weather1 = WEATHER_RAIN, .weather2 = WEATHER_RAIN_THUNDERSTORM}}, - .wtFlags = WT_FLAGS_WEATHER, .emotion = FOLLOWER_EMOTION_UPSET, + .conditions = { + MATCH_TYPES(TYPE_FIRE, TYPE_FIRE), + MATCH_WEATHER(WEATHER_RAIN, WEATHER_RAIN_THUNDERSTORM), + } }, [COND_MSG_FROZEN] = { .text = sCondMsg32, - .st = {.status = STATUS1_FREEZE}, - .stFlags = ST_FLAGS_STATUS, .emotion = FOLLOWER_EMOTION_UPSET, + .conditions = { + MATCH_STATUS(STATUS1_FREEZE), + } }, [COND_MSG_SEASIDE] = { .text = (u8*)sSeaTexts, .textSpread = 1, .script = EventScript_FollowerFaceResult, - .near = {.mb = {.behavior = MB_OCEAN_WATER, .distance = 5}}, - .nearFlags = NEAR_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_NEAR_MB(MB_OCEAN_WATER, 5)}, }, [COND_MSG_WATERFALL] = { .text = sCondMsg36, .script = EventScript_FollowerFaceResult, - .near = {.mb = {.behavior = MB_WATERFALL, .distance = 5}}, - .nearFlags = NEAR_FLAGS_MB, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = {MATCH_NEAR_MB(MB_WATERFALL, 5)}, }, [COND_MSG_RAIN] = { .text = sCondMsg37, - .st = {.types = {.type1 = TYPE_FIRE, .type2 = TYPE_NOT_TYPE1}}, - .stFlags = ST_FLAGS_TYPE, - .wt = {.weather = {.weather1 = WEATHER_RAIN, .weather2 = WEATHER_RAIN_THUNDERSTORM}}, - .wtFlags = WT_FLAGS_WEATHER, .emotion = FOLLOWER_EMOTION_MUSIC, + .conditions = { + MATCH_NOT_TYPES(TYPE_FIRE, TYPE_FIRE), + MATCH_WEATHER(WEATHER_RAIN, WEATHER_RAIN_THUNDERSTORM) + } }, [COND_MSG_REFLECTION] = { .text = sCondMsg38, .script = EventScript_FollowerFaceResult, - .near = {.mb = {.behavior = MB_POND_WATER, .distance = 1}}, - .nearFlags = NEAR_FLAGS_MB, .emotion = FOLLOWER_EMOTION_PENSIVE, + .conditions = {MATCH_NEAR_MB(MB_POND_WATER, 1)}, }, [COND_MSG_LEAVES] = { .text = sCondMsg39, - .mm = {.mapSec = {.mapSec = MAPSEC_PETALBURG_WOODS}}, - .mmFlags = MM_FLAGS_MAPSEC, .emotion = FOLLOWER_EMOTION_PENSIVE, + .conditions = {MATCH_MAPSEC(MAPSEC_PETALBURG_WOODS)}, }, [COND_MSG_ICE] = { .text = (u8*)sIceTexts, .textSpread = 1, .script = EventScript_FollowerFaceResult, - .near = {.mb = {.behavior = MB_ICE, .distance = 1}}, - .nearFlags = NEAR_FLAGS_MB, .emotion = FOLLOWER_EMOTION_PENSIVE, + .conditions = {MATCH_NEAR_MB(MB_ICE, 1)}, }, [COND_MSG_BURN] = { .text = sCondMsg42, - .st = {.status = STATUS1_BURN}, - .stFlags = ST_FLAGS_STATUS, .emotion = FOLLOWER_EMOTION_SAD, + .conditions = {MATCH_STATUS(STATUS1_BURN)}, }, }; From c9908514736ac7406eb88a67b2d65ec8c6a5dc83 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:48:23 -0500 Subject: [PATCH 05/12] Revert "Added function to check for newer emulators/hardware." This reverts commit c267dd6ee6e9766c70a1522adf6f0a812e337ae6. # TODOs changed: # -: Needs to be updated if compiling for a different processor than the GBA's: # TODOs changed: # -: Needs to be updated if compiling for a different processor than the GBA's: # TODOs changed: # -: Needs to be updated if compiling for a different processor than the GBA's: --- include/global.h | 2 +- src/main.c | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/include/global.h b/include/global.h index 92370fcdcd..ec091bb233 100644 --- a/include/global.h +++ b/include/global.h @@ -537,7 +537,7 @@ struct SaveBlock2 extern struct SaveBlock2 *gSaveBlock2Ptr; -extern bool8 IsAccurateGBA(void); +extern u8 UpdateSpritePaletteWithTime(u8); struct SecretBaseParty { diff --git a/src/main.c b/src/main.c index d4831b0e24..5f12a2996e 100644 --- a/src/main.c +++ b/src/main.c @@ -441,13 +441,3 @@ void ClearPokemonCrySongs(void) { CpuFill16(0, gPokemonCrySongs, MAX_POKEMON_CRIES * sizeof(struct PokemonCrySong)); } - -// TODO: Needs to be updated if compiling for a different processor than the GBA's -bool8 IsAccurateGBA(void) { // tests to see whether running on either an accurate emulator in >=2020, or real hardware - u32 code[5] = {0xFF1EE12F, 0xE1DF00B0, 0xE12FFF1E, 0xAAAABBBB, 0xCCCCDDDD}; // ARM: _;ldrh r0, [pc];bx lr - u32 func = (u32) &code[0]; - if (func & 3) // not word aligned; safer to just return false here - return FALSE; - func = (func & ~3) | 0x2; // misalign PC to test PC-relative loading - return ((u32 (*)(void)) func)() == code[3] >> 16; -} From 1e5fd80b7e268138865e0efeb61eed4c58ae7e01 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:48:55 -0500 Subject: [PATCH 06/12] Revert "Allowed running inside buildings." This reverts commit 4e3c2d84911614cfa917e2fa5d0fe1511fa5e41b. --- src/bike.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bike.c b/src/bike.c index b2680d103e..ae9dfd3e91 100644 --- a/src/bike.c +++ b/src/bike.c @@ -1053,7 +1053,7 @@ void Bike_HandleBumpySlopeJump(void) bool32 IsRunningDisallowed(u8 metatile) { - if (IsRunningDisallowedByMetatile(metatile) == TRUE) + if (!gMapHeader.allowRunning || IsRunningDisallowedByMetatile(metatile) == TRUE) return TRUE; else return FALSE; From 949fc48d269a0d84f9216bb881c22ae5c960360b Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 26 Jan 2024 18:50:12 -0500 Subject: [PATCH 07/12] Revert "Added nature colors to stats." This reverts commit 2d9c42110f32bc1fb8211b5f265d669d1ebeba95. --- src/pokemon_summary_screen.c | 49 ++++++++++++++---------------------- 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 911f1285dc..642b176d6b 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3360,36 +3360,23 @@ static void PrintRibbonCount(void) PrintTextOnWindow(AddWindowFromTemplateList(sPageSkillsTemplate, PSS_DATA_WINDOW_SKILLS_RIBBON_COUNT), text, x, 1, 0, 0); } -// Based on https://www.pokecommunity.com/showpost.php?p=10024409&postcount=21 -static void BufferStat(u8 *dst, s8 natureMod, u32 stat, u32 strId, u32 n) { - static const u8 textNatureMinus[] = _("{COLOR_HIGHLIGHT_SHADOW}{BLUE}{TRANSPARENT}{07}"); // Blue - static const u8 textNaturePlus[] = _("{COLOR_HIGHLIGHT_SHADOW}{05}{TRANSPARENT}{06}"); // Red - static const u8 textNatureNone[] = _("{COLOR_HIGHLIGHT_SHADOW}{01}{TRANSPARENT}{DARK_GRAY}"); // Black - u8 *txtPtr; - if (natureMod == 0) - txtPtr = StringCopy(dst, textNatureNone); - else if (natureMod > 0) - txtPtr = StringCopy(dst, textNaturePlus); - else - txtPtr = StringCopy(dst, textNatureMinus); - - ConvertIntToDecimalStringN(txtPtr, stat, STR_CONV_MODE_RIGHT_ALIGN, n); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(strId, dst); -} - static void BufferLeftColumnStats(void) { - u8 *currentHPString = Alloc(20); - u8 *maxHPString = Alloc(20); - u8 *attackString = Alloc(20); - u8 *defenseString = Alloc(20); - const s8 *natureMod = gNatureStatTable[sMonSummaryScreen->summary.nature]; + u8 *currentHPString = Alloc(8); + u8 *maxHPString = Alloc(8); + u8 *attackString = Alloc(8); + u8 *defenseString = Alloc(8); + + ConvertIntToDecimalStringN(currentHPString, sMonSummaryScreen->summary.currentHP, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(maxHPString, sMonSummaryScreen->summary.maxHP, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(attackString, sMonSummaryScreen->summary.atk, STR_CONV_MODE_RIGHT_ALIGN, 7); + ConvertIntToDecimalStringN(defenseString, sMonSummaryScreen->summary.def, STR_CONV_MODE_RIGHT_ALIGN, 7); DynamicPlaceholderTextUtil_Reset(); - BufferStat(currentHPString, 0, sMonSummaryScreen->summary.currentHP, 0, 3); - BufferStat(maxHPString, 0, sMonSummaryScreen->summary.maxHP, 1, 3); - BufferStat(attackString, natureMod[STAT_ATK - 1], sMonSummaryScreen->summary.atk, 2, 7); - BufferStat(defenseString, natureMod[STAT_DEF - 1], sMonSummaryScreen->summary.def, 3, 7); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, currentHPString); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, maxHPString); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, attackString); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, defenseString); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, sStatsLeftColumnLayout); Free(currentHPString); @@ -3405,12 +3392,14 @@ static void PrintLeftColumnStats(void) static void BufferRightColumnStats(void) { - const s8 *natureMod = gNatureStatTable[sMonSummaryScreen->summary.nature]; + ConvertIntToDecimalStringN(gStringVar1, sMonSummaryScreen->summary.spatk, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar2, sMonSummaryScreen->summary.spdef, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar3, sMonSummaryScreen->summary.speed, STR_CONV_MODE_RIGHT_ALIGN, 3); DynamicPlaceholderTextUtil_Reset(); - BufferStat(gStringVar1, natureMod[STAT_SPATK - 1], sMonSummaryScreen->summary.spatk, 0, 3); - BufferStat(gStringVar2, natureMod[STAT_SPDEF - 1], sMonSummaryScreen->summary.spdef, 1, 3); - BufferStat(gStringVar3, natureMod[STAT_SPEED - 1], sMonSummaryScreen->summary.speed, 2, 3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar2); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar3); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, sStatsRightColumnLayout); } From 7e2bbac2aa29f3b56e062492294a4b142a2a6f06 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Fri, 26 Jan 2024 19:23:17 -0500 Subject: [PATCH 08/12] Updated README. --- README.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0dde7185fb..07427e2bd5 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,21 @@ This fork tries to maintain vanilla compatibility whenever possible. It doesn't There are several branches, each with one main feature (and sometimes some extra stuff): **followers** branch: -* [HGSS-style pokémon followers](https://bulbapedia.bulbagarden.net/wiki/Walking_Pok%C3%A9mon#Pok.C3.A9mon_HeartGold_and_SoulSilver) for all 386 pokémon, including emotes, the 28 Unown forms and a majority of follower messages. -* Dynamic overworld palettes & reflections compatible with vanilla berry trees. -* PID (but not legitimacy) preserving Pokémon nature-changing function -* Function to detect modern emulators/GBA hardware. +* [HGSS-style pokémon followers](https://bulbapedia.bulbagarden.net/wiki/Walking_Pok%C3%A9mon#Pok.C3.A9mon_HeartGold_and_SoulSilver) for all 386 pokémon (including forms & shinies) +* Includes follower emotes and a majority of the HGSS messages +* Custom pokeball sprites for Gen 1-7 pokéballs +* Followers can use field moves in the overworld +* Overworld form changes for Ditto, Mew, Castform, etc. +* Asymmetrical & 64x64 OW support +* Dynamic Overworld Palette System (DOWP) & reflections compatible with berry trees, etc. > Note: Unless you have a specific need for it, you should probably use `followers-expanded-id` over this. +![Pokeball](https://i.imgur.com/OMbS67Q.gif) +![Messages](https://i.imgur.com/sTbGVEY.gif) +![Forms](https://i.imgur.com/wDhFNf4.gif) +![HM](https://i.imgur.com/lnXJGHd.gif) + **icons** branch: * Everything from the **followers** branch. * All pokemon icons updated to Gen 6, based on [this repo](https://github.com/msikma/pokesprite/tree/master/icons/pokemon/regular) @@ -32,7 +40,7 @@ There are several branches, each with one main feature (and sometimes some extra **just-lighting** branch: * `lighting-expanded-id` but with following pokémon code & assets completely removed. (This allows for more than 255 OW graphics) -* Saves with following pokémon can safely be loaded. +* Saves with following pokémon can still safely be loaded. **followers-expanded-id** branch: * Like `followers`, but includes expands OW graphicsIds to 16-bits @@ -45,6 +53,12 @@ Additional branches to mention: To set up the repository, see [INSTALL.md](INSTALL.md). +**guillotine** branch: +* ~~Decapitates~~ Decapitalizes **all** text at runtime, with some exceptions (see the [FAQ](#guillotine-q-how-can-i-keep-my-strings-from-being-decapped)) +* Future-proof, does not require mass-replacing strings + +To set up the repository, see [INSTALL.md](INSTALL.md). + ## FAQ ### `(followers*)` Q: Where are the config settings? A: Configuration for the follower system is mostly in [event_objects.h](include/constants/event_objects.h): @@ -57,6 +71,10 @@ A: Configuration for the follower system is mostly in [event_objects.h](include/ // to OW code so that large (48x48, 64x64) OWs // will display correctly under bridges, etc. #define LARGE_OW_SUPPORT TRUE + +// Followers will emerge from the pokeball they are stored in, +// instead of a normal pokeball +#define OW_MON_POKEBALLS TRUE ``` ### `(lighting)` Q: How do I mark certain colors in a palette as light-blended? @@ -76,6 +94,35 @@ on separate lines to mark those colors as being light-blended, i.e: You might have to `make mostlyclean` or change the `.pal` file to pick up the changes. +### `(guillotine)` Q: How can I keep my string(s) from being decapped? +A: There are a number of ways to make a string "fixed case" so that it will not be decapitalized when displayed: + +C strings: Replace the `_` with `_C`: +```c +// _C = fixed (C)ase string! +const u8 gText_IDNumber[] = _C("IDNo."); +``` +ASM strings: Replace `.string` with `.fixstr`: +```arm +gText_SavingDontTurnOff:: + @ Lasts until the string terminator '$' + .fixstr "SAVING…\n" + .string "DON'T TURN OFF THE POWER.$" +``` +You can fix-case/unfix parts of a string like so: +```arm + .string "{FIXED_CASE}WARNING!{UNFIX_CASE}\p" +``` +For a placeholder (only the placeholder will be fixed-case): +```arm + .string "{STR_VAR_2_FIXED} was transferred to\n" + .string "BOX “{STR_VAR_1}.”$" +``` +See also the configuration in [text.h](gflib/text.h). + +There's also special handling for "separated bigrams"; basically, two letter words. +This includes: `"TM01", "PC", "EV"`, any two uppercase characters surrounded by digits, whitespace, or the start/end of a string. These will not be decapped. + ## See also For contacts and other pret projects, see [pret.github.io](https://pret.github.io/). From f861504cfc50941768286c0703d24ab0aaceb88e Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Thu, 15 Feb 2024 22:23:59 -0500 Subject: [PATCH 09/12] Undo map.json changes. --- data/maps/AncientTomb/map.json | 6 ++++-- .../BattleFrontier_BattleDomeBattleRoom/map.json | 14 ++++++++++---- data/maps/IslandCave/map.json | 6 ++++-- data/maps/Route123/map.json | 2 +- data/maps/map_groups.json | 1 + 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/data/maps/AncientTomb/map.json b/data/maps/AncientTomb/map.json index 818dbf23a0..16df613a49 100644 --- a/data/maps/AncientTomb/map.json +++ b/data/maps/AncientTomb/map.json @@ -12,7 +12,7 @@ "allow_running": true, "show_map_name": true, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", - "connections": null, + "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_OW_MON", @@ -51,7 +51,9 @@ "dest_warp_id": "1" } ], - "coord_events": [], + "coord_events": [ + + ], "bg_events": [ { "type": "sign", diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json b/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json index c2b427cbe3..f4c52ce05f 100644 --- a/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json +++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json @@ -12,7 +12,7 @@ "allow_running": false, "show_map_name": false, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", - "connections": null, + "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_REPORTER_M", @@ -210,7 +210,13 @@ "flag": "0" } ], - "warp_events": [], - "coord_events": [], - "bg_events": [] + "warp_events": [ + + ], + "coord_events": [ + + ], + "bg_events": [ + + ] } diff --git a/data/maps/IslandCave/map.json b/data/maps/IslandCave/map.json index 3ed75460d0..24c6e0cd27 100644 --- a/data/maps/IslandCave/map.json +++ b/data/maps/IslandCave/map.json @@ -12,7 +12,7 @@ "allow_running": true, "show_map_name": true, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", - "connections": null, + "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_OW_MON", @@ -51,7 +51,9 @@ "dest_warp_id": "1" } ], - "coord_events": [], + "coord_events": [ + + ], "bg_events": [ { "type": "sign", diff --git a/data/maps/Route123/map.json b/data/maps/Route123/map.json index 11798b95d4..ca0d757e3a 100644 --- a/data/maps/Route123/map.json +++ b/data/maps/Route123/map.json @@ -559,7 +559,7 @@ "flag": "0" }, { - "graphics_id": "OBJ_EVENT_GFX_YOUNGSTER", + "graphics_id": "OBJ_EVENT_GFX_BUG_CATCHER", "x": 14, "y": 12, "elevation": 3, diff --git a/data/maps/map_groups.json b/data/maps/map_groups.json index ebef431b30..d0a6a8b55c 100644 --- a/data/maps/map_groups.json +++ b/data/maps/map_groups.json @@ -1,4 +1,5 @@ { + "layouts_table_label": "gMapLayouts", "group_order": [ "gMapGroup_TownsAndRoutes", "gMapGroup_IndoorLittleroot", From afbb88d77ada8a636a318ec32b61b4ea849d85ab Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Thu, 15 Feb 2024 22:24:20 -0500 Subject: [PATCH 10/12] Undo (most) indentation changes. --- src/data/field_effects/field_effect_objects.h | 231 ++++++------------ src/field_effect_helpers.c | 6 +- src/field_screen_effect.c | 3 +- src/load_save.c | 10 +- src/overworld.c | 3 +- src/palette.c | 21 +- src/party_menu.c | 4 +- src/pokeball.c | 3 +- src/rayquaza_scene.c | 2 - src/scrcmd.c | 11 +- src/trainer_see.c | 9 +- 11 files changed, 102 insertions(+), 201 deletions(-) diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index b3a3ffbac5..8cd0a6f819 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -12,23 +12,19 @@ static const union AnimCmd *const sAnimTable_Shadow[] = sAnim_Shadow, }; -static const struct SpriteFrameImage sPicTable_ShadowSmall[] = -{ +static const struct SpriteFrameImage sPicTable_ShadowSmall[] = { obj_frame_tiles(gFieldEffectObjectPic_ShadowSmall), }; -static const struct SpriteFrameImage sPicTable_ShadowMedium[] = -{ +static const struct SpriteFrameImage sPicTable_ShadowMedium[] = { obj_frame_tiles(gFieldEffectObjectPic_ShadowMedium), }; -static const struct SpriteFrameImage sPicTable_ShadowLarge[] = -{ +static const struct SpriteFrameImage sPicTable_ShadowLarge[] = { obj_frame_tiles(gFieldEffectObjectPic_ShadowLarge), }; -static const struct SpriteFrameImage sPicTable_ShadowExtraLarge[] = -{ +static const struct SpriteFrameImage sPicTable_ShadowExtraLarge[] = { obj_frame_tiles(gFieldEffectObjectPic_ShadowExtraLarge), }; @@ -40,8 +36,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = {TAG_NONE, const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = {TAG_NONE, TAG_WEATHER_START, &gObjectEventBaseOam_64x32, sAnimTable_Shadow, sPicTable_ShadowExtraLarge, gDummySpriteAffineAnimTable, UpdateShadowFieldEffect}; -static const struct SpriteFrameImage sPicTable_TallGrass[] = -{ +static const struct SpriteFrameImage sPicTable_TallGrass[] = { overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 2), @@ -64,8 +59,7 @@ static const union AnimCmd *const sAnimTable_TallGrass[] = sAnim_TallGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -75,8 +69,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass = .callback = UpdateTallGrassFieldEffect, }; -static const struct SpriteFrameImage sPicTable_Ripple[] = -{ +static const struct SpriteFrameImage sPicTable_Ripple[] = { overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Ripple, 2, 2, 2), @@ -102,8 +95,7 @@ static const union AnimCmd *const sAnimTable_Ripple[] = sAnim_Ripple, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -113,8 +105,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple = .callback = WaitFieldEffectSpriteAnim, }; -static const struct SpriteFrameImage sPicTable_Ash[] = -{ +static const struct SpriteFrameImage sPicTable_Ash[] = { overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 2), @@ -137,8 +128,7 @@ static const union AnimCmd *const sAnimTable_Ash[] = sAnim_Ash, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Ash = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_Ash = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -148,8 +138,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Ash = .callback = UpdateAshFieldEffect, }; -static const struct SpriteFrameImage sPicTable_SurfBlob[] = -{ +static const struct SpriteFrameImage sPicTable_SurfBlob[] = { overworld_frame(gFieldEffectObjectPic_SurfBlob, 4, 4, 0), overworld_frame(gFieldEffectObjectPic_SurfBlob, 4, 4, 1), overworld_frame(gFieldEffectObjectPic_SurfBlob, 4, 4, 2), @@ -187,8 +176,7 @@ static const union AnimCmd *const sAnimTable_SurfBlob[] = sSurfBlobAnim_FaceEast, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_MAY, .oam = &gObjectEventBaseOam_32x32, @@ -198,8 +186,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = .callback = UpdateSurfBlobFieldEffect, }; -static const struct SpriteFrameImage sPicTable_Arrow[] = -{ +static const struct SpriteFrameImage sPicTable_Arrow[] = { overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Arrow, 2, 2, 2), @@ -246,8 +233,7 @@ static const union AnimCmd *const sAnimTable_Arrow[] = sArrowAnim_East, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_MAY, .oam = &gObjectEventBaseOam_16x16, @@ -257,8 +243,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow = .callback = SpriteCallbackDummy, }; -static const struct SpriteFrameImage sPicTable_GroundImpactDust[] = -{ +static const struct SpriteFrameImage sPicTable_GroundImpactDust[] = { overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_GroundImpactDust, 2, 1, 2), @@ -277,8 +262,7 @@ static const union AnimCmd *const sAnimTable_GroundImpactDust[] = sAnim_GroundImpactDust, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, @@ -288,8 +272,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust = .callback = UpdateJumpImpactEffect, }; -static const struct SpriteFrameImage sPicTable_JumpTallGrass[] = -{ +static const struct SpriteFrameImage sPicTable_JumpTallGrass[] = { overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_JumpTallGrass, 2, 1, 2), @@ -310,8 +293,7 @@ static const union AnimCmd *const sAnimTable_JumpTallGrass[] = sAnim_JumpTallGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x8, @@ -321,8 +303,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_JumpTallGrass = .callback = UpdateJumpImpactEffect, }; -static const struct SpriteFrameImage sPicTable_SandFootprints[] = -{ +static const struct SpriteFrameImage sPicTable_SandFootprints[] = { overworld_frame(gFieldEffectObjectPic_SandFootprints, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_SandFootprints, 2, 2, 1), }; @@ -360,8 +341,7 @@ static const union AnimCmd *const sAnimTable_SandFootprints[] = sSandFootprintsAnim_East, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -371,8 +351,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints = .callback = UpdateFootprintsTireTracksFieldEffect, }; -static const struct SpriteFrameImage sPicTable_DeepSandFootprints[] = -{ +static const struct SpriteFrameImage sPicTable_DeepSandFootprints[] = { overworld_frame(gFieldEffectObjectPic_DeepSandFootprints, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_DeepSandFootprints, 2, 2, 1), }; @@ -410,8 +389,7 @@ static const union AnimCmd *const sAnimTable_DeepSandFootprints[] = sDeepSandFootprintsAnim_East, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -421,21 +399,18 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints = .callback = UpdateFootprintsTireTracksFieldEffect, }; -static const struct SpriteFrameImage sPicTable_BugTracks[] = -{ +static const struct SpriteFrameImage sPicTable_BugTracks[] = { overworld_frame(gFieldEffectObjectPic_BugTracks, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_BugTracks, 2, 2, 1), }; -static const struct SpriteFrameImage sPicTable_SpotTracks[] = -{ +static const struct SpriteFrameImage sPicTable_SpotTracks[] = { overworld_frame(gFieldEffectObjectPic_SpotTracks, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_SpotTracks, 2, 2, 1), }; -const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks = -{ - .tileTag = TAG_NONE, +const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks = { + .tileTag = 0xFFFF, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_DeepSandFootprints, @@ -444,9 +419,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_BugTracks = .callback = UpdateFootprintsTireTracksFieldEffect, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks = -{ - .tileTag = TAG_NONE, +const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks = { + .tileTag = 0xFFFF, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_DeepSandFootprints, @@ -455,8 +429,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SpotTracks = .callback = UpdateFootprintsTireTracksFieldEffect, }; -static const struct SpriteFrameImage sPicTable_BikeTireTracks[] = -{ +static const struct SpriteFrameImage sPicTable_BikeTireTracks[] = { overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_BikeTireTracks, 2, 2, 2), @@ -464,8 +437,7 @@ static const struct SpriteFrameImage sPicTable_BikeTireTracks[] = }; -static const struct SpriteFrameImage sPicTable_SlitherTracks[] = -{ +static const struct SpriteFrameImage sPicTable_SlitherTracks[] = { overworld_frame(gFieldEffectObjectPic_SlitherTracks, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_SlitherTracks, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_SlitherTracks, 2, 2, 2), @@ -533,8 +505,7 @@ static const union AnimCmd *const sAnimTable_BikeTireTracks[] = sBikeTireTracksAnim_NECornerTurn, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -545,9 +516,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks = }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SlitherTracks = -{ - .tileTag = TAG_NONE, +const struct SpriteTemplate gFieldEffectObjectTemplate_SlitherTracks = { + .tileTag = 0xFFFF, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_BikeTireTracks, @@ -556,8 +526,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SlitherTracks = .callback = UpdateFootprintsTireTracksFieldEffect, }; -static const struct SpriteFrameImage sPicTable_JumpBigSplash[] = -{ +static const struct SpriteFrameImage sPicTable_JumpBigSplash[] = { overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_JumpBigSplash, 2, 2, 2), @@ -578,8 +547,7 @@ static const union AnimCmd *const sAnimTable_JumpBigSplash[] = sAnim_JumpBigSplash, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -589,8 +557,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_JumpBigSplash = .callback = UpdateJumpImpactEffect, }; -static const struct SpriteFrameImage sPicTable_Splash[] = -{ +static const struct SpriteFrameImage sPicTable_Splash[] = { overworld_frame(gFieldEffectObjectPic_Splash, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_Splash, 2, 1, 1), }; @@ -621,8 +588,7 @@ static const union AnimCmd *const sAnimTable_Splash[] = sAnim_Splash_1, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Splash = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_Splash = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, @@ -632,8 +598,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Splash = .callback = UpdateSplashFieldEffect, }; -static const struct SpriteFrameImage sPicTable_JumpSmallSplash[] = -{ +static const struct SpriteFrameImage sPicTable_JumpSmallSplash[] = { overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_JumpSmallSplash, 2, 1, 2), @@ -652,8 +617,7 @@ static const union AnimCmd *const sAnimTable_JumpSmallSplash[] = sAnim_JumpSmallSplash, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, @@ -663,8 +627,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_JumpSmallSplash = .callback = UpdateJumpImpactEffect, }; -static const struct SpriteFrameImage sPicTable_LongGrass[] = -{ +static const struct SpriteFrameImage sPicTable_LongGrass[] = { overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_LongGrass, 2, 2, 2), @@ -688,8 +651,7 @@ static const union AnimCmd *const sAnimTable_LongGrass[] = sAnim_LongGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -699,8 +661,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass = .callback = UpdateLongGrassFieldEffect, }; -static const struct SpriteFrameImage sPicTable_JumpLongGrass[] = -{ +static const struct SpriteFrameImage sPicTable_JumpLongGrass[] = { overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 2), @@ -725,8 +686,7 @@ static const union AnimCmd *const sAnimTable_JumpLongGrass[] = sAnim_JumpLongGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_JumpLongGrass = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_JumpLongGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -736,8 +696,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_JumpLongGrass = .callback = UpdateJumpImpactEffect, }; -static const struct SpriteFrameImage sPicTable_UnusedGrass[] = -{ +static const struct SpriteFrameImage sPicTable_UnusedGrass[] = { overworld_frame(gFieldEffectObjectPic_JumpLongGrass, 2, 2, 6), overworld_frame(gFieldEffectObjectPic_Unknown17, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Unknown17, 2, 2, 1), @@ -768,8 +727,7 @@ static const union AnimCmd *const sAnimTable_UnusedGrass[] = sAnim_UnusedGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -779,8 +737,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass = .callback = WaitFieldEffectSpriteAnim, }; -static const struct SpriteFrameImage sPicTable_UnusedGrass2[] = -{ +static const struct SpriteFrameImage sPicTable_UnusedGrass2[] = { overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_UnusedGrass2, 2, 2, 2), @@ -803,8 +760,7 @@ static const union AnimCmd *const sAnimTable_UnusedGrass2[] = sAnim_UnusedGrass2, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass2 = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass2 = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -814,8 +770,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedGrass2 = .callback = WaitFieldEffectSpriteAnim, }; -static const struct SpriteFrameImage sPicTable_UnusedSand[] = -{ +static const struct SpriteFrameImage sPicTable_UnusedSand[] = { overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_UnusedSand, 2, 2, 2), @@ -836,8 +791,7 @@ static const union AnimCmd *const sAnimTable_UnusedSand[] = sAnim_UnusedSand, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedSand = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedSand = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -847,8 +801,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_UnusedSand = .callback = WaitFieldEffectSpriteAnim, }; -static const struct SpriteFrameImage sPicTable_SandPile[] = -{ +static const struct SpriteFrameImage sPicTable_SandPile[] = { overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 0), overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 1), overworld_frame(gFieldEffectObjectPic_SandPile, 2, 1, 2), @@ -867,8 +820,7 @@ static const union AnimCmd *const sAnimTable_SandPile[] = sAnim_SandPile, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SandPile = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_SandPile = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x8, @@ -878,8 +830,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SandPile = .callback = UpdateSandPileFieldEffect, }; -static const struct SpriteFrameImage sPicTable_WaterSurfacing[] = -{ +static const struct SpriteFrameImage sPicTable_WaterSurfacing[] = { overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_WaterSurfacing, 2, 2, 2), @@ -902,8 +853,7 @@ static const union AnimCmd *const sAnimTable_WaterSurfacing[] = sAnim_WaterSurfacing, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_WaterSurfacing = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_WaterSurfacing = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x16, @@ -947,8 +897,7 @@ static const union AffineAnimCmd *const sAffineAnims_ReflectionDistortion[] = sAffineAnim_ReflectionDistortion_1, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_ReflectionDistortion = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_ReflectionDistortion = { .tileTag = 0x0, .paletteTag = TAG_NONE, .oam = &gDummyOamData, @@ -958,8 +907,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ReflectionDistortion = .callback = SpriteCallbackDummy, }; -static const struct SpriteFrameImage sPicTable_Sparkle[] = -{ +static const struct SpriteFrameImage sPicTable_Sparkle[] = { overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_Sparkle, 2, 2, 2), @@ -998,8 +946,7 @@ static const union AnimCmd *const sAnimTable_Sparkle[] = sAnim_Sparkle, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_NPC_2, .oam = &gObjectEventBaseOam_16x16, @@ -1009,8 +956,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle = .callback = WaitFieldEffectSpriteAnim, }; -static const struct SpriteFrameImage sPicTable_TreeDisguise[] = -{ +static const struct SpriteFrameImage sPicTable_TreeDisguise[] = { overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 2), @@ -1044,8 +990,7 @@ static const union AnimCmd *const sAnimTable_TreeDisguise[] = sAnim_TreeDisguiseReveal, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_3, .oam = &gObjectEventBaseOam_16x32, @@ -1055,8 +1000,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise = .callback = UpdateDisguiseFieldEffect, }; -static const struct SpriteFrameImage sPicTable_MountainDisguise[] = -{ +static const struct SpriteFrameImage sPicTable_MountainDisguise[] = { overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_MountainDisguise, 2, 4, 2), @@ -1090,8 +1034,7 @@ static const union AnimCmd *const sAnimTable_MountainDisguise[] = sAnim_MountainDisguiseReveal, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_2, .oam = &gObjectEventBaseOam_16x32, @@ -1101,8 +1044,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise = .callback = UpdateDisguiseFieldEffect, }; -static const struct SpriteFrameImage sPicTable_SandDisguisePlaceholder[] = -{ +static const struct SpriteFrameImage sPicTable_SandDisguisePlaceholder[] = { overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 2), @@ -1112,8 +1054,7 @@ static const struct SpriteFrameImage sPicTable_SandDisguisePlaceholder[] = overworld_frame(gFieldEffectObjectPic_SandDisguisePlaceholder, 2, 4, 6), }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_16x32, @@ -1123,8 +1064,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder = .callback = UpdateDisguiseFieldEffect, }; -static const struct SpriteFrameImage sPicTable_Bird[] = -{ +static const struct SpriteFrameImage sPicTable_Bird[] = { obj_frame_tiles(gFieldEffectObjectPic_Bird), }; @@ -1139,8 +1079,7 @@ static const union AnimCmd *const sAnimTable_Bird[] = sAnim_Bird, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Bird = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_Bird = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_MAY, .oam = &gObjectEventBaseOam_32x32, @@ -1150,8 +1089,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Bird = .callback = SpriteCallbackDummy, }; -static const struct SpriteFrameImage sPicTable_ShortGrass[] = -{ +static const struct SpriteFrameImage sPicTable_ShortGrass[] = { overworld_frame(gFieldEffectObjectPic_ShortGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_ShortGrass, 2, 2, 1), }; @@ -1168,8 +1106,7 @@ static const union AnimCmd *const sAnimTable_ShortGrass[] = sAnim_ShortGrass, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -1179,8 +1116,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass = .callback = UpdateShortGrassFieldEffect, }; -static const struct SpriteFrameImage sPicTable_HotSpringsWater[] = -{ +static const struct SpriteFrameImage sPicTable_HotSpringsWater[] = { obj_frame_tiles(gFieldEffectObjectPic_HotSpringsWater), }; @@ -1195,8 +1131,7 @@ static const union AnimCmd *const sAnimTable_HotSpringsWater[] = sAnim_HotSpringsWater, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_1, .oam = &gObjectEventBaseOam_16x16, @@ -1206,8 +1141,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater = .callback = UpdateHotSpringsWaterFieldEffect, }; -static const struct SpriteFrameImage sPicTable_AshPuff[] = -{ +static const struct SpriteFrameImage sPicTable_AshPuff[] = { overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_AshPuff, 2, 2, 2), @@ -1243,8 +1177,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_AshPuff = const struct SpritePalette gSpritePalette_Ash = {gFieldEffectPal_Ash, FLDEFF_PAL_TAG_ASH}; -static const struct SpriteFrameImage sPicTable_AshLaunch[] = -{ +static const struct SpriteFrameImage sPicTable_AshLaunch[] = { overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 1), overworld_frame(gFieldEffectObjectPic_AshLaunch, 2, 2, 2), @@ -1278,8 +1211,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_AshLaunch = .callback = SpriteCB_AshLaunch }; -static const struct SpriteFrameImage sPicTable_Bubbles[] = -{ +static const struct SpriteFrameImage sPicTable_Bubbles[] = { overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 0), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 1), overworld_frame(gFieldEffectObjectPic_Bubbles, 2, 4, 2), @@ -1308,8 +1240,7 @@ static const union AnimCmd *const sAnimTable_Bubbles[] = sAnim_Bubbles, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &gObjectEventBaseOam_16x32, @@ -1319,8 +1250,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles = .callback = UpdateBubblesFieldEffect, }; -static const struct SpriteFrameImage sPicTable_SmallSparkle[] = -{ +static const struct SpriteFrameImage sPicTable_SmallSparkle[] = { overworld_frame(gFieldEffectObjectPic_SmallSparkle, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_SmallSparkle, 2, 2, 1), }; @@ -1338,8 +1268,7 @@ static const union AnimCmd *const sAnimTable_SmallSparkle[] = sAnim_SmallSparkle, }; -const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle = { .tileTag = TAG_NONE, .paletteTag = FLDEFF_PAL_TAG_SMALL_SPARKLE, .oam = &gObjectEventBaseOam_16x16, @@ -1351,24 +1280,20 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle = const struct SpritePalette gSpritePalette_SmallSparkle = {gFieldEffectPal_SmallSparkle, FLDEFF_PAL_TAG_SMALL_SPARKLE}; -static const union AnimCmd sAnim_RayquazaSpotlightEffect[] = -{ +static const union AnimCmd sAnim_RayquazaSpotlightEffect[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -static const union AnimCmd *const sAnimTable_RayquazaSpotlightEffect[] = -{ +static const union AnimCmd *const sAnimTable_RayquazaSpotlightEffect[] = { sAnim_RayquazaSpotlightEffect, }; -static const struct SpriteFrameImage sPicTable_RayquazaSpotlightEffect[] = -{ +static const struct SpriteFrameImage sPicTable_RayquazaSpotlightEffect[] = { overworld_frame(gObjectEventPic_Rayquaza, 4, 4, 0), }; -const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = -{ +const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = { .tileTag = TAG_NONE, .paletteTag = TAG_NONE, .oam = &gObjectEventBaseOam_32x32, diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 02b08aee3a..f9330e2c96 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -54,8 +54,7 @@ u32 FldEff_Shadow(void); #define sReflectionVerticalOffset data[2] #define sIsStillReflection data[7] -void SetUpShadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ +void SetUpShadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { gFieldEffectArguments[0] = objectEvent->localId; gFieldEffectArguments[1] = gSaveBlock1Ptr->location.mapNum; gFieldEffectArguments[2] = gSaveBlock1Ptr->location.mapGroup; @@ -326,8 +325,7 @@ u32 FldEff_Shadow(void) const struct ObjectEventGraphicsInfo *graphicsInfo; u8 spriteId; u8 i; - for (i = 0; i < MAX_SPRITES; i++) - { + for (i = 0; i < MAX_SPRITES; i++) { // Return early if a shadow sprite already exists if (gSprites[i].data[0] == gFieldEffectArguments[0] && gSprites[i].callback == UpdateShadowFieldEffect) return 0; diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 9338fe183d..7961e05a18 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -687,8 +687,7 @@ static void Task_DoDoorWarp(u8 taskId) FreezeObjectEvents(); PlayerGetDestCoords(x, y); PlaySE(GetDoorSoundEffect(*x, *y - 1)); - if (followerObject) - { + if (followerObject) { // Put follower into pokeball ClearObjectEventMovement(followerObject, &gSprites[followerObject->spriteId]); ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL); diff --git a/src/load_save.c b/src/load_save.c index 3ac12c529d..9c10b4b10e 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -182,8 +182,7 @@ void SaveObjectEvents(void) { int i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { gSaveBlock1Ptr->objectEvents[i] = gObjectEvents[i]; // To avoid crash on vanilla, save follower as inactive if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER) @@ -195,11 +194,12 @@ void LoadObjectEvents(void) { int i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { gObjectEvents[i] = gSaveBlock1Ptr->objectEvents[i]; // Try to restore saved inactive follower - if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && !gObjectEvents[i].active && gObjectEvents[i].extra.asU16) + if (gObjectEvents[i].localId == OBJ_EVENT_ID_FOLLOWER && + !gObjectEvents[i].active && + gObjectEvents[i].extra.asU16) gObjectEvents[i].active = TRUE; } } diff --git a/src/overworld.c b/src/overworld.c index 5921e9e565..d233bb9c20 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1490,8 +1490,7 @@ void CB2_Overworld(void) if (fading) SetVBlankCallback(NULL); OverworldBasic(); - if (fading) - { + if (fading) { SetFieldVBlankCallback(); return; } diff --git a/src/palette.c b/src/palette.c index 83590fc3d2..3a576e1e9e 100644 --- a/src/palette.c +++ b/src/palette.c @@ -444,27 +444,18 @@ static u8 UpdateTimeOfDayPaletteFade(void) // Like normal, but respects sprite p paletteOffset = 256; } - for (paletteNum = 0; paletteNum < 16; paletteNum++, selectedPalettes >>= 1, paletteOffset += 16) - { - if (selectedPalettes & 1) - { - if (gPaletteFade.yDec) - { + for (paletteNum = 0; paletteNum < 16; paletteNum++, selectedPalettes >>= 1, paletteOffset += 16) { + if (selectedPalettes & 1) { + if (gPaletteFade.yDec) { // sprite palettes - if (gPaletteFade.objPaletteToggle) - { + if (gPaletteFade.objPaletteToggle) { if (gPaletteFade.y >= gPaletteFade.targetY || GetSpritePaletteTagByPaletteNum(paletteNum) & 0x8000) BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); - - } // tile palettes - else if (gPaletteFade.y >= gPaletteFade.targetY || (paletteNum >= 13 && paletteNum <= 15)) - { + } else if (gPaletteFade.y >= gPaletteFade.targetY || (paletteNum >= 13 && paletteNum <= 15)) { BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); } - } - else - { + } else { BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); } } diff --git a/src/party_menu.c b/src/party_menu.c index 8e9b1e58f8..41e7fe1021 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -3821,9 +3821,7 @@ bool8 FieldCallback_PrepareFadeInFromMenu(void) return TRUE; } -// same as above, but removes follower pokemon -bool8 FieldCallback_PrepareFadeInForTeleport(void) -{ +bool8 FieldCallback_PrepareFadeInForTeleport(void) { // same as above, but removes follower pokemon RemoveFollowingPokemon(); return FieldCallback_PrepareFadeInFromMenu(); } diff --git a/src/pokeball.c b/src/pokeball.c index 3c95328e14..47335fe4ec 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -852,8 +852,7 @@ static void HandleBallAnimEnd(struct Sprite *sprite) bool8 affineAnimEnded = FALSE; u8 battlerId = sprite->sBattler; - if (sprite->data[7] == POKEBALL_PLAYER_SLIDEIN) - { + if (sprite->data[7] == POKEBALL_PLAYER_SLIDEIN) { gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = SpriteCB_PlayerMonSlideIn; AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]); gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0x1000; diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index b3e0276f1d..00b7cdd971 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -1303,10 +1303,8 @@ static void CB2_InitRayquazaScene(void) ClearScheduledBgCopiesToVram(); ScanlineEffect_Stop(); for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { if (gObjectEvents[i].graphicsId == OBJ_EVENT_GFX_RAYQUAZA) gObjectEvents[i].invisible = FALSE; - } FreeAllSpritePalettes(); ResetPaletteFade(); ResetSpriteData(); diff --git a/src/scrcmd.c b/src/scrcmd.c index b1c493cb54..df490518fc 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1004,16 +1004,14 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx) struct ObjectEvent *objEvent; // When applying script movements to follower, it may have frozen animation that must be cleared - if (localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen) - { + if (localId == OBJ_EVENT_ID_FOLLOWER && (objEvent = GetFollowerObject()) && objEvent->frozen) { ClearObjectEventMovement(objEvent, &gSprites[objEvent->spriteId]); gSprites[objEvent->spriteId].animCmdIndex = 0; // Needed to set start frame of animation } ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript); sMovingNpcId = localId; // Force follower into pokeball - if (localId != OBJ_EVENT_ID_FOLLOWER && !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) - { + if (localId != OBJ_EVENT_ID_FOLLOWER && !FlagGet(FLAG_SAFE_FOLLOWER_MOVEMENT)) { objEvent = GetFollowerObject(); // return early if no follower or in shadowing state if (objEvent == NULL || gSprites[objEvent->spriteId].data[1] == 0) @@ -1038,8 +1036,7 @@ bool8 ScrCmd_applymovementat(struct ScriptContext *ctx) static bool8 WaitForMovementFinish(void) { - if (ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapNum, sMovingNpcMapGroup)) - { + if (ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapNum, sMovingNpcMapGroup)) { struct ObjectEvent *objEvent = GetFollowerObject(); // If the follower is still entering the pokeball, wait for it to finish too // This prevents a `release` after this script command from getting the follower stuck in an intermediate state @@ -2076,7 +2073,7 @@ bool8 ScrCmd_playmoncry(struct ScriptContext *ctx) return FALSE; } -bool8 ScrFunc_playfirstmoncry(struct ScriptContext *ctx) +bool8 ScrFunc_playfirstmoncry(struct ScriptContext *ctx) { u16 species = GetMonData(GetFirstLiveMon(), MON_DATA_SPECIES); PlayCry_Script(species, 0); diff --git a/src/trainer_see.c b/src/trainer_see.c index 94180168fc..2d10a6dbb1 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -844,8 +844,7 @@ u8 FldEff_ExclamationMarkIcon(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53); - if (spriteId != MAX_SPRITES) - { + if (spriteId != MAX_SPRITES) { SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 0); UpdateSpritePaletteByTemplate(&sSpriteTemplate_ExclamationQuestionMark, &gSprites[spriteId]); } @@ -856,8 +855,7 @@ u8 FldEff_ExclamationMarkIcon(void) u8 FldEff_QuestionMarkIcon(void) { u8 spriteId; - if (gFieldEffectArguments[7] >= 0) - { + if (gFieldEffectArguments[7] >= 0) { // Use follower emotes u8 emotion = gFieldEffectArguments[7]; spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emote, 0, 0, 0x52); @@ -869,8 +867,7 @@ u8 FldEff_QuestionMarkIcon(void) } spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x52); - if (spriteId != MAX_SPRITES) - { + if (spriteId != MAX_SPRITES) { SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON, 1); UpdateSpritePaletteByTemplate(&sSpriteTemplate_ExclamationQuestionMark, &gSprites[spriteId]); } From 4afb386ab4f6439abcbbdd3016ab6493a858f498 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Thu, 15 Feb 2024 23:06:05 -0500 Subject: [PATCH 11/12] Added `.git-blame-ignore-revs` to hide whitespace-only changes from `blame`. --- .git-blame-ignore-revs | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000000..54f7faa471 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,4 @@ +725252905baf28dbb9298dd5fa0daaf0e804a455 +afbb88d77ada8a636a318ec32b61b4ea849d85ab +f861504cfc50941768286c0703d24ab0aaceb88e +ebbcb7d025cff716eec5008b5dd2b7d55aa8c3f3 \ No newline at end of file From 6bceacf403ed24dd4c4f64af884cc99eb34e98f3 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sat, 17 Feb 2024 16:55:11 -0500 Subject: [PATCH 12/12] Added override table for standalone follower palettes. --- include/decompress.h | 2 + .../object_event_graphics_info_followers.h | 11 ++++++ src/decompress.c | 18 +++++++++ src/event_object_movement.c | 37 +++++++++++++------ 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/include/decompress.h b/include/decompress.h index 18340d54b2..6c66b738f9 100644 --- a/include/decompress.h +++ b/include/decompress.h @@ -8,6 +8,8 @@ extern u8 ALIGNED(4) gDecompressionBuffer[0x4000]; void LZDecompressWram(const u32 *src, void *dest); void LZDecompressVram(const u32 *src, void *dest); +bool32 IsLZ77Data(const void *ptr, u32 minSize, u32 maxSize); + u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src); void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer); bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src); diff --git a/src/data/object_events/object_event_graphics_info_followers.h b/src/data/object_events/object_event_graphics_info_followers.h index eaa9e737f9..f0ccf078b9 100644 --- a/src/data/object_events/object_event_graphics_info_followers.h +++ b/src/data/object_events/object_event_graphics_info_followers.h @@ -426,6 +426,17 @@ const struct ObjectEventGraphicsInfo gCastformObjectGraphics[] = {TAG_NONE, OBJ_EVENT_PAL_TAG_CASTFORM_SNOWY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSnowy, gDummySpriteAffineAnimTable}, }; +// Standalone follower palettes +// If not NULL, entries here override the front-sprite-based pals +// used by OBJ_EVENT_PAL_TAG_DYNAMIC +// Palette data may be compressed, or not +const void* const gFollowerPalettes[][2] = +{ + // Must have at least one entry, or ARRAY_COUNT comparison fails + // (SPECIES_NONE does not use OBJ_EVENT_PAL_TAG_DYNAMIC anyway) + [SPECIES_NONE] = {gMonPalette_CircledQuestionMark, gMonShinyPalette_CircledQuestionMark}, +}; + #if OW_MON_POKEBALLS #define POKEBALL_GFX_INFO(NAME) \ diff --git a/src/decompress.c b/src/decompress.c index 8452f340ed..248ce346e7 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -19,6 +19,24 @@ void LZDecompressVram(const u32 *src, void *dest) LZ77UnCompVram(src, dest); } +// Checks if `ptr` is likely LZ77 data +// Checks word-alignment, min/max size, and header byte +bool32 IsLZ77Data(const void *ptr, u32 minSize, u32 maxSize) { + const u8 *data = ptr; + u32 size; + // Compressed data must be word aligned + if (((u32)ptr) & 3) + return FALSE; + // Check LZ77 header byte + // See https://problemkaputt.de/gbatek.htm#biosdecompressionfunctions + if (data[0] != 0x10) + return FALSE; + + // Read 24-bit uncompressed size + size = data[1] | (data[2] << 8) | (data[3] << 16); + return (size >= minSize && size <= maxSize); +} + u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src) { struct SpriteSheet dest; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 3e3e1f0272..4ee9b5a988 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -19,6 +19,7 @@ #include "fieldmap.h" #include "follower_helper.h" #include "gpu_regs.h" +#include "graphics.h" #include "mauville_old_man.h" #include "metatile_behavior.h" #include "overworld.h" @@ -189,7 +190,7 @@ static u8 DoJumpSpecialSpriteMovement(struct Sprite *); static void CreateLevitateMovementTask(struct ObjectEvent *); static void DestroyLevitateMovementTask(u8); static bool8 GetFollowerInfo(u16 *species, u8 *form, u8 *shiny); -static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool8 shiny); +static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny); static const struct ObjectEventGraphicsInfo * SpeciesToGraphicsInfo(u16 species, u8 form); static bool8 NpcTakeStep(struct Sprite *); static bool8 IsElevationMismatchAt(u8, s16, s16); @@ -1698,7 +1699,7 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), u16 species; u8 form; bool8 shiny; - u8 paletteNum; + u32 paletteNum; spriteTemplate = Alloc(sizeof(struct SpriteTemplate)); if (graphicsId == OBJ_EVENT_GFX_OW_MON && GetFollowerInfo(&species, &form, &shiny)) { @@ -1715,9 +1716,8 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, spriteTemplate, &subspriteTables); if (spriteTemplate->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { - const struct CompressedSpritePalette *spritePalette = &(shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species]; paletteNum = LoadDynamicFollowerPalette(species, form, shiny); - spriteTemplate->paletteTag = spritePalette->tag; + spriteTemplate->paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum); } else if (spriteTemplate->paletteTag != TAG_NONE) LoadObjectEventPalette(spriteTemplate->paletteTag); @@ -1825,18 +1825,31 @@ static const struct ObjectEventGraphicsInfo * SpeciesToGraphicsInfo(u16 species, } // Find, or load, the palette for the specified pokemon info -static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool8 shiny) { +static u8 LoadDynamicFollowerPalette(u16 species, u8 form, bool32 shiny) { u32 paletteNum; // Note that the shiny palette tag is `species + SPECIES_SHINY_TAG`, which must be increased with more pokemon // so that palette tags do not overlap - const struct CompressedSpritePalette *spritePalette = &(shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species]; - if ((paletteNum = IndexOfSpritePaletteTag(spritePalette->tag)) == 0xFF) { - // Load compressed palette - LoadCompressedSpritePalette(spritePalette); - paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present - if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog - UpdateSpritePaletteWithWeather(paletteNum); + struct SpritePalette spritePalette = {.tag = shiny ? (species + SPECIES_SHINY_TAG) : species}; + // palette already loaded + if ((paletteNum = IndexOfSpritePaletteTag(spritePalette.tag)) < 16) + return paletteNum; + + // Use matching front sprite's normal/shiny palettes + spritePalette.data = (u16*)((shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species].data); + // Use standalone palette, unless entry is OOB or NULL (fallback to front-sprite-based) + if (species < ARRAY_COUNT(gFollowerPalettes) && gFollowerPalettes[species][shiny & 1]) + spritePalette.data = gFollowerPalettes[species][shiny & 1]; + + // Check if pal data must be decompressed + if (IsLZ77Data(spritePalette.data, PLTT_SIZE_4BPP, PLTT_SIZE_4BPP)) { + // IsLZ77Data guarantees word-alignment, so casting this is safe + LZ77UnCompWram((u32*)spritePalette.data, gDecompressionBuffer); + spritePalette.data = (void*)gDecompressionBuffer; } + + paletteNum = LoadSpritePalette(&spritePalette); + if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog + UpdateSpritePaletteWithWeather(paletteNum); return paletteNum; }