X׻ >Mq O0]Xd ( @ (//(  0/80@0?/8 0( ?G@POWOXOP?H0@/7@O_``h_hPX 0(P_oppxow_g@O/8'' 7p`o?G/7 0??H/8`/o?GOX@H0?/pOW?H/8 7OP?G/7( P0@PX@O0@ 0O @H/@' 00@@P0?'_OP@H( 7/7' ^^^^^^^^^^^^^^^^^^^^^^^^^^TeeBBBBeTT^^^^^^^eBDJ33333JJDBeZ^^^^TD33==#####==3JDBT^^^^eJ=###=3DeZ^^TB3# #=3JBZ^^T3#  #=JBT^^J# Sll #=JBZ^T# %,68??86,/@A*< ##45('.6787-9%:;*<=#$+&,--.,/01)2 3 $%&&'%($!)* ##  !"#     ?? Martin Piecykdwl^ @ sGoombaLeft x )3'%%#X ! qa=I22:nĆ_Zؗ{ L,n",q TQH'*K[ڃė ͭ$)܌^,^h]Izc/10;>54\t Yso+, x E㹀#0ػ#Y:B0& ~N u[F@-1\c&xC݇wc xt'a*"vW2a_V)_-[J)SpKOvR$f2~y/ٖry v9Y"liHIU @ sGoombaRight x E)3xه#X֗e BF ^$ZHmWW">$ lgb׶3 ~r2O +%aVc #@-c@.SY膥Ԇm3 fQ15C@ sSolidBlue x 0-]::}w   8q(AB"]JqWu1^4\M0XlWBn>33qaPp-VBSý'Wwmi_lP ħ2G(>Ey8KbV\Qh)Bf|0Њ1FEšLe[ fgJyGb!x*8?(/R 7_O sLadderOrange  xС0qd%7$dwBM & ^{^;(k~%$?֝ :w SQ3 ~oFGJEo_/,*DrX$-QW' rW(ZoFЊ߱Y$GUoKQEsMovingSolidPurple  +xr F@D *̊E"Hd$k ?M690_O]}N}:1X=I$(#50Mx pg`Y`O@1K9Ɠ-XQ-n,`)r -,"Bf1т'=(HF͘ EG-e|aSZb,RT?,8p;,LuTuL}q~$*. N3|潬MDٲvk/Mݲo۹%韶O4AsPlatformGreen x!0E`V=#aQQQQQQQQ Mg4idY+{y0f3hDsMoveableSolidBrown Sxs5cf3 b(fdH@)};rfohސְ.fMbʸ1EKg/͘2; qQWO+& sStandLeft   x!0EQJd% 3D"{'@s$٣ĕt )i_vݞ/ qBrܘ"џ P\kC-፾km]X!P} w k,ߏƲy5'c@ŪמJ[8'7] HX`QBٰiUhUJn w\D8Y;opL4EΤ2_-B sStandRight   x!q&EE h4#|`4}s, 2?;{?\ʏf\c.Tǰ 35 qD]'m ĸ ;o?\R3@v =^BP%N {o89usU{`AA`/̸hˑmvɖx7Gz5V[S.0,Y! IJ >`\|@<+X?s ɖ[` /0b<_SV1L sRunRight  x-0p YBwD"GI8xk6gN||l'sܘd4Ȅbԫ~?ǃV%XEM%, G0VO"s+P]9<30Q+%k' Ξe0ID>\аLV1~f1NXn>4߬Zzk9`qWr~{ x-0p YBwT"ae18B%ٓ0qҗ揤ӝ6|ld'cبj>dV$fyuXҗxCMw2s4P<(xp>+dY'5x&$R Gz;M[|g LBIs~D7mimgg?g-kN_zU-zX-VՌs I/Ϧ6]M!521;Bc^d YrA6oÜֻ/{sńU!Ce*?7yߟG&1j3J#,D~Wo x}-0 @V"+QJ$#DF"=Jy$ohܚ`Gc`ll9J*\ Jb=Ha/ZNJ|]GM!>@A _1Oo;XC X0flص}@M6 dKL \[4sެ9fEPHrA)3kXW^߁^00W$ gvr+~XpexF{˴Dnд(Qd ^FWo sLookLeft  x10 E`gBȄ:21WH{==cO$mZߑ2`sLY4_7忪kH5~Ж&7h sLookRight  x10 E`gBbdB+v=BcpFF|u\G9~b9@q(0EeFTʅR~{iXuasbSHÎd7hsClimbUp  x-@pYB7xJdP#p PD$tv_iLl&录1NC~磨Tvm~UZB4ǃj}QUϮhzi}iQ8(EW0 +c!7EnUcDطφoJ`7}w<[8w-P(=SxfI%`_p\}L8v-j x-0pYBwT"+9Bd18B%ٓ0q%nG ln5b#6r߇ [յ/$Wぴr (ƄC-E*h}>)G .vLw(aN-73$`@~1jíBb2rcDw,6^E-~̧0[j'䮬-k?Y8t%r sDuckLeft  x-0D% ;xf*Hd# 9GD"s&f3Mz޼i淧gMAD U/i K;v0-ŗBD> Z?anaތFS<̌2M)*59%3~>؏XZx#sEclAL2#\O+/+'?i] sDuckRight  x!0Ep Yb<3H$2G#T"9 l-`'}?٤=_KcQc0 U|Y\1nQ:T8<ɫiBs OX5ˮy-tM\dӂQh Wt; ^gݸqvAB'Ǚ% }օ|ʋX e=)/H-LU$[B sFallLeft  x}!0EaQD1D"{8ImfO'&Mr<}V{cX."\Ry۲UŃ_/$OBUX#C”I4yR߅L^~aפݼ+ħw{!|| l$RbQ sFallRight  x}-0pYb<D=#pJ$2'a%nR2/|o&vPk u4ߏt?Yutm8w"Y51#7hY!MRs T3тO&X4-Lpfnuټ"cFTIf &jcY='rk\ANDsFlyLeft  x!0Ep Yb<3H$G#T"9 SW>ISLyNa+5{h,b Ŕ9] ¢8TR$)a-Q3<K*r<`;H1?ꅧ%<)IԽ{}\t`ItB!qy&^*:-yz$FrDg*@רϹkn]qp=@&%RB1'D%backgroundClouds +^x-s+I5b҇lCNĒ M M EvĢEB^kUw'z:teٖէOyI/_o_<}^~ԯ۟|7ތґQIwAտeR+.B"`UcA\uvPVP;>;GgU \ZZ:}R+G\utϹ54zm4h}&OT]v3bz)SK?o;q;?*вM`:ꭿ/T_,UP֎OyÉN`Zedu\PքfoeW&VA;_ "PV>T~<7>X9y+A>{Վ_?Un U5/`UK6">w,DB:_y-*UBNBJpv2/#~&F`!%8m&ȁ-ŹϕXz޼-RtFlHh"cb58_- .f[ޘ8xW(·NJ\gxot | h'_ \]=Z7|1JNjjo5PtbYWܧ= ]B'w=^bbU%kmQ 66M5P"_'d\m"/" yLsR ?C?󝲮Մ|_ c@*Aly !T\9"'JA-}D,"n+n a:_m"g-*>h0kO _j算i/ _GP0u`L1WhؠuUR"ZMd9Tcb .dd EԪ HHȬ z؀@\=1Jg*ks!r(z?w8?rTp=7VOYh|Xqaܔ4(=PHMM5p&j&:xS.V~r- <W UW)3եd\٧]s gDux.\.G>?"?DIlƵVw;__0Q\KzN#.kxɌ$ɴT@wdI):pC\ut -)BAdDT]=?+4hظK.[. W ct9 `=TAGqZN_ZO ӵ3evbbwU5wJEWB :R| Pr*FP\/<+#Ը"rz\ȉvT(FM"y!uQh q]5z!T>T_)==-nl"qQ2;Uni**<j"`u8WE noxBbDWeu E23lYC{@rJ.|7RPUOqŸkZU.P !dcGXAD&C?Ϩ)+TPI݌1zz.̀Yy⌉;ݺ~SYN\Qi\toÕv\' c V}PEA} 侮h: Gtz7 -yk7UcY2#mTs /TU^kQgNWU.~GGKA;U,)S.zHh{Lj}5N&̔ދ9oB,3C\Mϧ$yY$Y9bŸ=iI4pmU?E )9nj+!+ jUhx׀DO_"=CSSGE9=* NS#tvXN$r0>8W;_Մ+n[bl^*݁UN4Д&/SE#j/*EanjUgX[45H|UKU/ MV5XS_ASEXʉϪ*ʂQ|5-,vJzew bF:XN#PU܉r$Pez#d+G= T3bq'P-V Z0<zU6Bt ] qN|HM+,"ʌ_uhUӼR5'Kt%,Xzɪ)St*V4޻Mb Do C?l-Lq%dU{^*ЄdzGTK%0-Xi%Š~ִ Q+:ߏ@2=ʷTRpnj:tWw{W߬"%- Y u1a@tpZ:)?ϨvPU@KQ_k ݯij)JQRǵT?;_du&C˪5fy* TBV#xjv[D_X.dSF|5dmkBsPm~Jt@_&ISMcM_գ+[L%=6^\IM !hk?K @5襤,wSUA,M;_mPU]ZGϛecė:/遑jrKd1r?J,"%{i,e>\ćT' e2e ZM;MQqkvY5OfJTGXҒo8BgՏ:r*I>jKèg$gr}qu|+[K}Ԃ%0Y=mCEҿ5iŵ}WN}:V29$e"=,owP=˜8ϹW?-Fao jʘ @@⨖MqHc{ F\ 2ZXSG5Wsm:M׍SHJE-MAKNq@A\9Ձ:t+5~Rt(xdW\_wfQ}ˣRȀ.eb(n&SOSS=DkoZp/mj>&Փ3Yyq/j6* +uD%gF( 29h7EP19wpêvj]~WApU'p88xGA:r;Zm++tL:_- v琲);'m$c_ϠB#4 #ݣ2q.-? y wqqL-] n 3[S2A0v|Ur^ĩhן t>|h9vs) Fu(嫒YK ՅSsl=4ZhؘzwmnLc,M˒kh*({tEsʺ~W~x7sfu75D갪ZZ"*G@zd ).wvT1>qMf8cuA$tm kTEugZ8 ;$\EodUޢf$E."'j|0?Rx*$/5UUL*Ag*o!ojAޔ&h"9Ř04Z}ҹIÕՀ.[.0rg1!8채 ANs5tKUT*|^(.,2XWkdU鑪s_J0c/N)gPhiN/0*kl6tH)p%DzXz$1—TpWQP.(Bȩ@^%B( [.L~XGqP5Т@u;nC5Ч'))+Gt k1tdnjQWᥜ1izRNwVDTN*9# +|ռ,ºUd'dPUU\i_-}02EtŞWKF\yVxkl4BMJ>ݒE@_  zggǕPVL]hjJg@Q[$ <.U+. wh+%7Qx`QǍ|5}ӞY?a$.)PN R~6Db h8}+1}Q]Ь "Vl|}냲؇:|A%'>!xJ\eqr#73BX@ŚB=O@kB\UfSdZ00d(^.00p!O3jP/-2{Dv'Z̥TTLt7P?s7,m9 @:: aӉdX8\GD)^y=nGCWި P3w{ -4B9AYۉ"d?*! nR8Y{L\5nJ,҇t3B/"ÕǬ5EuPYQkKU?`U/еuN[tj5gXjCs$:\>HAi+3v,7y9OޝTb}޹NdM͡5.me15xUJ 5t8A?U: OGOmS蠺WZI4"jzn(ZK>3 l Gn6& `",)m?X!J+C|Bl"򿬞cߪYFeWX?h* 2I0rڶn7~C`8CZT10- (XK6孤3ӑ4=[;jEO]H'䡯He/b&Ej01/+~\Mź᧠ K17@곎zo'9ϴ=>"\LhlW<>kTP%DoWt} `y&DIG2VGCC%xD4;XK8͖:2lĎ6!|QKWʑfry#bS C{{)BU}`{ptͮݚ*?PaWXae#_ɡ33k q}RqKݛcSh%= Teu&@JV˧A_2c[B]10)1W9m|A 0'wUy+aEjӑf{/I:6UrJyqfjIǕ(3!+(x)TYY5p KQБt* 6:-{G]PJsAT/%g":Jwͬ+XkZ}?y pv /\'Ze3\Ne8jhKP3!"`lz;G*0爮HκͷR" mЕBa_NE}RueY(k>Q+ϰ=RB!ƫӔYR<~鈮0l-!1ÞP2gKsnWjWP`w ׹ UT,Ay6;,3.*^r&9 KYM:o4sd +Wp9O\[ /03%*N ToBC]}]G?W.2^KHdu}LPhj5U2SQb.TRCki:XrX6&N@( ~ в:}kql+}crgպ,2m, Uz _v0UlGB W @p@@YI?'eBw@b -$\W2L%x˫IY:~$lE =chəګ课J^04PNw Qs\nAe|t}IV_5vFT.H,T Áߢ~b/MEՏ%x |e[*~56\J , h$hm@.\ W>: ڂE\ES^4ѣp<+KJ:6H;J7Pg:<tcci]ɠ GIۧt-GC& lWCK wZ@l|~n^@ż/6 FձW *r61 IGe,1 %l}jf $v$Th]jOh0n&3vJ-ĕU ,xB]vVIZf89+_6#]WW5lqPV0CPmV~ɆWهr|]bEqj?MsCĕ~oO< yB /#KCah~e~`B( +tL) Rl+!.3IWF*YC H{SQY|D{9wse?37{'RĄeT!1nB @%ˢc c*#DH[9EUY  `t+]Z%UX;&q!pOE" R% 'hUc7[78L.j/]QajSlR<{5%qEҮs+"l"%OxfbZT$% 4&A%ձ"%B\yr%T7aHV*7$M`[a82)&E{MV7W^B&B!WuVRXBhYJ,Z?/By-x{\\p{߰:(݁6z,#VP(f+tE b p" A2ZPF}e*P_K"fUݹ( #!puK Q1фT`ggpx:Ov zqY"`#*$n }"ݫ}j|4])$_hXn^^_GL9Bd/x7<65P8ohj$ّIaTE* vF+ЕC QJV}}X<v@K6HMZ+T_bˠMZ"/D,(ѯ5*/l## VE4tcG{Veh3r"KDTy3P{upތ.zdM|qPJJ9Y@*M#lF;(H1̉8s Xy  {QM^"+8O|zL8ߞ, Nekf I9/Bw8]O9FǚԚQQ,r!,`#e&kodnJae-j+`Hc^YKhQԣaoX  -tˬ=v?49ju?*6q-yEoaa *Cw\;MFT7Õ\H D|QPԼ*9^}BVez6?zȥ{VELݽbXhYhMqnRDfgwG/YݦЊb=: b>2IWy\w &oSt:BJ# RҪ%7U r,KLzh+pJU6PGބq&/-|dM-'BK@uĕ#KE3-ҝTsU DAEKШ}ZFVwu43:k3TkMݒgc^z9m6&,<^6Y$ VjQ\M0{bht?'DT$  6"+C2 `2(؈;*7{f#Mx \.Vr#Wh W hM&J5 SuRUfMVZm=MSI u-fISh?Òh!j r:<4Pp3W^lUiZxU)&os8I'(+dFtj~l `"B_9` H\WKt&[f:wԒvPt )_ XFYԅ'?nގCgx2%AIMC/xCsvtaدCz~uj䢋u[^{ij%kJ'PZY⬹a8|B0txnqu|B85^toK^S߃001{A `{`b8ȼ !0WUey( TZZ bqD#Nh1[81)t}uB&9Kk_UAۙ0q9<$gu1Uߟ+@ՌeCUIdjՙl#Ɋޚԡ4W|(sC7F`KlJ~;:QmAG|X|偺 <Ź -A? u}EcTYd#==/q!1m4g*XD_ݛO7`< gݱD7M rfQ$X\ [.=)iqn]FG ^FA$#Tt<"|P$pVdձJQYn|eziF;c&(>p/ֿ7ZY"=螲CVåK)ic.T&Qܠ.Q4DA*{7Vg_rQ^xϩ/EPqY]ab-Ma=J@]cg˥⍩4#JՋ+t/gP*vyc&E+"қNi5h݅gP}x)~(@z W^kN} 'W& y,D"KNyF&ԴQmY6N:i?}/=7|B>PԀ\]6k}:JYܱ̹"d eyc!Iea\,)eH7JEu)Q?C~AG?sk*Di6KP r(d;R=} k!Ӊ8"~Q WCuGR&?HվK|i݄R(L|(dž vW7./& HLۭhI,*i*A/zG QiC:W+X^Ed$kpoWn+o6i4 |u%SV͔6enoKAA&(_uA -x iח hxv"[k!"[XU`/DQ J % `TI$jH>rWWsSt ;g842UWVߪϷܹ+MB4t{6%*ZjC[5U$bvj:'u *pUzV XhAPU ]fn[ʮ8n\)+v⪯p_%ەWUK7s3@ qoi ٰ[@$D@V*<W Km;YH*КASRVvbd0#58sG߼C]nUڦ!n.T׾UKFJ pM3UH4 -2X\Y[O@hbU$M4"Ř~U"M-0۠y$8R(mm;}P'yFK6%U"QDU$z 5r;bkxS:Wjʣ )w#*|%]y5xSZXJ剌7q{+Fr\}[UZdA?yPYᑚՀF]}X2 YWan/f|U&Z+eIȷӔ. ]jpfx$ڟOϧp[{;ނ> ,i 9@B%~$dw^AtLԬH_&FLuC1JlxG{A.$JhUAh7FȪ+@Uw8O(9pp2Հ.$(h ]whY5s'5zZ%t}IZTmL +1Z7y"DW{8K7/(9YYTʡP+_ZL{ty*>R?_z% nw]Q3`%+@YGK= Oԍ5rdrKn04 IӼb1+KO,ǧ|Cs{TUS5P?xAZ \yE)( w\1j(HyNH2oW+U1Bq=8jiq`:8K31vY*LNkAAV]#zר;%*J`#tk=nx{і~lW@ 3Ap#k>;skREO" 'l}+TW- ՠE\C2#M*6mJ_O[Tj{cZ*|e"{?Iec&Aϥ8Rv.p:y0SO6+,ºjT*.-wU_IG Sjp }]tJXʹT#V=h+K$f>Cq\YwnJlZMi߆MtT?$A ߞy,OC-zXk"+6?n[iR3dmOBOS _ѝ9Be ふį$ݓ(=~buS %Q8MJpHkOXX* W*itކ5]p]w ݆PV>DWΧ qtM3&JF>DnZEwW :W-nRRAFd j \m̐A)UE4rB"n/Hb,XQTЙÀvg35j;y.8<6IATZ`NO1dU3e愤:TN#6Y2 T`cI<9v #4L븅)&56w{]S qpoNP"B2z|SF\NXؠĴ ĭ ">'Q~#zɠ@Wcti; \BUӽjՌVZ3BCWz:WR1\JKyt%;tFl'QdsPlU@EP"lAY0De~BWOsa5Ai;qzef)<ۮ"Ip?JAКqe^n^WH8兯,*ehA% nQ'fJQ~5h4:Bgt1GVZ2\tU h: IvJ;z媜k5ߛ RXHj$LГ/:iI=9Cm4Ȅ(2H'wƎi/18l{p٬6Z+{ :e.~Π;gp\e29ʖȊ~ƸP 4Nݯms7#k!6KO\V% s[+5X1lzɆ!ԡ*zJT[JmvưL)kx ~9*A]KqPvf&z^bQ}Uoaʍd:%lWVp츺ky>(Au}QL"ѕ|B>]YsE?𥝯۸! Яx(UiAѕ 4 +TzƔ>mw5k2nUTE5`FD'LIDLX$uZR ^ʅjSK&wsT k< &/r1⸚;k$Hl~ (e?gƸˍ q+4:9my=?ËF?"xݍė+Q+C5 @U{G:h1 R0KńQ+z -]fܠn= t1A%|;Jѕb__@uʸ"e-`15Na6gO Ƶm:V02sø!NA5;!E`y_ :qM G׎>o*(+V Y]Vuj¦ i/F1kMEK?U2c~BܑSkѰ}d2 'Zz5󭒅o eȄ+cmR&2giҁ$LMWܹzT Zjb˞YKYtt⬸cF+vcٻ˓0օ (R+>ji%"Ei6g20%SVgi1&$Ab)jJ5Qv2j2Ȥꠛ?qYXg4dxBLW#ku|L?TJ<|Rx˸6?sz:U@xj|eu1fjkUUB mU^_iNkDZ]jQFSB!T1l[h͋4EH8ZAu;G4L\fn+1~5ih ]k>V~-$Px4ů\ x7_5u@f7Up&[FA|^W(n¬3sCa]R>VYV&6P^p1`30\| `ĥR\m+#so\2KXbk`nL,5D@5mEuֲBܕ[ƥIq|ʃdʒab;-Rc,̃WeoF|5~,Nja @EqLY-; f ]!C]~EMgtD3aCdi>r.֝%fUUЂe;{ڛ09#7ѾNQXe>p\7 \V+70(UW8ql$g ! Pi} t[7#H*/U~8(W4TDg.1)_ 7eDO%%砂ɲ,iivuN+!I[.,D4 ;6h)* -2/{#dSJHh>;kߖϲW*FvU8[Le$ߑFY ]K7a{Fq`3_I+z%o~i F|)i:úK b%LTE"-{5P/ay}-3ךqu*ZfX͵UŹ>0 ?9fչgfKв`D=(KTnw;\p9uuC(_M*$6)E1U T#QUPD@Q"+< 1a9}M"5zƛTʺR3tr?} {C-{#+F(gTLWaAZ띣y %}KdB%c&3ִNǗy8,=.JJvv 7=vXz vt![lG" !XTH,*&#W, 6;)7JaE:؃/y_8m -8~/ 5"CD=9~Ca;Ha.x;GqhE-т}h(4@ "kXC,܈F^gH MQFX栒člN1%԰⸙*0yY+(k,EqÉL,ł#LB8 +pS\Ik+ FmXw-8 GLQFVm|f}{n}D\) p"X69ƜEMfYbÝ.:'73-P'þcv@ȔSE\qx5iCخRHJ"%( 43Sp8mɨvAS.>^P:ĘҚ7yTvrJιU{2^ hYWݒR_^Gwb^bbYWMڰ_HBtbx=V3CaX~(_%(4 mvMWZf/X(Δ'nHjgQcLUG; "_=3"GĘ%BSir7:LostyY(ao-CVِUȢ 7$M(z-i3@LcL%ГP^FZe\\})B\Y KUp%Lcw2&{P )@\=pLVcp$TK?Ji϶dDGG2E I!֊Zal-jbӗWkBt+{0%Z='A㬬%># !;6=(ݴlZEYg ءC;QI`rޕI2u(L}}UW*qT$]z#B2ժz5y_ ]*U ՛1TAS6ٌd`^XOw>2)H(c{i H/i:=l+W>3ϝ\T0EgUn[~%Кj~ кzEULj*/Ie- &:P}j 쎸 _1ou}h(d2DED]ft=JNP+{}f0oh!]9œ`A}BY]KpR`uM.hUUgapz+7C*{:ý4J DAZA51JXgSDi*"r%X_93cf خic`HLP 2E@c.:#[k!MRu+jцu"W<T!J. o-$>؜#`9%_1J('$SoNοGhg,wq+)*#Ez@&3]@z#AKvthUO=WmM Ү0J*޼{M}T8W)b5<J}%tvk5G^-f嚠EUZ^`\qIB}.~Ukh:9; -#1(ViЁgL2/Wt:YUľ']к#,trOVߗZ~{&XW=$׈(uhQVqfheE=Fp+[`@Ϧ`TzZ0#&~`C"Sy%ZAN'Q@+n!2}1)NE^`B;Q_jdau!~Q X q͔9Sڙ!+[LIaBBKpue4|0BGmìgfERk~ZJn3*Xrj ҒClqh%9lj*db-o24_P(ahES%^5P]:΢\}R5?Ì&#JL~ֶRVLp *bWTR>VPt~䱼MÿToQKVܑn3fmcnh-(|f)T=aw쯿H(hQ ] Zo-U}5Ѵw5cQ6i 0,ZkJ>Yeǩw Bò&Ic8k=EJhW@e`ʋ\QZh\&a*_q9$/}%QE9W^ /]`-1K]ŝ.ٝR8LPmRr0lrJǸ+L*@ =6dZEt}͹%:&('+y@tHu(d\P\B$Zw\) %V@bm홧͉"%v=ecދ%}+5AD0_I(dP+ 6iZo~UY9C[@Y6`b)iVYU5ʂ%PY˻>Z,[cŐ/俤_!FNq16Y2 ?_M>s ЄCGhzCj]dK?pCdAF'գSAE J޽j.=;&ejq5wQbKyJ~_d!M31yx uϺvZWˀT Z [bavGF91_2̦pHYj# DrV_eWK$}8Z`3*AFYb1e'գiHHh#bZ:dsˤ}WAԻJ(Ftqy, p} Z0'jG _IJȢd\2FpS}$n@L3 ^\lw~ĕjW!]3?Vpb-nbyug0:35Lgvqa/uNt첛*3ф oǨMPCyם{a;L,}{~P-,ګqbȢ!,kG*,*`H ںl0]tŋ\Vӈ,/ -Bɒ @ ?CkuaԙѸEf+tPE/&$(^:kUdrK}%"'4k8T>WYH'YA[g|j9/΁T 1C~=|\ 0au6Z ǯv6ᐲuf.Z}XZFAŪrkmWO =?L\rFVxG9@tJo4f6MI;YU63m^UΊ'nPo\ognYZQkt0gU[JػYdzCᇽ~-bZCm  3U&Eo8$1lEњgjjgE4*VJ|s,ʠ>D<(49¢:G\MJsp%cDMWqyI/_o_<}^~ԯ۟|7ތґQIwAտeR+.B"`UcA\uvPVP;>;GgU \ZZ:}R+G\utϹ54zm4h}&OT]v3bz)SK?o;q;?*вM`:ꭿ/T_,UP֎OyÉN`Zedu\PքfoeW&VA;_ "PV>T~<7>X9y+A>{Վ_?Un U5/`UK6">w,DB:_y-*UBNBJpv2/#~&F`!%8m&ȁ-ŹϕXz޼-RtFlHh"cb58_- .f[ޘ8xW(·NJ\gxot | h'_ \]=Z7|1JNjjo5PtbYWܧ= ]B'w=^bbU%kmQ 66M5P"_'d\m"/" yLsR ?C?󝲮Մ|_ c@*Aly !T\9"'JA-}D,"n+n a:_m"g-*>h0kO _j算i/ _GP0u`L1WhؠuUR"ZMd9Tcb .dd EԪ HHȬ z؀@\=1Jg*ks!r(z?w8?rTp=7VOYh|Xqaܔ4(=PHMM5p&j&:xS.V~r- <W UW)3եd\٧]s gDux.\.G>?"?DIlƵVw;__0Q\KzN#.kxɌ$ɴT@wdI):pC\ut -)BAdDT]=?+4hظK.[. W ct9 `=TAGqZN_ZO ӵ3evbbwU5wJEWB :R| Pr*FP\/<+#Ը"rz\ȉvT(FM"y!uQh q]5z!T>T_)==-nl"qQ2;Uni**<j"`u8WE noxBbDWeu E23lYC{@rJ.|7RPUOqŸkZU.P !dcGXAD&C?Ϩ)+TPI݌1zz.̀Yy⌉;ݺ~SYN\Qi\toÕv\' c V}PEA} 侮h: Gtz7 -yk7UcY2#mTs /TU^kQgNWU.~GGKA;U,)S.zHh{Lj}5N&̔ދ9oB,3C\Mϧ$yY$Y9bŸ=iI4pmU?E )9nj+!+ jUhx׀DO_"=CSSGE9=* NS#tvXN$r0>8W;_Մ+n[bl^*݁UN4Д&/SE#j/*EanjUgX[45H|UKU/ MV5XS_ASEXʉϪ*ʂQ|5-,vJzew bF:XN#PU܉r$Pez#d+G= T3bq'P-V Z0<zU6Bt ] qN|HM+,"ʌ_uhUӼR5'Kt%,Xzɪ)St*V4޻Mb Do C?l-Lq%dU{^*ЄdzGTK%0-Xi%Š~ִ Q+:ߏ@2=ʷTRpnj:tWw{W߬"%- Y u1a@tpZ:)?ϨvPU@KQ_k ݯij)JQRǵT?;_du&C˪5fy* TBV#xjv[D_X.dSF|5dmkBsPm~Jt@_&ISMcM_գ+[L%=6^\IM !hk?K @5襤,wSUA,M;_mPU]ZGϛecė:/遑jrKd1r?J,"%{i,e>\ćT' e2e ZM;MQqkvY5OfJTGXҒo8BgՏ:r*I>jKèg$gr}qu|+[K}Ԃ%0Y=mCEҿ5iŵ}WN}:V29$e"=,owP=˜8ϹW?-Fao jʘ @@⨖MqHc{ F\ 2ZXSG5Wsm:M׍SHJE-MAKNq@A\9Ձ:t+5~Rt(xdW\_wfQ}ˣRȀ.eb(n&SOSS=DkoZp/mj>&Փ3Yyq/j6* +uD%gF( 29h7EP19wpêvj]~WApU'p88xGA:r;Zm++tL:_- v琲);'m$c_ϠB#4 #ݣ2q.-? y wqqL-] n 3[S2A0v|Ur^ĩhן t>|h9vs) Fu(嫒YK ՅSsl=4ZhؘzwmnLc,M˒kh*({tEsʺ~W~x7sfu75D갪ZZ"*G@zd ).wvT1>qMf8cuA$tm kTEugZ8 ;$\EodUޢf$E."'j|0?Rx*$/5UUL*Ag*o!ojAޔ&h"9Ř04Z}ҹIÕՀ.[.0rg1!8채 ANs5tKUT*|^(.,2XWkdU鑪s_J0c/N)gPhiN/0*kl6tH)p%DzXz$1—TpWQP.(Bȩ@^%B( [.L~XGqP5Т@u;nC5Ч'))+Gt k1tdnjQWᥜ1izRNwVDTN*9# +|ռ,ºUd'dPUU\i_-}02EtŞWKF\yVxkl4BMJ>ݒE@_  zggǕPVL]hjJg@Q[$ <.U+. wh+%7Qx`QǍ|5}ӞY?a$.)PN R~6Db h8}+1}Q]Ь "Vl|}냲؇:|A%'>!xJ\eqr#73BX@ŚB=O@kB\UfSdZ00d(^.00p!O3jP/-2{Dv'Z̥TTLt7P?s7,m9 @:: aӉdX8\GD)^y=nGCWި P3w{ -4B9AYۉ"d?*! nR8Y{L\5nJ,҇t3B/"ÕǬ5EuPYQkKU?`U/еuN[tj5gXjCs$:\>HAi+3v,7y9OޝTb}޹NdM͡5.me15xUJ 5t8A?U: OGOmS蠺WZI4"jzn(ZK>3 l Gn6& `",)m?X!J+C|Bl"򿬞cߪYFeWX?h* 2I0rڶn7~C`8CZT10- (XK6孤3ӑ4=[;jEO]H'䡯He/b&Ej01/+~\Mź᧠ K17@곎zo'9ϴ=>"\LhlW<>kTP%DoWt} `y&DIG2VGCC%xD4;XK8͖:2lĎ6!|QKWʑfry#bS C{{)BU}`{ptͮݚ*?PaWXae#_ɡ33k q}RqKݛcSh%= Teu&@JV˧A_2c[B]10)1W9m|A 0'wUy+aEjӑf{/I:6UrJyqfjIǕ(3!+(x)TYY5p KQБt* 6:-{G]PJsAT/%g":Jwͬ+XkZ}?y pv /\'Ze3\Ne8jhKP3!"`lz;G*0爮HκͷR" mЕBa_NE}RueY(k>Q+ϰ=RB!ƫӔYR<~鈮0l-!1ÞP2gKsnWjWP`w ׹ UT,Ay6;,3.*^r&9 KYM:o4sd +Wp9O\[ /03%*N ToBC]}]G?W.2^KHdu}LPhj5U2SQb.TRCki:XrX6&N@( ~ в:}kql+}crgպ,2m, Uz _v0UlGB W @p@@YI?'eBw@b -$\W2L%x˫IY:~$lE =chəګ课J^04PNw Qs\nAe|t}IV_5vFT.H,T Áߢ~b/MEՏ%x |e[*~56\J , h$hm@.\ W>: ڂE\ES^4ѣp<+KJ:6H;J7Pg:<tcci]ɠ GIۧt-GC& lWCK wZ@l|~n^@ż/6 FձW *r61 IGe,1 %l}jf $v$Th]jOh0n&3vJ-ĕU ,xB]vVIZf89+_6#]WW5lqPV0CPmV~ɆWهr|]bEqj?MsCĕ~oO< yB /#KCah~e~`B( +tL) Rl+!.3IWF*YC H{SQY|D{9wse?37{'RĄeT!1nB @%ˢc c*#DH[9EUY  `t+]Z%UX;&q!pOE" R% 'hUc7[78L.j/]QajSlR<{5%qEҮs+"l"%OxfbZT$% 4&A%ձ"%B\yr%T7aHV*7$M`[a82)&E{MV7W^B&B!WuVRXBhYJ,Z?/By-x{\\p{߰:(݁6z,#VP(f+tE b p" A2ZPF}e*P_K"fUݹ( #!puK Q1фT`ggpx:Ov zqY"`#*$n }"ݫ}j|4])$_hXn^^_GL9Bd/x7<65P8ohj$ّIaTE* vF+ЕC QJV}}X<v@K6HMZ+T_bˠMZ"/D,(ѯ5*/l## VE4tcG{Veh3r"KDTy3P{upތ.zdM|qPJJ9Y@*M#lF;(H1̉8s Xy  {QM^"+8O|zL8ߞ, Nekf I9/Bw8]O9FǚԚQQ,r!,`#e&kodnJae-j+`Hc^YKhQԣaoX  -tˬ=v?49ju?*6q-yEoaa *Cw\;MFT7Õ\H D|QPԼ*9^}BVez6?zȥ{VELݽbXhYhMqnRDfgwG/YݦЊb=: b>2IWy\w &oSt:BJ# RҪ%7U r,KLzh+pJU6PGބq&/-|dM-'BK@uĕ#KE3-ҝTsU DAEKШ}ZFVwu43:k3TkMݒgc^z9m6&,<^6Y$ VjQ\M0{bht?'DT$  6"+C2 `2(؈;*7{f#Mx \.Vr#Wh W hM&J5 SuRUfMVZm=MSI u-fISh?Òh!j r:<4Pp3W^lUiZxU)&os8I'(+dFtj~l `"B_9` H\WKt&[f:wԒvPt )_ XFYԅ'?nގCgx2%AIMC/xCsvtaدCz~uj䢋u[^{ij%kJ'PZY⬹a8|B0txnqu|B85^toK^S߃001{A `{`b8ȼ !0WUey( TZZ bqD#Nh1[81)t}uB&9Kk_UAۙ0q9<$gu1Uߟ+@ՌeCUIdjՙl#Ɋޚԡ4W|(sC7F`KlJ~;:QmAG|X|偺 <Ź -A? u}EcTYd#==/q!1m4g*XD_ݛO7`< gݱD7M rfQ$X\ [.=)iqn]FG ^FA$#Tt<"|P$pVdձJQYn|eziF;c&(>p/ֿ7ZY"=螲CVåK)ic.T&Qܠ.Q4DA*{7Vg_rQ^xϩ/EPqY]ab-Ma=J@]cg˥⍩4#JՋ+t/gP*vyc&E+"қNi5h݅gP}x)~(@z W^kN} 'W& y,D"KNyF&ԴQmY6N:i?}/=7|B>PԀ\]6k}:JYܱ̹"d eyc!Iea\,)eH7JEu)Q?C~AG?sk*Di6KP r(d;R=} k!Ӊ8"~Q WCuGR&?HվK|i݄R(L|(dž vW7./& HLۭhI,*i*A/zG QiC:W+X^Ed$kpoWn+o6i4 |u%SV͔6enoKAA&(_uA -x iח hxv"[k!"[XU`/DQ J % `TI$jH>rWWsSt ;g842UWVߪϷܹ+MB4t{6%*ZjC[5U$bvj:'u *pUzV XhAPU ]fn[ʮ8n\)+v⪯p_%ەWUK7s3@ qoi ٰ[@$D@V*<W Km;YH*КASRVvbd0#58sG߼C]nUڦ!n.T׾UKFJ pM3UH4 -2X\Y[O@hbU$M4"Ř~U"M-0۠y$8R(mm;}P'yFK6%U"QDU$z 5r;bkxS:Wjʣ )w#*|%]y5xSZXJ剌7q{+Fr\}[UZdA?yPYᑚՀF]}X2 YWan/f|U&Z+eIȷӔ. ]jpfx$ڟOϧp[{;ނ> ,i 9@B%~$dw^AtLԬH_&FLuC1JlxG{A.$JhUAh7FȪ+@Uw8O(9pp2Հ.$(h ]whY5s'5zZ%t}IZTmL +1Z7y"DW{8K7/(9YYTʡP+_ZL{ty*>R?_z% nw]Q3`%+@YGK= Oԍ5rdrKn04 IӼb1+KO,ǧ|Cs{TUS5P?xAZ \yE)( w\1j(HyNH2oW+U1Bq=8jiq`:8K31vY*LNkAAV]#zר;%*J`#tk=nx{і~lW@ 3Ap#k>;skREO" 'l}+TW- ՠE\C2#M*6mJ_O[Tj{cZ*|e"{?Iec&Aϥ8Rv.p:y0SO6+,ºjT*.-wU_IG Sjp }]tJXʹT#V=h+K$f>Cq\YwnJlZMi߆MtT?$A ߞy,OC-zXk"+6?n[iR3dmOBOS _ѝ9Be ふį$ݓ(=~buS %Q8MJpHkOXX* W*itކ5]p]w ݆PV>DWΧ qtM3&JF>DnZEwW :W-nRRAFd j \m̐A)UE4rB"n/Hb,XQTЙÀvg35j;y.8<6IATZ`NO1dU3e愤:TN#6Y2 T`cI<9v #4L븅)&56w{]S qpoNP"B2z|SF\NXؠĴ ĭ ">'Q~#zɠ@Wcti; \BUӽjՌVZ3BCWz:WR1\JKyt%;tFl'QdsPlU@EP"lAY0De~BWOsa5Ai;qzef)<ۮ"Ip?JAКqe^n^WH8兯,*ehA% nQ'fJQ~5h4:Bgt1GVZ2\tU h: IvJ;z媜k5ߛ RXHj$LГ/:iI=9Cm4Ȅ(2H'wƎi/18l{p٬6Z+{ :e.~Π;gp\e29ʖȊ~ƸP 4Nݯms7#k!6KO\V% s[+5X1lzɆ!ԡ*zJT[JmvưL)kx ~9*A]KqPvf&z^bQ}Uoaʍd:%lWVp츺ky>(Au}QL"ѕ|B>]YsE?𥝯۸! Яx(UiAѕ 4 +TzƔ>mw5k2nUTE5`FD'LIDLX$uZR ^ʅjSK&wsT k< &/r1⸚;k$Hl~ (e?gƸˍ q+4:9my=?ËF?"xݍė+Q+C5 @U{G:h1 R0KńQ+z -]fܠn= t1A%|;Jѕb__@uʸ"e-`15Na6gO Ƶm:V02sø!NA5;!E`y_ :qM G׎>o*(+V Y]Vuj¦ i/F1kMEK?U2c~BܑSkѰ}d2 'Zz5󭒅o eȄ+cmR&2giҁ$LMWܹzT Zjb˞YKYtt⬸cF+vcٻ˓0օ (R+>ji%"Ei6g20%SVgi1&$Ab)jJ5Qv2j2Ȥꠛ?qYXg4dxBLW#ku|L?TJ<|Rx˸6?sz:U@xj|eu1fjkUUB mU^_iNkDZ]jQFSB!T1l[h͋4EH8ZAu;G4L\fn+1~5ih ]k>V~-$Px4ů\ x7_5u@f7Up&[FA|^W(n¬3sCa]R>VYV&6P^p1`30\| `ĥR\m+#so\2KXbk`nL,5D@5mEuֲBܕ[ƥIq|ʃdʒab;-Rc,̃WeoF|5~,Nja @EqLY-; f ]!C]~EMgtD3aCdi>r.֝%fUUЂe;{ڛ09#7ѾNQXe>p\7 \V+70(UW8ql$g ! Pi} t[7#H*/U~8(W4TDg.1)_ 7eDO%%砂ɲ,iivuN+!I[.,D4 ;6h)* -2/{#dSJHh>;kߖϲW*FvU8[Le$ߑFY ]K7a{Fq`3_I+z%o~i F|)i:úK b%LTE"-{5P/ay}-3ךqu*ZfX͵UŹ>0 ?9fչgfKв`D=(KTnw;\p9uuC(_M*$6)E1U T#QUPD@Q"+< 1a9}M"5zƛTʺR3tr?} {C-{#+F(gTLWaAZ띣y %}KdB%c&3ִNǗy8,=.JJvv 7=vXz vt![lG" !XTH,*&#W, 6;)7JaE:؃/y_8m -8~/ 5"CD=9~Ca;Ha.x;GqhE-т}h(4@ "kXC,܈F^gH MQFX栒člN1%԰⸙*0yY+(k,EqÉL,ł#LB8 +pS\Ik+ FmXw-8 GLQFVm|f}{n}D\) p"X69ƜEMfYbÝ.:'73-P'þcv@ȔSE\qx5iCخRHJ"%( 43Sp8mɨvAS.>^P:ĘҚ7yTvrJιU{2^ hYWݒR_^Gwb^bbYWMڰ_HBtbx=V3CaX~(_%(4 mvMWZf/X(Δ'nHjgQcLUG; "_=3"GĘ%BSir7:LostyY(ao-CVِUȢ 7$M(z-i3@LcL%ГP^FZe\\})B\Y KUp%Lcw2&{P )@\=pLVcp$TK?Ji϶dDGG2E I!֊Zal-jbӗWkBt+{0%Z='A㬬%># !;6=(ݴlZEYg ءC;QI`rޕI2u(L}}UW*qT$]z#B2ժz5y_ ]*U ՛1TAS6ٌd`^XOw>2)H(c{i H/i:=l+W>3ϝ\T0EgUn[~%Кj~ кzEULj*/Ie- &:P}j 쎸 _1ou}h(d2DED]ft=JNP+{}f0oh!]9œ`A}BY]KpR`uM.hUUgapz+7C*{:ý4J DAZA51JXgSDi*"r%X_93cf خic`HLP 2E@c.:#[k!MRu+jцu"W<T!J. o-$>؜#`9%_1J('$SoNοGhg,wq+)*#Ez@&3]@z#AKvthUO=WmM Ү0J*޼{M}T8W)b5<J}%tvk5G^-f嚠EUZ^`\qIB}.~Ukh:9; -#1(ViЁgL2/Wt:YUľ']к#,trOVߗZ~{&XW=$׈(uhQVqfheE=Fp+[`@Ϧ`TzZ0#&~`C"Sy%ZAN'Q@+n!2}1)NE^`B;Q_jdau!~Q X q͔9Sڙ!+[LIaBBKpue4|0BGmìgfERk~ZJn3*Xrj ҒClqh%9lj*db-o24_P(ahES%^5P]:΢\}R5?Ì&#JL~ֶRVLp *bWTR>VPt~䱼MÿToQKVܑn3fmcnh-(|f)T=aw쯿H(hQ ] Zo-U}5Ѵw5cQ6i 0,ZkJ>Yeǩw Bò&Ic8k=EJhW@e`ʋ\QZh\&a*_q9$/}%QE9W^ /]`-1K]ŝ.ٝR8LPmRr0lrJǸ+L*@ =6dZEt}͹%:&('+y@tHu(d\P\B$Zw\) %V@bm홧͉"%v=ecދ%}+5AD0_I(dP+ 6iZo~UY9C[@Y6`b)iVYU5ʂ%PY˻>Z,[cŐ/俤_!FNq16Y2 ?_M>s ЄCGhzCj]dK?pCdAF'գSAE J޽j.=;&ejq5wQbKyJ~_d!M31yx uϺvZWˀT Z [bavGF91_2̦pHYj# DrV_eWK$}8Z`3*AFYb1e'գiHHh#bZ:dsˤ}WAԻJ(Ftqy, p} Z0'jG _IJȢd\2FpS}$n@L3 ^\lw~ĕjW!]3?Vpb-nbyug0:35Lgvqa/uNt첛*3ф oǨMPCyם{a;L,}{~P-,ګqbȢ!,kG*,*`H ںl0]tŋ\Vӈ,/ -Bɒ @ ?CkuaԙѸEf+tPE/&$(^:kUdrK}%"'4k8T>WYH'YA[g|j9/΁T 1C~=|\ 0au6Z ǯv6ᐲuf.Z}XZFAŪrkmWO =?L\rFVxG9@tJo4f6MI;YU63m^UΊ'nPo\ognYZQkt0gU[JػYdzCᇽ~-bZCm  3U&Eo8$1lEњgjjgE4*VJ|s,ʠ>D<(49¢:G\MJsp%cDMWq-0.1 and argument0<0.1 return true else return falsecalculateCollisionBounds/* Calculates the exact, non-relative collision bounds. return lb,tb,rb,bb */ //left bounds, top bounds, ect. lb=x+collisionBoundsOffsetLeftX tb=y+collisionBoundsOffsetTopY rb=x+collisionBoundsOffsetRightX bb=y+collisionBoundsOffsetBottomYsetCollisionBounds/* Sets the collision bounds which are relative to the origin of the sprites. 0:left x 1:top y 2:right x 3:bottom y */ collisionBoundsOffsetLeftX=argument0 collisionBoundsOffsetTopY=argument1 collisionBoundsOffsetRightX=argument2 collisionBoundsOffsetBottomY=argument3isCollisionSolid/* Returns whether the object invoking this script is colliding with a solid. return 0:no collision 1:collision */ calculateCollisionBounds() return collision_rectangle(lb,tb,rb-1,bb-1,oSolid,1,1)>0 makeActive/* Makes the object "active." An "active" object is one that has the variables xVel, yVel, xAcc, and yAcc. */ xVel=0 yVel=0 xAcc=0 yAcc=0characterCreateEvent./* This script should be placed in the "Create Event" of the platform character. It sets the variables needed for the platform character. You can edit the "user variables" if you don't want to use the default values. This script sets the collision bounds using this code: setCollisionBounds(-5,-7,5,8) You can modify the arguments to make a collsion bounds that fits your own sprites. If you are just going to use the default Mario sprites, there is no reason to edit the arguments. */ //constant states that the platform character may be (don't edit) STANDING=10 RUNNING=11 DUCKING=12 LOOKING_UP=13 CLIMBING=14 JUMPING=15 FALLING=16 DYING=17 LEFT=18 RIGHT=19 ON_GROUND=20 IN_AIR=21 ON_LADDER=22 //the keys that the platform character will use (don't edit) kLeft=0 kRight=0 kUp=0 kDown=0 kJump=0 kJumpPressed=0 kRun=0 //user variables (you can edit these) state=FALLING //the character state, must be one of the following: STANDING, RUNNING, DUCKING, LOOKING_UP, CLIMBING, JUMPING, or FALLING facing=RIGHT //which direction the character is facing, must be either LEFT or RIGHT runAcc=3 //the running acceleration grav=1 //the gravity initialJumpAcc=-8 //relates to how high the character will jump jumpTimeTotal=14 //how long the user must hold the jump button to get the maximum jump height climbAcc=0.8 //how fast the character will climb runAnimSpeed=0.05 //relates to the how fast the running animation should go climbAnimSpeed=0.1 //relates to how fast the climbing animation should go departLadderXVel=4 //how fast character should be moving horizontally when he leaves the ladder departLadderYVel=-4 //how fast the character should be moving vertically when he leaves the ladder maxSlope=2 //approximately how many pixels the character can climb UPWARDS per step (a value of 5 means the character can climb up a slope of 5) maxDownSlope=2 //approximately how many pixels the character can climb DOWNWARDS per step (a value of 5 means the character can climb down a slope of 5) canRun=1 //when the user presses the shift button, should the character be allowed to run? canFly=0 //whether the character can do a fly jump when running at full speed canFlyJump=0 //whether the character can do continuous fly jumps (mid-air) flyMaxJumps=5 //the maximum number of jumps the character can perform while flying frictionRunningX=0.6 //friction obtained while running frictionRunningFastX=0.7 //friction obtained while holding the shift button for some time while running frictionClimbingX=0.5 //friction obtained while climbing frictionClimbingY=0.8 //friction obtained while climbing frictionDuckingX=0.8 //friction obtained while ducking frictionFlyingX=0.7 //friction obtained while "flying" xVelLimit=15 //limits the xVel yVelLimit=10 //limits the yVel xAccLimit=9 //limits the xAcc yAccLimit=9 //limits the yAcc //sets the collision bounds to fit the default sprites (you can edit the arguments of the script) setCollisionBounds(-5,-7,5,8) //hidden variables (don't edit) statePrev=state statePrevPrev=statePrev gravityIntensity=grav //this variable describes the current force due to gravity (this variable is altered for variable jumping) jumpTime=jumpTimeTotal //current time of the jump (0=start of jump, jumpTimeTotal=end of jump) jumpButtonReleased=0 //whether the jump button was released. (Stops the user from pressing the jump button many times to get extra jumps) ladderTimer=0 //relates to whether the character can climb a ladder jumps=0 flySpeed=0 //ranges between 0 and 100. When the flySpeed is approximately 100, the character can "fly." flySpeedTimer=0 flyAccTimer=0 flyAcc2Timer=0 flyJumpsTimer=0 flyJumpWasPressed=0 //makes the object "active" (don't edit) makeActive()moveToT/* Any object that has the collision bounds set can use this script. (To set the collision bounds, call the script "setCollisionBounds.") If the object collides into a solid when moving the specified distance, the object will stop precisely at the solid. If the object collides into a "moveable solid," it will stop and push the moveable solid. This function also pushes moveable solids and allows the character to land on platforms. Special note: First the script moves the object in the x direction, then in the y direction. Once the functin is finished, one can use the xVelInteger and yVelInteger variables for more precise calculations inside of the engine. 0: x distance to move 1: y distance to move */ mtXPrev=x mtYPrev=y //since we are not using GM's hspeed and vspeed variables, we need to add in decimal support ourselves (so 0.25 will only move 1 pixel every 4 steps, for example) if(variable_local_exists("time")=0) time=0 else time+=1 //we don't want the time to grow too large if time>100000000 time=0 //change the decimal arguments to integer variables with relation to time xVelFrac=frac(abs(argument0)) yVelFrac=frac(abs(argument1)) xVelInteger=0 yVelInteger=0 if xVelFrac!=0 if round(1/xVelFrac)!=0 xVelInteger=(time mod round(1/xVelFrac)=0) if yVelFrac!=0 if round(1/yVelFrac)!=0 yVelInteger=(time mod round(1/yVelFrac)=0) xVelInteger+=floor(abs(argument0)) yVelInteger+=floor(abs(argument1)) if argument0<0 xVelInteger*=-1 if argument1<0 yVelInteger*=-1 xVelInteger=round(xVelInteger) yVelInteger=round(yVelInteger) //object is moving to the right if xVelInteger>0 for(x=x;x0 { if object_get_parent(solidId.object_index)=oMoveableSolid and object_index=oCharacter //if you want other objects to be able to push moveable solids, change this { //we must move the moveable solid, unless there is another solid (moveable or non-moveable) in it's way with solidId { if place_meeting(x+1,y,oSolid) //there will be a collision! { break } else { x+=1 //we're free to move the moveable solid } } } else break } } //object is moving to the left if xVelInteger<0 for(x=x;x>mtXPrev+xVelInteger;x-=1) { solidId=getIdCollisionLeft(1) //if there is a collision with a solid if solidId>0 { if object_get_parent(solidId.object_index)=oMoveableSolid and object_index=oCharacter { //we must move the moveable solid, unless there is another solid (moveable or non-moveable) in it's way with solidId { if place_meeting(x-1,y,oSolid) //there will be a collision! { break } else { x-=1 //we're free to move the moveable solid } } } else break } } //object is moving down if yVelInteger>0 for(y=y;ymtYPrev+yVelInteger;y-=1) { if isCollisionTop(1) break }isCollisionLeftI/* An object can only use this script after calling "setCollisionBounds." 0: Number of pixels left of the collision rectangle to check for a collision with a solid object. */ calculateCollisionBounds() if collision_line(round(lb-argument0),round(tb),round(lb-argument0),round(bb-1),oSolid,1,1)>0 { return 1 } return 0isCollisionRightN/* An object can only use this script after calling "setCollisionBounds." 0: Number of pixels right of the collision rectangle to check for a collision with a solid object. */ calculateCollisionBounds() if collision_line(round(rb+argument0-1),round(tb),round(rb+argument0-1),round(bb-1),oSolid,1,1)>0 { return 1 } return 0isCollisionTopA/* An object can only use this script after calling "setCollisionBounds." 0: Number of pixels above the collision rectangle to check for a collision with a solid object. */ calculateCollisionBounds() if collision_line(round(lb),round(tb-argument0),round(rb-1),round(tb-argument0),oSolid,1,1)>0 return 1 return 0isCollisionBottomE/* An object can only use this script after calling "setCollisionBounds." 0: Number of pixels below the collision rectangle to check for a collision with a solid object. */ calculateCollisionBounds() if collision_line(round(lb),round(bb+argument0-1),round(rb-1),round(bb+argument0-1),oSolid,1,1)>0 return 1 return 0platformCharacterIs>/* Returns whether a GENERAL trait about a character is true. Only the platform character should run this script. argument0 can be one of the following: ON_GROUND IN_AIR ON_LADDER Example of usage: Event: oCharacter collides with oGoomba Action: if platformCharacterIs(ON_GROUND) instance_destroy() */ if (argument0=ON_GROUND) and (state=RUNNING or state=STANDING or state=DUCKING or state=LOOKING_UP) return 1 if (argument0=IN_AIR) and (state=JUMPING or state=FALLING) return 1 if (argument0=ON_LADDER) and (state=CLIMBING) return 1 return 0 isCollisionLadder/* Returns whether the object invoking this script is colliding with a ladder. return 0:no collision 1:collision */ calculateCollisionBounds() return collision_rectangle(lb,tb,rb-1,bb-1,oLadder,1,1)>0isCollisionRectangles/* Returns whether there is a collision with two rectangles. Note that the rectangles cannot have a negative width or height. 0: x1 (of the first rectangle) 1: y1 2: x2 3: y2 4: x1 (of the second rectangle) 5: y1 6: x2 7: y2 return whether there was a collision */ w1=argument2-argument0 h1=argument3-argument1 w2=argument6-argument4 h2=argument7-argument5 if(w2<=0 or h2<=0 or w1<=0 or h1<=0) return 0 w2+=argument4 h2+=argument5 w1+=argument0 h1+=argument1 return (w2argument0) and (h2argument1) and (w1argument4) and (h1argument5)isCollisionCharacterLeft/* 0: Number of pixels left of the collision rectangle to check for a collision with the character. */ //the solid must be hitting the character's right side, so... oCharacter.tempId=id with oCharacter { calculateCollisionBounds() //if there is a collision with tempId on the character's right side if collision_line(round(rb+argument0-1),round(tb),round(rb+argument0-1),round(bb-1),tempId,1,1)>0 return 1 } return 0isCollisionCharacterRight/* 0: Number of pixels right of the collision rectangle to check for a collision with the character. */ //the solid must be hitting the character's left side, so... oCharacter.tempId=id with oCharacter { calculateCollisionBounds() //if there is a collision with tempId on the character's left side if collision_line(round(lb-argument0),round(tb),round(lb-argument0),round(bb-1),tempId,1,1)>0 return 1 } return 0isCollisionCharacterTop/* 0: Number of pixels above the collision rectangle to check for a collision with the character. */ //the solid must be hitting the character's bottom side, so... oCharacter.tempId=id with oCharacter { calculateCollisionBounds() //if there is a collision with tempId on the character's bottom side if collision_line(round(lb),round(bb+argument0-1),round(rb-1),round(bb+argument0-1),tempId,1,1)>0 return 1 } return 0 isCollisionCharacterBottom/* 0: Number of pixels to the bottom of the collision rectangle to check for a collision with the character. */ //the solid must be hitting the character's top side, so... oCharacter.tempId=id with oCharacter { calculateCollisionBounds() //if there is a collision with tempId on the character's top side if collision_line(round(lb),round(tb-argument0),round(rb-1),round(tb-argument0),tempId,1,1)>0 return 1 } return 0 isCollisionPlatformBottomQ/* An object can only use this script after calling "setCollisionBounds." 0: Number of pixels below the collision rectangle to check for a collision with a platform object. */ calculateCollisionBounds() if collision_line(round(lb),round(bb+argument0-1),round(rb-1),round(bb+argument0-1),oPlatform,1,1)>0 { return 1 } return 0isCollisionPlatform/* Returns whether the object invoking this script is colliding with a jump-through platform. return 0:no collision 1:collision */ calculateCollisionBounds() return collision_rectangle(lb,tb,rb-1,bb-1,oPlatform,1,1)>0characterStepEventE/* This script should be placed in the step event for the platform character. It updates the keys used by the character, moves all of the solids, moves the character, sets the sprite index, and sets the animation speed for the sprite. */ //updates the keys //key left kLeftReleased=0 if kLeft { kLeft=keyboard_check(vk_left) kLeftPushedSteps+=1 kLeftPressed=0 if kLeft=0 kLeftReleased=1 } else { kLeft=keyboard_check(vk_left) if kLeft kLeftPressed=1 kLeftPushedSteps=0 } //key right kRightReleased=0 if kRight { kRight=keyboard_check(vk_right) kRightPushedSteps+=1 kRightPressed=0 if kRight=0 kRightReleased=1 } else { kRight=keyboard_check(vk_right) if kRight kRightPressed=1 kRightPushedSteps=0 } //key up kUp=keyboard_check(vk_up) //key down kDown=keyboard_check(vk_down) //key "run" if canRun kRun=keyboard_check(vk_shift) else kRun=0 //key "jump" if kJump { kJump=keyboard_check(vk_control) kJumpPressed=0 } else { kJump=keyboard_check(vk_control) if kJump kJumpPressed=1 } //the first thing to do is to move all of the moving solids //necessary to reset the "viscid" movement from a moving solid viscidMovementOk=1 //moves all of the solids so that none of them collide with the character with oMovingSolid { //applies the acceleration xVel+=xAcc yVel+=yAcc //approximates the "active" variables if approximatelyZero(xVel) xVel=0 if approximatelyZero(yVel) yVel=0 if approximatelyZero(xAcc) xAcc=0 if approximatelyZero(yAcc) yAcc=0 //moves the solid, pushes the character, carries the character, and stops if the character will be crushed by another solid mstXPrev=x mstYPrev=y //since we are not using GM's hspeed and vspeed variables, we need to add in decimal support ourselves (so 0.25 will only move 1 pixel every 4 steps, for example) if(variable_local_exists("time")=0) time=0 else time+=1 //we don't want the time to grow too large if time>100000000 time=0 //change the decimal arguments to integer variables with relation to time xVelFrac=frac(abs(xVel)) yVelFrac=frac(abs(yVel)) xVelInteger=0 yVelInteger=0 if xVelFrac!=0 if round(1/xVelFrac)!=0 xVelInteger=(time mod round(1/xVelFrac)=0) if yVelFrac!=0 if round(1/yVelFrac)!=0 yVelInteger=(time mod round(1/yVelFrac)=0) xVelInteger+=floor(abs(xVel)) yVelInteger+=floor(abs(yVel)) if xVel<0 xVelInteger*=-1 if yVel<0 yVelInteger*=-1 xVelInteger=round(xVelInteger) yVelInteger=round(yVelInteger) //calculate the collision bounds of the character -- we'll need it later with oCharacter calculateCollisionBounds() if isCollisionRectangle(x-abs(xVelInteger)-sprite_xoffset-2,y-abs(yVelInteger)-sprite_yoffset-2,x+sprite_width+abs(xVelInteger)-sprite_xoffset+2,y+sprite_height+abs(yVelInteger)-sprite_yoffset+2,oCharacter.lb,oCharacter.tb,oCharacter.rb,oCharacter.bb) { //solid is moving to the right if xVelInteger>0 { for(x=x;xmstXPrev+xVelInteger;x-=1) { if viscidTop and isCollisionCharacterTop(1) and (oCharacter.viscidMovementOk=1 or oCharacter.viscidMovementOk=2) { with oCharacter if isCollisionLeft(1)=0 { x-=1 viscidMovementOk=2 } } else if isCollisionCharacterLeft(1) { with oCharacter collision=isCollisionLeft(1) if oCharacter.collision break oCharacter.x-=1 } } } //solid is moving down if yVelInteger>0 { for(y=y;ymstYPrev+yVelInteger;y-=1) { //push the character up regardless of the viscid properties of the solid top if isCollisionCharacterTop(1) { with oCharacter collision=isCollisionTop(1) if oCharacter.collision break oCharacter.y-=1 } if isCollisionCharacterBottom(1) { //variable jumping causes the character to get stuck to the bottom of a moving solid //that is moving faster than 1 pixel per step upwards, so we need this code if oCharacter.jumpTime0 ladderTimer-=1 } //allows the character to run left and right if state!=DUCKING and state!=LOOKING_UP and state!=CLIMBING { if kLeftReleased and approximatelyZero(xVel) xAcc-=0.5 if kRightReleased and approximatelyZero(xVel) xAcc+=0.5 if kLeft { if (kLeftPushedSteps>2 or isCollisionMoveableSolidRight(1)) and (facing=LEFT or approximatelyZero(xVel)) xAcc-=runAcc facing=LEFT } if kRight { if (kRightPushedSteps>2 or isCollisionMoveableSolidLeft(1)) and (facing=RIGHT or approximatelyZero(xVel)) xAcc+=runAcc facing=RIGHT } } if state=CLIMBING and isCollisionLadder()=0 { state=FALLING } if state=CLIMBING { if kLeft { xAcc-=climbAcc facing=LEFT } if kRight { xAcc+=climbAcc facing=RIGHT } if kUp yAcc-=climbAcc if kDown yAcc+=climbAcc } if platformCharacterIs(IN_AIR) { yAcc+=gravityIntensity } if (isCollisionBottom(1) or isCollisionPlatformBottom(1) and isCollisionPlatform()=0) and platformCharacterIs(IN_AIR) and yVel>=0 { yVel=0 yAcc=0 //player has just landed state=RUNNING jumps=0 } if isCollisionBottom(1)=0 and (isCollisionPlatformBottom(1)=0 or isCollisionPlatform()) and platformCharacterIs(ON_GROUND) { state=FALLING yAcc+=grav } if isCollisionTop(1) and state=JUMPING { yVel=abs(yVel*0.3) } if (isCollisionLeft(1) and facing=LEFT) or (isCollisionRight(1) and facing=RIGHT) { xVel=0 } //player may jump if platformCharacterIs(ON_GROUND) and kJump { //give an initial HUGE jump if control is pressed and flySpeed is big and canFlyJump and the character is running if kJumpPressed and flySpeed>=95 and jumps=0 and canFlyJump { jumps=1 flyAccTimer=5 flyDir=facing //either LEFT or RIGHT yAcc+=initialJumpAcc*0.7 if canFly { flyInitialHeight=y flyJumpsTimer=10 flyJumpWasPressed=-1 } } else { yAcc+=initialJumpAcc //the "normal" jump xAcc+=xVel/2 } //the "state" gets changed to JUMPING later on in the code state=FALLING //"variable jumping" states jumpButtonReleased=0 jumpTime=0 } if jumpTime0 and platformCharacterIs(IN_AIR) { state=FALLING } if (kUp or kDown) and isCollisionLadder() and ladderTimer=0 { //nullifies the velocity xVel=0 yVel=0 //nullifies the acceleration xAcc=0 yAcc=0 state=CLIMBING } if isCollisionLadder() and state=CLIMBING and kJumpPressed { if facing=LEFT xVel=-departLadderXVel else xVel=departLadderXVel yAcc+=departLadderYVel state=JUMPING jumpButtonReleased=0 jumpTime=0 } if kRun and (kLeft or kRight) { flySpeed+=2 if state!=DUCKING and state!=LOOKING_UP and state!=CLIMBING { if kLeft { if flySpeed<70 xAcc-=runAcc*flySpeed/70 //you can change the value here else xAcc-=runAcc //you can change the value here facing=LEFT } if kRight { if flySpeed<70 xAcc+=runAcc*flySpeed/70 //you can change the value here else xAcc+=runAcc //you can change the value here facing=RIGHT } } } else { flySpeed-=3 } if kJump flySpeed-=1 if (kLeft and xVel>0) or (kRight and xVel<0) { flySpeed-=10 flySpeedTimer=0 } //if the character hits a wall if ( kLeft and isCollisionLeft(1) ) or ( kRight and isCollisionRight(1) ) { flySpeed-=20 flySpeedTimer=0 } //set flySpeed to 100 if the flySpeedTimer is still ticking if flySpeedTimer>0 { flySpeedTimer-=1 flySpeed=100 } if flyJumpsTimer>0 { if flyJumpWasPressed=-1 flyJumpWasPressed=0 else if kJumpPressed flyJumpWasPressed=1 flySpeed=100 flyJumpsTimer-=1 if jumps>1 { gravityIntensity=0.5 } } else if canFly and isCollisionBottom(1)=0 and isCollisionPlatformBottom(1)=0 and isCollisionPlatform()=0 and jumps>0 { flySpeed=100 if jumps>1 gravityIntensity=0.5 if (kJumpPressed or flyJumpWasPressed) and flySpeed>80 and jumps0 { flyAccTimer-=1 yAcc-=1 } if flyAcc2Timer>0 { flyAcc2Timer-=1 if yVel>0 yVel=0 if yflyInitialHeight yAcc-=5 if facing=LEFT { xAcc-=2 } else { xAcc+=2 } } //apply the limits of flySpeed if flySpeed>100 { flySpeed=100 flySpeedTimer=60 } else if flySpeed<0 flySpeed=0 //calculates the horizontal and vertical friction, depending on the state of the charater if state=CLIMBING { xFric=frictionClimbingX yFric=frictionClimbingY } else { if state=DUCKING { if xVel<2 and xVel>-2 xFric=0.2 else xFric=frictionDuckingX } else { //decrease the friction when the character is "flying" if canFly and jumps>1 xFric=frictionFlyingX else if flySpeed>50 xFric=frictionRunningFastX else xFric=frictionRunningX } yFric=1 } //limits the acceleration if it is too extreme if xAcc>xAccLimit xAcc=xAccLimit else if xAcc<-1*xAccLimit xAcc=-1*xAccLimit if yAcc>yAccLimit yAcc=yAccLimit else if yAcc<-1*yAccLimit yAcc=-1*yAccLimit //applies the acceleration xVel+=xAcc yVel+=yAcc //nullifies the acceleration xAcc=0 yAcc=0 //applies the friction to the velocity, now that the velocity has been calculated xVel*=xFric yVel*=yFric //apply the limits since the velocity may be too extreme if xVel>xVelLimit xVel=xVelLimit else if xVel<-1*xVelLimit xVel=-1*xVelLimit if yVel>yVelLimit yVel=yVelLimit else if yVel<-1*yVelLimit yVel=-1*yVelLimit //approximates the "active" variables if approximatelyZero(xVel) xVel=0 if approximatelyZero(yVel) yVel=0 if approximatelyZero(xAcc) xAcc=0 if approximatelyZero(yAcc) yAcc=0 //prepares the character to move up a hill //we need to use the "slopeYPrev" variable later to know the "true" y previous value //keep this condition the same if maxSlope*abs(xVel)>0 and platformCharacterIs(ON_GROUND) { slopeYPrev=y for(y=y;y>=slopeYPrev-maxSlope*abs(xVel);y-=1) if isCollisionTop(1) break slopeChangeInY=slopeYPrev-y } else slopeChangeInY=0 //moves the character, and balances out the effects caused by other processes //keep this condition the same if maxSlope*abs(xVel)>0 and platformCharacterIs(ON_GROUND) { //we need to check if we should dampen out the speed as the character runs on upward slopes xPrev=x yPrev=slopeYPrev //we don't want to use y, because y is too high yPrevHigh=y //we'll use the higher previous variable later moveTo(xVel,yVel+slopeChangeInY) dist=point_distance(xPrev,yPrev,x,y) //overall distance that has been traveled //we should have only ran at xVel if dist>abs(xVelInteger) { //show_message(string(dist)+ " "+string(abs(xVelInteger))) excess=dist-abs(xVelInteger) if(xVelInteger<0) excess*=-1 //move back since the character moved too far x=xPrev y=yPrevHigh //we need the character to be high so the character can move down //this time we'll move the correct distance, but we need to shorten out the xVel a little //these lines can be changed for different types of slowing down when running up hills ratio=abs(xVelInteger)/dist*0.9 //can be changed moveTo( round(xVelInteger*ratio),round(yVelInteger*ratio+slopeChangeInY) ) } } else { //we simply move xVel and yVel while in the air or on a ladder moveTo(xVel,yVel) } //move the character downhill if possible //we need to multiply maxDownSlope by the absolute value of xVel since the character normally runs at an xVel larger than 1 if isCollisionBottom(1)=0 and maxDownSlope*abs(xVelInteger)>0 and platformCharacterIs(ON_GROUND) { //the character is floating just above the slope, so move the character down upYPrev=y for(y=y;y<=upYPrev+maxDownSlope*abs(xVelInteger);y+=1) if isCollisionBottom(1) //we hit a solid below { upYPrev=y //I know that this doesn't seem to make sense, because of the name of the variable, but it all works out correctly after we break out of this loop break } y=upYPrev } //figures out what the sprite index of the character should be if facing=LEFT { if state=STANDING sprite_index=sStandLeft if state=RUNNING sprite_index=sRunLeft if state=DUCKING sprite_index=sDuckLeft if state=LOOKING_UP sprite_index=sLookLeft if state=CLIMBING sprite_index=sClimbUp if state=JUMPING sprite_index=sJumpLeft if state=FALLING and statePrev=FALLING and statePrevPrev=FALLING sprite_index=sFallLeft if flySpeed>90 and jumps>0 and jumps90 and jumps>0 and jumps1 image_speed=1isCollisionMovingSolidBottomK/* An object can only use this script after calling "setCollisionBounds." 0: Number of pixels below the collision rectangle to check for a collision with a moving solid. */ calculateCollisionBounds() if collision_line(round(lb),round(bb+argument0-1),round(rb-1),round(bb+argument0-1),oMovingSolid,1,1)>0 return 1 return 0getIdCollisionLeftL/* An object can only use this script after calling "setCollisionBounds." 0: Number of pixels left of the collision rectangle to check for a collision with a solid object. returns the ID of the solid */ calculateCollisionBounds() return collision_line(round(lb-argument0),round(tb),round(lb-argument0),round(bb-1),oSolid,1,1)getIdCollisionRightQ/* An object can only use this script after calling "setCollisionBounds." 0: Number of pixels right of the collision rectangle to check for a collision with a solid object. returns the ID of the solid */ calculateCollisionBounds() return collision_line(round(rb+argument0-1),round(tb),round(rb+argument0-1),round(bb-1),oSolid,1,1)isCollisionMoveableSolidLeftZ/* An object can only use this script after calling "setCollisionBounds." 0: Number of pixels left of the collision rectangle to check for a collision with a moveable solid object. */ calculateCollisionBounds() if collision_line(round(lb-argument0),round(tb),round(lb-argument0),round(bb-1),oMoveableSolid,1,1)>0 { return 1 } return 0isCollisionMoveableSolidRight_/* An object can only use this script after calling "setCollisionBounds." 0: Number of pixels right of the collision rectangle to check for a collision with a moveable solid object. */ calculateCollisionBounds() if collision_line(round(rb+argument0-1),round(tb),round(rb+argument0-1),round(bb-1),oMoveableSolid,1,1)>0 { return 1 } return 0font0Arial oSolid  oMovingSolid~  oPlatform oLadder oMoveableSolid~ [yVel=00000000 oCharacter Yaction_execute_script 1400000000Yaction_execute_script 1830000000[$if y>room_height room_restart() 0000000Yaction_execute_script 900000000 oSolidBluem~ oPlatformGreen  oLadderOrange~ oMoveableSolidBrown oMovingSolidPurple [9viscidTop=1 makeActive() xVel=2 yVel=-1 alarm[0]=60 0000000[!xVel*=-1 yVel*=-1 alarm[0]=60 0000000oGoomba [amakeActive() setCollisionBounds(2,0,sprite_width-2,sprite_height-1) xVel=2.5 image_speed=0.1 0000000[yVel+=0.2 if isCollisionBottom(1) yVel=0 if isCollisionLeft(1) { xVel=2.5 sprite_index=sGoombaRight } if isCollisionRight(1) { xVel=-2.5 sprite_index=sGoombaLeft } moveTo(xVel,yVel) 0000000[uif other.yVel>0 and other.y