XZ h_ՄNoh X ( @ (//(  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 $%&&'%($!)* ##  !"#     ??ddPA@ GRAVITY0.2TERMINAL_VELOCITY10LEFT180RIGHT0OBSTACLE-10000OPEN_AIR10000SPRITE_STANDING0SPRITE_RUNNING1SPRITE_FALLING2SPRITE_TRANS_FALLING3SPRITE_JUMPING4spr_block_mask@@?? :xɱ @A0R%$wɫ\G5* spr_char_mask0,/++ jxΡ @@Ҿ*4ɿˮ2v uKt)wyH@R?09%OL .SӔYspr_block_slope1_mask@A?@ x1 @Dx `ie?v i Mv&aaB O |@' 1lK ;5_ӷ/+]oSK$I$I$Ivdispr_block_slope2_mask@A?@ x= @x `ieiSYQJ6Omczar˹5#?$~I'~g~4dUeվЍdYvK*}rI$I$I$Iy%ispr_block_slope3_mask@A?@ xϱ @DQ%9=ҨExv4NiީC{.6/}N @8p 'N @8p 'N @8p l8o[yPxS:\ٺ~m0*~j*G, ^c_'E=^$E=[$؛E=X$kE=U$;E=R$ E=O$D=L$ثD=I${D=F$KD=C#<[ spr_char_run*7)65 mx1r0EI#x&K&UO&3K#Gp()9JV#0KX#< ݯ&W.׋\r=eG}6i.g(92oNo|| i -*_3S/ku</?!YHGU<_זK k (<+_Vdp8:^hVR2`,}ܙ)VT&i@+~ן.zYS |npljH%~wՓ* tF懪/P~@¼8_I8_m;Lhqg,'' |+u8// G\L IB^r܄ϓ\8WA(H%/}4[t-#S@ fȱh'0y__ם7ߏF,-c^_\UaπSm/EaA.?XK,Az%iOV|=_N7ĞSՆ~}FT!H`Q(ŏ Y!pL9cBB>P+~5\R`4.hpЏj3ZJE`>_M^BGJ0\䟮ta4 C;(MIP⍀1_N^aviZ/ojƶm1b1 ݩWCoGEu@L>B!1!&E(|Yڡ$=7 ՝K;ȈZOHl%'r܎OK!*D,SSe.{UdOˈ bu|%O2/]iq7?:`\ dx=n@I,IRJTi"t#tIc"2GɃ/ ,]fMc40Xg]kޗU[ߟ?N0<\flXxTşDކa6g] n A2>6mf(8 &ɗ KXŧ ` K$ 8$\/@2 raш\ΟNYE, H25*83`/ITA>& J=*\~Zp B/ &֘p]Z Vŀ{;'O?_#Up"͂8i &vi=҈lg+ҶFw)a"pϟ !%_!vDQOQ3TZЮ 1R%-w$t1_w^a(?.J>y@uui*7]ɏ,XΚx2UXhZhA$q`|>$jaEч%X wJy-M%aJ $t篙ᢕ G,U+ !A!I,|| @>j:搠M@W-;T(Z%0΂Le! aPaY?EV(p9w."hl| %6qR ՈM")9 MG:$َ(2𑂈3EL%t KWP X4.1󦇢L᥈qic gX Ic ;@wT،&sSwgꉄ|?/tPoG [V!N)``ߊ%̟'-_VWs!‘~y_W?#f qx1N0EC# PFTTS QnGr˔#P0N6b-'&Qx٧ϛʶ9j9x㪺w?hMswƘ3Smo-bS|g%/A3yA6jN wT _:!V3BT UCcMKuO`SjJHOp " QZ_G^1攄|Z߶IFX?!CKAR!Zh DߏJQK |G$3BU!>KsR"X0;[U0۳!) "{ :4ʌu|+A|i[ϭv/[_E(p&lKz-o .gf 53 L ;3).ks;Opgz omVI>`B벍C\na`UW׻M^X{  fWznڶ:vLիK. .#05 ]ջyȪ+7 :<|TdϟBhu|U{~(FV?w`GL/ i x=n0 GХѩSwRcF!cF=FЩQ2I4%˿ F{(}f3]]tu}ei?Nz,iFc\j?M0)sa*>OC&'i $؟UԱXؙiX.C/|.YBGJX`ULIca!I{nJ%0Ic%,Qe v_#$޾"m;x-$DFBîïp*/V?/;,CnGɟ _˯Cِ uc!01z߂Hْwh"xX:?.G,D|۔0,.~ ȼ.N4xڀ/-|3q:Ӏm,A朎w1AI# q.]dM oMǁfa /Y7  ;ՑMKE4T>I?/%i.rXxҵ@؋i|R@K9IýP ̟9›d/a0K ZWw7\ x=R0M#dCE= 3.s)Ur @(9%OzZ[9_}oW:ϯ_kl؞TwQ3_p<] o]u] |&?3|x>d>l̃MS6yM?_ .%-SB:`þ q¶e"A{ "ooPU'*(Gg\ |#|"|Uz'3^="ov1J'(c,O3DPl^!?< &  guK O & 1;zY(DLMB~,Mbg頌r0$ 잃}|AƧ䊌tp fA i)ex$ |?]!@sVOz WY7.kN|){y!%]_ |h`رu]@ |4S  8rW s&|:߫8 F ~?'1#B'S>da=p%0#7Q NE4dTci.GHH??ݾW_+J_l{ lx=R0M#dCE= 3)9Bʔ.9Gb|V<+rldٞh#|~,p[b+ժj+vo۪ѱ3;>r|߅3 ʒS 1Ññan?L¯ g(^%Yv3 xוi\|6 2"4@S'["P\ b^ B^PοX8 c| TiG,Tn;~K gcD~ !(~p,k5;O\*7Ett!GZ"h)7VCpE˂)Aez~$Xs+8nUxe"N7h^ƹ^E]CDB:߿[: |k1P s7 S6}W&h6WA_$'qȿ˓3U@ ޕEsJ mg zAaR!:QW:v, >~yy!KO;OV1uwH8Vs¿/"] 8x1R0EE#d& z*f(S)SQ(} Jʏ,+2Z)Ѭ#jw%ތIVy3su4}~3ǮVL^>+?^pyU~||I"l?Ac" i|J< u*?\|U`E_y>ppy`}T弄4%g ?*TvZ.(]~ ' [y.߇%=q%/=C_d]*ƻ#. E){(^8WnJ@ i7 |"?T@eHJpK]!qGPy(~Ǧw z*΃!z/fy\%U>p r4G;%H~#{'+>\ '@'!ȟJP<x?4!^ ?UQ˯`tOp3WOD#%x o%tI n܅)XBgI%,%E./ -Ba~P”/ѝQ9 cͮvMO|"%xs/H OH~YI,T@| YeS$߬U|v<+!/$A)!KH+l9,y\OA> ?<eg ˧.g,x)h*_ >Tš-H͂eZŽJyۑ×PT9lE*/> IB}(6ڪ߽D "_8wyd  99o?: ex=n0#&%J*Sa-)sa)3ɘ3(k c׽dzrqgyy]\lf$)M?|i#/_?ML/r)A _lWCE_ |QŐmG2b"!v1;qcZ0JHumNt ,K{E4K]B߁$CMubepUBѿ8;3cQDp`0!OBmw qpoy=%p$HDb|_'Zo?$$!^`)n~mL-gQ,8!p#ThI9.ê>®Bv$n}BoDZ$4t`Vg|h;6﨨^ ]QTۑ|adG?%AvՆdv-H4~Sd&7&pSJ7M9f56[YH2#̧ ~y4jQLOM#z`i|&Sؐ/B Z ?[Cv7?fl ix?n0G%#ԩ;uĘ1GȘ2Uc0pJX(T{퉶WNo4k?7mKq<''~|N>h>])M.{*DjGPD>e^~w^H o5t~d/[Sl|@D8>9|@G0 ]L$`S\WkEbm IX$]Z>|>9y#Oy͕C 1%ǰ@,"a~ Rk,! ~fwNLx%YNx~7CTK_̃v"B@!X} Č ?Je.P)d S @ɧ7WѿTJV*ApĒ|;,dCG,2k+?6Xmt q4\(VΑ2;)h<|1|m`QF+Up|Q o9y~ 4uHLU W #P,Az~@J>vUM&G=o:HP`w(x|MHxa;"þ3 H OZ*C \.@dm(e|m m(Kt JtXK8!,|^thZ||s"s):$# (b2i^'?YÒ٧I{%ð%K ?yR,*1xy?6;Y*h+D}!,gAvΈ_JYEWݟn^ x=r0I<%*UҧJ.}.)s U1R9Y<vW+mo*\/q=~huvW6one i^j&M0pS>P Ood {fǫL =|@/HH[1$v7O`}/ɩCXO. Upv"Ol\j8È<J(δH!DRBI:z؛_ _~ w:?(ïg:OvMXGzr:<_J Zhij)2Xi#ZMHlc6c݌IDyx bp_BB\8]>sQ-lQOKdEAoC!Gv 벛](½jȱDWo+Sc_?5`TmN~WaM ra:w}.` ezWKJKG.]η\@ 0t)0~ķ\ |x1~;ه6|"AJ"g%ّ-(oc R*D S< 4; /~# ؃?P$ bx=r0#0ғ*UҧJJJ@I2Re|#e~汒o1hd魴yy"G.Ǔrd~-vN|F/,m ?%'bP* 2^ <FU<ٟeR6xn΀3;H*ptK_Zwl%P-"EqO'~"8g;25$(' ݷHS#T =JM#O6H(jK:L;:gHB7/ztDԘU-܅Ck;.ǯkEu.>|-|&Wg,sA ؎rJ'- “_dj`.̓_21'6`SYtC_R?C d#O-@ñ yL5 aaź,8*guƏ׫݉@N]o i`{/8wmCspr_char_stand 765 ^x1v ݍtȘcvԥe#d:$}}"PI%<9O!I!?6=ilyh6GKn8áv;`(9p@,N`ymLSfbs#'%_s=J9>a~R2/=6|MܔϞz~Dy dLhMc[P֖Ǒ ~.\/N5~~2]w+6MP!YVM X]k\01>b 88?1_r:+[a"sL+?K'©I[0GLd;b./?[ wx1r0EIRtI*S eJ%eRrK~Z&3k֌ߕI{Ƨg >N7_P-riF{*xYx ѹ 0$F\}L2Yk!ehC0c>sE>,6'!Ngx |WZ/Cx8>c> ڎ rw6W\C[S?o@r)m=_]p;]+|;"g ?|Y}Vev߽-pƪ8+Pc-vsS>s._Њr}Ƨ nDoo,QNYZ~9|`@_i~4d|0iπb:I ~DpLoN..<\P(gK]_Ye<(?.pvT6 #oEӊX bNOViص,Rv8<~*NA+?@' ||_Jh<QpN('exOP2֒wY,eؘyhd|V~X"$)sg[πQ6'  5* X-t\L-wW ox1R0EEPPtI= 3))}.9F@09 _fm+F+afQljw%yzu=anop@{>"]WG7 D E=D74~YIw(S vQ*}xl;'1-Ma-y1-|mƏp\ahkwwY%(\\d]lc/#wox<8Ƕ8k"J>w/4'x)WTGk-kcq/[}*ݫG || ._>2CSO{$LU azh@gtsA ;n"Okz(}%|.z1)9C&Ss~b`chdl~V*(K0N׻bFXGN}OA6Y[/TA|,-PǣrRV1k!!~Zp0Uҋ9>揻x:S!GT{Р*Z^n UGu [x1n0 EM1NީKs=>Bǜ[_fiJ(A"mȖHWkC>*M'펟tjgQG7,pj!dW !̈=M,Ʀ~O9s0<hm%&a_ 9 \?S/*IUyۯ^V,+c3$8k+y; ?c*y|iþWe?U?:g"S?Ye>e *ڳV|ϴSWh&D b5>k@,%ޞ!ϸe_RB]\,]=YOAJ {!)HLfBa!F>v~aU,r|h>@ qfAz }܃~h6~|[Tpc,QUB.Me!ptfefZEC0gYsg+;2 {B詢4N]Pa`.O~/ qx=R0MPPR9BJJGI9 Oz:*N#{i$O_nt<\K|r_uz^c{X,Z[;cTs|½9+}t >=Q7kYz yg>fbr\GS&*фֻ9Tp3~I>HiXy^Z6l?,|+FOV$msRVMnİA Gj-b=N9ѱS|^ZV "OC( fl~ڊ)u,CƢP670nRi|eW+_!nR3yĥ,?ׂ9\2$D WiͪQVi G >{L^59 K|6Xضds{v THxTح&.<HMpXTj50! -vqr| =9 C3?؄Yse\qEqE=t;` g8\&oߓ6 cx-r0]39B`a#$@zffe;-feծ\ĵ&OJ]>͞9t  =![ƝQ9pa8t ᐎɚ>DaU|H;7H+__[3շk!y*3~?J d|,OHbY~ f`miGc۶|%p`㬑t'<KGb ~|$c'= (/BU?*cN%'{-3bqJH6IT4EͧJ[G}% a4-p ; t|Y|Y"{(&|=+۳CQTH%o..fbtW!9W {y6UqlqQV-$"/92.kDlm6UBn;U9ɈN6~ʗ:3kc帘ggLX?lE=,C^~A Yx1r ENHҥTI*Mf\\Tc)uK%>l@H2d&cf o=Vk^\ε d #~A"L8Geܕ9F[Im`Q'␑jx< ndS3*~h*EgRAc&?ݯKʖ%cRe MKmU񹛢 USE"됏Wffl+_X` n,0t XF|h +թ~9Vk!<jg|7-gF1WK+FPD5%4bmb h[Bn]|Gspr_block_slope4_mask@A?@ xα ACѣ J $"rzriTEDglY˓&|øݸӸʹ߯0!ُd?H#ُd?H#ُd?H#ُd?H#ُd?H#ُdYZ?}mk&)cKU}Z3&9$V||_+~1֯-* _7yOxo3~;͌fv-SHo2~;mcv㷓o0~; [ spr_char_fall/A.@(? x1r0P\H.ŲT#te# r'"hJ 4IIO ܰ=ݹaxuݎ'm{8p_c1=@wV4M}|0;񰟣5<쟨yjxT N<,V]'dkM8p i CTgw xE{q(Lfwtw%GDKm=ar\0Q29izRɉNʓJNT?d0i{"fwFX&urkzϦ=CE!<-1ʙ!C/|Ľ 8'|mGMLH%dQ'_34bSfsE=a*Lڿ/H֟h%_B ' {&E.Wrg0h8 {ҜI'HN5 VfZfz;M3?Y8Z4cobI°$0~`sgv6fUgƇI.o̎`&Mk1znLz0=0v*ĸ<;ǘ)1Y@S)YTg150/01[,t>޳gz2$cOcO^ɉ~}Sspr_char_trans_fall2<1;#: xxױn0`w2VXuԩSJ32fdc2$Uc81bQy}z0M{퉶̮wZU1y+s,ח5E#\EQU5F,GH4:eM[8H\TZ&8erJsq}eڂi\F&PEFV5飧\.cmPJ1tʹ\ E H2Du-%L<4Ec1RwZhd4/KSM%]Ra!瀧18!`{;K&w:,8P䜐K>m̸)>TŴ$:')m_Mvi8H \yk]EWR1@B΁pCWCcqBVZڥ'f&]PNi&38,XY*|uŸz_ȗ}޹.K.P;'-Njhq&xU !}aӜO>J'8IW5r-0!Pte#dS]ޤ(8vq PJ".#*hiեh%inJ͵6zbsm͵0} _xرN0`:"dD LLL,H;;f1yģ0r\NiXEjݖ~:JgJzNżnN1y*12|eW*\EQ䪛\ SmH0ez QpbH17q1\X0Z$8rLbTܐ\JoziQ]EA3KuۓP#?;S]HtVBTKt;o]\ѿژP\.yr~r]C:bZrQB5ty24] [F ܳ1thf 4D_0Ё fKUQ4ԦQuo/|4\ύX.P`KK]u=nZ=`Q%ATbwhrq]DžCn{Elf.7PdT}k}jOLjIoIח]+֗!_p1=WYwsٖ.hS)a7Η}wCZB"zdÊҹ`ֱm,{8\C_<ˡ]=!Gv)OCN5+++Ȯʮt"] Xxؽn0t#0"uXuԩSJyFƌ} c0s9$$X@ɏ#}<m{㙎W:MɾJ1u:v\z*eɮ]T\D\U]Y[6_$]\C#'RcxkATVrk#}KҐd\E7RPɸ\\V$ ~j`\VwmOWqmtYщr]J.Bs2ш&AzLs&FS7 j.xDA}dEGjgpypԎ.Du cA\Q%DֈR'غ[xF:.pfUKWQk+ǩ@Le!ʐE!94UA)qoC$ c#T_qEǦ9oʣsapi>TqS {J6yamJ0ODH 4YrQ/~4k _|O9t0 A[P|<xf3ftaw 'e8cE m`W1i9Z?h]8`DM;Eoq H%pVm%GgVx}Ȯʮt"+҉ʮt N jx;R0`)3C㒡ae!eJ#GI~yz8Vk&򬃓czGkڟiA󽵵mq?ru%ݏ멮ɵjGrrQPf4 o)s^Bolm 2e5]JW?RcTk咺)U6K&q\8K.,Nv \;C.#h]%L˹|w̑kև!3Tֵz߯w_bٓU*srI.7]>ܬ8vP0kH;cy! 9q(4:-A&XnV6 w^mFJ3\7VyHGp8,r,~t:ٗU"%nF(Ԛ[r";c҄prj wk < Lz.&p %|({Ѕ8_#P;#oT&$Gi5Ud^Tǩ))\wh%otYG,ΫJVvI;6(= Ve"\x5 HN1,G.4Q\U\DqWqU\ŕO? xرn0`w2FXuԩSJ321yc#c8l@ XR |N>~^^zR;b7<1ޕ$Iw)o``.IK iR18'0ڵ+/ Yk < .&k0dmU ݥR;\b@a3t^."p)QnӖpʢ1J.wnA(Vr ?crYOO]9˝v4 S$g<#+}p`}),Caow]iFǠͮ8R]+nY˭2.f˟m".4Z)'(E\P #hx>5?5VE.2VʡsVvQ7!M<8Y)dqѼ^\P|. h#h^|vs>՘K/NGREw_Q[.].Ο[њ(sg%nRyyZhQe4VKFa;}+]:5nd5P h| n pсeqɯf>8TK~艺%g24+K3PCE}U5Q)vCy꾥;D5!d \.&6\\+Pؿ x?n0pq0V:uԥRF!cF=FБT9J>/KzHO= )3UBd{vfTwR)"UW?~q{TU],$Yd564X4\H_.[GV6Kx:Vsߌm! p5pƬ%jg-]Ci˹hKh .$#W vkL"ً"'=erd"T>}%x2oV1V .H9]v]tg%/.M[(.׍ztc^Ab ݨ\Di{6QPW{NEeҕ:Ik:H 7_*6EI8RIYw\Y7!%ir,Y\f=KrII>zR=Kdr 3lh\aV0dG>neo5rŧi>Z@c[ǎY״^p`tפ\ksksݥhe x?N0pX2"&&&{3r'AW[B?c۳Orqg6{kMSbsWs>K?-EXeK\UUb\H-IY|2P2kS2 lnr.l-KB&- CIآeTV˴&.%v1Yc;.>8grqa@Lb9\Z4wijCP6*Wz5]UB)~ńc|mގ p$`WIG2|CAH`!T =I>~ oX?u>Yڶv{R tɅ0EP aBYY]]4@EXDV:\ǝhJ a7V:\&W5! K5l/!#*8).d'3 EaOiC]Je; \^v`8KLx.^:-b>f!{$vpD8{szyKC4:!^ Eh׻t5lӣa*w Eƥ D],le] lqD\XN&q * -S g0?t<0g`Vo uL%=E7!vKS ORBKP$L&$fLQ(K;b/ɕm(=ڌrKhV}W YJCE@^{˂]-/AE%Ukh]V]sIp+|=Z.Qm5 Lpq\spr_char_jump_mask0-/,, IxΡ @ @Ѳl!AKn$s1 k7V)llɆO\R ?( spr_char_jump22110 6x;n0 `w1tRc!cF=F1G阩gXJBW$G("C @Rʍ:j:Pgm\]y.Bcscu]"T4E\"]RtF\ռʕqVwqʲtٵ.B7JrQP(sq)ӜbPS&%uCLSoQJ,ɖ؅pWJZ}+\pxnʁ~ uzָCLWDwW]qY4/9114mI0:<\2tZM(dt1.N 5qM㔅.\M!= _HySQ!QZ"^eϸ В$HWY>#a4IŋB.:I%򥉻\{p ?ZZig4%\:/TP#hzG\J<53ڭzo8N,Z5D}Aڍ, 4ԥ[oRu}_^5!+ 6xػm0`nTPR#t2cd%d9LJ)SHx<=>~+3^ii{C3O3<R幺/\ׅ4My|$Hq*@#W\ʸ*8eYlPʌ\/\= self.fall_speed; i = i - 1) { if (actor_check_collision(self.x, floor(self.y) + i, obj_block)) { self.y = floor(self.y) + i + 1; self.fall_speed = 0; break; } } } else { for (i = 0; i <= self.fall_speed; i = i + 1) { if (actor_check_collision(self.x, floor(self.y) + i, obj_block)) { landed = true; break; } } } if (landed) { self.falling = false; self.fall_speed = 0; self.y = floor(self.y) + i - 1; } else { self.y = self.y + self.fall_speed; } return landed; }actor_check_obstacle// // actor_check_obstacle(x, y, facing) // //The actor (calling instance) hecks for an obstacle 1 horizontal pixel away in the given direction. //Returns OBSTACLE if an impassible obstacle is encountered. (Impassible means it is too high to walk onto.) //Returns the relative Y change if the obstacle can be walked onto. (This is for slopes.) //Returns OPEN_AIR if no obstacle is found. (This means there is no floor, so the actor should fall.) // x : The position of the actor // y : The position of the actor // facing : LEFT or RIGHT, the direction to check for obstacles // //Written by : Nailog //Last modified : 08/20/2006 { var nx, ny, dy, facing, dm, i, offset; nx = argument0; ny = argument1; facing = argument2; dm = get_facing_modifier(facing); offset = self.step_height; for (dy = -offset; dy <= offset + 1; dy = dy + 1) { if (!actor_check_collision(nx + dm, ny + dy, obj_block)) { ds_stack_push(self.obstacle_stack, dy); } } if (ds_stack_size(self.obstacle_stack) > 0) { dy = ds_stack_pop(self.obstacle_stack); ds_stack_clear(self.obstacle_stack); if (dy == offset + 1) { return OPEN_AIR; } else { return dy; } } else { return OBSTACLE; } }get_facing_modifier// // get_facing_modifier(facing) // //Returns -1 if the facing is LEFT, and 1 if the facing is RIGHT. // facing : LEFT or RIGHT // //Written by : Nailog //Last modified : 08/17/2006 { var facing, fm; facing = argument0; fm = 0; switch (facing) { case RIGHT: fm = 1; break; case LEFT: fm = -1; break; } return fm; }actor_start_fall8// // actor_start_fall() // //Starts the falling process. // //Written by : Nailog //Last modified : 08/20/2006 { self.falling = true; self.sprite_index = self.sprite[SPRITE_TRANS_FALLING]; self.image_speed = self.sprite_speed[SPRITE_TRANS_FALLING]; self.image_index = 0; }actor_jumping_step// // actor_jumping_step() // //Should run in Step event. Makes the actor (the calling instance) jump until it hits something or it reaches its //jump limit. //Returns true when the actor reaches the limit (either because of an obstacle or not). // //Written by : Nailog //Last modified : 08/20/2006 { var hit, i, old_mask; hit = false; old_mask = self.mask_index; self.mask_index = spr_char_jump_mask; for (i = 0; i <= self.jump_speed; i = i + 1) { if (actor_check_collision(self.x, floor(self.y) - i, obj_block)) { hit = true; break; } } self.mask_index = old_mask; if (hit) { self.y = max(self.jump_start - self.jump_height, floor(self.y) - i + 1); return true; } else { self.y = max(self.jump_start - self.jump_height, self.y - self.jump_speed); if (self.y == (self.jump_start - self.jump_height)) { return true; } else { return false; } } }actor_start_jumpM// // actor_start_jump() // //Starts the jumping process. // //Written by : Nailog //Last modified : 08/20/2006 { self.jumping = true; self.jump_start = self.y; self.sprite_index = self.sprite[SPRITE_JUMPING]; self.image_speed = self.sprite_speed[SPRITE_JUMPING]; self.image_index = 0; }actor_check_collision// // actor_check_collision(x, y) // //Checks for a collision with an obstacle at the given coordinates. // x : X coordinate // y : Y coordinate // //Written by : Nailog //Last modified : 08/20/2006 { var nx, ny, col; nx = argument0; ny = argument1; col = false; if (instance_exists(instance_place(nx, ny, obj_block))) { col = true; } return col; }actor_moving_stepS// // actor_moving_step() // //Should run in Step event. Makes the actor (the calling instance) move until it hits something. //Returns true when the actor ca no longer move due to an obstacle. // //Written by : Nailog //Last modified : 08/20/2006 { //Check for obstacles. Allow for slopes, both up and down, 3 pixels worth of height. //If an obstacle is hit, move the actor up to the obstacle and 0 the movement speed. var i, nx, ny, modifier; nx = floor(self.x); ny = floor(self.y); modifier = get_facing_modifier(self.facing); for (i = 0; i <= self.move_speed; i = i + 1) { self.debug_obs = actor_check_obstacle(nx, ny, self.facing); //If the obstacle is too high, the actor needs to move up to the obstacle and then stop moving. if (self.debug_obs == OBSTACLE) { self.x = floor(self.x) + (modifier * i); self.move_speed = 0; if (!self.jumping && !self.falling) { self.y = ny; } return true; } //There is nothing under the actor, so it'll start to fall. else if (self.debug_obs == OPEN_AIR) { nx = nx + (modifier * 1); } //The obstacle can be walked on. else { nx = nx + (modifier * 1); ny = ny + self.debug_obs; } } //If i is greater than the move speed, the actor was able to move the full speed. //Set the correct y. if (i > self.move_speed) { if (!self.jumping && !self.falling) { self.y = ny; } } self.x = self.x + (modifier * self.move_speed); return false; } font_debugSOTN obj_block obj_char [b{ event_inherited(); self.sprite[SPRITE_STANDING] = spr_char_stand; self.sprite[SPRITE_RUNNING] = spr_char_run; self.sprite[SPRITE_FALLING] = spr_char_fall; self.sprite[SPRITE_TRANS_FALLING] = spr_char_trans_fall; self.sprite[SPRITE_JUMPING] = spr_char_jump; self.sprite_speed[SPRITE_STANDING] = 0.15; self.sprite_speed[SPRITE_RUNNING] = 0.4; self.sprite_speed[SPRITE_FALLING] = 0; self.sprite_speed[SPRITE_TRANS_FALLING] = 0.15; self.sprite_speed[SPRITE_JUMPING] = 0.1; }0000000[R{ if (keyboard_check(vk_right)) { self.facing = RIGHT; self.wants_to_move = true; } else if (keyboard_check(vk_left)) { self.facing = LEFT; self.wants_to_move = true; } else { self.wants_to_move = false; } if (keyboard_check_pressed(vk_up)) { if (!self.jumping && !self.falling) { self.wants_to_jump = true; } } else if (!keyboard_check(vk_up)) { self.wants_to_jump = false; } event_inherited(); }0000000[{ event_inherited(); }0000000obj_actor_parent [{ self.obstacle_stack = ds_stack_create(); self.debug_obs = OPEN_AIR; self.max_speed = 3; self.move_accel = 0.2; self.move_decel = 0.4; self.move_speed = 0; self.wants_to_move = false; self.step_height = 3; self.facing = RIGHT; self.falling = false; self.fall_speed = 0; self.jumping = false; self.jump_speed = 4; self.jump_height = 68; self.jump_start = 0; self.wants_to_jump = false; self.sprite[SPRITE_STANDING] = spr_char_mask; self.sprite[SPRITE_RUNNING] = spr_char_mask; self.sprite[SPRITE_FALLING] = spr_char_mask; self.sprite[SPRITE_TRANS_FALLING] = spr_char_mask; self.sprite[SPRITE_JUMPING] = spr_char_mask; self.sprite_speed[SPRITE_STANDING] = 0; self.sprite_speed[SPRITE_RUNNING] = 0; self.sprite_speed[SPRITE_FALLING] = 0; self.sprite_speed[SPRITE_TRANS_FALLING] = 0; self.sprite_speed[SPRITE_JUMPING] = 0; }0000000[ { //If the actor wants to move, accelerate while checking for obstacles. if (self.wants_to_move) { //Accelerate until the limit is reached. //Acceleration is slower when in the air. var accel; accel = self.move_accel; if (self.falling || self.jumping) { accel = accel / 2; } if (self.move_speed < self.max_speed) { self.move_speed = min(self.max_speed, self.move_speed + accel); } } else { if (self.move_speed > 0) { //Decelerate until stopped. //Deceleration is slower when in the air. var decel; decel = self.move_decel; if (self.falling || self.jumping) { decel = decel / 2; } self.move_speed = max(0, self.move_speed - decel); } } //If the actor needs to move, move him. if (self.move_speed > 0) { if (actor_moving_step()) { self.move_speed = 0; } } else { //Drop any decimals. Stops blurriness when standing still. if (self.x != floor(self.x)) { self.x = floor(self.x); } } //Check if we need to be falling. Only check if we aren't falling or jumping. if (!self.falling && !self.jumping) { //Falling is open air beneath the actor. if (!instance_exists(instance_place(self.x, floor(self.y) + self.step_height + 1, obj_block))) { //Start the actor falling, and switch to the transitional falling sprite. actor_start_fall(); } } //If we are falling, we need to fall until we hit something. if (self.falling) { if (actor_falling_step()) { //The actor landed, set jumping to false. self.jumping = false; } } //If we aren't falling, and we want to jump ... else if (self.wants_to_jump) { //If we aren't jumping, we need to make sure we can jump. if (!self.jumping) { actor_start_jump(); } } if (self.jumping && !self.falling) { if (self.wants_to_jump) { //Continue rising until the limit is reached, or an obstacle is encountered. if (actor_jumping_step()) { self.wants_to_jump = false; } } else { self.fall_speed = -self.jump_speed; actor_start_fall(); } } //Control the sprites for the actor. if (self.jumping || self.falling) { if ((self.sprite_index != self.sprite[SPRITE_TRANS_FALLING]) && (self.sprite_index != self.sprite[SPRITE_JUMPING])) { self.sprite_index = self.sprite[SPRITE_FALLING]; self.image_speed = self.sprite_speed[SPRITE_FALLING]; } } else if (self.move_speed > 0) { self.sprite_index = self.sprite[SPRITE_RUNNING]; self.image_speed = self.sprite_speed[SPRITE_RUNNING]; } else { self.sprite_index = self.sprite[SPRITE_STANDING]; self.image_speed = self.sprite_speed[SPRITE_STANDING]; } self.image_xscale = get_facing_modifier(self.facing); }0000000[A{ if (self.sprite_index == self.sprite[SPRITE_TRANS_FALLING]) { //When the transitional falling sprite ends, switch to the falling sprite. self.sprite_index = self.sprite[SPRITE_FALLING]; self.image_speed = self.sprite_speed[SPRITE_FALLING]; self.image_index = 0; } }0000000[{ draw_sprite_ext(self.sprite_index, self.image_index, self.x, self.y, self.image_xscale, self.image_yscale, self.image_angle, self.image_blend, self.image_alpha); }0000000obj_block_slope1 obj_block_slope2 obj_block_slope3  obj_camera [U{ self.camera_id = 0; self.target_object = obj_char; self.target_x = 0; self.target_y = 0; self.border_locked = true; self.border_top = 0; self.border_bottom = room_height; self.border_left = 0; self.border_right = room_width; self.debug = false; }0000000[{ if (instance_exists(self.target_object)) { self.x = self.target_object.x; self.y = self.target_object.y; } view_xview[self.camera_id] = self.x - floor(view_wview[self.camera_id] / 2); view_yview[self.camera_id] = self.y - floor(view_hview[self.camera_id] / 2); if (self.border_locked) { view_xview[self.camera_id] = max(self.border_left, min(self.border_right - view_wview[self.camera_id], view_xview[self.camera_id])); view_yview[self.camera_id] = max(self.border_top, min(self.border_bottom - view_hview[self.camera_id], view_yview[self.camera_id])); } }0000000[`{ if (keyboard_check_pressed(ord('D'))) { self.debug = !self.debug; } }0000000[{ if (self.debug) { draw_set_font(font_debug); draw_set_color(c_red); draw_text(view_xview[self.camera_id] + 10, view_yview[self.camera_id] + 10, "FPS : " + string(fps)); draw_text(view_xview[self.camera_id] + 10, view_yview[self.camera_id] + 19, "Falling : " + string(obj_char.falling)); draw_text(view_xview[self.camera_id] + 10, view_yview[self.camera_id] + 28, "Jumping : " + string(obj_char.jumping)); draw_text(view_xview[self.camera_id] + 10, view_yview[self.camera_id] + 37, "Wants to Jump : " + string(obj_char.wants_to_jump)); draw_text(view_xview[self.camera_id] + 10, view_yview[self.camera_id] + 46, "X : " + string(obj_char.x)); draw_text(view_xview[self.camera_id] + 10, view_yview[self.camera_id] + 55, "Y : " + string(obj_char.y)); draw_text(view_xview[self.camera_id] + 10, view_yview[self.camera_id] + 64, "Image Index : " + string(obj_char.image_index)); draw_text(view_xview[self.camera_id] + 10, view_yview[self.camera_id] + 73, "Obstacle : " + string(obj_char.debug_obs)); var stuck; stuck = false; with (obj_char) { if (actor_check_collision(self.x, self.y)) { stuck = true; } } if (stuck) { draw_text(view_xview[self.camera_id] + 10, view_yview[self.camera_id] + 100, "STUCK"); draw_sprite(obj_char.mask_index, 0, obj_char.x, obj_char.y); } draw_text(view_xview[self.camera_id] + 270, view_yview[self.camera_id] + 10, "Fall Speed : " + string(obj_char.fall_speed)); } }0000000obj_block_slope4  room0@@<        z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @   @@@@@@@@ !"#@$%&'(@)+,-@./01@2@@34@@5678@9@:@;@<=>?@@AB@CDEF@GHI@JK@L@MNO@P)T}U@UXGame InformationX{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil Arial;}} {\colortbl ;\red0\green0\blue0;} \viewkind4\uc1\pard\cf1\f0\fs24 \par } Sprites Block Masksspr_block_maskspr_block_slope1_maskspr_block_slope2_maskspr_block_slope3_mask spr_block_slope4_mask Character spr_char_fall spr_char_jump_mask spr_char_mask spr_char_runspr_char_stand spr_char_trans_fall spr_char_jumpSounds BackgroundsPathsScriptsactor_falling_stepactor_check_obstacleget_facing_modifieractor_start_fallactor_start_jumpactor_jumping_stepactor_check_collisionactor_moving_step Fonts font_debug Time LinesObjects obj_blockobj_charobj_actor_parentobj_block_slope1obj_block_slope2obj_block_slope3obj_block_slope4 obj_cameraRoomsroom0 Game Information Global Game Settings