0+S~%SQR6_WOM'6)vw̪ @2TvͫgE#2Tv2TvTͫwgW~affaafafaaaffaafafaaafffaaaaaafffafaaafaa `` affaafafaaaffaafafaaaaaaaaaffaafafaaaffaafafaaaffaafafaaaffaafafaaaa a fafaafafaafa`faa `wqwzywqqqy]]]]]UUU]]]UUUwwwwffffwwwwffff\]UUU\]UUUUUU\]UUUqwqqqwwwzqzywqqqwyw]]]]]UUU]]]UUU\]UUU\]UUU\]UUU\]UUUqqq`ff`]UUUDDEDDEDDEDDEDDffmUUDDUmDDTmDDTmDDTmDDTm`ff` ffmPUDDUmDDTmDDTmDDTmDDTm`ff` ffmPmPmPmPmPmAILqEDDEDDefDwwwfffDeaDefDDDTmDDTmDDTmDDTmDDTmDDTmDDTmDDTm`wf``DDTmDDTmMDTmwMTmfMTmMDTmMDTmMDTmPmPm]m]m]m]m]m]mAAqwawDwwDEDDEDDEDDEDDEDDEDDEDDEDDDDTmDDTmDDTmDDTmDDTmDDTmDDTmDDTmDDTmDDTmDDTmDDTmDDTmDDTmDDTmDDTmPmPmPmPmPmPmPmPmA!"vaAAva!afflfff"!afflfff"!afflfff"!afflfff"!afflfff"!afflfff"!afflfff"!aff!qff(alfQmvvfllQaamvvllaQmvvllamvvlllmvQvUlmvvlfQmvvfmfqfwfafawQUUQUQUQUUQUUQUQllQUUQUUQQUUQUUQUUQUUaffafflaffafflQUUqggf!!aaQQUfqggf!!lQUUqfa!afllfafllfUQaaafUQaaafUQaafUUUQUUUQAILqAILqAILqAILqA񡪚񡪚AILqAILqAILqAyyϑϗϗAAqwawDwwDAAAaAADwvBDAAADqqAAADaADDAAqwawDwwDAAqwawDOAwAwDAAqwawDwwD/qwawDwwDA!"vaAAva!!"wa!Hva!!!va!!!!Hav!awv!avv!owvavv!owvAavv!owvavv!owvAILqA񡪪񑪪񑪪*p'**""*p'pz)p))ff`UU&`ET&`FT&`ET&`ET&wwp'pm'pg'pm'pm'(,h,ff,"",AAADaADDQp p p p p 񑩪ABADaffDDffDADaffDDffD!!va!!Qmvmv!vv!!$a!!vv!!!aaavD!!!!"wfavDD!!!!"!"aaavDwDvD("OODfDwAvD("OODfDwAvD("OwOvDfDwA{()()()()()()()()()()89898989898989898989@A !()() !()()()()()*+*+*+*+()*+*+*+() !()()PQ*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+018989018989898989:;:;:;:;89:;:;:;890189@A89`a:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;()()()()()()() !()()()PQ()8989898989898901898989`a89()()()()() !()()()()()() !()8989898989018989898989890189()*+*+*+*+*+*+()*+*+*+*+()()()()()()()()()()()() !()()() ! !()()() !89:;:;:;:;:;:;89:;:;:;:;@A8989pq8989898989pq898989898901898989010189898901()()PQ !()() !()()()()()()()() !()()()()()()()()()()()()()8989`a01898901898989pq89@A898989890189898989898989898989898989()()()()()()()()PQ()()()()()()()()()()()()()()()()()()()8989898989*+*+*+*+89*+*+*+*+*+8989`a89898989898989898989898989898989898989()()()()()()():;:;:;:;():;:;:;:;:;()()()()()()*+*+*+*+*+()()()()()()()()()89pq898989pq89898989898989898989:;:;:;:;:;898989pq89898989pq8989()()()() !()()()()()() !()()()()()()()()() ! !()()()()() ! !()()89898989018989898989890189898989pq89898989890101898989898901018989()()()()() !()()()()()()()()()*+*+*+*+*+()()()()()()()()()()()()898989pq898901898989898989898989:;:;:;:;:;898989898989898989898989()()()()() !()()()()()()()() !()()()()()()()()()()()()()()()()()()()()8989pq898989018989898989898989018989898989898989898989898989898989898989()()()()()()()()()()()()()()()()()()()89898989898989898989pq898989898989898989()()()()()()*+*+*+*+()()()()()()()()()()()898989898989:;:;:;:;8989898989898989pq898989()()()()*+*+*+*+*+*+()()()()()()()() !()()() ! !()()() !89898989:;:;:;:;:;:;898989898989898901898989010189898901()()*+*+*+*+*+*+*+*+*+*+()() !()()()() !()()()()()()()()()()()()8989:;:;:;:;:;:;:;:;:;:;8989018989898901898989898989898989898989() !()() !()()()()()()()()()()()()()()()()()89018989018989898989898989898989898989898989()()()()()() !()()()()()898989898989018989898989()()()()()()()()()()()89FG8989FG8989FG8989898989FG89()VW !()()VW()()VW()() !()()() !VW()89fg018989fg8989fg89890189898901fg89()()()()*+*+*+*+*+*+*+*+()89@A898989:;:;:;:;:;:;:;:;89()PQ()()()()()()()*+*+*+*+*+*+()()()*+*+*+*+()()89`a89pq8989pq89@A8989pq89:;:;:;:;:;:;898989:;:;:;:;8989() !() !()() !()PQ()()()()()()()()890189018989@A0189`a8989pq898989898989()(),-()() !PQ()()()() !()()()()()()()()()8989<=898901`a89898989018989pq898989@A898989pq89()(),-()()()()()() !()()()PQ()()() !()8989<=89898989898901898989`a8989890189()()()()()()()()()()()()()*+*+()()()()*+*+()()pq898989898989pq8989pq8989898989:;:;89898989:;:;8989 !()() !()() !()() !()()() !()()()()()()()()01898901898901898901898989018989898989898989()()()()()() ! ! !()()()()()()()()()()89898989898901010189898989898989898989()()()()()()()()()()()()()()()898989898989898989898989898989()()()()()()()()()()()()()()()()()() !()()()() !()89898989898989898989pq898989898989898901898989890189()() !()()()() !()() !()() ! !()()()() !()()()()()()()()()8989018989898901898901898901018989898901898989898989898989()()()()()()()()()()()()()()()()()()()89898989898989898989898989898989898989()()()()() !()()()()()() !()()()()()()()()()()8989898989018989898989890189898989898989898989()()()()()()(),-()()()()()()()()()*+*+*+*+()()()()*+*+()()()()*+*+()()89898989pq898989<=898989FG898989898989:;:;:;:;89898989:;:;89898989:;:;8989()() !()()()(),-()()()VW()()()() !()()() !()()()()()()()89890189898989<=898989fg89898989018989890189898989898989()()()()()(),-()() ! !()()()()()() !()() !()() !()898989898989<=898901018989898989890189890189890189()()()(),-(),- !,-() !()()()()(),-()(),-()89898989<=89<=01<=89018989898989<=8989<=89()()()()(),-,-,-,-,-()()()()()(),-()(),-()8989FG898989<=<=<=<=<=898989FG898989<=89FG89<=89()()VW()()(),-,-,-,-,-() !()()VW !()()(),-()VW(),-()8989fg898989<=<=<=<=<=89018989fg01898989<=89fg89<=89()()()()()()898989898989()*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+() !()()()() ! !()()89@A:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;890189pq89pq898901018989()PQ() !() !()()()() !()()()()89`apq8901890189@A8989890189898989@A()()()() !()PQ()()() !()()()()*+*+*+*+*+()PQ !898989890189`a8989890189898989:;:;:;:;:;89`a01() !()()()()()()()()()()()() !()()890189898989@A8989898989898989018989() !,-()()() !()PQ()()()()()()()89pq01<=8989890189`a89898989898989(),-,-()()()()()()() !()()()()()()89<=<=898989898989890189898989*+*+*+*+*+*+8989(),-()()()()()()()()()()()():;:;():;:;:;89()89<=89pq8989pq89898989898989898989pq()pq89(),- ! !()()()() !() !()()()() ! !()()()()89 !() !89<=01018989898901890189898989010189898989()018901(),-,-,-,-,-()()()()()()()()()()()()89<=<=<=<=<=898989898989898989898989(),-()()*+*+*+*+*+()()()() !()()()()()89<=8989:;89898989018989898989(),-()() !()()()()()()()()89<=898901:;:;:;:;8989898989898989(),-()()()() !()()()()()()*+*+*+*+*+*+*+*+*+*+*+()89<=898989890189898989pq8989:;:;:;:;:;:;:;:;:;:;:;89(),-()()()()()()()()()()()() !()() !89<=89898989898989898989898901898901(),- !()() ! !()() !()()()()()() !()()() ! !()89<=018989010189890189898989898901898989010189()()()()()()()()()()()()()()8989898989898989898989898989()()*+*+*+*+*+*+*+*+()()()() !()()()()()()8989:;:;:;:;:;:;:;:;8989898901898989898989()()()()()()()()()()()()()()898989FG89898989FG898989898989FG89()()() !VW()()()()VW()() !()()() !()VW !()89FG89pq8901fg89898989fg8989018989890189fg0189()VW()()()()()()89fg898989898989 ^                    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 C   p p p ppppppppp     p p p p p p p p p p ppppppppp p p p p p p p p p p ppppppppppppp  ppppppp  p p p p p p p ppppp  ppppppp  p p p p p p p p p p p p p p p p p ppppppppp   p p p p p p p p p ppppppppp   p p p p   p p p p p p p p pppppppp     ppppppp    p p p p p p p p    af ?qwwwwqqwwwwqwwwwwxrxrq(q""""rrq""""r("""(q((wwwwr(wwwwrwwwrq(rrrrrq(rrrrrq((wwwr(wwwrrq((r(rrq("""r"""rrq((wwwr(wwwrrq(rrrrrq(rrrrrq(DD(wwww(wwww(wwwwrrq(IDOqrrqrrrq(D'""""rq"""""r'""""r'r'rq"IOqwwwwwwwwwqwwwwqqwzywOwywOywwqwwwwwwyIwqq||qq|yIqq|qwq|w|q|wwI"DwwI.tDDI񔪚(wwDwqwwq|q|q|q|q|wIggBwGqzq|q|q|q|q|q|IwwBGqq|wwIww)BGqyI|w|w)BDGqyqq|q|q|q|q|Iffff)DDODGqyqq|q|w|q|q|q|IADDDGqyqwwwqwwwwwwIADDqyq||IAwqwqwwwqwqwwqwww"ODG/"O!G"""O.wwwwwwwwwwwI"""wqq|q|q|q|q|q""O.Gq|w|q|q|q|wq|wq|wwq|w|AчxrDDxBDDDD!"q|ww|q|q|q|q|q|q|q|wq|ww|DDDDODDx'qq|q|q|q|q|q|q|qDDOAD$wwwwwwAADO'w|w|AADOq|q|q|q|q|q|q|q|q|q|q|ADDGDO"q|q|q|q|q|q|q|q|q|ADDDDODtwOqwwwwADDtwwGtwG|DqqqwqqqqqwwwqqAGDtGtDtGDDODAODAODDA(AvwwwwwwwwwwwgDmwwwwwwwwwwwwwDmwwwwwwwwwwwww"mwwwwwwwwwwwww""mwwwwwwwwwwwwwmmvwwwwwwwwwwwg"wvwwwwwwwwwwwg!fwwwwgfvwwwwf!mfwwfffffwwfцfffffffffff!rwx"""""""""""!wBDDDDDDDDDD$"(ADDOD""ADDDADAADGADGAGDGAGDGDDGADGAGGADGADGADGAwwwwqwDGDwwwqwqwqwwwwqwwwwwwqwAGDwwwqwwqqwwwqwqwAGDwwwwwwwqwwwqwwwADGwwqwwwwwwwwqwwwqwwwwAAGwwD"AGD".rDGG$.DGGwwwqwqwwwq".!""/"qqwqwqwwqwwqwwqwqwqqqwwqwwwqwqq".!"""/"qqqqqwqqqqqwqwqqqqqqwwqqqqqq"("."""""qqqqqqwqqqqwqwqqqqqwwqqqqqww""(".wwwqqqwqwwqwwqqwwqwqwwqqqqq!"(".!"(".!"(""""""""D""D"("""".B""".AD"".A"xww(".AO"www(".At"w(""ww.DO'"x"BDD""wwDtD'""DDD""xwwDOtD$b(DDD""DGtD$-BDD$""AGGt"DDDDDDADGt"DDDGAtDDOGDGDGAtDGDGDGDGDDDtDGDGDOAGADDGDGDADDDGAD}ww}DDGDwwwwwMDDwwwwAAD}wxwwxAwwwwwwxmwwwwwwwmrwwwwwwww-"-fwwwwwwwwfwwwwwwwwmvwwwwwwwmvwwwwwwwwfwwwwwwwwfwwwwwwwwmvwwwwwww,0+S~%SRR6_WOM'6)vw̪"pwwp""(wwrr(wwwwx""rwww(prrrrrrrpwwp""(wwrr(wwwwx""rwww(pwww(""rwwrrrrwr"(wrrrrr ""(wwrr(wwp'""pww"wwwr""rwwrrrr(wwp"""wwwwwr""rww""(wwrr(wwp'""pww"wwwr""rwwrrrrrr'rprrrrrr'rpIIDDDO DO z wppwwpwwppp|||pp|pw|wwp|yyyywwIIIIIѪIgOOygw ww"D.t(BDDwwDwGpppppppwpzyypypypypwp|p|p|wwpwwwwp|p|p|pwpwp|p|w||II̪I|IfIIIwwwf"ww|wffOB)B)B)D @ DODDDD@DD@DGGDGGGGppp|ww|w|ww|ppp||p||p|p|ppp|ww||wp|I @ /"""""""""DDDDDDDDOOODDOЪ Їx " DD .w.xrBx'GGpwp|pp|pww||pp|p|p|pwpwp|p|p||p|p|p|pp|p|p|p@D@ @@@D@DDDDDtwDDDDOwGtO@@DGDDtww@D$DOOOOGG ' "wp(p(p(p(p(p(p(DDD@@@@DmttOOOvwwwwwwwDwwwwwwwwwwwwwwwwGtGDDDD(g wp(p(p(p(p(p(p"wDm"m""mmm"w Іwwwwwwwwwwwwvwwwvwwwfwwwmfwwfffwwwwwwwwwwwwwwwwwwwwwgfvffffffffwwwwwwwwwwwwwwwwwwwwwwwwfwwfffffwwwgg f ppp|ww|w|ppp|www||www@@ rw wD$"DOD"DDDx"""BDD(@D"@D@@DD""""DDDD""""DDDGGp|p|p|wwpwwp|p|p||pwp|p|wwpww|www@@D@@DDDGGGGGGGDDDD@@@@GGGGppp|ww||wp|ppp|www||wwwppp|ww|w|ww|D@@@@D"D"$GGG@@.rD.DDDDDGGGGGGGp|p|p|pp|p|p|ppwp|p|wwpww|wwwpwp|pp|pww||p""""" " " "("". ". "("("("("""""""".興""""//"""...fffffffffffffffffffffffffff"fff"fff"fff"fff"fff"fff"fff"""""""""""""""""""""""""""""""""&bm&bm&bm&mffff""""&&&b&&b&m&b&ff&"""""bbbmbm&bm&bb&b"bff""""m&bm&b&bbffff"""""""DB@D@@O@DD""""""t"O'"xxwww(""BD("""www"wD""""""("("www......fffffffffffffffffffffffffff"fff"fff"fff"fff"fff"fff"fff"""""""""""""""""""""""""""""""""""""ffffmm&m&bm&b&b""""ff&"m&b&&b&b&&&&"""""bffb&bbm&bbm&bmbb""""ffffb&bm&bm&bDtDOtDGt@GG@DG@tD@tDDDD'"D$b(D$-Bt"Dt"DDOGDGDGDDtD"DDDD"D"xD""DD$DDDDDGDGDGDww ""DDGGGG̪wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwzx|x||zwwẇ̇ẋxLJ|xwwxx|x|x|xxxLjxww|xxǬx̬̬̬wwwDO@DGDGDGD@G@DD@@DDDDw@D}w@wmw}wwwwwwwxwwwwwwwwwwDD}DwMwwxwxwwG̪wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwzwww|||xzxǪww|xxLJẋ̇̇xwwxxx|xx|x|x̪www̬̬x̬xǬ|xmrw-fwfwmvmvffmwwwwwwwwwwwwwwwwwwwwwwwwwwwwvwwwwww-wwwwwwwwwwwwwwwwwwwwwwwww" L0+S~%SQR6_WOM'6)vw̪B{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{DDDDy{{D{{{{{{{{y{{y{{{{{{{{{{{{{{{{{SVSVSVSV|w|www|www|wwwww{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ywyw{ywwywwDIIIwIODD{GyGGyy{{{{{{{{{{{{{{{{SVSVSVSV|w|www|www|wwwww},},"""("-(∈∈-w""!.!(!(!(!(!(!(!|w|w{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ywwIIIIIaIvIawIawqfaw}vwvwGGGGGG{{{{{{{{{{{{{{{{SVSVSVSV|w|www|www|wwwww",-,܎}-xwwwx"w(xw(w""(!w(!w(!w(!(!|wrr"""{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{IowIfIIDDwffOvwoffvGGGGyG{{{{{{{{{{{{{{{{SwV|wSwwV}wS}wV}S}Vwm}"}ww-fffggggvvvv"҂}-.҂((("""""vwwvmww""""""""""wwwwwwww("("""""wwwwww""!!!{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{DDDIDIDIDIDID""/""/"/D"DDtwDDDD"""G."G.rGGyy{{{{{{{{{{{{{{{{{{SVSVSVSVm}wwwwgfffgfffgfffffffwwwwwwwwfffffffffffff-vwwwwwwffffffffffffwwwwwwwwffffffffffffwwwwwwwffffffffffff"wwwffgffgffg{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{KD{{{{{{G{{KDDDDDwGDwIDIDIDDIDDDDDDDDDwGDDDttGD{{{{{t{{{GDDDtDwwGy{DKGwD{DDGGGwKGGGGGG{{{{t{{{DDt{{DDDDt{wDGSVSVSVSVgfffgfffwwwwgfffgfffgfffffffffffwwwwffffffffffffffffffffwwwwffffffffffffffffffffwwwwffffffffffffffffffffwwwwffffffffffffffgffgwwwffgffgffg{{{{{{{{{{{{{{{{{{KD{KD{DGKGtDDwwOwGtwDtttGOOOGDGGGDGGGDGGGDGGGDGGGtOGGttOGttODG{DGDG{DGDG{DGDG{DGSVSUUU6666{{{{{{{{UUU666{{{۷{{{۷gfffgfffgfffgfffgfffgfffgfffgfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffgffgffgffgffgffgffgffg{{{{{{{{{{{KG{{{KDKDDDDODOtDtDt$OvwOfwwwwwwwwwDwwwwwwwwOOtOtODDw'Bw"DtttDtDDtDDtDOD'DD"{{{{{{{{{{{{{{{{{{{۷{{{۷{{{۷{{{۷gfffgfffgfffgfffgfffgfffgfffwwwwffffffffffffffffffffffffffffwwwwffffffffffffffffffffffffffffwwwwffffffffffffffffffffffffffffwwwwffffffffffffffffffffffffffffwwwwffgffgffgffgffgffgffgwwwIDDD |wwww|wwww3333wwwwwwwwwwww3333333wwwwwwwww333yyDIIIIDODOOz9333ywwwwwwwww3333333wwwwwwwwwwww3333|w|www|wwww|wwwwwwwQwUQUqwqwqfqvUUUUUUUUUUUUwwwwwwwwffffwwwwUUUUUUUUUUUUwwwwwwwwffffwwwwUUwwffwwwIIIIIaIvIawIawfwwgwgfawvwvwwzgwww w z |w|www|wwwwwwwwwwwqvqvqvqvqvqvqvqvwwwwwxwwwxwxxwxxxwxxxwxxwxwwwwwwwwwwwwwwwwwwxwwwwxwwxwfffffffDfLGIawIowIvIoIIIIgggf""vvvof""wwg wLDqvtwqvtqvDqvLDqvDqvqfqfxxwxxxwxwwxwwwxwwwwwffffffffwxwwxwwxwwwwwwwxwwwwffffffffftOftOftOftfLfLfLfLDDD|DwO|w|w|wwwIII /""""""""""""/DDD/"""""""""."""".O.D"DDOO qwqwDqfLwqvtqvDqvLDqvDqfwwwwwwwwfffvwwgvwwgvwwgvwwgvfffvwwwwwwwwgfffgwwwgwwwgwwwgwwwgfffwLwtftftfGfGftftOwOtwOtOtOODDD@D DIDDywDwDDDDDDDDDDDDDDDGDDwDODGDDGDGODtDwDwDDwIww DwGUUU666{{{UUUU6666{{{{qfLqwtqwMqfEqv6Dqv{KqvqvfffvwwwwwwwwfffvwwgvwwgvwwgvwwgvgfffwwwwwwwwgfffgwwwgwwwgwwwgwwwFGGFFFFFDDDDDUUD66D{{DUU66{{@@@DDDDDOOOtDtDtwDDmOwOGGDGDGGGGG{{{{{{{{{{{{{{{{{{{{{{{{{{{{{KqftqfKqwGqw{DwGq{{{fffvfffvwwwwwwwwwwwwwwwwgfffgfffwwwwwwwwwwwwwwwwftftwtwGwtADDADOt{{OOt{{OOt{{O${{"{{{{{{{{D@O@O@D@@@@DDOtmvwtfwwtfwwtvwwtvwwtmOOOOODDDDwDwDwDqDD(wwgtwwftwwfwwwgwwwgGDMMMM{{{{{{{{{{{{{{{{{{{{{{{{{K{{{{DDDDGt{KtGD"{{/"/"{{"{{{{l0+S~%SQR6_WOM'6)vw̪b fffwfffvffffffffffffffffffffwgffwwwwwwwwvwwwfwgfffffffffffffvwwwwwwwwwffwwffffffffvwwwwfvfw̜̩̜̙̙̪̙wywwwww\e\\U\\\e\\Umfm]eaamfm]e|g|fgfwwfvfwwvwwvwww|ww̜̩̩̩yw̜ww̜ww̜zwwwwwwwwwwwIDIvwfwIDDDtwwtDDIwDGDD&wfwgvwdwwwGwwwOrwvD"gw$.fw".fww\\\e\\U\\\eaamfm]eaamf||ggf|ff|ff|ffgff|fffgfffffffvgvwffwwfvwgfvwffwgfwwgfvwffffffwwfw̜z̗wfffwfw̩wIIaIvIvwofIOAi&Gi&qiwGiwivGififffbwbv".f".f"b&b&"B&""Dwwwwwwfvwwffffffvwwwwfwwww\\U\\\e\\U\m]eaamfm]eagf|fwffffffffwwffwwffffffffffffgfff|wwwwwwfwwffwwww<3̜̜̩̜LLDDDDDDDDDOIOItGIDDDDwwww̙̙̙̔<3D933wD2G"DGDDDDC3CCGG3G33G333<3<33\\e\\U\\\e3\amfm]eaamfm<<3<313<33331<3L1C1DDAA+"OOOtOOtOO"OOm"BttwDODDG"$OrOrDrDD$DD҈"-AD~BDD'wG'''OxBDD-DD433133DD33131<331333\U3S1S1SeQQQU]eaamfmmm3<<33331313<331331133<3313w+}G"DDDD"mv'wmvwfvwbffv$bffD$bfO$bOD$"w"ww'"wwwwvwwwfvwwffvwbffvOtGG"w'"www"wwwwwwwwB'׻UQUmUֻQUQUmmmmmmֻQUUUmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm]V]V+"+⻻+⻻""KDDDBDD"DB(B((B"(DDDD"DDODww$bffO$bfO$bO$GGfvwwffffݻ"UQUmUֽQUQUmmmmmmֻQUUUmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm]V]"+"&+bK"w$D"KD"ww"w"BD("D"BD("D".興GQUTGmmmmmmmbmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm]Vmmm]mmmmmmlfflllllllmaflffmfflfllmQUUlQUlQmlffUUUUUUUUUUUUQUUUQUUlQUQlUUUUUUUUUUUUUUUUUUUUUUUUUUUUQUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUfffffffU]UUUfVUUUUUU\UU\UUUUUIIDDD̙ݙODffffffflmmffffflfflfmffffflffmfflffflfafmfflfalflalQUUUQUUUUUaff!qUUQUff(afffffff\\]]UUyUUwUUwUUwUUUUUUUUwwwwIIIIIfqwwGIGAgA|FݗffƚƩƩƩffffmmffffflffflfffflfffflfflflflafaffflallalammmmfqfwmmfafawfffffQffV\\\\UUUUUUUUUUUUUUQUUĪIIII|wff"/"|FfGG""G"Giff̩̚̚̚ݚfffffmafffffllafffffflmafflllafffallafmammammmammmmmmmmmmmmmQUmUQmmQUQUUUUQUmmUUUUQffffffffffffffUUUUU]UUfVUEUUUUUUEDDDDDwDDDDDDDDDDTDDDGwGt~GTUř]DwDwGfffffffffffffllllmfafaaflllmafflflmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmUUUmmmmmmmmmmmmUUUmmmmmmmmmmmmmfff\UQUffUU\U%UUD\UEUUDUEUDB"&xBOOOtOtDtDODDtGGGO$f(.ffffmmlmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmVUffVU\U\UUU-\UEbUUD$UEOUDEEE'xB'rR$.UOrbU$]G}wwT}wwUmwwUmwwUmvwUfvUUmfUUfwwwwwwwwwwwwwwwwwwwwwwwwwwgfffffwwwwwwwwwwwwwwwwwwwwwwwffwgffffwwxBg'tg}Bf-B]DUEGGffGGmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm\UUUUUUUffUUUUUUUUEDDDDDDDDGfffVUUmVUU"VUUDQUUDVUUD\UUD\UUDUUEffff""""DDDDfff]"""RDDDTTTGGGUUDUUDUUDUUDUUDUUDUUDUUDGdfODmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmUUUUQUffVU\U\U\U\U""DD""""%".%.%.%.%.%.]UffVUUU\UUUUE\UUDUUEUUDUEUDEDGGGGUUEDUU%"TU%"TU%TU%TU%TU%GU%$"݈..ff.̈.̈.̈.̌0+S~%SQR6_WOM'6)vw̪ }www}wwwwwwU}wwU}wwUwwUU}UU}wwbwwgwxwwwׇxwwxwwQUUMQODDODDODUUUUUUUUUUUUUUUUQUUUUUUQUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAUUA!!"!!r"wD$O"xx.....QUUQUQUUUUUUUUUUUUUUUUU"BUU"UUUDUUUDQUUDUUEQUEUUDGGDDGDUU%~UUU}UUU}UUUUUUUUUUUUUUUUUUUw}}EUtDD$$O$O$QU"Q"(""("""(."UUUUUUUUUUUUQUUUQUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUffUDUAQADAADDBDDD$OGTtGUUUUUUDDDDzwwwzzDDDwwwwQUUUUQQQEDUDDUUDDUUUDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUtUEUUtUUtUUEGUUUDUUUDUUU%OO$$((((.(((((B(BB((BDDDDDODDDDDDDDDDDDDDDbObObObObfffmfwwfwwwvwwwvwwwvwwwvwwwfwwwfxGDgwwwwwwwUGGGDDDDDDDGUUAADD"DD/"D""""ODDOOUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU%UUU%UUU%UU!UU!U!!A$(((((((((((((GtObObObObObObObObfwwwfvwwfvwwfvwwfvwwfvwwfvwwfvwwwwwxwHwHtwHwxwGGDOOODGO""D.D///t/D/D.""""""""OOOOOOOOYYYYYUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUADMD"fD$DDDADODDODOOO$(􈈈BBBBBB(wtwGDwwwGDDDTUUObObObObObwwGbDDDUUUUfwwwfwwwvwwwvwwwvwwwvwwwfwwwmvwwwwwwwwwgwGGDwDwDDDUGUGQGOt""Ot""wD""DD'"UUt"UUtUAUt""""OOOUYUUUUUYUYUYUYUUUUUUUUUUUUUUUUUUUUUUUUUUUm"wfxvxwxwwwwwwwwwwww$$$$OO.O.RO"RU(..R.RU.RUURUUUUUUUUUUUDDTUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUfvwUffUUUUUUUUUUUUUUUUUUUUUUfxGDBDD]DDUEUUDUUDUUEUUUDtGGGITwDwwwDDDDDDDzzwwzwzwDDwwUUUUUUUYUUUUUYUUUUUUUUUUUUAUDUAUDAADDGwwxwwxwwxwwxwwxwwww'Rw]UGGTGTUTUU]UUUUUUUUUUUGRUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUUUEUUUUUUUUUUUUUUUUUUUUUUUUOO$D$DDx%"xU"U҈U%wR虙R.YYUUYUYUUUUUUUUUUUUUUUUUUUUUUUYUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAAA!BADADDDDGGGDG]UU]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"UU"UU%UUU"UUUUUU%UUUUUUUUxxx((BB"DDUQYUUUUUGQUQUGUUUUUUUUUUUUUUAADU!!"!"A"D""!"B!"B"B..興DOBG.DDT"RU|gg|f|gfgff\ewWfWUvWvWfWefVfVUmfm]eaamfmw]ewwww̜̩̜̩̙̜̙DD̙̚ɪD|̪̪|wwwgfffffgfff|wwwgfwffwfffffffffffffffgfff|wwwfffvffffffffffffffffffffffffffffwwwfvwfffffffffffffffffffffffffffvwwfvwwffwwfffwffffffffffffffffgff|fff|fffgfffffffffffffffffffvWwWwWevWfVUfVfVfVeavafmffmf]efafafmffwwwwwwwwvwwffvffwfwwwffwwww̩̩̜̜̜ww̜ww̜ww̜wwIIIwwwwIDODGGGy̪̩̙̙̙̔y̔ywwwg|̜̜yw̜ffiwwzywzywzffwwww̙w̩z̙yffffffffwwffwwfVfVUfVgV|We\\U\mf]efafafmfwm]eaffvwfffffffffvwwwgfwwffffvwwwwwwwwyw̩̩̩̩̩̩̩awavwofaAv|AvAvLofGGy̙̙̙̙̙̙̔UUUUUQ!"".yyw]QUQU""w̩̩yəyU!"3\\e\\U\\\e\amfm]eaamfm<<<̩̩̜̜̜̩̩3̜IIIIIII"/"/"DDD"""G"G.G̙̙̩̩̩̩9̩9<QQ3Q13Q!"!QUUUUUUUUUUUUUUUUUUUUU""""""UUUUUUUQUATtT.."QUATUUtTUUtTUUtTU<33133\U3S1S1SeQQQ]ea<a3mf1mmm3<<333313U3313<3113333131̙3<3<1DKDDII1ICIDDADDDDDwGDDDDDODDODDDwGtD434DDDwwGDw3̩3̙1<3D<<113333Q1Q1QUUUAUUtUUtUUtUUtQUtUtAtTAtTAtAtDtDDDDDGTDGQAGGGGATGGUDTUGUQQQQemmmemmmmmmmmmmmmmmmmmmmmmmmmmmmm]UUmmmmmmmmmmmmֱ]UUmmm]mmmmֻUUmm]UֻDDKDDDDDDtDOtDDOtOttGDDDGwGGGGDGGDDDK+D""+""+GDwwGDDD""""GADDDwwDDGDDeջeQֻQmQֻQmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmMFmmm-&mmm&DDODDO""DD""vw肈wD$mwwwmwwwmwwwmwwwmvwwffwGDwwwwwwwwwwwwwwwwwwgfwwffwwwwwwwwwwwwwwwwvwwwfwwgDG(wgMDwgM"wg-wgwwf}fև".w..費++DKD"++"肈肈.∈.費費..emֻemQֻQmmQֻQmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm-&mmm-"mmmm"mmm"D...wbww"bD""mmffffm-""FDDmMFmMFffffffff""""DDDDffffffff""""DDDDGGGG}-]""m-"xmm"".׻wx"""DD(DBKDKKDDGD$O"D"DGG0+S~%SQR6_WOM'6)vz̪ {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{y{{{{{{{{{{{{{y{{{{{{{{{{{{{{{{{{k7k7k՜7yk7|w|̙w̪̙ywə|w|www|wwwww|wwwwwwwwwww|{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{IDIIDDDOyDOO{{{{y{{{y{{{kywyywݑQwzwyyݡՑ̙w|w|www|wwwww|wwwwwwwwwww|w|www|www|wwww{{{{{{{{{{{{{{{{{{{{{{yy{{ww{{wwwwwwwwwwwwIGGGyyqљyy'yyyQ]U""Q""""."UU!UUUQUUU!"".""QUQ|w|www|wwwww|wwwwwwwwwww,!,!,!,!,!,B$,D/L/"""".肈肈xww肇x"̂w"̂"̂w|w|www|www|wwwww{{{{{{{{{{{{{{{{{{{{{{{{IIIIAAGGGUYUYUYUYUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUqwwqwwwwUUUcccUUUUccccL/Lt$D$D$DGEDDw(x(ww"x'"""""$""DGDDwG"w"|wwwf}"DDDGUwGdcDDDwUUUUccccUUUUcccc{{{{{{{{{{{{{{{{{{{{{{{{{IIID/"""""""""""/./""G"G"r"r"GrGGDwDDDDy{{DDwwGGDDDDDDUUUDD{DGG{G{KDD{{{{{{{{"{{$"GDDDD//{{{"'""+"""興.((.rDBDwD$DDDwGDODDwwDDDDwwGDGDDDDDGwG$GDDwG"wD$t{{{{{{}-}(}w"ww.ww{{{{{{{{{{{ww{{w׷{{{{{{{{{{{{{{{{{{{{{{{{{{{{G{{{DD{{{DDDDDDwwDDDDDJDDDtwwwDGDD{{{DDҲw'~./x/x""-B~.wy{{y{{DDDDwwww{B""O+"DDGDDDDwwGDDDDD/wDGGt{w"{."r{{{{{{{{{{UUU{"DDDfv+!v{UUUUwwwGDDDfffvwwwwwwwwUUUUD"""wwwwwwwg(wwwwUUUU"ffvvvmgggmfffwwwUUUUf{{ݷvv}{ggff}{ww{{UUUU{{{{{{{{{{{{{{{{{{KDGD{{DD{{DGD{KDGDOODDDDD/x/x("D"&"D$x(x(x("b"D""-BGDDDDDDDD{+$"DDDDDDDD貈r("GwGtDDD{{{{{{{D{{{{{{[W{{{[W{{{{[]]]Q]]]Q]]]W]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]{{{{{{{{{{{{{{{{{DD{DD+"""fffffffffODDODDDODD""""ffffffffffffDDDD"fvwwffwwffvwGGwwwwwwwwwwwwt{GtDGwwwwwwwwwwww{{DD{KGrKD}DD"G{GG{Gt{t{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{UUU{{WU{{[UWU{{[UWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwwwwwwwwwwwwwwqwwwqwwwwwwwwwww||||̜̩̜̇y̜w̜̙̙̪ɪ̪̪̚wwwwwwwwwwqqwwqwwqwwqqwqqqqqwqwwwwwwwwqqqqwqwwwwwqqqwqwqwwwq||||||x̜̩̩̩̩ywwwwIDtItItttDDDDODOO̪̪̪̪̚̚wqwwwwwwwwqqwwwwwqwwqqwqwwwqwwwqqwwww||||̩̩̩̩̩̩̜̜̎̈IIItttIIffgw|owowvoOOOwzwzwwww̪zwww̧̪wwwwwwqqqwwwwqwwwwwwqw|̈LtD̜̜̜̜̜̜̜̜IIttttIIOO//OOOOOO̪̪̪̪̪̪̪tOtOtDLDLDLOLOtO̜̜̜̩̩̩̩̩ttII""""""""""t".t".I'I'"O̪̪̪̪̪̪̪LDDtwwttLtttDDwwDDDOODDD̜̜̜̜̜̪ɪ̪̪̩̜tLDDLLLLtDDDDDDDDDOOODĩDDĩDD̩DD̩DD̩D̙Dɪɪ̪̚̚LLLtttLLOOODDDO$O$"DLtDDDDDLwwwttDDDDDDDDwwwwDDDDDDwGDDDODODODLDDDDDDDDD$,"$"""""""(((DDwLwtBDwDwDwwODOtDOtDOtDtODDDODDODDDD0+S~%SQR6_WOM'6)vw̪0+S~%SQR6_WOM'6)vw̪-- title: Eleni in Lode Runner -- author: Kendar Varnor -- desc: A remake of the famous game Lode Runner, made for the Gamecodeur Game Jam #34, in which we have to program a Lode Runner clone. -- script: lua -- Colors palette from PICO-8. -- Programing, graphics, sounds -- by Kendar Varnor. -- Original musics from -- Hyper Lode Runner on Game Boy -- remixed by Kendar Varnor. ------------------------------------- -- Collision function function collision( x1,y1,w1,h1, x2,y2,w2,h2) return x1+w1>x2 and x1y2 and y1=360 then b.state="active" b.state_time=0 end end end function level_draw() -- Draw each block for i,b in ipairs(block) do if b.state=="active"then spr(2, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) end if b.state=="inactive" then if b.state_time<=12 then spr(6, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) elseif b.state_time<=24 then spr(8, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) elseif b.state_time<=36 then spr(10, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) elseif b.state_time<=48 then spr(12, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) elseif b.state_time<=60 then spr(14, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) end if b.state_time<=312 then spr(14, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) elseif b.state_time<=324 then spr(12, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) elseif b.state_time<=336 then spr(10, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) elseif b.state_time<=348 then spr(8, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) elseif b.state_time<360 then spr(6, b.x+camera.x,b.y+camera.y, 0,1,0,0,2,2) end end end -- Draw each solid block for i,s_b in ipairs(solid_block) do spr(4, s_b.x+camera.x,s_b.y+camera.y, 0,1,0,0,2,2) end -- Draw each phantom block for i,ph_b in ipairs(phantom_block) do spr(44, ph_b.x+camera.x,ph_b.y+camera.y, 0,1,0,0,2,2) end -- Draw each ladder for i,lad in ipairs(ladder) do spr(40, lad.x+camera.x,lad.y+camera.y, 0,1,0,0,2,2) end -- Draw each rope for i,r in ipairs(rope) do spr(42, r.x+camera.x,r.y+camera.y, 0,1,0,0,2,2) end end ------------------------------------- -- Player functions function player_init() -- Player table player={} -- Player level data player.level=1 player.start_x=30*8 player.start_y=37*8 -- Player location player.x=player.start_x player.y=player.start_y player.w=16 player.h=24 -- Player hit box player.hit_x=player.x player.hit_y=player.y+8 player.hit_w=16 player.hit_h=16 -- Player hit box on rope player.hit_rope_x=player.x player.hit_rope_y=player.y player.hit_rope_w=16 player.hit_rope_h=16 -- Player speed player.speed=1 -- Player gravity player.gravity=2 -- Player direction player.to_left=false player.to_right=true player.to_up=false player.to_down=false -- Player states player.stand=true player.walk=false player.fall=false player.on_ladder=false player.on_rope=false player.dig_to_left=false player.dig_to_right=false player.hit=false player.hit_time=0 player.enter=false player.enter_time=0 -- Player anim player.walk_anim=0 player.fall_anim=0 player.on_ladder_anim=0 player.on_ladder_anim_yes=false player.on_rope_anim=0 player.on_rope_anim_yes=false player.dig_to_left_time=0 player.dig_to_right_time=0 -- Function for relocate the player function relocate_player() -- Change the starting location -- at level 1 if player.level==1 then player.start_x=30*8 player.start_y=37*8 end -- Change the starting location -- at level 2 if player.level==2 then player.start_x=86*8 player.start_y=37*8 end -- Change the starting location -- at level 3 if player.level==3 then player.start_x=142*8 player.start_y=37*8 end -- Change the starting location -- at level 4 if player.level==4 then player.start_x=218*8 player.start_y=37*8 end -- Change the starting location -- at level 5 if player.level==5 then player.start_x=32*8 player.start_y=81*8 end -- Change the starting location -- at level 6 if player.level==6 then player.start_x=88*8 player.start_y=73*8 end -- Change the starting location -- at level 7 if player.level==7 then player.start_x=140*8 player.start_y=81*8 end -- Change the starting location -- at level 8 if player.level==8 then player.start_x=210*8 player.start_y=81*8 end -- Change the starting location -- at level 9 if player.level==9 then player.start_x=16*8 player.start_y=127*8 end -- Change the starting location -- at level 10 if player.level==10 then player.start_x=80*8 player.start_y=125*8 end -- Change the starting location -- at level 11 if player.level==11 then player.start_x=138*8 player.start_y=125*8 end -- Change the starting location -- at level 12 if player.level==12 then player.start_x=216*8 player.start_y=125*8 end end -- Relocate the player at level 1 relocate_player() end function player_update() -- Set player tiles player.tile_x=math.floor(player.x/8) player.tile_y=math.floor(player.y/8) -- Anim the player walk player.walk_anim=player.walk_anim+1 if player.walk_anim>=30 then player.walk_anim=0 end -- Anim the player fall player.fall_anim=player.fall_anim+1 if player.fall_anim>=30 then player.fall_anim=0 end -- Anim the player on ladder if player.on_ladder_anim_yes==true then player.on_ladder_anim= player.on_ladder_anim+1 if player.on_ladder_anim>=30 then player.on_ladder_anim=0 end end -- Anim the player on rope if player.on_rope_anim_yes==true then player.on_rope_anim= player.on_rope_anim+1 if player.on_rope_anim>=30 then player.on_rope_anim=0 end end -- Anim the player enter if player.enter==true then player.enter_time= player.enter_time+1 end if player.enter_time>=90 then player.enter_time=0 player.enter=false end -- Player not on ladder if not on_ladder(player.x,player.y) then player.on_ladder=false end -- Player not on rope if not on_rope(player.x,player.y) then player.on_rope=false end -- Player fall to ground if player.on_ladder==false and player.hit==false then player.fall=true player.y=player.y+player.gravity for i,e in ipairs(enemy) do if collision( player.x,player.y, player.w,player.h, e.x,e.y,e.w,e.h) then if e.hit==true then player.y=e.y-16 end end end end -- Player on block for i,b in ipairs(block) do if collision( player.x,player.y, player.w,player.h, b.x,b.y,b.w,b.h) then if b.state=="active" and player.hit==false then player.fall=false player.y=b.y-player.h end if b.state=="inactive" and b.state_time>=348 then player.hit=true if player.hit_time%120==0 then sfx(6,"C-7",120,0,8) end end end end -- Player on solid block for i,s_b in ipairs(solid_block) do if collision( player.x,player.y, player.w,player.h, s_b.x,s_b.y,s_b.w,s_b.h) then player.fall=false player.y=s_b.y-player.h end end -- Player goes to LEFT if btn(2) and player.hit==false and player.enter==false then if player.walk_anim%30==0 then if player.fall==false and player.on_ladder==false and player.on_rope==false then sfx(1,"F#1",10,0,8) elseif player.fall==true and player.on_ladder==false and player.on_rope==false then sfx(4,"F-5",6,0,8) end if player.on_rope==true then sfx(2,"A-4",10,0,8) end end player.to_left=true player.to_right=false player.walk=true player.stand=false player.x=player.x-player.speed for i,b in ipairs(block) do if collision( player.x,player.y, player.w,player.h, b.x,b.y,b.w,b.h) then if b.state=="active" and player.hit==false then player.x=b.x+b.w end end end for i,s_b in ipairs(solid_block) do if collision( player.x,player.y, player.w,player.h, s_b.x,s_b.y,s_b.w,s_b.h) then player.x=s_b.x+s_b.w end end player.on_rope_anim_yes=true end -- Player goes to RIGHT if btn(3) and player.hit==false and player.enter==false then if player.walk_anim%30==0 then if player.fall==false and player.on_ladder==false and player.on_rope==false then sfx(1,"F#1",10,0,8) elseif player.fall==true and player.on_ladder==false and player.on_rope==false then sfx(4,"F-5",6,0,8) end if player.on_rope==true then sfx(2,"A-4",10,0,8) end end player.to_left=false player.to_right=true player.walk=true player.stand=false player.x=player.x+player.speed for i,b in ipairs(block) do if collision( player.x,player.y, player.w,player.h, b.x,b.y,b.w,b.h) then if b.state=="active" and player.hit==false then player.x=b.x-player.w end end end for i,s_b in ipairs(solid_block) do if collision( player.x,player.y, player.w,player.h, s_b.x,s_b.y,s_b.w,s_b.h) then player.x=s_b.x-player.w end end player.on_rope_anim_yes=true end -- Player goes to UP if btn(0) and player.hit==false and player.enter==false then if on_ladder(player.x,player.y) then if player.on_ladder_anim%30==0 then sfx(3,"F#4",10,0,8) end player.to_up=true player.to_down=false player.fall=false player.on_ladder=true player.on_ladder_anim_yes=true player.y=player.y-player.speed end for i,b in ipairs(block) do if collision( player.x,player.y, player.w,player.h, b.x,b.y,b.w,b.h) then if b.state=="active" and player.hit==false then player.y=b.y+b.h end end end for i,s_b in ipairs(solid_block) do if collision( player.x,player.y, player.w,player.h, s_b.x,s_b.y,s_b.w,s_b.h) then player.y=s_b.y+s_b.h end end end -- Player goes to DOWN if btn(1) and player.hit==false and player.enter==false then if not on_rope(player.x,player.y) then if player.on_ladder_anim%30==0 and player.on_ladder==true then sfx(3,"F#4",10,0,8) end player.to_up=false player.to_down=true player.fall=false player.on_ladder_anim_yes=true player.y=player.y+player.speed for i,b in ipairs(block) do if collision( player.x,player.y, player.w,player.h, b.x,b.y,b.w,b.h) then if b.state=="active" and player.hit==false then player.y=b.y-player.h end end end for i,s_b in ipairs(solid_block) do if collision( player.x,player.y, player.w,player.h, s_b.x,s_b.y,s_b.w,s_b.h) then player.y=s_b.y-player.h end end end if on_rope(player.x,player.y) then player.on_rope=false player.fall=true end end -- Player dig to left (X or Y) if btnp(7) and player.fall==false and player.on_ladder==false and player.on_rope==false and player.dig_to_left_time==0 and not btn(2) and not btn(3) and player.hit==false and player.enter==false then player.dig_to_left=true player.x= (math.floor(player.x/16))*16 for i,b in ipairs(block) do if b.x==player.x-16 and b.y==player.y+24 and b.state=="active" then b.state="inactive" sfx(5,"F-4",10,0,8) end end end -- Player dig to right (A or B) if btnp(5) and player.fall==false and player.on_ladder==false and player.on_rope==false and player.dig_to_right_time==0 and not btn(2) and not btn(3) and player.hit==false and player.enter==false then player.dig_to_right=true player.x= (math.ceil(player.x/16))*16 for i,b in ipairs(block) do if b.x==player.x+16 and b.y==player.y+24 and b.state=="active" then b.state="inactive" sfx(5,"F-4",10,0,8) end end end -- Player doesn't move if not btn(2) and not btn(3) then player.stand=true player.walk=false player.on_rope_anim_yes=false end -- Player doesn't climb on ladder if not btn(0) and not btn(1) then player.on_ladder_anim_yes=false end -- Player fall state if player.fall==true then if player.fall_anim%10==0 and player.on_rope==false and player.on_rope_anim_yes==false then sfx(4,"F-5",6,0,8) end player.stand=false player.walk=false player.on_rope=false end -- Player on ladder state if player.on_ladder==true then player.stand=false player.walk=false player.on_rope=false end -- Player on rope state if on_rope(player.x,player.y)==true then for i,r in ipairs(rope) do if collision( player.x,player.y, player.w,player.h, r.x,r.y,r.w,r.h) then player.on_rope=true player.fall=false player.y=r.y if btn(1) then player.y=r.y+r.h end end end end -- PLayer dig to left state if player.dig_to_left==true then player.dig_to_left_time= player.dig_to_left_time+1 player.stand=false player.walk=false end if player.dig_to_left_time>20 then player.dig_to_left_time=0 player.dig_to_left=false player.stand=true player.walk=true end -- PLayer dig to right state if player.dig_to_right==true then player.dig_to_right_time= player.dig_to_right_time+1 player.stand=false player.walk=false end if player.dig_to_right_time>20 then player.dig_to_right_time=0 player.dig_to_right=false player.stand=true player.walk=true end -- Player hit state if player.hit==true then player.hit_time=player.hit_time+1 player.stand=false player.walk=false player.fall=false player.on_ladder=false player.on_rope=false end -- Remove player hit state if player.hit_time>=120 then player.hit_time=0 player.hit=false player.stand=true music(0,0,0,true) player.x=player.start_x player.y=player.start_y life=life-1 del_enemies_in_map() add_enemies_in_map() end -- The player take a coin for i,c in ipairs(coin) do if collision( player.x,player.y, player.w,player.h, c.hit_x,c.hit_y, c.hit_w,c.hit_h) then if player.hit==false then sfx(0,"A-4",7,0,8) table.remove(coin,i) end end end -- The player enter in the door if collision( player.x,player.y, player.w,player.h, door.x,door.y, door.w,door.h) then if #coin==0 then player.enter=true if player.enter_time%90==0 then music() sfx(7,"F#2",75,0,8) end end end -- Relocate the player -- to the next level if player.enter_time>=88 then if player.enter_time==89 then player.level=player.level+1 end del_coins_in_map() add_coins_in_map() del_enemies_in_map() add_enemies_in_map() relocate_door() relocate_player() music(0,0,0,true) player.x=player.start_x player.y=player.start_y end -- Finish the game if player.level>12 then gamestate.value=12 player.level=1 life=64 music(1,0,0,true) end end function player_draw() -- Player stands to left if player.stand==true and player.to_left==true then great_sprite( 257,256, 273,272, 289,288, player.x,player.y,1) end -- Player stands to right if player.stand==true and player.to_right==true then great_sprite( 256,257, 272,273, 288,289, player.x,player.y,0) end -- Player walks to left if player.walk==true and player.to_left==true then if player.walk_anim<=10 then great_sprite( 259,258, 275,274, 291,290, player.x,player.y,1) elseif player.walk_anim<=20 then great_sprite( 261,260, 277,276, 293,292, player.x,player.y,1) else great_sprite( 263,262, 279,278, 295,294, player.x,player.y,1) end end -- Player walks to right if player.walk==true and player.to_right==true then if player.walk_anim<=10 then great_sprite( 258,259, 274,275, 290,291, player.x,player.y,0) elseif player.walk_anim<=20 then great_sprite( 260,261, 276,277, 292,293, player.x,player.y,0) else great_sprite( 262,263, 278,279, 294,295, player.x,player.y,0) end end -- Player falls to left if player.fall==true and player.to_left==true then if player.fall_anim<=10 then great_sprite( 265,264, 281,280, 297,296, player.x,player.y,1) elseif player.fall_anim<=20 then great_sprite( 267,266, 283,282, 299,298, player.x,player.y,1) else great_sprite( 269,268, 285,284, 301,300, player.x,player.y,1) end end -- Player falls to right if player.fall==true and player.to_right==true then if player.fall_anim<=10 then great_sprite( 264,265, 280,281, 296,297, player.x,player.y,0) elseif player.fall_anim<=20 then great_sprite( 266,267, 282,283, 298,299, player.x,player.y,0) else great_sprite( 268,269, 284,285, 300,301, player.x,player.y,0) end end -- Player is on ladder if player.on_ladder==true and player.on_rope==false then if player.on_ladder_anim<=15 then great_sprite( 307,308, 323,324, 339,340, player.x,player.y,0) else great_sprite( 309,310, 325,326, 341,342, player.x,player.y,0) end end -- Player on rope to left if player.on_rope==true and player.to_left==true then if player.on_rope_anim<=10 then great_sprite_long( 354,353,352, 370,369,368, player.x,player.y,1) elseif player.on_rope_anim<=20 then great_sprite_long( 357,356,355, 373,372,371, player.x,player.y,1) else great_sprite_long( 360,359,358, 376,375,374, player.x,player.y,1) end end -- Player on rope to right if player.on_rope==true and player.to_right==true then if player.on_rope_anim<=10 then great_sprite_long( 352,353,354, 368,369,370, player.x,player.y,0) elseif player.on_rope_anim<=20 then great_sprite_long( 355,356,357, 371,372,373, player.x,player.y,0) else great_sprite_long( 358,359,360, 374,375,376, player.x,player.y,0) end end -- Player dig to left if player.dig_to_left==true then great_sprite( 305,304, 321,320, 337,336, player.x,player.y,1) spr(322, player.x-8+camera.x, player.y+8+camera.y, 0,1,1) spr(338, player.x-8+camera.x, player.y+16+camera.y, 0,1,1) end -- Player dig to right if player.dig_to_right==true then great_sprite( 304,305, 320,321, 336,337, player.x,player.y,0) spr(322, player.x+16+camera.x, player.y+8+camera.y, 0,1,0) spr(338, player.x+16+camera.x, player.y+16+camera.y, 0,1,0) end -- Player is hit if player.hit==true then great_sprite( 270,271, 286,287, 302,303, player.x,player.y,0) end end ------------------------------------- -- Coin function function coin_init() -- Coin table coin={} -- Function for add a coin function create_coin(x,y) c={} c.x=x c.y=y c.w=16 c.h=16 c.hit_x=c.x+3 c.hit_y=c.y+3 c.hit_w=10 c.hit_h=10 c.anim=0 table.insert(coin,c) end -- Function for add all coins in map function add_coins_in_map() -- Add coins at level 1 if player.level==1 then create_coin(10*8,4*8) create_coin(48*8,12*8) create_coin(46*8,18*8) create_coin(16*8,32*8) create_coin(36*8,38*8) create_coin(50*8,32*8) end -- Add coins at level 2 if player.level==2 then create_coin(68*8,4*8) create_coin(66*8,12*8) create_coin(108*8,8*8) create_coin(78*8,22*8) create_coin(64*8,30*8) create_coin(90*8,20*8) create_coin(116*8,30*8) end -- Add coins at level 3 if player.level==3 then create_coin(126*8,6*8) create_coin(150*8,4*8) create_coin(152*8,12*8) create_coin(126*8,18*8) create_coin(176*8,22*8) create_coin(156*8,34*8) create_coin(168*8,38*8) end -- Add coins at level 4 if player.level==4 then create_coin(186*8,10*8) create_coin(202*8,10*8) create_coin(210*8,8*8) create_coin(218*8,10*8) create_coin(234*8,10*8) create_coin(192*8,18*8) create_coin(196*8,18*8) create_coin(192*8,28*8) create_coin(208*8,28*8) create_coin(212*8,28*8) create_coin(224*8,18*8) create_coin(228*8,18*8) create_coin(230*8,28*8) create_coin(212*8,38*8) end -- Add coins at level 5 if player.level==5 then create_coin(36*8,50*8) create_coin(2*8,58*8) create_coin(26*8,58*8) create_coin(8*8,66*8) create_coin(50*8,58*8) create_coin(46*8,66*8) create_coin(20*8,74*8) end -- Add coins at level 6 if player.level==6 then create_coin(66*8,50*8) create_coin(108*8,50*8) create_coin(78*8,58*8) create_coin(82*8,66*8) create_coin(90*8,52*8) create_coin(98*8,60*8) create_coin(100*8,60*8) create_coin(110*8,60*8) create_coin(96*8,66*8) create_coin(108*8,66*8) create_coin(70*8,70*8) create_coin(80*8,78*8) create_coin(96*8,82*8) create_coin(100*8,78*8) create_coin(104*8,76*8) create_coin(106*8,76*8) end -- Add coins at level 7 if player.level==7 then create_coin(140*8,58*8) create_coin(140*8,66*8) create_coin(172*8,52*8) create_coin(132*8,74*8) create_coin(156*8,70*8) create_coin(158*8,82*8) create_coin(170*8,74*8) end -- Add coins at level 8 if player.level==8 then create_coin(188*8,54*8) create_coin(188*8,64*8) create_coin(230*8,54*8) create_coin(230*8,64*8) create_coin(188*8,76*8) create_coin(210*8,76*8) create_coin(230*8,76*8) end -- Add coins at level 9 if player.level==9 then create_coin(26*8,106*8) create_coin(48*8,100*8) create_coin(34*8,106*8) create_coin(32*8,118*8) end -- Add coins at level 10 if player.level==10 then create_coin(70*8,98*8) create_coin(82*8,92*8) create_coin(98*8,94*8) create_coin(102*8,100*8) create_coin(70*8,118*8) create_coin(72*8,118*8) create_coin(116*8,106*8) create_coin(98*8,112*8) create_coin(94*8,118*8) create_coin(70*8,126*8) end -- Add coins at level 11 if player.level==11 then create_coin(126*8,94*8) create_coin(130*8,96*8) create_coin(168*8,96*8) create_coin(172*8,94*8) create_coin(146*8,106*8) create_coin(146*8,114*8) create_coin(150*8,102*8) create_coin(150*8,110*8) create_coin(150*8,118*8) create_coin(146*8,122*8) create_coin(150*8,126*8) end -- Add coins at level 12 if player.level==12 then create_coin(194*8,92*8) create_coin(206*8,92*8) create_coin(210*8,98*8) create_coin(236*8,96*8) create_coin(184*8,106*8) create_coin(188*8,106*8) create_coin(200*8,116*8) create_coin(220*8,106*8) create_coin(236*8,116*8) create_coin(236*8,116*8) create_coin(212*8,118*8) create_coin(224*8,118*8) create_coin(196*8,126*8) create_coin(220*8,126*8) end end -- Function for delete all coins function del_coins_in_map() for i=1,#coin do table.remove(coin,1) end end -- Add the first coins at level 1 add_coins_in_map() end function coin_update() -- Anim each coin for i,c in ipairs(coin) do c.anim=c.anim+1 if c.anim>=60 then c.anim=0 end end end function coin_draw() -- Draw each coin for i,c in ipairs(coin) do if c.anim<=15 then spr(32, c.x+camera.x,c.y+camera.y, 0,1,0,0,2,2) elseif c.anim<=30 then spr(34, c.x+camera.x,c.y+camera.y, 0,1,0,0,2,2) elseif c.anim<=45 then spr(36, c.x+camera.x,c.y+camera.y, 0,1,0,0,2,2) else spr(38, c.x+camera.x,c.y+camera.y, 0,1,0,0,2,2) end end end ------------------------------------- -- Door function function door_init() -- Door table door={} door.x=40*8 door.y=11*8 door.w=16 door.h=24 -- Function for relocate door function relocate_door() -- Relocate door at level 1 if player.level==1 then door.x=40*8 door.y=11*8 end -- Relocate door at level 2 if player.level==2 then door.x=114*8 door.y=13*8 end -- Relocate door at level 3 if player.level==3 then door.x=176*8 door.y=5*8 end -- Relocate door at level 4 if player.level==4 then door.x=184*8 door.y=3*8 end -- Relocate door at level 5 if player.level==5 then door.x=22*8 door.y=47*8 end -- Relocate door at level 6 if player.level==6 then door.x=100*8 door.y=51*8 end -- Relocate door at level 7 if player.level==7 then door.x=126*8 door.y=49*8 end -- Relocate door at level 8 if player.level==8 then door.x=210*8 door.y=53*8 end -- Relocate door at level 9 if player.level==9 then door.x=4*8 door.y=93*8 end -- Relocate door at level 10 if player.level==10 then door.x=112*8 door.y=99*8 end -- Relocate door at level 11 if player.level==11 then door.x=144*8 door.y=95*8 end -- Relocate door at level 12 if player.level==12 then door.x=234*8 door.y=95*8 end end -- Relocate the door at level 1 relocate_door() end function door_update() end function door_draw() -- Draw the door if #coin==0 then if player.enter_time<=30 then spr(64, door.x+camera.x,door.y+camera.y, 0,1,0,0,2,3) elseif player.enter_time<=60 then spr(66, door.x+camera.x,door.y+camera.y, 0,1,0,0,2,3) else spr(68, door.x+camera.x,door.y+camera.y, 0,1,0,0,2,3) end end end ------------------------------------- -- Enemy functions function enemy_init() -- Enemy table enemy={} -- Function for creating an enemy function create_enemy(x,y) e={} -- Enemy start location e.start_x=x e.start_y=y -- Enemy location e.x=e.start_x e.y=e.start_y e.w=16 e.h=24 -- Enemy direction e.to_left=false e.to_right=true e.to_up=false e.to_down=false -- Enemy speed e.speed=math.random(5,8)*0.1 -- Enemy gravity e.gravity=2 -- Enemy stand state e.stand=true -- Enemy walk state e.walk=false e.walk_anim=0 -- Enemy fall state e.fall=false e.fall_anim=0 -- Enemy on ladder state e.on_ladder=false e.on_ladder_anim=0 e.on_ladder_yes=false -- Enemy on rope state e.on_rope=false e.on_rope_anim=0 e.on_rope_anim_yes=false -- Enemy hit state e.hit=false e.hit_time=0 table.insert(enemy,e) end -- Function for add -- all enemies in map function add_enemies_in_map() -- Add enemies at level 1 if player.level==1 then create_enemy(12*8,17*8) create_enemy(48*8,17*8) create_enemy(30*8,23*8) end -- Add enemies at level 2 if player.level==2 then create_enemy(72*8,11*8) create_enemy(102*8,13*8) create_enemy(70*8,21*8) end -- Add enemies at level 3 if player.level==3 then create_enemy(136*8,11*8) create_enemy(152*8,19*8) create_enemy(160*8,25*8) end -- Add enemies at level 4 if player.level==4 then create_enemy(194*8,17*8) create_enemy(226*8,17*8) create_enemy(210*8,27*8) end -- Add enemies at level 5 if player.level==5 then create_enemy(50*8,49*8) create_enemy(4*8,57*8) create_enemy(32*8,73*8) end -- Add enemies at level 6 if player.level==6 then create_enemy(106*8,49*8) create_enemy(82*8,57*8) create_enemy(102*8,65*8) end -- Add enemies at level 7 if player.level==7 then create_enemy(148*8,49*8) create_enemy(126*8,57*8) create_enemy(160*8,51*8) end -- Add enemies at level 8 if player.level==8 then create_enemy(192*8,53*8) create_enemy(226*8,53*8) end -- Add enemies at level 9 if player.level==9 then create_enemy(8*8,95*8) create_enemy(42*8,101*8) create_enemy(42*8,127*8) end -- Add enemies at level 10 if player.level==10 then create_enemy(62*8,105*8) create_enemy(100*8,105*8) end -- Add enemies at level 11 if player.level==11 then create_enemy(124*8,93*8) create_enemy(174*8,93*8) end -- Add enemies at level 12 if player.level==12 then create_enemy(190*8,115*8) create_enemy(210*8,105*8) create_enemy(226*8,105*8) end end -- Function for delete all enemies function del_enemies_in_map() for i=1,#enemy do table.remove(enemy,1) end end -- Add the first enemies at level 1 add_enemies_in_map() end function enemy_update() for i,e in ipairs(enemy) do -- Update enemy speed e.speed=math.random(3,8)*0.1 -- Anim the enemy walk e.walk_anim=e.walk_anim+1 if e.walk_anim>=30 then e.walk_anim=0 end -- Anim the enemy fall e.fall_anim=player.fall_anim+1 if e.fall_anim>=30 then e.fall_anim=0 end -- Anim the enemy on ladder if e.on_ladder_anim_yes==true then e.on_ladder_anim=e.on_ladder_anim+1 if e.on_ladder_anim>=30 then e.on_ladder_anim=0 end end -- Anim the enemy on rope if e.on_rope_anim_yes==true then e.on_rope_anim=e.on_rope_anim+1 if e.on_rope_anim>=30 then e.on_rope_anim=0 end end -- Enemy not on ladder if not on_ladder(e.x,e.y) then e.on_ladder=false end -- Enemy not on rope if not on_rope(e.x,e.y) then e.on_rope=false end -- Enemy fall if e.on_ladder==false then e.stand=false e.walk=false e.fall=true e.y=e.y+e.gravity end -- Enemy on block for i,b in ipairs(block) do if collision( e.x,e.y,e.w,e.h, b.x,b.y,b.w,b.h) then if b.state=="active" then e.fall=false e.y=b.y-e.h end if b.state=="inactive" then e.fall=true e.hit=true e.x=b.x e.y=b.y-8 end end end -- Enemy on solid block for i,s_b in ipairs(solid_block) do if collision( e.x,e.y,e.w,e.h, s_b.x,s_b.y,s_b.w,s_b.h) then e.fall=false e.y=s_b.y-e.h end end -- Enemy on Eleni if collision( e.x,e.y,e.w,e.h, player.x,player.y, player.w,player.h) then if e.hit==false then player.hit=true end if player.hit==true and player.hit_time%120==0 then sfx(6,"C-7",120,0,8) end end -- Enemy on rope on Eleni on rope if e.on_rope==true and player.on_rope==true then if collision( e.x,e.y,e.w+8,e.h-8, player.x,player.y, player.w+8,player.h-8) then if e.hit==false then player.hit=true end end end -- Enemy goes to LEFT if e.x>player.x and player.hit==false and player.enter==false and e.hit==false then e.to_left=true e.to_right=false e.to_up=false e.to_down=false e.stand=false e.walk=true e.x=e.x-e.speed for i,b in ipairs(block) do if collision( e.x,e.y,e.w,e.h, b.x,b.y,b.w,b.h) then if b.state=="active" then e.x=b.x+b.w end end end for i,s_b in ipairs(solid_block) do if collision( e.x,e.y,e.w,e.h, s_b.x,s_b.y,s_b.w,s_b.h) then e.x=s_b.x+s_b.w end end end -- Enemy goes to RIGHT if e.x<=player.x and player.hit==false and player.enter==false and e.hit==false then e.to_left=false e.to_right=true e.to_up=false e.to_down=false e.stand=false e.walk=true e.x=e.x+e.speed for i,b in ipairs(block) do if collision( e.x,e.y,e.w,e.h, b.x,b.y,b.w,b.h) then if b.state=="active" then e.x=b.x-e.w end end end for i,s_b in ipairs(solid_block) do if collision( e.x,e.y,e.w,e.h, s_b.x,s_b.y,s_b.w,s_b.h) then e.x=s_b.x-e.w end end end -- Enemy on ladder if on_ladder(e.x,e.y) then e.stand=false e.walk=false e.on_ladder=true e.on_ladder_anim_yes=true -- Enemy goes to LEFT on ladder if e.x>player.x then e.to_left=true e.to_right=false e.to_up=false e.to_down=false e.x=e.x-e.speed end -- Enemy goes to RIGHT on ladder if e.x<=player.x then e.to_left=false e.to_right=true e.to_up=false e.to_down=false e.x=e.x+e.speed end -- Enemy goes to UP on ladder if e.y>player.y then e.to_left=false e.to_right=false e.to_up=true e.to_down=false e.y=e.y-e.speed for i,b in ipairs(block) do if collision( e.x,e.y,e.w,e.h, b.x,b.y,b.w,b.h) then if b.state=="active" then for i,lad in ipairs(ladder) do if collision( e.x,e.y,e.w,e.h, lad.x,lad.y,lad.w,lad.h) then e.x=lad.x end end end end end for i,s_b in ipairs(solid_block) do if collision( e.x,e.y,e.w,e.h, s_b.x,s_b.y,s_b.w,s_b.h) then for i,lad in ipairs(ladder) do if collision( e.x,e.y,e.w,e.h, lad.x,lad.y,lad.w,lad.h) then e.x=lad.x end end end end end -- Enemy goes to DOWN on ladder if e.y<=player.y then e.to_left=false e.to_right=false e.to_up=false e.to_down=true e.y=e.y+e.speed for i,b in ipairs(block) do if collision( e.x,e.y,e.w,e.h, b.x,b.y,b.w,b.h) then if b.state=="active" then for i,lad in ipairs(ladder) do if collision( e.x,e.y,e.w,e.h, lad.x,lad.y,lad.w,lad.h) then e.x=lad.x end end end end end for i,s_b in ipairs(solid_block) do if collision( e.x,e.y,e.w,e.h, s_b.x,s_b.y,s_b.w,s_b.h) then for i,lad in ipairs(ladder) do if collision( e.x,e.y,e.w,e.h, lad.x,lad.y,lad.w,lad.h) then e.x=lad.x end end end end end -- If the player not on ladder if player.on_ladder==false then if player.y<=e.y and e.y<=player.y+4 then e.y=e.y-6 end end end -- Enemy on rope if on_rope(e.x,e.y) then e.stand=false e.walk=false e.fall=false e.on_rope=true e.on_rope_anim_yes=true for i,r in ipairs(rope) do if collision( e.x,e.y,e.w,e.h, r.x,r.y,r.w,r.h) then e.y=r.y if player.on_rope==false then e.on_rope=false e.y=r.y+8 end end end end -- Enemy fall state if e.fall==true then e.stand=false e.walk=false e.on_ladder=false e.on_rope=false end -- Enemy hit state if e.hit==true then e.hit_time=e.hit_time+1 e.stand=false e.walk=false e.fall=false end -- Remove enemy hit state if e.hit_time>=300 then e.hit_time=0 e.hit=false e.stand=true e.hit=false e.x=e.start_x e.y=e.start_y end end end function enemy_draw() for i,e in ipairs(enemy) do -- Enemy stands to left if e.stand==true and e.to_left==true then great_sprite( 113,112, 129,128, 145,144, e.x,e.y,1) end -- Enemy stands to right if e.stand==true and e.to_right==true then great_sprite( 112,113, 128,129, 144,145, e.x,e.y,0) end -- Enemy walks to left if e.walk==true and e.to_left==true then if e.walk_anim<=10 then great_sprite( 115,114, 131,130, 147,146, e.x,e.y,1) elseif e.walk_anim<=20 then great_sprite( 117,116, 133,132, 149,148, e.x,e.y,1) else great_sprite( 119,118, 135,134, 151,150, e.x,e.y,1) end end -- Enemy walks to right if e.walk==true and e.to_right==true then if e.walk_anim<=10 then great_sprite( 114,115, 130,131, 146,147, e.x,e.y,0) elseif e.walk_anim<=20 then great_sprite( 116,117, 132,133, 148,149, e.x,e.y,0) else great_sprite( 118,119, 134,135, 150,151, e.x,e.y,0) end end -- Enemy falls to left if e.fall==true and e.to_left==true then if e.fall_anim<=10 then great_sprite( 121,120, 137,136, 153,152, e.x,e.y,1) elseif e.fall_anim<=20 then great_sprite( 123,122, 139,138, 155,154, e.x,e.y,1) else great_sprite( 125,124, 141,140, 157,156, e.x,e.y,1) end end -- Enemy falls to right if e.fall==true and e.to_right==true then if e.fall_anim<=10 then great_sprite( 120,121, 136,137, 152,153, e.x,e.y,0) elseif e.fall_anim<=20 then great_sprite( 122,123, 138,139, 154,155, e.x,e.y,0) else great_sprite( 124,125, 140,141, 156,157, e.x,e.y,0) end end -- Enemy on ladder if e.on_ladder==true then if e.on_ladder_anim<=15 then great_sprite( 160,161, 176,177, 192,193, e.x,e.y,0) else great_sprite( 162,163, 178,179, 194,195, e.x,e.y,0) end end -- Enemy on rope to left if e.on_rope==true and e.to_left==true then if e.on_rope_anim<=10 then great_sprite_long( 166,165,164, 182,181,180, e.x,e.y,1) elseif e.on_rope_anim<=20 then great_sprite_long( 169,168,167, 185,184,183, e.x,e.y,1) else great_sprite_long( 172,171,170, 188,187,186, e.x,e.y,1) end end -- Enemy on rope to right if e.on_rope==true and e.to_right==true then if e.on_rope_anim<=10 then great_sprite_long( 164,165,166, 180,181,182, e.x,e.y,0) elseif e.on_rope_anim<=20 then great_sprite_long( 167,168,169, 183,184,185, e.x,e.y,0) else great_sprite_long( 170,171,172, 186,187,188, e.x,e.y,0) end end -- Enemy is hit if e.hit==true then great_sprite( 126,127, 142,143, 158,159, e.x,e.y,0) end end end ------------------------------------- -- Gamestate functions function gamestate_init() -- Gamestate table gamestate={} gamestate.value=0 gamestate.blink=0 gamestate.language="french" end function gamestate_update() -- Anim the start game value gamestate.blink=gamestate.blink+1 if gamestate.blink>=120 then gamestate.blink=0 end -- Update title screen if gamestate.value==0 then sync(2,1,false) music() if btnp(4) then gamestate.value=1 end -- Update scene 1 elseif gamestate.value==1 then if btnp(2) then if gamestate.language=="french" then gamestate.language="english" elseif gamestate.language== "english" then gamestate.language="french" end elseif btnp(3) then if gamestate.language=="french" then gamestate.language="english" elseif gamestate.language== "english" then gamestate.language="french" end end if btnp(4) then gamestate.value=2 music(1,0,0,true) end -- Update scene 2 elseif gamestate.value==2 then sync(2,2,false) if btnp(4) then gamestate.value=3 end -- Update scene 3 elseif gamestate.value==3 then if btnp(4) then gamestate.value=4 end -- Update scene 4 elseif gamestate.value==4 then sync(2,2,false) if btnp(4) then gamestate.value=5 end -- Update scene 5 elseif gamestate.value==5 then if btnp(4) then gamestate.value=6 end -- Update scene 6 elseif gamestate.value==6 then sync(2,3,false) if btnp(4) then gamestate.value=7 end -- Update scene 7 elseif gamestate.value==7 then if btnp(4) then gamestate.value=8 end -- Update scene 8 elseif gamestate.value==8 then sync(2,3,false) if btnp(4) then gamestate.value=9 music() end -- Update scene 9 elseif gamestate.value==9 then if btnp(4) then gamestate.value=10 music(0,0,0,true) end -- Update scene 10 (game) elseif gamestate.value==10 then sync(2,0,false) -- Update scene 11 (game over) elseif gamestate.value==11 then sync(2,4,false) if btnp(4) then gamestate.value=0 end -- Update scene 12 (ending) elseif gamestate.value==12 then sync(2,4,false) if btnp(4) then gamestate.value=13 end -- Update scene 13 (ending) elseif gamestate.value==13 then sync(2,5,false) if btnp(4) then gamestate.value=14 end -- Update scene 14 (ending) elseif gamestate.value==14 then sync(2,5,false) if btnp(4) then gamestate.value=0 end end end function gamestate_draw() -- Draw title screen if gamestate.value==0 then -- Draw title spr(256,24,8,0,1,0,0,8,6) spr(352,88,8,0,1,0,0,8,6) -- Draw Eleni spr(264,168,8,0,1,0,0,8,16) -- Draw start game if gamestate.blink<=80 then print("Press Z to play", 32,88,7) print("[Controller button A]", 18,96,7) end -- Draw credits print("LODE RUNNER by Broderbund", 4,112,13) print("@ 1983 Douglas E. Smith", 16,120,13) print("@ 2021 Kendar Varnor", 20,128,13) -- Draw scene 1 elseif gamestate.value==1 then print("Choose language", 78,8,7) if gamestate.language=="french" then spr(480,72,24,0,1,0,0,4,2) spr(452,136,24,0,1,0,0,4,2) print("Se deplacer",93,48,12) print("Fleches [clavier]",20,56,7) print(" ou ",111,56,14) print("Fleches [manette]",133,56,7) print("Creuser a gauche",75,72,12) print("S [clavier]",55,80,7) print(" ou ",111,80,14) print("Y [manette]",133,80,7) print("Creuser a droite",75,96,12) print("X [clavier]",55,104,7) print(" ou ",111,104,14) print("B [manette]",133,104,7) elseif gamestate.language== "english" then spr(448,72,24,0,1,0,0,4,2) spr(484,136,24,0,1,0,0,4,2) print("To move",102,48,12) print("Arrows [keyboard]",15,56,7) print(" or ",111,56,14) print("Arrows [joystick]",133,56,7) print("Dig to left",92,72,12) print("S [keyboard]",45,80,7) print(" or ",111,80,14) print("Y [joystick]",133,80,7) print("Dig to right",92,96,12) print("X [keyboard]",45,104,7) print(" or ",111,104,14) print("B [joystick]",133,104,7) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 2 elseif gamestate.value==2 then spr(256,56,8,0,1,0,0,16,8) if gamestate.language=="french" then print("Eleni veut acheter", 71,84,7) print("de nouvelles chaussures.", 53,92,7) elseif gamestate.language== "english" then print("Eleni wants to buy", 72,84,7) print("new shoes.", 93,92,7) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 3 elseif gamestate.value==3 then if gamestate.language=="french" then print("Un jeu de Kendar Varnor", 56,40,12) print("Inspire par LODE RUNNER", 57,56,12) print("Pour la Gamecodeur Jam #34", 48,72,12) elseif gamestate.language== "english" then print("A game by Kendar Varnor", 56,40,12) print("Inspired by LODE RUNNER", 57,56,12) print("For the Gamecodeur Jam #34", 46,72,12) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 4 elseif gamestate.value==4 then spr(384,56,8,0,1,0,0,16,8) if gamestate.language=="french" then print("Mais Eleni n'a pas assez", 58,84,7) print("pour payer ces chaussures.", 47,92,7) elseif gamestate.language== "english" then print("But Eleni doesn't have enough", 41,84,7) print("to pay for these shoes.", 57,92,7) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 5 elseif gamestate.value==5 then if gamestate.language=="french" then print("Programmation,", 83,24,12) print("graphismes", 92,32,12) print("et sons", 100,40,12) print("par", 112,56,12) print("Kendar Varnor", 83,72,7) elseif gamestate.language== "english" then print("Programming,", 88,24,12) print("graphics", 98,32,12) print("and sounds", 92,40,12) print("by", 114,56,12) print("Kendar Varnor", 84,72,7) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 6 elseif gamestate.value==6 then spr(256,56,8,0,1,0,0,16,8) if gamestate.language=="french" then print("Eleni a entendu parle", 63,84,7) print("d'une mysterieuse tour", 60,92,7) print("remplie de pieces d'or.", 62,100,7) elseif gamestate.language== "english" then print("Eleni heard about", 74,84,7) print("a mysterious tower", 71,92,7) print("filled with gold coins.", 63,100,7) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 7 elseif gamestate.value==7 then if gamestate.language=="french" then print("Musiques originales", 70,16,12) print("issues de", 96,24,12) print("Hyper Lode Runner", 72,32,12) print("sur Game Boy", 87,40,12) print("et remixees par", 81,56,12) print("Kendar Varnor", 84,72,7) elseif gamestate.language== "english" then print("Original musics", 86,16,12) print("from", 113,24,12) print("Hyper Lode Runner", 76,32,12) print("on Game Boy", 94,40,12) print("and remixed by", 84,56,12) print("Kendar Varnor", 84,72,7) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 8 elseif gamestate.value==8 then spr(384,56,8,0,1,0,0,16,8) if gamestate.language=="french" then print("Mais cette tour est protegee", 42,84,7) print("par d'etranges gardes.", 60,92,7) elseif gamestate.language== "english" then print("But this tower is protected", 47,84,7) print("by mysterious guards.", 63,92,7) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 9 elseif gamestate.value==9 then if gamestate.language=="french" then print("Pret ?", 104,60,12) elseif gamestate.language== "english" then print("Ready ?", 104,60,12) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 11 (game over) elseif gamestate.value==11 then music() spr(256,56,8,0,1,0,0,16,8) print("Game over",95,84,7) if gamestate.blink<=80 then print("Press Z to play again", 120,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 12 (ending) elseif gamestate.value==12 then spr(384,56,8,0,1,0,0,16,8) if gamestate.language=="french" then print("Eleni a enfin obtenu", 68,84,7) print("assez d'or.", 92,92,7) elseif gamestate.language== "english" then print("Eleni finally got", 77,84,7) print("enough gold.", 84,92,7) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 13 (ending) elseif gamestate.value==13 then spr(256,56,8,0,1,0,0,16,8) if gamestate.language=="french" then print("Elle peut enfin s'acheter", 53,84,7) print("ses nouvelles chaussures.", 50,92,7) elseif gamestate.language== "english" then print("She can finally buy", 69,84,7) print("her new shoess.", 76,92,7) end if gamestate.blink<=80 then print("Press Z to continue", 128,120,13) print("[Controller button A]", 120,128,13) end -- Draw scene 14 (ending) elseif gamestate.value==14 then if gamestate.language=="french" then print("Merci d'avoir joue",16,8,7) print("avec Eleni.",36,16,7) print("Mes autres jeux :",17,56,7) elseif gamestate.language== "english" then print("Thanks for playing",16,8,7) print("with Eleni.",36,16,7) print("My other games at",17,56,7) end spr(389,136,8,0,1,0,0,11,8) spr(384,51,68,0,1,0,0,4,4) print("kendar-varnor.itch.io", 8,100,12) if gamestate.blink<=80 then print("Press Z to play again", 120,120,13) print("[Controller button A]", 120,128,13) end end end ------------------------------------- -- UI functions function ui_init() life=64 end function ui_update() if life<=0 then gamestate.value=11 player.level=1 life=64 end end function ui_draw() -- Draw the ui background rect(0,0,240,8,8) rect(0,8,240,1,2) -- Draw the mini Eleni spr(311,0,0,0) print(" = ",9,2,2) print(" = ",8,1,7) print(life,21,2,2) print(life,20,1,7) -- Draw the mini coin spr(312,48,0,0) print(" = ",57,2,2) print(" = ",56,1,7) print(#coin,69,2,2) print(#coin,68,1,7) -- Draw the mini enemy spr(315,88,0,0) print(" = ",97,2,2) print(" = ",96,1,7) print(#enemy,109,2,2) print(#enemy,108,1,7) -- Draw the level value print("LEVEL = ",145,2,2) print("LEVEL = ",144,1,7) print(player.level,190,2,2) print(player.level,189,1,7) print(" / 12",199,2,2) print(" / 12",198,1,7) -- Draw the mini door if #coin==0 then spr(313,231,0,0) else spr(314,231,0,0) end end ------------------------------------- -- Init functions gamestate_init() level_init() player_init() coin_init() door_init() enemy_init() ui_init() ------------------------------------- -- Gameloop function TIC() -- Clear screen if gamestate.value==10 then cls(0) else cls(1) end -- Update functions gamestate_update() if gamestate.value==10 then level_update() player_update() coin_update() door_update() enemy_update() ui_update() end -- Draw functions gamestate_draw() if gamestate.value==10 then level_draw() door_draw() coin_draw() enemy_draw() player_draw() ui_draw() end -------- --for j=0,17 do -- for i=0,30 do -- rect(i*8,j*8,1,1,10) -- end --end end