From 356a1dec8d8602c6154717f96b1797cde291c45e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 7 Jun 2025 15:45:56 +0200 Subject: [PATCH 1/3] use better palettes for status images --- graphics/status/blinker.png | Bin 217 -> 274 bytes graphics/status/burned.png | Bin 527 -> 558 bytes graphics/status/confused.png | Bin 471 -> 507 bytes graphics/status/cross_eyed.png | Bin 398 -> 418 bytes graphics/status/eyedrops.png | Bin 269 -> 327 bytes graphics/status/frozen.png | Bin 1126 -> 1176 bytes graphics/status/lowhp.png | Bin 245 -> 304 bytes graphics/status/muzzled.png | Bin 242 -> 294 bytes graphics/status/poisoned.png | Bin 403 -> 458 bytes graphics/status/shield.png | Bin 472 -> 531 bytes graphics/status/sleep.png | Bin 352 -> 354 bytes graphics/status/sleepless.png | Bin 214 -> 273 bytes graphics/status/statdown.png | Bin 322 -> 374 bytes graphics/status/sword.png | Bin 380 -> 410 bytes graphics/status/taunted.png | Bin 603 -> 667 bytes graphics/status/whiffer.png | Bin 376 -> 397 bytes 16 files changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/status/blinker.png b/graphics/status/blinker.png index 3cf6415f9e33d68bd90f7585a1859f5fd5158360..d298fcead5cdb658559636760659c7c91c264869 100644 GIT binary patch delta 257 zcmV+c0sj8k0g?ic8Gi!+007ZYEEE6$05DKYR7C)PmjD0&zjr6!uV??~pQmpC-?sq& z_W%HAw;!M9kKg~F007rN0RM+y|A)W-|NjFocZ~o50G&xhK~yM_mC~^e!XOj{(93L1 zxEmVy*lxsybSsG+`~v-iGP>DK|D@?8fu+V8@NO^fgghPqDS9LzoRT=4REOj2E)ds6 z=Ef??`93}UfX>d4)27>#kCm%9uXet_?z`#Ad#-ukAOGMDX;)+D$udO900000NkvXX Hu0mjfU(k1R delta 200 zcmV;(05|`V0@(qO8Gir(006_~gZcmf0H8@kK~yM_mC`*9!Y~X4;J2XO1h%j-wnu;y zFcc}>sxBy758DX3y-1Wf#v%hCiWxy8t?Ln;`*L@3kGMOj8;rVoqptKJB|)B~5}Dx15^-IBI5PxH zWQ9`1CpVC0*4@bMo6D$|+uvXF&bsA2=iK+lA3Olfl3Hmizw;Xa0000-8Gi!+008AF?Faw>05DKYR7C)PmjD0&zjr6!uV??~pQmpC-?sq& z_W%HAw;!M9kKg~F007rN0RM+y|A)W-|NjFocZ~o50l7&;K~yM_Wm7wHEFlae7d|h6 zp|}#+24?C_MgWwZDe!QPO}sTvKgxj#h8`iLR!ca?%b(6xb$@>roegm*;s;-9vkz@z zq1EA1FnrRpc^E)c&@m`z`Kiu6zbwwb_urgezOa8k%mmf!(2ZLCHkWy+$>C)PSJD)i zEPG2U2$%tbkghpD1$^W?6^V^c3;B5I4#oCrL}8lcxHgDFkpd?eVw~_SedANN`J*A*LuxK*w2}xSRR`XWFuI1#YV?RqR+-R67XPWPbEPTfr_hv&&o+f z^949bkD_2k3DA9$Tu?nq_IgZh&ttYbFgOCY1lR9+$a)V+HjAHGmJwKR!}^9|R+N-#=(X@gM@0@ar$~e# zp;L&nYr$}C@LnPLp^)35$+JCnoj-qnM5h4WHr^Z}K#&M7On(Ap!E@&XmlV8XVz6B$ zeBbK1+aVB!A1?-I?GSi3(<=k|(%R8~7IQ55Dy_W9_G8hCQ@q=8`PoKhDI zu2TzLnzgV{KYyx1xTJELS+o$Q7j-xTkH@S}$YwB{!y7&FZ8%8|t-ty6xVJ?_$%hHN zMl=I~&>gJ}Uv>1V!~Ojq-~;h{pF8;#{W z$KnTLR{%MY-g8gFXGS2!3aC9(eueB^D5c)GLe+YBAFpBP4ly_mwgxU8F@({r)AbU|uo_j`Dw5mVH)} z7k_|p6s6qfA+AE9Fe}_Q`h5tBnxA%U_0sM1()=Ph&aPwW?$Q`k!5FfI$g iPS@iO`LqL{M*IOs&wJ!tG6TQ>0000 zfj(jEHOQjY3yWX^Bl!46eMtnC4Mto8*Mc%xS88lN#dF=Vfq!ppWsh!8t^uT$SV|782C#b}a~r%wgx>)qPovv04?KV{ z;Rxt)sa&&SFK9bQkLoiqR7 zbk~dOBAF|QM4$Dgvm0wb=Xb6$U~Y*mzol(J;O2$3#p(`ucz*yoB*k1?Zj1^dS4}cc zP5~|Ye{FD9aIup_q{a6v=PO|^(v=!sQZas|_B yz-v)fhEqfCjk8@)033I_)vfb;=n9^HOGHK~y-6t(38n!ypVqW#EOL}XXmAAgR)?}591Nh(c4kbp>n znOJvIy2{twCke)1T^WBg7^XTiUh1X(W1?=}QqW4Xy=bLxueu_g>pgoYw?C_*dS>U%m~<@25Wg%@Z1h~HdW>T9!yk+{hFsgL9^*n z2rb6~4iU;fTYm^O9C^FeLeaO3RQw#&&lY|T@N+!ybAX>$__<(w#?NFzX^>RsCqpk@ zg_{OB1u{{m@$j?%4A_e+AU?HBGBY`COmVc+)|I125y~)70Xucj3QsCLOEtp$zE?aP xyF97pIdkxvd6f(3-_SeQk)hw37cw1;Kd~R2n8S#vkqiI;002ovPDHLkV1gk9w&VZ+ delta 382 zcmV-^0fGLa1C9fb8Gir(008BpUdaFe0aZyvK~y-6rIfvLgfI+*)tEB(YBX|*X=ve< z({Lrw*d>as9||9rcybiX4#ukwX$=t3?evK60uQ~rF@%3q;3~+ ze36QWigT}@980~#*R4oSU+w`}q;8v*B66i~M$Nv(8j9Vx7=PGqVDu+gv?sA0EWsk8 z2gf3Fjl4Z(E;fuoYh^bGvi$&cX09U6-kc{Bn~4~j!Cra1@eDUSy*fuU9&bF@!1I2B zsn;b$Ct$(>lsQ%&Q+A0#=QY{9(B|c>)?l?lU8^NXSDsPxJXxO6^6YN%jFx9_c^>Mb zpXHen>L(*g^>@gD22SW2SUgIDfV4rpeat|--EDQA|J9!xF=-R{7f=NM0*Y{@Wh{ui zMq(UfS4p%G&ehQ)XU(^b07*qoM6N<$f-DKK(f|Me diff --git a/graphics/status/eyedrops.png b/graphics/status/eyedrops.png index a5e4f11d6ec31238416f65b1f95ad4bc1d9f4300..252b62fd0c8cd3568823ee0500b5433d9fdc528c 100644 GIT binary patch delta 311 zcmV-70m%N10>=W78Gi!+007ZYEEE6$05DKYR7C)PmjD0&zjr6!uV??~pQmpC-?sq& z_W%HAw;!M9kKg~F007rN0RM+y|A)W-|NjFocZ~o50MbcBK~yM_mC~;c!Y~j9@DIam zC)y6)3NvJxI@wjw5zHJUn1x3`A$dAFg5p?1XaeESx#s(&>3`i77%Igl#Cc76NFZCC8PX1AQPJFZ`ycI;X$piAkX&&Khw7coeRJTNwLk+{r; z8fco7WKP#0BR!U+=J3H1$Oa#SNEYK7b)ILaj8u?R&Y**JsM=n|U?52!wiHkeRnUF= zc;CBz$=_Y`)iC{fpOHL2Qarz4Kh1e?rDS(DU-z~t{&27V;08v|T;it(HQxXL002ov JPDHLkV1iZRkM;ln delta 252 zcmVpKZnM6q-O<$P^^9JC`WiwnJsSgQxlcE3`tDXD$VI(wjrq0j{75Hp?IPdp9r1 zn=8J$U(Yk1`yA&*y)g~>C9ns)xfMyW$(~~cbJJ(gH2w6CTYtvqSoR?jO7XsXen`ob zp8YcdOjjguDNM}No+&YFptP4BoKs*<=tl#Okho+t$)UCgoFkrf7)Ls?h(mYibzl98 zUO(jJS8b5In^#(k>aCkj~0{=jS!0y>~$nJg=2TC1=a;~nWumTlyoxs4*pW2Og6h2 zVYk@OuI9>l=T=%1q3f3C6?1X;*C%tD(C!A{H$Fn~qkj)6``|+p)BDiW-hJf3N3a%h z`Cx{D#B%u%Bu3so1gW!Ls}E*R1|~Hhe5en8`;Y@Z(1ZCP^^twh7k=qObfW$Y%$pQB zeXPlRWFCBw`N&D9`1TRa2j(=*Is<@7OHeS2f;oLi^^xIYLsCDmtHxnFeK2=EFwOYI z$AR=x=YJz4lIDY|kM#CI|ICMsJ|fF_e(0u+K9GpP2R@c`^HK2Y^nqNnogtSGJ#pYe z_*n-G3WjyFb>s{mcEVgfl3$B`vdssZ5AJ-3w-lKVVp%XK31A2fen^l3RVS#|Yf}*m4!5`)fXs!+iQ6 z^MApYkFELu)ARgD)d!9w8GJKZ@0-*u!?epntvA z2B8YVDkGbRvp&sED@CNB-7hGJ-afEFpE;?IGWZDE;8uS$AMg4!OJARsdwmK)ef_~m zwbiGwl+y=lLVn>)&FVv%4*&wr&WC+eXMJk*N9lZQd-Gu&FrJ+sY5#!_9(>@Z`l$5> hcIg;>gg^B09ZAbLt%;FUL;wH)00>D%PDHLkV1nivP$mEX delta 1116 zcmV-i1f%uvqSHf^@lC!(TW-~cCgJS%p2U~PJ{?Pqf-NrzodFun2sFW`7juceB?f{+< zVEwuRnTc4LwFOj|EkJn50&fnInFak=;GKmjph?JQi_9V6*?)$qS`dh_qC50DuVvMP ze#Tc>t$~!fue#Asl6hg9Myh>(OS6$J-T3`l?&{5IAUa1y%Bd{-c z#;nhPqJ=8P(5$u{iohyaqbSRfBfSdknME_!GQTk!LBIyg2yH2bARFyAqpVzPla#+` zm$L0YRJZRKN`J*nkF^{-mbIlI)dM>=dzE_RX|AgW)(vynkBkP2P7i+ve^oS~D+G2y zlg)>&#W%T@T31~~(e;@IJXUm2(V)xzfp*&v_$MEk%IG7~JovE0^gb-LPak3Mk-bH{ zeK5m-aJ+p)Bqn}*M5NApJ$*12buiL=@MJ#t<0DS+fqx#{hnkO2vc2%PKB7&uT!DRw z6fYmExR1bt4|N|wY>FQr$$el>wA%~-Mz(BVHUo3{h^LPL9}AND6T9jhmdgio=L6GB zzxbGtUhRBj(b#}SaB!%iId zh-?82n12ln+h*Hp1AO=ibNi68l7F(z2fGjMe8l1@av#X8`{3J$x(`OudLNj=!v}?^ zY4E|5(u5`Q{P97vEy;ZNl;<>Awqw`~O!I-kHNpoDXG|GBAZ+k~J!(GY=7V2IsRiWp zk$&+JF#74EoIY6i^05~4!T-IF#19|g;RC6B_?Xm!9V46`yjW0GsHQ( zlLQBX0J)D4{Rl#@rw@XUXh5d5EOOAd`@jqCL(GT17HY{oeQ?1D-1}Iliccf#o-x{rAKK>CyUm@gl( z^M7IY%hQM7FV11Pedy=|U*UMa{2xA$p3z6(NB!~ifxyED0=QtCkLdLW$J+;8KDhZv zb_C(ut!XwNp{QLB?qh-vTr8_Ka38z@jLwURav$7$;DvU-G#}^j@bO{KRIb4O!;ZDf zN2@=uvd#zomnIw`TcTh-uq5*lrxjygK7SC9lI;95AFckd~Vu58ro`qj&v5UY}wQ+x>#} zRvY9~5LTJkJzVu^s8%T=1?_%8LGrwZ zgOO^lPZMh8<^we$zi_4o^AVd500Pd=hksO8ed_fGbv~B4`EU*x&(9B;f8&D(ANY~3 i{=hCxqmTSAef$N+?z{S2O!2k=0000g&` diff --git a/graphics/status/lowhp.png b/graphics/status/lowhp.png index 6b053ac93ab6d5aad49cf4db4b3c9bfaccbeef4d..d67b80a9fa8f586eb685191d908781979e8a2ff5 100644 GIT binary patch delta 288 zcmV+*0pI@h0k8s)8Gi!+006|oH4Oj&05DKYR7C)PmjD0&zjr6!uV??~pQmpC-?sq& z_W%HAw;!M9kKg~F007rN0RM+y|A)W-|NjFocZ~o50J}*lhT)EVUT%aGq2oJWB%sG@ZM0000=K~yM_m65RygCG<|S*V-e#-eVdOIPC3 zm2Y(sHuwYRy+%Y6Nn3}LAdi#x?h_fGI3WeV4^d<{5)-hREYjNouLul44k%6$z$IYI z@m}?yr2`g?y7_Na4tSep4Ll8?EFceapLe9gH&Q>9<3$yy>RqYQXO-`YYPqUpQ+0!F zXeX#57Mkfxij#}DqYjNrKsWQF#mT)jL{RcmH!9uCkN*OSy(~a-KnJYspkjObZ6D1g e*Cx#`Oa1_kx3-Y{Gg}-00000G~~Xn&5VrJv4=We;OtFtWI0!i3|_i_H#YS zgAPGhwA4?9t+8*w#beC3HF)dN-v2K~o8tWgwAb`p=+TXD71)C+uGsUEOWFz68c zF3&B?+9x}(VDX5_NglV(=^zhQ3I-j5r}Esju||2qcb-RbOLHCtgAPGhwA9t!&t<=# cKm1=CxC+g8QxAv=`Tzg`07*qoM6N<$f?Y6u^8f$< delta 225 zcmZ3+^oenTWIY2AJmQP~52SW_x;Tbd^j;12<~yVyp!!wGx3GU^nZMHA;{VwW-yic# zN$)URxho*@K=!l0w?q#AHY(rnYNJ-inb}M?zZ`tAF5NN@ diff --git a/graphics/status/poisoned.png b/graphics/status/poisoned.png index f0de13a665db03f341c6b3f542be064627775de6..a9fbbbbab7c8ba3cdf76f191d473dec0e0bddaca 100644 GIT binary patch delta 443 zcmV;s0Yv_j1Ih!C8Gi!+002mQ>wN$K05DKYR7C)PmjD0&zjr6!uV??~pEo~`PhXd3 zhp&H+m#??K*Wcf_008GdXaA3{|Hs$=|NrYbz4`zE0aZyvK~zYI?UgZegD?z*&Bll} zoL>u@oT+TcTee8QvXYDsljfRqYTAn#cxNHKkH;MjA)v0HtA8gEnp7ka;Z--X3fn4z zC$D%di9LK2UixUdNEO+{M7ma+OnR9a+J<@cn91E$;pF039-20H9i5mmA4Ms(JZa}) zb{h3Jt*8wPBCCy{u>A&!RF1vRY@1PCXanb#=M2KI zwiuUNjIP9@{i9*b4=`fpjfdzF&z*cM7QV|Pm8WL-eKagS&)zxv8}IJ>dgt@b=Rf81 lYX6^C`#=Ak^XnJR_fHqUqCSE%3bg`Jz|IBBj)r>4D_7>(<9DiOzE%iR(;)7UxSbf-h zwqSx~x}&O*&EkhXT!-?&$PW1mYDsTC^*-ol(?FmS3r|b)Vcvc4X`j;BcRm|1=yZjH zoDLEc{0?p}g?36~(L=sWM`&+Hgbi|-mg=*8@ey4H$>LoVqWO#pXX~txs?Rzk5Qk!L zl=D%d!nlJI0DLQ5jz{w`ND*ON`&l`Pj0KXzwfb14?1+?|6t#_=TCCyJ`^^&j-^XJ83>K$P+)r=oozFX;f0oayeSco< h`}}wQU%&8w{{$36RxOP64!i&W002ovPDHLkV1lHH>4#xzVyB;QFYJCjSKE3$jp-moe zV@e#FYIbQ`_+6lM&==`JX_}T!~ZWR^V$A!9)1EYyRL4#s>|&F0000rLg-*Z~zJbSg;K=~sgAC#P}Yq7U4{bV|=Tg#pp=R|;eFG3F5X zJ`l3cp)DcY|9IMQ4D%meMxPeuFd?6%=;^eq{>%dgvu9u}F@KPj82BGNBS3|9ZWMcA zSR+M;#_39PT`8V|AKSNij^aV+x>}mBms%FgPGL?M7SJ!LSA65tyWPw@=u`Go2t zcb+WfK(;a>1jDrmL4{z{gRCBK;@KE4o`GNM4|ZKllXwnnt@J0* z+dMi_Vv0^$OY8Gi!+008$F@h1QP05DKYR7C)PmjD0&w}&U!zi0pVpQmpC-?sq& z_W z3mmcAuRqxf5lblNaMyCgDR4;2^?r%Hn%dWKkmXc*_P&3~#yN|G@ zsv`GyT?2h9J``dDc zy4>}v@D|+#%g$SN*YMLtVpr4FDbAEJ8a7x58@{=1Ip_MOlGrJ*C{#QTgeuDQ(|4(`k*?k{^xs8Gi!+008$F@h1QP05DKYR7C)PmjD0&p8x>YKLG!SUsq?hhoAqq z&;O@y0N=L&|MvhVhX7x=edluh+_``@VyamRD*+CUlXiFp&k_NM48r zlZL`ZPOy*xTVFjZ<7r}8xNTy4=L;|rk?nBiyDp_PY+}|>D&c&w4>Iha_kCwGTG06gCwgDix)9smFU07*qoM6N<$ Ef?&3!;s5{u delta 306 zcmV-20nPsQ0>T228Gir(008BpUdaFe0SQS&K~y-6z0^Gp!Y~X4U@s9{&z8mN){zl) zL2Ny1my#{HK|<`jlpmEsBt#c13;I4e4wUfFZV|l?TFlIY77Ge5g-;X>%M&P`<+Bfz zoD@_3j@UE1!Mx^NMCp(-rPj4qPR!~)9= zg^g5UrUABkR>s4`aB%mDZQU=xIE%`L6CLy@bE8a58X6%DjTjH#!}cfk=DxFnaO2>~ z4V+;0*alD2#49#EZ0kP&JZ$Sm!6S`k&(6eJJ*^vl1CW2*yBk@j$p8QV07*qoM6N<$ Eg0Q5DwEzGB diff --git a/graphics/status/sword.png b/graphics/status/sword.png index 0507994e480e3ba7ce3853122723fb7df2617907..59162d37eec8081af6a68d75aa47ce10bc51609d 100644 GIT binary patch delta 395 zcmV;60d)TS0-6Jm8Gi!+008_o{N?}v05DKYR7C)PmjD0&zjr6!uV??~pQmpC-?sq& z_W%HAw;!M9kKg~F007rN0RM+y|A)W-|NjFocZ~o50VPR9K~y-6)s-=Cf>030VW_Up z1zH!sk{gK&F0>ytbc(FkoZI?O>$YK&nrszTC}~-n{FjEx16Cl^HkA6Q2K++d7t{!NPKDp zpP1YF^q()!r{|h8lZUeWs`r4b`t+TT?ZW5Q&ga(NpTFjd+`!jpCHaK pU&#SJL45D?eplbafBRpY0D>E6*F3wLrT_o{07*qoLw!ax`X@Mn=6416{gabuKD z#KqOzf}swzqjs^2NjJWd3rd%Er5$?Sy?-zvE|^My>B-Yx?w4!d0w+IoRV@Ky4Og{> z83p%wcU@EH=2XFPRr?UCZsvoprkh0w-Fz?zmqImm6gu2+vwvCKKhQnX`ioY%%5@cb z^xPWtOdiD(8THs+Jw`o~rFbHv9=jAzWD@aMBOVL!Z1F!H`{PN}vl7n>#IpqsJs(GV znrtlrBMvRF)-YmEkx~WM##H&`RD~@<#hxNH@8oG?eO^T>p7sx(C-oTdSj6H1-q>R? zWKSBZutfv)_+^Scz7kK4V?Ddq!}Do)b2=Zxo*a0l&~W9KTlMVr9@~fK+|K9R-k;y* z%k1YXVNaQ_WWF+;FREz1GM)D_k7d5Hp?J#t(&zo6zK19KzxW0#s1XH!Z>zlk0000< KMNUMnLSTXh!>nfj diff --git a/graphics/status/taunted.png b/graphics/status/taunted.png index 6d0a16a45b0fba0d3179902d696d0f2a3aa8ccfd..1416be3dbbd88f08ce23d3dd2701de058b65813d 100644 GIT binary patch delta 654 zcmV;90&)G@1e*nr8Gi!+008j2^br6605DKYR7C)PmjD0&zjr6!uV??~pQmpC-?sq& z_W%HAw;!M9kKg~F007rN0RM+y|A)W-|NjFocZ~o50wzgBK~y-6&6B^5q%aJ|;SETb zFy)Hy1pIk{(aZ}_BvYPJ#3@e{#3j!>#Xy<0!)bLZt#s{CeSa9o-w($wim#^>WtByJ zuiGpxkGdBuq`urn{wRd(?;Mg-+fK47%I+~pU6Z&!?tMG4XuDo&64M~0#42j@{Qh!{j0b}OOV~hokl*)k5Jl30k@m!Cq%i<$F*PPtIuQyg1%&tea*u38? zo2F>tN#aPy>NgfXtd{7@EgEZG{x1NZF#rO(3)8r5LvTMaU`b_?yJBkq9gRcRz0#wGKBPiv@ho5P!rmEmpuwmNFh;ca*?#mAO#g(qReK*AD6G_V?= z9Q4L|ZWQ$ZfNro*+#hyP7BDxeq1L&dd4lsN4=&)&+n&+cD(BjTkCk>&b8s__Pn?xq zTyYHu&VMw7;VlV87+x4B4CTNq)XalKGhz(ihT{2Q7hw$KK~g+gKl4oeaPmBEV}EW# z`{=uqr=u8e(@nNh-_m;BTiMV4z+zxMqTD2mcEDn~g(00000Ne4wvM6N<$g7nBjt^fc4 delta 589 zcmV-T0sA?gV$d6t-|yATq-;+rv z__z%lK`D8<7LN4G(&r8K`7-ACB)DF#)6z36^OPe&KbD*qE`K=0xbUkz#(Ch#p5rib z!F?WMZ9%2WR^cz7Rjr}IU9Pq!Cx7qo?UStH%1MWy6E$_xB)<|Uscg^;!P(>qv?(bC zE{NWT>f^mbj_k>!sXos5fBD>-yRGmA=e8!V`1>fgD(2dzwh+b$$4x;wJQFm~v_>!( z-8v)?$~$N4cYh(8s)4Abtzsxu_0bAHeacp<&km<%d&2=voU=;>2SKl>jG!2|IB1G> za0gIY98T~B00;Stpb-R`0p$TD=P1-l@~cKlNrtagN&yXnmH-{Af|OkqBcJl&BRci% zbCg~6K?AL3AMZ8Acp67%L~CIcjdA+e!IuEp;+Zs*CVz0Gp**%8DMuRb3=fKCfJpz~ zEAf03gF{&dwbJP9&pz6kw~y?wuFdX)w2pmBaTMci=~B=(K+-BC*IBr0iPo>AVH`ms z4O6@=o^mjh6nK$nN4zhr!TVzfiuYI-De-Fk?9)%<+vjo{>RIh^xlHrhXQmim(=9Lk zv_S5!OGch=6FmCMFvaH$9^*`qCwPt}P9;*#u#~*;q0tS+$Ud3xYh<4ohk9t4Pw&I$ b|GM`-X74HdIXIe000000NkvXXu0mjfivu5n diff --git a/graphics/status/whiffer.png b/graphics/status/whiffer.png index 595a0d2fe00377cc286e537917ec80bb59633b47..d46a423070e6076e46922d18e159157f3059cb03 100644 GIT binary patch delta 381 zcmV-@0fPSc0*wQZ8Gi!+008rC_KE-i05DKYR7C)PmjD0&=RarvkFWp7*MEBw9CB)5bV!fTIl-=zOZ54B=u8cHoX3jHI+S@?s<7`+2V zGXW!Bnh9X)xps1KTKP(pPtX+ccpYQyngJr$F~VfAPpCndV7c6O^(ZOWF@`;4W+XLl zJPsIR>0pYzeS0~*TrG~hAqU4^JjUJ(82efyuR_j&eFqb*%T;&Hu bz*DX#FuQHW_U#<-00000NkvXXu0mjfAJDRw delta 360 zcmV-u0hj)b1NZ`v8Gir(0080GS!4hJ0Y6DZK~y-6os_YXgCG!wx3LYcW@E~;a!YyT zG_eF4w}b=s-z0N)am?vV@;UigKEMqXT+}`ifJfIs7K3n$9df-9E+2p^zC#+W28@E2 zfJ}TpT-aclT!*}k3MCVugm|ox$YAh*sp(Y6fjz<@o>-SWpnr~24W1k{MnEBh5TC=7 z{g?)Wi52q35X-^aTnF3o7l=1tKwdmD_nDIG(RMYsUFiPRLy_c)I$161@Xa8{bF&`- zzkq7oJv8{@j$nVl*uKQmz5=8#U1q>AlkNe{M~C|vkOPbW znGCMjaQWfmpi}0(CK*OQO;G&cBe>4i0@ Date: Sat, 7 Jun 2025 17:41:10 +0200 Subject: [PATCH 2/3] dungeon pokemon sprites clean-up --- data/data_80CE77C.s | 64 ---- include/code_800F958.h | 9 - include/dungeon_pokemon_sprites.h | 43 +-- include/structs/dungeon_entity.h | 2 +- ld_script.ld | 5 +- src/code_800ED38.c | 3 - src/code_800F958.c | 481 ---------------------------- src/code_8069E0C.c | 9 +- src/code_806CD90.c | 7 +- src/code_8073CF0.c | 2 +- src/dungeon_damage.c | 2 +- src/dungeon_engine.c | 2 +- src/dungeon_misc.c | 6 +- src/dungeon_move.c | 4 +- src/dungeon_pokemon_sprites.c | 501 ++++++++++++++++++++++++++++++ src/dungeon_serializer.c | 8 +- src/dungeon_util.c | 4 +- src/dungeon_vram.c | 4 +- src/move_orb_effects_2.c | 8 +- src/run_dungeon.c | 3 +- sym_ewram_init.txt | 1 + 21 files changed, 539 insertions(+), 629 deletions(-) delete mode 100644 data/data_80CE77C.s delete mode 100644 include/code_800F958.h delete mode 100644 src/code_800F958.c create mode 100644 src/dungeon_pokemon_sprites.c diff --git a/data/data_80CE77C.s b/data/data_80CE77C.s deleted file mode 100644 index 4be6cdd8a..000000000 --- a/data/data_80CE77C.s +++ /dev/null @@ -1,64 +0,0 @@ - .section .rodata - - .align 2,0 - -@ code_800F958 - - .global gStatusGraphics4bpp -gStatusGraphics4bpp: @ 80CE934 - .incbin "graphics/status/sleepless.4bpp" - .incbin "graphics/status/burned.4bpp" - .incbin "graphics/status/poisoned.4bpp" - .incbin "graphics/status/frozen.4bpp" - .incbin "graphics/status/confused.4bpp" - .incbin "graphics/status/whiffer.4bpp" - .incbin "graphics/status/taunted.4bpp" - .incbin "graphics/status/lowhp.4bpp" - .incbin "graphics/status/shield.4bpp" - .incbin "graphics/status/statdown.4bpp" - .incbin "graphics/status/sword.4bpp" - .incbin "graphics/status/blinker.4bpp" - .incbin "graphics/status/cross_eyed.4bpp" - .incbin "graphics/status/eyedrops.4bpp" - .incbin "graphics/status/muzzled.4bpp" - .incbin "graphics/status/sleep.4bpp" - - .global gStatusSprites -gStatusSprites: @ 80D3474 - @ Status to status image conversion - @ image, palette - .4byte 0, 0 - .4byte 1, 0 @ STATUS_SPRITE_SLEEPLESS - .4byte 2, 0 @ STATUS_SPRITE_BURNED - .4byte 3, 11 @ STATUS_SPRITE_POISONED - .4byte 3, 7 @ STATUS_SPRITE_BADLY_POISONED - .4byte 5, 0 @ STATUS_SPRITE_CONFUSED - .4byte 6, 0 @ STATUS_SPRITE_COWERING - .4byte 7, 0 @ STATUS_SPRITE_TAUNTED - .4byte 8, 0 @ STATUS_SPRITE_ENCORE - .4byte 9, 0 @ STATUS_SPRITE_SHIELD_BLUE - .4byte 9, 4 @ STATUS_SPRITE_SHIELD_RED - .4byte 9, 3 @ STATUS_SPRITE_SHIELD_YELLOW - .4byte 9, 10 @ STATUS_SPRITE_SHIELD_GREEN - .4byte 9, 5 @ STATUS_SPRITE_ENDURE - .4byte 8, 0 @ STATUS_SPRITE_LOWHP - .4byte 3, 6 @ STATUS_SPRITE_CURSED - .4byte 8, 3 @ STATUS_SPRITE_SNATCH - .4byte 11, 0 @ STATUS_SPRITE_SURE_SHOT - .4byte 6, 10 @ STATUS_SPRITE_WHIFFER - .4byte 11, 5 @ STATUS_SPRITE_SET_DAMAGE - .4byte 11, 4 @ STATUS_SPRITE_FOCUS_ENERGY - .4byte 12, 0 @ STATUS_SPRITE_BLINKER - .4byte 13, 0 @ STATUS_SPRITE_CROSS_EYED - .4byte 14, 0 @ STATUS_SPRITE_EYEDROPS - .4byte 15, 0 @ STATUS_SPRITE_MUZZLED - .4byte 9, 7 @ STATUS_SPRITE_GRUDGE - .4byte 14, 4 @ STATUS_SPRITE_EXPOSED - .4byte 16, 4 @ STATUS_SPRITE_SLEEP - .4byte 10, 3 @ STATUS_SPRITE_STAT_DOWN - .4byte 4, 0 @ STATUS_SPRITE_FROZEN - - .global gUnknown_80D3564 -gUnknown_80D3564: @ 80D3564 - .byte 0,0,0,0 - diff --git a/include/code_800F958.h b/include/code_800F958.h deleted file mode 100644 index b957687e4..000000000 --- a/include/code_800F958.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef GUARD_CODE_800F958_H -#define GUARD_CODE_800F958_H - -#include "structs/str_position.h" - -void AddPokemonDungeonSprite(s32 id, s16 species, DungeonPos *pos, u32 priority); -void UpdateDungeonPokemonSprite(s32 id, s32 species, s32 status, u32 visible); - -#endif // GUARD_CODE_800F958_H diff --git a/include/dungeon_pokemon_sprites.h b/include/dungeon_pokemon_sprites.h index 7be558f27..8ba22bc10 100644 --- a/include/dungeon_pokemon_sprites.h +++ b/include/dungeon_pokemon_sprites.h @@ -3,41 +3,12 @@ #include "structs/str_position.h" -// size: 0x8 -typedef struct DungeonPokemonStatusSprite -{ - /* 0x0 */ u32 status; - /* 0x4 */ s32 frame; -} DungeonPokemonStatusSprite; - -// size: 0x40 -typedef struct DungeonPokemonSprite -{ - /* 0x0 */ u8 exists; - /* 0x4 */ u32 id; - /* 0x8 */ u16 species; // Or sprite ID? - /* 0xA */ u16 unkA; - /* 0xC */ u32 status; - /* 0x10 */ u8 visible; - /* 0x11 */ u8 priority; - /* 0x14 */ DungeonPos pos; - /* 0x18 */ DungeonPos statusOffsets[2]; - /* 0x20 */ u32 unk20; - /* 0x24 */ u32 unk24; - /* 0x28 */ DungeonPokemonStatusSprite statusSprites[2]; - /* 0x38 */ u8 unk38; - u16 fill3A; - /* 0x3C */ u16 unk3C; - /* 0x3E */ u16 unk3E; -} DungeonPokemonSprite; - -// size: 0x584 -typedef struct DungeonPokemonSprites -{ - /* 0x0 */ s32 frame; - /* 0x4 */ DungeonPokemonSprite sprites[22]; -} DungeonPokemonSprites; - -extern DungeonPokemonSprites *gDungeonPokemonSprites; +void InitDungeonPokemonSprites(void); +void FreeDungeonPokemonSprites(void); +void UpdateDungeonPokemonSprite(s32 dungeonSpriteId, s32 species_, s32 status, u32 visible_); +void FrameUpdateDungeonStatusSprites(DungeonPos *screenPos); +void AddPokemonDungeonSprite(s32 dungeonSpriteId, s32 species_, DungeonPos *pos, u32 priority); +void DeletePokemonDungeonSprite(s32 dungeonSpriteId); +void UpdateDungeonPokemonSprite2(s32 dungeonSpriteId, DungeonPos *pos, DungeonPos *statusOffsets, u32 priority); #endif // GUARD_DUNGEON_POKEMON_SPRITES_H diff --git a/include/structs/dungeon_entity.h b/include/structs/dungeon_entity.h index 016c693bb..8e82b8613 100644 --- a/include/structs/dungeon_entity.h +++ b/include/structs/dungeon_entity.h @@ -238,7 +238,7 @@ typedef struct EntityInfo /* 0x90 */ IqSkillFlags IQSkillFlags; /* 0x94 */ u8 tactic; u8 fill95[0x98 - 0x95]; - /* 0x98 */ u32 unk98; + /* 0x98 */ u32 dungeonSpriteId; /* 0x9C */ u32 unk9C; /* 0xA0 */ s32 unkA0; /* 0xA4 */ u8 monsterBehavior; diff --git a/ld_script.ld b/ld_script.ld index 6c0e07b05..cac5676c5 100755 --- a/ld_script.ld +++ b/ld_script.ld @@ -88,7 +88,7 @@ SECTIONS { src/code_800E9E4.o(.text); src/code_800ED38.o(.text); src/code_800F034.o(.text); - src/code_800F958.o(.text); + src/dungeon_pokemon_sprites.o(.text); src/friend_areas_map.o(.text); src/world_map.o(.text); src/friend_areas_map_util.o(.text); @@ -439,8 +439,7 @@ SECTIONS { src/reg_control.o(.rodata); data/data_80B9BB8_2.o(.rodata); src/code_800F034.o(.rodata); - src/code_800F958.o(.rodata); - data/data_80CE77C.o(.rodata); + src/dungeon_pokemon_sprites.o(.rodata); src/friend_areas_map.o(.rodata); src/world_map.o(.rodata); src/friend_areas_map_util.o(.rodata); diff --git a/src/code_800ED38.c b/src/code_800ED38.c index df41f0c17..93f030ccd 100644 --- a/src/code_800ED38.c +++ b/src/code_800ED38.c @@ -7,7 +7,6 @@ #include "code_800ED38.h" #include "code_803E724.h" #include "dungeon_message.h" -#include "dungeon_pokemon_sprites.h" #include "file_system.h" #include "main_loops.h" #include "memory.h" @@ -36,8 +35,6 @@ struct unkStruct_203B0D0 { EWRAM_INIT struct unkStruct_203B0D0 *gUnknown_203B0D0 = NULL; EWRAM_INIT void *gUnknown_203B0D4 = NULL; // TODO: figure out the actual struct -EWRAM_INIT DungeonPokemonSprites *gDungeonPokemonSprites = NULL; // Todo: move to a different file, or merge files in this rom region -EWRAM_INIT SpriteOAM gUnknown_203B0DC = {0}; OpenedFile *sub_800F1C0(s32, s32); s32 sub_800F0F4(s32, s32); diff --git a/src/code_800F958.c b/src/code_800F958.c deleted file mode 100644 index 4ad90a0e1..000000000 --- a/src/code_800F958.c +++ /dev/null @@ -1,481 +0,0 @@ -#include "global.h" -#include "globaldata.h" -#include "structs/sprite_oam.h" -#include "code_800F958.h" -#include "code_8009804.h" -#include "cpu.h" -#include "dungeon_pokemon_sprites.h" -#include "memory.h" -#include "sprite.h" - -struct StatusGraphicsInfo -{ - /* 0x0 */ s32 width; - /* 0x4 */ s32 height; - /* 0x8 */ s32 vramIndex; - /* 0xC */ s32 unk; - /* 0x10 */ s32 graphicsCount; - /* 0x14 */ s32 offsetIntoGraphic; -}; - -#define TILE_SIZE_2BPP 32 - -const struct StatusGraphicsInfo gStatusGraphics[] = { - {0, 0, 0, 0, 0, 0}, - {1, 1, 0, 0, 14, TILE_SIZE_2BPP * 0 }, // sleepless - {2, 2, 1, 0, 7, TILE_SIZE_2BPP * 14 }, // burned - {2, 2, 5, 0, 16, TILE_SIZE_2BPP * 42 }, // poisoned - {4, 4, 9, 0, 6, TILE_SIZE_2BPP * 106}, // frozen - {4, 2, 25, 0, 4, TILE_SIZE_2BPP * 202}, // confused - {2, 2, 33, 0, 9, TILE_SIZE_2BPP * 234}, // whiffer - {2, 2, 37, 0, 8, TILE_SIZE_2BPP * 270}, // taunted - {1, 2, 41, 0, 8, TILE_SIZE_2BPP * 302}, // lowhp - {2, 2, 43, 0, 13, TILE_SIZE_2BPP * 318}, // shield - {2, 2, 47, 10, 10, TILE_SIZE_2BPP * 370}, // statdown - {2, 2, 51, 0, 13, TILE_SIZE_2BPP * 410}, // sword - {1, 1, 55, 0, 14, TILE_SIZE_2BPP * 462}, // blinker - {2, 2, 56, 0, 10, TILE_SIZE_2BPP * 476}, // cross-eyed - {1, 1, 60, 0, 14, TILE_SIZE_2BPP * 516}, // eyedrops - {2, 2, 61, 0, 8, TILE_SIZE_2BPP * 530}, // muzzled - {2, 2, 65, 4, 10, TILE_SIZE_2BPP * 562}, // sleep -}; - -extern const u8 gStatusGraphics4bpp[16][3072]; - - -// static const u8 *gStatusGraphics4bpp[16][3072] = { -// INCBIN_U8("graphics/status/sleepless.4bpp"), -// INCBIN_U8("graphics/status/burned.4bpp"), -// INCBIN_U8("graphics/status/poisoned.4bpp"), -// INCBIN_U8("graphics/status/frozen.4bpp"), -// INCBIN_U8("graphics/status/confused.4bpp"), -// INCBIN_U8("graphics/status/whiffer.4bpp"), -// INCBIN_U8("graphics/status/taunted.4bpp"), -// INCBIN_U8("graphics/status/lowhp.4bpp"), -// INCBIN_U8("graphics/status/shield.4bpp"), -// INCBIN_U8("graphics/status/statdown.4bpp"), -// INCBIN_U8("graphics/status/sword.4bpp"), -// INCBIN_U8("graphics/status/blinker.4bpp"), -// INCBIN_U8("graphics/status/cross_eyed.4bpp"), -// INCBIN_U8("graphics/status/eyedrops.4bpp"), -// INCBIN_U8("graphics/status/muzzled.4bpp"), -// INCBIN_U8("graphics/status/sleep.4bpp") -// }; - - -struct StatusSprite -{ - u32 image; - u32 palette; -}; -extern struct StatusSprite gStatusSprites[8]; - -extern SpriteOAM gUnknown_203B0DC; - -extern DungeonPos gUnknown_80D3564; - -static void DrawStatusSprite(s16 param_1,s32 status,DungeonPos *pos,DungeonPos *posOffset, - DungeonPos *posScreen,u32 priority, u32 unused); - -DungeonPokemonSprite *GetDungeonPokemonSprite(s32 id) -{ - s32 index; - - for(index = 0; index < 22; index++) - { - - if(gDungeonPokemonSprites->sprites[index].exists && gDungeonPokemonSprites->sprites[index].id == id) - { - return &gDungeonPokemonSprites->sprites[index]; - } - } - - return NULL; -} - -DungeonPokemonSprite *NewDungeonPokemonSprite(void){ - s32 index; - DungeonPokemonSprite *sprite; - - for(index = 0; index < 22; index++) - { - sprite = &gDungeonPokemonSprites->sprites[index]; - - if(!sprite->exists) - { - return sprite; - } - } - return NULL; -} - -u32 GetNextStatusSymbol(DungeonPokemonSprite *sprite, s32 statusIndex) -{ - u32 uVar1; - u32 status; - s32 counter; - s32 max; - u32 uVar5; - u32 uVar6; - DungeonPokemonStatusSprite *statusSprite; - - statusSprite = &sprite->statusSprites[statusIndex]; - uVar5 = 0x10000000; - if (statusIndex == 0) { - uVar5 = 1; - } - uVar6 = 0x10000000; - if (statusIndex == 0) { - uVar6 = 0x8000000; - } - max = 1; - if (statusIndex == 0) { - max = 0x1c; - } - if (sprite->status == 0) { - return 0; - } - - status = statusSprite->status; - uVar1 = uVar5; - if (status != 0) { - uVar1 = status; - } - - for(counter = 0; counter < max; counter++) - { - uVar1 *= 2; - if (uVar1 > uVar6) { - uVar1 = uVar5; - } - if ((sprite->status & uVar1) != 0) { - return uVar1; - } - } - return 0; -} - -u32 StatusSymbolBitToIndex(u32 statusBit) -{ - u32 index; - - index = 0; - while (statusBit != 0) { - statusBit >>= 1; - index++; - } - return index; -} - -void sub_800F2EC(DungeonPokemonSprite *sprite, s32 index, DungeonPos *screenPos) -{ - u32 newFrame; - DungeonPokemonStatusSprite *statusSprite; - u32 statusSymbol; - - statusSprite = sprite->statusSprites + index; - if (sprite->status == 0) { - statusSprite->status = 0; - } - else { - if (statusSprite->status == 0) { - statusSprite->frame = 0; - } - if (statusSprite->frame < 1) { - statusSymbol = GetNextStatusSymbol(sprite,index); - if (statusSprite->status != statusSymbol) { - statusSprite->status = statusSymbol; - } - newFrame = 0x3c; - } - else { - newFrame = statusSprite->frame - 1; - } - statusSprite->frame = newFrame; - if ((sprite->visible != 0) && (statusSprite->status != 0)) { - DrawStatusSprite(sprite->species,StatusSymbolBitToIndex(statusSprite->status),&(sprite->pos), - &sprite->statusOffsets[index],screenPos,sprite->priority, sprite->id); - } - } -} - -static void DrawStatusSprite(s16 param_1, s32 status, DungeonPos *pos, DungeonPos *posOffset, - DungeonPos *posScreen, u32 priority, u32 unused) -{ - struct StatusSprite sprite; - s32 posY; - s32 posX; - u32 uVar7; - s32 vramIndex; - const struct StatusGraphicsInfo *ptr; - - sprite = gStatusSprites[status]; - - ptr = &gStatusGraphics[sprite.image]; - vramIndex = (ptr->vramIndex + 0x32b); - SpriteSetPriority(&gUnknown_203B0DC, priority); - - posX = (pos->x - ptr->width * 4 - posScreen->x) + posOffset->x; - posY = (pos->y - ptr->height * 4 - posScreen->y) + posOffset->y; - uVar7 = posY - 0x10; - if ((((-0x20 <= posX) && (-0x20 <= posY)) && (posX < 0xf0)) && (posY < 0xa0)) { - switch(sprite.image) { - case 1: - case 0xc: - case 0xe: - SpriteSetShape(&gUnknown_203B0DC, 0); - SpriteSetSize(&gUnknown_203B0DC, 0); - SpriteSetX(&gUnknown_203B0DC, posX); - SpriteSetY(&gUnknown_203B0DC, uVar7); - break; - case 8: - SpriteSetShape(&gUnknown_203B0DC, 2); - SpriteSetSize(&gUnknown_203B0DC, 0); - SpriteSetX(&gUnknown_203B0DC, posX); - SpriteSetY(&gUnknown_203B0DC, uVar7); - break; - case 2: - case 3: - case 6: - case 7: - case 9: - case 10: - case 11: - case 13: - case 15: - SpriteSetShape(&gUnknown_203B0DC, 0); - SpriteSetSize(&gUnknown_203B0DC, 1); - SpriteSetX(&gUnknown_203B0DC, posX); - SpriteSetY(&gUnknown_203B0DC, uVar7); - break; - case 0x10: - SpriteSetShape(&gUnknown_203B0DC, 0); - SpriteSetSize(&gUnknown_203B0DC, 1); - SpriteSetX(&gUnknown_203B0DC, posX + 8); - SpriteSetY(&gUnknown_203B0DC, uVar7); - break; - case 5: - SpriteSetShape(&gUnknown_203B0DC, 1); - SpriteSetSize(&gUnknown_203B0DC, 2); - SpriteSetX(&gUnknown_203B0DC, posX); - SpriteSetY(&gUnknown_203B0DC, uVar7); - break; - case 4: - SpriteSetShape(&gUnknown_203B0DC, 0); - SpriteSetSize(&gUnknown_203B0DC, 2); - SpriteSetX(&gUnknown_203B0DC, posX); - SpriteSetY(&gUnknown_203B0DC, posY); - break; - } - SpriteSetTileNum(&gUnknown_203B0DC, vramIndex); - SpriteSetPalNum(&gUnknown_203B0DC, sprite.palette); - AddSprite(&gUnknown_203B0DC,(pos->y - posScreen->y) / 2 + 1,NULL,NULL); - } -} - -void LoadStatusGraphics(s32 graphicIndex, bool8 param_2) -{ - s32 frame; - s32 size; - s32 vramIndex; - s32 offset; - u8 *ptr; - s32 graphicsCount; - - - const struct StatusGraphicsInfo *graphic = &gStatusGraphics[graphicIndex]; - - - offset = graphic->offsetIntoGraphic; - graphicsCount = graphic->graphicsCount; - size = graphic->width * graphic->height * 0x20; - vramIndex = (graphic->vramIndex + 0x32b) * 0x20; - frame = (gDungeonPokemonSprites->frame / 4) % graphicsCount; - frame *= size; - ptr = (u8 *)gStatusGraphics4bpp + (offset) + (frame); - - if (param_2) { - sub_80098BC((void *)(VRAM + 0x10000 + vramIndex), (void *)ptr, size); - } - else { - CpuCopy((void *)(VRAM + 0x10000 + vramIndex), ptr, size); - } - return; -} - -void InitDungeonPokemonSprites(void) -{ - if (gDungeonPokemonSprites == NULL) { - gDungeonPokemonSprites = MemoryAlloc(sizeof(DungeonPokemonSprites),0xc); - MemoryClear8(gDungeonPokemonSprites,sizeof(DungeonPokemonSprites)); - } - gDungeonPokemonSprites->frame = 0; - LoadStatusGraphics(1,0); - LoadStatusGraphics(2,0); - LoadStatusGraphics(3,0); - LoadStatusGraphics(4,0); - LoadStatusGraphics(5,0); - LoadStatusGraphics(6,0); - LoadStatusGraphics(7,0); - LoadStatusGraphics(8,0); - LoadStatusGraphics(9,0); - LoadStatusGraphics(10,0); - LoadStatusGraphics(0xb,0); - LoadStatusGraphics(0xc,0); - LoadStatusGraphics(0xd,0); - LoadStatusGraphics(0xe,0); - LoadStatusGraphics(0xf,0); - LoadStatusGraphics(0x10,0); - return; -} - -void FreeDungeonPokemonSprites(void) -{ - if (gDungeonPokemonSprites != 0) { - MemoryFree(gDungeonPokemonSprites); - gDungeonPokemonSprites = NULL; - } -} - -void UpdateDungeonPokemonSprite(s32 id, s32 species, s32 status, u32 visible) -{ - DungeonPokemonSprite *sprite; - s32 species_s32 = (s16)species; - u32 visible_u8 = (u8)visible; - - if (gDungeonPokemonSprites != 0) { - sprite = GetDungeonPokemonSprite(id); - if (sprite != 0) { - sprite->species = species_s32; - sprite->status = status; - sprite->visible = visible_u8; - sprite->unk38 = 0; - } - } -} - -void sub_800F794(s32 id, s32 r1, s32 r2, s32 r3, s32 *r4) -{ - if(gDungeonPokemonSprites) - { - DungeonPokemonSprite *sprite = GetDungeonPokemonSprite(id); - if(sprite) - { - sprite->unk38 = 1; - sprite->unk3C = r2; - sprite->unk3E = r3; - sprite->unk20 = r4[0]; - sprite->unk24 = r4[3]; - } - } -} - -void sub_800F7D0(DungeonPos *r0) -{ - s32 index; - - if (gDungeonPokemonSprites == NULL) - return; - - switch(gDungeonPokemonSprites->frame % 4) { - case 0: - LoadStatusGraphics(1, 1); - LoadStatusGraphics(2, 1); - LoadStatusGraphics(3, 1); - LoadStatusGraphics(4, 1); - break; - case 1: - LoadStatusGraphics(5, 1); - LoadStatusGraphics(6, 1); - LoadStatusGraphics(7, 1); - LoadStatusGraphics(8, 1); - break; - case 2: - LoadStatusGraphics(9, 1); - LoadStatusGraphics(0xA, 1); - LoadStatusGraphics(0xB, 1); - LoadStatusGraphics(0xC, 1); - break; - case 3: - LoadStatusGraphics(0xD, 1); - LoadStatusGraphics(0xE, 1); - LoadStatusGraphics(0xF, 1); - LoadStatusGraphics(0x10, 1); - break; - } - - for (index = 0; index < 22; index++) { - if (gDungeonPokemonSprites->sprites[index].exists) { - DungeonPokemonSprite *spritePtr = &gDungeonPokemonSprites->sprites[index]; - sub_800F2EC(spritePtr, 0, r0); - sub_800F2EC(spritePtr, 1, r0); - } - } - gDungeonPokemonSprites->frame++; -} - -void AddPokemonDungeonSprite(s32 id, s16 species, DungeonPos *pos, u32 priority) { - DungeonPokemonSprite *dSprite; - DungeonPokemonSprite *newSprite; - DungeonPos newPos; - s32 species_s32; - - species_s32 = species; - - if(gDungeonPokemonSprites == NULL) - return; - - dSprite = GetDungeonPokemonSprite(id); - if(dSprite != NULL) - return; - - newSprite = NewDungeonPokemonSprite(); - if(newSprite == NULL) - return; - - newSprite->exists = 1; - newSprite->id = id; - newSprite->species = species_s32; - newSprite->status = 0; - newSprite->pos = *pos; - newSprite->priority = priority; - newPos = gUnknown_80D3564; - newSprite->statusOffsets[1] = newPos; - newSprite->statusOffsets[0] = newPos; - newSprite->statusSprites[0].status = 0; - newSprite->statusSprites[0].frame = 0; - newSprite->statusSprites[1].status = 0; - newSprite->statusSprites[1].frame = 0; -} - -void DeletePokemonDungeonSprite(s32 id) -{ - DungeonPokemonSprite *dSprite; - - if (gDungeonPokemonSprites == NULL) - return; - - dSprite = GetDungeonPokemonSprite(id); - if (dSprite == NULL) - return; - - MemoryClear8(dSprite, sizeof(DungeonPokemonSprite)); -} - -void sub_800F958(s32 dungeonSpriteID, DungeonPos *pos, - DungeonPos *statusOffsets, u32 priority) -{ - DungeonPokemonSprite *dSprite; - - if (gDungeonPokemonSprites == NULL) - return; - - dSprite = GetDungeonPokemonSprite(dungeonSpriteID); - if (dSprite == NULL) - return; - - dSprite->pos = *pos; - dSprite->priority = priority; - dSprite->statusOffsets[0] = statusOffsets[0]; - dSprite->statusOffsets[1] = statusOffsets[3]; -} diff --git a/src/code_8069E0C.c b/src/code_8069E0C.c index cd2d8c685..11058ce97 100644 --- a/src/code_8069E0C.c +++ b/src/code_8069E0C.c @@ -9,7 +9,6 @@ #include "structs/dungeon_entity.h" #include "structs/str_806B7F8.h" #include "structs/str_dungeon.h" -#include "code_800F958.h" #include "dungeon_vram.h" #include "code_803E668.h" #include "code_805D8C8.h" @@ -23,6 +22,7 @@ #include "dungeon_logic.h" #include "dungeon_random.h" #include "dungeon_message.h" +#include "dungeon_pokemon_sprites.h" #include "dungeon_util.h" #include "exclusive_pokemon.h" #include "file_system.h" @@ -54,7 +54,6 @@ extern void sub_803F4A0(Entity *a0); extern bool8 sub_80860A8(u8 id); extern u8 gUnknown_202F32C; extern u8 GetRandomFloorItem(s32 a0); -extern void DeletePokemonDungeonSprite(s32 id); extern void sub_80429E8(Entity *r0); extern s32 sub_803DA20(s32 param_1); extern Entity *sub_804550C(s16 a); @@ -685,7 +684,7 @@ void sub_806BB6C(Entity *entity, s32 _species) struct unkStruct_806B7F8 spStruct; EntityInfo *entInfo = GetEntInfo(entity); - DeletePokemonDungeonSprite(entInfo->unk98); + DeletePokemonDungeonSprite(entInfo->dungeonSpriteId); // s16 memes... spStruct.species = 0; speciesMatch = species; @@ -767,7 +766,7 @@ void sub_806BC68(bool8 a0, Entity *entity, struct unkStruct_806B7F8 *structPtr, } } - entInfo->unk98 = gDungeon->unk37F0; + entInfo->dungeonSpriteId = gDungeon->unk37F0; gDungeon->unk37F0++; entInfo->unk9C = 0; if (structPtr->level == 0) { @@ -851,7 +850,7 @@ void sub_806BC68(bool8 a0, Entity *entity, struct unkStruct_806B7F8 *structPtr, entityPos.x = entity->pos.x; entityPos.y = entity->pos.y; - AddPokemonDungeonSprite(entInfo->unk98, entInfo->apparentID, &entityPos, gDungeon->unk181e8.priority); + AddPokemonDungeonSprite(entInfo->dungeonSpriteId, entInfo->apparentID, &entityPos, gDungeon->unk181e8.priority); LoadIQSkills(entity); sub_806A898(entity, FALSE, FALSE); } diff --git a/src/code_806CD90.c b/src/code_806CD90.c index 5d0bf7f19..04059cf8e 100644 --- a/src/code_806CD90.c +++ b/src/code_806CD90.c @@ -21,6 +21,7 @@ #include "dungeon_random.h" #include "dungeon_misc.h" #include "dungeon_util.h" +#include "dungeon_pokemon_sprites.h" #include "exclusive_pokemon.h" #include "move_effects_target.h" #include "pokemon.h" @@ -31,7 +32,6 @@ #include "text_util.h" #include "sprite.h" #include "random.h" -#include "code_800F958.h" #include "structs/str_202ED28.h" const u8 gUnknown_8106EC8[][13] = { @@ -45,7 +45,6 @@ const u8 gUnknown_8106EEF[] = {0x03, 0x04, 0x05, 0x00, 0x00, 0x70, 0x6b, 0x73, 0 extern s32 gDungeonFramesCounter; extern void sub_8042EC8(Entity *a0, s32 a1); -extern void sub_800F958(s32 dungeonSpriteID, DungeonPos *pos, DungeonPos *statusOffsets, u32 a3); static inline u16 GetUnkFlag(Entity *entity) { @@ -225,10 +224,10 @@ void sub_806C51C(Entity *entity) pos1.y = ((entity->pixelPos.y - entity->unk1C.raw) - entInfo->unk174.raw) / 256; sub_8005700(posArray, &entity->axObj); - sub_800F958(entInfo->unk98, &pos1, posArray, gDungeon->unk181e8.priority); + UpdateDungeonPokemonSprite2(entInfo->dungeonSpriteId, &pos1, posArray, gDungeon->unk181e8.priority); statusSprites = EntityGetStatusSprites(entity); - UpdateDungeonPokemonSprite(entInfo->unk98, entInfo->apparentID, statusSprites, (var_3C && entInfo->unk14C)); + UpdateDungeonPokemonSprite(entInfo->dungeonSpriteId, entInfo->apparentID, statusSprites, (var_3C && entInfo->unk14C)); sub_8042EC8(entity, y2); if (entInfo->unk15C == 0) { diff --git a/src/code_8073CF0.c b/src/code_8073CF0.c index 85f77acde..af13ea61d 100644 --- a/src/code_8073CF0.c +++ b/src/code_8073CF0.c @@ -317,7 +317,7 @@ void sub_8074094(Entity *entity) } else { EntityInfo *targetInfo = GetEntInfo(target); - if (targetInfo->unk98 != entityInfo->leechSeedClassStatus.unk4) { + if (targetInfo->dungeonSpriteId != entityInfo->leechSeedClassStatus.unk4) { entityInfo->leechSeedClassStatus.status = 0; } else { diff --git a/src/dungeon_damage.c b/src/dungeon_damage.c index 2f2432951..03780ac5f 100644 --- a/src/dungeon_damage.c +++ b/src/dungeon_damage.c @@ -256,7 +256,7 @@ void HandleDealingDamage(Entity *attacker, Entity *target, struct DamageStruct * if (destBondTarget == NULL) { targetInfo->leechSeedClassStatus.status = 0; } - else if (GetEntInfo(destBondTarget)->unk98 != targetInfo->leechSeedClassStatus.unk4) { + else if (GetEntInfo(destBondTarget)->dungeonSpriteId != targetInfo->leechSeedClassStatus.unk4) { targetInfo->leechSeedClassStatus.status = 0; } else { diff --git a/src/dungeon_engine.c b/src/dungeon_engine.c index 8ecc3b56f..191693790 100644 --- a/src/dungeon_engine.c +++ b/src/dungeon_engine.c @@ -427,7 +427,7 @@ void TrySpawnMonsterAndActivatePlusMinus(void) if (AbilityIsActive(entity, ABILITY_LIGHTNINGROD)) { gDungeon->lightningRodPokemon = entity; - gDungeon->unk17B38 = entityInfo->unk98; + gDungeon->unk17B38 = entityInfo->dungeonSpriteId; } if (AbilityIsActive(entity, ABILITY_MINUS)) { gDungeon->minusIsActive[isNotEnemy] = TRUE; diff --git a/src/dungeon_misc.c b/src/dungeon_misc.c index d3e836968..e57684864 100644 --- a/src/dungeon_misc.c +++ b/src/dungeon_misc.c @@ -49,7 +49,6 @@ static void EnsureDeoxysLoaded(void); extern bool8 IsLevelResetTo1(u8 dungeon); extern void xxx_pokemonstruct_index_to_pokemon2_808DE30(void* r0, u32 r1); -extern void DeletePokemonDungeonSprite(s32 id); extern void sub_806C264(s32 teamIndex, EntityInfo *entInfo); extern bool8 sub_806A58C(s16 r0); extern void sub_8084E00(Entity *entity, u8 param_2, u8 param_3); @@ -81,7 +80,6 @@ extern void DeletePokemonDungeonSprite(s32 id); extern void sub_80429E8(Entity *r0); extern s32 sub_803DA20(s32 param_1); extern s32 gDungeonFramesCounter; -extern void sub_800F958(s32 dungeonSpriteID, DungeonPos *pos, DungeonPos *statusOffsets, u32 a3); extern void sub_8042EC8(Entity *a0, s32 a1); extern Entity *sub_804550C(s16 a); extern Entity *sub_80453AC(s16 id); @@ -663,7 +661,7 @@ void sub_8068FE0(Entity *entity, s32 param_2, Entity *param_3) mon2Ptr->unk0 = 0; } - DeletePokemonDungeonSprite(entInfo->unk98); + DeletePokemonDungeonSprite(entInfo->dungeonSpriteId); gLeaderPointer = 0; gDungeon->unkC = 1; entity->type = ENTITY_NOTHING; @@ -1326,7 +1324,7 @@ void sub_806A338(void) Entity *entity = gDungeon->activePokemon[i]; if (EntityIsValid(entity) && (GetEntInfo(entity)->curseClassStatus.status == STATUS_SNATCH)) { gDungeon->snatchPokemon = entity; - gDungeon->unk17B3C = GetEntInfo(entity)->unk98; + gDungeon->unk17B3C = GetEntInfo(entity)->dungeonSpriteId; return; } } diff --git a/src/dungeon_move.c b/src/dungeon_move.c index 32062016c..8196a0367 100644 --- a/src/dungeon_move.c +++ b/src/dungeon_move.c @@ -128,7 +128,7 @@ void UseMoveAgainstTargets(Entity **targetsArray, Entity *attacker, Move *move, Entity *snatchMon = gDungeon->snatchPokemon; if (GetEntityType(snatchMon) == ENTITY_MONSTER && snatchMon != attacker - && GetEntInfo(snatchMon)->unk98 == gDungeon->unk17B3C + && GetEntInfo(snatchMon)->dungeonSpriteId == gDungeon->unk17B3C && targetInfo->unkFF == 0) { TryDisplayDungeonLoggableMessage3(attacker, currTarget, gUnknown_80FCD28); // The move was snatched. @@ -139,7 +139,7 @@ void UseMoveAgainstTargets(Entity **targetsArray, Entity *attacker, Move *move, Entity *lightRodMon = gDungeon->lightningRodPokemon; if (GetEntityType(lightRodMon) == ENTITY_MONSTER) { EntityInfo *lightRodInfo = GetEntInfo(lightRodMon); - if (lightRodInfo->unk98 == gDungeon->unk17B38 + if (lightRodInfo->dungeonSpriteId == gDungeon->unk17B38 && GetTreatmentBetweenMonsters(lightRodMon, attacker, TRUE, FALSE) == 1 && ((targetInfo->unkFF == 0 && lightRodInfo->unkFF == 0) || currTarget == lightRodMon)) { diff --git a/src/dungeon_pokemon_sprites.c b/src/dungeon_pokemon_sprites.c new file mode 100644 index 000000000..fc611afc4 --- /dev/null +++ b/src/dungeon_pokemon_sprites.c @@ -0,0 +1,501 @@ +#include "global.h" +#include "globaldata.h" +#include "dungeon_pokemon_sprites.h" +#include "structs/sprite_oam.h" +#include "code_8009804.h" +#include "cpu.h" +#include "memory.h" +#include "sprite.h" + +// size: 0x8 +typedef struct DungeonPokemonStatusSprite +{ + /* 0x0 */ u32 status; + /* 0x4 */ s32 frame; +} DungeonPokemonStatusSprite; + +// size: 0x40 +typedef struct DungeonPokemonSprite +{ + /* 0x0 */ bool8 exists; + /* 0x4 */ u32 id; + /* 0x8 */ u16 species; // Or sprite ID? + /* 0xA */ u16 unkA; + /* 0xC */ u32 status; + /* 0x10 */ u8 visible; + /* 0x11 */ u8 priority; + /* 0x14 */ DungeonPos pos; + /* 0x18 */ DungeonPos statusOffsets[2]; + /* 0x20 */ u32 unk20; + /* 0x24 */ u32 unk24; + /* 0x28 */ DungeonPokemonStatusSprite statusSprites[2]; + /* 0x38 */ u8 unk38; + u16 fill3A; + /* 0x3C */ u16 unk3C; + /* 0x3E */ u16 unk3E; +} DungeonPokemonSprite; + +#define MAX_DUNGEON_SPRITES 22 + +// size: 0x584 +typedef struct DungeonPokemonSprites +{ + /* 0x0 */ s32 frame; + /* 0x4 */ DungeonPokemonSprite sprites[MAX_DUNGEON_SPRITES]; +} DungeonPokemonSprites; + +struct StatusGraphicsInfo +{ + /* 0x0 */ s32 width; + /* 0x4 */ s32 height; + /* 0x8 */ s32 vramIndex; + /* 0xC */ s32 unk; + /* 0x10 */ s32 graphicsCount; + /* 0x14 */ s32 offsetIntoGraphic; +}; + +#define TILE_SIZE_2BPP 32 + +const struct StatusGraphicsInfo gStatusGraphics[] = { + {0, 0, 0, 0, 0, 0}, + {1, 1, 0, 0, 14, TILE_SIZE_2BPP * 0 }, // sleepless + {2, 2, 1, 0, 7, TILE_SIZE_2BPP * 14 }, // burned + {2, 2, 5, 0, 16, TILE_SIZE_2BPP * 42 }, // poisoned + {4, 4, 9, 0, 6, TILE_SIZE_2BPP * 106}, // frozen + {4, 2, 25, 0, 4, TILE_SIZE_2BPP * 202}, // confused + {2, 2, 33, 0, 9, TILE_SIZE_2BPP * 234}, // whiffer + {2, 2, 37, 0, 8, TILE_SIZE_2BPP * 270}, // taunted + {1, 2, 41, 0, 8, TILE_SIZE_2BPP * 302}, // lowhp + {2, 2, 43, 0, 13, TILE_SIZE_2BPP * 318}, // shield + {2, 2, 47, 10, 10, TILE_SIZE_2BPP * 370}, // statdown + {2, 2, 51, 0, 13, TILE_SIZE_2BPP * 410}, // sword + {1, 1, 55, 0, 14, TILE_SIZE_2BPP * 462}, // blinker + {2, 2, 56, 0, 10, TILE_SIZE_2BPP * 476}, // cross-eyed + {1, 1, 60, 0, 14, TILE_SIZE_2BPP * 516}, // eyedrops + {2, 2, 61, 0, 8, TILE_SIZE_2BPP * 530}, // muzzled + {2, 2, 65, 4, 10, TILE_SIZE_2BPP * 562}, // sleep +}; + +static const u8 sStatusGfx[] = INCBIN_U8("graphics/status/sleepless.4bpp", + "graphics/status/burned.4bpp", + "graphics/status/poisoned.4bpp", + "graphics/status/frozen.4bpp", + "graphics/status/confused.4bpp", + "graphics/status/whiffer.4bpp", + "graphics/status/taunted.4bpp", + "graphics/status/lowhp.4bpp", + "graphics/status/shield.4bpp", + "graphics/status/statdown.4bpp", + "graphics/status/sword.4bpp", + "graphics/status/blinker.4bpp", + "graphics/status/cross_eyed.4bpp", + "graphics/status/eyedrops.4bpp", + "graphics/status/muzzled.4bpp", + "graphics/status/sleep.4bpp"); + +struct StatusSprite +{ + u32 image; + u32 palIndex; +}; + +static const struct StatusSprite sStatusSpritesInfo[] = { + [0] = {0, 0}, + [1] = {1, 0}, + [2] = {2, 0}, + [3] = {3, 11}, + [4] = {3, 7}, + [5] = {5, 0}, + [6] = {6, 0}, + [7] = {7, 0}, + [8] = {8, 0}, + [9] = {9, 0}, + [10] = {9, 4}, + [11] = {9, 3}, + [12] = {9, 10}, + [13] = {9, 5}, + [14] = {8, 0}, + [15] = {3, 6}, + [16] = {8, 3}, + [17] = {11, 0}, + [18] = {6, 10}, + [19] = {11, 5}, + [20] = {11, 4}, + [21] = {12, 0}, + [22] = {13, 0}, + [23] = {14, 0}, + [24] = {15, 0}, + [25] = {9, 7}, + [26] = {14, 4}, + [27] = {16, 4}, + [28] = {10, 3}, + [29] = {4, 0}, +}; + +EWRAM_INIT DungeonPokemonSprites *gDungeonPokemonSprites = NULL; +EWRAM_INIT SpriteOAM sStatusSpriteOAM = {0}; + +static void DrawStatusSprite(s16 param_1,s32 status,DungeonPos *pos,DungeonPos *posOffset, DungeonPos *posScreen,u32 priority, u32 unused); + +static DungeonPokemonSprite *GetSpriteById(s32 id) +{ + s32 i; + + for (i = 0; i < MAX_DUNGEON_SPRITES; i++) { + if (gDungeonPokemonSprites->sprites[i].exists && gDungeonPokemonSprites->sprites[i].id == id) { + return &gDungeonPokemonSprites->sprites[i]; + } + } + + return NULL; +} + +static DungeonPokemonSprite *GetFirstFreeSlot(void) +{ + s32 i; + + for (i = 0; i < MAX_DUNGEON_SPRITES; i++) { + if (!gDungeonPokemonSprites->sprites[i].exists) { + return &gDungeonPokemonSprites->sprites[i]; + } + } + return NULL; +} + +static u32 GetNextStatusSymbol(DungeonPokemonSprite *sprite, s32 statusIndex) +{ + u32 uVar1; + u32 status; + s32 counter; + s32 max; + u32 uVar5; + u32 uVar6; + DungeonPokemonStatusSprite *statusSprite; + + statusSprite = &sprite->statusSprites[statusIndex]; + uVar5 = 0x10000000; + if (statusIndex == 0) { + uVar5 = 1; + } + uVar6 = 0x10000000; + if (statusIndex == 0) { + uVar6 = 0x8000000; + } + max = 1; + if (statusIndex == 0) { + max = 0x1c; + } + if (sprite->status == 0) { + return 0; + } + + status = statusSprite->status; + uVar1 = uVar5; + if (status != 0) { + uVar1 = status; + } + + for(counter = 0; counter < max; counter++) + { + uVar1 *= 2; + if (uVar1 > uVar6) { + uVar1 = uVar5; + } + if ((sprite->status & uVar1) != 0) { + return uVar1; + } + } + return 0; +} + +static u32 StatusSymbolBitToIndex(u32 statusBit) +{ + u32 index; + + index = 0; + while (statusBit != 0) { + statusBit >>= 1; + index++; + } + return index; +} + +static void UpdateStatusSprite(DungeonPokemonSprite *sprite, s32 index, DungeonPos *screenPos) +{ + DungeonPokemonStatusSprite *statusSprite = &sprite->statusSprites[index]; + + if (sprite->status == 0) { + statusSprite->status = 0; + } + else { + u32 newFrame; + + if (statusSprite->status == 0) { + statusSprite->frame = 0; + } + if (statusSprite->frame < 1) { + u32 statusSymbol = GetNextStatusSymbol(sprite,index); + if (statusSprite->status != statusSymbol) { + statusSprite->status = statusSymbol; + } + newFrame = 60; + } + else { + newFrame = statusSprite->frame - 1; + } + statusSprite->frame = newFrame; + if (sprite->visible && statusSprite->status != 0) { + DrawStatusSprite(sprite->species,StatusSymbolBitToIndex(statusSprite->status),&sprite->pos, + &sprite->statusOffsets[index],screenPos,sprite->priority, sprite->id); + } + } +} + +static void DrawStatusSprite(s16 species, s32 status, DungeonPos *pos, DungeonPos *posOffset, DungeonPos *posScreen, u32 priority, u32 unused) +{ + struct StatusSprite spriteInfo; + s32 posY; + s32 posX; + u32 uVar7; + s32 vramIndex; + const struct StatusGraphicsInfo *ptr; + + spriteInfo = sStatusSpritesInfo[status]; + ptr = &gStatusGraphics[spriteInfo.image]; + vramIndex = (ptr->vramIndex + 0x32b); + SpriteSetPriority(&sStatusSpriteOAM, priority); + + posX = (pos->x - ptr->width * 4 - posScreen->x) + posOffset->x; + posY = (pos->y - ptr->height * 4 - posScreen->y) + posOffset->y; + uVar7 = posY - 16; + if ((((-0x20 <= posX) && (-0x20 <= posY)) && (posX < 0xf0)) && (posY < 0xa0)) { + switch(spriteInfo.image) { + case 1: + case 0xc: + case 0xe: + SpriteSetShape(&sStatusSpriteOAM, 0); + SpriteSetSize(&sStatusSpriteOAM, 0); + SpriteSetX(&sStatusSpriteOAM, posX); + SpriteSetY(&sStatusSpriteOAM, uVar7); + break; + case 8: + SpriteSetShape(&sStatusSpriteOAM, 2); + SpriteSetSize(&sStatusSpriteOAM, 0); + SpriteSetX(&sStatusSpriteOAM, posX); + SpriteSetY(&sStatusSpriteOAM, uVar7); + break; + case 2: + case 3: + case 6: + case 7: + case 9: + case 10: + case 11: + case 13: + case 15: + SpriteSetShape(&sStatusSpriteOAM, 0); + SpriteSetSize(&sStatusSpriteOAM, 1); + SpriteSetX(&sStatusSpriteOAM, posX); + SpriteSetY(&sStatusSpriteOAM, uVar7); + break; + case 0x10: + SpriteSetShape(&sStatusSpriteOAM, 0); + SpriteSetSize(&sStatusSpriteOAM, 1); + SpriteSetX(&sStatusSpriteOAM, posX + 8); + SpriteSetY(&sStatusSpriteOAM, uVar7); + break; + case 5: + SpriteSetShape(&sStatusSpriteOAM, 1); + SpriteSetSize(&sStatusSpriteOAM, 2); + SpriteSetX(&sStatusSpriteOAM, posX); + SpriteSetY(&sStatusSpriteOAM, uVar7); + break; + case 4: + SpriteSetShape(&sStatusSpriteOAM, 0); + SpriteSetSize(&sStatusSpriteOAM, 2); + SpriteSetX(&sStatusSpriteOAM, posX); + SpriteSetY(&sStatusSpriteOAM, posY); + break; + } + SpriteSetTileNum(&sStatusSpriteOAM, vramIndex); + SpriteSetPalNum(&sStatusSpriteOAM, spriteInfo.palIndex); + AddSprite(&sStatusSpriteOAM,(pos->y - posScreen->y) / 2 + 1,NULL,NULL); + } +} + +static void LoadStatusGraphics(s32 graphicIndex, bool8 queueLoad) +{ + const struct StatusGraphicsInfo *graphic = &gStatusGraphics[graphicIndex]; + s32 offset = graphic->offsetIntoGraphic; + s32 graphicsCount = graphic->graphicsCount; + s32 size = graphic->width * graphic->height * 0x20; + s32 vramIndex = (graphic->vramIndex + 0x32b) * 0x20; + s32 frame = (gDungeonPokemonSprites->frame / 4) % graphicsCount; + const u8 *ptr = sStatusGfx + offset + (frame * size); + + if (queueLoad) { + sub_80098BC((void *)(VRAM + 0x10000 + vramIndex), (void *)ptr, size); + } + else { + CpuCopy((void *)(VRAM + 0x10000 + vramIndex), ptr, size); + } +} + +void InitDungeonPokemonSprites(void) +{ + if (gDungeonPokemonSprites == NULL) { + gDungeonPokemonSprites = MemoryAlloc(sizeof(DungeonPokemonSprites),0xc); + MemoryClear8(gDungeonPokemonSprites,sizeof(DungeonPokemonSprites)); + } + gDungeonPokemonSprites->frame = 0; + LoadStatusGraphics(1,FALSE); + LoadStatusGraphics(2,FALSE); + LoadStatusGraphics(3,FALSE); + LoadStatusGraphics(4,FALSE); + LoadStatusGraphics(5,FALSE); + LoadStatusGraphics(6,FALSE); + LoadStatusGraphics(7,FALSE); + LoadStatusGraphics(8,FALSE); + LoadStatusGraphics(9,FALSE); + LoadStatusGraphics(10,FALSE); + LoadStatusGraphics(0xb,FALSE); + LoadStatusGraphics(0xc,FALSE); + LoadStatusGraphics(0xd,FALSE); + LoadStatusGraphics(0xe,FALSE); + LoadStatusGraphics(0xf,FALSE); + LoadStatusGraphics(0x10,FALSE); +} + +void FreeDungeonPokemonSprites(void) +{ + TRY_FREE_AND_SET_NULL(gDungeonPokemonSprites); +} + +void UpdateDungeonPokemonSprite(s32 dungeonSpriteId, s32 species_, s32 status, u32 visible_) +{ + s32 species = (s16) species_; + u32 visible = (u8) visible_; + + if (gDungeonPokemonSprites != NULL) { + DungeonPokemonSprite *sprite = GetSpriteById(dungeonSpriteId); + if (sprite != NULL) { + sprite->species = species; + sprite->status = status; + sprite->visible = visible; + sprite->unk38 = 0; + } + } +} + +UNUSED static void sub_800F794(s32 id, s32 r1, s32 r2, s32 r3, s32 *r4) +{ + if (gDungeonPokemonSprites != NULL) { + DungeonPokemonSprite *sprite = GetSpriteById(id); + if (sprite != NULL) { + sprite->unk38 = 1; + sprite->unk3C = r2; + sprite->unk3E = r3; + sprite->unk20 = r4[0]; + sprite->unk24 = r4[3]; + } + } +} + +void FrameUpdateDungeonStatusSprites(DungeonPos *screenPos) +{ + s32 i; + + if (gDungeonPokemonSprites == NULL) + return; + + switch (gDungeonPokemonSprites->frame % 4) { + case 0: + LoadStatusGraphics(1, TRUE); + LoadStatusGraphics(2, TRUE); + LoadStatusGraphics(3, TRUE); + LoadStatusGraphics(4, TRUE); + break; + case 1: + LoadStatusGraphics(5, TRUE); + LoadStatusGraphics(6, TRUE); + LoadStatusGraphics(7, TRUE); + LoadStatusGraphics(8, TRUE); + break; + case 2: + LoadStatusGraphics(9, TRUE); + LoadStatusGraphics(0xA, TRUE); + LoadStatusGraphics(0xB, TRUE); + LoadStatusGraphics(0xC, TRUE); + break; + case 3: + LoadStatusGraphics(0xD, TRUE); + LoadStatusGraphics(0xE, TRUE); + LoadStatusGraphics(0xF, TRUE); + LoadStatusGraphics(0x10, TRUE); + break; + } + + for (i = 0; i < MAX_DUNGEON_SPRITES; i++) { + if (gDungeonPokemonSprites->sprites[i].exists) { + DungeonPokemonSprite *spritePtr = &gDungeonPokemonSprites->sprites[i]; + UpdateStatusSprite(spritePtr, 0, screenPos); + UpdateStatusSprite(spritePtr, 1, screenPos); + } + } + gDungeonPokemonSprites->frame++; +} + +void AddPokemonDungeonSprite(s32 dungeonSpriteId, s32 species_, DungeonPos *pos, u32 priority) +{ + static const DungeonPos posZero = {0, 0}; + DungeonPokemonSprite *newSprite; + s32 species = (s16) species_; + + if (gDungeonPokemonSprites == NULL) + return; + if (GetSpriteById(dungeonSpriteId) != NULL) + return; + + newSprite = GetFirstFreeSlot(); + if (newSprite == NULL) + return; + + newSprite->exists = TRUE; + newSprite->id = dungeonSpriteId; + newSprite->species = species; + newSprite->status = 0; + newSprite->pos = *pos; + newSprite->priority = priority; + newSprite->statusOffsets[0] = newSprite->statusOffsets[1] = posZero; + newSprite->statusSprites[0].status = 0; + newSprite->statusSprites[0].frame = 0; + newSprite->statusSprites[1].status = 0; + newSprite->statusSprites[1].frame = 0; +} + +void DeletePokemonDungeonSprite(s32 dungeonSpriteId) +{ + DungeonPokemonSprite *dSprite; + + if (gDungeonPokemonSprites == NULL) + return; + + dSprite = GetSpriteById(dungeonSpriteId); + if (dSprite == NULL) + return; + + MemoryClear8(dSprite, sizeof(*dSprite)); +} + +void UpdateDungeonPokemonSprite2(s32 dungeonSpriteId, DungeonPos *pos, DungeonPos *statusOffsets, u32 priority) +{ + if (gDungeonPokemonSprites != NULL) { + DungeonPokemonSprite *sprite = GetSpriteById(dungeonSpriteId); + if (sprite != NULL) { + sprite->pos = *pos; + sprite->priority = priority; + sprite->statusOffsets[0] = statusOffsets[0]; + sprite->statusOffsets[1] = statusOffsets[3]; + } + } +} diff --git a/src/dungeon_serializer.c b/src/dungeon_serializer.c index 8ebdfd491..e804f1d0f 100644 --- a/src/dungeon_serializer.c +++ b/src/dungeon_serializer.c @@ -1,7 +1,6 @@ #include "global.h" #include "globaldata.h" #include "structs/str_dungeon.h" -#include "code_800F958.h" #include "code_805D8C8.h" #include "code_806CD90.h" #include "dungeon_items.h" @@ -9,6 +8,7 @@ #include "dungeon_logic.h" #include "dungeon_serializer.h" #include "dungeon_util.h" +#include "dungeon_pokemon_sprites.h" #include "pokemon.h" extern u8 gUnknown_202EE70[MAX_TEAM_BODY_SIZE]; @@ -323,7 +323,7 @@ static void WriteMonster(DataSerializer *seri, Entity *src) WriteIQSkills(seri, &info->IQSkillFlags); WriteTactic(seri, info->tactic); WriteHiddenPower(seri, &info->hiddenPower); - WriteU32(seri, info->unk98); + WriteU32(seri, info->dungeonSpriteId); WriteU32(seri, info->unk9C); WriteU32(seri, info->unkA0); WriteSleepClassStatus(seri, &info->sleepClassStatus); @@ -1006,7 +1006,7 @@ static void ReadMonster(DataSerializer *seri, bool8 isTeamMember, s32 index) ReadIQSkills(seri, &entInfo.IQSkillFlags); entInfo.tactic = ReadTactic(seri); ReadHiddenPower(seri, &entInfo.hiddenPower); - entInfo.unk98 = ReadU32(seri); + entInfo.dungeonSpriteId = ReadU32(seri); entInfo.unk9C = ReadU32(seri); entInfo.unkA0 = ReadU32(seri); ReadSleepClassStatus(seri, &entInfo.sleepClassStatus); @@ -1238,7 +1238,7 @@ void sub_8082B40(void) entity->axObj.spriteFile = GetSpriteData(info->apparentID); sub_806CCB4(entity, sub_806CEBC(entity)); pos = entity->pos; - AddPokemonDungeonSprite(info->unk98, info->apparentID, &pos, 3); + AddPokemonDungeonSprite(info->dungeonSpriteId, info->apparentID, &pos, 3); entity->room = GetTileMut(entity->pos.x, entity->pos.y)->room; } } diff --git a/src/dungeon_util.c b/src/dungeon_util.c index 6e5fc9220..4b29f4a1c 100644 --- a/src/dungeon_util.c +++ b/src/dungeon_util.c @@ -4,7 +4,6 @@ #include "structs/str_dungeon.h" #include "structs/str_traps.h" #include "structs/map.h" -#include "code_800F958.h" #include "code_8041AD0.h" #include "code_8069E0C.h" #include "code_807E5AC.h" @@ -21,6 +20,7 @@ #include "dungeon_util.h" #include "dungeon_leader.h" #include "dungeon_message.h" +#include "dungeon_pokemon_sprites.h" #include "dungeon_music.h" #include "dungeon_map.h" #include "string_format.h" @@ -154,7 +154,7 @@ void sub_804522C(void) { info = GetEntInfo(entity); statusSprites = EntityGetStatusSprites(entity); - UpdateDungeonPokemonSprite(info->unk98, info->apparentID, statusSprites, FALSE); + UpdateDungeonPokemonSprite(info->dungeonSpriteId, info->apparentID, statusSprites, FALSE); } } } diff --git a/src/dungeon_vram.c b/src/dungeon_vram.c index cd749cc00..3b71dec0b 100644 --- a/src/dungeon_vram.c +++ b/src/dungeon_vram.c @@ -28,6 +28,7 @@ #include "dungeon_logic.h" #include "dungeon_range.h" #include "dungeon_util.h" +#include "dungeon_pokemon_sprites.h" #include "menu_input.h" #include "code_801602C.h" @@ -56,7 +57,6 @@ void sub_803ECE0(); void sub_803EDF0(); void sub_800E90C(); void sub_8042E5C(); -void sub_800F7D0(DungeonPos *); static void sub_803E490(u32); static s32 sub_803EF90(s32 a0, u8 a1); @@ -194,7 +194,7 @@ static void sub_803E490(u32 unused) sub_804522C(); sub_803F9CC(); - sub_800F7D0(&gDungeon->unk181e8.cameraPixelPos); + FrameUpdateDungeonStatusSprites(&gDungeon->unk181e8.cameraPixelPos); if(gDungeon->unk12 <= 0x63) gDungeon->unk12++; diff --git a/src/move_orb_effects_2.c b/src/move_orb_effects_2.c index 23ac4b0ff..1cafe7eed 100644 --- a/src/move_orb_effects_2.c +++ b/src/move_orb_effects_2.c @@ -347,7 +347,7 @@ void HandleLeechSeed(Entity * pokemon, Entity * target, bool8 displayMessage) if (pokemon == gDungeon->activePokemon[index]) { entityInfo->leechSeedClassStatus.unk8 = index; entityInfo2 = GetEntInfo(pokemon); - entityInfo->leechSeedClassStatus.unk4 = entityInfo2->unk98; + entityInfo->leechSeedClassStatus.unk4 = entityInfo2->dungeonSpriteId; } } TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FAE58); @@ -372,7 +372,7 @@ void sub_8078084(Entity * pokemon) entityInfo2 = GetEntInfo(target); if(entityInfo2->leechSeedClassStatus.status == STATUS_LEECH_SEED || entityInfo2->leechSeedClassStatus.status == STATUS_DESTINY_BOND) { - if(entityInfo2->leechSeedClassStatus.unk4 == entityInfo->unk98) + if(entityInfo2->leechSeedClassStatus.unk4 == entityInfo->dungeonSpriteId) { entityInfo2->leechSeedClassStatus.status = STATUS_NONE; EntityUpdateStatusSprites(target); @@ -413,7 +413,7 @@ void DestinyBondStatusTarget(Entity * pokemon, Entity * target) if (target == gDungeon->activePokemon[index]) { entityInfo->leechSeedClassStatus.unk8 = index; entityInfo2 = GetEntInfo(target); - entityInfo->leechSeedClassStatus.unk4 = entityInfo2->unk98; + entityInfo->leechSeedClassStatus.unk4 = entityInfo2->dungeonSpriteId; } } TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FBB4C); @@ -626,7 +626,7 @@ void SnatchStatusTarget(Entity * pokemon, Entity * target) } gDungeon->snatchPokemon = target; - gDungeon->unk17B3C = targetEntityInfo->unk98; + gDungeon->unk17B3C = targetEntityInfo->dungeonSpriteId; SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0],target,0); TryDisplayDungeonLoggableMessage3(pokemon,target,gUnknown_80FB01C); EntityUpdateStatusSprites(target); diff --git a/src/run_dungeon.c b/src/run_dungeon.c index 6b7c44f91..435d5676a 100644 --- a/src/run_dungeon.c +++ b/src/run_dungeon.c @@ -36,6 +36,7 @@ #include "dungeon_message_log.h" #include "dungeon_misc.h" #include "dungeon_music.h" +#include "dungeon_pokemon_sprites.h" #include "dungeon_random.h" #include "dungeon_strings.h" #include "dungeon_serializer.h" @@ -70,7 +71,6 @@ extern void IncrementThievingSuccesses(void); extern void ShowDungeonClearedWindow(void); extern void sub_8084424(void); extern void sub_8086130(void); -extern void FreeDungeonPokemonSprites(void); extern void sub_80847D4(void); extern void sub_8043D60(void); extern void sub_806890C(void); @@ -87,7 +87,6 @@ extern void ShowWholeRevealedDungeonMap(void); extern void sub_807E5AC(void); extern void TriggerWeatherAbilities(void); extern void sub_807E88C(void); -extern void InitDungeonPokemonSprites(void); extern void nullsub_16(void); extern void sub_80521D0(void); extern void sub_803F27C(u8); diff --git a/sym_ewram_init.txt b/sym_ewram_init.txt index aa5664ca0..2abece9e1 100644 --- a/sym_ewram_init.txt +++ b/sym_ewram_init.txt @@ -15,6 +15,7 @@ .include "src/cpu.o" .include "src/code_800DAC0.o" .include "src/code_800ED38.o" +.include "src/dungeon_pokemon_sprites.o" .include "src/friend_areas_map.o" .include "src/world_map.o" .include "src/debug.o" From f1fafcb20de75cde65dc70c01395af58b53b98d1 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 7 Jun 2025 18:35:52 +0200 Subject: [PATCH 3/3] finish dungeon pokemon sprites documentation --- include/constants/status.h | 89 +++++--- src/dungeon_pokemon_sprites.c | 379 ++++++++++++++++++---------------- 2 files changed, 257 insertions(+), 211 deletions(-) diff --git a/include/constants/status.h b/include/constants/status.h index c6acb0384..7085276f1 100644 --- a/include/constants/status.h +++ b/include/constants/status.h @@ -92,34 +92,65 @@ #define STATUS_CROSS_EYED 2 #define STATUS_EYEDROPS 3 -#define STATUS_SPRITE_SLEEPLESS (1 << 0) -#define STATUS_SPRITE_BURNED (1 << 1) -#define STATUS_SPRITE_POISONED (1 << 2) -#define STATUS_SPRITE_BADLY_POISONED (1 << 3) -#define STATUS_SPRITE_CONFUSED (1 << 4) -#define STATUS_SPRITE_COWERING (1 << 5) -#define STATUS_SPRITE_TAUNTED (1 << 6) -#define STATUS_SPRITE_ENCORE (1 << 7) -#define STATUS_SPRITE_SHIELD_BLUE (1 << 8) // REFLECT, COUNTER, MINI_COUNTER, MIST -#define STATUS_SPRITE_SHIELD_RED (1 << 9) // SAFEGUARD, MIRROR_COAT -#define STATUS_SPRITE_SHIELD_YELLOW (1 << 10) // LIGHT_SCREEN, MAGIC_COAT -#define STATUS_SPRITE_SHIELD_GREEN (1 << 11) // PROTECT, MIRRO_MOVE, VITAL_THROW -#define STATUS_SPRITE_ENDURE (1 << 12) -#define STATUS_SPRITE_LOWHP (1 << 13) -#define STATUS_SPRITE_CURSED (1 << 14) -#define STATUS_SPRITE_SNATCH (1 << 15) -#define STATUS_SPRITE_SURE_SHOT (1 << 16) -#define STATUS_SPRITE_WHIFFER (1 << 17) -#define STATUS_SPRITE_SET_DAMAGE (1 << 18) -#define STATUS_SPRITE_FOCUS_ENERGY (1 << 19) -#define STATUS_SPRITE_BLINKER (1 << 20) -#define STATUS_SPRITE_CROSS_EYED (1 << 21) -#define STATUS_SPRITE_EYEDROPS (1 << 22) -#define STATUS_SPRITE_MUZZLED (1 << 23) -#define STATUS_SPRITE_GRUDGE (1 << 24) -#define STATUS_SPRITE_EXPOSED (1 << 25) -#define STATUS_SPRITE_SLEEP (1 << 26) -#define STATUS_SPRITE_STAT_DOWN (1 << 27) -#define STATUS_SPRITE_FROZEN (1 << 28) +#define STATUS_SPRITE_ID_SLEEPLESS 0 +#define STATUS_SPRITE_ID_BURNED 1 +#define STATUS_SPRITE_ID_POISONED 2 +#define STATUS_SPRITE_ID_BADLY_POISONED 3 +#define STATUS_SPRITE_ID_CONFUSED 4 +#define STATUS_SPRITE_ID_COWERING 5 +#define STATUS_SPRITE_ID_TAUNTED 6 +#define STATUS_SPRITE_ID_ENCORE 7 +#define STATUS_SPRITE_ID_SHIELD_BLUE 8 +#define STATUS_SPRITE_ID_SHIELD_RED 9 +#define STATUS_SPRITE_ID_SHIELD_YELLOW 10 +#define STATUS_SPRITE_ID_SHIELD_GREEN 11 +#define STATUS_SPRITE_ID_ENDURE 12 +#define STATUS_SPRITE_ID_LOWHP 13 +#define STATUS_SPRITE_ID_CURSED 14 +#define STATUS_SPRITE_ID_SNATCH 15 +#define STATUS_SPRITE_ID_SURE_SHOT 16 +#define STATUS_SPRITE_ID_WHIFFER 17 +#define STATUS_SPRITE_ID_SET_DAMAGE 18 +#define STATUS_SPRITE_ID_FOCUS_ENERGY 19 +#define STATUS_SPRITE_ID_BLINKER 20 +#define STATUS_SPRITE_ID_CROSS_EYED 21 +#define STATUS_SPRITE_ID_EYEDROPS 22 +#define STATUS_SPRITE_ID_MUZZLED 23 +#define STATUS_SPRITE_ID_GRUDGE 24 +#define STATUS_SPRITE_ID_EXPOSED 25 +#define STATUS_SPRITE_ID_SLEEP 26 +#define STATUS_SPRITE_ID_STAT_DOWN 27 +#define STATUS_SPRITE_ID_FROZEN 28 +#define STATUS_SPRITE_ID_LAST 28 + +#define STATUS_SPRITE_SLEEPLESS (1 << STATUS_SPRITE_ID_SLEEPLESS) +#define STATUS_SPRITE_BURNED (1 << STATUS_SPRITE_ID_BURNED) +#define STATUS_SPRITE_POISONED (1 << STATUS_SPRITE_ID_POISONED) +#define STATUS_SPRITE_BADLY_POISONED (1 << STATUS_SPRITE_ID_BADLY_POISONED) +#define STATUS_SPRITE_CONFUSED (1 << STATUS_SPRITE_ID_CONFUSED) +#define STATUS_SPRITE_COWERING (1 << STATUS_SPRITE_ID_COWERING) +#define STATUS_SPRITE_TAUNTED (1 << STATUS_SPRITE_ID_TAUNTED) +#define STATUS_SPRITE_ENCORE (1 << STATUS_SPRITE_ID_ENCORE) +#define STATUS_SPRITE_SHIELD_BLUE (1 << STATUS_SPRITE_ID_SHIELD_BLUE) // REFLECT, COUNTER, MINI_COUNTER, MIST +#define STATUS_SPRITE_SHIELD_RED (1 << STATUS_SPRITE_ID_SHIELD_RED) // SAFEGUARD, MIRROR_COAT +#define STATUS_SPRITE_SHIELD_YELLOW (1 << STATUS_SPRITE_ID_SHIELD_YELLOW) // LIGHT_SCREEN, MAGIC_COAT +#define STATUS_SPRITE_SHIELD_GREEN (1 << STATUS_SPRITE_ID_SHIELD_GREEN) // PROTECT, MIRRO_MOVE, VITAL_THROW +#define STATUS_SPRITE_ENDURE (1 << STATUS_SPRITE_ID_ENDURE) +#define STATUS_SPRITE_LOWHP (1 << STATUS_SPRITE_ID_LOWHP) +#define STATUS_SPRITE_CURSED (1 << STATUS_SPRITE_ID_CURSED) +#define STATUS_SPRITE_SNATCH (1 << STATUS_SPRITE_ID_SNATCH) +#define STATUS_SPRITE_SURE_SHOT (1 << STATUS_SPRITE_ID_SURE_SHOT) +#define STATUS_SPRITE_WHIFFER (1 << STATUS_SPRITE_ID_WHIFFER) +#define STATUS_SPRITE_SET_DAMAGE (1 << STATUS_SPRITE_ID_SET_DAMAGE) +#define STATUS_SPRITE_FOCUS_ENERGY (1 << STATUS_SPRITE_ID_FOCUS_ENERGY) +#define STATUS_SPRITE_BLINKER (1 << STATUS_SPRITE_ID_BLINKER) +#define STATUS_SPRITE_CROSS_EYED (1 << STATUS_SPRITE_ID_CROSS_EYED) +#define STATUS_SPRITE_EYEDROPS (1 << STATUS_SPRITE_ID_EYEDROPS) +#define STATUS_SPRITE_MUZZLED (1 << STATUS_SPRITE_ID_MUZZLED) +#define STATUS_SPRITE_GRUDGE (1 << STATUS_SPRITE_ID_GRUDGE) +#define STATUS_SPRITE_EXPOSED (1 << STATUS_SPRITE_ID_EXPOSED) +#define STATUS_SPRITE_SLEEP (1 << STATUS_SPRITE_ID_SLEEP) +#define STATUS_SPRITE_STAT_DOWN (1 << STATUS_SPRITE_ID_STAT_DOWN) +#define STATUS_SPRITE_FROZEN (1 << STATUS_SPRITE_ID_FROZEN) #endif diff --git a/src/dungeon_pokemon_sprites.c b/src/dungeon_pokemon_sprites.c index fc611afc4..105bbb380 100644 --- a/src/dungeon_pokemon_sprites.c +++ b/src/dungeon_pokemon_sprites.c @@ -6,6 +6,7 @@ #include "cpu.h" #include "memory.h" #include "sprite.h" +#include "constants/status.h" // size: 0x8 typedef struct DungeonPokemonStatusSprite @@ -26,8 +27,7 @@ typedef struct DungeonPokemonSprite /* 0x11 */ u8 priority; /* 0x14 */ DungeonPos pos; /* 0x18 */ DungeonPos statusOffsets[2]; - /* 0x20 */ u32 unk20; - /* 0x24 */ u32 unk24; + /* 0x20 */ DungeonPos unk20[2]; /* 0x28 */ DungeonPokemonStatusSprite statusSprites[2]; /* 0x38 */ u8 unk38; u16 fill3A; @@ -35,13 +35,13 @@ typedef struct DungeonPokemonSprite /* 0x3E */ u16 unk3E; } DungeonPokemonSprite; -#define MAX_DUNGEON_SPRITES 22 +#define MAX_DUNGEON_POKEMON_SPRITES 22 // size: 0x584 typedef struct DungeonPokemonSprites { /* 0x0 */ s32 frame; - /* 0x4 */ DungeonPokemonSprite sprites[MAX_DUNGEON_SPRITES]; + /* 0x4 */ DungeonPokemonSprite sprites[MAX_DUNGEON_POKEMON_SPRITES]; } DungeonPokemonSprites; struct StatusGraphicsInfo @@ -54,26 +54,46 @@ struct StatusGraphicsInfo /* 0x14 */ s32 offsetIntoGraphic; }; +enum { + STATUS_GFX_NONE, + STATUS_GFX_SLEEPLESS, + STATUS_GFX_BURNED, + STATUS_GFX_POISONED, + STATUS_GFX_FROZEN, + STATUS_GFX_CONFUSED, + STATUS_GFX_WHIFFER, + STATUS_GFX_TAUNTED, + STATUS_GFX_LOWHP, + STATUS_GFX_SHIELD, + STATUS_GFX_STATDOWN, + STATUS_GFX_SWORD, + STATUS_GFX_BLINKER, + STATUS_GFX_CROSS_EYED, + STATUS_GFX_EYEDROPS, + STATUS_GFX_MUZZLED, + STATUS_GFX_SLEEP, +}; + #define TILE_SIZE_2BPP 32 -const struct StatusGraphicsInfo gStatusGraphics[] = { - {0, 0, 0, 0, 0, 0}, - {1, 1, 0, 0, 14, TILE_SIZE_2BPP * 0 }, // sleepless - {2, 2, 1, 0, 7, TILE_SIZE_2BPP * 14 }, // burned - {2, 2, 5, 0, 16, TILE_SIZE_2BPP * 42 }, // poisoned - {4, 4, 9, 0, 6, TILE_SIZE_2BPP * 106}, // frozen - {4, 2, 25, 0, 4, TILE_SIZE_2BPP * 202}, // confused - {2, 2, 33, 0, 9, TILE_SIZE_2BPP * 234}, // whiffer - {2, 2, 37, 0, 8, TILE_SIZE_2BPP * 270}, // taunted - {1, 2, 41, 0, 8, TILE_SIZE_2BPP * 302}, // lowhp - {2, 2, 43, 0, 13, TILE_SIZE_2BPP * 318}, // shield - {2, 2, 47, 10, 10, TILE_SIZE_2BPP * 370}, // statdown - {2, 2, 51, 0, 13, TILE_SIZE_2BPP * 410}, // sword - {1, 1, 55, 0, 14, TILE_SIZE_2BPP * 462}, // blinker - {2, 2, 56, 0, 10, TILE_SIZE_2BPP * 476}, // cross-eyed - {1, 1, 60, 0, 14, TILE_SIZE_2BPP * 516}, // eyedrops - {2, 2, 61, 0, 8, TILE_SIZE_2BPP * 530}, // muzzled - {2, 2, 65, 4, 10, TILE_SIZE_2BPP * 562}, // sleep +static const struct StatusGraphicsInfo sStatusGfxInfo[] = { + [STATUS_GFX_NONE] = {0, 0, 0, 0, 0, 0}, + [STATUS_GFX_SLEEPLESS] = {1, 1, 0, 0, 14, TILE_SIZE_2BPP * 0 }, + [STATUS_GFX_BURNED] = {2, 2, 1, 0, 7, TILE_SIZE_2BPP * 14 }, + [STATUS_GFX_POISONED] = {2, 2, 5, 0, 16, TILE_SIZE_2BPP * 42 }, + [STATUS_GFX_FROZEN] = {4, 4, 9, 0, 6, TILE_SIZE_2BPP * 106}, + [STATUS_GFX_CONFUSED] = {4, 2, 25, 0, 4, TILE_SIZE_2BPP * 202}, + [STATUS_GFX_WHIFFER] = {2, 2, 33, 0, 9, TILE_SIZE_2BPP * 234}, + [STATUS_GFX_TAUNTED] = {2, 2, 37, 0, 8, TILE_SIZE_2BPP * 270}, + [STATUS_GFX_LOWHP] = {1, 2, 41, 0, 8, TILE_SIZE_2BPP * 302}, + [STATUS_GFX_SHIELD] = {2, 2, 43, 0, 13, TILE_SIZE_2BPP * 318}, + [STATUS_GFX_STATDOWN] = {2, 2, 47, 10, 10, TILE_SIZE_2BPP * 370}, + [STATUS_GFX_SWORD] = {2, 2, 51, 0, 13, TILE_SIZE_2BPP * 410}, + [STATUS_GFX_BLINKER] = {1, 1, 55, 0, 14, TILE_SIZE_2BPP * 462}, + [STATUS_GFX_CROSS_EYED] = {2, 2, 56, 0, 10, TILE_SIZE_2BPP * 476}, + [STATUS_GFX_EYEDROPS] = {1, 1, 60, 0, 14, TILE_SIZE_2BPP * 516}, + [STATUS_GFX_MUZZLED] = {2, 2, 61, 0, 8, TILE_SIZE_2BPP * 530}, + [STATUS_GFX_SLEEP] = {2, 2, 65, 4, 10, TILE_SIZE_2BPP * 562}, }; static const u8 sStatusGfx[] = INCBIN_U8("graphics/status/sleepless.4bpp", @@ -95,45 +115,46 @@ static const u8 sStatusGfx[] = INCBIN_U8("graphics/status/sleepless.4bpp", struct StatusSprite { - u32 image; + u32 gfxIndex; u32 palIndex; }; +// + 1 because of how StatusSymbolBitToIndex operates static const struct StatusSprite sStatusSpritesInfo[] = { - [0] = {0, 0}, - [1] = {1, 0}, - [2] = {2, 0}, - [3] = {3, 11}, - [4] = {3, 7}, - [5] = {5, 0}, - [6] = {6, 0}, - [7] = {7, 0}, - [8] = {8, 0}, - [9] = {9, 0}, - [10] = {9, 4}, - [11] = {9, 3}, - [12] = {9, 10}, - [13] = {9, 5}, - [14] = {8, 0}, - [15] = {3, 6}, - [16] = {8, 3}, - [17] = {11, 0}, - [18] = {6, 10}, - [19] = {11, 5}, - [20] = {11, 4}, - [21] = {12, 0}, - [22] = {13, 0}, - [23] = {14, 0}, - [24] = {15, 0}, - [25] = {9, 7}, - [26] = {14, 4}, - [27] = {16, 4}, - [28] = {10, 3}, - [29] = {4, 0}, + [0] = {STATUS_GFX_NONE, 0}, + [STATUS_SPRITE_ID_SLEEPLESS + 1] = {STATUS_GFX_SLEEPLESS, 0}, + [STATUS_SPRITE_ID_BURNED + 1] = {STATUS_GFX_BURNED, 0}, + [STATUS_SPRITE_ID_POISONED + 1] = {STATUS_GFX_POISONED, 11}, + [STATUS_SPRITE_ID_BADLY_POISONED + 1] = {STATUS_GFX_POISONED, 7}, + [STATUS_SPRITE_ID_CONFUSED + 1] = {STATUS_GFX_CONFUSED, 0}, + [STATUS_SPRITE_ID_COWERING + 1] = {STATUS_GFX_WHIFFER, 0}, + [STATUS_SPRITE_ID_TAUNTED + 1] = {STATUS_GFX_TAUNTED, 0}, + [STATUS_SPRITE_ID_ENCORE + 1] = {STATUS_GFX_LOWHP, 0}, + [STATUS_SPRITE_ID_SHIELD_BLUE + 1] = {STATUS_GFX_SHIELD, 0}, + [STATUS_SPRITE_ID_SHIELD_RED + 1] = {STATUS_GFX_SHIELD, 4}, + [STATUS_SPRITE_ID_SHIELD_YELLOW + 1] = {STATUS_GFX_SHIELD, 3}, + [STATUS_SPRITE_ID_SHIELD_GREEN + 1] = {STATUS_GFX_SHIELD, 10}, + [STATUS_SPRITE_ID_ENDURE + 1] = {STATUS_GFX_SHIELD, 5}, + [STATUS_SPRITE_ID_LOWHP + 1] = {STATUS_GFX_LOWHP, 0}, + [STATUS_SPRITE_ID_CURSED + 1] = {STATUS_GFX_POISONED, 6}, + [STATUS_SPRITE_ID_SNATCH + 1] = {STATUS_GFX_LOWHP, 3}, + [STATUS_SPRITE_ID_SURE_SHOT + 1] = {STATUS_GFX_SWORD, 0}, + [STATUS_SPRITE_ID_WHIFFER + 1] = {STATUS_GFX_WHIFFER, 10}, + [STATUS_SPRITE_ID_SET_DAMAGE + 1] = {STATUS_GFX_SWORD, 5}, + [STATUS_SPRITE_ID_FOCUS_ENERGY + 1] = {STATUS_GFX_SWORD, 4}, + [STATUS_SPRITE_ID_BLINKER + 1] = {STATUS_GFX_BLINKER, 0}, + [STATUS_SPRITE_ID_CROSS_EYED + 1] = {STATUS_GFX_CROSS_EYED, 0}, + [STATUS_SPRITE_ID_EYEDROPS + 1] = {STATUS_GFX_EYEDROPS, 0}, + [STATUS_SPRITE_ID_MUZZLED + 1] = {STATUS_GFX_MUZZLED, 0}, + [STATUS_SPRITE_ID_GRUDGE + 1] = {STATUS_GFX_SHIELD, 7}, + [STATUS_SPRITE_ID_EXPOSED + 1] = {STATUS_GFX_EYEDROPS, 4}, + [STATUS_SPRITE_ID_SLEEP + 1] = {STATUS_GFX_SLEEP, 4}, + [STATUS_SPRITE_ID_STAT_DOWN + 1] = {STATUS_GFX_STATDOWN, 3}, + [STATUS_SPRITE_ID_FROZEN + 1] = {STATUS_GFX_FROZEN, 0}, }; -EWRAM_INIT DungeonPokemonSprites *gDungeonPokemonSprites = NULL; -EWRAM_INIT SpriteOAM sStatusSpriteOAM = {0}; +static EWRAM_INIT DungeonPokemonSprites *sDungeonPokemonSprites = NULL; +static EWRAM_INIT SpriteOAM sStatusSpriteOAM = {0}; static void DrawStatusSprite(s16 param_1,s32 status,DungeonPos *pos,DungeonPos *posOffset, DungeonPos *posScreen,u32 priority, u32 unused); @@ -141,9 +162,9 @@ static DungeonPokemonSprite *GetSpriteById(s32 id) { s32 i; - for (i = 0; i < MAX_DUNGEON_SPRITES; i++) { - if (gDungeonPokemonSprites->sprites[i].exists && gDungeonPokemonSprites->sprites[i].id == id) { - return &gDungeonPokemonSprites->sprites[i]; + for (i = 0; i < MAX_DUNGEON_POKEMON_SPRITES; i++) { + if (sDungeonPokemonSprites->sprites[i].exists && sDungeonPokemonSprites->sprites[i].id == id) { + return &sDungeonPokemonSprites->sprites[i]; } } @@ -154,9 +175,9 @@ static DungeonPokemonSprite *GetFirstFreeSlot(void) { s32 i; - for (i = 0; i < MAX_DUNGEON_SPRITES; i++) { - if (!gDungeonPokemonSprites->sprites[i].exists) { - return &gDungeonPokemonSprites->sprites[i]; + for (i = 0; i < MAX_DUNGEON_POKEMON_SPRITES; i++) { + if (!sDungeonPokemonSprites->sprites[i].exists) { + return &sDungeonPokemonSprites->sprites[i]; } } return NULL; @@ -164,45 +185,44 @@ static DungeonPokemonSprite *GetFirstFreeSlot(void) static u32 GetNextStatusSymbol(DungeonPokemonSprite *sprite, s32 statusIndex) { - u32 uVar1; + u32 bits; u32 status; - s32 counter; - s32 max; - u32 uVar5; - u32 uVar6; + s32 i; + s32 n; + u32 lastBit; + u32 secondLastBit; DungeonPokemonStatusSprite *statusSprite; statusSprite = &sprite->statusSprites[statusIndex]; - uVar5 = 0x10000000; + lastBit = (1 << STATUS_SPRITE_ID_LAST); if (statusIndex == 0) { - uVar5 = 1; + lastBit = 1; } - uVar6 = 0x10000000; + secondLastBit = (1 << STATUS_SPRITE_ID_LAST); if (statusIndex == 0) { - uVar6 = 0x8000000; + secondLastBit = (1 << (STATUS_SPRITE_ID_LAST - 1)); } - max = 1; + n = 1; if (statusIndex == 0) { - max = 0x1c; + n = STATUS_SPRITE_ID_LAST; } if (sprite->status == 0) { return 0; } status = statusSprite->status; - uVar1 = uVar5; + bits = lastBit; if (status != 0) { - uVar1 = status; + bits = status; } - for(counter = 0; counter < max; counter++) - { - uVar1 *= 2; - if (uVar1 > uVar6) { - uVar1 = uVar5; + for (i = 0; i < n; i++) { + bits <<= 1; + if (bits > secondLastBit) { + bits = lastBit; } - if ((sprite->status & uVar1) != 0) { - return uVar1; + if (sprite->status & bits) { + return bits; } } return 0; @@ -210,14 +230,12 @@ static u32 GetNextStatusSymbol(DungeonPokemonSprite *sprite, s32 statusIndex) static u32 StatusSymbolBitToIndex(u32 statusBit) { - u32 index; - - index = 0; - while (statusBit != 0) { - statusBit >>= 1; - index++; - } - return index; + u32 index = 0; + while (statusBit != 0) { + statusBit >>= 1; + index++; + } + return index; } static void UpdateStatusSprite(DungeonPokemonSprite *sprite, s32 index, DungeonPos *screenPos) @@ -251,66 +269,63 @@ static void UpdateStatusSprite(DungeonPokemonSprite *sprite, s32 index, DungeonP } } +#define STATUS_GFX_VRAM_INDEX 0x32B + static void DrawStatusSprite(s16 species, s32 status, DungeonPos *pos, DungeonPos *posOffset, DungeonPos *posScreen, u32 priority, u32 unused) { - struct StatusSprite spriteInfo; - s32 posY; - s32 posX; - u32 uVar7; - s32 vramIndex; - const struct StatusGraphicsInfo *ptr; + s32 posX, posY; + s32 ySubbed; + struct StatusSprite spriteInfo = sStatusSpritesInfo[status]; + const struct StatusGraphicsInfo *gfxInfo = &sStatusGfxInfo[spriteInfo.gfxIndex]; + s32 vramIndex = (gfxInfo->vramIndex + STATUS_GFX_VRAM_INDEX); - spriteInfo = sStatusSpritesInfo[status]; - ptr = &gStatusGraphics[spriteInfo.image]; - vramIndex = (ptr->vramIndex + 0x32b); SpriteSetPriority(&sStatusSpriteOAM, priority); - - posX = (pos->x - ptr->width * 4 - posScreen->x) + posOffset->x; - posY = (pos->y - ptr->height * 4 - posScreen->y) + posOffset->y; - uVar7 = posY - 16; - if ((((-0x20 <= posX) && (-0x20 <= posY)) && (posX < 0xf0)) && (posY < 0xa0)) { - switch(spriteInfo.image) { - case 1: - case 0xc: - case 0xe: + posX = (pos->x - gfxInfo->width * 4 - posScreen->x) + posOffset->x; + posY = (pos->y - gfxInfo->height * 4 - posScreen->y) + posOffset->y; + ySubbed = posY - 16; + if (posX >= -32 && posY >= -32 && posX < 240 && posY < 160) { + switch (spriteInfo.gfxIndex) { + case STATUS_GFX_SLEEPLESS: + case STATUS_GFX_BLINKER: + case STATUS_GFX_EYEDROPS: SpriteSetShape(&sStatusSpriteOAM, 0); SpriteSetSize(&sStatusSpriteOAM, 0); SpriteSetX(&sStatusSpriteOAM, posX); - SpriteSetY(&sStatusSpriteOAM, uVar7); + SpriteSetY(&sStatusSpriteOAM, ySubbed); break; - case 8: + case STATUS_GFX_LOWHP: SpriteSetShape(&sStatusSpriteOAM, 2); SpriteSetSize(&sStatusSpriteOAM, 0); SpriteSetX(&sStatusSpriteOAM, posX); - SpriteSetY(&sStatusSpriteOAM, uVar7); + SpriteSetY(&sStatusSpriteOAM, ySubbed); break; - case 2: - case 3: - case 6: - case 7: - case 9: - case 10: - case 11: - case 13: - case 15: + case STATUS_GFX_BURNED: + case STATUS_GFX_POISONED: + case STATUS_GFX_WHIFFER: + case STATUS_GFX_TAUNTED: + case STATUS_GFX_SHIELD: + case STATUS_GFX_STATDOWN: + case STATUS_GFX_SWORD: + case STATUS_GFX_CROSS_EYED: + case STATUS_GFX_MUZZLED: SpriteSetShape(&sStatusSpriteOAM, 0); SpriteSetSize(&sStatusSpriteOAM, 1); SpriteSetX(&sStatusSpriteOAM, posX); - SpriteSetY(&sStatusSpriteOAM, uVar7); + SpriteSetY(&sStatusSpriteOAM, ySubbed); break; - case 0x10: + case STATUS_GFX_SLEEP: SpriteSetShape(&sStatusSpriteOAM, 0); SpriteSetSize(&sStatusSpriteOAM, 1); SpriteSetX(&sStatusSpriteOAM, posX + 8); - SpriteSetY(&sStatusSpriteOAM, uVar7); + SpriteSetY(&sStatusSpriteOAM, ySubbed); break; - case 5: + case STATUS_GFX_CONFUSED: SpriteSetShape(&sStatusSpriteOAM, 1); SpriteSetSize(&sStatusSpriteOAM, 2); SpriteSetX(&sStatusSpriteOAM, posX); - SpriteSetY(&sStatusSpriteOAM, uVar7); + SpriteSetY(&sStatusSpriteOAM, ySubbed); break; - case 4: + case STATUS_GFX_FROZEN: SpriteSetShape(&sStatusSpriteOAM, 0); SpriteSetSize(&sStatusSpriteOAM, 2); SpriteSetX(&sStatusSpriteOAM, posX); @@ -325,12 +340,12 @@ static void DrawStatusSprite(s16 species, s32 status, DungeonPos *pos, DungeonPo static void LoadStatusGraphics(s32 graphicIndex, bool8 queueLoad) { - const struct StatusGraphicsInfo *graphic = &gStatusGraphics[graphicIndex]; - s32 offset = graphic->offsetIntoGraphic; - s32 graphicsCount = graphic->graphicsCount; - s32 size = graphic->width * graphic->height * 0x20; - s32 vramIndex = (graphic->vramIndex + 0x32b) * 0x20; - s32 frame = (gDungeonPokemonSprites->frame / 4) % graphicsCount; + const struct StatusGraphicsInfo *gfxInfo = &sStatusGfxInfo[graphicIndex]; + s32 offset = gfxInfo->offsetIntoGraphic; + s32 graphicsCount = gfxInfo->graphicsCount; + s32 size = gfxInfo->width * gfxInfo->height * 32; + s32 vramIndex = (gfxInfo->vramIndex + STATUS_GFX_VRAM_INDEX) * 32; + s32 frame = (sDungeonPokemonSprites->frame / 4) % graphicsCount; const u8 *ptr = sStatusGfx + offset + (frame * size); if (queueLoad) { @@ -343,32 +358,32 @@ static void LoadStatusGraphics(s32 graphicIndex, bool8 queueLoad) void InitDungeonPokemonSprites(void) { - if (gDungeonPokemonSprites == NULL) { - gDungeonPokemonSprites = MemoryAlloc(sizeof(DungeonPokemonSprites),0xc); - MemoryClear8(gDungeonPokemonSprites,sizeof(DungeonPokemonSprites)); + if (sDungeonPokemonSprites == NULL) { + sDungeonPokemonSprites = MemoryAlloc(sizeof(DungeonPokemonSprites),12); + MemoryClear8(sDungeonPokemonSprites,sizeof(DungeonPokemonSprites)); } - gDungeonPokemonSprites->frame = 0; - LoadStatusGraphics(1,FALSE); - LoadStatusGraphics(2,FALSE); - LoadStatusGraphics(3,FALSE); - LoadStatusGraphics(4,FALSE); - LoadStatusGraphics(5,FALSE); - LoadStatusGraphics(6,FALSE); - LoadStatusGraphics(7,FALSE); - LoadStatusGraphics(8,FALSE); - LoadStatusGraphics(9,FALSE); - LoadStatusGraphics(10,FALSE); - LoadStatusGraphics(0xb,FALSE); - LoadStatusGraphics(0xc,FALSE); - LoadStatusGraphics(0xd,FALSE); - LoadStatusGraphics(0xe,FALSE); - LoadStatusGraphics(0xf,FALSE); - LoadStatusGraphics(0x10,FALSE); + sDungeonPokemonSprites->frame = 0; + LoadStatusGraphics(STATUS_GFX_SLEEPLESS,FALSE); + LoadStatusGraphics(STATUS_GFX_BURNED,FALSE); + LoadStatusGraphics(STATUS_GFX_POISONED,FALSE); + LoadStatusGraphics(STATUS_GFX_FROZEN,FALSE); + LoadStatusGraphics(STATUS_GFX_CONFUSED,FALSE); + LoadStatusGraphics(STATUS_GFX_WHIFFER,FALSE); + LoadStatusGraphics(STATUS_GFX_TAUNTED,FALSE); + LoadStatusGraphics(STATUS_GFX_LOWHP,FALSE); + LoadStatusGraphics(STATUS_GFX_SHIELD,FALSE); + LoadStatusGraphics(STATUS_GFX_STATDOWN,FALSE); + LoadStatusGraphics(STATUS_GFX_SWORD,FALSE); + LoadStatusGraphics(STATUS_GFX_BLINKER,FALSE); + LoadStatusGraphics(STATUS_GFX_CROSS_EYED,FALSE); + LoadStatusGraphics(STATUS_GFX_EYEDROPS,FALSE); + LoadStatusGraphics(STATUS_GFX_MUZZLED,FALSE); + LoadStatusGraphics(STATUS_GFX_SLEEP,FALSE); } void FreeDungeonPokemonSprites(void) { - TRY_FREE_AND_SET_NULL(gDungeonPokemonSprites); + TRY_FREE_AND_SET_NULL(sDungeonPokemonSprites); } void UpdateDungeonPokemonSprite(s32 dungeonSpriteId, s32 species_, s32 status, u32 visible_) @@ -376,7 +391,7 @@ void UpdateDungeonPokemonSprite(s32 dungeonSpriteId, s32 species_, s32 status, u s32 species = (s16) species_; u32 visible = (u8) visible_; - if (gDungeonPokemonSprites != NULL) { + if (sDungeonPokemonSprites != NULL) { DungeonPokemonSprite *sprite = GetSpriteById(dungeonSpriteId); if (sprite != NULL) { sprite->species = species; @@ -387,16 +402,16 @@ void UpdateDungeonPokemonSprite(s32 dungeonSpriteId, s32 species_, s32 status, u } } -UNUSED static void sub_800F794(s32 id, s32 r1, s32 r2, s32 r3, s32 *r4) +UNUSED static void sub_800F794(s32 id, s32 r1, s32 r2, s32 r3, DungeonPos *statusOffsets) { - if (gDungeonPokemonSprites != NULL) { + if (sDungeonPokemonSprites != NULL) { DungeonPokemonSprite *sprite = GetSpriteById(id); if (sprite != NULL) { sprite->unk38 = 1; sprite->unk3C = r2; sprite->unk3E = r3; - sprite->unk20 = r4[0]; - sprite->unk24 = r4[3]; + sprite->unk20[0] = statusOffsets[0]; + sprite->unk20[1] = statusOffsets[3]; } } } @@ -405,44 +420,44 @@ void FrameUpdateDungeonStatusSprites(DungeonPos *screenPos) { s32 i; - if (gDungeonPokemonSprites == NULL) + if (sDungeonPokemonSprites == NULL) return; - switch (gDungeonPokemonSprites->frame % 4) { + switch (sDungeonPokemonSprites->frame % 4) { case 0: - LoadStatusGraphics(1, TRUE); - LoadStatusGraphics(2, TRUE); - LoadStatusGraphics(3, TRUE); - LoadStatusGraphics(4, TRUE); + LoadStatusGraphics(STATUS_GFX_SLEEPLESS, TRUE); + LoadStatusGraphics(STATUS_GFX_BURNED, TRUE); + LoadStatusGraphics(STATUS_GFX_POISONED, TRUE); + LoadStatusGraphics(STATUS_GFX_FROZEN, TRUE); break; case 1: - LoadStatusGraphics(5, TRUE); - LoadStatusGraphics(6, TRUE); - LoadStatusGraphics(7, TRUE); - LoadStatusGraphics(8, TRUE); + LoadStatusGraphics(STATUS_GFX_CONFUSED, TRUE); + LoadStatusGraphics(STATUS_GFX_WHIFFER, TRUE); + LoadStatusGraphics(STATUS_GFX_TAUNTED, TRUE); + LoadStatusGraphics(STATUS_GFX_LOWHP, TRUE); break; case 2: - LoadStatusGraphics(9, TRUE); - LoadStatusGraphics(0xA, TRUE); - LoadStatusGraphics(0xB, TRUE); - LoadStatusGraphics(0xC, TRUE); + LoadStatusGraphics(STATUS_GFX_SHIELD, TRUE); + LoadStatusGraphics(STATUS_GFX_STATDOWN, TRUE); + LoadStatusGraphics(STATUS_GFX_SWORD, TRUE); + LoadStatusGraphics(STATUS_GFX_BLINKER, TRUE); break; case 3: - LoadStatusGraphics(0xD, TRUE); - LoadStatusGraphics(0xE, TRUE); - LoadStatusGraphics(0xF, TRUE); - LoadStatusGraphics(0x10, TRUE); + LoadStatusGraphics(STATUS_GFX_CROSS_EYED, TRUE); + LoadStatusGraphics(STATUS_GFX_EYEDROPS, TRUE); + LoadStatusGraphics(STATUS_GFX_MUZZLED, TRUE); + LoadStatusGraphics(STATUS_GFX_SLEEP, TRUE); break; } - for (i = 0; i < MAX_DUNGEON_SPRITES; i++) { - if (gDungeonPokemonSprites->sprites[i].exists) { - DungeonPokemonSprite *spritePtr = &gDungeonPokemonSprites->sprites[i]; + for (i = 0; i < MAX_DUNGEON_POKEMON_SPRITES; i++) { + if (sDungeonPokemonSprites->sprites[i].exists) { + DungeonPokemonSprite *spritePtr = &sDungeonPokemonSprites->sprites[i]; UpdateStatusSprite(spritePtr, 0, screenPos); UpdateStatusSprite(spritePtr, 1, screenPos); } } - gDungeonPokemonSprites->frame++; + sDungeonPokemonSprites->frame++; } void AddPokemonDungeonSprite(s32 dungeonSpriteId, s32 species_, DungeonPos *pos, u32 priority) @@ -451,7 +466,7 @@ void AddPokemonDungeonSprite(s32 dungeonSpriteId, s32 species_, DungeonPos *pos, DungeonPokemonSprite *newSprite; s32 species = (s16) species_; - if (gDungeonPokemonSprites == NULL) + if (sDungeonPokemonSprites == NULL) return; if (GetSpriteById(dungeonSpriteId) != NULL) return; @@ -477,7 +492,7 @@ void DeletePokemonDungeonSprite(s32 dungeonSpriteId) { DungeonPokemonSprite *dSprite; - if (gDungeonPokemonSprites == NULL) + if (sDungeonPokemonSprites == NULL) return; dSprite = GetSpriteById(dungeonSpriteId); @@ -489,7 +504,7 @@ void DeletePokemonDungeonSprite(s32 dungeonSpriteId) void UpdateDungeonPokemonSprite2(s32 dungeonSpriteId, DungeonPos *pos, DungeonPos *statusOffsets, u32 priority) { - if (gDungeonPokemonSprites != NULL) { + if (sDungeonPokemonSprites != NULL) { DungeonPokemonSprite *sprite = GetSpriteById(dungeonSpriteId); if (sprite != NULL) { sprite->pos = *pos;