From edc58c881f59f2381caf93a4f40e1d6c47ea72d9 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 6 May 2026 19:42:34 -0400 Subject: [PATCH 1/2] Added fist and foot templates --- asm/macros/battle_anim_script.inc | 8 +++++ data/battle_anim_scripts.s | 50 +++++++++++++++--------------- tools/trainerproc/trainerproc | Bin 0 -> 55048 bytes 3 files changed, 33 insertions(+), 25 deletions(-) create mode 100755 tools/trainerproc/trainerproc diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index e6bb3d6705..c4db001a81 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -516,6 +516,14 @@ createsprite gFlashingHitSplatSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \relative_to, \animation .endm + .macro create_fist_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req, initPosition=ANIM_TARGET + createsprite gFistFootSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration, \initPosition, 0 + .endm + + .macro create_wide_foot_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req, initPosition=ANIM_TARGET + createsprite gFistFootSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration, \initPosition, 1 + .endm + @ createvisualtask wrappers @ The arguments are based on the CMD_ARGS of the task. diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 4fc244acba..3d126f045a 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1019,11 +1019,11 @@ CometPunchContinue: end CometPunchLeft: create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=-8, y=-8, relative_to=ANIM_TARGET, animation=2 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -8, 0, 8, 1, 0 + create_fist_sprite ANIM_ATTACKER, 3, x=-8, y=0, duration=8 goto CometPunchContinue CometPunchRight: create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=8, y=-8, relative_to=ANIM_TARGET, animation=2 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 8, 0, 8, 1, 0 + create_fist_sprite ANIM_ATTACKER, 3, x=8, y=0, duration=8 goto CometPunchContinue Move_SONIC_BOOM: @@ -1155,23 +1155,23 @@ BeatUpContinue: end BeatUpLeft: create_basic_hitsplat_sprite ANIM_TARGET, 2, x=-20, y=-20, relative_to=ANIM_TARGET, animation=2 - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, -20, -12, 8, 1, 0 + create_fist_sprite ANIM_TARGET, 3, x=-20, y=-12, duration=8 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 create_basic_hitsplat_sprite ANIM_TARGET, 2, x=8, y=0, relative_to=ANIM_TARGET, animation=2 - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 8, 8, 8, 1, 0 + create_fist_sprite ANIM_TARGET, 3, x=8, y=8, duration=8 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET goto BeatUpContinue BeatUpRight: create_basic_hitsplat_sprite ANIM_TARGET, 2, x=12, y=-20, relative_to=ANIM_TARGET, animation=2 - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 12, -12, 8, 1, 0 + create_fist_sprite ANIM_TARGET, 3, x=12, y=-12, duration=8 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 8 create_basic_hitsplat_sprite ANIM_TARGET, 2, x=-12, y=0, relative_to=ANIM_TARGET, animation=2 - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, -12, 8, 8, 1, 0 + create_fist_sprite ANIM_TARGET, 3, x=-12, y=8, duration=8 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET goto BeatUpContinue @@ -1265,7 +1265,7 @@ Move_REVERSAL: delay 8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET complex_palette_blend unused_anim_battler=ANIM_ATTACKER, unused_subpriority_offset=2, selector=F_PAL_BG | F_PAL_BATTLERS, delay=3, num_blends=1, color1=RGB_WHITE, blend_y1=8, color2=RGB_BLACK, blend_y2=0 - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 10, 1, 0 + create_fist_sprite ANIM_TARGET, 4, x=0, y=0, duration=10 create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0 end @@ -1362,7 +1362,7 @@ Move_DIZZY_PUNCH: monbg ANIM_TARGET setalpha 12, 8 call DizzyPunchLunge - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 5, 16, 8, 20, 1, 0 + create_fist_sprite ANIM_TARGET, 5, x=16, y=8, duration=20 create_basic_hitsplat_sprite ANIM_TARGET, 4, x=16, y=0, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, 160, -32 @@ -1373,7 +1373,7 @@ Move_DIZZY_PUNCH: createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, 16, 8, -384, -31 delay 10 call DizzyPunchLunge - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 5, -16, -8, 20, 1, 0 + create_fist_sprite ANIM_TARGET, 5, x=-16, y=-8, duration=20 create_basic_hitsplat_sprite ANIM_TARGET, 4, x=-16, y=-16, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gDizzyPunchDuckSpriteTemplate, ANIM_TARGET, 3, -16, -8, 160, -32 @@ -3139,7 +3139,7 @@ MachPunchContinue: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 6 create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 + create_fist_sprite ANIM_TARGET, 4, x=0, y=0, duration=8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish @@ -3724,7 +3724,7 @@ BrickBreakNormal: simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=6, color=RGB_BLACK delay 37 create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 10, 1, 0 + create_fist_sprite ANIM_ATTACKER, 4, x=0, y=0, duration=10 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=6, target_blend_y=0, color=RGB_BLACK @@ -3750,7 +3750,7 @@ BrickBreakShatteredWall: simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=6, color=RGB_BLACK delay 37 create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, 10, 1, 0 + create_fist_sprite ANIM_ATTACKER, 4, x=0, y=0, duration=10 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, -8, -12 @@ -4086,7 +4086,7 @@ Move_NEEDLE_ARM: waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 + create_fist_sprite ANIM_TARGET, 4, x=0, y=0, duration=8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 0, -24, 10 createsprite gNeedleArmSpikeSpriteTemplate, ANIM_TARGET, 2, 1, 1, 17, -17, 10 @@ -4310,7 +4310,7 @@ Move_SHADOW_PUNCH: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 6 create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 + create_fist_sprite ANIM_TARGET, 4, x=0, y=0, duration=8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish @@ -4679,7 +4679,7 @@ Move_ICE_PUNCH: createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 160 createsprite gIceCrystalSpiralInwardLarge, ANIM_ATTACKER, 2, 224 delay 17 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 4, 0, -10, 8, 1, 0 + create_fist_sprite ANIM_ATTACKER, 4, x=0, y=-10, duration=8 create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=-10, relative_to=ANIM_TARGET, animation=1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 @@ -4828,7 +4828,7 @@ Move_THUNDER_PUNCH: simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=16, color=RGB_BLACK waitforvisualfinish playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 8, 1, 0 + create_fist_sprite ANIM_TARGET, 4, x=0, y=0, duration=8 create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 delay 1 invert_screen_color scenery=TRUE, attacker=TRUE, target=TRUE @@ -6550,19 +6550,19 @@ TripleKickContinue: end TripleKickLeft: - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, -16, -8, 20, 1, 1 + create_wide_foot_sprite ANIM_TARGET, 4, x=-16, y=-8, duration=20 create_basic_hitsplat_sprite ANIM_TARGET, 3, x=-16, y=-16, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 goto TripleKickContinue TripleKickRight: - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 8, 8, 20, 1, 1 + create_wide_foot_sprite ANIM_TARGET, 4, x=8, y=8, duration=20 create_basic_hitsplat_sprite ANIM_TARGET, 3, x=8, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 1 goto TripleKickContinue TripleKickCenter: - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 20, 1, 1 + create_wide_foot_sprite ANIM_TARGET, 4, x=0, y=0, duration=20 create_basic_hitsplat_sprite ANIM_TARGET, 3, x=0, y=-8, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 6, 0, 8, 1 goto TripleKickContinue @@ -6576,7 +6576,7 @@ Move_DYNAMIC_PUNCH: monbg ANIM_DEF_PARTNER setalpha 12, 8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 20, 1, 0 + create_fist_sprite ANIM_TARGET, 3, x=0, y=0, duration=20 create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 5, 0, 7, 1 delay 1 @@ -6615,17 +6615,17 @@ Move_COUNTER: playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 25, 1 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -15, 18, 8, 1, 0 + create_fist_sprite ANIM_ATTACKER, 3, x=-15, y=18, duration=8 delay 3 create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=-4, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0, -4, 8, 1, 0 + create_fist_sprite ANIM_ATTACKER, 3, x=0, y=-4, duration=8 delay 3 create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=15, y=9, relative_to=ANIM_TARGET, animation=0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 1 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 15, 9, 8, 1, 0 + create_fist_sprite ANIM_ATTACKER, 3, x=15, y=9, duration=8 delay 5 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 waitforvisualfinish @@ -6664,7 +6664,7 @@ Move_ROCK_SMASH: setalpha 12, 8 delay 1 create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=1 - createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 8, 1, 0 + create_fist_sprite ANIM_ATTACKER, 2, x=0, y=0, duration=8 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 waitforvisualfinish @@ -6963,7 +6963,7 @@ Move_FIRE_PUNCH: createsprite gFireSpiralInwardSpriteTemplate, ANIM_TARGET, 1, 196 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_TARGET waitforvisualfinish - createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 8, 1, 0 + create_fist_sprite ANIM_TARGET, 3, x=0, y=0, duration=8 create_basic_hitsplat_sprite ANIM_TARGET, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 call FireSpreadEffect diff --git a/tools/trainerproc/trainerproc b/tools/trainerproc/trainerproc new file mode 100755 index 0000000000000000000000000000000000000000..c1e2397e47b3cfcb9b0fa9d125c4b22425ee3d4e GIT binary patch literal 55048 zcmeHwdwf*Y_3xPg5_x0>4H^|?)Io?sOcZP)pcyigoRJAc5(J;akW5G4R6g4^t za(W!a`l7d5Y1Lc$tF_o#8U-~xgs4>kZAGya{b@a8R1mG=bMANT$IO|N1oe0C=l;df z%szYVwbovH?X}lld!Ky{H+uc088(|DuOZ3>3d_yokYZ7g`Le`Nlwze&8I513GF~|f z;Gy^{7RA%b9jkN6$j4~-7va!(hn{t z`%R|HYk6L#W;#~iYJqP_ou_cPOwDwpo0e`~-qM?%t{u+vid2Y@lhj3Y`A_lk{1?;H z1Jn>)GL_^cBmET$eOl9eBElt8D_xzSv!)(SrpT1)psVt|aLxauz6wEC_gl`#n!d@w zicDpF7lV%U@RF*Bu3BRT1=8vLxEPeUu=c=}8w_NaQ zcwME3a7b>VAso7hpBO^PJefG*FntXBwbEf5mqD--@kirj(#f}u+ZB4Lv37pYQFKrr zch0sij`{O%zBmR&gI>3xWFUmI27w;~0h|MH+b{@zXb||FgTS931iony_{oF7+XjKp z9t3{zAn;X#!1D&tL&G5W)V~Ai`S?NL|7#HV!a?9y4Fcaf2z=&X@Il&j6Y$3rxz6F1sfG@JZ|0v*v0#0Lsu50l}e2OjjN+3|(9t_mhHw7E& zuMH`U!G?zBYNfU<6k3Y1U|UaC1vosjY5kZVORSxVb@T3^lfe!U_t4txEu`X^sFT z9BOD#YFk4LtpT*HAub9KP!)bdt*t~<-&8|*!5UyJW0_^G_2CeNfn?Q7Nfa(GNlOmr zJf+O&q*lHWxxlfL#V%OpxKMmK^a`(6Y7s9Z}}eX36@=7 zKbmH&PelIlJMMuy8=`zI@{tn>KSMc+3=5Z>Kc&6xo5$hpy*!ohwF17%0x!Os4h+@3g>g5%4`0xa70X0>4|}8y5Jl z1^j>oF8Lg?z#kL%%5&-Z+$i9g7P#c&u)uo-evSqHs(?E!aLH$q1^%wU&$qz$3wWUg zF8LH&;9m=T)dC-WA8%)c1upq4w7|y-{6!Y{cmc1oz$Kp+3w*M`Z@0jU1iZrnmwZ-P z;H3h8wFO=&;A<>!$!Dzv9u)ZNEbvAFUvGg+KHV00yTI?Uz`F#z*8-P(c3R+f3j945 z_yYpI&jOcx3=8~Gfq%dPe?q_yS>Te7LV*XaOr9vu3j9n9e3yVbEO5yu#{&PCz;{~U zaRHxXflEI57Wn4^zt937az7Wi*a9CT;Hm|FqJURe;1dLVp#?7aEV96-3j8_?yjZ|n zEO5!E-2$I0@H;H<%LROu1uprlw!p6z_-iciYXp3)1^zPuUuS{;T)@{`;13FTw*@Zw z^jP4375Kdtc&~u(w7?~wJr?+0fxpiJ?-Ovt0zV|+2P|;guehBYvcN|Pxbgxom-a9D zWLn@S3VeqJeujYOSm2V6(*i$F;7_u^Jp!I@flEGx7WgFszt{q=6>!x8mwYNL@QA=) zXo24>;EOD9$*0Z&zf0h^Sl|x{c)JBI`E*#|e-iksEbylVe6VMF6G&0fx860VS%3`;0G*l z$>)#-exblu{+4e47YTT#1upqGEbz+&evSoRC*V#CT=JP@fiD;M`4;#p0WY+`C7)so z{2qa?THwDC@CplD@>ytsKPK=OS>R6#c%20<`LtNzFADs%7WhgThg;xp2>kUHxFO)( z7Wn4^-eZ9$1iaS*AF)>0p#?rx!1q|-P66L%flm=|!va5Fzz=ki)>f{&3vr0Yy@^M2NP6Z}{cezyru`=Ijb zF~P@5AktnF{5TW*$n6mg9MQlL4II(H5e*#C!2i7lKDD3nl^XppQ`Lv<`Xj=guAXp4 zVy7D2mPt>H6eTe&1K@*+2}6+B$18+iM+FDtZzmFo)htf|)xr3#WS#=bgYnJDJOz>m zPXW@w_?Tp#0^EafTQYBF`A@!+?WF(-?N8<@Fhcv2c?yWo zewl~%x*jF%c@(BUKqV^b!F6~$fU(>|N8eOp*N`UJU>12^kMY^NY~?ru zEl3%S13GdIi)la@2yyA6?ZrD$WuLgPJ3kVQh0m;L9%$t}#Yz~Sd9qJl2HtmyENH=9B z0Ok7RZGN=m%Wo42x3;aT$KK_1f`vZpc$B)IqUUr4ACZ#QKsukcz0Xm*8WLjH|zUu!N!(r*F_AH!-z4O`$B<2Uc>TmqoC#-dz+;>#l4z+r>VW*mG+q^~Z z-SAgcd&IRCe9@)hpHi)zEUR|yRb!i6Jy6IKG|YW=&p*}JU9R=G_h=8fdXSPx-IR6% zi>>Au1et=KPk;Z6Qa5Las@=y(R1Kskpp?4Lm;n(8I|msi@7cMyi9N!w{7Cl^cI@OS zP?JA4A&(_9=OC$N;}Du9U>E$1YtXgDeQH>VO-4RB^{G8^kPR*CzrJI4h#%cU*VecB#{?~Ysl&TEy&HQOk>j7i_Q6ALp{zl)WrUAyg_w_)W@0__8`s%=(>%*s@? zEvWTf0CIa({R-D4zqZ1a&xf_7%yws*20=GPJ2yZ*p}oRUXtIcXi^f+YNL-Dj=3V?MqerO8e56 z`xWocqL;#Fl;iZZL0$cJOG4D$RGIZWq=*Zv{a)F3}PMPBw}$Uj1d`l!** zcUOQ;jg5Z2QBjKi5zZx@l}VkQWPjRiQ=v4d&WAs!ZEw*(?42)T$3~FP;pD&iG32wb zu_MSmoV@18kcZ)k1ohohh+liFsqirnRZ+zotRd?O>Wg-!O8$W7n*k?-# zcR!&qbU`l3j9$=41w4eQn3OVAH02TKi<)vDIfCk2MN>{*4wlkC)|;B**IxE(&%?=; z=f1%GTLrns>|;DdJJVd_vC=gb97FRK{P6Q+ph|h}^F?2TUBcAHz|^=y-H~*t`-;A^ zciOQxh?ebY;;kR3S@Dl3s?af+`C*PZ(e57f8BFgbMB~x!g_x}r1YgKdbBE35&Ag8B z?Q~TLwXOyU%^>+Aze?mCBHtnM2PnmKgZK>*1+#CA0;A(15+d>$O*X7zm@!p|GMXkka7)uxyYbt(T-tBQzNkWdeIeQt z?O5x>nX9hP?OoGGQAwwZj;}#<<{n} zH&HmP6fQ~8?a}XZd5{BPF(>T71ZeMi8g;sNczcmB8Az8Vj*E~@lc5HH+~>V|d5=#o z?}jWpy#;&0G>0?YgJ_DL@~W|!W9#4nV(x@bd&8}H_xYkd8QtWX5pO&RWO#??!l&|a z)Y%grZ{H9elPKCAIgSRA{b|qf34hU+$a`eY`+@D#ug$@1ljDwVwW(c*#E%0H`_sew z{!H3tJzjlC)i1+X%%0xyRk^+EPta<#$L22DYVTYN4sLCyzk25r+`Uh`?rKP2-_TPI z1?PU}DcT%4bC&(-QCVKCxAVDhleg%F@Cl{%4MRuz;4=vkDB*vKc%+32B+$Z5Xnt?JUA9E4Rv9IEz~vGWtGF|;eYRqb`C zx5uY#PIhDL5 zi+QK|VvX<8xXMAM3W4GQ7!BnMkzWB@`b^~WeX*`i(l5#u;@-&M_r-KC;Lg>mUgdI# zU@>7_#YU*Ta{*jQDpLGZdO|PA`bUaiQ-Az0XZUZ(0OS6j#EBU^PCS#fj)j?SNb`fk z%%5=b*K0@#jGR2!4<^3?3l7AIZ!AfY)3_w^Pku;zT$#zpA4`#|KZg8T3v}b%nr*rp(bM?iT~**5~J7CE4|h zp-Hyon(-;EtX&ve9{Yw{+13qef#2(N(RPj7J|+YedL4bY)UHO0w$>cJMZYLXwTSiz z-FkU`*K_u++fsEF>_!FoRKaRAAUXX~Ytp7ZY9*U~otSnf#cxOS>DA{Kdb@T~!=?0p;Ycm1{sKi4eYu-XoOohkHfd`J93uM}nN+Iu{=mOZRfoN<}1wL)QgS8kz zNo z`l_Gx#^&3+u`-(*lTq##Pwswf1(82hiw=dSs``AIoHMjt(YN1<#@!uXo?u`3bFl9C z%4zTX9d2S5z25O<;j$4v`-6Y8-+V9CT7(MhowPiFfF4cAqzRccE|W18f*ThW^VX~$ z!Zu@gGbrH7fhHbj!sBKWYr5XC56ZOX@|_@i?&D%BXA@IcS5L%FtD+plZ^hbQ-zB|Q zWA0kvs!*%_E+?W2OpaTqOP=6g@Deukc6%Kpn|0d1Ch>Z)l?sVkicW`;#6nEWCRvsHR0|HrGU?F&sj3k&* zcVWt5^nJ#bWNnN3k+hphrkO~l!YjD-NFl}b%YlS8k-MbGB!?UUMJEpG;{({wBj>1o z0XhHm6|3m9@2Ti-Xq$A;7os9Gr>LQyY~+BF&G`jL;tzbva4Q0b$87{ISuPyRcTXU& zRX%-Kjq%-0>nbO0iKA*eC@x!MY?>w7gnd_OobgAw-W$<2X$aKQ*OdI{MpBhWX~1-NYbqE*c6FyRwMxAm~sG373=#hCo-tN6nhkw`qP+g zhqssYf3%;GWM6ssp1#vW@&H;{usi-TH8#o}3*6(DqgbUzJuubSeN4}63}CGKwU03p zpe}Mg+*dRA)9Ew7L&M{MgfXUsoBnwO0xCH&GSwa;X>ni|^|9Q4sMwQ>&9X&5w$am> zs^c>Hj$``?^-}oJnA0x2^eKV^+SC~l)xdi^)_{UF3b&oTf?hb*_gNcCbnK>b(2-?qEK!Nn9 z+Cg{G?(ig^-j2{>#!re4MaG$Sr&Y{d*rIt8IQGs}=wSB~pvIG>T^?Gtv3*7wSAIA- z3OEhF=tKp;_~jq+p5%^dzjgo4xUdLF7XWG3L+qIjiM$T%)%wrr>5B2zJ7gR?*mI}f zjQ||&qz6&)^Zw0rLX&$+CuCabI-zpovU9jjww!0t3Boe2l3RJy8XJB3B~-`3qSt7@ z-c1{ML-RdFJrVPMz0k+N)U9$M+RKM6E0j-Lb&{ zBsLi0@4Sn~#fE*ikV$R!>uE#vq(UlBh=D|-2&$%SE`Mwj8%?D83N&5SwgZo5k#;q9 zE8ow7Y!0RsvB9SC4K{kZ*8vvB93H-QorgY%t5{DI^u$-b$K)D+DXZ5kS39dkO!85f zm~b~FdDSF;YP(h#41rigaU4kEW8r(Durq<%w;MNp ztXlh?!$@n#fY_TFX@2RZ>A@C;K`DaN?evgF?D)R{EPE$8gKk=Ie*3*!W4O;;s)>X-vu1+)*3brk)x7YUmBQ^ay?0W-?^k^L<%r)PV4ZzP5Ls2xR+)6&VR^ z(H(_d_4mXq!eiU6uW7DM`tq)+ykD*(KBj&#TV~t=oan}N+<#Kw4C&X9iAY69sf_u$ zNiT%r)c=V?7qXuPd2;CmG9QNs3g7++J+22 zVKPj6hIROUWBk9+7>JCmMOq|dUkwJ~$1;%s1)o1j?#!=!VZ8QFavon84x)>0)P#n=tl1NERkBG_1?_`3yz z;3w!t!w*5^VGUL`?6RK$1@k5yZzxE1hp`n8zv5XeBoKksrPyUl_N|nd%9zAcQF?fZ zdzr*LN#Yy!k#1&=N7Yci&@%eq&lM1{h(u&3TH>1!Lc?r6{08W;VLw9y4rjUwW;W>_ zIylK*FpU2RDsgu_)y4XyD-)WbULpn28fqcA9$G@V?RR$(j?sHQ54;pO*!VqI!=mmm zi@?(&*lutjn`0iivj7$C=h5c0bbm&%Te}%|A#kOfFLOD!K+eN8ZGwqp`?pM@r(mxp zui3AbgZZgi4$>gq?hPyP$#H&Xi=T!&H0(Fu!{+xUHqW9vj3-}beX<-?Py*)UVIwg!Bxf8RSzt1i zn=J5bnVxDCcYYpuz35AO=WkFI5$}){Jccd7A3?u3N$=qTF8^`#4}<0GHB^R)qy-(dBl;$k3${w!&K%dw^((0kKHM}u`r6)}ZSA#*acA$k}m zD&Dw zOY!u_qCE_Yirg3D07DOMt}c%6!z=_ro`BLng#1dxC!~Ngf#wM2uDsgm*Zr;vKa4aV zqt|qpB6*VHn2CyV*`?IJJ&4@nO|(jl4eP*gKb%*(Vsg^3`)&cg3bQ$!(^fNaofIbE3rrbLkr$Y*(_Y7i~(lNQ)BK_zM}H7FBSM{>(%Y|BCyuUidM{@h8~g z;pBektfbuW%Q;D4_TfeUsfpxfPEztcBo~-S9^@nsVp)1P1&uV348wFyvpt=?IT2ME za}WiQf`+0~qZ=o21<`zERuF-WyMPG=zhG{a}nGE@W& z-hy|HyJ_}E9CrOHFoivzV@UG}{6*ZVuq4DEV=rBZG5H_?VxuQwjq&7#+#75u1#N8R z2P&!{`sA$gXsRdKW@mD6!LJ#opG!>(FSl>tnh$ z{5>SUF_EkR2|C5N%>-*B<>Tqm{KMCLxrt;vND$uaV>%i35)^Q_o<7w?8RjI#zQdDz zJSo-8qcJB);}{P*qX5nV8Z3xzEGEN~AK*o&#!zl8(QP9dLzU?0=E?-iQ^})2r z#O_6BMK>;FoGv$WB9K9j37k~Use(9NOPpfEe)T=AKFidE%ejhg`5ux(@JuqkY9$ge zB!VRGbRq8xOx{H#uf6LNWau~x1%)b3Iju$dB+QZmn0ve!E{}_?5gzt>v|kdTs`dJ` z=d_oLz6+nFRUxL)=h2!sdqfd3ksO3D6{!$rv#oP?Wft37 z$@JiK3bs}jq@o8#w6|!xz4K;9GwcuOI1kPy(-@Y4MEoi2_d}DvK*S|s)@U$(EWF*0 z=oQplT=8#dD946fjwjBCGr334NNMs-7E=%h)UCuff`fRUqu?W-w(BZYdq<7Fd!VAq zThLSR9NKr&PUwE@@2^*s&ua5h&u?bF4hZVrO$najjm3fS+vpyLl#Wj96VHpb%5%E0 znZINB(|$uq?suwoK;8WDh3e)*LsZ*#b=P;{Y%sV|Fvv{o&i$Yw7`L{z-k2vwQW&1f8dN9K*Y2VD(UWD+k;5mAy2A0}O2vHo+W6|@G z6||SF799w;VMJvsIDt9@L+RfgUj`z?nq1wkH#w&&tSo( z80Dx2M~FcF&+ugXhUu}gXJ(vm&6rr(&KXBvGa^>@z>E`?{VlrR2?9bhPA2@Ke@0#v zjYNN7Zw!;y`DlP&d!I$S#=XGm`sl`$m;1H1uY3}-5#K0)&CmBBdb%QB3j}V5?gj2k zd{5uBC^4KA<(^ON{bqips+VQ^_2GKJp*LrG^yX2tPk9JXr(1hV#nbS81TgFy$|h-7 zxDMcK>K7=)f%T(Qtu)h(CkEP8_&*y+Z^FC1>8sx1jRo+eyc|!;x43h+dU6wZQV#nm z+7Yhy=@r)JduTNtoWIm| z8ZXDOPX2Uu7kfGze$cJG*tdtblXlPcd9-%ejA!}^*8$iQAcx9f5N$CM6M|re9Qr!Xj1~1+fILfQ54lswgdow*+6Gl)erP#_PoFPFl^;NumEb9{gfsuL7GVz*^bC z)_HU%7Ji7On^6c}#@w%|{U1MbB}$Ehy*z_uxnjJBjH-`wvFd2cdF*UXLksXeMKHHj2WVUD&(@pW^OG)!RaJrly=MLnAADPlU|0pJbHHvKwcbI?fMyxWOLYB z+6MG?y=(9KRKWCgYl-qBd)F1maV&ieJ&fzxYws$^mUL?tF}l6>+y9q<>8th;7EUuA zI7VWv%3)Z~*>CqAD|mI&(vxJ!86zO;X?2Mc3b)@RA*<;CKWTWSLvre-g%^{3XcD&8 z$zYKEX1n0Ejv`Hx{p&1(jC1KagZ*+EMQ z7O#-zp$4vCd*>&llGw}<7z4&8V388_RTQUE!>6GN4xvRnLGF@}4iXH`C6o55r%AwNM*jzjF_Z68#h*m0l70O$iTV==;nD9uAbO)KaWojk zoLG{{w$e0&{c_+@TVM=H2KN(#&$knUrxc>lA3ntR;6U>=;Ny-hOLWs-T)}Pxv$p`7 z`#DUb*+sqfuIV(MiVoU4&!HQ*A55}C9SBYS>F$`39k6$u2zbHXg3qbnZew9695@`$ zdwr+TeA|grDeUm5_OaW(;TxJn_dJVb&FAi-w{Eytt$qb(?rO$D43Fy>cg*kFIpYNT zJv|*?9&Nv8b7pS@Fpmqfu>F?Z2+SF`J0L!>!bk%*OwPtFlHrYiRB^(|ffwtJ#bXLm z1&FvRFgY9hfv0z6LJRDm^J+972c7MmWw@a(8;{hZ-<<;l9I>-^?Z>37$7Uc)-Fz|2 zEfl#wquF|_MdW6(T)W79fmDyJ=DE(B(7m#sxJ@pD93&hDRkEM>!qOvPH>A<77s#hS$_ZuaW7o^`hRNqV4JRCbn@Fu*_t=HxuuFpg@nU z{4>N*pQ7=0{6YCN61~E^k*Lw@Y-h^^yr|^CekC4Dvin5NUo<$kf zS$>eJ)i}3Aqgw68e3wuX0M+lNb7<=6oySro_O9)$p?i3RU74BG?8*40ZrX)1kKW}Z zbB)a`KojVtpxbAonA8U+BHGRmw;6A2<*pg0-g4;FTh8<-4On}u5p$3pl|z~aF4%Wo z&X)G^Cn;W&4*At-(9_QuAH0DGM&oSiO_+k};10lX-1HKM{nnemL_N`Mg=rBC=InjZ zec#TQVDH+Ew!@y|@1la#{7lmci&P)nf}NAUQW+bc)D&#!CPnaMPZE|`>QiC}5=TbUTZ#sw(oc+I=;_?TdNvspps6pja@zW0Nl4P>-y#UwzFO z5B&*!)mYQaybH8Xz@)ILx0MJ_g+Ir%FdWYZJ24XWGSVGkJ9+S7kQHyf6#gyzPo|&v z$!G}h`RZs~o=_pz-7?ZqFUCXdYU-CWO!o3-G5Vzp<;elvc{cACM#}oZ_zB91(Ck06 zpjaad1s**%31c0{o^Pn|$DW!5%@pkIbBcJH$lxH7<7PCB$aw7;C|#eM>C=x#1<*Ns z?kl9Y=njW*EnXy+(g8gPiaBBt?jUTG%68%Dq7*PWFu!>kwJc_}bU<*B znd|u&r9^^QE~$~PNF&dpK<}#H^)Pv%Ru8i9ti`O((eD8dBVs+03cbq@Ad)JcsFYv; z-3B)Bc}~;;iBhUFLL}Bxhp2Y5JXZ}M&zU68G$zkfutmG2Jd==xJT4^ILKw^CadLU` zNdmpAkSCKVfjr+mHHbWaM?ri%+45Ne4r!5GS2gwM_d<)xxJggMFTP9|@dPt;COV_Xd+ zr&AE-nh0OTzJ&3`CX$oFN7gF8-euq(owptJ@ix8-6cX25>5C-IMij(v$MKBRyn~UE z6zn15e=p%|MVwH(dLX%03Ep6rq+@agh)yTE@@mxd&&}& z=APRz1(fe?B#rD$_FOOTxouRYeKbJNJr08Sy-fEV5Ce)djZPm$X)_-MG2S2BM?AV1 ze;0fY1QK82fbNa!3H}#~O}ak6VTnqSG6GiY+r*#59Kp4N9Tsp~1vbq8oDUMWe)}Gh zkPd$C_v!bN;KtiHgx1f(Mgg1FxQ^-TsFoEE(*v2<%rn7_aP6`Z727JA#=o83HJmjH86SEixXIM-~KLU83tL+7PnY@+>0?s{70JDETJCB1)KPCle#gTR5t#D{J|``7m21QhJ~D{8w9{#su}-x=svTQABgV)BsOc0wkh000>sO<)-?P{uR6swIr&9`>nWui8-&uSy36tLQ8X9a4cC;U`t zY+4JI{T)x&g=O*x1^wor+P>K!>`HFH+;$@lM(V5RslTjheJKaL!1)4u@Mi@lEdZ0{ookA<_9co^ZuA+p#N8MeL& z6!&^Nu}d_O3U@d`TWsHuFuFnN!@j4l=*@5;R{Aqsd|Un%wjXa_nF(~ZLvLUCE#@oQ z(r0_a9=rFDpo{cU1F)PI4TwIAufEJ|A&q%AT*!+xtf!JBOk55J?XBzfX0 zn-$FN?=gU>7V~O)feZMnSPes6RCux!A==H3+t@pM*wj07F=1XMFg<#56YaK*aO?Ui z`j~~ae~b%7jo4;Oc1$7hISvK*0tVlR>$w51HD8y5UEHZCE7*(OkcqhIJ3+34k_|*m zX6$`D8T+c*$1o{`zii&Q8K+~&BTZjJY**m0v?=z5G9Nn)72gl)_|Z(_)xhc}aSY`| zXm$(l6JZSsbe*;wVay#!xH12m$}&;2wYCx}I2%MHl1ESOOx{+DgX8)t`rbyr${nI| zv%2mlKJWjT)O9D{-P~=z?VSuz$EMtkGJkBN6TI-@FU^4Byr+|7-{QMKdO5RYe#U^7 z2rwz*s`sRhh?hO~3ouHPoHV=~we|JrtJ(*Wu>pldVIJ+5oeCLCP@wBAM5D7eYPfL;Gx84I|_8Yn^(Rb39mfiMA_8? zRQ@m(+yNpsg~`3;&WGRw^;PQzsyZyHHm^J$Auh97)oVqa`kiZtIyUV=D%=0x{o8#e z6&wem_<5*}26kGUq3d*p%NWLFV+XZ#ogLKj!ea_-G>*ABJOa@7pgQBV$9O$vt9^Jp z3LZrP=(%tR+VyBJ6L0MGC}lj1UkX~llVh}#Xj@SbUpRoDJ_BZFRG}1M*8Auz5pw(n z9l=A6_^K}`=I;PUbi~JSpvK+n!EDc0B<9D)D$2aTGU);Q`{cd8qSB8CC_NRnZM;dP zr;#pVGc%~`Um(B;sFKbl;tAQu&v;R-NBeK%RFptO4~ZC?$=dWQLjL@HCI;W8`sR-? z_UGJq*2vTmKMvTY2iEkwnjTd1_mjNV_mjfMWr%j#H&odYc*Qe3tmCVrBjdC(2YWLq ze7wG36gHu0vq4)hO2v7~zvEeRu@WuIw6RZ2^u24Uu68w^$K#0>9%X&)*N?}uRDX4e z15W|*Wd16zei2?Q-jaLJo4eT)yUd2?^FG@redn|FIGxq-#$4y(c&TbTh*KM*GCIB- z5gCo({0R!|*fTkNeP&GRVSU){FM27m{qlkydI0X#wrNW<`Mji6JGARYu}8+KZw;1f zFEYt)`fv^Sv3T6{NWPPO*@d*F;{{GUYRtvkj+)=)R5ff-s@N3A!zz3n1}ABD3UUC# zc*V8KwTO^g+(kBf>@O(uWA`T3fWvyRuqz*jvHY=_jp*q<%-O|oE;zyG#$?M+5sanX z*J9H#f-09M_jy&r(SZG0Wu`InJF-uz7vFe;MBxA&qH!;vw0U(SYLfy*w>sQKUgi1= z=-Ag$K%n=m=3v_kj}CrD$Ev~Q3M|_;Ga5dFaaMeB-NQVRI&a{ac%+UzK4u6|6pEUx)gw{fAF|?qDK#8!bZHbjPh$|(Bokr&fv($!`>pp-uVbBE~h*7@kc+H*zr~2vZGY{gRitUX_0JC(Z}Iddb*8QR!_UUT)Q^=%5tsM zi4QNXn#G^h(ia%L+GUw;?b=c9fLm*I&=C+1;+_^89>a%o$S!Ha4R2fB+V@Cm{Y)RL zVYb<~kKyB)a^EZ1FYsuk+1xV4#~sBuqi4QfsoEFJ6!EdFa{WX%z15@78s*ko9p(Df z+2#6TCz^Hjq#eW2XzUiYIl{hjJhfD-x6Ag%F4~DlHp|Y@?Xgi>tm>kj+VO6^(owV} zd6wBa_w-gr*jcWf$lz|Y+N+^ETzWP%@Je-w!{vS)-q0Q}s)i4^*yhgd#b*S3ww@$?QBU|BpN>N?wk;j!j|iWEC-oWHT!($b zG1L#vXxS*%5#*{~Ay;*R4_)$7^85?=r5(T_#i6FYyG-7RjlbxJD!#oi9Dj2m(;<@! zz()@7y-9oX0*v|h?YTo;_FTWqVb8_kG2<`r=c=CVQmbjHKg$swqrzduR2y7`qhm(K zi0~==a86-ryj%zsst~M$dJ)lYrVa1G*SH)^?Fi_ZkN`EfocJB*!dD;`;iZQ$b?E&u zIem{A`+kQ|u?pIriKv#Hv50=yo)kV!@;V{8KUU+)M-W6FDWBvoCiyE2dXEi`;8b!B zUoxLk<*G}GIuD|@lNVjB!fB17D5~;Xq6oi40F27_jnhDe5ju)BqL|5DffWWm*5QC- zECk>RR5_;6X&-Z?(sz$>8l=bgT!8(A4yJ`k@M)t5h9&*+U5${(18Ho7! zBt8v?*L`z$scWKfY$N%{uor%d+3q}lFolP@ohu0$vUIFCDltOag7t0@kAfGN|BmpEhR0HwV8HLv!~MX{k{`i|v(iKYkP6*`TNE;lo>BGuVL@J1Vq+gG`_W_l3A9IqbS7zGBR6Fcrmf}64 zaz%Xt_{vfE!%N~gX;$utPXk+K7gTQ@)r&ZK=a;BsDXSw~2G%oN%!xQyEnqy|KIU>T zt#-ygr#|F%6&rRjwnkK~1ge2g#Z7kn5flqQE8Fa6NW9JQzoOju`9s_vk(cn{)e5+x za_w3E>1p1zFW}?T>mW7y!j8WM<|CW@rAX#w15S$U7UA$FUSuR6yNJ#|(RMOB2!&aa z-&D{Ix!)Fh?tQKfmLZdXAE2LNqvbW$$CD}4qQENYkL_K*B=fv!8%bj_YW95Z3uDq} ztlxf$r&Y$SxTpTU517!K%f%cOCXk^nUs5W3ONqXzgaO2)w2v7=uVB9YDPvPZY`lU^ z7ufiAco`b|NVk2A7Xj@T#^XRXp5Zpk&X%LH2G=6|hFvZA-Q?;3De65Nf6HhZyU`gx zo%K2uV35J8iP3fcV2xfz9aV?z`#-?X__P2FXF+!SV6vYHwHS4>^%m2Uy(H3r8gonCx4G%DzX4C78q@r+MKv2n~=@;{hP4q)r+ z7*vUGS68alS0M_0g}vghUz3fm8>!kG8jdN*?@;19g%iqktP8L_#!`oUw^e?G7N5`@ zi+4TnZRVH42(w0SX6=51zx$v2I!?U1tfa@%i88EZ=&O~Wd=ohMG(a)5cJfM4`?O1) zm-{q#_LVsI&ipM4oZy1C53y}c-P3V=9zUhl*EB=MrqqB-CH!bNbr~Hc#@@55g&gK& zzlNPe#LMGMlP3T4IikMp9@j|hU<@Y3v>Gp@b$LEj zgC8uxX+hpDz8zuD<=>Q$^8&sbbpSi@v?^{F<6t{ES-|%IPUEn`gJ*;79=*o3!tlUG z@QpJXE*ha#(>If1GjGQJ85Ykq-73VOxA7|2a*ln098*xS_^#w2-yc67DresxzX7wj zj}AuT%Z|I)S3G^WU-M5=wo^aPINpN~otQsep8P)VFG1>$olO7eydcLaRr$f>O`QDM zF-h{uA4BfuoT>+(&Y2)S@NzubeF8i72tyTC`W6sys0VW5 zHI@ISl_$;dAk<={htny**lpX$EH1k2f2n5k0fZWT@MeKG8M>l4NBun$Oo)8^R;Vb zL;D^!LvpmT%)UF#kQ21BQGGX=Atz$*E#3fTX5dL$SvLD;Akyl64eP@AemMCw=!+!H z>ww~0aO2Q~cld3V5@ z*pv*VzUi7^Lw$|2z9}495^6=BrOt43v$G-Cx+J7bXbUKFnp+!#4NBF#`Cg^e?XUDI zXP-SnIlZC2Dda40o;IQFG?|-FGeU9Vy4>R{E%lYm_g7u2OvpR4O}WxJlb29wUbr;~ z+SWP2#*lNSGcf5i<+R+%{mV-lf^BU;K+SI79Phk9iQipWsSpdgB%6x*YBN%WuS8+x zgt8>mR1<177ngbGc)asc7@?-><_MbIS{`XjXXKqzGI#!*D%4v(ztYUKJ{)Q!xvq06 zzAAi4C|TR$U^v_ms#@Mc%}Po=%UxCF_Xesit?&jsbLY?Udn?gc*(P&orEg9dFHN!x z)|WN}moP0jS2z{7FHq`tm!+y~j4WxZYYvw*H#Dz5gzch*aCig6#--p4NR^D(;1Ip4=LgjgjgAG)m z%yRqv=@d<{o>tZubFhgsFV&HZuD-3ZuD*%YM|pYWVQ>YLg94*KktLMog@t*S&z%!s z=2m60Z-&tbD`7U9-X+(Yx>9mf%I99F#8gHU7N;QOYLuBXXQm(%k(;Poiho*iPIJCn{*#T{O%ctW*GWs4hs9{h!r8ExU3`lbsAzoEXmKCECgqd|=!#nT*F+z@ik zVxCOliIX}{sf7DzkV%_B6iJ&>&i#-A2g4kVlY1J)Q(s$KUyYHxT&bXO=%n$cltvmF z6gAjTiyGQc8d_4{+@!c$t3#2tDYGI=#I534-V|&MwmbcyYeEf5S^bh=Q>n_I$Q=?Dexq%Bl46(SEs=&-JVvKGJ!O3${f##tI^ zs-~`O6EK=s(u8K11cg?bTb4VC)Qpe>LOa3g)@E}V1CZ7*-#D3AX{9N!X{b&lH8~fD zYMbE?E1H*v8ezc6P7O7-z|@(43Cx*`2`^dFgx0{OL*#;lTYx|qSEV7uSRuuGNm@rE zi|$W{Av;lVbKhR5*xa4^-C$TZ5P#S`qa+S>dvj zA7yUO876-xV`CPEI5FzcqpW~gC9}{Zj&R)44GD+fYih$ZqG&FbSuM>?Q%ag!u>xu%@f87s<4VGu<-xY4vS5lDB30H>uPLVcbfg8LhK9D5 zR_evnEk~)WZ@@aQVL6*xWd_Y$;w*>Xf(=R76mFid(f%b#1BIRTD@_`yyy=I*jg|fO zFH6}gH{1a*$ZTP|{Y$vvma?Q@DK}sC+rNw%a2fp$P{vHSj9GHOQf|imWf5k~lYUec z!jwhYubde){q!s0Ce42Pm2tCXzp~5}Q%xy1M_5xz6hpU~b^5~2`Zi}U5^kOXmx>sVg816j=0+BU^F0#K`)ZxbnCySo7yNEteEFK{U-&}rqbbXTym+ zt zZEHPR&{kL9B3G8_^(GgPeEo0+ufh0; zVA5HKnH3Y(p!LzjMXRP{U^7vzm^c{=hVW8Ku;ilzt3IB1kf6N)AVj7sNr#!i*<9=V ze)1ru;1vD*w&0QwEsvd3nw>M6BjJ`v_yXsQw&nkGRS|NgB?+OXBF|(l zeRY%qv!xL0a9Tjpm23xZfQ**q+C{EY$pN>8m|v}?g%s8`@T%m3o5OVonnmYKcEXgM zHKAHsK*05e>RX+(0%vhDtB>8W-8Ht849dD-ld~<-f~76IIwHyjhL>7`r`yT0)_RIz zlXjAnU-kp7ji3|?{gKGk4{rHV0XJ-!gEY0KK}IZPaL3m!xRHZANoZQB@KIx0qcEZI z0~fI@fJU~30&J&9!W)C(>bd|nVE9gfVmoQb^fyt6Gq*~2dm=&qjLo6ti9{jN%xe<~ z`WJ5suS+B*;~4Ck|4Jkd0dEyvl&B*-q$`l-Jd#Mzzxc8TDSbe;8*k2hL*`< zD#Y7fok-U`4|=3IFC-G9h9HmBgLKl1iNsw<3tvhkK17=Haw0KlDEJ_qfwXRCBC!zZ zq+Q^H)OaP4c$domo=7-{LC)6`i3X&FIBUF)@_Q4BH<8kX^J(m|T{};)wL5GljT)Xw zvJ!k8{?_2gJ&xGoWX*7PSk#5vsrXyF46*}H$#RrtSRxh%6ox$wmE&pg+~rbeQ_ z0)I?rNaaQFF#gsFvYgSOWm)+dSB}VXy0dcJS&ms*nZA)sUIVD3&>wFkY08MEglIBiBP6zGL zTU@sz)gMy<%Li;|FYFojikEZ`O|Kl{W_oOZ9!pre-6JcdO3`GX)`9K{&|Q<%Bh03s z{7jE!Svze*rrQQ=KnZ=dp$dQ9;CJhDiNw)KeshxiN=YAH(y52^kFh$eIKQTF!gf zJCf@x*8f6(t8GIT*s|8xf>~>Atw`O(@j)oGq@P8& zp-^gfCj7-W@Gmb3eVW_tp>~(SPHwied)7#W&PRGcyBa=dHe}?oVLY1qmW>hC7Z+vi zvt`^iVApy^k{tB5`(5x~c}Y3Eq<@w4pOmB0A_w%J58A(hcGatiL@(|YjQ*7w&{1?q z#$6+_9A46TDQ?_Znck75EG4^C;0ImslV2rePuXQkuWVeEWgV~$(K8@C+S6}ffmJ8| zD!^}OB$2q1KHh?AZqG>Z^CkU73E8DDYwfU%_XlL>9yw&kQCaJTRc5Up7C<_SP$50t ztsgdP6?qJbkCIHG|g8aSeXBO3U>)4;xY zoPMoHCAZ?c`5m@D(ypK1!?X8`bn!2FzFDLaex1nQVu9Z+^1rsg9~1eF7I?47ziNTM zEAsm-@UKOF_P?5T^9JABL9E|{;0@5VSzs@ z^1CeXe~EnD0{>j(huqKGJ4U1@igbbnK2_w4E%3P_f4K#Iwa8y1(w~X+=OTU30{^SX z_gdh4MZQm@heT@o6_MWpA8v_zzHM0%-6gCbojQe}{f zwiD>u%M)dkNEIi)87=Y+EBOt+mB6kRwwa(PCy9KfNNF36u69vAj%O8F{-5s>%>-Ic z`wF<^s=P-yO6e~Th;q46zCZ{{`&@L<9ui%6={oHaWQy};4yJ7(y69gqr7N2!%5ah5 z<$rb=c)6V}3124!mU0(o@pAf<2VJuMQ+PJnK79IzwGY)XQoJq5@(Tqcyw@np86{q^ zX89aZj!#0c{B45o|LY|G#eq5IJ2|{qq!l7vB+?dKb4M0!A^ z%Bc#w93pj!G+(5}BCQZ9$NurZnL9a6SxL$H&PnqZ<1l>0Sx}HSH7|ckL4;)sZaC+h zy!@%T0(|&7Y$zV8e3GzYkv-T@a;q>rr$E4K-~-~*_{hMn=m8NgR15sG1bh*_j*Ls% z747{Ieusc>Vx`zl6!2o&^u@*Y?~z`LKf-s;C#a&Z{duH# z?E-@0IincB596NT4kE-Q<)r$VJOaL&m12AexI;YHWc%5Gy)WRa!yJ+AOXK#CfUk{k zINMhy7!+;8%iRlq%i(hTp8zZf|w{*A+>{@;>t!9e=Yj~VU;h&J4UnKl> zz>kp`Q~JRm@Zsz1m@y`SPK=snUUqgKIEqpEm z+yOog3!mU1e8PfHp}>b2?7D^UGsY+~E|BuX2H~@I5ctMH;4cjVHwJ-!JqUa>1g7>{ z^>!lQ1LA zLBJi5v&GVn$1;3}qRiv;X9zy@QQU#}&_BR15d0;<-)bjs2>xqN;C*_+I_8Y(fIy$V%Gjv{}mQJsR1MGMmj`ro% zx3vcI^1+1;REWd!0n;lzyr3@97;G|w1snN7MIPgacQIPPt8Hn0OJG?Yq-kpjR)_NF zkV>+OP&>|q33;qs+tQ`!Ck4qL2vp4TR^d&q()n{rs(d)P7sxC4iI5**ReeJsghMY} zY||aREC3DR%w@kbB?GdY%1@RAQYXsz*|PvYdzDvEAP`#kdkFz?l#Cx%k>|#^-s#Pu zWPb$1$!79{h@l#(cLgeIG-U@8?3{BIm_S=Ng3sdN^^;I5Uh8Q?zX!sNf$9bv+i8P} zYMKK}8k%vQFi?Z@cWr@Sq#bYJG`2K^aMlxDF(5_&$BgO&!PeH`@&MlG!inYD)?i~O zP!nlvTn-Xb4kvHw!)d62KqP3FrEOtJ(eszcd8QbRh0)) zZLcaXp_W$#@m7_Bx2|wbE{RRNz&u!!24Syer9lFrnqWAn)Ix`C>5|ay`#;gY^x`DyAx}p=JHp1aK@mg!ZMO5}!uAixjdn0!RO}ildULQPb8Oz`3#-XgA=S3tXHn z4B$L|4Tc%L?v>6Er}C6qoDN=^21Xb3M-41)YZLNQ7b~@NIxUTCNhpkFq=9Pb&{}#I z1p+VuX?p?gn`)^Ol7#2x39FIgCCz36f$H`kbt+!ezShE;Or4Ah=g*SdNc&1&+w#V6 za4}NojHPw*4vq?MASiiwAug1+q$!d|o)I0r+yq)2sc)#6QePuLczJXRxpRhIhu0^R zJe<2l6+8{M@)EqtOXscAG69seh8luIAnsZk!b%>KJP)^dOPZ0T8~7y!uZp%KOQRjw z&CKlcLUm$%*VTZV%yAxkpmPd&PgGPX7%%~YjX0{F$9bVs6-)??jqoCAv)%tZL;E^5 z{2_d0R}SJUx@0Q%bvTsc%6m#r$KP=LN%}%TFVlQNGF>vxm7w!*W2UbY^fGlxM3ExQ zNV|NfM!cpOTxJilbR9$7Pei=daO z`HU!0N;;X+Cuq&|GG3SI^VLL^x+I;1JcAoEyBz;TIkhvoIs}Z&zqSqX+IM79&TvMSGb+z{zFSQ$FSnd zyi7jSNN_v?d3t}^Ua{b-INn|~efuxgp+V3Nnl;62i(Dm@N zf+xveXY!8UoFeMax4<1e96Au#RJPQjm)KZh49v@a}W h7a*2Y^zxi;u|HX_#HIbmf#~ Date: Wed, 6 May 2026 19:47:22 -0400 Subject: [PATCH 2/2] Added electric puff macro --- asm/macros/battle_anim_script.inc | 4 ++++ data/battle_anim_scripts.s | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index c4db001a81..e9cf8fa0b6 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -524,6 +524,10 @@ createsprite gFistFootSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration, \initPosition, 1 .endm + .macro create_electric_puff_sprite anim_battler:req, subpriority_offset:req, relative_to:req, x:req, y:req + createsprite gElectricPuffSpriteTemplate, \anim_battler, \subpriority_offset, \relative_to, \x, \y + .endm + @ createvisualtask wrappers @ The arguments are based on the CMD_ARGS of the task. diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 3d126f045a..4910b57da5 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -3586,9 +3586,9 @@ Move_CHARGE: delay 6 loopsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER, 6, 5 waitforvisualfinish - createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 16 + create_electric_puff_sprite ANIM_ATTACKER, 2, relative_to=0, x=16, y=16 delay 2 - createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, -16, -16 + create_electric_puff_sprite ANIM_ATTACKER, 2, relative_to=0, x=-16, y=-16 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER waitforvisualfinish simple_palette_blend selector=F_PAL_BG, delay=4, initial_blend_y=4, target_blend_y=0, color=RGB_BLACK @@ -4439,17 +4439,17 @@ Move_VOLT_TACKLE: delay 8 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 10, 0, 18, 1 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET - createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 1, 16, 16 + create_electric_puff_sprite ANIM_ATTACKER, 2, relative_to=1, x=16, y=16 delay 2 - createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, -16 + create_electric_puff_sprite ANIM_ATTACKER, 2, relative_to=1, x=-16, y=-16 delay 8 createvisualtask AnimTask_VoltTackleAttackerReappear, 5 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_ATTACKER, 3, 0, 9, 1 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, 16, 16 + create_electric_puff_sprite ANIM_ATTACKER, 2, relative_to=0, x=16, y=16 delay 2 - createsprite gElectricPuffSpriteTemplate, ANIM_ATTACKER, 2, 0, -16, -16 + create_electric_puff_sprite ANIM_ATTACKER, 2, relative_to=0, x=-16, y=-16 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 0, 8, 0, RGB_BLACK waitforvisualfinish