`,]']>S}Wup8d%qy)6o;]AsVl3S}Wup8d%qy)6o;]AsVl3 ! >NN4L....2".3C   "2"""""!"""!""""""""""""""""""""""""""""""""ffffffffffffffffffffffffffffffff"""""""""""""""""""""""""""""""" nnn̻̼̻̼̻̼˪˻ /333#""#33######""   `UeUVeUeUfeeeVfvUvwegppUvgUeUeUUeUeeeeevvevwwvpppgUUUUVVeggfUpveVwpVU`feppVUwgVp`pp`pvppgwVpgUwVgpv`wgwvVvU^nn`p`^opn`non Pe^f `Pe^f^n_ o003030"#"#""""""""""""""""evwUeVfpUUwevwUevVvpUegpvVUgegpVUwgVwpUU`feppVUwgVpPUgegwvpwpgvppewUvewvpgP]e^fnnP``Pe^f^n`P^n̻̼  ] P""""""""""""""""""""""""""""""""evwUeVfpUeweVgUfvvVeeU`UUUpppv`pgwpwpgVggVVVVVUVUUVUVpVUpvgUvVwpgUgfeVVVfUVUVeUVUppg`v`pVvpvP`peWvpvPPpePPppfgupupvPvPfeuwPP̛̻̼̜̬ˬ̙̙̼̻̚ʼʻ! 'q !'!'!q!   ໮໮໮໮ļ333;3!""""""""""""""""""""""ʼܼ̬̬ݻ ݿ ݰݭ ̻ݮ˼    ̼̻˻̫ ̫ ̼̼˻ ̺̠̪̰ !  ݭ ʫ     04C#0 ̻ ̫ ̼̻ ̻ ̠ ˠ̺̠ ˈݩݩݩݨ݈݈݀ݭݭݪݭݪppg`v`p   @2B#42#"12 34 ##DB#31""!   #C"3#C"!"1" 13C " ̼ ˻ ̼ ˺ ̻̼ ̠ ˪̺˻ P P \P`P`U`UpP ^_^oo    03#@424L#3$C##C2"02##" "#4 44 #2!!C !C!!C!2!" !!""C# #@0 4B# #@@ 4 # 3BB22C 3 "B  "3 4 """423!0"C2 !""3!2$D22!!C !3#!"2#!C2$#" !!"  ݻ //??!2"2  12!<2C4A@02CC20, , 4B002CC20, , 4 B 0  ,=  .  *ʬ A$ A!  2" 3#C#2#    2# /4C < <4C/  2#"C3#23C$ #D 22PUeeUVVVPf0333300000330000Y P \Y`Y`U`UpPYi Y Y`YeVi`ip //?? //?? //?? //?? //?? //?? //?? //??0000C30D4D  ffffffffffffffffff ` `fffffffffffff,U!U2""  12!<2C4APU!U2""  11##<C41@52UCCS20R, P, S30SBCR52U ,=  *ʬ f``f`A$ A!`ff`fffff``fffA`$ A!`ff`fffff``ffAf$fA`!!`f`2#    /4C < <4C/  2#"C3#23C$ #D 22  2#"C3#23C$ #D2"#"2 PUUeffUPUeeUVVVPfUU˻ʻ˪˼\UUŵU˛[ɹZY[\ʛZU ˼ f``f ` ` ff`ffff ː ˼ ˻ˬ ̼ fffff"""6333DDDDDDDD`f`ffff"""`336DD`DDFD`ff ffff"""`333DDDDDD f `f ff ffff&"""3333DDDDDD`F f f fffff"&"333D@DDD@DD ffff""""3333DDDDDD`ffffffffff&""`333FDDDDDDD` f`fffff&""3033D@DDD@D ffff"`""633`DDDFDDD f`f ffffff"`"`33DDDDDD fffff""f33``DfDf f f fDD`DDD`fDD`f33333333f"""ffffDDDDDD333333"`&"ffffffDfFDfDD333`33f`f"ffffffDDDDDDDDDDD33333303`""`&ffffFD`FD`FD6333033`"&"ffffFDD@fFD@fFD@33303330""fffffD`fFD`fDD`FD33333333"""`ffffD@DD@DD@D63`63f&""ffffDffDfFDfD33333333&""ffffDDDDDDD3`363`&""`ffffDDfDDfFDff3ff3ffff"fffff                                   cBdEE E E E E EEPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPrp:9J:9J:9J:9PPPPPPrp:9;J:9;J:9;J:9;;J:9YYYYYPPPPPPrp9;J:9;J:9;J:9;9;J9;J\[YYYYYYYY[PPPPPPrp;J9;J9;J9;KII\IKIIIIKIIIIKIIIIK\YYYYYYYY[PPPPPPrpIIIKIIIIKIIIIKIIIIiiiiiiiiiJ\9J:9J:9J:9J\[YYYYY[[PPPPPPrp:9JSyyyS:9J:9SyyyyySJ:\;J:9;J:9;J:9;J\YYYY[PPPPPPrp:9;J:9;J:9;SSJ:9\J:9;J:9;J:9YYY[PPPPPPrp9;񍓓9;J:9;iiSS~~J9;\J9;J9;J9;Z[YYPPPPPPrp;J9;J9;SyySyyySKII~~~IKIIIIKIIIIKIYY[PPPPPPrQQQQIIIKIIIIKIIIIJ~~~iii:9J:9YZYPPPPPPsaaab􍓓J:hhhhhhhhhhhhhhhhhhhhhh9;J:9;YZPPPPPPqqqqreffgiiiiiJ:9xxxxxxxxxxxxxxxxxxxxxxhhhhhhhhYYPPPPPPqqqqruvvwiiiJ9;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiPPPPPPqqqqsaaabuvvw`b`aaSKIISPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP:9J:9J:9J:9JEEEEJEEEEPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP:9;J:9;J:9;J:9;J~~[YYYYYYYYYYYYYYY[\J:9J:9;J:9J:9J~\\~JJ[YYYYYYYYJ:9J9;J:9JYYY[PPPPPP:9;J:9;J:9;J:9;JS~~[[YYY[[YYYYYYY[\J:9;J:9;J:9;J:9;:9J:9;J:~\\~J:9;J:9J:J[[YYYY[[YYYJ:9;:9;J:9;JY[PPPPPP9;J9;J9;J9;J~~YY[[[YYYY[\J9;J9;J9;J9;J9;J9;J9~\\~J9;J9;J9J[[YYYYY[J9;J9;J9;J[YYY[\\\PPPPPPIIIIKIIIIKIIIIKIIIIK~~[Y[YYY\JIIIIKIIIIKIIIIKIIIIKIIIIKIIIIKI~\\~KIIIIKIIIIKIIIKY[[ZY[KIIIIKIIIIKIIIIK[YY\\\PPPPPP:9J:9J:9J:9JS~~ZYYYS\J:9J:9J:9J:9J:9J:9J~\\~J:9J:9J9JZYYYJ:9J:9J:9JY[\PPPPPP:9;J:9;J:9;J:9;J~~SZYYYY~J:9;J:9;J:9;J:9;J:9;J:9;J~\\~J:9;J:9;J:;JYYZY[J:9;J:9;J:9;JY\PPPPPP:9;J:9;J:9;J:9;Jiiiiii~YY[YY~J9;J:9;J:9;J:SyyyyySJ:~\\~J:9SyyyySJ:Y[YYJ:9;J:9;:9;JY\\PPPPPP9;J9;J9;J9;J~YYYY~~~J;J9;J9;J9J9~\\~J9;J9YZZYYZJ9;J9;J9;JY\\\PPPPPPIIIIKIIIIKIIIIKIIIIKSYY~Z~~JIIIKIIIIKIIIIKIIKISSKIIIKIIIIK\\YYZZYYYYZKIIIIKIIIIKIIIIKZY\\\\PPPPPP:9J:9J:9J:9JYYYY[[~ZYY~Y~~JSyyyyS:9J:9J9J~~J9J:9J\\ZYYJ:9J:9JZYY\\\\\PPPPPP:9;J:9;J:9;J:9;JYYY[~YYY~YZ~~Jiii9iii;J~~J:;J:9;J\\YYYJ::9;J\\\\\\\\PPPPPP:9;J:9;J:9;J:9;JYYY~ZYhhhhhhhJ:~~J:9hhhhhhhhhhhhhiiiPPPPPP9;J9;J9;J9;JYY[~YYiiiiiiiiiixxxxxxxxxxxxxiiiiiiiiPPPPPPIIIIKIIIIKIIIIKIIIIKYYPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPEYEEBcBuvvvCvvvvvvvvvvvvvvvpDDDDPPPPY[YYYYYY[[YYYYYYYYY[ruvvvvvvvvvvvvvvvvvvvpPPPPYYYY[[[[[YYYYYY[jkvlmjkpPPPPYYY[[YYY[[\{v|}z{PPPPY[YYYYYYYYY[YYY\zzHWWWXPPPPYYYYYY[[Y[YY\`aab7HFHWWWPPPPYZ~[YY[~[[YYY[YYYZbQQQQQQQpsabWWWWXVWWWXHFPPPPYYZ~Y[~~[YYYY~YZZYY[[ZYYYZrprFWWXWWHHFWPPPPSYY~[~~[YY[~YYZYY[YYhhhhhhhhr`trQQQQ`abVHHHFWXXVWHFPPPP~~~ZY[~[YYYYZZYYZxxxxxxxxr`aaatrprFHFWWXFWWXFHFWWXFHVPPPP~ZYYZ~Y[[YYZZYYYYZxxxxxxxxrprprQ`aaWWWHVHFXVWWX67HHFPPPPZYZYYYZrprefffffgprpHVWWXFH\Fڹ6H67WWWWX677HFPPPPYZhhhhhhhhhrprhhhhhhhhhhuvvvvvwprhhhhhhhhhhhpHF8T\V7HFH6ڸFPPPPiiiiixxxxxxxxxr`aaatrxxxxxxxxxxuvvvvvwprxxxxxxxxxxxpڸ\Fڸoooooooo6PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPr`aaatsaaaaaaaaaaauvvvvvwpsaaaaaaaaaaatڸVڸFPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPvCvvvvvvvvvvvvvvvvvvvCvvvvvvvvvvvvvvvvvvrBBBdBDVDDFTPPPPPPvlmjkurQQpYYYYYYYYYYYYYYYYY[TWWWX67PPPPPPv|}z}z{urpYYYYYYYYYYYYYYYY[XFPPPPPPwurpY[[[YYYYYYY[[YY[WX6PPPPPPwurQQQQQpY[YYYYYY[Y7778TXVHPPPPPPwurp[YYYYY[[HFHFHPPPPPPweffffffffffffffffffgur`aaaaaaaaaaab`aaaaaaabQQQQQQ[YYYY78VWXVWWX6TPPPPPPwuvvvvvvvvvvvvvvvvvvwurprprYYY[ڸHVWWX68VWWHFHFPPPPPPwjkvvlmurQQQdsaab`aatr[YYHFHHFHFPPPPPPwQQQQz{vv|}QQQQurpsaaaaaatsbYYHFH6778FH67HVWPPPPPPwuwurdr`aaaYYZWWWTHFHF78F78FPPPPPPwQQQQuwQQQQusaaaabprhhhhhhhhpZZYYSSWXF786H68F8HVPPPPPPwuwurprxxxxxxxxpZYYZXVWW7HڸF78PPPPPPwuwefghhhhhhhurprxxxxxxxxpYYYYZSSSFڸHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPvffffffffffffguwefuvwfffffffffvsaaaaaaaabpsaaaaaaaaaatڹڸPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPbCvvvvvvvvvvvwprBuvvvvvvvvvvvvvvBprCvvvvvvvvvvvvvvvvvvvCvvvvvvvvvvvvvvvvvvvCvvvvvvvvvvvvvvvvvvD8DPPPPPPPPPPPPPPPPPPPPPPPPPPrprprlmjkvHFHFWXPPPPPPPPrQQQprQQQQpr|}}}z{vT778677WWWHPPPPPPPPrprQQQQQQpruHFHFHVWPPPPPPPPrpsaaaaaaaaaaaaaaaaaaabQQQQpruHVWWXVWWXVPPPPPPPPrefffffffprffffffffffffffffffpreffffguڸFHPPPPPPPPrQQQQQQuvvvvvvvpcdrvvvvvvvvvvvvvvvvvvprefffffffffgQQefffffffffffffuvvvvwffguTFWWX678\FPPPPPPPPrjkprprlmjkprQQQQQQuvvvvvvvvvwuvvvvvvvvvvvvvvvvvvvvvwuHFHFH\VPPPPPPPPrz{|}z{prjkvvvvvvlmjkvvvvvvvvvlmuHVWHT677H\PPPPPPPPsaabprz{vvvvvv|}z{vvvvvvvvv|}u778VFH\PPPPPPPPrprQQQQQuHF677PPPPPPPPrpr„uWW778FFPPPPPPPPsab`aaaaaaaaaaaaaaaaaaaaaaaaaab`atsaab`aaabuFHF67TTPPPPPPPPr󄄄prprQQooooooooQQQprQuiiiiiiiiiiiiiiiiiiPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPsaaaaaaaaatsaaabQQ`aaatsaabeffffffffffffffffffffff`aaaaaaatsaaaaabvڸڸPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPcBdcBBBdBrpCruvvDDDPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPrprprpruvvFHFWWHFHFHPPPPPPrprQQQQQQjkvF77HFWWWWWWWX67H678VWHPPPPPPrprz{vFWWWWWXFH6778FHFPPPPPPrpru777HFHFHFHFPPPPPPrprQQQQQQQQQzuHFWHFHFPPPPPPrpruWWWH677777H7777HVWWPPPPPPrprQQQ`aaaabuFHFHFPPPPPPrprprQQQQQQQQQQQQQQQQQuFڸFWWڸ78VPPPPPPrprpr`aaaaaaaabQQQQQuFڹFHFWWHPPPPPPrQQQQQprpr`aaaaabeffffffgeffvVWooooooooHF78PPPPPPreffgpr`tsaabprhhhhhhhhhhuvvvvvvwhhhhhhhhhhuvvvFHFڸFHPPPPPPr`abuvvw`ab`aabprhhhhhhprprxxxxxxxxxxuvvvvvvwxxxxxxxxxxuvvvFHFɏFHPPPPPPr`truvvwpsbprprxxxxxxprprxxxxxxxxxxuvvvvvvwxxxxxxxxxxuvvvTTFHFڸF77PPPPPPPPPPPPPPPPPPPPPPPPsaaatruvvwpsaaaaaaaaaatsaaaaaaaaatsaaaaaaaatsaab`aaatsaaaaaaaaaaabuvvvvvvweffffffffffguvvvڸڸPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPcBdcBBDDDFDDPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPrprWWWWWWWHFHFWWXFFHFHPPPPPPPPrprQQQQHFHFHFH677GG777WWWWXFHTWWPPPPPPPPrprWHFH6777HFHFHFHFHFPPPPPPPPrprQQQQFHFHFHoooooooooH6777777777HFPPPPPPPPrprFHVW7777HTڸWWW77HTPPPPPPPPrpr`aaaaaF77HFWWWXTTPPPPPPPPrefffffffgQQQQpFHFWWWWHPPPPPPPPrQQQQuvvvvvvvwpFWWWWWWWWWWWWWWWXFڹWWWHFHPPPPPPPPrffffgQQQQjkvvlm`aatڹFHFFHFHFHFHPPPPPPPPrvvvvwz{vv|}p7778FHFWWWWWWWWWFWWXVWH67FHVWWPPPPPPPPrvvvvw`aabeffffg`aatHFHHFFHFHFڸFPPPPPPPPrvvvvwpruvvvvwpڸoooooooHFFHFH67oooooooPPPPPPPPrvvvvwpsaaaaaabuvvvvw`aaaaaabpɏHFFHFɏPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPrvvvvwpruvvvvwpreffffffffffffg`aatڸڸڸڸPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP11cdcd112222222222222222222222222222cd11A5!2222222222222222222222222222!!cd!11!2222222222222222222222222222!!rp!11!2222222222222222222222222222!!rp!!!111222222222222222222222222222211rp1!!A5!!!rp!!!!!!rp!!!11!!!rp!!!11111rp1A5!!!rp!11!!!rp!1111!!!r`abeffg`abp!11saaatr`abuvvw`abpsaaat11saatruvvwpsaatA5A5A5A5 #%&'( )P*p+q,r-s-u.v.y/p/p/p/p/p/p/p/p/p/p/p/p/p/p/p/p/p`@   4i5G35:486:398;=?????????????????+:=>???????????????????????????@BDFHJLOOOOOOOOOOOOOOOOOOOOOOOs p`c c ccccccc c c oooooooooooooooooooct @   @<;=:<>????????????????????????v00245689::;;<<==<;<8;=;=<=<=???@BD@BEGIKMMMMMMMMMMMMMMMMMMMMM@3|ºƌ ʌ̌͌ΌΌππππππππππππππππππCGJMNNNNNNNNNNNNNNNNNNNNNNNNNN7jpttttttttttttttttttttttttttttt6:@BDGIKKKKKKKKKKKKKKKKKKKKKKKKK@İ@Ű3679:;<<==>>>>????????????????@ O@@@@@@@@@@@@@@@0@@@@@@@0@P@@@@@@PRTWY[[[[[[[[[[[[[[[[[[[[[[[[[9;>9;>????????????????????????@ @P@p@p@`@0@@@@@@@@@@@@@@@@@@@@@@@@dpppppppppppppppppppppppppppppp`cfhhhhhhhhhhhhhhhhhhhhhhhhhhh24u6w89:;<=>??????????????????9;>???????????????????????????t269 ++,,--....////////////////c7|@CGKNOOOOOOOOOOOOOOOOOOOOOOOOgcacefedddddddddefgggfeddddddd0ЪЪ0P+)      ׍      ׍      ԝ5U      ׍      ׍      /'7<LZjow          00@@PP``ppHpjG G G G GG GG G G G G GG GG G G G G GG GG G G G G GG GG               WW W WWWW W WWWz                h h h h hhhh h h h h hhhhz                                    ſ  WwWwWWuWwWwWWuWwWwWWuWwWwWWwWwWwWWwWwWwWWwWwWwWWwWwWwWW ş  xx xx xx x x x xx x xxx xx xx x x x xx x x xx xx xx xx x x x x x xx xx xx xx x x x x xxx xx xx x x x xx x xxx xx xx x x x xx x x xx xx xx xx x x x x x xx xx xx xx x x x x@>@>p ?k>k>k>k>k>k>@0C DC D E E$E$E$E$E%E@%Eff]]f]fuf]fyf}f09p9@9c)c)cIcic-DzMDzMDz]Dz]@@@@ @@  @C?ppppppppppppppppppv`ppv`ppv`ppv`pppv`ppv`ppv`ppv`p`pggggg`pgggggp`pwpwpwpwpwpwpwpwppv`p`pwpwpwpwpwpwpwpwppv`vpgVgggVgggVgggVggwvpgVgggVgggVgggVggwpgwVVVVVVVVVVVVVVVVVgwvpgwVVVVVVVVVVVVVVVVVgwvpgUVUVUVUVUVUVUVUVUVvpgUVUVUVUVUVUVUVUVUVvwVUVUVUVUVUVUVUVUVUwVUVUVUVUVUVUVUVUVUpppVUevwpppppppppppppppppVUevwppppv`ppvgUpUepv`ppv`ppv`ppv`ppv`ppv`ppv`ppv`ppvgUpUepv`p`pgvVpVfpggggggggvVpVfpggp`pwpwpwpgUgUewwpwpwpwpwpwpwpwpwpwpwpwpwpwpwpwpwpgUgUewwpwppv`vpgVgggfeV`veVggVgggVgggVgggVgggVgggVgggVgggVgggfeV`veVggVggwpgwVVVVVVVfU`UfvvVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVfU`UfvvVVVVgwvpgUVUVUVUVeVeeUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVeVeeUVUVUVvwVUVUVUVUp`UUUUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUVUp`UUUUVUVUpppVUevwppppv`ppvgUppppppppUepv`p`pgvVppppppppVfpggp`pwpwpwpgUggggggggUewwpwppv`vpgVgggfeV`v`v`v`v`v`v`v`veVggVggwpgwVVVVVVVfU````````UfvvVVVVgwvpgUVUVUVUVeVeeUVUVUVvwVUVUVUVUpppppppp`UUUUVUVUpvVUevwgeppppppppUegpVUppppppppVfpwgVggggggggUUwwpUU`v`v`v`v`v`v`v`vevw`fe````````UevppVUVvpwgVppppppppUegpvVUevwgeppppppUegpVUppppppVfpwgVggggggUUwwpUU`v`v`v`v`v`vevw`fe``````UevppVUVvpwgVppppppUegpvVUevwgeppUegpVUppVfpwgVggUUwwpUUevw`feUevppVUVvpwgVUegpvVUevwge"""""""""/""""/"""""/""/"""""""""UegpVU?33333?333333333333333333033?333333VfpwgVDDDDDDDDDDDDDDD@DDDDDODDDD@DDDDDDDDDUUwwpUUDDDDDODDDDDDOD@DDDDDDDDDD@DODDDDDDDevw`fe UevppVU VvpwgV UegpvVUDDDDDDDDDDODODD@DOD@DDDDDDDevwgeDDDDODDDDODOD@DDD@DDODDDDUegpVUDDDDDDDDDDODOD@DODD@DDDDDODVfpwgV33333333333333?3333303333?33333333UUwwpUU3333333333303303333303333?33333?33evw`feUevppVU""""/""""/"/""""""/""/""/"""VvpwgVUegpvVUevwgeUegpVUVfpwgVUUwwpUUevw`feUevppVUVvpwgVUegpvVUevwgeUegpVUVfpwgVUUwwpUUevw`feUevppVUVvpwgVUegpvVUevwgeUegpVUVfpwgVUUwwpUUevw`feUevppVUVvpwgVUegpvVUevwgeUegpVUVfpwgVUUwwpUUevw`feUevppVUVvpwgVUegpvVU`UeUeUeUUUUn`UeUeUeUUUUevwgeVeUeUeUeUVVe^^^VeUeUeUeUVVeUegpVUUfeeeeeeggfUnUfeeeeeeggfUVfpwgVeVfvvvevpveVnoooeVfvvvevpveVUUwwpUUUvwwwwpVUUvwwwwpVUevw`feegppvppp`fe`pppegppvppp`feUevppVUUvggppVUUvggppVUVvpwgVUwgV`n`n`nUwgVUegpPUeUeUeUeUeUeUewpvVU`UeUeUeUUUU`UeUeUeUUUUevwpPUeUeUeUeUeUeUewgeUeUeUeUeUeUeUvgeVeUeUeUeUVVeP]ePePePVeUeUeUeUVVeUegeUeUeUeUeUeUeUvgwveeeeeeeeeeeeewvgpVUUfeeeeeeggfU^^^UfeeeeeeggfUVfpgwveeeeeeeeeeeeewvpwvvevvvevvvevpgwgVeVfvvvevpveVfnffeVfvvvevpveVUUwpwvvevvvevvvevpgpgwwwwwwwpUUUvwwwwpVUUvwwwwpVUevwpgwwwwwwvvpppvpppvppp`feegppvppp`fen^^^egppvppp`feUevvvpppvpppvpppppgggppVUUvggppVUPUvggppVUVvpppgggwgVUwgV``n`n`nUwgVUegpPUeUeUeUeUewpvVUevwpPUeUeUeUeUewgeUeUeUeUeUvgeP]ePePePUegeUeUeUeUeUvgwveeeeeeeeewvgpVU^^^VfpgwveeeeeeeeewvpwvvevvvevpgwgVfnffUUwpwvvevvvevpgpgwwwwwpUUevwpgwwwwvvpppvppp`fen^^^UevvvpppvpppppggppVUPVvpppggwgV``n`n`nUegƙ-- title: GORGOION -- author: MFauzan -- desc: get out of the mysterious planet with the help of fairy -- license: MIT License -- version: 1.1 -- script: lua -- input: gamepad -- saveid: gorgoion local remove=table.remove local floor=math.floor local ceil=math.ceil local sqrt=math.sqrt local rnd=math.random local rad=math.rad local sin=math.sin local cos=math.cos local min=math.min local t=0 local timePlay=0 local debug=false local map_idx={} local current_biome=0 local cam={ x=0,y=0, offX=0,offY=0, shkT=0,isShake=false,isBomb=false } local UI={ mode=1,--1.player 2.peri map_col={--color full map {15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15}, {15,15,15,15,15,15,15,15,15,15,15,15} }, --color dictionary according to biome map_col_dic={ [66]=6, [67]=13, [68]=2, [69]=9 }, map_col_next={ [66]=7, [67]=14, [68]=1, [69]=8 } } --music dictionary music_dic={ [66]=2, [67]=2, [68]=1, [69]=4 } --enemy data local enemy={} local fire={} local function toOne(number) return number>0 and 1 or -1 end --collision --[[ flag 0.enemy spawner 1.solid 2.breakable with bomb 3.flamable 4.flame (not destroy) 5.power up 6.hazard 7.frostable ]] local function tileFlag(mx,my,mf) return fget(mget((mx-8)//8,(my-8)//8),mf) end local function tileID(mx,my) return mget((mx-8)//8,(my-8)//8) end local function tileEnd(mx,my) return mget((mx-8)//8,(my-8)//8)==163 end local function collWEnemy(u,d,l,r) --enemy for i,e in pairs(enemy)do local conX=(l-(e.x+8))*(e.x-r)local conY=(u-(e.y+8))*(e.y-d) if min(conX,conY)>0 and e.type~=3 and e.type~=4 then --check if enemy is frozen if e.isFrz then return 1 else return 0 end end end --fire for i,f in pairs(fire)do local conX=(l-(f.x+2))*(f.x-r)local conY=(u-(f.y+2))*(f.y-d) if min(conX,conY)>0 then return 0 end end end ---- --using custom font function rText(text,x,y,segment,color) --code from demo cartridge --I have no idea how this work local keep=peek4(2*0x03FFC) poke4(2*0x03FFC,segment) poke4(2*0x03FF0+1,color) font(text,x,y,0,5,8,false,1,true) poke4(2*0x03FF0+1,1) poke4(2*0x03FFC, keep) end --dialog local isDialog=false local idxDialog=1 local dialogText={ --peri { "Thank you for helping me!", "My name is Peri.", "In return, I will help", "to LIGHT UP your journey.", "\n\nPress [Y] to switch as me" }, --double jump { "DOUBLE JUMP!", "\nPress [A] in the air", "\nto do a double jump." }, --water { "WATER JET!", "\nHold [X] to spray water.", "\n\nCan extinguish fire", "\n\nand harden lava." }, --rocket { "ROCKET LAUNCHER!", "\nPress [UP] to fire", "\nthe rocket.", "\n\nCan destroy", "\n\nfragile objects." }, --fire { "FIRE POWER!", "\nSwitch to Peri mode and", "\npress [B] to use this power.", "\n\nCan burn flammable", "\n\nmaterials and melt ice." }, --ice { "ICE POWER!", "\nSwitch to Peri mode and", "\npress [X] to use this power.", "\n\ncan freeze water", "\n\nand enemies." } } local function drawDialog() if isDialog then --display background for x=8,168,2 do for y=8,128,1 do pix(x+y%2,y,0) end end --display text for i=1,#dialogText[idxDialog]do --make center align text local TextLength=print(dialogText[idxDialog][i],0,-16,0) rText(dialogText[idxDialog][i],88-TextLength/2,32+i*8,8,12) end --turn off if btnp(4)or btnp(5)then isDialog=false end end end ---- --player data local player={ anim=0, x=244,y=682, vx=0,vy=0,speed=1, dir=1,flip=0,rot=0, coyT=0,isCoy=false, health=3, oldArea=-1,area=0,areaX=0,areaY=0,biome=0, hurtT=0,isHurt=false, isSave=false,isEnd=false, isDead=false,isOver=false,ovrT=0, inDark=false,inSnow=false, power={false,false,false}, isDJump=false,isWater=false,isRoc=false,rocT=90, } --peri data local peri={ x=8*44,y=8*99, speed=.5, isActive=false, power={false,false,false}, } --save and load local function newGame() pmem(0,0)pmem(1,floor(player.x))pmem(2,floor(player.y)) player.x=244 player.y=682 peri.isActive=false peri.x=8*44 peri.y=8*99 peri.power[1]=false peri.power[2]=false peri.power[3]=false player.power[1]=false player.power[2]=false player.power[3]=false end local function saveGame() pmem(0,1) pmem(1,floor(player.x))pmem(2,floor(player.y)) pmem(3,(peri.isActive and 1 or 0)) pmem(4,(peri.power[1] and 1 or 0))pmem(5,(peri.power[2] and 1 or 0))pmem(6,(peri.power[3] and 1 or 0)) pmem(7,(player.power[1] and 1 or 0))pmem(8,(player.power[2] and 1 or 0))pmem(9,(player.power[3] and 1 or 0)) pmem(10,floor(peri.x))pmem(11,floor(peri.y)) --save map for i=0,11 do for j=0,6 do pmem(12+i+(j*12),UI.map_col[j+1][i+1]) end end end local isLoad=false local function loadGame() player.x=pmem(1)player.y=pmem(2) peri.isActive=(pmem(3)==1) peri.power[1]=(pmem(4)==1)peri.power[2]=(pmem(5)==1)peri.power[3]=(pmem(6)==1) player.power[1]=(pmem(7)==1)player.power[2]=(pmem(8)==1)player.power[3]=(pmem(9)==1) peri.x=pmem(10)peri.y=pmem(11) --load mini map for i=0,11 do for j=0,6 do UI.map_col[j+1][i+1]=pmem(12+i+(j*12)) end end end ---- --effect-- local colFire={12,4,3,2,14,15}--color of fire local effSave={} local function addEffSave(mx,my) local sv={ x=mx,y=my, vx=rnd(-3,3)/20,vy=-rnd(2,5)/15, t=0 } effSave[#effSave+1]=sv end local function drawEffSave() for i,sv in pairs(effSave)do --movement sv.x=sv.x+sv.vx sv.y=sv.y+sv.vy --draw pix(sv.x-cam.x,sv.y-cam.y,12) --remove sv.t=sv.t+1 if sv.t>90 then remove(effSave,i) end end end --snow local map_snow={2,3,4,5,6} local isSnowArea=false local snow={} local function addSnow(mx,my) local snw={ svX=mx, x=mx,y=my, spdX=rnd(1,3)/10,spdY=rnd(5,10)/10, col=12 } snow[#snow+1]=snw end local function drawSnow() local p=player for i,snw in pairs(snow)do --movement snw.x=snw.x-snw.spdX snw.y=snw.y+snw.spdY --check collision if tileFlag(snw.x+cam.x,snw.y+cam.y,1)and tileID(snw.x+cam.x,snw.y+cam.y)~=32 then --reset snow position snw.x=rnd(8,168)snw.y=8 end --remove snow if not p.inSnow then remove(snow,i)end --draw pix(snw.x,snw.y,snw.col) end end --pixel for trail local trail={} local function addTrail(mx,my) local trl={x=mx,y=my,t=0} trail[#trail+1]=trl end local function drawTrail() for i,trl in pairs(trail)do --remove trl.t=trl.t+1 if trl.t>120 then remove(trail,i)end --draw pix(trl.x-cam.x,trl.y-cam.y,12) end end --smoke trail local smokeTrail={} local function addSmokeTrail(mx,my) local trl={x=mx,y=my,vy=rnd(-10,10)/10,t=0} smokeTrail[#smokeTrail+1]=trl end local function drawSmokeTrail() for i,trl in pairs(smokeTrail)do --movement trl.y=trl.y+trl.vy --remove trl.t=trl.t+1 if trl.t>5 then remove(smokeTrail,i)end --draw circ(trl.x-cam.x,trl.y-cam.y,2-trl.t%4//2,colFire[2+trl.t%9//3]) end end --explosion local explosion={} local function addExplosion(mx,my,md) local exl={x=mx,y=my,d=md,spd=rnd(3,8)/10,t=0} explosion[#explosion+1]=exl end local function drawExplosion() for i,exl in pairs(explosion)do --movement local dir=rad(exl.d) exl.x=exl.x+sin(dir)*exl.spd exl.y=exl.y-cos(dir)*exl.spd --draw circ(exl.x-cam.x,exl.y-cam.y,5-t%30//6,colFire[2+exl.t%32//8]) --remove exl.t=exl.t+1 if exl.t>=30 then remove(explosion,i)end end end --smoke local smoke={} local function addSmoke(mx,my,md) local smk={x=mx,y=my,d=md,spd=rnd(1,5)/10,t=0} smoke[#smoke+1]=smk end local function drawSmoke() for i,smk in pairs(smoke)do --movement local dir=rad(smk.d) smk.x=smk.x+sin(dir)*smk.spd smk.y=smk.y-cos(dir)*smk.spd --draw circ(smk.x-cam.x,smk.y-cam.y,2-t%14//7,12) --remove smk.t=smk.t+1 if smk.t>15 then remove(smoke,i)end end end --blood local blood={} local function addBlood(mx,my,md) local bld={x=mx,y=my,d=md,spd=rnd(1,5),t=0} blood[#blood+1]=bld end local function drawBlood() for i,bld in pairs(blood)do --movement local dir=rad(bld.d) bld.x=bld.x+sin(dir)*(bld.spd*.1) bld.y=bld.y-cos(dir)*(bld.spd*.1) --draw circ(bld.x-cam.x,bld.y-cam.y,3-bld.t%20//5,2-bld.t%10//5) --remove bld.t=bld.t+1 if bld.t>20 then remove(blood,i)end end end --bullet local b={} local function addBullet(mx,my,mvx,mtype) local pel={ flip=player.flip, x=mx,y=my, vx=mvx,spd=5, type=mtype,--1.normal 2.rocket t=0 } b[#b+1]=pel end local function drawBul() local p=player for i,pel in pairs(b) do --attack enemy for j,e in pairs(enemy)do local conX=(pel.x-(e.x+8))*(e.x-(pel.x+2)) local conY=((pel.y-2)-(e.y+8))*(e.y-(pel.y+2)) if min(conX,conY)>0 then if not e.isFrz and not e.isInv then sfx(2,"g-4") cam.shkT=0 cam.isShake=true for k=45,360,60 do addBlood(e.x+4,e.y+4,k)end e.h=e.h-(pel.type==1 and 1 or 3) else sfx(12,"e-8")end remove(b,i) end end --movement pel.spd=(pel.type==1 and 5 or 1.5) pel.x=pel.x+pel.vx*pel.spd --draw if pel.type==1 then line(pel.x+(-cam.x),pel.y+(-cam.y),pel.x+2+(-cam.x),pel.y+(-cam.y),4) else spr(290,pel.x-cam.x,(pel.y-2)-cam.y,0,1,pel.flip) end --trail if pel.type==2 and t%1//1==0 then addSmokeTrail(pel.x+(pel.vx>0 and 0 or 6),pel.y)end --remove-- if tileFlag(pel.x,pel.y,1)or pel.xp.x+120 then --normal if pel.type==1 then for j=45,360,90 do addSmoke(pel.x,pel.y,j)end --rocket else sfx(11,"e-2") cam.shkT=0 cam.isShake=true cam.isBomb=true for k=0,360,45 do addExplosion(pel.x,pel.y,k)end --destroy block for i=-1,1 do if tileFlag(pel.x,pel.y+i*8,2)then mset((pel.x-8)//8,((pel.y-8)//8)+i,0)end end end remove(b,i) end end end --water local water={} local function addWater(mx,my,md) local w={ x=mx,y=my, vx=0,vy=rnd(0,1)/2, spd=rnd(4,8)/4,dir=md, t=0, } water[#water+1]=w end local function drawWater() local p=player for i,w in pairs(water)do --time if w.t<=21 then w.t=w.t+1 else remove(water,i)end --touch tile if tileFlag(w.x,w.y,1)then remove(water,i)end --touch still fire for j,sf in pairs(fire)do if sf.x>w.x-3 and sf.xw.y-3 and sf.yfr.maxT then --if tile flamable then remove the tile if tileFlag(fr.x,fr.y,3)then mset((fr.x-8)//8,(fr.y-8)//8,0) end remove(fire,i) end end end --getting power up local function drawPickPower() --player variable local p=player local u=p.y+p.vy+2 local d=p.y+p.vy+13 local l=p.x+p.vx+0 local r=p.x+p.vx+8 --if touch power up tiles if tileFlag(l+4,u+4,5)then --get index power by tiles order (start at #192) local idxPow=mget((l+4-8)//8,(u+4-8)//8)-192 --index power 1-3 is for player if idxPow<=3 then p.power[idxPow]=true --index power 4&5 is for peri else peri.power[idxPow-2]=true end --display dialog idxDialog=idxPow+1 isDialog=true --replace tiles to blank tiles (#208-#213) mset((l+4-8)//8,(u+4-8)//8,208+idxPow) end end --using power local pow={} local function addPower(mtipe,mx,my,md) local pwr={ tipe=mtipe,--1.fire 2.ice x=mx,y=my, d=md,speed=1, t=0 } pow[#pow+1]=pwr end local function drawPower() local p=player for i,pwr in pairs(pow)do --movement local dir=rad(pwr.d) pwr.x=pwr.x+sin(dir)*pwr.speed pwr.y=pwr.y-cos(dir)*pwr.speed spr(271+pwr.tipe,pwr.x-cam.x,pwr.y-cam.y,0) --fire if pwr.tipe==1 then --if touch flamable tiles if tileFlag(pwr.x+3,pwr.y+3,3)or tileFlag(pwr.x+3,pwr.y+3,4)then --spawn fire then remove for i=0,2 do addFire(floor(pwr.x+3),floor(pwr.y+4),i,false)end remove(pow,i) end --ice else --if touch frostable tiles (just water)) if tileFlag(pwr.x+3,pwr.y+3,7)then --turn water tile to frozen object mset((pwr.x-4)//8,(pwr.y-4)//8,82) remove(pow,i) end end --remove pwr.t=pwr.t+1 if pwr.t==25 or tileFlag(pwr.x+3,pwr.y+3,1)then remove(pow,i) end end end --circle that shrink local cirS={ active=false, x=0,y=0, rad=16 } local function drawCirShrink() if cirS.active then --shrink cirS.rad=cirS.rad-1 --remove if cirS.rad<0 then cirS.active=false end --draw circb(cirS.x-cam.x,cirS.y-cam.y,cirS.rad,4) end end --game over effect local eOvr={} local function addEffOver(mx,my,md) local eo={x=mx,y=my,d=md,spd=3} eOvr[#eOvr+1]=eo end local function drawEffOver() for i,eo in pairs(eOvr)do --movement eo.spd=eo.spd-.05 local dir=rad(eo.d) eo.x=eo.x+sin(dir)*eo.spd eo.y=eo.y-cos(dir)*eo.spd circ(eo.x-cam.x,eo.y-cam.y,2,12) --remove if eo.spd<0 then remove(eOvr,i)end end end ---- --enemy-- --[[ -4.fire stove (downward) -3.fire stove (upward) -2.fire (right) -1.fire (left) 0.turtle 1.eyeblock (horizontal) 2.eyeblock (vertical) 3.firemouth (right) 4.firemouth (left) 5.eyedisk 6.bat 7.still fire 8.stove (upward) 9.stove (downward) 10.eyedisk fire 11.frog 12.worm 13.monke 14.ghost ]] local function enemySolid(l,r,u,d,w,h)--enemy collision local p=player return tileFlag(l-1,u+h/2,1) or tileFlag(r+1,u+h/2,1) or not tileFlag(l,d,1) or not tileFlag(r,d,1) or(l+w/2>p.x and l+w/2p.y and u+h/2my and pwr.ymx and pwr.xoe.x and e.xoe.y and e.yu-32 and p.y+8l-48 and p.x+460*5 then e.t=0 end --remove if outside area if e.area~=p.area then remove(enemy,i) end --draw e.flp=(e.type==3 and 0 or 1) spr(307,e.x-cam.x,e.y-cam.y,0,1,e.flp) end end end --eyedisk local function drawEnemyEyedisk() local p=player for i,e in pairs(enemy) do local u=e.y+e.vy local d=e.y+e.vy+9 local l=e.x+e.vx local r=e.x+e.vx+8 --check type if e.type==5 or e.type==10 then --freeze if enemyFreeze(l,u,4)==2 then e.sp=(e.type==5 and 322 or 324) e.isFrz=true --unfreeze elseif enemyFreeze(l,u,4)==1 then e.isFrz=false end --normal movement if not e.isFrz then e.sp=(e.type==5 and 308 or 313) --movement e.spd=(e.type==5 and 5 or 3) if tileFlag(l-1,u,1)or tileFlag(r+1,u,1)or tileFlag(l-1,d,1)or tileFlag(r+1,d,1)then e.vx=e.vx*-1 end if tileFlag(l,u-1,1)or tileFlag(l,d+1,1)or tileFlag(r,u-1,1)or tileFlag(r,d+1,1)then e.vy=e.vy*-1 end e.x=e.x+e.vx*e.spd e.y=e.y+e.vy*e.spd --spawn fire every 1.5 sec (type 10) if e.type==10 and t%90==0 then addEnemy(e.x,e.y,e.area,7) end --death if e.h<=0 then remove(enemy,i) end --if freeze else e.spd=0 end --remove if outside area if e.area~=p.area then remove(enemy,i) end --draw spr(e.sp,e.x-cam.x,e.y-cam.y,0) end end end --bat local function drawEnemyBat() local p=player for i,e in pairs(enemy) do local u=e.y+e.vy local d=e.y+e.vy+9 local l=e.x+e.vx local r=e.x+e.vx+8 --check type if e.type==6 then --freeze if enemyFreeze(l,u,4)==2 then e.isFrz=true --unfreeze elseif enemyFreeze(l,u,4)==1 then e.sp=309 e.spd=.3 e.isFrz=false end --normal movement if not e.isFrz then e.sp=309+t%18//6 --trail if t%20//1==1 then addTrail(e.x+4,e.y+4)end --movement local dx=p.x-e.x local dy=p.y-e.y local dist=sqrt((dx*dx)+(dy*dy)) e.spd=.3 e.x=e.x+(dx/dist*e.spd) e.y=e.y+(dy/dist*e.spd) --death if e.h<=0 then remove(enemy,i) end --if freeze else e.sp=323 e.spd=0 end --remove if outside area if e.area~=p.area then remove(enemy,i) end --draw spr(e.sp,e.x-cam.x,e.y-cam.y,6) end end end --enemy still fire local function drawEnemyStillFire() local p=player for i,e in pairs(enemy) do --check type if e.type==7 then e.isInv=true if e.t<=21 then e.t=e.t+1 else remove(enemy,i)end --remove if outside area if e.area~=p.area then remove(enemy,i) end --add fire then remove for i=0,2 do addFire(e.x+4,e.y+4,i,true)end remove(enemy,i) end end end --stove local function drawEnemyStove() local p=player for i,e in pairs(enemy) do --check type if e.type==8 or e.type==9 then e.isInv=true e.isFrz=true --fire breath if t%8//4==0 then addEnemy(e.x+4,e.y+(e.type==8 and 0 or 8),e.area,(e.type==8 and -3 or -4)) end --remove if outside area if e.area~=p.area then remove(enemy,i) end --draw e.flp=(e.type==8 and 0 or 2) spr(312,e.x-cam.x,e.y-cam.y,0,1,e.flp) end end end --frog function drawEnemyFrog() local p=player for i,e in pairs(enemy) do --check type if e.type==11 then local u=e.y+e.vy local d=e.y+e.vy+9 local l=e.x+e.vx local r=e.x+e.vx+8 --freeze if enemyFreeze(l,u,4)==2 then e.isFrz=true --unfreeze elseif enemyFreeze(l,u,4)==1 then e.spd=1 e.isFrz=false end --ckeck player nearby if not e.isJump and p.x>e.x-32 and p.x90 then e.isMove=false e.t=0 end --idle else e.sp=318 e.spd=0 --change state e.t=e.t+1 if e.t>90 then e.isMove=true e.t=0 e.flp=(e.flp==0 and 1 or 0) end end --collision if tileFlag(l+4,u,1)or tileFlag(l+4,d,1)or tileID(l+4,u-1)~=179 or tileID(l+4,d+1)~=179 then e.vy=e.vy*-1 end --update movement e.y=e.y+e.vy*e.spd --death if e.h<=0 or tileID(l+4,u+4)~=179 then remove(enemy,i) end --if freeze else e.sp=327 e.spd=0 end --remove if outside area if e.area~=p.area then remove(enemy,i) end --draw spr(e.sp,e.x-cam.x,e.y-cam.y,0,1,e.flp) end end end ------ --spawn enemy local spawner={} function enemySpawn(mx,my,mt,mar) local e={ x=mx,y=my, t=mt,area=mar, init=false } spawner[#spawner+1]=e end local function drawEnemySpawn() local p=player for i,e in pairs(spawner) do --change init if e.area~=p.area then e.init=false end --check if player area is same if not e.init and e.area==p.area then --add enemy addEnemy(e.x,e.y,e.area,e.t) --init e.init=true end end end ---- function removeBiomeTiles() --check map index from tile_id #66-#69 for i=0,840,120 do map_idx[i//120]={} for j=0,1920,160 do --insert tile_id to map_idx local tile_id=mget((j+12)//8,(i+4)//8) map_idx[i//120][j//160]=tile_id if tile_id>=66 and tile_id<=69 then map_idx[i//120][j//160]=tile_id else map_idx[i//120][j//160]=0 end --change back tiles according to right tile mset((j+8)//8,i//8,mget((j+16)//8,i//8)) end end end --player-- local function playerSprite(a,b) local p=player --draw player spr(258+p.anim,p.x+(-cam.x),p.y+(-cam.y),0,1,p.flip,p.rot,1,2) spr(288,p.x+a-b+(-cam.x),p.y+6+(-cam.y),6,1,p.flip,p.rot,2,1) end local function drawPlayer() local p=player local u=p.y+p.vy+2 local d=p.y+p.vy+13 local l=p.x+p.vx+0 local r=p.x+p.vx+8 local off_gun=p.flip==0 and -2 or -6 local off_shot=0 --control player direction if not p.isDead and not p.isEnd and UI.mode==1 and btn(2)and not tileFlag(l,u+1,1)and not tileFlag(l,d-1,1)and collWEnemy(u+1,d-1,l,r-2)~=1 then--left p.vx=-.7 p.flip=1 p.dir=-1 if p.vy==0 then p.anim=t%48//6 else p.anim=5 end elseif not p.isDead and not p.isEnd and UI.mode==1 and btn(3)and not tileFlag(r,u+1,1)and not tileFlag(r,d-1,1)and collWEnemy(u+1,d-1,l+2,r)~=1 then--right p.vx=.7 p.flip=0 p.dir=1 if p.vy==0 then p.anim=t%48//6 else p.anim=5 end else--idle p.vx=0 p.anim=0 end --collision up if p.vy<0 and (tileFlag(l+1,u,1)or tileFlag(r-1,u,1))or collWEnemy(u,d,l+1,r-1)==1 then p.vy=0 end --collision down if tileFlag(l+2,d,1)or tileFlag(r-2,d,1)or collWEnemy(u,d,l+2,r-2)==1 then p.vy=0 p.isDJump=false p.isCoy=false else p.vy=p.vy+0.1 if not p.isCoy then p.coyT=10 p.isCoy=true end end --jump if not p.isDead and not p.isEnd and(p.vy==0 or p.coyT>0 or p.isDJump)and UI.mode==1 and btnp(4)then sfx(0,"e-3") p.vy=-2.3 p.isCoy=true p.coyT=0 if p.power[1] then p.isDJump=not p.isDJump end end --shoot if not p.isDead and not p.isEnd and UI.mode==1 then --normal bullet if btnp(5)and not p.isWater and not p.isRoc then sfx(1,"c-4") addBullet(p.x,p.y+8,p.dir,1) off_shot=2 --water elseif btnp(6,5,5)and p.power[2] then sfx(10,"c-7")p.isWater=true addWater(p.x+(p.flip==0 and 12 or -5),p.y+8,p.dir) --rocket elseif btnp(0)and p.power[3] and not p.isRoc and not p.isWater then sfx(1,"c-4")p.rocT=0 p.isRoc=true addBullet(p.x+(p.flip==0 and 8 or -8),p.y+8,p.dir,2) off_shot=2 --not shoot water elseif not btn(6)then p.isWater=false end end --rocket time if p.isRoc then p.rocT=p.rocT+1 if p.rocT>90 then p.isRoc=false end end --update movement p.x=p.x+(p.vx*p.speed) p.y=p.y+p.vy --coyote jump time if p.coyT<0 then p.coyT=0 else p.coyT=p.coyT-1 end --getting hurt if p.isHurt then --make invisible p.hurtT=p.hurtT+1 if t%2//1==0 then playerSprite(off_gun,off_shot)end --back to normal if p.hurtT>90 then p.isHurt=false end --if not invisible player can hurt again else if not p.isDead then playerSprite(off_gun,off_shot)end --touch hazard area if tileFlag(l+4,u+6,6)then --instant death if not p.isDead then sfx(4,"b-4",50)p.health=0 for k=45,360,45 do addEffOver(l+4,u+8,k)end p.isDead=true end end --getting attack by enemy if collWEnemy(u,d,l,r)==0 then if p.health>1 then sfx(2,"g-4") for k=45,360,60 do addBlood(l+4,u+4,k)end cam.shkT=0 cam.isShake=true p.health=p.health-1 p.hurtT=0 p.isHurt=true --death else if not p.isDead then sfx(4,"b-4",50)p.health=0 for k=45,360,45 do addEffOver(l+4,u+8,k)end p.isDead=true end end end end --restart if p.isDead then p.ovrT=p.ovrT+1 if p.ovrT>120 then --load game if there was save file if pmem(0)~=1 then p.x=pmem(1)p.y=pmem(2) else loadGame() end --reset variable UI.mode=1 p.health=3 p.ovrT=0 p.isDead=false --reset map data sync(4,0,false) removeBiomeTiles() --remove enemy tiles in map (because sync() make it appear again) for i=0,1920,8 do for j=0,840,8 do --offset because of game UI local mi=i-8 local mj=j-8 --get sprite flag of enemy (0) if fget(mget(mi//8,mj//8),0)then --change spawner map with tile above local topTile=mget(mi//8,mj//8-1) mset(mi//8,mj//8,topTile) end end end ---- end end --change music if enter biome if not p.isDead and music_dic[p.biome]~=music_dic[current_biome]then music(music_dic[current_biome]) end --change player biome variable p.biome=current_biome --touch checkpoint if mget((l+4-8)//8,(u+4-8)//8)==169 then if not p.isSave then sfx(5,"c-4") p.health=3 saveGame()p.isSave=true --effect for i=0,9 do addEffSave(l+4,u+6)end end else p.isSave=false end --the end if tileEnd(l+4,u+4)then music() p.isEnd=true end end ---- --fairy local function drawPeri() local f=peri local p=player local posX=f.x-cam.x local posY=f.y-cam.y if f.isActive then --movement if UI.mode==1 then --just follow player local dx=(p.x+(sin(t*.05)*20))-f.x local dy=(p.y-12+(cos(t*-.2)*30))-f.y local dist=sqrt((dx*dx)+(dy*dy)) f.speed=dist*.02 f.x=f.x+(dx/dist*f.speed) f.y=f.y+(dy/dist*f.speed) else --control peri if btn(0)and f.y-8-cam.y>0 then f.y=f.y-.7 end if btn(1)and f.y-cam.y<120 then f.y=f.y+.7 end if btn(2)and f.x-8-cam.x>0 then f.x=f.x-.7 end if btn(3)and f.x-cam.x<160 then f.x=f.x+.7 end --use power if btnp(5)and f.power[2] then--fire for i=0,360,22.5 do addPower(1,f.x,f.y,i) end end if btnp(6)and f.power[3] then--ice for i=0,360,22.5 do addPower(2,f.x,f.y,i) end end end --light if f.power[1] and p.inDark then --using bank 1 color 0 (transparency) to clipping mask vbank(1)circ(posX+4,posY+4,40,0) --add detail for i=0,360,22.5 do for j=0,3 do local dir=rad(i+j*11.2) local pX=posX+4+math.sin(dir)*(42-j*4) local pY=posY+4-math.cos(dir)*(42-j*4) circ(pX,pY,4-j,1) end end vbank(0) end --if not active yet else --if touch by player if p.x+4>f.x and p.x+4f.y and p.y+464 then if isLoad then loadGame()isLoad=false else newGame()end scene=1 end end end local endBGH=0 local function _sceneGame() local p=player --shake camera if cam.isShake then cam.shkT=cam.shkT+1 --random the camera offset to make shaking effect cam.offX=rnd(-1,1) cam.offY=rnd(-1,1) --end the shake if cam.shkT>10 then cam.offX=0 cam.offY=0 cam.isShake=false cam.isBomb=false end end --manage map cam.x=(p.x//160)*160 cam.y=(p.y//120)*120 p.areaX=cam.x//160 p.areaY=cam.y//120 p.area=p.areaX+(p.areaY*12) current_biome=map_idx[p.areaY][p.areaX] map(0,0,240,105,8-cam.x+cam.offX,8-cam.y+cam.offY) --map that dark for i=1,#map_dark do p.inDark=(p.area==map_dark[i]) if p.inDark then break end end --map that snow for i=1,#map_snow do p.inSnow=(p.area==map_snow[i]) if p.inSnow then break end end --add snow if p.inSnow then if not initSnow then for i=0,15 do addSnow(rnd(8,152),rnd(8,112))end initSnow=true end else initSnow=false end --check player in dark area if p.inDark then vbank(1) cls()rect(8,8,160,120,1) vbank(0) --if player is not in dark area else p.inDark=false --clear the screen in vbank 1 vbank(1)cls()vbank(0) end if not init then --check spawner in map for i=0,1920,8 do for j=0,840,8 do --offset because of game UI local mi=i-8 local mj=j-8 --get sprite flag of enemy (0) if fget(mget(mi//8,mj//8),0)then --get sprite id from map (start with 240) local eType=mget(mi//8,mj//8)-240 --get area number local eX=i//160 local eY=j//120 local eArea=eX+(eY*12) --add spawner according to sprite id enemySpawn(i,j,eType,eArea) --change spawner map with tile above local topTile=mget(mi//8,mj//8-1) mset(mi//8,mj//8,topTile) end ---- end end --change init to true init=true end --object drawPickPower()drawTrail()drawSmokeTrail()drawBul()drawEffSave()drawPlayer()drawPower() --enemy drawEnemySpawn()drawEnemyTurtle()drawEnemyEyeblock()drawEnemyFiremouth()drawEnemyEyedisk()drawEnemyBat()drawEnemyStillFire()drawEnemyStove()drawEnemyFireStove()drawEnemyFrog()drawEnemyWorm()drawEnemyMonke() --fairy drawPeri() --effect drawSnow()drawfire()drawWater()drawSmoke()drawBlood()drawExplosion()drawCirShrink()drawEffOver()drawEnemyFire() --UI _drawUI()drawDialog() --timeplay local scnd=(timePlay//60) local mint=(scnd//60) local hour=(mint//60) if not p.isEnd then timePlay=timePlay+1 else local timeTxt=hour..":"..mint..":"..scnd local txtLngth=print(timeTxt,0,-80,12) rect(8,8,160,endBGH,0) if endBGH>120 then print("THE END",48,56,12,false,2) else endBGH=endBGH+1 end --print(timeTxt,104-txtLngth/2,24,12) end end local function _sceneCover() map(90,119,30,17) rect(16,52,208,24,15) spr(336,76,56,6,1,0,0,11,2) end local function _sceneManager() if scene==0 then _sceneTitle() elseif scene==1 then _sceneGame() end end ---- function BOOT() --if pmem(0)~=1 then music(0)--no save --else music(5)--with save --end music(5) removeBiomeTiles() end function TIC() t=t+1 _sceneManager() end