From 27b2b0b24a91c4cf6f7c30d7d7e219e36b6017af Mon Sep 17 00:00:00 2001 From: GriffinR Date: Tue, 6 Sep 2022 19:13:57 -0400 Subject: [PATCH 1/2] Document intro graphics/data --- .../intro/{unk_84024E4.bin => copyright.bin} | Bin .../intro/{unk_8402260.pal => copyright.pal} | 0 graphics/intro/copyright.png | Bin 0 -> 546 bytes .../{unk_8402668.bin => game_freak/bg.bin} | Bin .../{unk_8402630.pal => game_freak/bg.pal} | 0 .../{unk_8402650.png => game_freak/bg.png} | Bin .../game_freak.png} | Bin .../{unk_84028F8.png => game_freak/logo.png} | Bin .../presents.png} | Bin graphics/intro/game_freak/sparkles.pal | 19 + .../sparkles_big.png} | Bin .../sparkles_small.png} | Bin .../{unk_8402A64.png => game_freak/star.png} | Bin .../intro/{unk_8405DA4.pal => gengar.pal} | 0 .../intro/{unk_84096AC.pal => nidorino.pal} | 0 .../intro/{unk_8404F7C.bin => scene_1/bg.bin} | Bin .../intro/{unk_84048EC.png => scene_1/bg.png} | Bin .../{unk_8403FE8.bin => scene_1/grass.bin} | Bin .../{unk_8402D54.png => scene_1/grass.png} | Bin .../intro/{unk_8405890.bin => scene_2/bg.bin} | Bin .../intro/{unk_84053B4.pal => scene_2/bg.pal} | 0 .../intro/{unk_8405414.png => scene_2/bg.png} | Bin .../{unk_840926C.png => scene_2/gengar.png} | Bin .../gengar_close.bin} | Bin graphics/intro/scene_2/gengar_close.png | Bin 0 -> 1346 bytes .../{unk_84096CC.png => scene_2/nidorino.png} | Bin .../nidorino_close.bin} | Bin .../nidorino_close.pal} | 0 .../nidorino_close.png} | Bin .../{unk_8405CDC.bin => scene_2/plants.bin} | Bin .../{unk_8405B28.png => scene_2/plants.png} | Bin .../intro/{unk_8407A50.bin => scene_3/bg.bin} | Bin .../intro/{unk_8407430.pal => scene_3/bg.pal} | 0 .../intro/{unk_8407470.png => scene_3/bg.png} | Bin .../gengar_anim.bin} | Bin graphics/intro/scene_3/gengar_anim.png | Bin 0 -> 3394 bytes .../gengar_static.png} | Bin .../{unk_8409A3C.png => scene_3/grass.png} | Bin .../{unk_840A3E4.png => scene_3/nidorino.png} | Bin .../recoil_dust.png} | Bin .../{unk_840B874.png => scene_3/swipe.png} | Bin graphics/intro/unk_8402280.png | Bin 554 -> 0 bytes graphics/intro/unk_840270C.pal | 19 - graphics/intro/unk_8402D34.pal | 19 - graphics/intro/unk_84048CC.pal | 19 - graphics/intro/unk_8405B08.pal | 19 - graphics/intro/unk_8405DC4.png | Bin 1408 -> 0 bytes graphics/intro/unk_8407B9C.png | Bin 3631 -> 0 bytes graphics/intro/unk_8409A1C.pal | 19 - graphics/intro/unk_840B834.pal | 19 - graphics/intro/unk_840B854.pal | 19 - graphics_file_rules.mk | 14 +- include/intro.h | 4 +- include/random.h | 5 +- src/intro.c | 874 +++++++++--------- src/main.c | 2 +- src/pokemon_special_anim_scene.c | 6 +- src/title_screen.c | 5 +- src/wild_encounter.c | 4 +- 59 files changed, 498 insertions(+), 568 deletions(-) rename graphics/intro/{unk_84024E4.bin => copyright.bin} (100%) rename graphics/intro/{unk_8402260.pal => copyright.pal} (100%) create mode 100644 graphics/intro/copyright.png rename graphics/intro/{unk_8402668.bin => game_freak/bg.bin} (100%) rename graphics/intro/{unk_8402630.pal => game_freak/bg.pal} (100%) rename graphics/intro/{unk_8402650.png => game_freak/bg.png} (100%) rename graphics/intro/{unk_840272C.png => game_freak/game_freak.png} (100%) rename graphics/intro/{unk_84028F8.png => game_freak/logo.png} (100%) rename graphics/intro/{unk_8402CD4.png => game_freak/presents.png} (100%) create mode 100644 graphics/intro/game_freak/sparkles.pal rename graphics/intro/{unk_8402B2C.png => game_freak/sparkles_big.png} (100%) rename graphics/intro/{unk_8402ADC.png => game_freak/sparkles_small.png} (100%) rename graphics/intro/{unk_8402A64.png => game_freak/star.png} (100%) rename graphics/intro/{unk_8405DA4.pal => gengar.pal} (100%) rename graphics/intro/{unk_84096AC.pal => nidorino.pal} (100%) rename graphics/intro/{unk_8404F7C.bin => scene_1/bg.bin} (100%) rename graphics/intro/{unk_84048EC.png => scene_1/bg.png} (100%) rename graphics/intro/{unk_8403FE8.bin => scene_1/grass.bin} (100%) rename graphics/intro/{unk_8402D54.png => scene_1/grass.png} (100%) rename graphics/intro/{unk_8405890.bin => scene_2/bg.bin} (100%) rename graphics/intro/{unk_84053B4.pal => scene_2/bg.pal} (100%) rename graphics/intro/{unk_8405414.png => scene_2/bg.png} (100%) rename graphics/intro/{unk_840926C.png => scene_2/gengar.png} (100%) rename graphics/intro/{unk_840644C.bin => scene_2/gengar_close.bin} (100%) create mode 100644 graphics/intro/scene_2/gengar_close.png rename graphics/intro/{unk_84096CC.png => scene_2/nidorino.png} (100%) rename graphics/intro/{unk_84071D0.bin => scene_2/nidorino_close.bin} (100%) rename graphics/intro/{unk_8406634.pal => scene_2/nidorino_close.pal} (100%) rename graphics/intro/{unk_8406654.png => scene_2/nidorino_close.png} (100%) rename graphics/intro/{unk_8405CDC.bin => scene_2/plants.bin} (100%) rename graphics/intro/{unk_8405B28.png => scene_2/plants.png} (100%) rename graphics/intro/{unk_8407A50.bin => scene_3/bg.bin} (100%) rename graphics/intro/{unk_8407430.pal => scene_3/bg.pal} (100%) rename graphics/intro/{unk_8407470.png => scene_3/bg.png} (100%) rename graphics/intro/{unk_8408D98.bin => scene_3/gengar_anim.bin} (100%) create mode 100644 graphics/intro/scene_3/gengar_anim.png rename graphics/intro/{unk_8409D20.png => scene_3/gengar_static.png} (100%) rename graphics/intro/{unk_8409A3C.png => scene_3/grass.png} (100%) rename graphics/intro/{unk_840A3E4.png => scene_3/nidorino.png} (100%) rename graphics/intro/{unk_840BAE0.png => scene_3/recoil_dust.png} (100%) rename graphics/intro/{unk_840B874.png => scene_3/swipe.png} (100%) delete mode 100644 graphics/intro/unk_8402280.png delete mode 100644 graphics/intro/unk_840270C.pal delete mode 100644 graphics/intro/unk_8402D34.pal delete mode 100644 graphics/intro/unk_84048CC.pal delete mode 100644 graphics/intro/unk_8405B08.pal delete mode 100644 graphics/intro/unk_8405DC4.png delete mode 100644 graphics/intro/unk_8407B9C.png delete mode 100644 graphics/intro/unk_8409A1C.pal delete mode 100644 graphics/intro/unk_840B834.pal delete mode 100644 graphics/intro/unk_840B854.pal diff --git a/graphics/intro/unk_84024E4.bin b/graphics/intro/copyright.bin similarity index 100% rename from graphics/intro/unk_84024E4.bin rename to graphics/intro/copyright.bin diff --git a/graphics/intro/unk_8402260.pal b/graphics/intro/copyright.pal similarity index 100% rename from graphics/intro/unk_8402260.pal rename to graphics/intro/copyright.pal diff --git a/graphics/intro/copyright.png b/graphics/intro/copyright.png new file mode 100644 index 0000000000000000000000000000000000000000..ff320806ecad3497121415e70a08d7b52f3d641a GIT binary patch literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^89*$-!VDyz2rLZ-QU(D&A+A6g9VjSBSXvqe1qEeg zWi>Z<&zZAi%a)^O&)$3X?EnA&8ozsm7#JAWdb&7X-NX=YN|vZ;c@9!%fRJ7%?)izf_)NXX+%+c`#d~*kuxThi?1rH}lfi>#jYi?(DKU zwbY`%N9pCAmGjHgKBR5rw*Kk8cG1nJ2CZGzPxdRUE!v@7)D&RW?OwQBlf3Xtb zyjplkY0~GQM3TV_Il-##HIA_ww2mJhl^lo>BUIW8vbM2Rn{Tp0L-ki_g$k zMN1?3khpl?^%|E$^~Y>N3lo2>JKmnN?}!(Z(A>1t>`N;orlyt`m^|`2p!t2D-^-6_ z+bShgS*m2XRiABkZRnV?J^S*>wm^qTo+(SZMASCxv<4hrRD7>3aO26fRc=|aE8Cwv iO|J?J{`}=)+ePyo6~~ul_^z}C#k8lZpUXO@geCwDknK?b literal 0 HcmV?d00001 diff --git a/graphics/intro/unk_8402668.bin b/graphics/intro/game_freak/bg.bin similarity index 100% rename from graphics/intro/unk_8402668.bin rename to graphics/intro/game_freak/bg.bin diff --git a/graphics/intro/unk_8402630.pal b/graphics/intro/game_freak/bg.pal similarity index 100% rename from graphics/intro/unk_8402630.pal rename to graphics/intro/game_freak/bg.pal diff --git a/graphics/intro/unk_8402650.png b/graphics/intro/game_freak/bg.png similarity index 100% rename from graphics/intro/unk_8402650.png rename to graphics/intro/game_freak/bg.png diff --git a/graphics/intro/unk_840272C.png b/graphics/intro/game_freak/game_freak.png similarity index 100% rename from graphics/intro/unk_840272C.png rename to graphics/intro/game_freak/game_freak.png diff --git a/graphics/intro/unk_84028F8.png b/graphics/intro/game_freak/logo.png similarity index 100% rename from graphics/intro/unk_84028F8.png rename to graphics/intro/game_freak/logo.png diff --git a/graphics/intro/unk_8402CD4.png b/graphics/intro/game_freak/presents.png similarity index 100% rename from graphics/intro/unk_8402CD4.png rename to graphics/intro/game_freak/presents.png diff --git a/graphics/intro/game_freak/sparkles.pal b/graphics/intro/game_freak/sparkles.pal new file mode 100644 index 000000000..ace266f9b --- /dev/null +++ b/graphics/intro/game_freak/sparkles.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +0 0 0 +0 0 32 +0 0 74 +0 0 115 +24 24 123 +49 49 139 +82 82 156 +106 106 172 +139 139 189 +164 164 205 +197 197 222 +222 222 238 +255 255 255 +0 0 0 +0 0 0 diff --git a/graphics/intro/unk_8402B2C.png b/graphics/intro/game_freak/sparkles_big.png similarity index 100% rename from graphics/intro/unk_8402B2C.png rename to graphics/intro/game_freak/sparkles_big.png diff --git a/graphics/intro/unk_8402ADC.png b/graphics/intro/game_freak/sparkles_small.png similarity index 100% rename from graphics/intro/unk_8402ADC.png rename to graphics/intro/game_freak/sparkles_small.png diff --git a/graphics/intro/unk_8402A64.png b/graphics/intro/game_freak/star.png similarity index 100% rename from graphics/intro/unk_8402A64.png rename to graphics/intro/game_freak/star.png diff --git a/graphics/intro/unk_8405DA4.pal b/graphics/intro/gengar.pal similarity index 100% rename from graphics/intro/unk_8405DA4.pal rename to graphics/intro/gengar.pal diff --git a/graphics/intro/unk_84096AC.pal b/graphics/intro/nidorino.pal similarity index 100% rename from graphics/intro/unk_84096AC.pal rename to graphics/intro/nidorino.pal diff --git a/graphics/intro/unk_8404F7C.bin b/graphics/intro/scene_1/bg.bin similarity index 100% rename from graphics/intro/unk_8404F7C.bin rename to graphics/intro/scene_1/bg.bin diff --git a/graphics/intro/unk_84048EC.png b/graphics/intro/scene_1/bg.png similarity index 100% rename from graphics/intro/unk_84048EC.png rename to graphics/intro/scene_1/bg.png diff --git a/graphics/intro/unk_8403FE8.bin b/graphics/intro/scene_1/grass.bin similarity index 100% rename from graphics/intro/unk_8403FE8.bin rename to graphics/intro/scene_1/grass.bin diff --git a/graphics/intro/unk_8402D54.png b/graphics/intro/scene_1/grass.png similarity index 100% rename from graphics/intro/unk_8402D54.png rename to graphics/intro/scene_1/grass.png diff --git a/graphics/intro/unk_8405890.bin b/graphics/intro/scene_2/bg.bin similarity index 100% rename from graphics/intro/unk_8405890.bin rename to graphics/intro/scene_2/bg.bin diff --git a/graphics/intro/unk_84053B4.pal b/graphics/intro/scene_2/bg.pal similarity index 100% rename from graphics/intro/unk_84053B4.pal rename to graphics/intro/scene_2/bg.pal diff --git a/graphics/intro/unk_8405414.png b/graphics/intro/scene_2/bg.png similarity index 100% rename from graphics/intro/unk_8405414.png rename to graphics/intro/scene_2/bg.png diff --git a/graphics/intro/unk_840926C.png b/graphics/intro/scene_2/gengar.png similarity index 100% rename from graphics/intro/unk_840926C.png rename to graphics/intro/scene_2/gengar.png diff --git a/graphics/intro/unk_840644C.bin b/graphics/intro/scene_2/gengar_close.bin similarity index 100% rename from graphics/intro/unk_840644C.bin rename to graphics/intro/scene_2/gengar_close.bin diff --git a/graphics/intro/scene_2/gengar_close.png b/graphics/intro/scene_2/gengar_close.png new file mode 100644 index 0000000000000000000000000000000000000000..9878b9bcacbca7b5aa4965c05ca5cc7f53e805bb GIT binary patch literal 1346 zcmV-I1-<%-P)T z|Nq|J-g|p{{{a900RR60|3N8A|FnDVVoJ?9AjN~Uq+*nVL3>&`S`ZKrlUpOL000Ed zNkl*Nl5QTAqpy(VRW%&RuJKLn@df8?vZ?d*GJ^+>S0SFE<%Ty8K>>~n< zXEhSZPIu#%l3g>)z-5^xKfKosc7v1|@&r1I1w3d|qv(^PFU+DOx zSKP_}X?AL#NLf1qcZG|bYJYI5YvslS{yDBe3H2^SUe`NiIVy~yRy~2P(5qEAZ17Nh zB+&`PNtqEr9nunWgEBrz0+A$pv^=S{N4gy)Cj_L@3OV=Q8)qR2vVH-Dk_b8m;Y62= z07KwXC$gzu4k$^oQjN@^nGwnWXIgu6B1+75qvrF7FYBxnSO81nXDYw450i6l|5Z8Mm?S&jdaKZk6xqL`Wlk{So8 znfA*fOt_^#D6-zEIHIiapiH1Vpk$-o1BK}0tzQ%hW<{03aSftmQz*uPf&@Ya#e7L| zGEB@Oga`o3o1pTbj36yW_qOEdK|H+lY;zmT#-9=gtn5n}m%4HZK4LMQI$VH3t>@auNU5JkD4sXb$@P(3#R{3CJX(;g?< zD#G}OA`gncZJ$d}KTY`_riS-mGOzLHSb|er3bx*|dFPi>KNX-2xKh6v){S$(;-X=U1=y#t>UL7=p*P-o z@6&-%A}P}4f2-TG39n&-go9ie07uvbilm%7{sg zU64A-2xi71(i*2v+x-4I-OO0GYF91%9gT5WKre zAcoj3#0~QpLGsqu3|3bGyhqRwxG?C84i=N8U;TtCPN2u)lG>N{<|uu~d0}P@exRbr zFE@*IHm6mBzaqF71&FZ(QeP(!7qg2Segdrxd9`1z8N4TOPLGfR93lxnNALp)n!Nb~ z*d)nu!aadEv>&&jgy{hQi?ao}+O4r{Xjiokpr>~^X=#OQ9Oi5ay--TuMS+OyutHl7 z(D&uC2D7MX>7C*%Z)?F`kX_f6U?5xuv%M)nnXHYyP%Z9Z^j=8Ema@ZO<721rb}X_l z$vyoiRPJ=n+i_qkkbStq?dL4%!QqT^R`B$=wL?-olUxYg+x*%KA;#fc5J8%o-@yUT z4f}IJN`{5YS8iUA_1e1#X2o=WN)V!=%R%NM@+l+^L3deUu`paQl|gY9QndHrg4Mr( z;Ja9OV8M^kVGJNR5MI%PBW)LB5vK>G53~E$-VGnd9Po7bw4r`hSoA04bqSD*5oKQUCw|07*qoM6N<$ Ef+Q|?W&i*H literal 0 HcmV?d00001 diff --git a/graphics/intro/unk_84096CC.png b/graphics/intro/scene_2/nidorino.png similarity index 100% rename from graphics/intro/unk_84096CC.png rename to graphics/intro/scene_2/nidorino.png diff --git a/graphics/intro/unk_84071D0.bin b/graphics/intro/scene_2/nidorino_close.bin similarity index 100% rename from graphics/intro/unk_84071D0.bin rename to graphics/intro/scene_2/nidorino_close.bin diff --git a/graphics/intro/unk_8406634.pal b/graphics/intro/scene_2/nidorino_close.pal similarity index 100% rename from graphics/intro/unk_8406634.pal rename to graphics/intro/scene_2/nidorino_close.pal diff --git a/graphics/intro/unk_8406654.png b/graphics/intro/scene_2/nidorino_close.png similarity index 100% rename from graphics/intro/unk_8406654.png rename to graphics/intro/scene_2/nidorino_close.png diff --git a/graphics/intro/unk_8405CDC.bin b/graphics/intro/scene_2/plants.bin similarity index 100% rename from graphics/intro/unk_8405CDC.bin rename to graphics/intro/scene_2/plants.bin diff --git a/graphics/intro/unk_8405B28.png b/graphics/intro/scene_2/plants.png similarity index 100% rename from graphics/intro/unk_8405B28.png rename to graphics/intro/scene_2/plants.png diff --git a/graphics/intro/unk_8407A50.bin b/graphics/intro/scene_3/bg.bin similarity index 100% rename from graphics/intro/unk_8407A50.bin rename to graphics/intro/scene_3/bg.bin diff --git a/graphics/intro/unk_8407430.pal b/graphics/intro/scene_3/bg.pal similarity index 100% rename from graphics/intro/unk_8407430.pal rename to graphics/intro/scene_3/bg.pal diff --git a/graphics/intro/unk_8407470.png b/graphics/intro/scene_3/bg.png similarity index 100% rename from graphics/intro/unk_8407470.png rename to graphics/intro/scene_3/bg.png diff --git a/graphics/intro/unk_8408D98.bin b/graphics/intro/scene_3/gengar_anim.bin similarity index 100% rename from graphics/intro/unk_8408D98.bin rename to graphics/intro/scene_3/gengar_anim.bin diff --git a/graphics/intro/scene_3/gengar_anim.png b/graphics/intro/scene_3/gengar_anim.png new file mode 100644 index 0000000000000000000000000000000000000000..d339ca80fde5db865ff18629e29432a22d51212a GIT binary patch literal 3394 zcmV-I4ZZS-P)T z|Nq|J-g|p{{{a900RR60|3N8A|FnDVVoJ?9AjN~Uq+*nVL3>&`S`ZKrlUpOL000cl zNkl1VdgmW7$nx%X z57)W&SkkQlh7tTAW6Zid{J6PwTOMBi2HIc#2J+hvta|yOJ;GH1AG|d3@kOYI3qrjy zr_}uEl&XI`yew?;6`;MpnA00y`?hrg*{*GS{B2(@7NFjouud@3wtM>Zd1zZSWM6vQ zwnu+CVSQo-7*Du^-(bkT_~ii5k1O9_PI%vWdSmiP?Z024ngi73ulQg=GsrMxeRn{! zCxAMHzK-56gkWW46(H|iyB`38UvL-8i5aJ$&bdfWqF-l8V=}AT?*s}pa|*?E9g?79w>Ym zymQAbL-4+z;Hej=GL$0bx<>~{rv_h_9F_qZO>RPWh0PWj8_@yKlJFt^D=jKvJyApf zbl_nZpMQ@()o1V!q~qwN0y(EX4|D)`JaiS*D?`_pDM-hM%1inqeLPO-HVjW;LT(NZ za4yMB@$CJWpc4;EBv*#d_FHylGo>aywA85VCUiuu?OC7>q1X}>J|w0v+JZFtt98&R zV~*_vadPzU6tNs_M;ZM`h>d>gpvG_FCX6XZkW2l4#Gx6zIkn&Xj^ZRV6enzn`-adM zN7DlI{vh#rFW^QmPgMje!4Bq&Cz?)#N{?jwJC z35sB9f+(EFlc5I8?fOfCchUq0)gjckTTmK1fbhCUFW-e`hWs*kw_@O<$n}|qspxN^ zWNI;ysXpds=(SO&JMJ^#Ao#U5#71&j5D3=_YalVQZKLvy`#IuG?T%h*@ zmJcN&_x-11+=2ZXr*F6e{ zrrh1tRP(%uC)Tx8WrT_V8hN1C4~@lU%;IzMy}gCt%?m>i1vH)Afkw-pm7!~dW<7HB zrr||wDA258V6J9Mh)fCyJ5Ejo!5H-XT^&Zgw=HpUp?wJFM?c}Zzs~fq}e7C zx)VYR3GmZi3-Y5Db4t`CmE zLk3OqyM1v~{PZsSzkgYu!-ZkL|T%`5JQFpQy|4$#?~g}l(=wGk96?2KlRodD7$3?kIS*QO7aFRQDSwIm zSK8plT6*V(gPn1fz3Y2>3rT%;4BSEgzS8IB=<}XvDtnV!pQEKPCdj|Na}lx&$6_O2t>`FAu$EtT_bu!)JaH|qJ|Rn zyc1KX#6(?=8OmZRD}Ccdq!p1`X)_Y{CW!tb=syiXLzc?%j1=jVIn`(VI|$5W@xjXAE%3%47u42|INO74nV5X!N! z%!_PP?6M8n3m#?0rK%;1^pWB|H>=*xj0&;^f}P_XOBw=W89O&xS&&*lH;M*87yI1cB)OQbS4h1MNC9$Lq0;B>hUoig-luC0EVRJ|(8!jkBuU*6Xc zYLi#oKPc#s4%IW{P-DC<{%U^6p93D+HDpL6L%E`U>hRH(78Qol`WKu)aKC%w24oRG zaxk)(Z{5|vHlcHGSR3j*9_d&6%BEOwf5FOWzMQ*U3uIqkuIWz=JPn%{c)s`j7b=}E zk_$ia@yoI65hAr^UOYm6LgmyQaK$9(JDo$y@j5_XZR=Q1U0gqZhkYJQq-=iDM z-gkTuf5d$OLJPEP@&b7j#fA<{(}YWU7Amx9VV->d)H#Ggr4$B`B~yWbVi}VEdcZ|N zIAy;-kqiOve^=IiSf1-Ic%(~PH@yD0#gkSlmnj1ipRI%5B(3t4|9ZeRd0CD4_HZC* z=nkUHdRrubo%n41y(8#7|Mg&+WPL)f%;Lqj^pN|0=Wo*YAmEr`Ay z>b64<8ay!z-P%&mcl`MYW6Yp17f4Noe&$xPJf*{7*co z%Mk9p<_@Da3v-I`(j2M`c5t)ogjtv)glg*itPHugF$K@Bm_vnBSvKU{8%VZm z?tEx&d=_2^9he!@H^ztNCL2P?ri0dr=9(e$5s1l#;`2Z7sSSL!kaiDYl#RrYPFF$s z*xvKPIFBO7>CoJSBy#bv*M>0RdW|RRO_CG4XtE(1;sthlxOUdU4cZiwF`P+?0?{F+ zUPuxCH&9VG{~Ku9g0ST{E@_)NS0~5?S|~Wu%s~H)yn7GTaqsG7n-1f(tX@IH6ljA& z#-#)K)P`k+!7g78$Y7+ijv9+D1tq(fG{evzew3p~Ng;x7rjw~5-j48?M4GO91&vuC zDlevoOEz`63yt;ZbcWUk;ue&2R67Lf?E2u^o|~rG#e8N@2C^5E>cnGmpp@pC^@YY4 zediX^Pg7fd2jy&!n+J7<$DJzb3=h6}bHH9_c?h)5cB!*G1X>@k*I6D3T4lS`SsntZ zY!^CQud_VNI@^U0*Xt|~Q?gvR8aZ6AvOG-Aa-sI-!}Ti5!`#bs(ODkmPNqwh_4!0Q|Y$<2Ce6?;P z!^2dWE||m;B>YsChp97N(DS^G>MRelmFYsGq)w4dmFY535(`r*%fsYM7oGtqC1RcB zVREKRNn(lXERXE*oWz3F)ma{1K_f3_^LVPWJQU>9)@UQcLqS*{ESVb_9vb5MrrQh; z)h1esm#qwsHDs2J3=hK-vC4GW$na1C87`ENDcKw}HH1wFo`d?4lR%y2Qma|c#h`OK zo#k>1Sx(l_SuSV~0 z3ul**lS`@~9V8n+LEZ3UGb#-CCw=HEmA Y5Ab|@wbs@e761SM07*qoM6N<$g3GgYnE(I) literal 0 HcmV?d00001 diff --git a/graphics/intro/unk_8409D20.png b/graphics/intro/scene_3/gengar_static.png similarity index 100% rename from graphics/intro/unk_8409D20.png rename to graphics/intro/scene_3/gengar_static.png diff --git a/graphics/intro/unk_8409A3C.png b/graphics/intro/scene_3/grass.png similarity index 100% rename from graphics/intro/unk_8409A3C.png rename to graphics/intro/scene_3/grass.png diff --git a/graphics/intro/unk_840A3E4.png b/graphics/intro/scene_3/nidorino.png similarity index 100% rename from graphics/intro/unk_840A3E4.png rename to graphics/intro/scene_3/nidorino.png diff --git a/graphics/intro/unk_840BAE0.png b/graphics/intro/scene_3/recoil_dust.png similarity index 100% rename from graphics/intro/unk_840BAE0.png rename to graphics/intro/scene_3/recoil_dust.png diff --git a/graphics/intro/unk_840B874.png b/graphics/intro/scene_3/swipe.png similarity index 100% rename from graphics/intro/unk_840B874.png rename to graphics/intro/scene_3/swipe.png diff --git a/graphics/intro/unk_8402280.png b/graphics/intro/unk_8402280.png deleted file mode 100644 index dccf33afabced3cf28a392778330ae93fafc405e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmV+_0@eMAP)+cBr_WHWw7;B%6I9V2AZNBJmCsyZcgBVkN6V=ESO`35_!gJ| zFrNBeqyrUhZbwL)PVLZGoTg-rnXK)|T7qnGdZ~|ARA=YxfHUZt z&THNp%*1I?#e5~|>=Y{M(*v_NSaF%FxN8(s@E%zND^bz{T;d3b=^zItqDrlwt3-|0jII_>bR|X5wCaY@^hatyLk38WAN2bbif)* s_v<&9mtf~UE^}X{mML$F7b_C|2XyxnxbrLMX#fBK07*qoM6N<$g4g;0w*UYD diff --git a/graphics/intro/unk_840270C.pal b/graphics/intro/unk_840270C.pal deleted file mode 100644 index 619aee6a0..000000000 --- a/graphics/intro/unk_840270C.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -24 41 74 -0 0 0 -139 123 16 -189 172 16 -131 164 65 -148 230 49 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -222 222 222 -24 41 74 -82 82 82 -180 180 180 -255 255 255 diff --git a/graphics/intro/unk_8402D34.pal b/graphics/intro/unk_8402D34.pal deleted file mode 100644 index 4be93ec3e..000000000 --- a/graphics/intro/unk_8402D34.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -115 197 106 -41 164 8 -82 180 65 -139 222 131 -98 197 82 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -16 139 98 -16 115 98 -24 90 90 -32 74 90 -32 65 82 diff --git a/graphics/intro/unk_84048CC.pal b/graphics/intro/unk_84048CC.pal deleted file mode 100644 index ef08ae2fe..000000000 --- a/graphics/intro/unk_84048CC.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -0 0 255 -255 255 255 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -238 246 246 -222 230 230 -180 189 197 -148 156 172 -106 123 139 -74 90 115 -41 57 90 -0 0 0 diff --git a/graphics/intro/unk_8405B08.pal b/graphics/intro/unk_8405B08.pal deleted file mode 100644 index 43cc9d949..000000000 --- a/graphics/intro/unk_8405B08.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -0 0 0 -131 238 115 -82 189 74 -57 164 57 -115 213 98 -16 123 16 -164 255 131 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -255 0 255 -255 148 0 -164 222 98 diff --git a/graphics/intro/unk_8405DC4.png b/graphics/intro/unk_8405DC4.png deleted file mode 100644 index 8ae6ba691fff2705e713ba057eefc57c514a4df8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1408 zcmV-`1%LX9P)5!UosGThw%5zF+d88ISe_oh)}SX)zYicm zilH2(TKonAfd}Awe*ih+CqD!$DbUp-cGDU;uDVW+31K(gd~iyXpqLEPTBAfdV}8A4 zp)8&C*_5~;IuF?IB*7jQ*UgCE+~NhHu>*dVgngVNtD0!jfQ+aw6JoxsfCQr)<~PIbXO%TXF`+(Gjk4!zh35p_Y5HO;HAE{sEMpe3*n&`q!* z)`WA9F_{1$VCX2I4WKE=w1W3?D-gD zYZ6h(y6XMb(r+8ITDCT9Iq7~J)rI4nh)p%XRAOEHF6XjL*cwE%A^LpB)lH-ck*oHV8^YPC0&PfsGl^IdlUy zZKydVYtt2dxkbibZKbWZTdD8vw}OSYlG7=%uRf?l3B51{^hy|dpWe*#PmBJTTm%XI z!77iFA6>l?mI79(pQfeRc)?6N9KUUYXWF4OFUwR@@%oN`ub8H_)Lf|E5wBRcIqWF* z?^jg(-GGOCx!O_^aHy`B5mW42t&H49s7+g>lWgg{Z8BfHChq1tnCvFBd~IMSYXqt1>)eesp1oZzg>#@uqx1>2&QtZIZ=g1gB7 zwKYn!P3gB|QgFd^LHqvd(7ZJw!bV!3R>J=45@z;X?rZH(1z<1c!(m4p#C#-bq9M=; zd?e~;Z-tZ>B(J<2BnA#o#6i9WEakcTJ?{5=`T9y6UiXXVb-yQ$8-WkkK!H~AelK$U zw1=q)cEID#JMW1FaOZ&+K+=Oxh$aGb#6zPJ>T*D-lqfYvi3_yK_Q0a5N^3VZVAdc%289l#sdMtlf62w_!t zWjK#51=1Nr0YYSxzMTHm=jUqgeHEg3^!c097HY&WZ92|O3dO<hj*8gnq4Tzub4x-ng>IOlnn$=pB&5l)~SazED_ zP@~wnYn8rLmgvj#3w?eevViEK86tfcp-?E63^az23Z^DAvO!6uLhDp}2Y2YBLlj^~ z47o6RaL_B|HfTPb`f_#{>$7y>1sd!jk<;_Z=@MsjkDcu_8a8=GwQP{s@*yV8SwU2Pj439GRj6VBZxa1PSX)XzV?}aSNkT?+8o*O5Zt@|Gr=iytDs6ZP4 O0000xbL#fd;y6+ux|LMthSerX!xoID|@e?8WsE{_Bmfh@HaG9#e(lKCAv z5GR71f#yhSO|P## z2lR+2=@fvR_zZ8T0*=Tq<~$Rbj+Ky-{6fQ!7$inT0mo1Q3XDou&LtUu#;B+Rc5HTX z{VDB0XM(0piWjnry2{XBi7A1BY-Q!FRJK3+=MJE#D0ep=K@NBacux}K2;khVp6zA8 ze!h9{(pv3*%JBp|if06{qA(VDM$;WDKp2LU@CL2qZ#c2sFdr^fFJ@9Q(NDHZuQF=6MFf2p{ zwpYSl&H0q=jVS7J1YypWQwk7hBF(U7lg{qhmz~!8|H{|DjG9H(&SjT;}4&Z5d|wvOC=;`%gjQQMnXjN za(Yx6;NU7V8m`KC;8IOZwe~(!Dp0hYWX}}*3KK8W2)`bl2JP6{rJ{7B7J3nvssA|L zWQ(sf?J`OaO3|3JwI&m|01oCwg1-}c9%E?F{6xCriIf~kz>^}eX5=d%^?-?&kptuL zZV6K4aauTi^jyte6p@>vkYoMonY2?T)&Ob*do7oU&LO<^WFSEbJ5p~<$KlgQiGyxA zVuR&rw&i}>GQ-qqkhE6ogo+0%S;lD$pyT!>5@<9g{(-rIOm`8oa1hhxKueD>g^D=@P8sEME zwTFh>)HUK0@J&Q-y7%P0EBu+5RH$QX{k}XjqLKt(fSNMM3*es74DlLoyfF)`MeMoD zs!NhF^tMb65E#qP;9074KSj|n3k0B&rkd+yNF42Uk^m(gitQ!_)B;cvRApfphBS3{ zjiQ5`h|-RB*!*O`RVZpe;u`QRs{C?*Ho)x+75pVZV2C6gYpQ&YwQF3IE9Hl?h$2m7 z4O3iG%LkfUfDd-$N~&@Pq_D=oD?xF|YD&kR#{KP?nF%O9r}43o3$Zc*6!Id*EU4U`wC$LHuEC=F1}iTp zp*8hAT^aNB>;UqIZrZ6H32AC(}4_ zXCOqT_VyJw{g+dd2t{g_E~J0nT(x*WTt%RkL}ln5#NlE2#lEry4M$elIw~1~r2gLE z@i*qHE%ViuL&|lkD!tBEcPA7(68k@u=zJDwx%dSJp80Jpzp|b2MsnB-zI!liY+B#H(B!>f1{=ibsn(Vd z8D@CCFy(m~n{N+vmq^3NS2RfC4}u6Yhy;J~?Iif>!hp8R%E4Br z+I7mH@ZAyQ_V@t+M?B)Pq5*q~V5I`O&b{5me?XFR_<;6A0IATlRJ)rP)i{c@w*)qh5S=pS}2g{OJ7? ze3MyuuMJC12G9u_>1S+c5EDhkwLD00tf}noY#nxl*N);-=ttP*p?XA__h4e^J0WL( zYla6f;Q~N}x3TZpioRl9IW)>2)T3~vL$C~%g|Xq zjrnAZeZ{qW?*0r;WJd4L1y1I&PLt7i$5a)d3I|zHq5HDLjosY*=`B>Ko056*4abWf?q*;;{yWAKTPwvyf7n*=WJ1rYIMV>wUS=~Non-`8we;T`k{g|ZRAm4{Wlggf; zAvT)-{FlCqDY%*lsqZ5yXxB)u1XTFw93}wxvY4UvM}KVjlXfJo)f}-G+$Y1?Z|rA7 zEuW^o3VyD}5{evMJ(uona~HeN8ycY##WXe+Om!Ne~ z@F}|D>%z1h@H~67%r~AH`co>s_~5eb8W765q*0aQYqlp-sa|}4D;KI0Q2Q_I*puld zaJ4zB9hYHRnohtTm){)~Psu&XLyonvHaVtWg{{%Y(?MFmzR<;$5V1RZ%{&`RDX3^S z#c7m1mkMDvyfU4oW(+(m4R6uvz|%1>Z|OTj!#hx|jAt*ifJaHSf+g5OHb`=zyJKp=gV`yHPIaI7}DKptk ztXSPvW)2jqo65|fSiPgn^orGOWoA&UZYwiqYkEbQ8I-Nt%FLi_-BxDyUfJ4jDl>z! zbz7Mkl&#y!%%E)DR%Qle>$Wmedu8i31ZC^CGP7DBiVjA~OgJ&zrse(W2IQ2j{iZTA zC|kFcnL*k5y{XI$%GPaV=H#04A5dmG#p<>)GkEBA-F0_hd`RS!twx!tn;4?Z+=()s zGBYS!x0RW07k{~<%nZubZDr=rO2*s%v3f_D>6!4hGBex&ZYwkQ1)Adrp4k!`N)G5(OtdcXouJmGeYFKL(Dkhzj|HF$j1DWVn)_&3V*<4 zeDKPS09@=Rd*KE#V@JLuXoujnjRUH{_4AsTacO*0F=H$4-Omhkc&RsQCT0|a?deW` z(nY5n+#VjrFgc%GQgtrq7*QIYcWjk|6ttmF{6B+P+e1P7A*=uZ002ovPDHLkV1n1G B{^I}u diff --git a/graphics/intro/unk_8409A1C.pal b/graphics/intro/unk_8409A1C.pal deleted file mode 100644 index 36cbbb9a0..000000000 --- a/graphics/intro/unk_8409A1C.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -0 0 0 -164 238 139 -57 148 57 -131 213 115 -156 230 156 -131 205 148 -106 180 131 -65 139 98 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -255 0 0 diff --git a/graphics/intro/unk_840B834.pal b/graphics/intro/unk_840B834.pal deleted file mode 100644 index 40bbce557..000000000 --- a/graphics/intro/unk_840B834.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -0 0 0 -238 246 189 -0 0 0 -0 0 0 -115 213 255 -156 222 255 -205 238 255 -255 255 255 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/intro/unk_840B854.pal b/graphics/intro/unk_840B854.pal deleted file mode 100644 index dcf29b92e..000000000 --- a/graphics/intro/unk_840B854.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -197 222 205 -255 255 255 -222 222 222 -123 123 123 -156 222 255 -189 230 255 -222 238 255 -255 255 255 -255 180 123 -238 98 74 -205 57 32 -197 131 180 -164 98 148 -131 65 123 -90 57 90 -16 16 16 diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 2adb6e847..0aa81586d 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -537,14 +537,20 @@ graphics/misc/emoticons.4bpp: %.4bpp: %.png $(ITEMMENUGFXDIR)/bag_tiles.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 55 -$(INTROGFXDIR)/unk_8402D54.4bpp: %.4bpp: %.png +$(INTROGFXDIR)/scene_1/grass.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 397 -$(INTROGFXDIR)/unk_8406654.4bpp: %.4bpp: %.png +$(INTROGFXDIR)/scene_2/plants.4bpp: %.4bpp: %.png + $(GFX) $< $@ -num_tiles 17 + +$(INTROGFXDIR)/scene_2/nidorino_close.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 170 -$(INTROGFXDIR)/unk_8405B28.4bpp: %.4bpp: %.png - $(GFX) $< $@ -num_tiles 17 +$(INTROGFXDIR)/scene_2/gengar_close.4bpp: %.4bpp: %.png + $(GFX) $< $@ -num_tiles 114 + +$(INTROGFXDIR)/scene_3/gengar_anim.4bpp: %.4bpp: %.png + $(GFX) $< $@ -num_tiles 348 $(BATTLETERRAINGFXDIR)/building/terrain.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 77 diff --git a/include/intro.h b/include/intro.h index 1630b845e..7ed777ad6 100644 --- a/include/intro.h +++ b/include/intro.h @@ -1,7 +1,7 @@ #ifndef GUARD_INTRO_H #define GUARD_INTRO_H -void CB2_CopyrightScreen(void); -void c2_copyright_1(void); +void CB2_InitCopyrightScreenAfterTitleScreen(void); +void CB2_InitCopyrightScreenAfterBootup(void); #endif //GUARD_INTRO_H diff --git a/include/random.h b/include/random.h index bf4af42d0..fd6b88ad0 100644 --- a/include/random.h +++ b/include/random.h @@ -15,8 +15,9 @@ u16 Random2(void); // The number 1103515245 comes from the example implementation of rand and srand // in the ISO C standard. -#define ISO_RANDOMIZE1(val)(1103515245 * (val) + 24691) -#define ISO_RANDOMIZE2(val)(1103515245 * (val) + 12345) +#define RAND_MULT 1103515245 +#define ISO_RANDOMIZE1(val)(RAND_MULT * (val) + 24691) +#define ISO_RANDOMIZE2(val)(RAND_MULT * (val) + 12345) //Sets the initial seed value of the pseudorandom number generator void SeedRng(u16 seed); diff --git a/src/intro.c b/src/intro.c index 471cc4fcd..d3f5fe1e4 100644 --- a/src/intro.c +++ b/src/intro.c @@ -7,6 +7,7 @@ #include "new_menu_helpers.h" #include "link.h" #include "menu.h" +#include "random.h" #include "save.h" #include "new_game.h" #include "title_screen.h" @@ -16,6 +17,82 @@ #include "constants/songs.h" #include "constants/sound.h" +/* + The intro is grouped into the following scenes + - Copyright screen + - GF Logo + Scene 1. Brief close up shot of grass + Scene 2. A panning wide shot followed by a close-up of Gengar/Nidorino + Scene 3. A fight between Gengar/Nidorino + + After this it progresses to the title screen +*/ + +enum { + GFXTAG_STAR, + GFXTAG_SPARKLES_SMALL, + GFXTAG_SPARKLES_BIG, + GFXTAG_GF_LOGO, + GFXTAG_PRESENTS, + GFXTAG_SCENE3_NIDORINO, + GFXTAG_SCENE2_GENGAR, + GFXTAG_SCENE2_NIDORINO, + GFXTAG_SCENE3_GRASS, + GFXTAG_SCENE3_GENGAR, + GFXTAG_SCENE3_SWIPE, + GFXTAG_SCENE3_RECOIL_DUST, +}; + +enum { + PALTAG_STAR, + PALTAG_SPARKLES, + PALTAG_UNUSED_2, + PALTAG_GF, + PALTAG_UNUSED_4, + PALTAG_UNUSED_5, + PALTAG_GENGAR, + PALTAG_NIDORINO, + PALTAG_SCENE3_GRASS, + PALTAG_UNUSED_9, + PALTAG_SCENE3_SWIPE, + PALTAG_SCENE3_RECOIL_DUST, +}; + +// Background IDs for Game Freak logo scene +enum { + BG_GF_TEXT_LOGO = 2, + BG_GF_BACKGROUND +}; + + +// Background IDs for Scene 1 +enum { + BG_SCENE1_GRASS, + BG_SCENE1_BACKGROUND, + BG_SCENE1_UNUSED1, + BG_SCENE1_UNUSED2 +}; + +// Background IDs for Scene 2 +enum { + BG_SCENE2_PLANTS, + BG_SCENE2_NIDORINO, + BG_SCENE2_GENGAR, + BG_SCENE2_BACKGROUND // Bg for wide shot on upper half, close up on lower half +}; + +// Background IDs for Scene 3 +enum { + BG_SCENE3_GENGAR, + BG_SCENE3_BACKGROUND, + BG_SCENE3_UNUSED1, + BG_SCENE3_UNUSED2 +}; + +#define NUM_GENGAR_BACK_SPRITES 4 + +#define COLOSSEUM_GAME_CODE 0x65366347 // "Gc6e" in ASCII + struct IntroSequenceData; typedef void (*IntroCallback)(struct IntroSequenceData *); @@ -32,11 +109,11 @@ struct IntroSequenceData struct Sprite *gengarStaticSprite; struct Sprite *nidorinoStaticSprite; struct Sprite *grassSprite; - struct Sprite *gengarBackSpriteArray[4]; - u8 filler_0038[0x4]; - u8 gamefreakLogoArtSpriteTiles[0x400]; - u8 gamefreakTextBitmap[0x400]; - u8 filler_083C[0x2080]; + struct Sprite *gengarBackSprites[NUM_GENGAR_BACK_SPRITES]; + u8 unused0[4]; + u8 gameFreakLogoGfx[0x400]; + u8 gameFreakTextGfx[0x400]; + u8 unused1[0x2080]; }; // size: 0x28BC static EWRAM_DATA struct GcmbStruct sGcmb = {0}; @@ -103,8 +180,8 @@ static void FightScene4_CreateGengarSwipeSprites(void); static void SpriteCB_GengarSwipe(struct Sprite *sprite); static void Task_FightScene3_Bg0Scroll(u8 taskId); static void SpriteCB_LargeStar(struct Sprite *sprite); -static void SpriteCB_TrailingSparkles(struct Sprite *sprite); -static void SpriteCB_TrailingSparkles2(struct Sprite *sprite); +static void SpriteCB_SparklesSmall(struct Sprite *sprite); +static void SpriteCB_SparklesSmall2(struct Sprite *sprite); static void SpriteCB_RevealGameFreakTextSparkles(struct Sprite *sprite); static void CreateNidorinoAnimSprite(struct IntroSequenceData * ptr); static void StartNidorinoAnimSpriteSlideIn(struct Sprite *sprite, s16 x0, s16 x1, u16 speed); @@ -122,67 +199,69 @@ static void SpriteCB_HopToPos(struct Sprite *sprite); static void StartNidorinoAnim_LaunchSelfAtGengarAnim(struct IntroSequenceData * ptr); static void SpriteCB_NidorinoAnim_LaunchSelfAtGengar(struct Sprite *sprite); static void LoadFightSceneSpriteTilesAndPals(void); -#if REVISION >= 1 -static void Rev1_GameFreakScene_CreatePresentsText(void); -#else -#define Rev1_GameFreakScene_CreatePresentsText() -#endif +static void CreateGameFreakPresentsText(void); extern const u32 gMultiBootProgram_PokemonColosseum_Start[]; -static const u16 sCopyrightGraphicsPal[] = INCBIN_U16("graphics/intro/unk_8402260.gbapal"); -static const u8 sCopyrightGraphicsTiles[] = INCBIN_U8("graphics/intro/unk_8402280.4bpp.lz"); -static const u8 sCopyrightGraphicsMap[] = INCBIN_U8("graphics/intro/unk_84024E4.bin.lz"); -static const u16 sBg3Pal_GameFreakPresents[] = INCBIN_U16("graphics/intro/unk_8402630.gbapal"); -static const u8 sBg3Tiles_GameFreakPresents[] = INCBIN_U8("graphics/intro/unk_8402650.4bpp.lz"); -static const u8 sBg3Map_GameFreakPresents[] = INCBIN_U8("graphics/intro/unk_8402668.bin.lz"); -static const u16 sSpritePals_GameFreakPresents[] = INCBIN_U16("graphics/intro/unk_840270C.gbapal"); -static const u8 sBlit_GameFreakText[] = INCBIN_U8("graphics/intro/unk_840272C.4bpp.lz"); -static const u32 sSpriteTiles_GameFreakLogoArt[] = INCBIN_U32("graphics/intro/unk_84028F8.4bpp.lz"); -static const u16 sSpritePals_LargeStar[] = INCBIN_U16("graphics/intro/unk_8402A64.gbapal"); -static const u32 sSpriteTiles_LargeStar[] = INCBIN_U32("graphics/intro/unk_8402A64.4bpp.lz"); -static const u16 sSpritePals_Sparkles[] = INCBIN_U16("graphics/intro/unk_8402ADC.gbapal"); -static const u32 sSpriteTiles_TrailingSparkles[] = INCBIN_U32("graphics/intro/unk_8402ADC.4bpp.lz"); -static const u32 sSpriteTiles_RevealGameFreakTextSparkles[] = INCBIN_U32("graphics/intro/unk_8402B2C.4bpp.lz"); -static const u32 sSpriteTiles_PresentsText[] = INCBIN_U32("graphics/intro/unk_8402CD4.4bpp.lz"); -static const u16 sBg0Pal_FightScene1[] = INCBIN_U16("graphics/intro/unk_8402D34.gbapal"); -static const u8 sBg0Tiles_FightScene1[] = INCBIN_U8("graphics/intro/unk_8402D54.4bpp.lz"); -static const u8 sBg0Map_FightScene1[] = INCBIN_U8("graphics/intro/unk_8403FE8.bin.lz"); -static const u16 sBg1Pal_FightScene1[] = INCBIN_U16("graphics/intro/unk_84048CC.gbapal"); -static const u8 sBg1Tiles_FightScene1[] = INCBIN_U8("graphics/intro/unk_84048EC.4bpp.lz"); -static const u8 sBg1Map_FightScene1[] = INCBIN_U8("graphics/intro/unk_8404F7C.bin.lz"); -static const u16 sBg3Pal_FightScene2[] = INCBIN_U16("graphics/intro/unk_84053B4.gbapal"); -static const u8 sBg3Tiles_FightScene2[] = INCBIN_U8("graphics/intro/unk_8405414.4bpp.lz"); -static const u8 sBg3Map_FightScene2[] = INCBIN_U8("graphics/intro/unk_8405890.bin.lz"); -static const u16 sBg0Pal_FightScene2[] = INCBIN_U16("graphics/intro/unk_8405B08.gbapal"); -static const u8 sBg0Tiles_FightScene2[] = INCBIN_U8("graphics/intro/unk_8405B28.4bpp.lz"); -static const u8 sBg0Map_FightScene2[] = INCBIN_U8("graphics/intro/unk_8405CDC.bin.lz"); -static const u16 sSpritePals_Gengar[] = INCBIN_U16("graphics/intro/unk_8405DA4.gbapal"); -static const u8 sBg2Tiles_FightScene2[] = INCBIN_U8("graphics/intro/unk_8405DC4.4bpp.lz"); -static const u8 sBg2Map_FightScene2[] = INCBIN_U8("graphics/intro/unk_840644C.bin.lz"); -static const u16 sBg1Pal_FightScene2[] = INCBIN_U16("graphics/intro/unk_8406634.gbapal"); -static const u8 sBg1Tiles_FightScene2[] = INCBIN_U8("graphics/intro/unk_8406654.4bpp.lz"); -static const u8 sBg1Map_FightScene2[] = INCBIN_U8("graphics/intro/unk_84071D0.bin.lz"); -static const u16 sBg1Pal_FightScene3[] = INCBIN_U16("graphics/intro/unk_8407430.gbapal"); -static const u8 sBg1Tiles_FightScene3[] = INCBIN_U8("graphics/intro/unk_8407470.4bpp.lz"); -static const u8 sBg1Map_FightScene3[] = INCBIN_U8("graphics/intro/unk_8407A50.bin.lz"); -static const u8 sBg0Tiles_FightScene3[] = INCBIN_U8("graphics/intro/unk_8407B9C.4bpp.lz"); -static const u8 sBg0Map_FightScene3[] = INCBIN_U8("graphics/intro/unk_8408D98.bin.lz"); -static const u32 sSpriteTiles_GengarStatic[] = INCBIN_U32("graphics/intro/unk_840926C.4bpp.lz"); -static const u16 sSpritePals_Nidorino[] = INCBIN_U16("graphics/intro/unk_84096AC.gbapal"); -static const u32 sSpriteTiles_NidorinoStatic[] = INCBIN_U32("graphics/intro/unk_84096CC.4bpp.lz"); -static const u16 sSpritePals_Grass[] = INCBIN_U16("graphics/intro/unk_8409A1C.gbapal"); -static const u32 sSpriteTiles_Grass[] = INCBIN_U32("graphics/intro/unk_8409A3C.4bpp.lz"); -static const u32 sSpriteTiles_GengarBack[] = INCBIN_U32("graphics/intro/unk_8409D20.4bpp.lz"); -static const u32 sSpriteTiles_NidorinoAnim[] = INCBIN_U32("graphics/intro/unk_840A3E4.4bpp.lz"); -static const u16 sSpritePals_GengarSwipe[] = INCBIN_U16("graphics/intro/unk_840B834.gbapal"); -static const u16 sSpritePals_NidorinoRecoilDust[] = INCBIN_U16("graphics/intro/unk_840B854.gbapal"); -static const u32 sSpriteTiles_GengarSwipe[] = INCBIN_U32("graphics/intro/unk_840B874.4bpp.lz"); -static const u32 sSpriteTiles_NidorinoRecoilDust[] = INCBIN_U32("graphics/intro/unk_840BAE0.4bpp.lz"); +static const u16 sCopyright_Pal[] = INCBIN_U16("graphics/intro/copyright.gbapal"); +static const u8 sCopyright_Gfx[] = INCBIN_U8("graphics/intro/copyright.4bpp.lz"); +static const u8 sCopyright_Map[] = INCBIN_U8("graphics/intro/copyright.bin.lz"); + +// Game Freak +static const u16 sGameFreakBg_Pal[] = INCBIN_U16("graphics/intro/game_freak/bg.gbapal"); +static const u8 sGameFreakBg_Gfx[] = INCBIN_U8( "graphics/intro/game_freak/bg.4bpp.lz"); +static const u8 sGameFreakBg_Map[] = INCBIN_U8( "graphics/intro/game_freak/bg.bin.lz"); +static const u16 sGameFreakLogo_Pal[] = INCBIN_U16("graphics/intro/game_freak/logo.gbapal"); +static const u8 sGameFreakText_Gfx[] = INCBIN_U8( "graphics/intro/game_freak/game_freak.4bpp.lz"); +static const u32 sGameFreakLogo_Gfx[] = INCBIN_U32("graphics/intro/game_freak/logo.4bpp.lz"); +static const u16 sStar_Pal[] = INCBIN_U16("graphics/intro/game_freak/star.gbapal"); +static const u32 sStar_Gfx[] = INCBIN_U32("graphics/intro/game_freak/star.4bpp.lz"); +static const u16 sSparkles_Pal[] = INCBIN_U16("graphics/intro/game_freak/sparkles.gbapal"); +static const u32 sSparklesSmall_Gfx[] = INCBIN_U32("graphics/intro/game_freak/sparkles_small.4bpp.lz"); +static const u32 sSparklesBig_Gfx[] = INCBIN_U32("graphics/intro/game_freak/sparkles_big.4bpp.lz"); +static const u32 sPresents_Gfx[] = INCBIN_U32("graphics/intro/game_freak/presents.4bpp.lz"); + +// Scene 1 (Grass close up) +static const u16 sScene1_Grass_Pal[] = INCBIN_U16("graphics/intro/scene_1/grass.gbapal"); +static const u8 sScene1_Grass_Gfx[] = INCBIN_U8( "graphics/intro/scene_1/grass.4bpp.lz"); +static const u8 sScene1_Grass_Map[] = INCBIN_U8( "graphics/intro/scene_1/grass.bin.lz"); +static const u16 sScene1_Bg_Pal[] = INCBIN_U16("graphics/intro/scene_1/bg.gbapal"); +static const u8 sScene1_Bg_Gfx[] = INCBIN_U8( "graphics/intro/scene_1/bg.4bpp.lz"); +static const u8 sScene1_Bg_Map[] = INCBIN_U8( "graphics/intro/scene_1/bg.bin.lz"); + +// Scenes 2 and 3 (Gengar and Nidorino) +static const u16 sScene2_Bg_Pal[] = INCBIN_U16("graphics/intro/scene_2/bg.gbapal"); +static const u8 sScene2_Bg_Gfx[] = INCBIN_U8( "graphics/intro/scene_2/bg.4bpp.lz"); +static const u8 sScene2_Bg_Map[] = INCBIN_U8( "graphics/intro/scene_2/bg.bin.lz"); +static const u16 sScene2_Plants_Pal[] = INCBIN_U16("graphics/intro/scene_2/plants.gbapal"); // Unused +static const u8 sScene2_Plants_Gfx[] = INCBIN_U8( "graphics/intro/scene_2/plants.4bpp.lz"); +static const u8 sScene2_Plants_Map[] = INCBIN_U8( "graphics/intro/scene_2/plants.bin.lz"); +static const u16 sGengar_Pal[] = INCBIN_U16("graphics/intro/gengar.gbapal"); // Used by multiple scenes +static const u8 sScene2_GengarClose_Gfx[] = INCBIN_U8( "graphics/intro/scene_2/gengar_close.4bpp.lz"); +static const u8 sScene2_GengarClose_Map[] = INCBIN_U8( "graphics/intro/scene_2/gengar_close.bin.lz"); +static const u16 sScene2_NidorinoClose_Pal[] = INCBIN_U16("graphics/intro/scene_2/nidorino_close.gbapal"); +static const u8 sScene2_NidorinoClose_Gfx[] = INCBIN_U8( "graphics/intro/scene_2/nidorino_close.4bpp.lz"); +static const u8 sScene2_NidorinoClose_Map[] = INCBIN_U8( "graphics/intro/scene_2/nidorino_close.bin.lz"); +static const u16 sScene3_Bg_Pal[] = INCBIN_U16("graphics/intro/scene_3/bg.gbapal"); +static const u8 sScene3_Bg_Gfx[] = INCBIN_U8( "graphics/intro/scene_3/bg.4bpp.lz"); // give -width 16 +static const u8 sScene3_Bg_Map[] = INCBIN_U8( "graphics/intro/scene_3/bg.bin.lz"); +static const u8 sScene3_GengarAnim_Gfx[] = INCBIN_U8( "graphics/intro/scene_3/gengar_anim.4bpp.lz"); +static const u8 sScene3_GengarAnim_Map[] = INCBIN_U8( "graphics/intro/scene_3/gengar_anim.bin.lz"); +static const u32 sScene2_Gengar_Gfx[] = INCBIN_U32("graphics/intro/scene_2/gengar.4bpp.lz"); +static const u16 sNidorino_Pal[] = INCBIN_U16("graphics/intro/nidorino.gbapal"); // Used by multiple scenes +static const u32 sScene2_Nidorino_Gfx[] = INCBIN_U32("graphics/intro/scene_2/nidorino.4bpp.lz"); +static const u16 sScene3_Grass_Pal[] = INCBIN_U16("graphics/intro/scene_3/grass.gbapal"); +static const u32 sScene3_Grass_Gfx[] = INCBIN_U32("graphics/intro/scene_3/grass.4bpp.lz"); +static const u32 sScene3_GengarStatic_Gfx[] = INCBIN_U32("graphics/intro/scene_3/gengar_static.4bpp.lz"); +static const u32 sScene3_Nidorino_Gfx[] = INCBIN_U32("graphics/intro/scene_3/nidorino.4bpp.lz"); +static const u16 sScene3_Swipe_Pal[] = INCBIN_U16("graphics/intro/scene_3/swipe.gbapal"); +static const u16 sScene3_RecoilDust_Pal[] = INCBIN_U16("graphics/intro/scene_3/recoil_dust.gbapal"); +static const u32 sScene3_Swipe_Gfx[] = INCBIN_U32("graphics/intro/scene_3/swipe.4bpp.lz"); +static const u32 sScene3_RecoilDust_Gfx[] = INCBIN_U32("graphics/intro/scene_3/recoil_dust.4bpp.lz"); static const struct BgTemplate sBgTemplates_GameFreakScene[] = { { - .bg = 3, + .bg = BG_GF_BACKGROUND, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, @@ -190,7 +269,7 @@ static const struct BgTemplate sBgTemplates_GameFreakScene[] = { .priority = 3, .baseTile = 0x000 }, { - .bg = 2, + .bg = BG_GF_TEXT_LOGO, .charBaseIndex = 3, .mapBaseIndex = 30, .screenSize = 0, @@ -200,9 +279,9 @@ static const struct BgTemplate sBgTemplates_GameFreakScene[] = { } }; -static const struct BgTemplate sBgTemplates_FightScene1[] = { +static const struct BgTemplate sBgTemplates_Scene1[] = { { - .bg = 0, + .bg = BG_SCENE1_GRASS, .charBaseIndex = 0, .mapBaseIndex = 28, .screenSize = 2, @@ -210,7 +289,7 @@ static const struct BgTemplate sBgTemplates_FightScene1[] = { .priority = 0, .baseTile = 0x000 }, { - .bg = 1, + .bg = BG_SCENE1_BACKGROUND, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 2, @@ -220,9 +299,9 @@ static const struct BgTemplate sBgTemplates_FightScene1[] = { } }; -static const struct BgTemplate sBgTemplates_FightScene2[] = { +static const struct BgTemplate sBgTemplates_Scene2[] = { { - .bg = 3, + .bg = BG_SCENE2_BACKGROUND, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 2, @@ -230,7 +309,7 @@ static const struct BgTemplate sBgTemplates_FightScene2[] = { .priority = 3, .baseTile = 0x000 }, { - .bg = 0, + .bg = BG_SCENE2_PLANTS, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, @@ -238,7 +317,7 @@ static const struct BgTemplate sBgTemplates_FightScene2[] = { .priority = 0, .baseTile = 0x000 }, { - .bg = 2, + .bg = BG_SCENE2_GENGAR, .charBaseIndex = 3, .mapBaseIndex = 27, .screenSize = 0, @@ -246,7 +325,7 @@ static const struct BgTemplate sBgTemplates_FightScene2[] = { .priority = 2, .baseTile = 0x000 }, { - .bg = 1, + .bg = BG_SCENE2_NIDORINO, .charBaseIndex = 2, .mapBaseIndex = 28, .screenSize = 0, @@ -256,9 +335,9 @@ static const struct BgTemplate sBgTemplates_FightScene2[] = { } }; -static const struct BgTemplate sBgTemplates_FightScene3[] = { +static const struct BgTemplate sBgTemplates_Scene3[] = { { - .bg = 1, + .bg = BG_SCENE3_BACKGROUND, .charBaseIndex = 0, .mapBaseIndex = 29, .screenSize = 0, @@ -266,7 +345,7 @@ static const struct BgTemplate sBgTemplates_FightScene3[] = { .priority = 1, .baseTile = 0x000 }, { - .bg = 0, + .bg = BG_SCENE3_GENGAR, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 2, @@ -276,9 +355,9 @@ static const struct BgTemplate sBgTemplates_FightScene3[] = { } }; -static const struct WindowTemplate sWindowTemplate[] = { +static const struct WindowTemplate sWindowTemplate_GameFreakTextLogo[] = { { - .bg = 2, + .bg = BG_GF_TEXT_LOGO, .tilemapLeft = 6, .tilemapTop = 4, .width = 18, @@ -288,7 +367,7 @@ static const struct WindowTemplate sWindowTemplate[] = { }, DUMMY_WIN_TEMPLATE }; -static const u8 sGengarBackSpritePos2UpdateMods[][2] = { +static const u8 sGengarBackSpritePos2UpdateMods[NUM_GENGAR_BACK_SPRITES][2] = { {0x3f, 0x3f}, {0x00, 0x3f}, {0x3f, 0x00}, @@ -296,33 +375,33 @@ static const u8 sGengarBackSpritePos2UpdateMods[][2] = { }; static const struct CompressedSpriteSheet sSpriteSheets_GameFreakScene[] = { - {sSpriteTiles_LargeStar, 0x0080, 0}, - {sSpriteTiles_TrailingSparkles, 0x0080, 1}, - {sSpriteTiles_RevealGameFreakTextSparkles, 0x0800, 2}, - {sSpriteTiles_GameFreakLogoArt, 0x0400, 3}, - {sSpriteTiles_PresentsText, 0x0100, 4} + {sStar_Gfx, 0x80, GFXTAG_STAR}, + {sSparklesSmall_Gfx, 0x80, GFXTAG_SPARKLES_SMALL}, + {sSparklesBig_Gfx, 0x800, GFXTAG_SPARKLES_BIG}, + {sGameFreakLogo_Gfx, 0x400, GFXTAG_GF_LOGO}, + {sPresents_Gfx, 0x100, GFXTAG_PRESENTS} }; static const struct SpritePalette sSpritePalettes_GameFreakScene[] = { - {sSpritePals_LargeStar, 0}, - {sSpritePals_Sparkles, 1}, - {sSpritePals_GameFreakPresents, 3}, + {sStar_Pal, PALTAG_STAR}, + {sSparkles_Pal, PALTAG_SPARKLES}, + {sGameFreakLogo_Pal, PALTAG_GF}, {0} }; static const struct Coords16 sTrailingSparkleCoords[] = { - {0x0048, 0x0050}, - {0x0088, 0x004a}, - {0x00a8, 0x0050}, - {0x0078, 0x0050}, - {0x0068, 0x0056}, - {0x0058, 0x004a}, - {0x00b8, 0x004a}, - {0x0038, 0x0056}, - {0x0098, 0x0056} + { 72, 80}, + {136, 74}, + {168, 80}, + {120, 80}, + {104, 86}, + { 88, 74}, + {184, 74}, + { 56, 86}, + {152, 86} }; -static const struct OamData gOamData_840BC2C = { +static const struct OamData sOam_Star = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, @@ -335,7 +414,7 @@ static const struct OamData gOamData_840BC2C = { .paletteNum = 0 }; -static const struct OamData gOamData_840BC34 = { +static const struct OamData sOam_SparklesSmall = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, @@ -348,7 +427,7 @@ static const struct OamData gOamData_840BC34 = { .paletteNum = 0 }; -static const union AnimCmd gAnimCmd_840BC3C[] = { +static const union AnimCmd sAnim_SparklesSmall_0[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), @@ -356,7 +435,7 @@ static const union AnimCmd gAnimCmd_840BC3C[] = { ANIMCMD_JUMP(0) }; -static const union AnimCmd gAnimCmd_840BC50[] = { +static const union AnimCmd sAnim_SparklesSmall_1[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), @@ -364,32 +443,32 @@ static const union AnimCmd gAnimCmd_840BC50[] = { ANIMCMD_END }; -static const union AnimCmd *const gAnimCmdTable_840BC64[] = { - gAnimCmd_840BC3C, - gAnimCmd_840BC50 +static const union AnimCmd *const sAnims_SparklesSmall[] = { + sAnim_SparklesSmall_0, + sAnim_SparklesSmall_1 }; -static const struct SpriteTemplate sSpriteTemplate_LargeStar = { - .tileTag = 0, - .paletteTag = 0, - .oam = &gOamData_840BC2C, +static const struct SpriteTemplate sSpriteTemplate_Star = { + .tileTag = GFXTAG_STAR, + .paletteTag = PALTAG_STAR, + .oam = &sOam_Star, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_LargeStar }; -static const struct SpriteTemplate sSpriteTemplate_TrailingSparkles = { - .tileTag = 1, - .paletteTag = 1, - .oam = &gOamData_840BC34, - .anims = gAnimCmdTable_840BC64, +static const struct SpriteTemplate sSpriteTemplate_SparklesSmall = { + .tileTag = GFXTAG_SPARKLES_SMALL, + .paletteTag = PALTAG_SPARKLES, + .oam = &sOam_SparklesSmall, + .anims = sAnims_SparklesSmall, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_TrailingSparkles + .callback = SpriteCB_SparklesSmall }; -static const struct OamData gOamData_840BC9C = { +static const struct OamData sOam_SparklesBig = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, @@ -402,7 +481,7 @@ static const struct OamData gOamData_840BC9C = { .paletteNum = 0 }; -static const union AnimCmd gAnimCmd_840BCA4[] = { +static const union AnimCmd sAnim_SparklesBig[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(16, 8), ANIMCMD_FRAME(32, 8), @@ -410,21 +489,21 @@ static const union AnimCmd gAnimCmd_840BCA4[] = { ANIMCMD_END }; -static const union AnimCmd *const gAnimCmdTable_840BCB8[] = { - gAnimCmd_840BCA4 +static const union AnimCmd *const sAnims_SparklesBig[] = { + sAnim_SparklesBig }; -static const struct SpriteTemplate sSpriteTemplate_RevealGameFreakTextSparkles = { - .tileTag = 2, - .paletteTag = 1, - .oam = &gOamData_840BC9C, - .anims = gAnimCmdTable_840BCB8, +static const struct SpriteTemplate sSpriteTemplate_SparklesBig = { + .tileTag = GFXTAG_SPARKLES_BIG, + .paletteTag = PALTAG_SPARKLES, + .oam = &sOam_SparklesBig, + .anims = sAnims_SparklesBig, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_RevealGameFreakTextSparkles }; -static const struct OamData gOamData_840BCD4 = { +static const struct OamData sOam_GameFreakLogo = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, @@ -438,16 +517,16 @@ static const struct OamData gOamData_840BCD4 = { }; static const struct SpriteTemplate sSpriteTemplate_GameFreakLogoArt = { - .tileTag = 3, - .paletteTag = 3, - .oam = &gOamData_840BCD4, + .tileTag = GFXTAG_GF_LOGO, + .paletteTag = PALTAG_GF, + .oam = &sOam_GameFreakLogo, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct OamData gOamData_840BCF4 = { +static const struct OamData sOam_PresentsText = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, @@ -461,16 +540,16 @@ static const struct OamData gOamData_840BCF4 = { }; static const struct SpriteTemplate sSpriteTemplate_PresentsText = { - .tileTag = 4, - .paletteTag = 3, - .oam = &gOamData_840BCF4, + .tileTag = GFXTAG_PRESENTS, + .paletteTag = PALTAG_GF, + .oam = &sOam_PresentsText, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct OamData gOamData_840BD14 = { +static const struct OamData sOam_Scene3_Nidorino = { .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, @@ -483,66 +562,66 @@ static const struct OamData gOamData_840BD14 = { .paletteNum = 0 }; -static const union AnimCmd gAnimCmd_840BD1C[] = { +static const union AnimCmd sAnim_Scene3_Nidorino_0[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_840BD24[] = { +static const union AnimCmd sAnim_Scene3_Nidorino_1[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_840BD2C[] = { +static const union AnimCmd sAnim_Scene3_Nidorino_2[] = { ANIMCMD_FRAME(128, 1), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_840BD34[] = { +static const union AnimCmd sAnim_Scene3_Nidorino_3[] = { ANIMCMD_FRAME(192, 1), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_840BD3C[] = { +static const union AnimCmd sAnim_Scene3_Nidorino_4[] = { ANIMCMD_FRAME(256, 1), ANIMCMD_END }; -static const union AnimCmd *const sAnimTable_NidorinoAnim[] = { - gAnimCmd_840BD1C, - gAnimCmd_840BD24, - gAnimCmd_840BD2C, - gAnimCmd_840BD34, - gAnimCmd_840BD3C +static const union AnimCmd *const sAnims_Scene3_Nidorino[] = { + sAnim_Scene3_Nidorino_0, + sAnim_Scene3_Nidorino_1, + sAnim_Scene3_Nidorino_2, + sAnim_Scene3_Nidorino_3, + sAnim_Scene3_Nidorino_4 }; -static const union AffineAnimCmd gAffineAnimCmd_840BD58[] = { +static const union AffineAnimCmd sAffineAnim_Scene3_Mons_0[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gAffineAnimCmd_840BD68[] = { +static const union AffineAnimCmd sAffineAnim_Scene3_Mons_1[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(32, 32, 0, 8), AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const sAffineAnimTable_NidorinoAnim[] = { - gAffineAnimCmd_840BD58, - gAffineAnimCmd_840BD68 +static const union AffineAnimCmd *const sAffineAnims_Scene3_Mons[] = { + sAffineAnim_Scene3_Mons_0, + sAffineAnim_Scene3_Mons_1 }; -static const struct SpriteTemplate sSpriteTemplate_NidorinoAnim = { - .tileTag = 5, - .paletteTag = 7, - .oam = &gOamData_840BD14, - .anims = sAnimTable_NidorinoAnim, +static const struct SpriteTemplate sSpriteTemplate_Scene3_Nidorino = { + .tileTag = GFXTAG_SCENE3_NIDORINO, + .paletteTag = PALTAG_NIDORINO, + .oam = &sOam_Scene3_Nidorino, + .anims = sAnims_Scene3_Nidorino, .images = NULL, - .affineAnims = sAffineAnimTable_NidorinoAnim, + .affineAnims = sAffineAnims_Scene3_Mons, .callback = SpriteCallbackDummy }; -static const struct OamData gOamData_840BDA0 = { +static const struct OamData sOam_Scene2_Mons = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, @@ -555,27 +634,27 @@ static const struct OamData gOamData_840BDA0 = { .paletteNum = 0 }; -static const struct SpriteTemplate sSpriteTemplate_NidorinoStatic = { - .tileTag = 7, - .paletteTag = 7, - .oam = &gOamData_840BDA0, +static const struct SpriteTemplate sSpriteTemplate_Scene2_Nidorino = { + .tileTag = GFXTAG_SCENE2_NIDORINO, + .paletteTag = PALTAG_NIDORINO, + .oam = &sOam_Scene2_Mons, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate sSpriteTemplate_GengarStatic = { - .tileTag = 6, - .paletteTag = 6, - .oam = &gOamData_840BDA0, +static const struct SpriteTemplate sSpriteTemplate_Scene2_Gengar = { + .tileTag = GFXTAG_SCENE2_GENGAR, + .paletteTag = PALTAG_GENGAR, + .oam = &sOam_Scene2_Mons, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct OamData gOamData_840BDD8 = { +static const struct OamData sOam_Grass = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, @@ -588,33 +667,33 @@ static const struct OamData gOamData_840BDD8 = { .paletteNum = 0 }; -static const union AnimCmd gAnimCmds_840BDE0[] = { +static const union AnimCmd sAnim_Grass_0[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd gAnimCmds_840BDE8[] = { +static const union AnimCmd sAnim_Grass_1[] = { ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END }; -static const union AnimCmd *const gAnimCmdTable_840BDF4[] = { - gAnimCmds_840BDE0, - gAnimCmds_840BDE8 +static const union AnimCmd *const sAnims_Grass[] = { + sAnim_Grass_0, + sAnim_Grass_1 }; static const struct SpriteTemplate sSpriteTemplate_Grass = { - .tileTag = 8, - .paletteTag = 8, - .oam = &gOamData_840BDD8, - .anims = gAnimCmdTable_840BDF4, + .tileTag = GFXTAG_SCENE3_GRASS, + .paletteTag = PALTAG_SCENE3_GRASS, + .oam = &sOam_Grass, + .anims = sAnims_Grass, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct OamData gOamData_840BE14 = { +static const struct OamData sOam_Scene3_Gengar = { .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, @@ -627,44 +706,44 @@ static const struct OamData gOamData_840BE14 = { .paletteNum = 0 }; -static const union AnimCmd gAnimCmd_840BE1C[] = { +static const union AnimCmd sAnim_Scene3_Gengar_0[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_840BE24[] = { +static const union AnimCmd sAnim_Scene3_Gengar_1[] = { ANIMCMD_FRAME(64, 0), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_840BE2C[] = { +static const union AnimCmd sAnim_Scene3_Gengar_2[] = { ANIMCMD_FRAME(96, 0), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_840BE34[] = { +static const union AnimCmd sAnim_Scene3_Gengar_3[] = { ANIMCMD_FRAME(160, 0), ANIMCMD_END }; -static const union AnimCmd *const gAnimCmdTable_840BE3C[] = { - gAnimCmd_840BE1C, - gAnimCmd_840BE24, - gAnimCmd_840BE2C, - gAnimCmd_840BE34 +static const union AnimCmd *const sAnims_Scene3_Gengar[NUM_GENGAR_BACK_SPRITES] = { + sAnim_Scene3_Gengar_0, + sAnim_Scene3_Gengar_1, + sAnim_Scene3_Gengar_2, + sAnim_Scene3_Gengar_3 }; -static const struct SpriteTemplate sSpriteTemplate_GengarBack = { - .tileTag = 9, - .paletteTag = 6, - .oam = &gOamData_840BE14, - .anims = gAnimCmdTable_840BE3C, +static const struct SpriteTemplate sSpriteTemplate_Scene3_Gengar = { + .tileTag = GFXTAG_SCENE3_GENGAR, + .paletteTag = PALTAG_GENGAR, + .oam = &sOam_Scene3_Gengar, + .anims = sAnims_Scene3_Gengar, .images = NULL, - .affineAnims = sAffineAnimTable_NidorinoAnim, + .affineAnims = sAffineAnims_Scene3_Mons, .callback = SpriteCallbackDummy }; -static const struct OamData gOamData_840BE64 = { +static const struct OamData sOam_Swipe = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, @@ -677,34 +756,34 @@ static const struct OamData gOamData_840BE64 = { .paletteNum = 0 }; -static const union AnimCmd gAnimCmd_840BE6C[] = { +static const union AnimCmd sAnim_Swipe_0[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(32, 4), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_840BE78[] = { +static const union AnimCmd sAnim_Swipe_1[] = { ANIMCMD_FRAME(64, 8), ANIMCMD_FRAME(72, 4), ANIMCMD_END }; -static const union AnimCmd *const gAnimCmdTable_840BE84[] = { - gAnimCmd_840BE6C, - gAnimCmd_840BE78 +static const union AnimCmd *const sAnims_Swipe[] = { + sAnim_Swipe_0, + sAnim_Swipe_1 }; static const struct SpriteTemplate sSpriteTemplate_GengarSwipe = { - .tileTag = 10, - .paletteTag = 10, - .oam = &gOamData_840BE64, - .anims = gAnimCmdTable_840BE84, + .tileTag = GFXTAG_SCENE3_SWIPE, + .paletteTag = PALTAG_SCENE3_SWIPE, + .oam = &sOam_Swipe, + .anims = sAnims_Swipe, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_GengarSwipe }; -static const struct OamData gOamData_840BEA4 = { +static const struct OamData sOam_RecoilDust = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, @@ -717,7 +796,7 @@ static const struct OamData gOamData_840BEA4 = { .paletteNum = 0 }; -static const union AnimCmd gAnimCmd_840BEAC[] = { +static const union AnimCmd sAnim_RecoilDust[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_FRAME(4, 10), ANIMCMD_FRAME(8, 10), @@ -725,28 +804,28 @@ static const union AnimCmd gAnimCmd_840BEAC[] = { ANIMCMD_END }; -static const union AnimCmd *const gAnimCmdTable_840BEC0[] = { - gAnimCmd_840BEAC +static const union AnimCmd *const sAnims_RecoilDust[] = { + sAnim_RecoilDust }; static const struct SpriteTemplate sSpriteTemplate_NidorinoRecoilDust = { - .tileTag = 11, - .paletteTag = 11, - .oam = &gOamData_840BEA4, - .anims = gAnimCmdTable_840BEC0, + .tileTag = GFXTAG_SCENE3_RECOIL_DUST, + .paletteTag = PALTAG_SCENE3_RECOIL_DUST, + .oam = &sOam_RecoilDust, + .anims = sAnims_RecoilDust, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_NidorinoRecoilDust }; static const struct CompressedSpriteSheet sFightSceneSpriteSheets[] = { - {sSpriteTiles_GengarStatic, 0x0800, 6}, - {sSpriteTiles_NidorinoStatic, 0x0800, 7}, - {sSpriteTiles_NidorinoAnim, 0x2800, 5}, - {sSpriteTiles_Grass, 0x0800, 8}, - {sSpriteTiles_GengarBack, 0x1800, 9}, - {sSpriteTiles_GengarSwipe, 0x0a00, 10}, - {sSpriteTiles_NidorinoRecoilDust, 0x0200, 11} + {sScene2_Gengar_Gfx, 0x800, GFXTAG_SCENE2_GENGAR}, + {sScene2_Nidorino_Gfx, 0x800, GFXTAG_SCENE2_NIDORINO}, + {sScene3_Nidorino_Gfx, 0x2800, GFXTAG_SCENE3_NIDORINO}, + {sScene3_Grass_Gfx, 0x800, GFXTAG_SCENE3_GRASS}, + {sScene3_GengarStatic_Gfx, 0x1800, GFXTAG_SCENE3_GENGAR}, + {sScene3_Swipe_Gfx, 0xA00, GFXTAG_SCENE3_SWIPE}, + {sScene3_RecoilDust_Gfx, 0x200, GFXTAG_SCENE3_RECOIL_DUST} }; // POTENTIAL UB @@ -755,11 +834,11 @@ static const struct CompressedSpriteSheet sFightSceneSpriteSheets[] = { // Because such an entry is absent in this case, the function // continues reading into the next .rodata section. static const struct SpritePalette sFightSceneSpritePalettes[] = { - {sSpritePals_Gengar, 6}, - {sSpritePals_Nidorino, 7}, - {sSpritePals_Grass, 8}, - {sSpritePals_GengarSwipe, 10}, - {sSpritePals_NidorinoRecoilDust, 11}, + {sGengar_Pal, PALTAG_GENGAR}, + {sNidorino_Pal, PALTAG_NIDORINO}, + {sScene3_Grass_Pal, PALTAG_SCENE3_GRASS}, + {sScene3_Swipe_Pal, PALTAG_SCENE3_SWIPE}, + {sScene3_RecoilDust_Pal, PALTAG_SCENE3_RECOIL_DUST}, #ifdef BUGFIX {0} #endif @@ -778,19 +857,19 @@ static void CB2_WaitFadeBeforeSetUpIntro(void) SetMainCallback2(CB2_SetUpIntro); } -static void load_copyright_graphics(u16 charBase, u16 screenBase, u16 palOffset) +static void LoadCopyrightGraphics(u16 charBase, u16 screenBase, u16 palOffset) { - LZ77UnCompVram(sCopyrightGraphicsTiles, (void *)BG_VRAM + charBase); - LZ77UnCompVram(sCopyrightGraphicsMap, (void *)BG_VRAM + screenBase); - LoadPalette(sCopyrightGraphicsPal, palOffset, 0x20); + LZ77UnCompVram(sCopyright_Gfx, (void *)BG_VRAM + charBase); + LZ77UnCompVram(sCopyright_Map, (void *)BG_VRAM + screenBase); + LoadPalette(sCopyright_Pal, palOffset, 0x20); } -static void SerialCb_CopyrightScreen(void) +static void SerialCB_CopyrightScreen(void) { GameCubeMultiBoot_HandleSerialInterrupt(&sGcmb); } -static bool8 RunCopyrightScreen(void) +static bool8 SetUpCopyrightScreen(void) { switch (gMain.state) { @@ -807,17 +886,17 @@ static bool8 RunCopyrightScreen(void) DmaFill32(3, 0, OAM, OAM_SIZE); DmaFill16(3, 0, PLTT + sizeof(vu16), PLTT_SIZE - sizeof(vu16)); ResetPaletteFade(); - load_copyright_graphics(0 * BG_CHAR_SIZE, 7 * BG_SCREEN_SIZE, 0); + LoadCopyrightGraphics(0 * BG_CHAR_SIZE, 7 * BG_SCREEN_SIZE, 0); ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); - BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0xFFFF); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_WHITEALPHA); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(7)); EnableInterrupts(INTR_FLAG_VBLANK); SetVBlankCallback(VBlankCB_Copyright); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON); - SetSerialCallback(SerialCb_CopyrightScreen); + SetSerialCallback(SerialCB_CopyrightScreen); GameCubeMultiBoot_Init(&sGcmb); // fallthrough default: @@ -841,11 +920,10 @@ static bool8 RunCopyrightScreen(void) { if (sGcmb.gcmb_field_2 == 2) { - // Gc6e - if (*((u32 *)0x020000AC) == 0x65366347) + if (*(u32 *)(EWRAM_START + 0xAC) == COLOSSEUM_GAME_CODE) { CpuCopy16(gMultiBootProgram_PokemonColosseum_Start, (void *)EWRAM_START, 0x28000); - *((u32 *)0x020000AC) = 0x65366347; + *(u32 *)(EWRAM_START + 0xAC) = COLOSSEUM_GAME_CODE; } GameCubeMultiBoot_ExecuteProgram(&sGcmb); } @@ -866,9 +944,9 @@ static bool8 RunCopyrightScreen(void) return TRUE; } -void c2_copyright_1(void) +void CB2_InitCopyrightScreenAfterBootup(void) { - if (!RunCopyrightScreen()) + if (!SetUpCopyrightScreen()) { ResetMenuAndMonGlobals(); Save_ResetSaveCounters(); @@ -879,9 +957,9 @@ void c2_copyright_1(void) } } -void CB2_CopyrightScreen(void) +void CB2_InitCopyrightScreenAfterTitleScreen(void) { - RunCopyrightScreen(); + SetUpCopyrightScreen(); } static void CB2_SetUpIntro(void) @@ -908,10 +986,10 @@ static void CB2_SetUpIntro(void) InitBgsFromTemplates(0, sBgTemplates_GameFreakScene, NELEMS(sBgTemplates_GameFreakScene)); break; case 1: - LoadPalette(sBg3Pal_GameFreakPresents, 0x00, 0x20); - DecompressAndCopyTileDataToVram(3, sBg3Tiles_GameFreakPresents, 0, 0, 0); - DecompressAndCopyTileDataToVram(3, sBg3Map_GameFreakPresents, 0, 0, 1); - LoadPalette(sSpritePals_GameFreakPresents, 0xD0, 0x20); + LoadPalette(sGameFreakBg_Pal, 0x00, 0x20); + DecompressAndCopyTileDataToVram(BG_GF_BACKGROUND, sGameFreakBg_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_GF_BACKGROUND, sGameFreakBg_Map, 0, 0, 1); + LoadPalette(sGameFreakLogo_Pal, 0xD0, 0x20); break; case 2: if (!FreeTempTileDataBuffersIfPossible()) @@ -985,12 +1063,12 @@ static void IntroCB_Init(struct IntroSequenceData * this) switch (this->state) { case 0: - InitWindows(sWindowTemplate); - LZ77UnCompWram(sBlit_GameFreakText, this->gamefreakTextBitmap); - LZ77UnCompWram(sSpriteTiles_GameFreakLogoArt, this->gamefreakLogoArtSpriteTiles); - FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 0x11); + InitWindows(sWindowTemplate_GameFreakTextLogo); + LZ77UnCompWram(sGameFreakText_Gfx, this->gameFreakTextGfx); + LZ77UnCompWram(sGameFreakLogo_Gfx, this->gameFreakLogoGfx); + FillBgTilemapBufferRect(BG_GF_TEXT_LOGO, 0x000, 0, 0, 32, 32, 0x11); FillWindowPixelBuffer(0, PIXEL_FILL(0)); - BlitBitmapToWindow(0, this->gamefreakTextBitmap, 0, 40, 144, 16); + BlitBitmapToWindow(0, this->gameFreakTextGfx, 0, 40, 144, 16); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); this->state++; @@ -1068,8 +1146,7 @@ static void IntroCB_GameFreakScene_RevealGameFreakText(struct IntroSequenceData this->state++; break; case 1: - this->data[5]++; - if (this->data[5] >= 40) + if (++this->data[5] >= 40) this->state++; break; case 2: @@ -1090,8 +1167,7 @@ static void IntroCB_GameFreakScene_RevealGameFreakText(struct IntroSequenceData } break; case 5: - this->data[5]++; - if (this->data[5] > 50) + if (++this->data[5] > 50) SetIntroCB(this, IntroCB_GameFreakScene_CreateGameFreakLogo); break; } @@ -1116,8 +1192,8 @@ static void IntroCB_GameFreakScene_CreateGameFreakLogo(struct IntroSequenceData case 2: if (!IsBlendTaskActive()) { - BlitBitmapToWindow(0, this->gamefreakLogoArtSpriteTiles, 0x38, 0x06, 0x20, 0x40); - BlitBitmapToWindow(0, this->gamefreakTextBitmap, 0x00, 0x28, 0x90, 0x10); + BlitBitmapToWindow(0, this->gameFreakLogoGfx, 0x38, 0x06, 0x20, 0x40); + BlitBitmapToWindow(0, this->gameFreakTextGfx, 0x00, 0x28, 0x90, 0x10); CopyWindowToVram(0, COPYWIN_GFX); this->state++; } @@ -1126,14 +1202,15 @@ static void IntroCB_GameFreakScene_CreateGameFreakLogo(struct IntroSequenceData if (!IsDma3ManagerBusyWithBgCopy()) { DestroySprite(this->gameFreakLogoArtSprite); - Rev1_GameFreakScene_CreatePresentsText(); + #if REVISION >= 1 + CreateGameFreakPresentsText(); + #endif this->data[5] = 0; this->state++; } break; case 4: - this->data[5]++; - if (this->data[5] > 90) + if (++this->data[5] > 90) { SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2); StartBlendTask(16, 0, 0, 16, 20, 0); @@ -1143,7 +1220,7 @@ static void IntroCB_GameFreakScene_CreateGameFreakLogo(struct IntroSequenceData case 5: if (!IsBlendTaskActive()) { - HideBg(2); + HideBg(BG_GF_TEXT_LOGO); this->state++; } break; @@ -1154,8 +1231,7 @@ static void IntroCB_GameFreakScene_CreateGameFreakLogo(struct IntroSequenceData this->state++; break; case 7: - this->data[5]++; - if (this->data[5] > 20) + if (++this->data[5] > 20) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetIntroCB(this, IntroCB_FightScene); @@ -1170,16 +1246,16 @@ static void IntroCB_FightScene(struct IntroSequenceData * this) { case 0: SetVBlankCallback(NULL); - LoadPalette(sBg0Pal_FightScene1, 0x10, 0x20); - LoadPalette(sBg1Pal_FightScene1, 0x20, 0x20); + LoadPalette(sScene1_Grass_Pal, 0x10, 0x20); + LoadPalette(sScene1_Bg_Pal, 0x20, 0x20); BlendPalettes(0x00000006, 0x10, RGB_WHITE); - InitBgsFromTemplates(0, sBgTemplates_FightScene1, NELEMS(sBgTemplates_FightScene1)); - DecompressAndCopyTileDataToVram(1, sBg1Tiles_FightScene1, 0, 0, 0); - DecompressAndCopyTileDataToVram(1, sBg1Map_FightScene1, 0, 0, 1); - ShowBg(1); - HideBg(0); - HideBg(2); - HideBg(3); + InitBgsFromTemplates(0, sBgTemplates_Scene1, NELEMS(sBgTemplates_Scene1)); + DecompressAndCopyTileDataToVram(BG_SCENE1_BACKGROUND, sScene1_Bg_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_SCENE1_BACKGROUND, sScene1_Bg_Map, 0, 0, 1); + ShowBg(BG_SCENE1_BACKGROUND); + HideBg(BG_SCENE1_GRASS); + HideBg(BG_SCENE1_UNUSED1); + HideBg(BG_SCENE1_UNUSED2); LoadFightSceneSpriteTilesAndPals(); SetVBlankCallback(VBlankCB_Intro); this->state++; @@ -1187,17 +1263,17 @@ static void IntroCB_FightScene(struct IntroSequenceData * this) case 1: if (!FreeTempTileDataBuffersIfPossible()) { - DecompressAndCopyTileDataToVram(0, sBg0Tiles_FightScene1, 0, 0, 0); - DecompressAndCopyTileDataToVram(0, sBg0Map_FightScene1, 0, 0, 1); + DecompressAndCopyTileDataToVram(BG_SCENE1_GRASS, sScene1_Grass_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_SCENE1_GRASS, sScene1_Grass_Map, 0, 0, 1); ResetBgPositions(); - ShowBg(1); + ShowBg(BG_SCENE1_BACKGROUND); this->state++; } break; case 2: if (!FreeTempTileDataBuffersIfPossible()) { - ShowBg(0); + ShowBg(BG_SCENE1_GRASS); CreateTask(Task_FightScene1_GrassyFieldAnim, 0); BeginNormalPaletteFade(0x00000006, -2, 16, 0, RGB_WHITE); this->state++; @@ -1241,19 +1317,17 @@ static void Task_FightScene1_GrassyFieldAnim(u8 taskId) { s16 * data = gTasks[taskId].data; - data[0]++; - if (data[0] > 5) + if (++data[0] > 5) { data[0] = 0; - data[1]++; - if (data[1] > 2) + if (++data[1] > 2) data[1] = 0; - ChangeBgY(0, data[1] << 15, 0); + ChangeBgY(BG_SCENE1_GRASS, data[1] << 15, 0); } if (data[2]) { data[3] += 0x120; - ChangeBgY(0, data[3], 2); + ChangeBgY(BG_SCENE1_GRASS, data[3], 2); } } @@ -1267,13 +1341,12 @@ static void Task_FightScene1_ZoomEffect(u8 taskId) { s16 * data = gTasks[taskId].data; - data[0]++; - if (data[0] > 3) + if (++data[0] > 3) { data[0] = 0; if (data[1] < 2) data[1]++; - ChangeBgY(1, data[1] << 15, 0); + ChangeBgY(BG_SCENE1_BACKGROUND, data[1] << 15, 0); } } @@ -1283,32 +1356,32 @@ static void IntroCB_FightScene2(struct IntroSequenceData * this) { case 0: BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE); - InitBgsFromTemplates(0, sBgTemplates_FightScene2, NELEMS(sBgTemplates_FightScene2)); - DecompressAndCopyTileDataToVram(3, sBg3Tiles_FightScene2, 0, 0, 0); - DecompressAndCopyTileDataToVram(3, sBg3Map_FightScene2, 0, 0, 1); - ShowBg(3); + InitBgsFromTemplates(0, sBgTemplates_Scene2, NELEMS(sBgTemplates_Scene2)); + DecompressAndCopyTileDataToVram(BG_SCENE2_BACKGROUND, sScene2_Bg_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_SCENE2_BACKGROUND, sScene2_Bg_Map, 0, 0, 1); + ShowBg(BG_SCENE2_BACKGROUND); this->state++; break; case 1: if (!FreeTempTileDataBuffersIfPossible()) { SetVBlankCallback(NULL); - LoadPalette(sBg3Pal_FightScene2, 0x10, 0x60); - LoadPalette(sSpritePals_Gengar, 0x50, 0x20); - LoadPalette(sBg1Pal_FightScene2, 0x60, 0x20); + LoadPalette(sScene2_Bg_Pal, 0x10, 0x60); + LoadPalette(sGengar_Pal, 0x50, 0x20); + LoadPalette(sScene2_NidorinoClose_Pal, 0x60, 0x20); BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE); - DecompressAndCopyTileDataToVram(0, sBg0Tiles_FightScene2, 0, 0, 0); - DecompressAndCopyTileDataToVram(0, sBg0Map_FightScene2, 0, 0, 1); - DecompressAndCopyTileDataToVram(1, sBg1Tiles_FightScene2, 0, 0, 0); - DecompressAndCopyTileDataToVram(1, sBg1Map_FightScene2, 0, 0, 1); - DecompressAndCopyTileDataToVram(2, sBg2Tiles_FightScene2, 0, 0, 0); - DecompressAndCopyTileDataToVram(2, sBg2Map_FightScene2, 0, 0, 1); + DecompressAndCopyTileDataToVram(BG_SCENE2_PLANTS, sScene2_Plants_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_SCENE2_PLANTS, sScene2_Plants_Map, 0, 0, 1); + DecompressAndCopyTileDataToVram(BG_SCENE2_NIDORINO, sScene2_NidorinoClose_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_SCENE2_NIDORINO, sScene2_NidorinoClose_Map, 0, 0, 1); + DecompressAndCopyTileDataToVram(BG_SCENE2_GENGAR, sScene2_GengarClose_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_SCENE2_GENGAR, sScene2_GengarClose_Map, 0, 0, 1); ResetBgPositions(); - ShowBg(0); - HideBg(1); - HideBg(2); - ChangeBgY(2, 0x0001CE00, 0); - ChangeBgY(1, 0x00002800, 0); + ShowBg(BG_SCENE2_PLANTS); + HideBg(BG_SCENE2_NIDORINO); // Hide bgs for scene 3 + HideBg(BG_SCENE2_GENGAR); + ChangeBgY(BG_SCENE2_GENGAR, 0x0001CE00, 0); + ChangeBgY(BG_SCENE2_NIDORINO, 0x00002800, 0); CreateTask(Task_FightScene2_CameraHorizPanEffect, 0); CreateMonStaticSprites(this); BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE); @@ -1331,18 +1404,17 @@ static void IntroCB_FightScene2(struct IntroSequenceData * this) } break; case 4: - this->data[5]++; - if (this->data[5] >= 60) + if (++this->data[5] >= 60) { this->data[5] = 0; DestroyTask(FindTaskIdByFunc(Task_FightScene2_CameraHorizPanEffect)); DestroyStaticMonSprites(this); CreateTask(Task_FightScene2_CameraVertPanEffect, 0); - ChangeBgY(3, 0x00010000, 0); - HideBg(0); - ShowBg(3); - ShowBg(1); - ShowBg(2); + ChangeBgY(BG_SCENE2_BACKGROUND, 0x00010000, 0); // Move background from upper half (wide shot) to lower half (close up) + HideBg(BG_SCENE2_PLANTS); + ShowBg(BG_SCENE2_BACKGROUND); + ShowBg(BG_SCENE2_NIDORINO); + ShowBg(BG_SCENE2_GENGAR); this->state++; } break; @@ -1354,8 +1426,7 @@ static void IntroCB_FightScene2(struct IntroSequenceData * this) } break; case 6: - this->data[5]++; - if (this->data[5] >= 60) + if (++this->data[5] >= 60) { DestroyTask(FindTaskIdByFunc(Task_FightScene2_CameraVertPanEffect)); SetIntroCB(this, IntroCB_FightScene3); @@ -1366,14 +1437,14 @@ static void IntroCB_FightScene2(struct IntroSequenceData * this) static void Task_FightScene2_CameraHorizPanEffect(u8 taskId) { - ChangeBgX(3, 0x0E0, 2); - ChangeBgX(0, 0x110, 1); + ChangeBgX(BG_SCENE2_BACKGROUND, 0x0E0, 2); + ChangeBgX(BG_SCENE2_PLANTS, 0x110, 1); } static void Task_FightScene2_CameraVertPanEffect(u8 taskId) { - ChangeBgY(2, 0x020, 1); - ChangeBgY(1, 0x024, 2); + ChangeBgY(BG_SCENE2_GENGAR, 0x020, 1); + ChangeBgY(BG_SCENE2_NIDORINO, 0x024, 2); } static void CreateMonStaticSprites(struct IntroSequenceData * this) @@ -1383,11 +1454,11 @@ static void CreateMonStaticSprites(struct IntroSequenceData * this) this->gengarStaticSprite = NULL; this->nidorinoStaticSprite = NULL; - spriteId = CreateSprite(&sSpriteTemplate_NidorinoStatic, 168, 80, 11); + spriteId = CreateSprite(&sSpriteTemplate_Scene2_Nidorino, 168, 80, 11); if (spriteId != MAX_SPRITES) this->nidorinoStaticSprite = &gSprites[spriteId]; - spriteId = CreateSprite(&sSpriteTemplate_GengarStatic, 72, 80, 12); + spriteId = CreateSprite(&sSpriteTemplate_Scene2_Gengar, 72, 80, 12); if (spriteId != MAX_SPRITES) this->gengarStaticSprite = &gSprites[spriteId]; } @@ -1405,16 +1476,16 @@ static void IntroCB_FightScene3(struct IntroSequenceData * this) switch (this->state) { case 0: - LoadPalette(sBg1Pal_FightScene3, 0x10, 0x40); - LoadPalette(sSpritePals_Gengar, 0x50, 0x20); + LoadPalette(sScene3_Bg_Pal, 0x10, 0x40); + LoadPalette(sGengar_Pal, 0x50, 0x20); BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE); - InitBgsFromTemplates(0, sBgTemplates_FightScene3, NELEMS(sBgTemplates_FightScene3)); - DecompressAndCopyTileDataToVram(1, sBg1Tiles_FightScene3, 0, 0, 0); - DecompressAndCopyTileDataToVram(1, sBg1Map_FightScene3, 0, 0, 1); - ShowBg(1); - HideBg(0); - HideBg(2); - HideBg(3); + InitBgsFromTemplates(0, sBgTemplates_Scene3, NELEMS(sBgTemplates_Scene3)); + DecompressAndCopyTileDataToVram(BG_SCENE3_BACKGROUND, sScene3_Bg_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_SCENE3_BACKGROUND, sScene3_Bg_Map, 0, 0, 1); + ShowBg(BG_SCENE3_BACKGROUND); + HideBg(BG_SCENE3_GENGAR); + HideBg(BG_SCENE3_UNUSED1); + HideBg(BG_SCENE3_UNUSED2); ResetBgPositions(); this->state++; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); @@ -1427,12 +1498,12 @@ static void IntroCB_FightScene3(struct IntroSequenceData * this) case 1: if (!FreeTempTileDataBuffersIfPossible()) { - DecompressAndCopyTileDataToVram(0, sBg0Tiles_FightScene3, 0, 0, 0); - DecompressAndCopyTileDataToVram(0, sBg0Map_FightScene3, 0, 0, 1); + DecompressAndCopyTileDataToVram(BG_SCENE3_GENGAR, sScene3_GengarAnim_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_SCENE3_GENGAR, sScene3_GengarAnim_Map, 0, 0, 1); gUnknown_203AB00 = 4; gUnknown_203AB02 = 52; - ChangeBgX(0, 0x00001800, 0); - ChangeBgY(0, 0x0001F000, 0); + ChangeBgX(BG_SCENE3_GENGAR, 0x00001800, 0); + ChangeBgY(BG_SCENE3_GENGAR, 0x0001F000, 0); this->state++; } break; @@ -1440,7 +1511,7 @@ static void IntroCB_FightScene3(struct IntroSequenceData * this) if (!FreeTempTileDataBuffersIfPossible()) { BlendPalettes(0xFFFFFFFE, 0, RGB_WHITE); - ShowBg(0); + ShowBg(BG_SCENE3_GENGAR); CreateTask(Task_FightScene3_ForestBgScroll, 0); CreateNidorinoAnimSprite(this); StartNidorinoAnimSpriteSlideIn(this->nidorinoAnimSprite, 0, 0xB4, 0x34); @@ -1451,8 +1522,7 @@ static void IntroCB_FightScene3(struct IntroSequenceData * this) } break; case 3: - this->data[5]++; - if (this->data[5] == 16) + if (++this->data[5] == 16) CreateGrassSprite(this); if (!IsNidorinoAnimSpriteSlideInRunning(this) && !FuncIsActiveTask(Task_FightScene3_Bg0Scroll)) SetIntroCB(this, IntroCB_FightScene4); @@ -1463,9 +1533,9 @@ static void IntroCB_FightScene3(struct IntroSequenceData * this) static void Task_FightScene3_Bg1Scroll(u8 taskId) { if (gTasks[taskId].data[0] == 0) - ChangeBgX(1, 0x400, 2); + ChangeBgX(BG_SCENE3_BACKGROUND, 0x400, 2); else - ChangeBgX(1, 0x020, 2); + ChangeBgX(BG_SCENE3_BACKGROUND, 0x020, 2); } static void FightScene3_StartBg1Scroll(void) @@ -1484,12 +1554,11 @@ static void Task_FightScene3_ForestBgScroll(u8 taskId) s16 * data = gTasks[taskId].data; if (data[0] == 0) { - data[1]++; - if (data[1] >= 30) + if (++data[1] >= 30) { data[1] = 0; data[2] ^= 1; - ChangeBgY(0, (data[2] << 15) + 0x1F000, 0); + ChangeBgY(BG_SCENE3_GENGAR, (data[2] << 15) + 0x1F000, 0); } } } @@ -1566,8 +1635,7 @@ static void IntroCB_FightScene4(struct IntroSequenceData * this) this->state++; break; case 1: - this->data[5]++; - if (this->data[5] > 30) + if (++this->data[5] > 30) { FightScene4_NidorinoRearsUp(this); this->state++; @@ -1581,8 +1649,7 @@ static void IntroCB_FightScene4(struct IntroSequenceData * this) } break; case 3: - this->data[5]++; - if (this->data[5] > 30) + if (++this->data[5] > 30) { FightScene3_PauseForestBgScroll(); FightScene4_StartGengarAttack(this); @@ -1606,8 +1673,7 @@ static void IntroCB_FightScene4(struct IntroSequenceData * this) } break; case 6: - this->data[5]++; - if (this->data[5] > 16) + if (++this->data[5] > 16) { StartSpriteHopToPosAnim(this->nidorinoAnimSprite, 8, 12, 5); this->state++; @@ -1628,8 +1694,7 @@ static void IntroCB_FightScene4(struct IntroSequenceData * this) } break; case 9: - this->data[5]++; - if (this->data[5] > 20) + if (++this->data[5] > 20) { StartNidorinoAnim_LaunchSelfAtGengarAnim(this); this->data[5] = 0; @@ -1645,13 +1710,12 @@ static void IntroCB_FightScene4(struct IntroSequenceData * this) } break; case 11: - HideBg(0); + HideBg(BG_SCENE3_GENGAR); this->data[5] = 0; this->state++; break; case 12: - this->data[5]++; - if (this->data[5] == 48) + if (++this->data[5] == 48) BeginNormalPaletteFade(0x00000006, 2, 0, 16, RGB_WHITE); if (this->data[5] > 120) { @@ -1662,8 +1726,7 @@ static void IntroCB_FightScene4(struct IntroSequenceData * this) } break; case 13: - this->data[5]++; - if (this->data[5] > 8) + if (++this->data[5] > 8) { CpuFill16(RGB_WHITE, gPlttBufferUnfaded + 16, 64); BeginNormalPaletteFade(0xFFFFFFFE, -2, 0, 16, RGB_BLACK); @@ -1678,8 +1741,7 @@ static void IntroCB_FightScene4(struct IntroSequenceData * this) } break; case 15: - this->data[5]++; - if (this->data[5] > 60) + if (++this->data[5] > 60) SetIntroCB(this, IntroCB_CleanUp); break; default: @@ -1705,18 +1767,18 @@ static void CreateGengarBackSprite(struct IntroSequenceData * this) int i; // Not using a subsprite table for this - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_GENGAR_BACK_SPRITES; i++) { int x = (i & 1) * 48 + 49; int y = (i / 2) * 64 + 72; - u8 spriteId = CreateSprite(&sSpriteTemplate_GengarBack, x, y, 8); + u8 spriteId = CreateSprite(&sSpriteTemplate_Scene3_Gengar, x, y, 8); if (spriteId != MAX_SPRITES) { StartSpriteAnim(&gSprites[spriteId], i); - this->gengarBackSpriteArray[i] = &gSprites[spriteId]; + this->gengarBackSprites[i] = &gSprites[spriteId]; if (i & 1) - this->gengarBackSpriteArray[i]->oam.shape = ST_OAM_V_RECTANGLE; - FightScene_CalcCenterToCornerVec(this->gengarBackSpriteArray[i]); + this->gengarBackSprites[i]->oam.shape = ST_OAM_V_RECTANGLE; + FightScene_CalcCenterToCornerVec(this->gengarBackSprites[i]); } } } @@ -1738,11 +1800,11 @@ static void FightScene4_StartGengarAffineAnim(struct IntroSequenceData * this) { int i; - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_GENGAR_BACK_SPRITES; i++) { - StartSpriteAffineAnim(this->gengarBackSpriteArray[i], 1); - this->gengarBackSpriteArray[i]->callback = SpriteCB_DummyButNotDummy; - obj_pos2_update_enable(this->gengarBackSpriteArray[i], sGengarBackSpritePos2UpdateMods[i][0], sGengarBackSpritePos2UpdateMods[i][1]); + StartSpriteAffineAnim(this->gengarBackSprites[i], 1); + this->gengarBackSprites[i]->callback = SpriteCB_DummyButNotDummy; + obj_pos2_update_enable(this->gengarBackSprites[i], sGengarBackSpritePos2UpdateMods[i][0], sGengarBackSpritePos2UpdateMods[i][1]); } } @@ -1774,9 +1836,7 @@ static void GameFreakScene_LoadGfxCreateStar(void) static EWRAM_DATA u32 sTrailingSparklesRngSeed = 0; for (i = 0; i < NELEMS(sSpriteSheets_GameFreakScene); i++) - { LoadCompressedSpriteSheet(&sSpriteSheets_GameFreakScene[i]); - } LoadSpritePalettes(sSpritePalettes_GameFreakScene); sLargeStarXSpeed = 0x60; sLargeStarYSpeed = 0x10; @@ -1791,7 +1851,7 @@ static void GameFreakScene_LoadGfxCreateStar(void) sTrailingSparklesYprecision = 5; if (sTrailingSparklesRngSeed == 0) sTrailingSparklesRngSeed = 354128453; - spriteId = CreateSprite(&sSpriteTemplate_LargeStar, 0xF8, 0x37, 0); + spriteId = CreateSprite(&sSpriteTemplate_Star, 0xF8, 0x37, 0); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[0] = 0xF80; @@ -1809,14 +1869,13 @@ static void GameFreakScene_TrailingSparklesGen(s16 x, s16 y, u16 a2) u8 spriteId; s16 xMod = (a2 & sTrailingSparklesXmodMask) + 2; s16 yMod = sYmod; - sYmod++; - if (sYmod > 3) + if (++sYmod > 3) sYmod = -3; x += xMod; y += yMod; - if (x >= 1 && x <= 0xEF) + if (x > 0 && x < DISPLAY_WIDTH) { - spriteId = CreateSprite(&sSpriteTemplate_TrailingSparkles, x, y, 1); + spriteId = CreateSprite(&sSpriteTemplate_SparklesSmall, x, y, 1); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[0] = x << sTrailingSparklesXprecision; @@ -1843,19 +1902,17 @@ static void Task_GameFreakScene_TrailingSparkleSpawner(u8 taskId) { data[2] = 0; r6 = data[0]; - spriteId = CreateSprite(&sSpriteTemplate_TrailingSparkles, sTrailingSparkleCoords[r6].x, sTrailingSparkleCoords[r6].y, 2); + spriteId = CreateSprite(&sSpriteTemplate_SparklesSmall, sTrailingSparkleCoords[r6].x, sTrailingSparkleCoords[r6].y, 2); StartSpriteAnim(&gSprites[spriteId], 1); - gSprites[spriteId].callback = SpriteCB_TrailingSparkles2; + gSprites[spriteId].callback = SpriteCB_SparklesSmall2; gSprites[spriteId].data[1] = sTrailingSparkleCoords[r6].y << 4; gSprites[spriteId].data[2] = 120; gSprites[spriteId].data[3] = data[1]; if (gSprites[spriteId].data[3] < 0) gSprites[spriteId].data[3] = 1; - data[0]++; - if (data[0] >= NELEMS(sTrailingSparkleCoords)) + if (++data[0] >= NELEMS(sTrailingSparkleCoords)) { - data[1]++; - if (data[1] > 1) + if (++data[1] > 1) DestroyTask(taskId); else data[0] = 0; @@ -1879,13 +1936,11 @@ static void Task_RevealGameFreakTextSparklesSpawner(u8 taskId) data[1] += 4; if (data[1] >= NELEMS(sTrailingSparkleCoords)) data[1] -= NELEMS(sTrailingSparkleCoords); - CreateSprite(&sSpriteTemplate_RevealGameFreakTextSparkles, sTrailingSparkleCoords[r2].x, sTrailingSparkleCoords[r2].y, 3); - data[2]++; - if (data[2] > 8) + CreateSprite(&sSpriteTemplate_SparklesBig, sTrailingSparkleCoords[r2].x, sTrailingSparkleCoords[r2].y, 3); + if (++data[2] > 8) DestroyTask(taskId); } - data[0]++; - if (data[0] > 9) + if (++data[0] > 9) data[0] = 0; } @@ -1896,13 +1951,11 @@ static struct Sprite *CreateGameFreakLogoArtSprite(void) } #if REVISION >= 1 -static void Rev1_GameFreakScene_CreatePresentsText(void) +static void CreateGameFreakPresentsText(void) { int i; for (i = 0; i < 2; i++) - { gSprites[CreateSprite(&sSpriteTemplate_PresentsText, 0x68 + 32 * i, 0x6c, 5)].oam.tileNum += i * 4; - } } #endif @@ -1913,15 +1966,15 @@ static void FightScene4_StartGengarAttack(struct IntroSequenceData * this) taskId = CreateTask(Task_FightScene4_GengarAttack, 4); SetWordTaskArg(taskId, 5, (uintptr_t)this); gTasks[taskId].data[3] = 64; - gTasks[taskId].data[4] = GetBgX(0); + gTasks[taskId].data[4] = GetBgX(BG_SCENE3_GENGAR); } static void FightScene4_ApplyGengarAnim(int a, int b, int c, int d) { - ChangeBgY(0, (a << 15) + 0x1F000, 0); - ChangeBgX(0, d, 0); - ChangeBgX(0, b << 8, 2); - ChangeBgY(0, c << 8, 2); + ChangeBgY(BG_SCENE3_GENGAR, (a << 15) + 0x1F000, 0); + ChangeBgX(BG_SCENE3_GENGAR, d, 0); + ChangeBgX(BG_SCENE3_GENGAR, b << 8, 2); + ChangeBgY(BG_SCENE3_GENGAR, c << 8, 2); } static void Task_FightScene4_GengarAttack(u8 taskId) @@ -1940,16 +1993,14 @@ static void Task_FightScene4_GengarAttack(u8 taskId) break; case 1: data[3] -= 2; - data[1]++; - if (data[1] > 15) + if (++data[1] > 15) { data[1] = 0; data[0]++; } break; case 2: - data[1]++; - if (data[1] == 14) + if (++data[1] == 14) ((struct IntroSequenceData *)GetWordTaskArg(taskId, 5))->gengarAttackLanded = TRUE; if (data[1] > 15) { @@ -1959,8 +2010,7 @@ static void Task_FightScene4_GengarAttack(u8 taskId) break; case 3: data[3] += 8; - data[1]++; - if (data[1] == 4) + if (++data[1] == 4) { FightScene4_CreateGengarSwipeSprites(); data[8] = 32; @@ -1975,8 +2025,7 @@ static void Task_FightScene4_GengarAttack(u8 taskId) break; case 4: data[3] -= 8; - data[1]++; - if (data[1] > 3) + if (++data[1] > 3) { data[7] = 0; data[3] = 64; @@ -2028,15 +2077,14 @@ static void Task_FightScene3_Bg0Scroll(u8 taskId) data[0]++; // fallthrough case 1: - data[2]++; - if (data[2] > 39 && data[1] > 16) + if (++data[2] > 39 && data[1] > 16) data[1] -= 16; - gUnknown_203AB30 = ChangeBgX(0, data[1], 1); + gUnknown_203AB30 = ChangeBgX(BG_SCENE3_GENGAR, data[1], 1); if (gUnknown_203AB30 >= 0x8000) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); if (gUnknown_203AB30 >= 0xEF00) { - ChangeBgX(0, 0xEF00, 0); + ChangeBgX(BG_SCENE3_GENGAR, 0xEF00, 0); DestroyTask(taskId); } break; @@ -2056,7 +2104,7 @@ static void SpriteCB_LargeStar(struct Sprite *sprite) if (sprite->data[5] % sTrailingSparklesSpawnRate) { LoadWordFromTwoHalfwords(&sprite->data[6], &v); - v = v * 1103515245 + 24691; + v = ISO_RANDOMIZE1(v); StoreWordInTwoHalfwords(&sprite->data[6], v); v >>= 16; GameFreakScene_TrailingSparklesGen(sprite->x, sprite->y + sprite->y2, v); @@ -2065,7 +2113,7 @@ static void SpriteCB_LargeStar(struct Sprite *sprite) DestroySprite(sprite); } -static void SpriteCB_TrailingSparkles(struct Sprite *sprite) +static void SpriteCB_SparklesSmall(struct Sprite *sprite) { u32 v; @@ -2088,7 +2136,7 @@ static void SpriteCB_TrailingSparkles(struct Sprite *sprite) DestroySprite(sprite); } -static void SpriteCB_TrailingSparkles2(struct Sprite *sprite) +static void SpriteCB_SparklesSmall2(struct Sprite *sprite) { if (sprite->data[2]) { @@ -2131,8 +2179,7 @@ static void SpriteCB_TrailingSparkles2(struct Sprite *sprite) StartSpriteAnim(sprite, 0); sprite->data[1] += 4; sprite->y = sprite->data[1] >> 4; - sprite->data[4]++; - if (sprite->data[4] > 50) + if (++sprite->data[4] > 50) DestroySprite(sprite); } } @@ -2145,7 +2192,7 @@ static void SpriteCB_RevealGameFreakTextSparkles(struct Sprite *sprite) static void CreateNidorinoAnimSprite(struct IntroSequenceData * this) { - u8 spriteId = CreateSprite(&sSpriteTemplate_NidorinoAnim, 0, 0, 9); + u8 spriteId = CreateSprite(&sSpriteTemplate_Scene3_Nidorino, 0, 0, 9); this->nidorinoAnimSprite = &gSprites[spriteId]; } @@ -2163,8 +2210,7 @@ static void StartNidorinoAnimSpriteSlideIn(struct Sprite *sprite, s16 x0, s16 x1 static void SpriteCB_NidorinoAnimSpriteSlideIn(struct Sprite *sprite) { - sprite->data[4]++; - if (sprite->data[4] >= 40) + if (++sprite->data[4] >= 40) { if (sprite->data[1] > 1) sprite->data[1]--; @@ -2197,8 +2243,7 @@ static void SpriteCB_NidorinoRearsUp(struct Sprite *sprite) switch (sprite->data[0]) { case 0: - sprite->data[1]++; - if (sprite->data[1] > 8) + if (++sprite->data[1] > 8) { StartSpriteAnim(sprite, 1); sprite->y2 = 0; @@ -2211,14 +2256,12 @@ static void SpriteCB_NidorinoRearsUp(struct Sprite *sprite) sprite->data[0]++; break; case 2: - sprite->data[2]++; - if (sprite->data[2] > 1) + if (++sprite->data[2] > 1) { sprite->data[2] = 0; sprite->y2 = sprite->y2 == 0 ? 1 : 0; } - sprite->data[1]++; - if (sprite->data[1] > 48) + if (++sprite->data[1] > 48) { StartSpriteAnim(sprite, 0); sprite->y2 = 0; @@ -2284,7 +2327,7 @@ static void SpriteCB_NidorinoRecoil(struct Sprite *sprite) if (sprite->data[1] > 6) { CreateNidorinoRecoilDustSprites(sprite->x + sprite->x2, sprite->y + sprite->y2, sprite->data[6]); - sprite->data[6] *= 1103515245; + sprite->data[6] *= RAND_MULT; } if (sprite->data[1] > 12) { @@ -2296,9 +2339,7 @@ static void SpriteCB_NidorinoRecoil(struct Sprite *sprite) case 3: sprite->data[1]++; if (sprite->data[1] > 16) - { StartSpriteHopToPosAnim(sprite, gUnknown_203AB0A, -sprite->x2, 4); - } break; } } @@ -2321,7 +2362,7 @@ static void CreateNidorinoRecoilDustSprites(s16 x, s16 y, s16 seed) gSprites[spriteId].data[3] = (seed % 13) + 8; gSprites[spriteId].data[4] = seed % 3; gSprites[spriteId].data[7] = i; - seed *= 1103515245; + seed *= RAND_MULT; } } } @@ -2346,8 +2387,7 @@ static void SpriteCB_NidorinoRecoilDust(struct Sprite *sprite) DestroySprite(sprite); break; } - data[7]++; - if (data[7] > 1) + if (++data[7] > 1) { data[7] = 0; sprite->invisible ^= TRUE; @@ -2373,8 +2413,7 @@ static void SpriteCB_HopToPos(struct Sprite *sprite) switch (sprite->data[0]) { case 0: - sprite->data[6]++; - if (sprite->data[6] > 4) + if (++sprite->data[6] > 4) { StartSpriteAnim(sprite, 3); sprite->data[6] = 0; @@ -2405,8 +2444,7 @@ static void SpriteCB_HopToPos(struct Sprite *sprite) } break; case 2: - sprite->data[6]++; - if (sprite->data[6] > 4) + if (++sprite->data[6] > 4) { StartSpriteAnim(sprite, 0); sprite->callback = SpriteCallbackDummy; @@ -2439,11 +2477,9 @@ static void SpriteCB_NidorinoAnim_LaunchSelfAtGengar(struct Sprite *sprite) switch (sprite->data[0]) { case 0: - sprite->data[1]++; - if (sprite->data[1] & 1) + if (++sprite->data[1] & 1) { - sprite->data[2]++; - if (sprite->data[2] & 1) + if (++sprite->data[2] & 1) sprite->x2++; else sprite->x2--; diff --git a/src/main.c b/src/main.c index 2f039c23b..368638022 100644 --- a/src/main.c +++ b/src/main.c @@ -206,7 +206,7 @@ static void InitMainCallbacks(void) gMain.vblankCounter1 = 0; gMain.vblankCounter2 = 0; gMain.callback1 = NULL; - SetMainCallback2(c2_copyright_1); + SetMainCallback2(CB2_InitCopyrightScreenAfterBootup); gSaveBlock2Ptr = &gSaveBlock2; gSaveBlock1Ptr = &gSaveBlock1; gSaveBlock2.encryptionKey = 0; diff --git a/src/pokemon_special_anim_scene.c b/src/pokemon_special_anim_scene.c index 0b1277113..518ac769d 100644 --- a/src/pokemon_special_anim_scene.c +++ b/src/pokemon_special_anim_scene.c @@ -8,6 +8,7 @@ #include "menu.h" #include "new_menu_helpers.h" #include "pokemon_special_anim_internal.h" +#include "random.h" #include "strings.h" #include "text_window.h" #include "trig.h" @@ -1303,7 +1304,7 @@ static void Task_UseItem_OutwardSpiralDots(u8 taskId) static u16 PSAScene_RandomFromTask(u8 taskId) { u32 state = GetWordTaskArg(taskId, tOff_RngState); - state = state * 1103515245 + 24691; + state = ISO_RANDOMIZE1(state); SetWordTaskArg(taskId, tOff_RngState, state); return state >> 16; } @@ -1441,8 +1442,7 @@ static void CreateLevelUpVerticalSprite(u8 taskId, s16 *data) { gSprites[spriteId].oam.priority = tPriority; gSprites[spriteId].tsYsubpixel = 0; - // similar to the LCRNG in random.c, but seeding from data[2] - gSprites[spriteId].tsSpeed = ((tMadeSprCt * 1103515245 + 24691) & 0x3F) + 0x20; + gSprites[spriteId].tsSpeed = (ISO_RANDOMIZE1(tMadeSprCt) & 0x3F) + 0x20; gSprites[spriteId].tsTaskId = taskId; tActiveSprCt++; } diff --git a/src/title_screen.c b/src/title_screen.c index c2aefa0bc..0ca5a10d1 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -9,6 +9,7 @@ #include "intro.h" #include "load_save.h" #include "new_game.h" +#include "random.h" #include "save.h" #include "main_menu.h" #include "clear_save_data_screen.h" @@ -662,7 +663,7 @@ static void SetTitleScreenScene_Restart(s16 * data) case 4: HelpSystem_Disable(); DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain)); - SetMainCallback2(CB2_CopyrightScreen); + SetMainCallback2(CB2_InitCopyrightScreenAfterTitleScreen); break; } } @@ -1121,7 +1122,7 @@ static u16 TitleScreen_rand(u8 taskId, u8 field) u32 rngval; rngval = GetWordTaskArg(taskId, field); - rngval = rngval * 1103515245 + 24691; + rngval = ISO_RANDOMIZE1(rngval); SetWordTaskArg(taskId, field, rngval); return rngval >> 16; } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index d3f076c43..2e9eba3ec 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -3,6 +3,7 @@ #include "wild_encounter.h" #include "event_data.h" #include "fieldmap.h" +#include "random.h" #include "roamer.h" #include "field_player_avatar.h" #include "battle_setup.h" @@ -668,8 +669,7 @@ void SeedWildEncounterRng(u16 seed) static u16 WildEncounterRandom(void) { - sWildEncounterData.rngState *= 1103515245; - sWildEncounterData.rngState += 12345; + sWildEncounterData.rngState = ISO_RANDOMIZE2(sWildEncounterData.rngState); return sWildEncounterData.rngState >> 16; } From fa9808f79d646437efc632e366355f8a66bddc15 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 23 Sep 2022 15:42:53 -0400 Subject: [PATCH 2/2] Document intro functions --- include/gba/io_reg.h | 9 +- include/sprite.h | 7 +- src/bg.c | 184 ++-- src/intro.c | 1812 ++++++++++++++++++++++---------------- src/minigame_countdown.c | 3 +- src/sprite.c | 69 +- 6 files changed, 1168 insertions(+), 916 deletions(-) diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 548e27163..53b60d5b6 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -552,6 +552,7 @@ #define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) #define WININ_WIN0_OBJ (1 << 4) #define WININ_WIN0_CLR (1 << 5) +#define WININ_WIN0_ALL (WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR) #define WININ_WIN1_BG0 (1 << 8) #define WININ_WIN1_BG1 (1 << 9) #define WININ_WIN1_BG2 (1 << 10) @@ -559,6 +560,7 @@ #define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3) #define WININ_WIN1_OBJ (1 << 12) #define WININ_WIN1_CLR (1 << 13) +#define WININ_WIN1_ALL (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR) #define WINOUT_WIN01_BG0 (1 << 0) #define WINOUT_WIN01_BG1 (1 << 1) @@ -567,6 +569,7 @@ #define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3) #define WINOUT_WIN01_OBJ (1 << 4) #define WINOUT_WIN01_CLR (1 << 5) +#define WINOUT_WIN01_ALL (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR) #define WINOUT_WINOBJ_BG0 (1 << 8) #define WINOUT_WINOBJ_BG1 (1 << 9) #define WINOUT_WINOBJ_BG2 (1 << 10) @@ -574,6 +577,7 @@ #define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3) #define WINOUT_WINOBJ_OBJ (1 << 12) #define WINOUT_WINOBJ_CLR (1 << 13) +#define WINOUT_WINOBJ_ALL (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR) #define WIN_RANGE(a, b) (((a) << 8) | (b)) #define WIN_RANGE2(a, b) ((b) | ((a) << 8)) @@ -584,8 +588,10 @@ #define BLDCNT_TGT1_BG1 (1 << 1) #define BLDCNT_TGT1_BG2 (1 << 2) #define BLDCNT_TGT1_BG3 (1 << 3) +#define BLDCNT_TGT1_BG_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3) #define BLDCNT_TGT1_OBJ (1 << 4) #define BLDCNT_TGT1_BD (1 << 5) +#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG_ALL | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD) // Bits 6-7 select the special effect #define BLDCNT_EFFECT_NONE (0 << 6) // no special effect #define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA) @@ -596,9 +602,10 @@ #define BLDCNT_TGT2_BG1 (1 << 9) #define BLDCNT_TGT2_BG2 (1 << 10) #define BLDCNT_TGT2_BG3 (1 << 11) +#define BLDCNT_TGT2_BG_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3) #define BLDCNT_TGT2_OBJ (1 << 12) #define BLDCNT_TGT2_BD (1 << 13) -#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD) +#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG_ALL | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD) // BLDALPHA #define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1)) diff --git a/include/sprite.h b/include/sprite.h index eed582775..6a1b27211 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -7,6 +7,9 @@ #define SPRITE_NONE 0xFF #define TAG_NONE 0xFFFF +// Given to SetSpriteMatrixAnchor to skip anchoring one of the coords. +#define NO_ANCHOR 0x800 + struct SpriteSheet { const void *data; // Raw uncompressed pixel data @@ -228,7 +231,7 @@ struct Sprite u16 animEnded:1; //0x10 u16 affineAnimEnded:1; //0x20 u16 usingSheet:1; //0x40 - u16 flags_f:1; //0x80 + u16 anchored:1; //0x80 /*0x40*/ u16 sheetTileStart; @@ -316,6 +319,6 @@ void ClearSpriteCopyRequests(void); void ResetAffineAnimData(void); void FreeSpriteTilesIfNotUsingSheet(struct Sprite *sprite); s16 AllocSpriteTiles(u16 tileCount); -void obj_pos2_update_enable(struct Sprite* sprite, s16 xmod, s16 ymod); +void SetSpriteMatrixAnchor(struct Sprite* sprite, s16 xmod, s16 ymod); #endif //GUARD_SPRITE_H diff --git a/src/bg.c b/src/bg.c index 287569fa6..251f42616 100644 --- a/src/bg.c +++ b/src/bg.c @@ -600,58 +600,58 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op) switch (op) { - case 0: - default: - sGpuBgConfigs2[bg].bg_x = value; - break; - case 1: - sGpuBgConfigs2[bg].bg_x += value; - break; - case 2: - sGpuBgConfigs2[bg].bg_x -= value; - break; + case BG_COORD_SET: + default: + sGpuBgConfigs2[bg].bg_x = value; + break; + case BG_COORD_ADD: + sGpuBgConfigs2[bg].bg_x += value; + break; + case BG_COORD_SUB: + sGpuBgConfigs2[bg].bg_x -= value; + break; } mode = GetBgMode(); switch (bg) { - case 0: - temp1 = sGpuBgConfigs2[0].bg_x >> 0x8; - SetGpuReg(REG_OFFSET_BG0HOFS, temp1); - break; - case 1: - temp1 = sGpuBgConfigs2[1].bg_x >> 0x8; - SetGpuReg(REG_OFFSET_BG1HOFS, temp1); - break; - case 2: - if (mode == 0) - { - temp1 = sGpuBgConfigs2[2].bg_x >> 0x8; - SetGpuReg(REG_OFFSET_BG2HOFS, temp1); - } - else - { - temp1 = sGpuBgConfigs2[2].bg_x >> 0x10; - temp2 = sGpuBgConfigs2[2].bg_x & 0xFFFF; - SetGpuReg(REG_OFFSET_BG2X_H, temp1); - SetGpuReg(REG_OFFSET_BG2X_L, temp2); - } - break; - case 3: - if (mode == 0) - { - temp1 = sGpuBgConfigs2[3].bg_x >> 0x8; - SetGpuReg(REG_OFFSET_BG3HOFS, temp1); - } - else if (mode == 2) - { - temp1 = sGpuBgConfigs2[3].bg_x >> 0x10; - temp2 = sGpuBgConfigs2[3].bg_x & 0xFFFF; - SetGpuReg(REG_OFFSET_BG3X_H, temp1); - SetGpuReg(REG_OFFSET_BG3X_L, temp2); - } - break; + case 0: + temp1 = sGpuBgConfigs2[0].bg_x >> 0x8; + SetGpuReg(REG_OFFSET_BG0HOFS, temp1); + break; + case 1: + temp1 = sGpuBgConfigs2[1].bg_x >> 0x8; + SetGpuReg(REG_OFFSET_BG1HOFS, temp1); + break; + case 2: + if (mode == 0) + { + temp1 = sGpuBgConfigs2[2].bg_x >> 0x8; + SetGpuReg(REG_OFFSET_BG2HOFS, temp1); + } + else + { + temp1 = sGpuBgConfigs2[2].bg_x >> 0x10; + temp2 = sGpuBgConfigs2[2].bg_x & 0xFFFF; + SetGpuReg(REG_OFFSET_BG2X_H, temp1); + SetGpuReg(REG_OFFSET_BG2X_L, temp2); + } + break; + case 3: + if (mode == 0) + { + temp1 = sGpuBgConfigs2[3].bg_x >> 0x8; + SetGpuReg(REG_OFFSET_BG3HOFS, temp1); + } + else if (mode == 2) + { + temp1 = sGpuBgConfigs2[3].bg_x >> 0x10; + temp2 = sGpuBgConfigs2[3].bg_x & 0xFFFF; + SetGpuReg(REG_OFFSET_BG3X_H, temp1); + SetGpuReg(REG_OFFSET_BG3X_L, temp2); + } + break; } return sGpuBgConfigs2[bg].bg_x; @@ -679,58 +679,58 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op) switch (op) { - case 0: - default: - sGpuBgConfigs2[bg].bg_y = value; - break; - case 1: - sGpuBgConfigs2[bg].bg_y += value; - break; - case 2: - sGpuBgConfigs2[bg].bg_y -= value; - break; + case BG_COORD_SET: + default: + sGpuBgConfigs2[bg].bg_y = value; + break; + case BG_COORD_ADD: + sGpuBgConfigs2[bg].bg_y += value; + break; + case BG_COORD_SUB: + sGpuBgConfigs2[bg].bg_y -= value; + break; } mode = GetBgMode(); switch (bg) { - case 0: - temp1 = sGpuBgConfigs2[0].bg_y >> 0x8; - SetGpuReg(REG_OFFSET_BG0VOFS, temp1); - break; - case 1: - temp1 = sGpuBgConfigs2[1].bg_y >> 0x8; - SetGpuReg(REG_OFFSET_BG1VOFS, temp1); - break; - case 2: - if (mode == 0) - { - temp1 = sGpuBgConfigs2[2].bg_y >> 0x8; - SetGpuReg(REG_OFFSET_BG2VOFS, temp1); - } - else - { - temp1 = sGpuBgConfigs2[2].bg_y >> 0x10; - temp2 = sGpuBgConfigs2[2].bg_y & 0xFFFF; - SetGpuReg(REG_OFFSET_BG2Y_H, temp1); - SetGpuReg(REG_OFFSET_BG2Y_L, temp2); - } - break; - case 3: - if (mode == 0) - { - temp1 = sGpuBgConfigs2[3].bg_y >> 0x8; - SetGpuReg(REG_OFFSET_BG3VOFS, temp1); - } - else if (mode == 2) - { - temp1 = sGpuBgConfigs2[3].bg_y >> 0x10; - temp2 = sGpuBgConfigs2[3].bg_y & 0xFFFF; - SetGpuReg(REG_OFFSET_BG3Y_H, temp1); - SetGpuReg(REG_OFFSET_BG3Y_L, temp2); - } - break; + case 0: + temp1 = sGpuBgConfigs2[0].bg_y >> 0x8; + SetGpuReg(REG_OFFSET_BG0VOFS, temp1); + break; + case 1: + temp1 = sGpuBgConfigs2[1].bg_y >> 0x8; + SetGpuReg(REG_OFFSET_BG1VOFS, temp1); + break; + case 2: + if (mode == 0) + { + temp1 = sGpuBgConfigs2[2].bg_y >> 0x8; + SetGpuReg(REG_OFFSET_BG2VOFS, temp1); + } + else + { + temp1 = sGpuBgConfigs2[2].bg_y >> 0x10; + temp2 = sGpuBgConfigs2[2].bg_y & 0xFFFF; + SetGpuReg(REG_OFFSET_BG2Y_H, temp1); + SetGpuReg(REG_OFFSET_BG2Y_L, temp2); + } + break; + case 3: + if (mode == 0) + { + temp1 = sGpuBgConfigs2[3].bg_y >> 0x8; + SetGpuReg(REG_OFFSET_BG3VOFS, temp1); + } + else if (mode == 2) + { + temp1 = sGpuBgConfigs2[3].bg_y >> 0x10; + temp2 = sGpuBgConfigs2[3].bg_y & 0xFFFF; + SetGpuReg(REG_OFFSET_BG3Y_H, temp1); + SetGpuReg(REG_OFFSET_BG3Y_L, temp2); + } + break; } return sGpuBgConfigs2[bg].bg_y; diff --git a/src/intro.c b/src/intro.c index d3f5fe1e4..f3621b143 100644 --- a/src/intro.c +++ b/src/intro.c @@ -73,6 +73,9 @@ enum { BG_SCENE1_UNUSED2 }; +#define PALSLOT_SCENE1_GRASS 1 +#define PALSLOT_SCENE1_BG 2 + // Background IDs for Scene 2 enum { BG_SCENE2_PLANTS, @@ -89,6 +92,35 @@ enum { BG_SCENE3_UNUSED2 }; +enum { + ANIM_NIDORINO_NORMAL, + ANIM_NIDORINO_CRY, + ANIM_NIDORINO_CROUCH, + ANIM_NIDORINO_HOP, + ANIM_NIDORINO_ATTACK, +}; + +enum { + ANIM_SPARKLE_LOOP, + ANIM_SPARKLE_ONCE, +}; + +enum { + ANIM_SWIPE_TOP, + ANIM_SWIPE_BOTTOM, +}; + +enum { + AFFINEANIM_NORMAL, + AFFINEANIM_ZOOM, +}; + +// Window ids for sWindowTemplates (only one) +enum { + WIN_GF_TEXT_LOGO, + WIN_COUNT +}; + #define NUM_GENGAR_BACK_SPRITES 4 #define COLOSSEUM_GAME_CODE 0x65366347 // "Gc6e" in ASCII @@ -103,13 +135,14 @@ struct IntroSequenceData u8 state; u8 taskId; bool8 gengarAttackLanded; - u16 data[6]; + u16 data[5]; // [0] and [1] are set but never read, the rest are unused + u16 timer; struct Sprite *gameFreakLogoArtSprite; - struct Sprite *nidorinoAnimSprite; - struct Sprite *gengarStaticSprite; - struct Sprite *nidorinoStaticSprite; - struct Sprite *grassSprite; - struct Sprite *gengarBackSprites[NUM_GENGAR_BACK_SPRITES]; + struct Sprite *scene3NidorinoSprite; + struct Sprite *scene2GengarSprite; + struct Sprite *scene2NidorinoSprite; + struct Sprite *scene3GrassSprite; + struct Sprite *scene3GengarSprites[NUM_GENGAR_BACK_SPRITES]; u8 unused0[4]; u8 gameFreakLogoGfx[0x400]; u8 gameFreakTextGfx[0x400]; @@ -117,26 +150,27 @@ struct IntroSequenceData }; // size: 0x28BC static EWRAM_DATA struct GcmbStruct sGcmb = {0}; -static EWRAM_DATA u16 gUnknown_203AB00 = 0; -static EWRAM_DATA u16 gUnknown_203AB02 = 0; -static EWRAM_DATA u16 gUnknown_203AB04 = 0; -static EWRAM_DATA u16 gUnknown_203AB06 = 0; -static EWRAM_DATA u16 gUnknown_203AB08 = 0; -static EWRAM_DATA u16 gUnknown_203AB0A = 0; -static EWRAM_DATA u16 gUnknown_203AB0C = 0; -static EWRAM_DATA u16 sLargeStarXSpeed = 0; -static EWRAM_DATA u16 sLargeStarYSpeed = 0; -static EWRAM_DATA u16 sTrailingSparklesXmodMask = 0; -static EWRAM_DATA u16 sUnusedVarRelatedToGameFreakStars = 0; -static EWRAM_DATA u16 sTrailingSparklesSpawnRate = 0; -static EWRAM_DATA u16 sTrailingSparklesFlickerStartTime = 0; -static EWRAM_DATA u16 sTrailingSparklesDestroySpriteTime = 0; -static EWRAM_DATA u16 sTrailingSparklesGravityShift = 0; -static EWRAM_DATA u16 sTrailingSparklesXspeed = 0; -static EWRAM_DATA u16 sTrailingSparklesYspeed = 0; -static EWRAM_DATA u16 sTrailingSparklesXprecision = 0; -static EWRAM_DATA u16 sTrailingSparklesYprecision = 0; +static EWRAM_DATA u16 sUnusedScene3Var0 = 0; // Set but never read +static EWRAM_DATA u16 sUnusedScene3Var1 = 0; // Set but never read +static EWRAM_DATA u16 sNidorinoJumpMult = 0; +static EWRAM_DATA u16 sNidorinoAnimDelayTime = 0; +static EWRAM_DATA u16 sNidorinoJumpDiv = 0; +static EWRAM_DATA u16 sNidorinoRecoilReturnTime = 0; +static EWRAM_DATA u16 sNidorinoUnusedVar = 0; // Set but never read +static EWRAM_DATA u16 sStarSpeedX = 0; +static EWRAM_DATA u16 sStarSpeedY = 0; +static EWRAM_DATA u16 sStarSparklesXmodMask = 0; +static EWRAM_DATA u16 sStarSparklesUnusedVar = 0; // Set but never read +static EWRAM_DATA u16 sStarSparklesSpawnRate = 0; +static EWRAM_DATA u16 sStarSparklesFlickerStartTime = 0; +static EWRAM_DATA u16 sStarSparklesDestroySpriteTime = 0; +static EWRAM_DATA u16 sStarSparklesGravityShift = 0; +static EWRAM_DATA u16 sStarSparklesXspeed = 0; +static EWRAM_DATA u16 sStarSparklesYspeed = 0; +static EWRAM_DATA u16 sStarSparklesXprecision = 0; +static EWRAM_DATA u16 sStarSparklesYprecision = 0; +// General static void CB2_SetUpIntro(void); static void CB2_Intro(void); static void VBlankCB_Intro(void); @@ -145,67 +179,76 @@ static void StartIntroSequence(void); static void Task_CallIntroCallback(u8 taskId); static void SetIntroCB(struct IntroSequenceData * ptr, IntroCallback cb); static void IntroCB_Init(struct IntroSequenceData * ptr); -static void IntroCB_OpenWin1ToTheaterDimensions(struct IntroSequenceData * ptr); -static void IntroCB_GameFreakStar(struct IntroSequenceData * ptr); -static void IntroCB_GameFreakScene_RevealGameFreakText(struct IntroSequenceData * ptr); -static void IntroCB_GameFreakScene_CreateGameFreakLogo(struct IntroSequenceData * ptr); -static void IntroCB_FightScene(struct IntroSequenceData * ptr); -static void Task_FightScene1_GrassyFieldAnim(u8 taskId); -static void FightScene1_SignalEndGrassyFieldAnim(void); -static void Task_FightScene1_ZoomEffect(u8 taskId); -static void IntroCB_FightScene2(struct IntroSequenceData * ptr); -static void Task_FightScene2_CameraHorizPanEffect(u8 taskId); -static void Task_FightScene2_CameraVertPanEffect(u8 taskId); -static void CreateMonStaticSprites(struct IntroSequenceData * ptr); -static void DestroyStaticMonSprites(struct IntroSequenceData * ptr); -static void IntroCB_FightScene3(struct IntroSequenceData * ptr); -static void FightScene3_StartBg1Scroll(void); -static void Task_FightScene3_ForestBgScroll(u8 taskId); -static void CreateGrassSprite(struct IntroSequenceData * ptr); +static void LoadFightSceneSpriteGraphics(void); +static void IntroCB_ExitToTitleScreen(struct IntroSequenceData * ptr); + +// GF scene +static void IntroCB_GF_OpenWindow(struct IntroSequenceData * ptr); +static void IntroCB_GF_Star(struct IntroSequenceData * ptr); +static void IntroCB_GF_RevealName(struct IntroSequenceData * ptr); +static void IntroCB_GF_RevealLogo(struct IntroSequenceData * ptr); +static void GFScene_LoadGfxCreateStar(void); +static void GFScene_StartNameSparklesSmall(void); +static void GFScene_StartNameSparklesBig(void); +static void GFScene_Task_NameSparklesSmall(u8 taskId); +static void GFScene_Task_NameSparklesBig(u8 taskId); +static struct Sprite *GFScene_CreateLogoSprite(void); +static void GFScene_CreatePresentsSprite(void); +static void SpriteCB_Star(struct Sprite *sprite); +static void SpriteCB_SparklesSmall_Star(struct Sprite *sprite); +static void SpriteCB_SparklesSmall_Name(struct Sprite *sprite); +static void SpriteCB_SparklesBig(struct Sprite *sprite); + +// Scene 1 +static void IntroCB_Scene1(struct IntroSequenceData * ptr); +static void Scene1_Task_AnimateGrass(u8 taskId); +static void Scene1_StartGrassScrolling(void); +static void Scene1_Task_BgZoom(u8 taskId); + +// Scene 2 +static void IntroCB_Scene2(struct IntroSequenceData * ptr); +static void Scene2_Task_PanForest(u8 taskId); +static void Scene2_Task_PanMons(u8 taskId); +static void Scene2_CreateMonSprites(struct IntroSequenceData * ptr); +static void Scene2_DestroyMonSprites(struct IntroSequenceData * ptr); + +// Scene 3 +static void IntroCB_Scene3_Entrance(struct IntroSequenceData * ptr); +static void IntroCB_Scene3_Fight(struct IntroSequenceData * ptr); +static void Scene3_StartBgScroll(void); +static void Scene3_Task_GengarBounce(u8 taskId); +static void Scene3_CreateGrassSprite(struct IntroSequenceData * ptr); +static void Scene3_CreateGengarSprite(struct IntroSequenceData * ptr); +static void Scene3_StartNidorinoCry(struct IntroSequenceData * ptr); +static void Scene3_StartNidorinoHop(struct Sprite *sprite, u16 time, s16 targetX, u8 heightShift); +static void Scene3_StartGengarAttack(struct IntroSequenceData * ptr); +static void Scene3_Task_GengarAttack(u8 taskId); +static void Scene3_NidorinoZoom(struct IntroSequenceData * ptr); +static void Scene3_GengarZoom(struct IntroSequenceData * ptr); +static void Scene3_CreateGengarSwipeSprites(void); +static void Scene3_Task_GengarEnter(u8 taskId); +static void Scene3_CreateNidorinoSprite(struct IntroSequenceData * ptr); +static void Scene3_StartNidorinoEntrance(struct Sprite *sprite, s16 xStart, s16 xEnd, u16 speed); +static void Scene3_SpriteCB_NidorinoEnter(struct Sprite *sprite); +static bool32 Scene3_IsNidorinoEntering(struct IntroSequenceData * ptr); +static void Scene3_StartNidorinoRecoil(struct IntroSequenceData * ptr); +static bool8 Scene3_NidorinoAnimIsRunning(struct IntroSequenceData * ptr); +static void CreateNidorinoRecoilDustSprites(s16 x, s16 y, s16 seed); +static void Scene3_StartNidorinoAttack(struct IntroSequenceData * ptr); static void SpriteCB_Grass(struct Sprite *sprite); -static void IntroCB_FightScene4(struct IntroSequenceData * ptr); -static void CreateGengarBackSprite(struct IntroSequenceData * ptr); -static void FightScene4_StartNidorinoAffineAnim(struct IntroSequenceData * ptr); -static void FightScene4_StartGengarAffineAnim(struct IntroSequenceData * ptr); -static void IntroCB_CleanUp(struct IntroSequenceData * ptr); -static void GameFreakScene_LoadGfxCreateStar(void); -static void GameFreakScene_StartTrailingSparkleSpawner(void); -static void Task_GameFreakScene_TrailingSparkleSpawner(u8 taskId); -static void GameFreakScene_StartRevealGameFreakTextSparklesSpawner(void); -static void Task_RevealGameFreakTextSparklesSpawner(u8 taskId); -static struct Sprite *CreateGameFreakLogoArtSprite(void); -static void FightScene4_StartGengarAttack(struct IntroSequenceData * ptr); -static void Task_FightScene4_GengarAttack(u8 taskId); -static void FightScene4_CreateGengarSwipeSprites(void); static void SpriteCB_GengarSwipe(struct Sprite *sprite); -static void Task_FightScene3_Bg0Scroll(u8 taskId); -static void SpriteCB_LargeStar(struct Sprite *sprite); -static void SpriteCB_SparklesSmall(struct Sprite *sprite); -static void SpriteCB_SparklesSmall2(struct Sprite *sprite); -static void SpriteCB_RevealGameFreakTextSparkles(struct Sprite *sprite); -static void CreateNidorinoAnimSprite(struct IntroSequenceData * ptr); -static void StartNidorinoAnimSpriteSlideIn(struct Sprite *sprite, s16 x0, s16 x1, u16 speed); -static void SpriteCB_NidorinoAnimSpriteSlideIn(struct Sprite *sprite); -static bool32 IsNidorinoAnimSpriteSlideInRunning(struct IntroSequenceData * ptr); -static void FightScene4_NidorinoRearsUp(struct IntroSequenceData * ptr); -static void SpriteCB_NidorinoRearsUp(struct Sprite *sprite); -static void FightScene4_StartNidorinoRecoilAnim(struct IntroSequenceData * ptr); +static void SpriteCB_RecoilDust(struct Sprite *sprite); +static void SpriteCB_NidorinoCry(struct Sprite *sprite); static void SpriteCB_NidorinoRecoil(struct Sprite *sprite); -static bool8 FightScene4_NidorinoAnimIsRunning(struct IntroSequenceData * ptr); -static void CreateNidorinoRecoilDustSprites(s16 a1, s16 a2, s16 a3); -static void SpriteCB_NidorinoRecoilDust(struct Sprite *sprite); -static void StartSpriteHopToPosAnim(struct Sprite *sprite, u16 a1, s16 a2, u8 a3); -static void SpriteCB_HopToPos(struct Sprite *sprite); -static void StartNidorinoAnim_LaunchSelfAtGengarAnim(struct IntroSequenceData * ptr); -static void SpriteCB_NidorinoAnim_LaunchSelfAtGengar(struct Sprite *sprite); -static void LoadFightSceneSpriteTilesAndPals(void); -static void CreateGameFreakPresentsText(void); +static void SpriteCB_NidorinoHop(struct Sprite *sprite); +static void SpriteCB_NidorinoAttack(struct Sprite *sprite); extern const u32 gMultiBootProgram_PokemonColosseum_Start[]; +extern const u32 gMultiBootProgram_PokemonColosseum_End[]; static const u16 sCopyright_Pal[] = INCBIN_U16("graphics/intro/copyright.gbapal"); -static const u8 sCopyright_Gfx[] = INCBIN_U8("graphics/intro/copyright.4bpp.lz"); -static const u8 sCopyright_Map[] = INCBIN_U8("graphics/intro/copyright.bin.lz"); +static const u8 sCopyright_Gfx[] = INCBIN_U8( "graphics/intro/copyright.4bpp.lz"); +static const u8 sCopyright_Map[] = INCBIN_U8( "graphics/intro/copyright.bin.lz"); // Game Freak static const u16 sGameFreakBg_Pal[] = INCBIN_U16("graphics/intro/game_freak/bg.gbapal"); @@ -243,7 +286,7 @@ static const u16 sScene2_NidorinoClose_Pal[] = INCBIN_U16("graphics/intro/scene_ static const u8 sScene2_NidorinoClose_Gfx[] = INCBIN_U8( "graphics/intro/scene_2/nidorino_close.4bpp.lz"); static const u8 sScene2_NidorinoClose_Map[] = INCBIN_U8( "graphics/intro/scene_2/nidorino_close.bin.lz"); static const u16 sScene3_Bg_Pal[] = INCBIN_U16("graphics/intro/scene_3/bg.gbapal"); -static const u8 sScene3_Bg_Gfx[] = INCBIN_U8( "graphics/intro/scene_3/bg.4bpp.lz"); // give -width 16 +static const u8 sScene3_Bg_Gfx[] = INCBIN_U8( "graphics/intro/scene_3/bg.4bpp.lz"); static const u8 sScene3_Bg_Map[] = INCBIN_U8( "graphics/intro/scene_3/bg.bin.lz"); static const u8 sScene3_GengarAnim_Gfx[] = INCBIN_U8( "graphics/intro/scene_3/gengar_anim.4bpp.lz"); static const u8 sScene3_GengarAnim_Map[] = INCBIN_U8( "graphics/intro/scene_3/gengar_anim.bin.lz"); @@ -355,8 +398,8 @@ static const struct BgTemplate sBgTemplates_Scene3[] = { } }; -static const struct WindowTemplate sWindowTemplate_GameFreakTextLogo[] = { - { +static const struct WindowTemplate sWindowTemplates[WIN_COUNT + 1] = { + [WIN_GF_TEXT_LOGO] = { .bg = BG_GF_TEXT_LOGO, .tilemapLeft = 6, .tilemapTop = 4, @@ -364,14 +407,15 @@ static const struct WindowTemplate sWindowTemplate_GameFreakTextLogo[] = { .height = 9, .paletteNum = 0xD, .baseBlock = 0x000 - }, DUMMY_WIN_TEMPLATE + }, + [WIN_COUNT] = DUMMY_WIN_TEMPLATE }; -static const u8 sGengarBackSpritePos2UpdateMods[NUM_GENGAR_BACK_SPRITES][2] = { - {0x3f, 0x3f}, - {0x00, 0x3f}, - {0x3f, 0x00}, - {0x00, 0x00} +static const u8 sGengarZoomMatrixAnchors[NUM_GENGAR_BACK_SPRITES][2] = { + {63, 63}, + { 0, 63}, + {63, 0}, + { 0, 0} }; static const struct CompressedSpriteSheet sSpriteSheets_GameFreakScene[] = { @@ -389,7 +433,7 @@ static const struct SpritePalette sSpritePalettes_GameFreakScene[] = { {0} }; -static const struct Coords16 sTrailingSparkleCoords[] = { +static const struct Coords16 sTextSparkleCoords[] = { { 72, 80}, {136, 74}, {168, 80}, @@ -406,9 +450,9 @@ static const struct OamData sOam_Star = { .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, + .shape = SPRITE_SHAPE(16x16), .matrixNum = 0, - .size = ST_OAM_SIZE_1, + .size = SPRITE_SIZE(16x16), .tileNum = 0x000, .priority = 2, .paletteNum = 0 @@ -419,15 +463,15 @@ static const struct OamData sOam_SparklesSmall = { .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, + .shape = SPRITE_SHAPE(8x8), .matrixNum = 0, - .size = ST_OAM_SIZE_0, + .size = SPRITE_SIZE(8x8), .tileNum = 0x000, .priority = 2, .paletteNum = 0 }; -static const union AnimCmd sAnim_SparklesSmall_0[] = { +static const union AnimCmd sAnim_SparklesSmall_Loop[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), @@ -435,7 +479,7 @@ static const union AnimCmd sAnim_SparklesSmall_0[] = { ANIMCMD_JUMP(0) }; -static const union AnimCmd sAnim_SparklesSmall_1[] = { +static const union AnimCmd sAnim_SparklesSmall_Once[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(2, 4), @@ -444,8 +488,8 @@ static const union AnimCmd sAnim_SparklesSmall_1[] = { }; static const union AnimCmd *const sAnims_SparklesSmall[] = { - sAnim_SparklesSmall_0, - sAnim_SparklesSmall_1 + [ANIM_SPARKLE_LOOP] = sAnim_SparklesSmall_Loop, + [ANIM_SPARKLE_ONCE] = sAnim_SparklesSmall_Once }; static const struct SpriteTemplate sSpriteTemplate_Star = { @@ -455,7 +499,7 @@ static const struct SpriteTemplate sSpriteTemplate_Star = { .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_LargeStar + .callback = SpriteCB_Star }; static const struct SpriteTemplate sSpriteTemplate_SparklesSmall = { @@ -465,7 +509,7 @@ static const struct SpriteTemplate sSpriteTemplate_SparklesSmall = { .anims = sAnims_SparklesSmall, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_SparklesSmall + .callback = SpriteCB_SparklesSmall_Star }; static const struct OamData sOam_SparklesBig = { @@ -473,9 +517,9 @@ static const struct OamData sOam_SparklesBig = { .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, + .shape = SPRITE_SHAPE(32x32), .matrixNum = 0, - .size = ST_OAM_SIZE_2, + .size = SPRITE_SIZE(32x32), .tileNum = 0x000, .priority = 2, .paletteNum = 0 @@ -500,7 +544,7 @@ static const struct SpriteTemplate sSpriteTemplate_SparklesBig = { .anims = sAnims_SparklesBig, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_RevealGameFreakTextSparkles + .callback = SpriteCB_SparklesBig }; static const struct OamData sOam_GameFreakLogo = { @@ -508,9 +552,9 @@ static const struct OamData sOam_GameFreakLogo = { .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_V_RECTANGLE, + .shape = SPRITE_SHAPE(32x64), .matrixNum = 0, - .size = ST_OAM_SIZE_3, + .size = SPRITE_SIZE(32x64), .tileNum = 0x000, .priority = 3, .paletteNum = 0 @@ -531,15 +575,15 @@ static const struct OamData sOam_PresentsText = { .objMode = ST_OAM_OBJ_BLEND, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_H_RECTANGLE, + .shape = SPRITE_SHAPE(32x8), .matrixNum = 0, - .size = ST_OAM_SIZE_1, + .size = SPRITE_SIZE(32x8), .tileNum = 0x000, .priority = 3, .paletteNum = 0 }; -static const struct SpriteTemplate sSpriteTemplate_PresentsText = { +static const struct SpriteTemplate sSpriteTemplate_Presents = { .tileTag = GFXTAG_PRESENTS, .paletteTag = PALTAG_GF, .oam = &sOam_PresentsText, @@ -554,61 +598,61 @@ static const struct OamData sOam_Scene3_Nidorino = { .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, + .shape = SPRITE_SHAPE(64x64), .matrixNum = 0, - .size = ST_OAM_SIZE_3, + .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; -static const union AnimCmd sAnim_Scene3_Nidorino_0[] = { +static const union AnimCmd sAnim_Scene3_Nidorino_Normal[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sAnim_Scene3_Nidorino_1[] = { +static const union AnimCmd sAnim_Scene3_Nidorino_Cry[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END }; -static const union AnimCmd sAnim_Scene3_Nidorino_2[] = { +static const union AnimCmd sAnim_Scene3_Nidorino_Crouch[] = { ANIMCMD_FRAME(128, 1), ANIMCMD_END }; -static const union AnimCmd sAnim_Scene3_Nidorino_3[] = { +static const union AnimCmd sAnim_Scene3_Nidorino_Hop[] = { ANIMCMD_FRAME(192, 1), ANIMCMD_END }; -static const union AnimCmd sAnim_Scene3_Nidorino_4[] = { +static const union AnimCmd sAnim_Scene3_Nidorino_Attack[] = { ANIMCMD_FRAME(256, 1), ANIMCMD_END }; static const union AnimCmd *const sAnims_Scene3_Nidorino[] = { - sAnim_Scene3_Nidorino_0, - sAnim_Scene3_Nidorino_1, - sAnim_Scene3_Nidorino_2, - sAnim_Scene3_Nidorino_3, - sAnim_Scene3_Nidorino_4 + [ANIM_NIDORINO_NORMAL] = sAnim_Scene3_Nidorino_Normal, + [ANIM_NIDORINO_CRY] = sAnim_Scene3_Nidorino_Cry, + [ANIM_NIDORINO_CROUCH] = sAnim_Scene3_Nidorino_Crouch, + [ANIM_NIDORINO_HOP] = sAnim_Scene3_Nidorino_Hop, + [ANIM_NIDORINO_ATTACK] = sAnim_Scene3_Nidorino_Attack }; -static const union AffineAnimCmd sAffineAnim_Scene3_Mons_0[] = { +static const union AffineAnimCmd sAffineAnim_Scene3_Mons_Normal[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sAffineAnim_Scene3_Mons_1[] = { +static const union AffineAnimCmd sAffineAnim_Scene3_Mons_Zoom[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(32, 32, 0, 8), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnims_Scene3_Mons[] = { - sAffineAnim_Scene3_Mons_0, - sAffineAnim_Scene3_Mons_1 + [AFFINEANIM_NORMAL] = sAffineAnim_Scene3_Mons_Normal, + [AFFINEANIM_ZOOM] = sAffineAnim_Scene3_Mons_Zoom }; static const struct SpriteTemplate sSpriteTemplate_Scene3_Nidorino = { @@ -626,9 +670,9 @@ static const struct OamData sOam_Scene2_Mons = { .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, + .shape = SPRITE_SHAPE(64x64), .matrixNum = 0, - .size = ST_OAM_SIZE_3, + .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 1, .paletteNum = 0 @@ -659,28 +703,28 @@ static const struct OamData sOam_Grass = { .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_H_RECTANGLE, + .shape = SPRITE_SHAPE(64x32), .matrixNum = 0, - .size = ST_OAM_SIZE_3, + .size = SPRITE_SIZE(64x32), .tileNum = 0x000, .priority = 0, .paletteNum = 0 }; -static const union AnimCmd sAnim_Grass_0[] = { +static const union AnimCmd sAnim_Grass_Static[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd sAnim_Grass_1[] = { +static const union AnimCmd sAnim_Grass_Rustle[] = { ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END }; static const union AnimCmd *const sAnims_Grass[] = { - sAnim_Grass_0, - sAnim_Grass_1 + sAnim_Grass_Static, + sAnim_Grass_Rustle // Unused }; static const struct SpriteTemplate sSpriteTemplate_Grass = { @@ -698,39 +742,39 @@ static const struct OamData sOam_Scene3_Gengar = { .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, + .shape = SPRITE_SHAPE(64x64), .matrixNum = 0, - .size = ST_OAM_SIZE_3, + .size = SPRITE_SIZE(64x64), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; -static const union AnimCmd sAnim_Scene3_Gengar_0[] = { +static const union AnimCmd sAnim_Scene3_Gengar_TopLeft[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd sAnim_Scene3_Gengar_1[] = { +static const union AnimCmd sAnim_Scene3_Gengar_TopRight[] = { ANIMCMD_FRAME(64, 0), ANIMCMD_END }; -static const union AnimCmd sAnim_Scene3_Gengar_2[] = { +static const union AnimCmd sAnim_Scene3_Gengar_BottomLeft[] = { ANIMCMD_FRAME(96, 0), ANIMCMD_END }; -static const union AnimCmd sAnim_Scene3_Gengar_3[] = { +static const union AnimCmd sAnim_Scene3_Gengar_BottomRight[] = { ANIMCMD_FRAME(160, 0), ANIMCMD_END }; static const union AnimCmd *const sAnims_Scene3_Gengar[NUM_GENGAR_BACK_SPRITES] = { - sAnim_Scene3_Gengar_0, - sAnim_Scene3_Gengar_1, - sAnim_Scene3_Gengar_2, - sAnim_Scene3_Gengar_3 + sAnim_Scene3_Gengar_TopLeft, + sAnim_Scene3_Gengar_TopRight, + sAnim_Scene3_Gengar_BottomLeft, + sAnim_Scene3_Gengar_BottomRight }; static const struct SpriteTemplate sSpriteTemplate_Scene3_Gengar = { @@ -748,29 +792,29 @@ static const struct OamData sOam_Swipe = { .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_V_RECTANGLE, + .shape = SPRITE_SHAPE(32x64), .matrixNum = 0, - .size = ST_OAM_SIZE_3, + .size = SPRITE_SIZE(32x64), .tileNum = 0x000, .priority = 1, .paletteNum = 0 }; -static const union AnimCmd sAnim_Swipe_0[] = { +static const union AnimCmd sAnim_Swipe_Top[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(32, 4), ANIMCMD_END }; -static const union AnimCmd sAnim_Swipe_1[] = { +static const union AnimCmd sAnim_Swipe_Bottom[] = { ANIMCMD_FRAME(64, 8), ANIMCMD_FRAME(72, 4), ANIMCMD_END }; static const union AnimCmd *const sAnims_Swipe[] = { - sAnim_Swipe_0, - sAnim_Swipe_1 + [ANIM_SWIPE_TOP] = sAnim_Swipe_Top, + [ANIM_SWIPE_BOTTOM] = sAnim_Swipe_Bottom }; static const struct SpriteTemplate sSpriteTemplate_GengarSwipe = { @@ -788,9 +832,9 @@ static const struct OamData sOam_RecoilDust = { .objMode = ST_OAM_OBJ_NORMAL, .mosaic = FALSE, .bpp = ST_OAM_4BPP, - .shape = ST_OAM_SQUARE, + .shape = SPRITE_SHAPE(16x16), .matrixNum = 0, - .size = ST_OAM_SIZE_1, + .size = SPRITE_SIZE(16x16), .tileNum = 0x000, .priority = 1, .paletteNum = 0 @@ -815,7 +859,7 @@ static const struct SpriteTemplate sSpriteTemplate_NidorinoRecoilDust = { .anims = sAnims_RecoilDust, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_NidorinoRecoilDust + .callback = SpriteCB_RecoilDust }; static const struct CompressedSpriteSheet sFightSceneSpriteSheets[] = { @@ -829,15 +873,15 @@ static const struct CompressedSpriteSheet sFightSceneSpriteSheets[] = { }; // POTENTIAL UB -// This array is passed to LoadSpritePalettes in LoadFightSceneSpriteTilesAndPals. +// This array is passed to LoadSpritePalettes in LoadFightSceneSpriteGraphics. // LoadSpritePalettes uses a {0} entry to signal end of array. // Because such an entry is absent in this case, the function // continues reading into the next .rodata section. static const struct SpritePalette sFightSceneSpritePalettes[] = { - {sGengar_Pal, PALTAG_GENGAR}, - {sNidorino_Pal, PALTAG_NIDORINO}, - {sScene3_Grass_Pal, PALTAG_SCENE3_GRASS}, - {sScene3_Swipe_Pal, PALTAG_SCENE3_SWIPE}, + {sGengar_Pal, PALTAG_GENGAR}, + {sNidorino_Pal, PALTAG_NIDORINO}, + {sScene3_Grass_Pal, PALTAG_SCENE3_GRASS}, + {sScene3_Swipe_Pal, PALTAG_SCENE3_SWIPE}, {sScene3_RecoilDust_Pal, PALTAG_SCENE3_RECOIL_DUST}, #ifdef BUGFIX {0} @@ -861,7 +905,7 @@ static void LoadCopyrightGraphics(u16 charBase, u16 screenBase, u16 palOffset) { LZ77UnCompVram(sCopyright_Gfx, (void *)BG_VRAM + charBase); LZ77UnCompVram(sCopyright_Map, (void *)BG_VRAM + screenBase); - LoadPalette(sCopyright_Pal, palOffset, 0x20); + LoadPalette(sCopyright_Pal, palOffset, sizeof(sCopyright_Pal)); } static void SerialCB_CopyrightScreen(void) @@ -983,13 +1027,13 @@ static void CB2_SetUpIntro(void) DmaFill16(3, 0, PLTT, PLTT_SIZE); FillPalette(RGB_BLACK, 0, 0x400); ResetBgsAndClearDma3BusyFlags(FALSE); - InitBgsFromTemplates(0, sBgTemplates_GameFreakScene, NELEMS(sBgTemplates_GameFreakScene)); + InitBgsFromTemplates(0, sBgTemplates_GameFreakScene, ARRAY_COUNT(sBgTemplates_GameFreakScene)); break; case 1: - LoadPalette(sGameFreakBg_Pal, 0x00, 0x20); + LoadPalette(sGameFreakBg_Pal, 0x00, sizeof(sGameFreakBg_Pal)); DecompressAndCopyTileDataToVram(BG_GF_BACKGROUND, sGameFreakBg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_GF_BACKGROUND, sGameFreakBg_Map, 0, 0, 1); - LoadPalette(sGameFreakLogo_Pal, 0xD0, 0x20); + LoadPalette(sGameFreakLogo_Pal, 0xD0, sizeof(sGameFreakLogo_Pal)); break; case 2: if (!FreeTempTileDataBuffersIfPossible()) @@ -1038,7 +1082,7 @@ static void Intro_ResetGpuRegs(void) static void StartIntroSequence(void) { - struct IntroSequenceData * ptr = Alloc(sizeof(struct IntroSequenceData)); + struct IntroSequenceData * ptr = Alloc(sizeof(*ptr)); SetIntroCB(ptr, IntroCB_Init); ptr->taskId = CreateTask(Task_CallIntroCallback, 3); SetWordTaskArg(ptr->taskId, 0, (uintptr_t)ptr); @@ -1053,8 +1097,11 @@ static void SetIntroCB(struct IntroSequenceData * ptr, IntroCallback cb) static void Task_CallIntroCallback(u8 taskId) { struct IntroSequenceData * ptr = (void *)GetWordTaskArg(taskId, 0); - if (JOY_NEW(A_BUTTON | START_BUTTON | SELECT_BUTTON) && ptr->callback != IntroCB_CleanUp) - SetIntroCB(ptr, IntroCB_CleanUp); + + // End intro early if player presses A/Start/Select + if (JOY_NEW(A_BUTTON | START_BUTTON | SELECT_BUTTON) && ptr->callback != IntroCB_ExitToTitleScreen) + SetIntroCB(ptr, IntroCB_ExitToTitleScreen); + ptr->callback(ptr); } @@ -1063,138 +1110,138 @@ static void IntroCB_Init(struct IntroSequenceData * this) switch (this->state) { case 0: - InitWindows(sWindowTemplate_GameFreakTextLogo); + InitWindows(sWindowTemplates); LZ77UnCompWram(sGameFreakText_Gfx, this->gameFreakTextGfx); LZ77UnCompWram(sGameFreakLogo_Gfx, this->gameFreakLogoGfx); FillBgTilemapBufferRect(BG_GF_TEXT_LOGO, 0x000, 0, 0, 32, 32, 0x11); - FillWindowPixelBuffer(0, PIXEL_FILL(0)); - BlitBitmapToWindow(0, this->gameFreakTextGfx, 0, 40, 144, 16); - PutWindowTilemap(0); - CopyWindowToVram(0, COPYWIN_FULL); + FillWindowPixelBuffer(WIN_GF_TEXT_LOGO, PIXEL_FILL(0)); + BlitBitmapToWindow(WIN_GF_TEXT_LOGO, this->gameFreakTextGfx, 0, 40, 144, 16); + PutWindowTilemap(WIN_GF_TEXT_LOGO); + CopyWindowToVram(WIN_GF_TEXT_LOGO, COPYWIN_FULL); this->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) - SetIntroCB(this, IntroCB_OpenWin1ToTheaterDimensions); + SetIntroCB(this, IntroCB_GF_OpenWindow); break; } } -static void IntroCB_OpenWin1ToTheaterDimensions(struct IntroSequenceData * this) +static void IntroCB_GF_OpenWindow(struct IntroSequenceData * this) { switch (this->state) { case 0: SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); - SetGpuReg(REG_OFFSET_WININ, 0x3F00); - SetGpuReg(REG_OFFSET_WINOUT, 0x0000); - SetGpuReg(REG_OFFSET_WIN1H, 0x00F0); - SetGpuReg(REG_OFFSET_WIN1V, 0x0000); - this->data[5] = 0; + SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_ALL); + SetGpuReg(REG_OFFSET_WINOUT, 0); + SetGpuReg(REG_OFFSET_WIN1H, DISPLAY_WIDTH); + SetGpuReg(REG_OFFSET_WIN1V, 0); + this->timer = 0; this->state++; break; case 1: - ShowBg(3); - BlendPalettes(PALETTES_ALL, 0x00, RGB_BLACK); + ShowBg(BG_GF_BACKGROUND); + BlendPalettes(PALETTES_ALL, 0, RGB_BLACK); this->state++; break; case 2: - this->data[5] += 8; - if (this->data[5] >= 0x30) - this->data[5] = 0x30; - SetGpuReg(REG_OFFSET_WIN1V, ((0x50 - this->data[5]) << 8) | (0x50 + this->data[5])); - if (this->data[5] == 0x30) - SetIntroCB(this, IntroCB_GameFreakStar); + // Extend window height in both directions from midpoint until it reaches a narrow "theatric" view + this->timer += 8; + if (this->timer >= 48) + this->timer = 48; + SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(DISPLAY_HEIGHT / 2 - this->timer, DISPLAY_HEIGHT / 2 + this->timer)); + if (this->timer == 48) + SetIntroCB(this, IntroCB_GF_Star); break; } } -static void IntroCB_GameFreakStar(struct IntroSequenceData * this) +static void IntroCB_GF_Star(struct IntroSequenceData * this) { switch (this->state) { case 0: PlaySE(MUS_GAME_FREAK); - GameFreakScene_LoadGfxCreateStar(); - this->data[5] = 0; + GFScene_LoadGfxCreateStar(); + this->timer = 0; this->state++; break; case 1: - this->data[5]++; - if (this->data[5] == 30) + if (++this->timer == 30) { - GameFreakScene_StartTrailingSparkleSpawner(); - this->data[5] = 0; + GFScene_StartNameSparklesSmall(); + this->timer = 0; this->state++; } break; case 2: - this->data[5]++; - if (this->data[5] == 90) - SetIntroCB(this, IntroCB_GameFreakScene_RevealGameFreakText); + this->timer++; + if (this->timer == 90) + SetIntroCB(this, IntroCB_GF_RevealName); break; } } -static void IntroCB_GameFreakScene_RevealGameFreakText(struct IntroSequenceData * this) +static void IntroCB_GF_RevealName(struct IntroSequenceData * this) { switch (this->state) { case 0: - GameFreakScene_StartRevealGameFreakTextSparklesSpawner(); - this->data[5] = 0; + GFScene_StartNameSparklesBig(); + this->timer = 0; this->state++; break; case 1: - if (++this->data[5] >= 40) + if (++this->timer >= 40) this->state++; break; case 2: - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); StartBlendTask(0, 16, 16, 0, 48, 0); this->state++; break; case 3: - ShowBg(2); + ShowBg(BG_GF_TEXT_LOGO); this->state++; break; case 4: if (!IsBlendTaskActive()) { SetGpuReg(REG_OFFSET_BLDCNT, 0); - this->data[5] = 0; + this->timer = 0; this->state++; } break; case 5: - if (++this->data[5] > 50) - SetIntroCB(this, IntroCB_GameFreakScene_CreateGameFreakLogo); + if (++this->timer > 50) + SetIntroCB(this, IntroCB_GF_RevealLogo); break; } } -static void IntroCB_GameFreakScene_CreateGameFreakLogo(struct IntroSequenceData * this) +static void IntroCB_GF_RevealLogo(struct IntroSequenceData * this) { switch (this->state) { case 0: - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); StartBlendTask(0, 16, 16, 0, 16, 0); - this->data[0] = 0; - this->data[1] = 16; - this->data[5] = 0; + this->data[0] = 0; // Never read + this->data[1] = 16; // Never read + this->timer = 0; this->state++; break; case 1: - this->gameFreakLogoArtSprite = CreateGameFreakLogoArtSprite(); + this->gameFreakLogoArtSprite = GFScene_CreateLogoSprite(); this->state++; break; case 2: if (!IsBlendTaskActive()) { - BlitBitmapToWindow(0, this->gameFreakLogoGfx, 0x38, 0x06, 0x20, 0x40); - BlitBitmapToWindow(0, this->gameFreakTextGfx, 0x00, 0x28, 0x90, 0x10); - CopyWindowToVram(0, COPYWIN_GFX); + BlitBitmapToWindow(WIN_GF_TEXT_LOGO, this->gameFreakLogoGfx, 0x38, 0x06, 0x20, 0x40); + BlitBitmapToWindow(WIN_GF_TEXT_LOGO, this->gameFreakTextGfx, 0x00, 0x28, 0x90, 0x10); + CopyWindowToVram(WIN_GF_TEXT_LOGO, COPYWIN_GFX); this->state++; } break; @@ -1203,14 +1250,14 @@ static void IntroCB_GameFreakScene_CreateGameFreakLogo(struct IntroSequenceData { DestroySprite(this->gameFreakLogoArtSprite); #if REVISION >= 1 - CreateGameFreakPresentsText(); + GFScene_CreatePresentsSprite(); #endif - this->data[5] = 0; + this->timer = 0; this->state++; } break; case 4: - if (++this->data[5] > 90) + if (++this->timer > 90) { SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2); StartBlendTask(16, 0, 0, 16, 20, 0); @@ -1227,36 +1274,36 @@ static void IntroCB_GameFreakScene_CreateGameFreakLogo(struct IntroSequenceData case 6: ResetSpriteData(); FreeAllSpritePalettes(); - this->data[5] = 0; + this->timer = 0; this->state++; break; case 7: - if (++this->data[5] > 20) + if (++this->timer > 20) { SetGpuReg(REG_OFFSET_BLDCNT, 0); - SetIntroCB(this, IntroCB_FightScene); + SetIntroCB(this, IntroCB_Scene1); } break; } } -static void IntroCB_FightScene(struct IntroSequenceData * this) +static void IntroCB_Scene1(struct IntroSequenceData * this) { switch (this->state) { case 0: SetVBlankCallback(NULL); - LoadPalette(sScene1_Grass_Pal, 0x10, 0x20); - LoadPalette(sScene1_Bg_Pal, 0x20, 0x20); - BlendPalettes(0x00000006, 0x10, RGB_WHITE); - InitBgsFromTemplates(0, sBgTemplates_Scene1, NELEMS(sBgTemplates_Scene1)); + LoadPalette(sScene1_Grass_Pal, 16 * PALSLOT_SCENE1_GRASS, sizeof(sScene1_Grass_Pal)); + LoadPalette(sScene1_Bg_Pal, 16 * PALSLOT_SCENE1_BG, sizeof(sScene1_Bg_Pal)); + BlendPalettes((1 << PALSLOT_SCENE1_GRASS) | (1 << PALSLOT_SCENE1_BG), 16, RGB_WHITE); + InitBgsFromTemplates(0, sBgTemplates_Scene1, ARRAY_COUNT(sBgTemplates_Scene1)); DecompressAndCopyTileDataToVram(BG_SCENE1_BACKGROUND, sScene1_Bg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE1_BACKGROUND, sScene1_Bg_Map, 0, 0, 1); ShowBg(BG_SCENE1_BACKGROUND); HideBg(BG_SCENE1_GRASS); HideBg(BG_SCENE1_UNUSED1); HideBg(BG_SCENE1_UNUSED2); - LoadFightSceneSpriteTilesAndPals(); + LoadFightSceneSpriteGraphics(); SetVBlankCallback(VBlankCB_Intro); this->state++; break; @@ -1274,8 +1321,8 @@ static void IntroCB_FightScene(struct IntroSequenceData * this) if (!FreeTempTileDataBuffersIfPossible()) { ShowBg(BG_SCENE1_GRASS); - CreateTask(Task_FightScene1_GrassyFieldAnim, 0); - BeginNormalPaletteFade(0x00000006, -2, 16, 0, RGB_WHITE); + CreateTask(Scene1_Task_AnimateGrass, 0); + BeginNormalPaletteFade((1 << PALSLOT_SCENE1_GRASS) | (1 << PALSLOT_SCENE1_BG), -2, 16, 0, RGB_WHITE); this->state++; } break; @@ -1283,80 +1330,106 @@ static void IntroCB_FightScene(struct IntroSequenceData * this) if (!gPaletteFade.active) { m4aSongNumStart(MUS_INTRO_FIGHT); - this->data[5] = 0; + this->timer = 0; this->state++; } break; case 4: - this->data[5]++; - if (this->data[5] == 20) + if (++this->timer == 20) { - CreateTask(Task_FightScene1_ZoomEffect, 0); - FightScene1_SignalEndGrassyFieldAnim(); + // Start animation for transitioning to the next scene + CreateTask(Scene1_Task_BgZoom, 0); + Scene1_StartGrassScrolling(); } - if (this->data[5] >= 30) + if (this->timer >= 30) { - BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE); - DestroyTask(FindTaskIdByFunc(Task_FightScene1_GrassyFieldAnim)); - DestroyTask(FindTaskIdByFunc(Task_FightScene1_ZoomEffect)); - SetIntroCB(this, IntroCB_FightScene2); + // End scene + BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE); + DestroyTask(FindTaskIdByFunc(Scene1_Task_AnimateGrass)); + DestroyTask(FindTaskIdByFunc(Scene1_Task_BgZoom)); + SetIntroCB(this, IntroCB_Scene2); } break; case 5: + // Never reached if (!gPaletteFade.active) { - DestroyTask(FindTaskIdByFunc(Task_FightScene1_GrassyFieldAnim)); - DestroyTask(FindTaskIdByFunc(Task_FightScene1_ZoomEffect)); - SetIntroCB(this, IntroCB_FightScene2); + DestroyTask(FindTaskIdByFunc(Scene1_Task_AnimateGrass)); + DestroyTask(FindTaskIdByFunc(Scene1_Task_BgZoom)); + SetIntroCB(this, IntroCB_Scene2); } break; } } -static void Task_FightScene1_GrassyFieldAnim(u8 taskId) +#define tTimer data[0] +#define tFrame data[1] +#define tExiting data[2] +#define tScroll data[3] + +static void Scene1_Task_AnimateGrass(u8 taskId) { s16 * data = gTasks[taskId].data; - if (++data[0] > 5) + // Each of the 3 frames of the bg grass animation is separated vertically on the tilemap. + // The conditional below changes the frame by setting the y coordinate of the bg. + if (++tTimer > 5) { - data[0] = 0; - if (++data[1] > 2) - data[1] = 0; - ChangeBgY(BG_SCENE1_GRASS, data[1] << 15, 0); + tTimer = 0; + if (++tFrame >= 3) + tFrame = 0; + ChangeBgY(BG_SCENE1_GRASS, tFrame << 15, BG_COORD_SET); } - if (data[2]) + + // When it's time to progress to the next scene, the grass is meant to scroll downward offscreen. + // This scrolling is overwritten by the coord change above, and so the grass "stutters" back upward. + // They don't mask the bg, so if it were to continue scrolling offscreen it would reveal the frame above on the tilemap. + if (tExiting) { - data[3] += 0x120; - ChangeBgY(BG_SCENE1_GRASS, data[3], 2); + tScroll += 0x120; + ChangeBgY(BG_SCENE1_GRASS, tScroll, BG_COORD_SUB); } } -static void FightScene1_SignalEndGrassyFieldAnim(void) +static void Scene1_StartGrassScrolling(void) { - u8 taskId = FindTaskIdByFunc(Task_FightScene1_GrassyFieldAnim); - gTasks[taskId].data[2] = TRUE; + u8 taskId = FindTaskIdByFunc(Scene1_Task_AnimateGrass); + gTasks[taskId].tExiting = TRUE; } -static void Task_FightScene1_ZoomEffect(u8 taskId) +#undef tTimer +#undef tFrame +#undef tExiting +#undef tScroll + +#define tTimer data[0] +#define tFrame data[1] + +// Have the silhouetted forest background "zoom in" during the transition to the next scene. +// Same as the grass animation above, this achieved by separating frames vertically on the bg tilemap. +static void Scene1_Task_BgZoom(u8 taskId) { s16 * data = gTasks[taskId].data; - if (++data[0] > 3) + if (++tTimer > 3) { - data[0] = 0; - if (data[1] < 2) - data[1]++; - ChangeBgY(BG_SCENE1_BACKGROUND, data[1] << 15, 0); + tTimer = 0; + if (tFrame < 2) + tFrame++; + ChangeBgY(BG_SCENE1_BACKGROUND, tFrame << 15, BG_COORD_SET); } } -static void IntroCB_FightScene2(struct IntroSequenceData * this) +#undef tTimer +#undef tFrame + +static void IntroCB_Scene2(struct IntroSequenceData * this) { switch (this->state) { case 0: - BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE); - InitBgsFromTemplates(0, sBgTemplates_Scene2, NELEMS(sBgTemplates_Scene2)); + BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE); + InitBgsFromTemplates(0, sBgTemplates_Scene2, ARRAY_COUNT(sBgTemplates_Scene2)); DecompressAndCopyTileDataToVram(BG_SCENE2_BACKGROUND, sScene2_Bg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE2_BACKGROUND, sScene2_Bg_Map, 0, 0, 1); ShowBg(BG_SCENE2_BACKGROUND); @@ -1366,10 +1439,10 @@ static void IntroCB_FightScene2(struct IntroSequenceData * this) if (!FreeTempTileDataBuffersIfPossible()) { SetVBlankCallback(NULL); - LoadPalette(sScene2_Bg_Pal, 0x10, 0x60); - LoadPalette(sGengar_Pal, 0x50, 0x20); - LoadPalette(sScene2_NidorinoClose_Pal, 0x60, 0x20); - BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE); + LoadPalette(sScene2_Bg_Pal, 0x10, sizeof(sScene2_Bg_Pal)); + LoadPalette(sGengar_Pal, 0x50, sizeof(sGengar_Pal)); + LoadPalette(sScene2_NidorinoClose_Pal, 0x60, sizeof(sScene2_NidorinoClose_Pal)); + BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE); DecompressAndCopyTileDataToVram(BG_SCENE2_PLANTS, sScene2_Plants_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE2_PLANTS, sScene2_Plants_Map, 0, 0, 1); DecompressAndCopyTileDataToVram(BG_SCENE2_NIDORINO, sScene2_NidorinoClose_Gfx, 0, 0, 0); @@ -1378,13 +1451,13 @@ static void IntroCB_FightScene2(struct IntroSequenceData * this) DecompressAndCopyTileDataToVram(BG_SCENE2_GENGAR, sScene2_GengarClose_Map, 0, 0, 1); ResetBgPositions(); ShowBg(BG_SCENE2_PLANTS); - HideBg(BG_SCENE2_NIDORINO); // Hide bgs for scene 3 + HideBg(BG_SCENE2_NIDORINO); // Hide bgs for the close up shot HideBg(BG_SCENE2_GENGAR); - ChangeBgY(BG_SCENE2_GENGAR, 0x0001CE00, 0); - ChangeBgY(BG_SCENE2_NIDORINO, 0x00002800, 0); - CreateTask(Task_FightScene2_CameraHorizPanEffect, 0); - CreateMonStaticSprites(this); - BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE); + ChangeBgY(BG_SCENE2_GENGAR, 0x0001CE00, BG_COORD_SET); + ChangeBgY(BG_SCENE2_NIDORINO, 0x00002800, BG_COORD_SET); + CreateTask(Scene2_Task_PanForest, 0); + Scene2_CreateMonSprites(this); + BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE); SetVBlankCallback(VBlankCB_Intro); this->state++; } @@ -1392,25 +1465,25 @@ static void IntroCB_FightScene2(struct IntroSequenceData * this) case 2: if (!FreeTempTileDataBuffersIfPossible()) { - BeginNormalPaletteFade(0xFFFFFFFE, -2, 16, 0, RGB_WHITE); + BeginNormalPaletteFade(PALETTES_ALL & ~1, -2, 16, 0, RGB_WHITE); this->state++; } break; case 3: if (!gPaletteFade.active) { - this->data[5] = 0; + this->timer = 0; this->state++; } break; case 4: - if (++this->data[5] >= 60) + if (++this->timer >= 60) { - this->data[5] = 0; - DestroyTask(FindTaskIdByFunc(Task_FightScene2_CameraHorizPanEffect)); - DestroyStaticMonSprites(this); - CreateTask(Task_FightScene2_CameraVertPanEffect, 0); - ChangeBgY(BG_SCENE2_BACKGROUND, 0x00010000, 0); // Move background from upper half (wide shot) to lower half (close up) + this->timer = 0; + DestroyTask(FindTaskIdByFunc(Scene2_Task_PanForest)); + Scene2_DestroyMonSprites(this); + CreateTask(Scene2_Task_PanMons, 0); + ChangeBgY(BG_SCENE2_BACKGROUND, 0x00010000, BG_COORD_SET); // Move background from upper half (wide shot) to lower half (close up) HideBg(BG_SCENE2_PLANTS); ShowBg(BG_SCENE2_BACKGROUND); ShowBg(BG_SCENE2_NIDORINO); @@ -1421,65 +1494,69 @@ static void IntroCB_FightScene2(struct IntroSequenceData * this) case 5: if (!IsDma3ManagerBusyWithBgCopy()) { - this->data[5] = 0; + this->timer = 0; this->state++; } break; case 6: - if (++this->data[5] >= 60) + if (++this->timer >= 60) { - DestroyTask(FindTaskIdByFunc(Task_FightScene2_CameraVertPanEffect)); - SetIntroCB(this, IntroCB_FightScene3); + DestroyTask(FindTaskIdByFunc(Scene2_Task_PanMons)); + SetIntroCB(this, IntroCB_Scene3_Entrance); } break; } } -static void Task_FightScene2_CameraHorizPanEffect(u8 taskId) +// Pan the background trees right and the foreground plants left in the wide shot +static void Scene2_Task_PanForest(u8 taskId) { - ChangeBgX(BG_SCENE2_BACKGROUND, 0x0E0, 2); - ChangeBgX(BG_SCENE2_PLANTS, 0x110, 1); + ChangeBgX(BG_SCENE2_BACKGROUND, 0x0E0, BG_COORD_SUB); + ChangeBgX(BG_SCENE2_PLANTS, 0x110, BG_COORD_ADD); } -static void Task_FightScene2_CameraVertPanEffect(u8 taskId) +// Pan Gengar up and Nidorino down in the close up shot +static void Scene2_Task_PanMons(u8 taskId) { - ChangeBgY(BG_SCENE2_GENGAR, 0x020, 1); - ChangeBgY(BG_SCENE2_NIDORINO, 0x024, 2); + ChangeBgY(BG_SCENE2_GENGAR, 0x020, BG_COORD_ADD); + ChangeBgY(BG_SCENE2_NIDORINO, 0x024, BG_COORD_SUB); } -static void CreateMonStaticSprites(struct IntroSequenceData * this) +// Create the Gengar/Nidorino sprites for the wide shot in scene 2 +static void Scene2_CreateMonSprites(struct IntroSequenceData * this) { u8 spriteId; - this->gengarStaticSprite = NULL; - this->nidorinoStaticSprite = NULL; + this->scene2GengarSprite = NULL; + this->scene2NidorinoSprite = NULL; spriteId = CreateSprite(&sSpriteTemplate_Scene2_Nidorino, 168, 80, 11); if (spriteId != MAX_SPRITES) - this->nidorinoStaticSprite = &gSprites[spriteId]; + this->scene2NidorinoSprite = &gSprites[spriteId]; spriteId = CreateSprite(&sSpriteTemplate_Scene2_Gengar, 72, 80, 12); if (spriteId != MAX_SPRITES) - this->gengarStaticSprite = &gSprites[spriteId]; + this->scene2GengarSprite = &gSprites[spriteId]; } -static void DestroyStaticMonSprites(struct IntroSequenceData * this) +static void Scene2_DestroyMonSprites(struct IntroSequenceData * this) { - if (this->gengarStaticSprite != NULL) - DestroySprite(this->gengarStaticSprite); - if (this->nidorinoStaticSprite != NULL) - DestroySprite(this->nidorinoStaticSprite); + if (this->scene2GengarSprite != NULL) + DestroySprite(this->scene2GengarSprite); + if (this->scene2NidorinoSprite != NULL) + DestroySprite(this->scene2NidorinoSprite); } -static void IntroCB_FightScene3(struct IntroSequenceData * this) +// Set up the scene 3 graphics, then start the scrolling to get Gengar and Nidorino in their fight positions +static void IntroCB_Scene3_Entrance(struct IntroSequenceData * this) { switch (this->state) { case 0: - LoadPalette(sScene3_Bg_Pal, 0x10, 0x40); - LoadPalette(sGengar_Pal, 0x50, 0x20); - BlendPalettes(0xFFFFFFFE, 16, RGB_WHITE); - InitBgsFromTemplates(0, sBgTemplates_Scene3, NELEMS(sBgTemplates_Scene3)); + LoadPalette(sScene3_Bg_Pal, 0x10, sizeof(sScene3_Bg_Pal)); + LoadPalette(sGengar_Pal, 0x50, sizeof(sGengar_Pal)); + BlendPalettes(PALETTES_ALL & ~1, 16, RGB_WHITE); + InitBgsFromTemplates(0, sBgTemplates_Scene3, ARRAY_COUNT(sBgTemplates_Scene3)); DecompressAndCopyTileDataToVram(BG_SCENE3_BACKGROUND, sScene3_Bg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE3_BACKGROUND, sScene3_Bg_Map, 0, 0, 1); ShowBg(BG_SCENE3_BACKGROUND); @@ -1489,280 +1566,306 @@ static void IntroCB_FightScene3(struct IntroSequenceData * this) ResetBgPositions(); this->state++; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuRegBits(REG_OFFSET_WININ, 0x12); - ClearGpuRegBits(REG_OFFSET_WININ, 0x01); - SetGpuRegBits(REG_OFFSET_WINOUT, 0x00); - SetGpuReg(REG_OFFSET_WIN0V, 0x2080); - SetGpuReg(REG_OFFSET_WIN0H, 0x0078); + SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_OBJ); + ClearGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_BG0); + SetGpuRegBits(REG_OFFSET_WINOUT, 0); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(32, DISPLAY_HEIGHT - 32)); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH / 2)); break; case 1: if (!FreeTempTileDataBuffersIfPossible()) { DecompressAndCopyTileDataToVram(BG_SCENE3_GENGAR, sScene3_GengarAnim_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(BG_SCENE3_GENGAR, sScene3_GengarAnim_Map, 0, 0, 1); - gUnknown_203AB00 = 4; - gUnknown_203AB02 = 52; - ChangeBgX(BG_SCENE3_GENGAR, 0x00001800, 0); - ChangeBgY(BG_SCENE3_GENGAR, 0x0001F000, 0); + sUnusedScene3Var0 = 4; + sUnusedScene3Var1 = 52; + ChangeBgX(BG_SCENE3_GENGAR, 0x00001800, BG_COORD_SET); + ChangeBgY(BG_SCENE3_GENGAR, 0x0001F000, BG_COORD_SET); this->state++; } break; case 2: if (!FreeTempTileDataBuffersIfPossible()) { - BlendPalettes(0xFFFFFFFE, 0, RGB_WHITE); + BlendPalettes(PALETTES_ALL & ~1, 0, RGB_WHITE); ShowBg(BG_SCENE3_GENGAR); - CreateTask(Task_FightScene3_ForestBgScroll, 0); - CreateNidorinoAnimSprite(this); - StartNidorinoAnimSpriteSlideIn(this->nidorinoAnimSprite, 0, 0xB4, 0x34); - CreateTask(Task_FightScene3_Bg0Scroll, 0); - FightScene3_StartBg1Scroll(); - this->data[5] = 0; + CreateTask(Scene3_Task_GengarBounce, 0); + Scene3_CreateNidorinoSprite(this); + Scene3_StartNidorinoEntrance(this->scene3NidorinoSprite, 0, 180, 52); + CreateTask(Scene3_Task_GengarEnter, 0); + Scene3_StartBgScroll(); + this->timer = 0; this->state++; } break; case 3: - if (++this->data[5] == 16) - CreateGrassSprite(this); - if (!IsNidorinoAnimSpriteSlideInRunning(this) && !FuncIsActiveTask(Task_FightScene3_Bg0Scroll)) - SetIntroCB(this, IntroCB_FightScene4); + if (++this->timer == 16) + Scene3_CreateGrassSprite(this); + if (!Scene3_IsNidorinoEntering(this) && !FuncIsActiveTask(Scene3_Task_GengarEnter)) + SetIntroCB(this, IntroCB_Scene3_Fight); break; } } -static void Task_FightScene3_Bg1Scroll(u8 taskId) +#define tSlow data[0] + +// Pan the background trees right during the fight scene. +// It pans quickly while Gengar/Nidorino are sliding onscreen, and it pans slowly thereafter. +static void Scene3_Task_BgScroll(u8 taskId) { - if (gTasks[taskId].data[0] == 0) - ChangeBgX(BG_SCENE3_BACKGROUND, 0x400, 2); + if (!gTasks[taskId].tSlow) + ChangeBgX(BG_SCENE3_BACKGROUND, 0x400, BG_COORD_SUB); else - ChangeBgX(BG_SCENE3_BACKGROUND, 0x020, 2); + ChangeBgX(BG_SCENE3_BACKGROUND, 0x020, BG_COORD_SUB); } -static void FightScene3_StartBg1Scroll(void) +static void Scene3_StartBgScroll(void) { - CreateTask(Task_FightScene3_Bg1Scroll, 0); + CreateTask(Scene3_Task_BgScroll, 0); } -static void FightScene3_SlowBg1Scroll(void) +static void Scene3_SlowBgScroll(void) { - u8 taskId = FindTaskIdByFunc(Task_FightScene3_Bg1Scroll); - gTasks[taskId].data[0] = 1; + u8 taskId = FindTaskIdByFunc(Scene3_Task_BgScroll); + gTasks[taskId].tSlow = TRUE; } -static void Task_FightScene3_ForestBgScroll(u8 taskId) +#undef tSlow + +#define tPaused data[0] +#define tTimer data[1] +#define tState data[2] + +// Gengar has an "idle" animation where it bounces a little +static void Scene3_Task_GengarBounce(u8 taskId) { s16 * data = gTasks[taskId].data; - if (data[0] == 0) + if (!tPaused) { - if (++data[1] >= 30) + if (++tTimer >= 30) { - data[1] = 0; - data[2] ^= 1; - ChangeBgY(BG_SCENE3_GENGAR, (data[2] << 15) + 0x1F000, 0); + tTimer = 0; + tState ^= 1; // Alternate between the 0th (normal) and 1st (slightly crouched) bg frames + ChangeBgY(BG_SCENE3_GENGAR, (tState << 15) + 0x1F000, BG_COORD_SET); } } } -static void FightScene3_PauseForestBgScroll(void) +static void Scene3_PauseGengarBounce(void) { - u8 taskId = FindTaskIdByFunc(Task_FightScene3_ForestBgScroll); - gTasks[taskId].data[0] = 1; + u8 taskId = FindTaskIdByFunc(Scene3_Task_GengarBounce); + gTasks[taskId].tPaused = TRUE; } -static void FightScene3_ResumeForestBgScroll(void) +static void Scene3_ResumeGengarBounce(void) { - u8 taskId = FindTaskIdByFunc(Task_FightScene3_ForestBgScroll); - gTasks[taskId].data[0] = 0; + u8 taskId = FindTaskIdByFunc(Scene3_Task_GengarBounce); + gTasks[taskId].tPaused = FALSE; } -static bool8 FightScene3_GetForestBgScrollState(void) +static bool8 Scene3_IsGengarMidBounce(void) { - u8 taskId = FindTaskIdByFunc(Task_FightScene3_ForestBgScroll); - return gTasks[taskId].data[2]; + u8 taskId = FindTaskIdByFunc(Scene3_Task_GengarBounce); + return gTasks[taskId].tState; } -static void CreateGrassSprite(struct IntroSequenceData * this) +#undef tPaused +#undef tTimer +#undef tState + +// The small clump of grass that passes by in the foreground during the fight +static void Scene3_CreateGrassSprite(struct IntroSequenceData * this) { u8 spriteId = CreateSprite(&sSpriteTemplate_Grass, 296, 112, 7); if (spriteId != MAX_SPRITES) { - this->grassSprite = &gSprites[spriteId]; - this->grassSprite->callback = SpriteCB_Grass; + this->scene3GrassSprite = &gSprites[spriteId]; + this->scene3GrassSprite->callback = SpriteCB_Grass; } else - this->grassSprite = NULL; + this->scene3GrassSprite = NULL; } +#define sState data[0] +#define sBaseX data[1] +#define sVeloc data[2] + static void SpriteCB_Grass(struct Sprite *sprite) { s16 * data = sprite->data; - switch (data[0]) + switch (sState) { case 0: - data[1] = sprite->x << 5; - data[2] = 160; - data[0]++; + sBaseX = sprite->x << 5; + sVeloc = 160; + sState++; // fallthrough case 1: - data[1] -= data[2]; - sprite->x = data[1] >> 5; + sBaseX -= sVeloc; + sprite->x = sBaseX >> 5; if (sprite->x <= 52) { - FightScene3_SlowBg1Scroll(); - data[0]++; + Scene3_SlowBgScroll(); + sState++; } break; case 2: - data[1] -= 32; - sprite->x = data[1] >> 5; + sBaseX -= 32; + sprite->x = sBaseX >> 5; if (sprite->x <= -32) { sprite->invisible = TRUE; - sprite->data[0]++; + sprite->sState++; DestroySprite(sprite); } break; } } -static void IntroCB_FightScene4(struct IntroSequenceData * this) +#undef sState +#undef sBaseX +#undef sVeloc + +static void IntroCB_Scene3_Fight(struct IntroSequenceData * this) { switch (this->state) { case 0: - this->data[5] = 0; + this->timer = 0; this->state++; break; case 1: - if (++this->data[5] > 30) + if (++this->timer > 30) { - FightScene4_NidorinoRearsUp(this); + Scene3_StartNidorinoCry(this); this->state++; } break; case 2: - if (!FightScene4_NidorinoAnimIsRunning(this)) + if (!Scene3_NidorinoAnimIsRunning(this)) { - this->data[5] = 0; + this->timer = 0; this->state++; } break; case 3: - if (++this->data[5] > 30) + if (++this->timer > 30) { - FightScene3_PauseForestBgScroll(); - FightScene4_StartGengarAttack(this); - this->data[5] = 0; + Scene3_PauseGengarBounce(); + Scene3_StartGengarAttack(this); + this->timer = 0; this->state++; } break; case 4: if (this->gengarAttackLanded) { - FightScene4_StartNidorinoRecoilAnim(this); + Scene3_StartNidorinoRecoil(this); this->state++; } break; case 5: - if (!FightScene4_NidorinoAnimIsRunning(this)) + if (!Scene3_NidorinoAnimIsRunning(this)) { - FightScene3_ResumeForestBgScroll(); - this->data[5] = 0; + Scene3_ResumeGengarBounce(); + this->timer = 0; this->state++; } break; case 6: - if (++this->data[5] > 16) + if (++this->timer > 16) { - StartSpriteHopToPosAnim(this->nidorinoAnimSprite, 8, 12, 5); + // Nidorino's 1st hop backwards in preparation to attack + Scene3_StartNidorinoHop(this->scene3NidorinoSprite, 8, 12, 5); this->state++; } break; case 7: - if (!FightScene4_NidorinoAnimIsRunning(this)) + if (!Scene3_NidorinoAnimIsRunning(this)) { - StartSpriteHopToPosAnim(this->nidorinoAnimSprite, 8, 12, 5); + // Nidorino's 2nd hop backwards in preparation to attack + Scene3_StartNidorinoHop(this->scene3NidorinoSprite, 8, 12, 5); this->state++; } break; case 8: - if (!FightScene4_NidorinoAnimIsRunning(this)) + if (!Scene3_NidorinoAnimIsRunning(this)) { - this->data[5] = 0; + this->timer = 0; this->state++; } break; case 9: - if (++this->data[5] > 20) + if (++this->timer > 20) { - StartNidorinoAnim_LaunchSelfAtGengarAnim(this); - this->data[5] = 0; + Scene3_StartNidorinoAttack(this); + this->timer = 0; this->state++; } break; case 10: - if (!FightScene3_GetForestBgScrollState()) + if (!Scene3_IsGengarMidBounce()) { - FightScene3_PauseForestBgScroll(); - CreateGengarBackSprite(this); + Scene3_PauseGengarBounce(); + Scene3_CreateGengarSprite(this); this->state++; } break; case 11: HideBg(BG_SCENE3_GENGAR); - this->data[5] = 0; + this->timer = 0; this->state++; break; case 12: - if (++this->data[5] == 48) - BeginNormalPaletteFade(0x00000006, 2, 0, 16, RGB_WHITE); - if (this->data[5] > 120) + if (++this->timer == 48) + BeginNormalPaletteFade((1 << 1) | (1 << 2), 2, 0, 16, RGB_WHITE); + if (this->timer > 120) { - FightScene4_StartNidorinoAffineAnim(this); - FightScene4_StartGengarAffineAnim(this); + Scene3_NidorinoZoom(this); + Scene3_GengarZoom(this); this->state++; - this->data[5] = 0; + this->timer = 0; } break; case 13: - if (++this->data[5] > 8) + if (++this->timer > 8) { CpuFill16(RGB_WHITE, gPlttBufferUnfaded + 16, 64); - BeginNormalPaletteFade(0xFFFFFFFE, -2, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~1, -2, 0, 16, RGB_BLACK); this->state++; } break; case 14: if (!gPaletteFade.active) { - this->data[5] = 0; + this->timer = 0; this->state++; } break; case 15: - if (++this->data[5] > 60) - SetIntroCB(this, IntroCB_CleanUp); + if (++this->timer > 60) + SetIntroCB(this, IntroCB_ExitToTitleScreen); break; default: if (JOY_NEW(R_BUTTON)) { - BlendPalettes(0xFFFF0064, 0, RGB_WHITE); - this->nidorinoAnimSprite->x2 = 0; - this->nidorinoAnimSprite->x = 0xB4; + BlendPalettes(PALETTES_OBJECTS | (1 << 2) | (1 << 5) | (1 << 6), 0, RGB_WHITE); + this->scene3NidorinoSprite->x2 = 0; + this->scene3NidorinoSprite->x = 180; this->state = 1; - this->data[5] = 30; + this->timer = 30; } break; } } -static void FightScene_CalcCenterToCornerVec(struct Sprite *sprite) +static void Scene3_CalcCenterToCornerVec(struct Sprite *sprite) { CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); } -static void CreateGengarBackSprite(struct IntroSequenceData * this) +static void Scene3_CreateGengarSprite(struct IntroSequenceData * this) { int i; @@ -1775,40 +1878,40 @@ static void CreateGengarBackSprite(struct IntroSequenceData * this) if (spriteId != MAX_SPRITES) { StartSpriteAnim(&gSprites[spriteId], i); - this->gengarBackSprites[i] = &gSprites[spriteId]; + this->scene3GengarSprites[i] = &gSprites[spriteId]; if (i & 1) - this->gengarBackSprites[i]->oam.shape = ST_OAM_V_RECTANGLE; - FightScene_CalcCenterToCornerVec(this->gengarBackSprites[i]); + this->scene3GengarSprites[i]->oam.shape = ST_OAM_V_RECTANGLE; + Scene3_CalcCenterToCornerVec(this->scene3GengarSprites[i]); } } } -static void FightScene4_StartNidorinoAffineAnim(struct IntroSequenceData * this) +static void Scene3_NidorinoZoom(struct IntroSequenceData * this) { - this->nidorinoAnimSprite->x += this->nidorinoAnimSprite->x2; - this->nidorinoAnimSprite->y += this->nidorinoAnimSprite->y2; - obj_pos2_update_enable(this->nidorinoAnimSprite, 0, 0x2A); - this->nidorinoAnimSprite->callback = SpriteCallbackDummy; - StartSpriteAffineAnim(this->nidorinoAnimSprite, 1); + this->scene3NidorinoSprite->x += this->scene3NidorinoSprite->x2; + this->scene3NidorinoSprite->y += this->scene3NidorinoSprite->y2; + SetSpriteMatrixAnchor(this->scene3NidorinoSprite, 0, 42); + this->scene3NidorinoSprite->callback = SpriteCallbackDummy; + StartSpriteAffineAnim(this->scene3NidorinoSprite, AFFINEANIM_ZOOM); } -static void SpriteCB_DummyButNotDummy(struct Sprite *sprite) +static void SpriteCB_Idle(struct Sprite *sprite) { } -static void FightScene4_StartGengarAffineAnim(struct IntroSequenceData * this) +static void Scene3_GengarZoom(struct IntroSequenceData * this) { int i; for (i = 0; i < NUM_GENGAR_BACK_SPRITES; i++) { - StartSpriteAffineAnim(this->gengarBackSprites[i], 1); - this->gengarBackSprites[i]->callback = SpriteCB_DummyButNotDummy; - obj_pos2_update_enable(this->gengarBackSprites[i], sGengarBackSpritePos2UpdateMods[i][0], sGengarBackSpritePos2UpdateMods[i][1]); + StartSpriteAffineAnim(this->scene3GengarSprites[i], AFFINEANIM_ZOOM); + this->scene3GengarSprites[i]->callback = SpriteCB_Idle; + SetSpriteMatrixAnchor(this->scene3GengarSprites[i], sGengarZoomMatrixAnchors[i][0], sGengarZoomMatrixAnchors[i][1]); } } -static void IntroCB_CleanUp(struct IntroSequenceData * this) +static void IntroCB_ExitToTitleScreen(struct IntroSequenceData * this) { switch (this->state) { @@ -1829,45 +1932,63 @@ static void IntroCB_CleanUp(struct IntroSequenceData * this) } } -static void GameFreakScene_LoadGfxCreateStar(void) +// Sprite data for SpriteCB_Star +#define sStar_BaseX data[0] +#define sStar_BaseY data[1] +#define sStar_SpeedX data[2] +#define sStar_SpeedY data[3] +#define sStar_SinIdx data[4] +#define sStar_SparkleTimer data[5] +#define sStar_SparkleRngSeed data[6] + +static void GFScene_LoadGfxCreateStar(void) { int i; u8 spriteId; - static EWRAM_DATA u32 sTrailingSparklesRngSeed = 0; + static EWRAM_DATA u32 sStarSparklesRngSeed = 0; - for (i = 0; i < NELEMS(sSpriteSheets_GameFreakScene); i++) + for (i = 0; i < ARRAY_COUNT(sSpriteSheets_GameFreakScene); i++) LoadCompressedSpriteSheet(&sSpriteSheets_GameFreakScene[i]); LoadSpritePalettes(sSpritePalettes_GameFreakScene); - sLargeStarXSpeed = 0x60; - sLargeStarYSpeed = 0x10; - sTrailingSparklesXmodMask = 0x07; - sUnusedVarRelatedToGameFreakStars = 5; - sTrailingSparklesSpawnRate = 8; - sTrailingSparklesFlickerStartTime = 90; - sTrailingSparklesDestroySpriteTime = 120; - sTrailingSparklesXspeed = 1; - sTrailingSparklesYspeed = 1; - sTrailingSparklesXprecision = 5; - sTrailingSparklesYprecision = 5; - if (sTrailingSparklesRngSeed == 0) - sTrailingSparklesRngSeed = 354128453; - spriteId = CreateSprite(&sSpriteTemplate_Star, 0xF8, 0x37, 0); + sStarSpeedX = 96; + sStarSpeedY = 16; + sStarSparklesXmodMask = 0x07; + sStarSparklesUnusedVar = 5; + sStarSparklesSpawnRate = 8; + sStarSparklesFlickerStartTime = 90; + sStarSparklesDestroySpriteTime = 120; + sStarSparklesXspeed = 1; + sStarSparklesYspeed = 1; + sStarSparklesXprecision = 5; + sStarSparklesYprecision = 5; + if (sStarSparklesRngSeed == 0) + sStarSparklesRngSeed = 354128453; + spriteId = CreateSprite(&sSpriteTemplate_Star, 248, 55, 0); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].data[0] = 0xF80; - gSprites[spriteId].data[1] = 0x370; - gSprites[spriteId].data[2] = sLargeStarXSpeed; - gSprites[spriteId].data[3] = sLargeStarYSpeed; - StoreWordInTwoHalfwords((u16 *)&gSprites[spriteId].data[6], sTrailingSparklesRngSeed); + gSprites[spriteId].sStar_BaseX = 248 << 4; + gSprites[spriteId].sStar_BaseY = 55 << 4; + gSprites[spriteId].sStar_SpeedX = sStarSpeedX; + gSprites[spriteId].sStar_SpeedY = sStarSpeedY; + StoreWordInTwoHalfwords((u16 *)&gSprites[spriteId].sStar_SparkleRngSeed, sStarSparklesRngSeed); } } -static void GameFreakScene_TrailingSparklesGen(s16 x, s16 y, u16 a2) +// Sprite data for SpriteCB_SparklesSmall_Star +#define sSmSparkleStar_BaseX data[0] +#define sSmSparkleStar_BaseY data[1] +#define sSmSparkleStar_SpeedX data[2] +#define sSmSparkleStar_SpeedY data[3] +#define sSmSparkleStar_FallSpeed data[4] +#define sSmSparkleStar_FallDist data[5] +#define sSmSparkleStar_Timer data[7] + +static void GFScene_CreateStarSparkle(s16 x, s16 y, u16 random) { static EWRAM_DATA s16 sYmod = 0; u8 spriteId; - s16 xMod = (a2 & sTrailingSparklesXmodMask) + 2; + s16 xMod = (random & sStarSparklesXmodMask) + 2; s16 yMod = sYmod; if (++sYmod > 3) sYmod = -3; @@ -1878,285 +1999,342 @@ static void GameFreakScene_TrailingSparklesGen(s16 x, s16 y, u16 a2) spriteId = CreateSprite(&sSpriteTemplate_SparklesSmall, x, y, 1); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].data[0] = x << sTrailingSparklesXprecision; - gSprites[spriteId].data[1] = y << sTrailingSparklesYprecision; - gSprites[spriteId].data[2] = sTrailingSparklesXspeed * xMod; - gSprites[spriteId].data[3] = sTrailingSparklesYspeed * yMod; + gSprites[spriteId].sSmSparkleStar_BaseX = x << sStarSparklesXprecision; + gSprites[spriteId].sSmSparkleStar_BaseY = y << sStarSparklesYprecision; + gSprites[spriteId].sSmSparkleStar_SpeedX = sStarSparklesXspeed * xMod; + gSprites[spriteId].sSmSparkleStar_SpeedY = sStarSparklesYspeed * yMod; } } } -static void GameFreakScene_StartTrailingSparkleSpawner(void) +#define tSparkleIdx data[0] +#define tNumLoops data[1] +#define tTimer data[2] + +static void GFScene_StartNameSparklesSmall(void) { - CreateTask(Task_GameFreakScene_TrailingSparkleSpawner, 1); + CreateTask(GFScene_Task_NameSparklesSmall, 1); } -static void Task_GameFreakScene_TrailingSparkleSpawner(u8 taskId) +// Sprite data for SpriteCB_SparklesSmall_Name +#define sSmSparkleName_State data[0] +#define sSmSparkleName_BaseY data[1] +#define sSmSparkleName_AnimTimer data[2] +#define sSmSparkleName_NumLoops data[3] +#define sSmSparkleName_DestroyTimer data[4] + +static void GFScene_Task_NameSparklesSmall(u8 taskId) { s16 * data = gTasks[taskId].data; - u8 r6; + u8 i; u8 spriteId; - data[2]++, data[3]++; - if (data[2] > 6) + tTimer++; + data[3]++; // Unused + if (tTimer > 6) { - data[2] = 0; - r6 = data[0]; - spriteId = CreateSprite(&sSpriteTemplate_SparklesSmall, sTrailingSparkleCoords[r6].x, sTrailingSparkleCoords[r6].y, 2); - StartSpriteAnim(&gSprites[spriteId], 1); - gSprites[spriteId].callback = SpriteCB_SparklesSmall2; - gSprites[spriteId].data[1] = sTrailingSparkleCoords[r6].y << 4; - gSprites[spriteId].data[2] = 120; - gSprites[spriteId].data[3] = data[1]; - if (gSprites[spriteId].data[3] < 0) - gSprites[spriteId].data[3] = 1; - if (++data[0] >= NELEMS(sTrailingSparkleCoords)) + tTimer = 0; + i = tSparkleIdx; + spriteId = CreateSprite(&sSpriteTemplate_SparklesSmall, sTextSparkleCoords[i].x, sTextSparkleCoords[i].y, 2); + StartSpriteAnim(&gSprites[spriteId], ANIM_SPARKLE_ONCE); + gSprites[spriteId].callback = SpriteCB_SparklesSmall_Name; + gSprites[spriteId].sSmSparkleName_BaseY = sTextSparkleCoords[i].y << 4; + gSprites[spriteId].sSmSparkleName_AnimTimer = 120; + gSprites[spriteId].sSmSparkleName_NumLoops = tNumLoops; + if (gSprites[spriteId].sSmSparkleName_NumLoops < 0) + gSprites[spriteId].sSmSparkleName_NumLoops = 1; + if (++tSparkleIdx >= ARRAY_COUNT(sTextSparkleCoords)) { - if (++data[1] > 1) + if (++tNumLoops > 1) DestroyTask(taskId); else - data[0] = 0; + tSparkleIdx = 0; } } } -static void GameFreakScene_StartRevealGameFreakTextSparklesSpawner(void) +#undef tSparkleIdx +#undef tNumLoops +#undef tTimer + +#define tTimer data[0] +#define tSparkleIdx data[1] +#define tNumSparkles data[2] + +static void GFScene_StartNameSparklesBig(void) { - CreateTask(Task_RevealGameFreakTextSparklesSpawner, 2); + CreateTask(GFScene_Task_NameSparklesBig, 2); } -static void Task_RevealGameFreakTextSparklesSpawner(u8 taskId) +static void GFScene_Task_NameSparklesBig(u8 taskId) { s16 * data = gTasks[taskId].data; - u8 r2; + u8 i; - if (data[0] == 0) + if (tTimer == 0) { - r2 = data[1]; - data[1] += 4; - if (data[1] >= NELEMS(sTrailingSparkleCoords)) - data[1] -= NELEMS(sTrailingSparkleCoords); - CreateSprite(&sSpriteTemplate_SparklesBig, sTrailingSparkleCoords[r2].x, sTrailingSparkleCoords[r2].y, 3); - if (++data[2] > 8) + i = tSparkleIdx; + tSparkleIdx += 4; + if (tSparkleIdx >= ARRAY_COUNT(sTextSparkleCoords)) + tSparkleIdx -= ARRAY_COUNT(sTextSparkleCoords); + CreateSprite(&sSpriteTemplate_SparklesBig, sTextSparkleCoords[i].x, sTextSparkleCoords[i].y, 3); + if (++tNumSparkles >= (int)ARRAY_COUNT(sTextSparkleCoords)) DestroyTask(taskId); } - if (++data[0] > 9) - data[0] = 0; + if (++tTimer > 9) + tTimer = 0; } -static struct Sprite *CreateGameFreakLogoArtSprite(void) +#undef tTimer +#undef tSparkleIdx +#undef tNumSparkles + +static struct Sprite *GFScene_CreateLogoSprite(void) { u8 spriteId = CreateSprite(&sSpriteTemplate_GameFreakLogoArt, 120, 70, 4); return &gSprites[spriteId]; } #if REVISION >= 1 -static void CreateGameFreakPresentsText(void) +static void GFScene_CreatePresentsSprite(void) { int i; for (i = 0; i < 2; i++) - gSprites[CreateSprite(&sSpriteTemplate_PresentsText, 0x68 + 32 * i, 0x6c, 5)].oam.tileNum += i * 4; + gSprites[CreateSprite(&sSpriteTemplate_Presents, 104 + 32 * i, 108, 5)].oam.tileNum += i * 4; } #endif -static void FightScene4_StartGengarAttack(struct IntroSequenceData * this) +#define tState data[0] +#define tTimer data[1] +#define tSinIdx data[3] +#define tBaseX data[4] +#define IDX_INTRO_DATA 5 // A pointer to the IntroSequenceData will be stored at data[5] and data[6] +#define tFrame data[7] +#define tMultY data[8] +#define tMultX data[9] + +static void Scene3_StartGengarAttack(struct IntroSequenceData * this) { u8 taskId; this->gengarAttackLanded = FALSE; - taskId = CreateTask(Task_FightScene4_GengarAttack, 4); - SetWordTaskArg(taskId, 5, (uintptr_t)this); - gTasks[taskId].data[3] = 64; - gTasks[taskId].data[4] = GetBgX(BG_SCENE3_GENGAR); + taskId = CreateTask(Scene3_Task_GengarAttack, 4); + SetWordTaskArg(taskId, IDX_INTRO_DATA, (uintptr_t)this); + gTasks[taskId].tSinIdx = 64; + gTasks[taskId].tBaseX = GetBgX(BG_SCENE3_GENGAR); } -static void FightScene4_ApplyGengarAnim(int a, int b, int c, int d) +static void Scene3_ApplyGengarAnim(int frame, int xSub, int ySub, int xBase) { - ChangeBgY(BG_SCENE3_GENGAR, (a << 15) + 0x1F000, 0); - ChangeBgX(BG_SCENE3_GENGAR, d, 0); - ChangeBgX(BG_SCENE3_GENGAR, b << 8, 2); - ChangeBgY(BG_SCENE3_GENGAR, c << 8, 2); + ChangeBgY(BG_SCENE3_GENGAR, (frame << 15) + 0x1F000, BG_COORD_SET); + ChangeBgX(BG_SCENE3_GENGAR, xBase, BG_COORD_SET); + ChangeBgX(BG_SCENE3_GENGAR, xSub << 8, BG_COORD_SUB); + ChangeBgY(BG_SCENE3_GENGAR, ySub << 8, BG_COORD_SUB); } -static void Task_FightScene4_GengarAttack(u8 taskId) +static void Scene3_Task_GengarAttack(u8 taskId) { s16 * data = gTasks[taskId].data; - int b, c; - int angle; - switch (data[0]) + s32 xSub, ySub; + s32 sinIdx; + switch (tState) { case 0: - data[7] = 2; - data[1] = 0; - data[8] = 6; - data[9] = 32; - data[0]++; + tFrame = 2; // Gengar raises arm up + tTimer = 0; + tMultY = 6; + tMultX = 32; + tState++; break; case 1: - data[3] -= 2; - if (++data[1] > 15) + // Gengar moves in a backward arc + tSinIdx -= 2; + if (++tTimer > 15) { - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } break; case 2: - if (++data[1] == 14) - ((struct IntroSequenceData *)GetWordTaskArg(taskId, 5))->gengarAttackLanded = TRUE; - if (data[1] > 15) + // Gengar pauses at end of backward arc + if (++tTimer == 14) + ((struct IntroSequenceData *)GetWordTaskArg(taskId, IDX_INTRO_DATA))->gengarAttackLanded = TRUE; + if (tTimer > 15) { - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } break; case 3: - data[3] += 8; - if (++data[1] == 4) + // Gengar moves in a forward arc + tSinIdx += 8; + if (++tTimer == 4) { - FightScene4_CreateGengarSwipeSprites(); - data[8] = 32; - data[9] = 48; - data[7] = 3; + Scene3_CreateGengarSwipeSprites(); + tMultY = 32; + tMultX = 48; + tFrame = 3; // Gengar swipes arm down } - if (data[1] > 7) + if (tTimer > 7) { - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } break; case 4: - data[3] -= 8; - if (++data[1] > 3) + // Gengar moves in a backward arc to its original position + tSinIdx -= 8; + if (++tTimer > 3) { - data[7] = 0; - data[3] = 64; - data[1] = 0; - data[0]++; + tFrame = 0; // Gengar returns to normal posture + tSinIdx = 64; + tTimer = 0; + tState++; } break; case 5: DestroyTask(taskId); return; } - angle = data[3]; - b = -((gSineTable[angle + 0x40] * data[9]) >> 8); - c = data[8] - ((gSineTable[angle] * data[8]) >> 8); - FightScene4_ApplyGengarAnim(data[7], b, c, data[4]); + + // Animate current movement arc / frame change + sinIdx = tSinIdx; + xSub = -((gSineTable[sinIdx + 64] * tMultX) >> 8); + ySub = tMultY - ((gSineTable[sinIdx] * tMultY) >> 8); + Scene3_ApplyGengarAnim(tFrame, xSub, ySub, tBaseX); } -static void FightScene4_CreateGengarSwipeSprites(void) +#undef tState +#undef tTimer +#undef tSinIdx +#undef tBaseX +#undef IDX_INTRO_DATA +#undef tFrame +#undef tMultY +#undef tMultX + +static void Scene3_CreateGengarSwipeSprites(void) { - u8 spriteId; - - spriteId = CreateSprite(&sSpriteTemplate_GengarSwipe, 132, 78, 6); + u8 spriteId = CreateSprite(&sSpriteTemplate_GengarSwipe, 132, 78, 6); // Implicitly ANIM_SWIPE_TOP spriteId = CreateSprite(&sSpriteTemplate_GengarSwipe, 132, 118, 6); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].oam.shape = ST_OAM_H_RECTANGLE; - gSprites[spriteId].oam.size = ST_OAM_SIZE_2; - FightScene_CalcCenterToCornerVec(&gSprites[spriteId]); - StartSpriteAnim(&gSprites[spriteId], 1); + gSprites[spriteId].oam.shape = SPRITE_SHAPE(32x16); + gSprites[spriteId].oam.size = SPRITE_SIZE(32x16); + Scene3_CalcCenterToCornerVec(&gSprites[spriteId]); + StartSpriteAnim(&gSprites[spriteId], ANIM_SWIPE_BOTTOM); } } static void SpriteCB_GengarSwipe(struct Sprite *sprite) { - sprite->invisible ^= TRUE; + sprite->invisible ^= 1; if (sprite->animEnded) DestroySprite(sprite); } -static void Task_FightScene3_Bg0Scroll(u8 taskId) +#define tState data[0] +#define tSpeed data[1] +#define tMoves data[2] + +// Scroll Gengar into position for the fight +static void Scene3_Task_GengarEnter(u8 taskId) { s16 * data = gTasks[taskId].data; - static EWRAM_DATA u32 gUnknown_203AB30 = 0; + static EWRAM_DATA u32 sGengarScroll = 0; - switch (data[0]) + switch (tState) { case 0: - data[1] = 0x400; - data[0]++; + tSpeed = 0x400; + tState++; // fallthrough case 1: - if (++data[2] > 39 && data[1] > 16) - data[1] -= 16; - gUnknown_203AB30 = ChangeBgX(BG_SCENE3_GENGAR, data[1], 1); - if (gUnknown_203AB30 >= 0x8000) + // Don't decelerate for the first 40 movements + if (++tMoves >= 40 && tSpeed > 16) + tSpeed -= 16; + sGengarScroll = ChangeBgX(BG_SCENE3_GENGAR, tSpeed, BG_COORD_ADD); + + if (sGengarScroll >= 0x8000) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - if (gUnknown_203AB30 >= 0xEF00) + + if (sGengarScroll >= 0xEF00) { - ChangeBgX(BG_SCENE3_GENGAR, 0xEF00, 0); + ChangeBgX(BG_SCENE3_GENGAR, 0xEF00, BG_COORD_SET); DestroyTask(taskId); } break; } } -static void SpriteCB_LargeStar(struct Sprite *sprite) +#undef tState +#undef tSpeed +#undef tMoves + +static void SpriteCB_Star(struct Sprite *sprite) { - unsigned v; - sprite->data[0] -= sprite->data[2]; - sprite->data[1] += sprite->data[3]; - sprite->data[4] += 48; - sprite->x = sprite->data[0] >> 4; - sprite->y = sprite->data[1] >> 4; - sprite->y2 = gSineTable[(sprite->data[4] >> 4) + 0x40] >> 5; - sprite->data[5]++; - if (sprite->data[5] % sTrailingSparklesSpawnRate) + u32 random; + sprite->sStar_BaseX -= sprite->sStar_SpeedX; + sprite->sStar_BaseY += sprite->sStar_SpeedY; + sprite->sStar_SinIdx += 48; + sprite->x = sprite->sStar_BaseX >> 4; + sprite->y = sprite->sStar_BaseY >> 4; + sprite->y2 = gSineTable[(sprite->sStar_SinIdx >> 4) + 64] >> 5; + sprite->sStar_SparkleTimer++; + if (sprite->sStar_SparkleTimer % sStarSparklesSpawnRate) { - LoadWordFromTwoHalfwords(&sprite->data[6], &v); - v = ISO_RANDOMIZE1(v); - StoreWordInTwoHalfwords(&sprite->data[6], v); - v >>= 16; - GameFreakScene_TrailingSparklesGen(sprite->x, sprite->y + sprite->y2, v); + LoadWordFromTwoHalfwords(&sprite->sStar_SparkleRngSeed, &random); + random = ISO_RANDOMIZE1(random); + StoreWordInTwoHalfwords(&sprite->sStar_SparkleRngSeed, random); + random >>= 16; + GFScene_CreateStarSparkle(sprite->x, sprite->y + sprite->y2, random); } if (sprite->x < -8) DestroySprite(sprite); } -static void SpriteCB_SparklesSmall(struct Sprite *sprite) +// Callback for the sparkles that trail behind the star +static void SpriteCB_SparklesSmall_Star(struct Sprite *sprite) { - u32 v; - - sprite->data[0] += sprite->data[2]; - sprite->data[1] += sprite->data[3]; - sprite->data[4]++; - sprite->data[5] += sprite->data[4]; - sprite->data[7]++; - sprite->x = (u16)sprite->data[0] >> sTrailingSparklesXprecision; - sprite->y = sprite->data[1] >> sTrailingSparklesYprecision; - if (sTrailingSparklesGravityShift && sprite->data[3] < 0) - sprite->y2 = sprite->data[5] >> sTrailingSparklesGravityShift; - if (sprite->data[7] > sTrailingSparklesFlickerStartTime) + sprite->sSmSparkleStar_BaseX += sprite->sSmSparkleStar_SpeedX; + sprite->sSmSparkleStar_BaseY += sprite->sSmSparkleStar_SpeedY; + sprite->sSmSparkleStar_FallDist += ++sprite->sSmSparkleStar_FallSpeed; + sprite->sSmSparkleStar_Timer++; + sprite->x = (u16)sprite->sSmSparkleStar_BaseX >> sStarSparklesXprecision; + sprite->y = sprite->sSmSparkleStar_BaseY >> sStarSparklesYprecision; + if (sStarSparklesGravityShift && sprite->sSmSparkleStar_SpeedY < 0) + sprite->y2 = sprite->sSmSparkleStar_FallDist >> sStarSparklesGravityShift; + if (sprite->sSmSparkleStar_Timer > sStarSparklesFlickerStartTime) { sprite->invisible = !sprite->invisible; - if (sprite->data[7] > sTrailingSparklesDestroySpriteTime) + if (sprite->sSmSparkleStar_Timer > sStarSparklesDestroySpriteTime) DestroySprite(sprite); } - if (sprite->y + sprite->y2 < 0 || sprite->y + sprite->y2 > 160) + if (sprite->y + sprite->y2 < 0 || sprite->y + sprite->y2 > DISPLAY_HEIGHT) DestroySprite(sprite); } -static void SpriteCB_SparklesSmall2(struct Sprite *sprite) +// Callback for the small sparkles during the "Game Freak" text reveal +static void SpriteCB_SparklesSmall_Name(struct Sprite *sprite) { - if (sprite->data[2]) + if (sprite->sSmSparkleName_AnimTimer) { - sprite->data[2]--; - sprite->data[1]++; - sprite->y = sprite->data[1] >> 4; - if (sprite->y > 0x56) + sprite->sSmSparkleName_AnimTimer--; + sprite->sSmSparkleName_BaseY++; + sprite->y = sprite->sSmSparkleName_BaseY >> 4; + if (sprite->y > 86) { - sprite->y = 0x4A; - sprite->data[1] = 0x4A0; + sprite->y = 74; + sprite->sSmSparkleName_BaseY = 74 << 4; } if (sprite->animEnded) { - if (sprite->data[0] == 0) + if (sprite->sSmSparkleName_State == 0) { sprite->x += 26; if (sprite->x > 188) { - sprite->x = 376 - sprite->x; - sprite->data[0] = 1; + sprite->x = (188 * 2) - sprite->x; + sprite->sSmSparkleName_State = 1; } } else @@ -2164,106 +2342,126 @@ static void SpriteCB_SparklesSmall2(struct Sprite *sprite) sprite->x -= 26; if (sprite->x < 52) { - sprite->x = 104 - sprite->x; - sprite->data[0] = 0; + sprite->x = (52 * 2) - sprite->x; + sprite->sSmSparkleName_State = 0; } } - StartSpriteAnim(sprite, 1); + StartSpriteAnim(sprite, ANIM_SPARKLE_ONCE); } } else { - if (sprite->data[3]) + if (sprite->sSmSparkleName_NumLoops) DestroySprite(sprite); if (sprite->animEnded) - StartSpriteAnim(sprite, 0); - sprite->data[1] += 4; - sprite->y = sprite->data[1] >> 4; - if (++sprite->data[4] > 50) + StartSpriteAnim(sprite, ANIM_SPARKLE_LOOP); + sprite->sSmSparkleName_BaseY += 4; + sprite->y = sprite->sSmSparkleName_BaseY >> 4; + if (++sprite->sSmSparkleName_DestroyTimer > 50) DestroySprite(sprite); } } -static void SpriteCB_RevealGameFreakTextSparkles(struct Sprite *sprite) +// Callback for the big sparkles during the "Game Freak" text reveal +static void SpriteCB_SparklesBig(struct Sprite *sprite) { if (sprite->animEnded) DestroySprite(sprite); } -static void CreateNidorinoAnimSprite(struct IntroSequenceData * this) +static void Scene3_CreateNidorinoSprite(struct IntroSequenceData * this) { u8 spriteId = CreateSprite(&sSpriteTemplate_Scene3_Nidorino, 0, 0, 9); - this->nidorinoAnimSprite = &gSprites[spriteId]; + this->scene3NidorinoSprite = &gSprites[spriteId]; } -static void StartNidorinoAnimSpriteSlideIn(struct Sprite *sprite, s16 x0, s16 x1, u16 speed) +#define sX data[0] +#define sSpeed data[1] +#define sTime data[2] // Not read +#define sTargetX data[3] +#define sTimer data[4] + +static void Scene3_StartNidorinoEntrance(struct Sprite *sprite, s16 xStart, s16 x1, u16 time) { - sprite->data[0] = x0 << 4; - sprite->data[1] = ((x1 - x0) << 4) / speed; - sprite->data[2] = speed; - sprite->data[3] = x1; - sprite->data[4] = 0; - sprite->x = x0; + sprite->sX = xStart << 4; + sprite->sSpeed = ((x1 - xStart) << 4) / time; + sprite->sTime = time; + sprite->sTargetX = x1; + sprite->sTimer = 0; + sprite->x = xStart; sprite->y = 100; - sprite->callback = SpriteCB_NidorinoAnimSpriteSlideIn; + sprite->callback = Scene3_SpriteCB_NidorinoEnter; } -static void SpriteCB_NidorinoAnimSpriteSlideIn(struct Sprite *sprite) +static void Scene3_SpriteCB_NidorinoEnter(struct Sprite *sprite) { - if (++sprite->data[4] >= 40) + if (++sprite->sTimer >= 40) { - if (sprite->data[1] > 1) - sprite->data[1]--; + // Start decelerating after 40 frames + if (sprite->sSpeed > 1) + sprite->sSpeed--; } - sprite->data[0] += sprite->data[1]; - sprite->x = sprite->data[0] >> 4; - if (sprite->x >= sprite->data[3]) + sprite->sX += sprite->sSpeed; + sprite->x = sprite->sX >> 4; + if (sprite->x >= sprite->sTargetX) { - sprite->x = sprite->data[3]; + // Reached final position + sprite->x = sprite->sTargetX; sprite->callback = SpriteCallbackDummy; } } -static bool32 IsNidorinoAnimSpriteSlideInRunning(struct IntroSequenceData * ptr) +static bool32 Scene3_IsNidorinoEntering(struct IntroSequenceData * ptr) { - return ptr->nidorinoAnimSprite->callback == SpriteCB_NidorinoAnimSpriteSlideIn ? TRUE : FALSE; + return ptr->scene3NidorinoSprite->callback == Scene3_SpriteCB_NidorinoEnter ? TRUE : FALSE; } -static void FightScene4_NidorinoRearsUp(struct IntroSequenceData * ptr) +#undef sX +#undef sSpeed +#undef sTime +#undef sTargetX +#undef sTimer + +#define sState data[0] +#define sStateTimer data[1] +#define sBounceTimer data[2] + +static void Scene3_StartNidorinoCry(struct IntroSequenceData * ptr) { - StartSpriteAnim(ptr->nidorinoAnimSprite, 2); - ptr->nidorinoAnimSprite->data[0] = 0; - ptr->nidorinoAnimSprite->data[1] = 0; - ptr->nidorinoAnimSprite->y2 = 3; - ptr->nidorinoAnimSprite->callback = SpriteCB_NidorinoRearsUp; + StartSpriteAnim(ptr->scene3NidorinoSprite, ANIM_NIDORINO_CROUCH); + ptr->scene3NidorinoSprite->sState = 0; + ptr->scene3NidorinoSprite->sStateTimer = 0; + ptr->scene3NidorinoSprite->y2 = 3; + ptr->scene3NidorinoSprite->callback = SpriteCB_NidorinoCry; } -static void SpriteCB_NidorinoRearsUp(struct Sprite *sprite) +static void SpriteCB_NidorinoCry(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: - if (++sprite->data[1] > 8) + if (++sprite->sStateTimer > 8) { - StartSpriteAnim(sprite, 1); + StartSpriteAnim(sprite, ANIM_NIDORINO_CRY); sprite->y2 = 0; - sprite->data[0]++; + sprite->sState++; } break; case 1: PlayCry_ByMode(SPECIES_NIDORINO, 0x3F, CRY_MODE_DOUBLES); - sprite->data[1] = 0; - sprite->data[0]++; + sprite->sStateTimer = 0; + sprite->sState++; break; case 2: - if (++sprite->data[2] > 1) + if (++sprite->sBounceTimer > 1) { - sprite->data[2] = 0; + // Nidorino bounces slightly while crying + sprite->sBounceTimer = 0; sprite->y2 = sprite->y2 == 0 ? 1 : 0; } - if (++sprite->data[1] > 48) + if (++sprite->sStateTimer > 48) { - StartSpriteAnim(sprite, 0); + StartSpriteAnim(sprite, ANIM_NIDORINO_NORMAL); sprite->y2 = 0; sprite->callback = SpriteCallbackDummy; } @@ -2271,256 +2469,328 @@ static void SpriteCB_NidorinoRearsUp(struct Sprite *sprite) } } -static void FightScene4_StartNidorinoRecoilAnim(struct IntroSequenceData * ptr) +#undef sState +#undef sStateTimer +#undef sBounceTimer + +#define sState data[0] +#define sStateTimer data[1] +#define sOffsetX data[2] +#define sSinIdx data[3] +#define sLandTimer data[4] +#define sSlowdownTimer data[5] +#define sRandSeed data[6] +#define sSpeedX data[7] + +static void Scene3_StartNidorinoRecoil(struct IntroSequenceData * ptr) { - gUnknown_203AB0A = 16; - gUnknown_203AB04 = 3; - gUnknown_203AB08 = 5; - gUnknown_203AB06 = 0; - StartSpriteAnim(ptr->nidorinoAnimSprite, 2); - ptr->nidorinoAnimSprite->data[0] = 0; - ptr->nidorinoAnimSprite->data[1] = 0; - ptr->nidorinoAnimSprite->data[2] = 0; - ptr->nidorinoAnimSprite->data[3] = 0; - ptr->nidorinoAnimSprite->data[4] = 0; - ptr->nidorinoAnimSprite->data[7] = 40; - ptr->nidorinoAnimSprite->callback = SpriteCB_NidorinoRecoil; + sNidorinoRecoilReturnTime = 16; + sNidorinoJumpMult = 3; + sNidorinoJumpDiv = 5; + sNidorinoAnimDelayTime = 0; + StartSpriteAnim(ptr->scene3NidorinoSprite, ANIM_NIDORINO_CROUCH); + ptr->scene3NidorinoSprite->sState = 0; + ptr->scene3NidorinoSprite->sStateTimer = 0; + ptr->scene3NidorinoSprite->sOffsetX = 0; + ptr->scene3NidorinoSprite->sSinIdx = 0; + ptr->scene3NidorinoSprite->sLandTimer = 0; + ptr->scene3NidorinoSprite->sSpeedX = 40; + ptr->scene3NidorinoSprite->callback = SpriteCB_NidorinoRecoil; } static void SpriteCB_NidorinoRecoil(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: - sprite->data[1]++; - if (sprite->data[1] > 4) + if (++sprite->sStateTimer > 4) { - StartSpriteAnim(sprite, 3); - sprite->data[0]++; + StartSpriteAnim(sprite, ANIM_NIDORINO_HOP); + sprite->sState++; } break; case 1: - sprite->data[2] += sprite->data[7]; - sprite->data[3] += 8; - sprite->x2 = sprite->data[2] >> 4; - sprite->y2 = -((gSineTable[sprite->data[3]] * gUnknown_203AB04) >> gUnknown_203AB08); - sprite->data[5]++; - if (sprite->data[5] > gUnknown_203AB06) + // Nidorino jumping backwards in the air + sprite->sOffsetX += sprite->sSpeedX; + sprite->sSinIdx += 8; + sprite->x2 = sprite->sOffsetX >> 4; + sprite->y2 = -((gSineTable[sprite->sSinIdx] * sNidorinoJumpMult) >> sNidorinoJumpDiv); + sprite->sSlowdownTimer++; + if (sprite->sSlowdownTimer > sNidorinoAnimDelayTime) { - sprite->data[5] = 0; - sprite->data[7]--; + sprite->sSlowdownTimer = 0; + sprite->sSpeedX--; } - sprite->data[4]++; - if (sprite->data[4] > 15) + if (++sprite->sLandTimer > 15) { - StartSpriteAnim(sprite, 2); - sprite->data[1] = 0; - sprite->data[6] = 0x4757; - sprite->data[7] = 28; - sprite->data[0]++; + // Nidorino hits the ground + StartSpriteAnim(sprite, ANIM_NIDORINO_CROUCH); + sprite->sStateTimer = 0; + sprite->sRandSeed = 0x4757; + sprite->sSpeedX = 28; + sprite->sState++; } break; case 2: - sprite->data[2] += sprite->data[7]; - sprite->x2 = sprite->data[2] >> 4; - sprite->data[1]++; - if (sprite->data[1] > 6) + // Nidorino sliding on the ground + sprite->sOffsetX += sprite->sSpeedX; + sprite->x2 = sprite->sOffsetX >> 4; + if (++sprite->sStateTimer > 6) { - CreateNidorinoRecoilDustSprites(sprite->x + sprite->x2, sprite->y + sprite->y2, sprite->data[6]); - sprite->data[6] *= RAND_MULT; + // The position of each subsequent dust sprite is "random", but with a fixed + // initial seed so that they'll be in the same positions between intro runs + CreateNidorinoRecoilDustSprites(sprite->x + sprite->x2, sprite->y + sprite->y2, sprite->sRandSeed); + sprite->sRandSeed *= RAND_MULT; } - if (sprite->data[1] > 12) + if (sprite->sStateTimer > 12) { - StartSpriteAnim(sprite, 0); - sprite->data[1] = 0; - sprite->data[0]++; + StartSpriteAnim(sprite, ANIM_NIDORINO_NORMAL); + sprite->sStateTimer = 0; + sprite->sState++; } break; case 3: - sprite->data[1]++; - if (sprite->data[1] > 16) - StartSpriteHopToPosAnim(sprite, gUnknown_203AB0A, -sprite->x2, 4); + // Nidorino hops back to its original position + if (++sprite->sStateTimer > 16) + Scene3_StartNidorinoHop(sprite, sNidorinoRecoilReturnTime, -sprite->x2, 4); break; } } -static bool8 FightScene4_NidorinoAnimIsRunning(struct IntroSequenceData * ptr) +#undef sState +#undef sStateTimer +#undef sOffsetX +#undef sSinIdx +#undef sLandTimer +#undef sSlowdownTimer +#undef sRandSeed +#undef sSpeedX + +static bool8 Scene3_NidorinoAnimIsRunning(struct IntroSequenceData * ptr) { - return ptr->nidorinoAnimSprite->callback == SpriteCallbackDummy ? FALSE : TRUE; + return ptr->scene3NidorinoSprite->callback == SpriteCallbackDummy ? FALSE : TRUE; } +#define sState data[0] +#define sX data[1] +#define sY data[2] +#define sSpeedX data[3] +#define sSpeedY data[4] +#define sInvisibleTimer data[7] + static void CreateNidorinoRecoilDustSprites(s16 x, s16 y, s16 seed) { int i; u8 spriteId; + // Recoil dust sprites are created in pairs at the same initial position but with different speeds. + // Only one of each pair will be visible at a time. for (i = 0; i < 2; i++) { spriteId = CreateSprite(&sSpriteTemplate_NidorinoRecoilDust, x - 22, y + 24, 10); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].data[3] = (seed % 13) + 8; - gSprites[spriteId].data[4] = seed % 3; - gSprites[spriteId].data[7] = i; + gSprites[spriteId].sSpeedX = (seed % 13) + 8; + gSprites[spriteId].sSpeedY = seed % 3; + gSprites[spriteId].sInvisibleTimer = i; seed *= RAND_MULT; } } } -static void SpriteCB_NidorinoRecoilDust(struct Sprite *sprite) +static void SpriteCB_RecoilDust(struct Sprite *sprite) { s16 * data = sprite->data; - switch (sprite->data[0]) + switch (sprite->sState) { case 0: - data[1] = sprite->x << 4; - data[2] = sprite->y << 4; - sprite->data[0]++; + sX = sprite->x << 4; + sY = sprite->y << 4; + sprite->sState++; // fallthrough case 1: - data[1] -= data[3]; - data[2] += data[4]; - sprite->x = data[1] >> 4; - sprite->y = data[2] >> 4; + sX -= sSpeedX; + sY += sSpeedY; + sprite->x = sX >> 4; + sprite->y = sY >> 4; if (sprite->animEnded) DestroySprite(sprite); break; } - if (++data[7] > 1) + + // Recoil dust flashes in and out + if (++sInvisibleTimer > 1) { - data[7] = 0; - sprite->invisible ^= TRUE; + sInvisibleTimer = 0; + sprite->invisible ^= 1; } } -static void StartSpriteHopToPosAnim(struct Sprite *sprite, u16 a1, s16 a2, u8 a3) +#undef sState +#undef sX +#undef sY +#undef sSpeedX +#undef sSpeedY +#undef sInvisibleTimer + +#define sState data[0] +#define sAirTime data[1] +#define sOffsetX data[2] +#define sSpeedX data[3] +#define sSinIdx data[4] +#define sSpeedY data[5] +#define sTimer data[6] +#define sHeightShift data[7] + +static void Scene3_StartNidorinoHop(struct Sprite *sprite, u16 time, s16 targetX, u8 heightShift) { - sprite->data[0] = 0; - sprite->data[1] = a1; - sprite->data[2] = sprite->x2 << 4; - sprite->data[3] = (a2 << 4) / a1; - sprite->data[4] = 0; - sprite->data[5] = 0x800 / a1; - sprite->data[6] = 0; - sprite->data[7] = a3; - StartSpriteAnim(sprite, 2); - sprite->callback = SpriteCB_HopToPos; + sprite->sState = 0; + sprite->sAirTime = time; + sprite->sOffsetX = sprite->x2 << 4; + sprite->sSpeedX = (targetX << 4) / time; + sprite->sSinIdx = 0; + sprite->sSpeedY = 0x800 / time; + sprite->sTimer = 0; + sprite->sHeightShift = heightShift; + StartSpriteAnim(sprite, ANIM_NIDORINO_CROUCH); + sprite->callback = SpriteCB_NidorinoHop; } -static void SpriteCB_HopToPos(struct Sprite *sprite) +static void SpriteCB_NidorinoHop(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: - if (++sprite->data[6] > 4) + if (++sprite->sTimer > 4) { - StartSpriteAnim(sprite, 3); - sprite->data[6] = 0; - sprite->data[0]++; + StartSpriteAnim(sprite, ANIM_NIDORINO_HOP); + sprite->sTimer = 0; + sprite->sState++; } break; case 1: - sprite->data[1]--; - if (sprite->data[1]) + if (--sprite->sAirTime) { - sprite->data[2] += sprite->data[3]; - sprite->data[4] += sprite->data[5]; - sprite->x2 = sprite->data[2] >> 4; - sprite->y2 = -(gSineTable[sprite->data[4] >> 4] >> sprite->data[7]); + // Nidorino moving through the air + sprite->sOffsetX += sprite->sSpeedX; + sprite->sSinIdx += sprite->sSpeedY; + sprite->x2 = sprite->sOffsetX >> 4; + sprite->y2 = -(gSineTable[sprite->sSinIdx >> 4] >> sprite->sHeightShift); } else { - sprite->x2 = (u16)sprite->data[2] >> 4; + // Nidorino lands + sprite->x2 = (u16)sprite->sOffsetX >> 4; sprite->y2 = 0; - StartSpriteAnim(sprite, 2); - if (sprite->data[7] == 5) + StartSpriteAnim(sprite, ANIM_NIDORINO_CROUCH); + if (sprite->sHeightShift == 5) + { + // This is used by the short hops before Nidorino's attack. + // The last state is skipped so that Nidorino will stay in the crouched animation. sprite->callback = SpriteCallbackDummy; + } else { - sprite->data[6] = 0; - sprite->data[0]++; + sprite->sTimer = 0; + sprite->sState++; } } break; case 2: - if (++sprite->data[6] > 4) + if (++sprite->sTimer > 4) { - StartSpriteAnim(sprite, 0); + StartSpriteAnim(sprite, ANIM_NIDORINO_NORMAL); sprite->callback = SpriteCallbackDummy; } break; } } -static void StartNidorinoAnim_LaunchSelfAtGengarAnim(struct IntroSequenceData * ptr) +#undef sState +#undef sAirTime +#undef sOffsetX +#undef sSpeedX +#undef sSinIdx +#undef sSpeedY +#undef sTimer +#undef sHeightShift + +#define sState data[0] +#define sTimer data[1] +#define sShakeTimer data[2] +#define sSpeed data[7] + +static void Scene3_StartNidorinoAttack(struct IntroSequenceData * ptr) { - ptr->nidorinoAnimSprite->data[0] = 0; - ptr->nidorinoAnimSprite->data[1] = 0; - ptr->nidorinoAnimSprite->data[2] = 0; - ptr->nidorinoAnimSprite->data[3] = 0; - ptr->nidorinoAnimSprite->data[4] = 0; - ptr->nidorinoAnimSprite->data[5] = 0; - ptr->nidorinoAnimSprite->x += ptr->nidorinoAnimSprite->x2; - ptr->nidorinoAnimSprite->x2 = 0; - gUnknown_203AB0C = 0x24; - gUnknown_203AB06 = 0x28; - gUnknown_203AB04 = 0x03; - gUnknown_203AB08 = 0x04; - ptr->nidorinoAnimSprite->data[7] = 36; - StartSpriteAnim(ptr->nidorinoAnimSprite, 2); - ptr->nidorinoAnimSprite->callback = SpriteCB_NidorinoAnim_LaunchSelfAtGengar; + ptr->scene3NidorinoSprite->sState = 0; + ptr->scene3NidorinoSprite->sTimer = 0; + ptr->scene3NidorinoSprite->sShakeTimer = 0; + ptr->scene3NidorinoSprite->data[3] = 0; // Unused + ptr->scene3NidorinoSprite->data[4] = 0; // Unused + ptr->scene3NidorinoSprite->data[5] = 0; // Unused + ptr->scene3NidorinoSprite->x += ptr->scene3NidorinoSprite->x2; + ptr->scene3NidorinoSprite->x2 = 0; + sNidorinoUnusedVar = 36; + sNidorinoAnimDelayTime = 40; + sNidorinoJumpMult = 3; + sNidorinoJumpDiv = 4; + ptr->scene3NidorinoSprite->sSpeed = 36; + StartSpriteAnim(ptr->scene3NidorinoSprite, ANIM_NIDORINO_CROUCH); + ptr->scene3NidorinoSprite->callback = SpriteCB_NidorinoAttack; } -static void SpriteCB_NidorinoAnim_LaunchSelfAtGengar(struct Sprite *sprite) +static void SpriteCB_NidorinoAttack(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: - if (++sprite->data[1] & 1) + if (++sprite->sTimer & 1) { - if (++sprite->data[2] & 1) + // Nidorino shakes horizontally before attacking + if (++sprite->sShakeTimer & 1) sprite->x2++; else sprite->x2--; } - if (sprite->data[1] > 17) + if (sprite->sTimer > 17) { - sprite->data[1] = 0; - sprite->data[0]++; + sprite->sTimer = 0; + sprite->sState++; } break; case 1: - if (++sprite->data[1] >= gUnknown_203AB06) + if (++sprite->sTimer >= sNidorinoAnimDelayTime) { - StartSpriteAnim(sprite, 4); - sprite->data[1] = 0; - sprite->data[2] = 0; - sprite->data[0]++; + StartSpriteAnim(sprite, ANIM_NIDORINO_ATTACK); + sprite->sTimer = 0; + sprite->sShakeTimer = 0; + sprite->sState++; } break; case 2: - sprite->data[1] += sprite->data[7]; - sprite->x2 = -(sprite->data[1] >> 4); - sprite->y2 = -((gSineTable[sprite->data[1] >> 4] * gUnknown_203AB04) >> gUnknown_203AB08); - sprite->data[2]++; - if (sprite->data[7] > 12) - sprite->data[7]--; - if ((sprite->data[1] >> 4) > 0x3F) + // Nidorino jumps at Gengar + sprite->sTimer += sprite->sSpeed; + sprite->x2 = -(sprite->sTimer >> 4); + sprite->y2 = -((gSineTable[sprite->sTimer >> 4] * sNidorinoJumpMult) >> sNidorinoJumpDiv); + sprite->sShakeTimer++; // Does nothing + if (sprite->sSpeed > 12) + sprite->sSpeed--; // Decelerate as jump progresses + if ((sprite->sTimer >> 4) > 63) sprite->callback = SpriteCallbackDummy; break; } } -static void LoadFightSceneSpriteTilesAndPals(void) +#undef sState +#undef sTimer +#undef sShakeTimer +#undef sSpeed + +static void LoadFightSceneSpriteGraphics(void) { int i; - - for (i = 0; i < NELEMS(sFightSceneSpriteSheets); i++) - { + for (i = 0; i < ARRAY_COUNT(sFightSceneSpriteSheets); i++) LoadCompressedSpriteSheet(&sFightSceneSpriteSheets[i]); - } - // sFightSceneSpritePalettes is not properly terminated, so this - // call exhibits undefined behavior. LoadSpritePalettes(sFightSceneSpritePalettes); } diff --git a/src/minigame_countdown.c b/src/minigame_countdown.c index 278a0c0de..b7495c328 100644 --- a/src/minigame_countdown.c +++ b/src/minigame_countdown.c @@ -80,8 +80,7 @@ static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId) switch (sprite->data[0]) { case 0: - // some sort of affine transform; x transform disabled - obj_pos2_update_enable(sprite, 0x800, 0x1A); + SetSpriteMatrixAnchor(sprite, NO_ANCHOR, 26); sprite->data[0]++; // fallthrough case 1: diff --git a/src/sprite.c b/src/sprite.c index 482003a5f..5b1ea5e4b 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -5,6 +5,9 @@ #define OAM_MATRIX_COUNT 32 +#define sAnchorX data[6] +#define sAnchorY data[7] + #define SET_SPRITE_TILE_RANGE(index, start, count) \ { \ sSpriteTileRanges[index * 2] = start; \ @@ -83,7 +86,7 @@ static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameC static u8 IndexOfSpriteTileTag(u16 tag); static void AllocSpriteTileRange(u16 tag, u16 start, u16 count); static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset); -static void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2); +static void UpdateSpriteMatrixAnchorPos(struct Sprite* sprite, s32 a1, s32 a2); typedef void (*AnimFunc)(struct Sprite *); typedef void (*AnimCmdFunc)(struct Sprite *); @@ -161,41 +164,11 @@ static const struct Sprite sDummySprite = { .oam = DUMMY_OAM_DATA, .anims = gDummySpriteAnimTable, - .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .template = &gDummySpriteTemplate, - .subspriteTables = NULL, .callback = SpriteCallbackDummy, - .x = 304, .y = 160, - .x2 = 0, .y2 = 0, - .centerToCornerVecX = 0, - .centerToCornerVecY = 0, - .animNum = 0, - .animCmdIndex = 0, - .animDelayCounter = 0, - .animPaused = 0, - .affineAnimPaused = 0, - .animLoopCounter = 0, - .data = {0, 0, 0, 0, 0, 0, 0}, - .inUse = 0, - .coordOffsetEnabled = 0, - .invisible = 0, - .flags_3 = 0, - .flags_4 = 0, - .flags_5 = 0, - .flags_6 = 0, - .flags_7 = 0, - .hFlip = 0, - .vFlip = 0, - .animBeginning = 0, - .affineAnimBeginning = 0, - .animEnded = 0, - .affineAnimEnded = 0, - .usingSheet = 0, - .flags_f = 0, - .sheetTileStart = 0, - .subspriteTableNum = 0, - .subspriteMode = 0, + .x = DISPLAY_WIDTH + 64, + .y = DISPLAY_HEIGHT, .subpriority = 0xFF }; @@ -212,7 +185,7 @@ const union AffineAnimCmd * const gDummySpriteAffineAnimTable[] = { &sDummyAffin const struct SpriteTemplate gDummySpriteTemplate = { .tileTag = 0, - .paletteTag = 0xFFFF, + .paletteTag = TAG_NONE, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, @@ -1099,8 +1072,8 @@ void BeginAffineAnim(struct Sprite *sprite) sprite->affineAnimEnded = FALSE; ApplyAffineAnimFrame(matrixNum, &frameCmd); sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; - if (sprite->flags_f) - obj_update_pos2(sprite, sprite->data[6], sprite->data[7]); + if (sprite->anchored) + UpdateSpriteMatrixAnchorPos(sprite, sprite->sAnchorX, sprite->sAnchorY); } } @@ -1125,8 +1098,8 @@ void ContinueAffineAnim(struct Sprite *sprite) funcIndex = type - 32765; sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite); } - if (sprite->flags_f) - obj_update_pos2(sprite, sprite->data[6], sprite->data[7]); + if (sprite->anchored) + UpdateSpriteMatrixAnchorPos(sprite, sprite->sAnchorX, sprite->sAnchorY); } } @@ -1220,14 +1193,14 @@ u8 GetSpriteMatrixNum(struct Sprite *sprite) return matrixNum; } -void obj_pos2_update_enable(struct Sprite* sprite, s16 xmod, s16 ymod) +void SetSpriteMatrixAnchor(struct Sprite* sprite, s16 x, s16 y) { - sprite->data[6] = xmod; - sprite->data[7] = ymod; - sprite->flags_f = 1; + sprite->sAnchorX = x; + sprite->sAnchorY = y; + sprite->anchored = TRUE; } -static s32 affine_get_new_pos2(s32 baseDim, s32 xformed, s32 modifier) +static s32 GetAnchorCoord(s32 baseDim, s32 xformed, s32 modifier) { s32 subResult, shiftResult; @@ -1239,24 +1212,24 @@ static s32 affine_get_new_pos2(s32 baseDim, s32 xformed, s32 modifier) return modifier - ((u32)(modifier * xformed) / (u32)(baseDim) + shiftResult); } -static void obj_update_pos2(struct Sprite *sprite, s32 xmod, s32 ymod) +static void UpdateSpriteMatrixAnchorPos(struct Sprite *sprite, s32 x, s32 y) { s32 dim, baseDim, xFormed; u32 matrixNum = sprite->oam.matrixNum; - if (xmod != 0x800) + if (x != NO_ANCHOR) { dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][0]; baseDim = dim << 8; xFormed = (dim << 16) / gOamMatrices[matrixNum].a; - sprite->x2 = affine_get_new_pos2(baseDim, xFormed, xmod); + sprite->x2 = GetAnchorCoord(baseDim, xFormed, x); } - if (ymod != 0x800) + if (y != NO_ANCHOR) { dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][1]; baseDim = dim << 8; xFormed = (dim << 16) / gOamMatrices[matrixNum].d; - sprite->y2 = affine_get_new_pos2(baseDim, xFormed, ymod); + sprite->y2 = GetAnchorCoord(baseDim, xFormed, y); } }