0',D7\qH|. ;>fyцE-J;`NѕL$GIT`u 02TvͫgE#2Tv2TvTTQQQSTTQQQSTWQQQSTTQQQQTTSSTTSS5TWSSTTQQQQTTqSSttSSWWQSSTTQQQQTTSStTSQS5WWSQSTTQQQQTTSSttSS5WWSSTTQQQQTTqq]|7|qsq]5w5\qq]TTQQQQTTqq|5|5qq5W5tqqTTQQQQTTqsq|7|qq5t5tqqqTTQQQQU%VUV%**&&ddTTbbFFQQEE! ZVEVEVEVEVEPVEUUVEZPVEUUVEAjBZ%Vr V0Vb VD2ZD$@@ UUUUfUU@fUUPUUUUB `B!HCCkC@!H@ `UUUU b b X R X RZR X X ZZ X RX Z X RR RR RR    DDDDeY  ??    0 0    ff0 00 0ff 00H$!Hp`00 PfUUUUUU@UU@UUkUUCBUUBUU 򣢢 򣢣:򣢣 : ; :: :::: ; ::  0/ /̈̈DD̈̈DD̈D`Ď̌ð̂̈DDDD0 BB@B UU  1 0  UUUUjjjnnkkkjnjjUUUUUU{o{_UUVZo[j[o[j[oZVTTTZZnkoonkZZTTVZo[j[o[j[oZVTTTZZnkoonkZZTTVZo[j[o[j[oZVTTTZZnkoonkZZTTVZo[j[o[j[oZVTTTZZnkoonkZZTTUUjZUVUUUTP@UU*kF~h)~h)~Fn*nUUUUUUo~~onnnnnnUUUUUUz@~DnDnn@UUB` "'"'` BX%[ooX[UUX%U*ZZ PjZ%XZ)Xijjjj* *YUUU@ `*`xZ*`U `@o*o @@6E3A@@*  *P P @P@0@ P03dP33@ *<o@ Kp[ [ `  hm *@u @y)@z^]@H!o e +&l)lzN ?? /  /  ;7o ~ PkookTi p  @ @PY&@Ddu@:*TkX[( /п /뿿@ @J p o`[ * hm *U p @y)@~U^ PjkkjT //TtT\UPd/ //   / x-?/@@ TUUPTVZZVTTTUUUj/P TUUUUUjUjUjTPTUUUUUUUP@V?;@Z``wV^K @p ` o*@_Z[o]uww]uojTZTjTUUP@@UUPUUPUUTUUUjjj//o+??*Z*Z*Z*Z{7@[VR@/Yf@mUVoU[P P PTT}T Pp??Я?_ }} }} _ ZZPkkk k kkkPUUZYZVWUZPUU:eUZP8,<<,84$;$44 44h)`PU @Ukk@DP T*kk@DP T*kk@DP T*kk@DP T*//o+??**Z{7@[VR@/Yf@mUVoU[P P PTT}T Pp??Я?ZZZ }} W }} ZUUZz .}} W.ZZP,<88<,4;$$44 44)h`PPU@ @Ukk@DP *Tkk@DP T* X%dUUUU8UU,Z>/V/@@ P.P? P.P*{7@[VfpS{7@[0^/&8<@@}@UPU%PU< 8x{ h] X%]@ @*@+@/@+@*,<84$;/80,?$,4$&V{޷T?\5wYe{@V**$UaHU@Q@F }L}}@v 57  @ @ @ @ Bi0K F F@Y@@@@PnPPPPPPPPPZZZZZZZZZZZZZZZZZZZZZZZZZZ_____________WWWWWWWWWWWWSRSSRSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWWWWWWWWWWWWWWWWP____P``_  WT###T###TPPQQPPXX X XXPXXXP P''''#'####P''''''''#'###P#####WPQQPPQQPPPPQQPQQPR RR RRRPYTYTY`6666`x  WT##T##TPPFPPXXXXPXX P'''''##M##P##''''##'####w#####WPRnP TTRPP[[[aaa[[[aaa[[[aaa[[[aaa[__  WeeRT``RTR``TRQPPPPPQPR33RPP PPP''#M###'##########M###w#A##TWPnn TRPDPW+++++++++++++++++N+++++W_bbb_bbb_bbb_ RR We`""`QPPPPPPPPPXP P''''##M#E#'#############w####xWQATQS??Sn UU E UU RPP```PPW+N++++++++N++++++++++++W  WxDLDDLD`""`PPPPR33RPPXXXPPPnnnnPP P'''##########M####''####w##A#xWQRTTTs????Pr T U T RPQPW+++++N++++++++++++++++++W  We`""`QPPPPPPXXP P'''####'''#######'''''##w####TWQATs????PT T U T TRPnPa++++ M N++W  WeeRT``RTR``TRPPPPQQPPQQPPPXXP BP''###E#''''#######''''##w#A###WQQS??Sn UU E UU RPnPa++++ PPPPPPPPPPPPPP +++W R R R RR WT##T##TPDDDPPPP PPPPXXP PPP#M####''P#############P#####WPnn RPnPa++++ PP +++W  WT###T###TPRRPPUP PTPPPnnnPPdddPPnnnnPP P####M###PPPnnnnnnnnnnnPPPnnnPWPRnP TR'''''XXWWXXXWWWPnPW++++ Ma66P +++W  WSRSSRSQSQPUdXP P##########P P WPPnnnnPPPPnQffQnP nn nn TTR''''''''''''X WPnPPWN++ aP +N+W  WRRRRRTRRRRRPSPPUAd3P PPPTTPPPwwPP ######### WWWnnnnWWWPPRTRRn nRRRRR'''' '''W JJ XPnPPW+++ aPPPPPP`PPP +++W RR R R R WSSSSSSPKSKPPUdR PT P P #M#####M# WRR''''RRWP??PR T'''' '''X XPDnPPW+++ Pqn__P +++W  WSTTSPSPPUUUPPnnnnnPPUUUPP Pv ######### W'''''''RWP??A?PT J R''''' EM '''X WW XPQPPW+++ pJqnG_P ++NW  WSSQRRQPPP PPP3 Pv J ##A##### W''''''''WP??PR R'''''''''' '''X J WW J WPP```PW +++ Pqn__P +++W  WRQQP`PQQRPPPPP q q PPPR PT P P ######### P WbbbbbbbbWPRRTRR w''''''''''''' ''''W WW WPa +++M PPaPP```PPPPPP +++WRRRRRRRRRRRRRRRRRRRRRWPP"""PPPPQ`QPPPPK J KAPPPTPPTPPPPPPPTTPPPTTPP #####A### P Wb qn n w'''''''''' '''A'A'W D WX D XPW +++ ))) +++W mmmmm WPP""PPQP`PQPPP qJpJq PP PPPPPPPPPPPP #M#####M# PuuuuPWb@&&&&&&pP??f J f J w''''''''EM ''''''X WX XP?DW ++++++++)))++N+++++++W RRRRR WPQQP"PQQPQPPPPQPPP PT TPPPPPPP P ######### P PWb qn n w'''''''''' '''A'A'WX WX XPa ++N+++++++)D)++++++++++W WPQQQPPPPPPPP PT TPPPPPPP E P T D TWbbbbbbbbWPRRTRR T''''''''' ''''''WWWW WW WPP`PPP?PW +++++++N++)))++++++N+++W WPPUEKEUPQPPPPPRRPPP PPTPTPPPPPPPP P PTTP PTTP P PW''''''''WP??RR R'''''''' ' '''' WW WP PPW W!QRDRQPPPPPPP d q q qPPTrTPPPsssPPP3 PPPP 3PPPPuuuuPW'''''''RWP??A?PT J T'''''''EM '''' WX XP nP__W WPPQEQPPd qKDnn s PWRR''''RRWP??PR R'''''''' '''WWWXXXWWX J XP K nP _WXX WPPQ`QPPPQQPPPKd A L qnKn s LPWWWnnnnWWWPPRTRRn nRRRRR'''''''''''WWX XP nP_WXX` W!QPPQQPPPPd qKEnn s PWPPnnnnPPPPnQffQnP nn nn TTR'''W WP PP _WL` WP#P`PPQPQQPPP d q q qPPPP PPTPTP 3PTPPTPPTP PWPRnP J TRX  XPP`PPP?f _WX` WP#@`MQDqPPPPPPPqqPqqPP PP PPPP PPP PPPP u P AP PWPnn RX  XPP _WXW WP#P`PPQPQQPPPX XPT TPPPPP PPPPPAu Puu PWQATQS??Sn UU E UU RWWWWXXXWWXXXWWX D XPPP__WXXW WPQPPQQPPPP PT TTPP P3PPTP P P PWQRTTTu????PT T U T TRW  WPQWWWWWWWWWWWWW ] WPPQ`QPPQSQQSQPP XX PXPqqqqqPP  TPt3 u u u PWQvATu????Pt T U T Rx J D J  J WP?`888\ WPQ###QPTT`E`TTPP XX XX PXPKKPP  APPt u u3u PWQQS??Sn UU E UU RW WP`\ WPQR`#K#`QPQSQQSQPPX XX XXPAAPT  TPTuuP P u PWPnn TRWWWWXXXWWXXXWWXXXWWPQ]jjj]jjj]jjj]jjj] WPQ###QPTT``TTPPXX XXPXPPPPP P3PP Au P PWPRnP TTRPPPPPPPP\\\\\\\\\\\\\\\\\WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPQPPQPpPQPPQSQQRQQSQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPTTPPPPPPPPPPPPPPPPPPPPPPPQQPPQQPPPPQQPQQRR RR RRRQQQQQQQQQQQQQQQQQQQQQQQQQQW PPPPPPPPYPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+M]QjjQW Pn*N**M*M))N)Y*N***Y*A****tP'' N N'nN MPP W+@+++++++++M++]QASSSShSSSSjQWddddddxddddd PP*)*)*))))))Y*)))MYbbY*)))LP N N N ''n x NMPPP W++]]]]]]`]]]e]]QQjjRBShSSjQW M ++ d PKG)*XD*X**X*****Y***)*YM))*P A ZZZZZZZ 'nA K MPPP W++]YYYYR RYYYYYQhjQW M ++ M d PP)*N*)**))N*Y))Y*N)MY****N) Z**++*M*Z n N A MPPP W+M+]YXYR RYYQ?hAQW N+D d PIn*M*))*N))*MY)))Y))YY***M)** NY)*N*D**+*Z N n N MPP W++]YYR RYYQvSShSBRjQW ++ d PPPPPPPPPnnnnPnnnnPY)))*YY))D)))) )D+Z))*N+**Z nnSwSnnPP W++]YYR RYXYQDSSSShSSSSjQQQWM M +N M d PSSAOP^*D**)*)N))'N N Y*Z))M*+D**Z E.E''P@P W+]]]YYR RYEYQQW ++ d POKTOPQ*N****'' ZZZZ*d*N*N*MZ N .''PBP W++RYYYYEK YQEQW +++++++ d POPXOTKu**M*N*'M'''' Z*))N**d*D)*+N*Z .N'PP W+RXYR RYXYQjjjQQQQQQQQQQQQQQQW M+`+ d PSJJSPXOPQ)N)**M''''N YZZ)*M**d))M++N)Z N. PP W++eYR RY>YQAQ_____________QQW ++D d PPPPPPPPPPPPPP^*))*''''N ++*N*++*d**N*)))Z E.E PP W++RXXYR RYpYQQ_AjA_QQW +K+ d PTTrPTTPnnnnP'''''' +N*+D+*N*dZddZZZY . PPP W++RYYYYYYYR RYYYYYYQQQQQQ_j_QQW ++ d POOPLP'' NYZZ*++N***ZM*N***N . PPPP WRsRRRRRRRRURqRRRRRRRRRRRR_jjjjjjjjjj_QQQQW A++M d PQsQPP#O##ATPTDPPPPP' A Z*))M*)**d*D++N** . PP` WRJXR_33_QQQQW ++ d PQ#A##PPPPTTP'N Z)D)**M*d***+*** N. P` WRXR__QuuQQQW +++++++ d PnOOOUPBP N Z)N))N*+Z*NZZZZY . PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP WRQQQnnnnQQsQQnnnnQQQR__________W M +N d PKQTTTOUPSSP Z**+**+Z*)D)**ZZ . NW WRQQRURR_________W A ++ M d PPPPPPPPPPPPPPPPPPPPDDPN '' Z*E+)*E+Z*+)+*N*Z.E W WRQSTSSSSTSQJRSSS SSSS_PP_W N+ d PJeEPP ''''Z*+JvJ**MZZZZZ**Z . W WUJQSSSTSQs w+++++++M d PDeDQeeeeeeQPSKSP N'''Z))J**N*d***++*Z . W WRQTTSSTrQDs A w++N++++ M d PeeePP ''''ZM))*N***dN*M)D)ZN... W WRfSSSSKQRSSS SSSS_PP_W d PeeePPN ''''ZZdddZdddZ**N))Z .DW WRQQRRRRYYS S]]]__nnnnPQeeQAeEeQSSP ZY'*YY))+M+N*d)))***Z . W WREQQQnnnnQQsQQnnnnQQQRYYYYYS S] ]_____ ]]]]]PDJeeqDDP ZM**[M)NA++)d)N)N*MZN. W WRRYXYS S] ]] X t I ] ePEeeQP Z+*NZ))**N*)d)D****Z . W WRXJXRYYS S] ] 9 ] ePeDePjjQEQjjPN Z+N*ZZZZ+*M*Z+++ND**NZ . W WRRRRRRRRRRRURRRRRRRRRRRYYS S] X]  ePeQ/QeeeeQJQePIIjjIIP N Z**A)N+++A*Nd*M+*M++ZD.NW WYYYYYS S] ]  ePeQAPIIjpjIIP ZM)))***N***d**N***N+Z . W WYA ] A ] ePeDePQPQPQPQPQP NZZZZZZZZZZZZZZZZZZZZ' .W W1A1YI>YS S] I]X I X] ePAQEeQQ N D N D N N D N D .W WYYS ES] A ]]]] ePEJDeEDJJ............................ W WSkkSkkkkSkkkkSkkkkSkkSYXIYS S] < D ePeQQ N D N D D N N W WSSSSSSSSSSSSSSSSSSSSSSYYYYYYYYSSSS]]]]]]]]]]]]]]]]]]]]]]]]]]PPPPPPPPPPPPPPPPPPPPQPQPQPQPQPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW "233333322"!   !1AAB2"      ! 111          004488;;>>???;?;?<?<?=?=?>?>??=;6000000;1:3;5:67<9:;<=?????? t wuxvywjX[YL:-+   9?6?3?3?3?3?4?6?7?8?9?:?;?<?=?0 0 12334567889:<<=>?;??;??;?????\UlfflfflffU\lfflfflff\U\lfflfflffU\lfflfflffU\UUlfflfflffUUlfflfflff\UUlfflfflff\UUUUUlff̙̙̙̙̙̪̪̬̬̬̜̜UU\Ulff̜̜̪ʪʪəəU^Ulff̙̜U^lff̜lfflfflfflffffffoffffffffffffffUU^lff̙lfflfflfflfffff̬ffffffffffffffUDUUElff̜lfflfflfflfffff̪ffffffffffffffܜlff̙lfflfflfflffff__fffffffeffffff\ww\lff̜lfflfflfflffUUUUUUUUUUUU_UU_UU_UUofVUUffUUeffUUݜU^Ulff̹lfflfflfflffUUUUUUUUUU_UU_UU_UUfVUUff\UeffUUݜU^\Ulff̬lfflfflfflff_olfflff\U^Ulff̙lfflfflfflff̥Zlfflff͜U^Ulff̜lfflfflfflff̪lfflff͜U^lff̙lffjffhfflffflff\U[lff̜lffjffhfflffflffUŕlff̺lfffffffflffflffUY^lff̬lffffffffl\__offlffU^\lff̺lffffffffUUUUUUfflffU^\lff̬lffffffffUU\UUoflffU^\lff̺̌fffffffV\̪ffU̙UUlff̬̈ZUU̬ZZ̈UU^\lff̸̹ZUU̬ZZ̨\U^\lff̬̙˻̼˻k܊͌U^UUlff̺̙˻̼˻k̸ܽDUUE\lff̬̙˻̼˻k̽͌\lff̺̙˻̼˻kܬww\lff̬̙˻̼˻kY̍U^lff̺̙UUUUU[UUUU˻UUUUU̼˻UUUUU[UUUUkUUUUUUUU܌U^lff̬̙UUUUU[UUUU˻UUUUUʼ˻UUUUU[UUUUkUUUUUUU܌U^lff̵̺̙[̼˻lff˻̻\eUUlff̬̙UUU̼˻lff˻̻\UUe\UUUlff̹̙\Uż˻˻ˬflff̬̙̼˻[˻˪jތlff̺̙̼˻[˻˺j|lff̬̙̼˻U˻˻k|Lj\^lff̺̙̬ʼ˻\˻˻k|Lj\UUUUUUUlff̬̙̪˻U˻˻k|̌\\lff̺̙̺˻\˻˻k|Lj\\U\U\lff̬̙˻U˻k|\\U\U\lff̺̹[UUUU˻UU\˻UUUUUkw|\\U\U\lff̬̻[UUUU˻UUUU˻UUUUUkw̌|\\lff̻̼˻\\˻̻k~̈UUUUUUlff̻̼˻lU̵˻̻klff̻̼˻lV̼˻̻klff̻̼˻lfU̼˻̻klff̵[\\ŵ[lfV[\\ŵ[̵[\e[ffffffffffffffffffffUUUUUUUUUUUVUUeffffVUUeUUUfffffUUU\UU\UUUUUUUU\UUUUUUUUUUeUUUUUUUUUUUffffffffffffffffffffVUUUUUUUUUefUUffffffUUfVUefffff\UUUUU\U\UUUUUUUUUUUfVUUUUUUUUUffffffffffffffffffffffffffffffffffffffffffffffffffflffffffffffffffffffffffffffffffffffffffffffffffffffffflffffffffffffffffffffffffffffffffffffffffffffffffffffflffUUUUUUUUUUUUUUUUffVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUefflffff|wwwwwwwwwwlfflffffWDDTUUUUEDDulfflff̼̼ff|EKUUUUTlfffffffffffffffffffffffffffffffffffffffff̙̙ffWTUUEKulfffffffffffffffffffffffffffffffffffffffff̜ɜff|U[UUUlfffffffffffffffffffffffffffffffffffffffff̜ɜffWU[UUUulfffffffffffffffffffffffffffffffffffffffff̌Ȍff|UU[UUUU\fffffffffffffffffffffffffffffffffffffffffffWUU[UUUUuUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUeff̬ʬff|UUU[UUUUUlff̜ʜffWUUUWUUu{UUUu|lff̜˜ffUUUUu{UUUUWUUUUlff̜̜ffUUUUUwwWUUUUuwwUUUUUwwlff̜ϜffUUUUUUUUUUUUUUUUUUUU|wlff̜˜ffUUDDTUUUUUUUUUUEDDUUwwwwwlff̜˜ffUEKUUUUUUUUTU|wwwwwwlffffffffffffffffffffffffffffffff̜˜ffUTUU\UUEKUwwwwwwlffffffffffffffffffffffffffffffff̜˜ffU[UUUUU̙X~wwwww~lffffffffffffffffffffffffffffffff̜˜ffU[UU\UUU̜wwwwwww~lffffffffffffffffffffffffffffffff̜˜ffU[UU\UUU̙xw~www~ww\ffffffffffffffffffffffffffffffff̜˜ffU[UUUUU|w̘xww~w~wwUUUUUeffUUUUUUUUUUUUUUUUUUUUUUUU̜˜ffU̼Uww|xwwwwwlff̜̉˜fݙϙ{Uuw~wwlff̜̚˜UwwwwwwwwwwwWUwuwwlff̜˜\U}wwwwwwwwwwUUwwww瘈wwwlff̜˜[UU}wwwwwwww~\UUwwwUXwwlff̜˜[UU}wwwwwwwUUwU興Xwlff̜˜UUUwwwwwwwwwwwww~\Ǔ^U煈lff̜˜[UUwwww~wwwwwwǓ^腈lff̜˜UUU~wwwwwwww~̌ȅlff̜˜\UUUww}wwwww̌Uwlff̜̈˜]UU~ww|~̌Uwwwwwwwww^lff̈{̜ʜUUU~wwww|]UUUǓwwwwwwwwwwElff̈{̜̜]UUU~wwwwwwUUUUU̘|~wwUUUUUUUUUlff̙ȫ̜\UUUUwwwwwwwwww\UUU̘LT^UUUUUUUUU^lff̙̜UUUUU~wwwwwwww|^UUUU̘\ULDUUUww^UElff̙{̩UUU~wwwwww|^UUUÜU|wwwwww^UUUUElff̙̜\UUUUUUUǓwwwwwwwwwwwUUuUElff{\U\|~UUUUǓ TUUUUwwwwwwwwwwwUUUElff{UU^\U~^UUUUUÜ033TUUUUwwwwwwwwwwwUUNUElffUU\U^UUUUUÜ #""2TUUUUwwwwwwwwwwwUUDTUdffUU]U^UUUUUUǓ0""""TUUUU~wwwwwwwwww^UUUUdff{\UUUUUU\UUUUUUǓ #""""2@UUUU~wwwwwwUU^UUUUdff\UUUUUUUUUUUUÜ0""""UUUUU~wwwwwww^^UUUUdff̜\UUUUUU\UUUUUUU #"!"2PUUUwwU^UUUUdff̜\UUUUUUUUUUUUUUU0""""UU^~wwwww^^UEDDdff̜\UUUUUUUUUUUUUUU #" !"2PU^wwwwwwwwEtwwgff̜UUUUUUUU^UUUUUU0"" ""U^wwwwwww\UU\wwwgff̜UUUUUUUUUUUUUUUUUUUUUUUUU^UUUUUU #"0w!"2P^wwwwwwwE\UUUeff̜UUUUUUUU^UUUUUU0""0U""^wwwwwww^\UU\UUUeff̜UUUUUU\^UUUUU #"0!"2Pwwwwwww\[\UDDdff{UUUUUU\^UUUUU0""0UE""Y\EUUeff{UUUUU]^UUUU ""0E!"2弻Y\EUUeff̈{UUUUU^UUUU """"^\Y\EUUeff̈{UUUUU^UUU "" 33333333""^\T\EUUeff̌{U^UÜ̙~^UUU "" 33333333""^\~^\EUUeff̌{U^UU݌̙͙~^UU "" ""^\EUUeff̈{U^UU͸̙ޜ~^^ !""0E""^\UU\EUUeff̈U\UU͘˼ޜ^""0E ""^\[\EUUeff̜U]UU݌˼͹^ !""0U""P^\Y\ETUeff̌UUUUU݌͹^""0 ""^^^^λUTUeff̈UUUUU݌͹^ !""0 ""PU^^εUTUeff̈\UUUUUθ̹~|^\""0 ""U_UU^^ΕIUTUeff̌\UUUUUθ̜~|^\ !""0 ""PU^U^UU^^UTUeff̌\UUUUÜ|Ǚ^\""  ""UUUUUUUUUU^^UTUeff̈UUUUUU~̙|^ !""""PUU^^UUUTUeff̈UUUUUww|^""""""TUU~wwwwww^^UTUeff̜ɟUUUUU~w^ !""""PTUU~wwwwwwU^οUTUeff̜UUUUUU^""""\TUU~wwwwww~^^λUnff̜UUUUUwwww^ !""P\TUUU~wwwwww~^^λUUUeff̜UUUUUU~^Y\TUUu~wwwwwwT^ΕIUUUeff̜UUUUUww^ Y\TUU~wwwwww^U^UUUeff̜{UUUUUwwwwww^\T\TUUEwwwwww~wTUUUeffUUUUUwwwwww^\~^\TUUU~wwwwwwwwWUEDTUDDdffUUUUUwwwwww^\TUUETUUUUUUUUUUEDUDDTDUUeffU^UUUwwwwww~^\TUUEDTUU^UUUUUUeffU^UUUwwwwww~^LDDETUUUDwwwwwwUUUUUUeffU^UUUwwwwww~~^TUUUUwwwwww~wwwwUUUUeff{\UUUwwwwww]TUUUUwwwwwwwwwwwUUUUeff-- title: Wase -- author: Volter\Volage -- desc: nice game, but shooter -- site: none -- license: whis game, how tutorial raycasting -- version: 0.1 -- script: lua poke4(2*0x03FFC,4) if pmem(1)>0 then menu=true end function TIC() cls() Level_Change() end -- map value function endupdate() for i=120,179 do for j=102,135 do mset(i,j,mget(i+60,j)) end end end -- pmem(0,0) local Level_Id=pmem(0) local Level_PosX=0 local Level_PosY=0 Level_PosX=Level_PosX+(Level_Id-Level_Id//4*4)*60 Level_PosY=Level_PosY+(Level_Id//4)*34 local LevelUpdate=true Level_Change=function() if btnp(5)and mget(player.posX+player.dirX,player.posY+player.dirY)==120 then Level_Id=Level_Id+1 sfx(1) pmem(0,Level_Id) pmem(1,1) reset() LevelUpdate=true Level_PosX=Level_PosX+(Level_Id-Level_Id//4*4)*60 Level_PosY=Level_PosY+(Level_Id//4)*34 timer=0 player={} camera={} object={} elseif player.health<=0 then reset() timer=0 object={} LevelUpdate=true end if LevelUpdate then for i=60,119 do for j=102,135 do mset(i,j,0) end end for i=Level_PosX,Level_PosX+59 do for j=Level_PosY,Level_PosY+33 do if wall[mget(i,j)] then mset(i%60+60,j%34+102,3) end end end load_object() load_map() pekolight(Level_PosX,Level_PosY,Level_PosX+59,Level_PosY+33) LevelUpdate=false else local mx,my,mt=mouse() local x,y,w,h=8,8,28,10 if mt and callrect(mx,my,x,y,w,h)then menu=true sfx(0) end if not menu then WorldUpdate() ObjectUpdate() PlayerUpdate() CameraUpdate() drawscreen() guns() debug_panel() endupdate() map(0,102,30,17,0,6,3) print("HP=["..player.health.."]",10,124,10) print("ammo",60,124,6) print("1)=["..weap.ammo[1].."]",88,124,7) print("2)=["..weap.ammo[2].."]",128,124,7) print("3)=["..weap.ammo[3].."]",168,124,7) rect(x,y,w,h,5) print("menu",x+2,y+2,6) else menu_update() end end end local menu_id=Level_Id function menu_update() if btnp(2) and menu_id>0 then menu_id=menu_id-1 elseif btnp(3)and menu_id<6 then menu_id=menu_id+1 elseif btnp(4)and Level_Id~=menu_id then Level_Id=menu_id pmem(0,Level_Id) sfx(1) reset() elseif btnp(4)and Level_Id==menu_id then pmem(1,0) menu=false sfx(0) end print("Level #"..menu_id.."\n <-->\n Press Z",180,10,7) print("info key:\n[Z] - shoot\n[X] - active\n[A,S] - left,rigth\n[X] - hold to select weapon",10,10,7) print("credits:\nspritet ClydeTheBat\ncode/sound Volter/Voltage\nMAPPERS:\nmap01 - Volter/Voltage\nmap02 - Ear1h\nmap03 - Carton Kobra\nmap04 - Shiroi Akuma\nmap05 - Deathwish\nmap06 - DRON12261\nbackground art Carton Kobra",10,46) end --###########################################-- -- value --###########################################-- local screen_offset=0 local sky=true wall={} for i=80,143 do wall[i]=true end block={} for i=80,143 do block[i]=true end for i=96,111 do block[i]=false end wall[96]=false wall[99]=false wall[102]=false wall[103]=false wall[104]=false object={} middle={} for i=95,111 do middle[i]=true end ScreenW=240 ScreenH=120 texs=16 ViewDistance=40 animatedtexture={ {33,34,35,36,num=5}, {37,38,39,40,39,38,37,num=6}, {41,42,43,44,43,42,41,num=28}, {45,46,47,48,47,46,45,num=25} } animatedfloat={ {55,54,53,num=40}, {50,51,52,num=33}, } function load_object() timer=0 player={ posX=3, posY=3, dirX=1, dirY=0, planeX=0, planeY=0.66, side=0, health=100, spd=0, damag_value=15, as=0 } camera={ posX=3, posY=3, dirX=1, dirY=0, planeX=0, planeY=0.66, dist=40, side=0 } end load_object() zbuff={} screen={} for i=1,ScreenW do screen[i]={} for j=1,ScreenH do screen[i][j]=0 end end cos,sin={},{} local rad=1/180*math.pi for i=1,360 do cos[i],sin[i]=math.cos(rad*i),math.sin(rad*i) end rad=nil t=0 --###########################################-- -- load texture --###########################################-- function BOOT() texture={ num={} } for i=1,32 do texture.num[79+i]=i end for i=128,143 do texture.num[i]=i-79 end for i=112,120 do texture.num[i]=i-51 end texture[0]={} sprites={ num={[1]={}} } loadtexture={ --block {{210,12},{210,12},{242,12},{242,12}}, {{209,12},{209,12},{241,12},{241,12}}, {{215,12},{215,12},{247,12},{247,12}}, {{20,12},{20,12},{21,12},{21,12}}, {{115,4},{147,4},{21,12},{21,12}}, {{117,8},{20,12},{21,12},{21,12}}, {{252,8},{252,8},{23,8},{23,8}}, {{16,8},{16,8},{16,8},{16,8}}, {{211,8},{212,8},{243,8},{244,8}}, {{113,8},{113,8},{114,12},{114,12}}, {{213,8},{213,8},{245,8},{245,8}}, {{214,8},{214,8},{246,8},{246,8}}, {{17,0},{17,0},{17,0},{17,0}}, {{215,0},{215,0},{247,0},{247,0}}, {{277,0},{277,0},{277,0},{277,0}}, {{114,12},{114,12},{114,12},{114,12}}, --middle {{26,0},{27,0},{480,0},{480,0}}, {{91,0},{91,0},{23,4},{23,4}}, {{82,0},{82,0},{83,0},{83,0}}, {{480,0},{480,0},{480,0},{480,0}}, {{480,0},{480,0},{480,0},{480,0}}, {{480,0},{480,0},{480,0},{480,0}}, {{480,0},{480,0},{480,0},{480,0}}, {{58,0},{59,0},{480,0},{480,0}}, {{125,0},{126,0},{157,0},{158,0}}, {{278,0},{279,0},{310,0},{311,0}}, {{176,0},{177,0},{178,0},{179,0}}, {{280,0},{281,0},{312,0},{313,0}}, {{276,0},{276,0},{276,0},{276,0}}, {{23,12},{23,12},{480,0},{480,0}}, {{348,0},{349,0},{380,0},{381,0}}, {{115,12},{20,12},{241,12},{21,12}}, --animated frame {{115,4},{147,12},{151,12},{151,12}}, {{116,12},{148,12},{152,12},{152,12}}, {{117,12},{149,12},{153,12},{153,12}}, {{118,12},{150,0},{154,12},{154,12}}, {{119,12},{20,12},{21,12},{21,12}}, {{120,12},{20,12},{21,12},{21,12}}, {{121,8},{20,12},{21,12},{21,12}}, {{122,8},{20,12},{21,12},{21,12}}, {{280,0},{281,0},{312,0},{313,0}}, {{282,0},{283,0},{314,0},{315,0}}, {{284,0},{285,0},{316,0},{317,0}}, {{286,0},{287,0},{318,0},{319,0}}, {{123,0},{124,0},{155,0},{156,0}}, {{123,0},{124,0},{155,0},{156,0}}, {{125,0},{126,0},{157,0},{158,0}}, {{125,0},{126,0},{157,0},{158,0}}, --11 {{343,4},{375,4},{375,4},{343,4}}, {{412,8},{412,8},{444,8},{444,8}}, {{413,8},{413,8},{445,8},{445,8}}, {{188,8},{189,8},{220,8},{221,8}}, {{94,4},{93,8},{151,12},{153,12}}, {{16,8},{16,8},{16,8},{16,8}}, {{408,12},{409,12},{440,12},{441,12}}, {{410,0},{411,0},{442,0},{443,0}}, {{346,4},{347,4},{378,4},{379,4}}, {{190,4},{191,4},{222,4},{223,4}}, {{18,4},{18,4},{17,8},{17,8}}, {{113,12},{16,8},{113,12},{16,8}}, {{350,0},{351,0},{382,0},{383,0}}, {{216,0},{217,0},{216,0},{217,0}}, {{350,4},{351,4},{382,4},{383,4}}, {{216,4},{217,4},{216,4},{217,4}}, {{350,8},{351,8},{382,8},{383,8}}, {{216,8},{217,8},{216,8},{217,8}}, {{350,12},{351,12},{382,12},{383,12}}, {{216,12},{217,12},{216,12},{217,12}}, {{464,12},{465,12},{496,12},{497,12}}, {{414,0},{415,0},{446,0},{447,0}}, {{414,4},{415,4},{446,4},{447,4}}, {{414,8},{415,8},{446,8},{447,8}}, {{414,12},{415,12},{446,12},{447,12}}, {{122,8},{145,8},{114,12},{114,12}}, } floatsky={} for i=32,47 do floatsky[i]=true end float={num={ --flat [0]={1,2}, [1]={3,4}, [2]={5,6}, [3]={7,8}, [4]={9,10}, [5]={11,12}, [6]={13,14}, [7]={33,16}, [8]={14,17}, [9]={18,19}, [10]={20,21}, [11]={22,23}, [12]={24,25}, [13]={16,11}, [14]={26,14}, [15]={16,27}, --sky flat [16]={1,28}, [17]={1,29}, [18]={30,31}, [19]={3,32}, [20]={33,34}, [21]={33,35}, [22]={11,36}, [23]={15,37}, [24]={22,28}, [25]={6,35}, [26]={14,39}, [27]={18,40}, [28]={41,42}, [29]={41,43}, [30]={41,44}, [31]={41,45}, --only sky [32]={1}, [33]={3}, [34]={5}, [35]={7}, [36]={9}, [37]={11}, [38]={13}, [39]={33}, [40]={14}, [41]={18}, [42]={20}, [43]={22}, [44]={24}, [45]={16}, [46]={26}, [47]={16}, --lump [48]={1,46}, [49]={3,47}, [50]={5,48}, [51]={7,49}, [52]={9,46}, [53]={11,47}, [54]={13,48}, [55]={15,49}, [56]={14,46}, [57]={18,47}, [58]={20,48}, [59]={22,49}, [60]={24,46}, [61]={16,47}, [62]={26,48}, [63]={16,49}, }} float[0]={} floattext={ {{253,0},{253,0},{253,0},{253,0}}, {{410,0},{411,0},{442,0},{443,0}}, {{190,0},{191,0},{222,0},{223,0}}, {{113,4},{113,4},{113,4},{113,4}}, {{339,0},{339,0},{371,0},{371,0}}, {{274,8},{274,8},{275,8},{275,8}}, {{305,0},{305,0},{305,0},{305,0}}, {{19,12},{19,12},{19,12},{19,12}}, {{343,4},{375,4},{375,4},{343,4}}, {{216,0},{217,0},{216,0},{217,0}}, {{272,4},{273,4},{272,4},{273,4}}, {{114,4},{114,4},{114,4},{114,4}}, {{23,4},{23,4},{23,4},{23,4}}, {{16,8},{16,8},{16,8},{16,8}}, {{274,4},{274,4},{275,4},{275,4}}, {{339,12},{339,12},{371,12},{371,12}}, {{306,0},{306,0},{306,0},{306,0}}, {{277,8},{277,8},{277,8},{277,8}}, {{18,4},{18,4},{18,4},{18,4}}, {{344,8},{345,8},{376,8},{377,8}}, {{339,8},{339,8},{371,8},{371,8}}, {{253,8},{253,8},{253,8},{253,8}}, {{408,12},{409,12},{440,12},{441,12}}, {{304,12},{305,12},{305,12},{304,12}}, {{18,0},{18,0},{18,0},{18,0}}, {{307,12},{307,12},{307,12},{307,12}}, {{305,12},{305,12},{305,12},{305,12}}, {{410,0},{411,0},{442,0},{443,0},sky=true}, {{53,4},{52,4},{52,4},{51,4},sky=true}, {{274,0},{274,0},{275,0},{275,0}}, {{276,8},{276,8},{276,8},{276,8},sky=true}, {{176,12},{177,12},{178,12},{179,12},sky=true}, {{400,4},{401,4},{432,4},{433,4}}, {{53,0},{52,0},{52,0},{51,0},sky=true}, {{348,4},{349,4},{380,4},{381,4},sky=true}, {{278,8},{279,8},{310,8},{311,8},sky=true}, {{276,12},{276,12},{276,12},{276,12},sky=true}, {{276,12},{276,12},{276,12},{276,12},sky=true}, {{340,8},{341,8},{372,8},{373,8},sky=true}, {{30,12},{30,12},{30,12},{30,12},sky=true}, {{274,12},{274,12},{275,12},{275,12}}, {{406,12},{57,12},{57,12},{57,12},sky=true}, {{57,12},{407,12},{57,12},{57,12},sky=true}, {{57,12},{57,12},{438,12},{57,12},sky=true}, {{57,12},{57,12},{57,12},{439,12},sky=true}, {{122,0},{122,0},{122,0},{122,0}}, {{338,4},{338,4},{370,4},{370,4}}, {{308,8},{308,8},{308,8},{308,8}}, {{336,12},{337,12},{368,12},{369,12}}, {{400,4},{401,4},{432,4},{433,4}}, {{402,4},{403,4},{434,4},{435,4}}, {{404,4},{405,4},{436,4},{437,4}}, {{30,12},{31,12},{30,12},{62,12},sky=true}, {{31,12},{62,12},{31,12},{30,12},sky=true}, {{62,12},{30,12},{62,12},{31,12},sky=true}, } spriteload={} for i=1,60 do spriteload[i]={{48,0},{48,0},{48,0},{48,0},{48,0},{48,0}} end spritepatches={ -- djungar {{48,0,0},{48,0,0},{512,4,0},{513,4,0},{544,4,0},{545,4,0},tex=2}, {{48,0,0},{48,0,0},{514,4,0},{515,4,0},{546,4,0},{547,4,0},tex=3}, {{48,0,0},{48,0,0},{516,4,0},{517,4,0},{548,4,0},{549,4,0},tex=4}, {{48,0,0},{48,0,0},{518,4,0},{519,4,0},{550,4,0},{551,4,0},tex=5}, {{48,0,0},{48,0,0},{576,4,0},{577,4,0},{608,4,0},{609,4,0},tex=6}, {{48,0,0},{48,0,0},{578,4,0},{579,4,0},{610,4,0},{611,4,0},tex=7}, {{48,0,0},{48,0,0},{580,4,0},{581,4,0},{612,4,0},{613,4,0},tex=8}, {{48,0,0},{48,0,0},{582,4,0},{583,4,0},{614,4,0},{615,4,0},tex=9}, {{48,0,0},{48,0,0},{640,4,0},{641,4,0},{672,4,0},{673,4,0},tex=10}, {{48,0,0},{48,0,0},{642,4,0},{643,4,0},{674,4,0},{675,4,0},tex=11}, {{48,0,0},{48,0,0},{644,4,0},{645,4,0},{676,4,0},{677,4,0},tex=12}, -- bone {{704,4,0},{705,4,0},{736,4,0},{737,4,0},{768,4,0},{769,4,0},tex=13}, {{706,4,0},{707,4,0},{738,4,0},{739,4,0},{770,4,0},{771,4,0},tex=14}, {{708,4,0},{709,4,0},{740,4,0},{741,4,0},{772,4,0},{773,4,0},tex=15}, {{710,4,0},{711,4,0},{742,4,0},{743,4,0},{774,4,0},{775,4,0},tex=16}, {{800,4,0},{801,4,0},{832,4,0},{833,4,0},{864,4,0},{865,4,0},tex=17}, {{802,4,0},{803,4,0},{834,4,0},{835,4,0},{866,4,0},{867,4,0},tex=18}, {{804,4,0},{805,4,0},{836,4,0},{837,4,0},{868,4,0},{869,4,0},tex=19}, {{806,4,0},{807,4,0},{838,4,0},{839,4,0},{870,4,0},{871,4,0},tex=20}, {{896,4,0},{897,4,0},{928,4,0},{929,4,0},{960,4,0},{961,4,0},tex=21}, {{898,4,0},{899,4,0},{930,4,0},{931,4,0},{962,4,0},{963,4,0},tex=22}, {{900,4,0},{901,4,0},{932,4,0},{933,4,0},{964,4,0},{965,4,0},tex=23}, --turret {{712,4,0},{713,4,0},{744,4,0},{745,4,0},{776,4,0},{777,4,0},tex=24}, {{714,4,0},{715,4,0},{746,4,0},{747,4,0},{778,4,0},{779,4,0},tex=25}, {{716,4,0},{717,4,0},{748,4,0},{749,4,0},{780,4,0},{781,4,0},tex=26}, {{718,4,0},{719,4,0},{750,4,0},{751,4,0},{782,4,0},{783,4,0},tex=27}, {{808,4,0},{809,4,0},{840,4,0},{841,4,0},{872,4,0},{873,4,0},tex=28}, {{810,4,0},{811,4,0},{842,4,0},{843,4,0},{874,4,0},{875,4,0},tex=29}, {{812,4,0},{813,4,0},{844,4,0},{845,4,0},{876,4,0},{877,4,0},tex=30}, --burrel {{48,0,0},{48,0,0},{646,8,0},{647,8,0},{678,8,0},{679,8,0},tex=31}, {{48,0,0},{48,0,0},{588,8,0},{589,8,0},{620,8,0},{621,8,0},tex=32}, --glass {{48,0,0},{48,0,0},{48,0,0},{48,0,0},{522,0,0},{523,0,0},tex=33}, --tree {{48,0,0},{48,0,0},{554,8,0},{555,8,0},{586,8,0},{587,8,0},tex=34}, --lump #1 {{682,4,0},{683,4,0},{48,0,0},{48,0,0},{48,0,0},{48,0,0},tex=35}, --lump #2 {{650,4,0},{651,4,0},{48,0,0},{48,0,0},{48,0,0},{48,0,0},tex=36}, {{652,4,0},{653,4,0},{48,0,0},{48,0,0},{48,0,0},{48,0,0},tex=37}, {{654,4,0},{655,4,0},{48,0,0},{48,0,0},{48,0,0},{48,0,0},tex=38}, {{684,4,0},{685,4,0},{48,0,0},{48,0,0},{48,0,0},{48,0,0},tex=39}, --lump #3 {{648,8,0},{649,8,0},{48,0,0},{48,0,0},{48,0,0},{48,0,0},tex=40}, {{616,8,0},{617,8,0},{48,0,0},{48,0,0},{48,0,0},{48,0,0},tex=41}, {{584,8,0},{585,8,0},{48,0,0},{48,0,0},{48,0,0},{48,0,0},tex=42}, {{618,8,0},{619,8,0},{48,0,0},{48,0,0},{48,0,0},{48,0,0},tex=43}, --projecttail {{48,0,0},{48,0,0},{520,8,0},{521,8,0},{523,8,0},{524,8,0},tex=44}, --ghost {{904,4,0},{905,4,0},{936,4,0},{937,4,0},{968,4,0},{969,4,0},tex=45}, --{{968,4,3},{969,4,3},{1000,4,3},{1001,4,3},tex=13}, --oblako {{48,0,0},{48,0,0},{590,4,0},{591,4,0},{622,4,0},{623,4,0},tex=46}, --guns {{48,0,0},{48,0,0},{48,0,0},{48,0,0},{902,4,0},{903,4,0},tex=47}, {{48,0,0},{48,0,0},{48,0,0},{48,0,0},{934,4,0},{935,4,0},tex=48}, {{48,0,0},{48,0,0},{48,0,0},{48,0,0},{966,4,0},{967,4,0},tex=49}, --loot {{48,0,0},{48,0,0},{48,0,0},{48,0,0},{998,4,0},{999,4,0},tex=50}, {{48,0,0},{48,0,0},{48,0,0},{48,0,0},{908,4,0},{909,4,0},tex=51}, {{48,0,0},{48,0,0},{48,0,0},{48,0,0},{940,4,0},{941,4,0},tex=52}, {{48,0,0},{48,0,0},{48,0,0},{48,0,0},{972,4,0},{973,4,0},tex=53}, {{48,0,0},{48,0,0},{48,0,0},{48,0,0},{1004,4,0},{1005,4,0},tex=54}, } patches={ {{26,8,0},{27,8,0},{480,0,0},{480,0,0},tex=17}, {{91,12,0},{91,12,0},{480,0,0},{480,0,0},tex=18}, {{82,8,0},{82,8,0},{83,8,0},{83,8,0},tex=19}, {{84,8,0},{85,8,0},{86,8,0},{87,8,0},tex=20}, {{50,8,0},{50,8,0},{51,8,0},{52,8,0},tex=21}, {{480,8,0},{480,8,0},{28,12,0},{29,12,0},tex=22}, {{218,12,0},{219,12,0},{250,12,0},{251,12,0},tex=23}, {{480,0,0},{480,0,0},{26,12,0},{27,12,0},tex=30}, {{348,12,0},{349,12,0},{380,12,0},{381,12,0},tex=31}, {{480,0,0},{187,4,0},{180,12,0},{480,0,0},tex=45}, {{480,0,0},{186,4,0},{181,12,0},{480,0,0},tex=46}, {{480,0,0},{185,4,0},{182,12,0},{480,0,0},tex=47}, {{480,0,0},{184,4,0},{183,12,0},{480,0,0},tex=48}, } for i=1,#loadtexture do texture[i]=loadtex(loadtexture[i]) end for i=1,#floattext do if floattext[i].sky then float[i]=loadsky(floattext[i]) else float[i]=loadtex(floattext[i]) end end for i=1,#spriteload do sprites[i]=loadtex(spriteload[i]) end for i=1,#patches do texture[patches[i].tex]=patchtex(texture[patches[i].tex],patches[i],4) end for i=1,#spritepatches do sprites[spritepatches[i].tex]=patchtex(sprites[spritepatches[i].tex],spritepatches[i],4) end loadtexture=nil floattext=nil spriteload=nil skytext=nil pekolight(Level_PosX,Level_PosY,Level_PosX+59,Level_PosY+33) sprite={} dinlighter={} flashlighter={} -- poke4(2*0x03FFC, 4) function podstava(x,y) local tail={mget(x+1,y), mget(x,y+1), mget(x,y-1), mget(x-1,y)} local score={} local n=0 for j=1,4 do n=0 for i=1,4 do if tail[j]==tail[i] then n=n+1 end end score[j]={n,j} end table.sort(score,function(a,b) return a[1]>b[1] end) return tail[score[1][2]] end function load_map() local povorot=function(ang) local mass=player local oldDirX=mass.dirX mass.dirX=mass.dirX*cos[ang]-mass.dirY*sin[ang] mass.dirY=oldDirX*sin[ang]+mass.dirY*cos[ang] oldPlaneX=mass.planeX mass.planeX=mass.planeX*cos[ang]-mass.planeY*sin[ang] mass.planeY=oldPlaneX*sin[ang]+mass.planeY*cos[ang] end for i=Level_PosX,Level_PosX+60 do for j=Level_PosY,Level_PosY+34 do if mget(i,j)==64 then player.posX,player.posY=i+.5,j+.5 elseif mget(i,j)==70 then player.posX,player.posY=i+.5,j+.5 povorot(90) elseif mget(i,j)==71 then player.posX,player.posY=i+.5,j+.5 povorot(180) elseif mget(i,j)==72 then player.posX,player.posY=i+.5,j+.5 povorot(270) elseif mget(i,j)==65 then Create_object({posX=i+.5,posY=j+.5},shablon.doggy) elseif mget(i,j)==66 then Create_object({posX=i+.5,posY=j+.5},shablon.lighting) elseif mget(i,j)==68 then Create_object({posX=i+.5,posY=j+.5},shablon.skelet) elseif mget(i,j)==69 then Create_object({posX=i+.5,posY=j+.5},shablon.turret) elseif mget(i,j)==73 then Create_object({posX=i+.5,posY=j+.5},shablon.burrel) elseif mget(i,j)==78 then Create_object({posX=i+.5,posY=j+.5},shablon.glass) elseif mget(i,j)==77 then Create_object({posX=i+.5,posY=j+.5},shablon.tree) elseif mget(i,j)==76 then Create_object({posX=i+.5,posY=j+.5},shablon.lump1) elseif mget(i,j)==75 then Create_object({posX=i+.5,posY=j+.5},shablon.lump2) elseif mget(i,j)==74 then Create_object({posX=i+.5,posY=j+.5},shablon.lump3) elseif mget(i,j)==79 then Create_object({posX=i+.5,posY=j+.5},shablon.oblako) elseif mget(i,j)==144 then Create_object({posX=i+.5,posY=j+.5},shablon.shotgun) elseif mget(i,j)==146 then Create_object({posX=i+.5,posY=j+.5},shablon.plasmagun) elseif mget(i,j)==147 then Create_object({posX=i+.5,posY=j+.5},shablon.heal1) elseif mget(i,j)==148 then Create_object({posX=i+.5,posY=j+.5},shablon.heal2) elseif mget(i,j)==149 then Create_object({posX=i+.5,posY=j+.5},shablon.pt1) elseif mget(i,j)==150 then Create_object({posX=i+.5,posY=j+.5},shablon.pt2) elseif mget(i,j)==151 then Create_object({posX=i+.5,posY=j+.5},shablon.pt3) end end end for i=Level_PosX,Level_PosX+60 do for j=Level_PosY,Level_PosY+34 do local tl=mget(i,j) if (tl>63 and tl<80) or (tl>143 and tl<152) then mset(i,j,podstava(i,j)) end end end povorot=nil end end function loadtex(patch) local mass={} local direct={} for i=0,#patch-1 do direct[i+1]=i%2*8+i//2*128 end local n=0 local ColorOffset for j=1,#patch do ColorOffset=patch[j][2] local id=patch[j][1]%2*8+(patch[j][1]//2)*128 for i=0,#patch*32-1 do if i%16>7 then n=8 else n=0 end mass[i+1+n+direct[j]]=peek2(0x10000+i+n+id)+ColorOffset end end return mass end function patchtex(mass,patch) local direct={} for i=0,#patch-1 do direct[i+1]=i%2*8+i//2*128 end local n=0 local ColorOffset local alf for j=1,#patch do ColorOffset=patch[j][2] alf=patch[j][3] local id=patch[j][1]%2*8+(patch[j][1]//2)*128 for i=0,#patch*32-16 do if i%16>7 then n=8 else n=0 end if peek2(0x10000+i+n+id)~=alf then mass[i+1+n+direct[j]]=peek2(0x10000+i+n+id)+ColorOffset end end end return mass end function loadsky(patch) local mass={} local direct={} for i=0,#patch-1 do direct[i+1]=i%2*8+i//2*128 end local n=0 local ColorOffset for j=1,#patch do ColorOffset=patch[j][2] local id=patch[j][1]%2*8+(patch[j][1]//2)*128 for i=0,#patch*32-1 do if i%16>7 then n=8 else n=0 end if peek2(0x10000+i+n+id)>0 then mass[i+1+n+direct[j]]=peek2(0x10000+i+n+id)+ColorOffset end end end return mass end --###########################################-- -- player update --###########################################-- function PlayerUpdate() playertail=mget(player.posX,player.posY) local Player_buttom={} for i=1,8 do Player_buttom[i]=btn(i-1) end if weap.t>0 and weap.t<8 and weap.lth then dinlight(player.posX,player.posY,10) cz=cz+math.cos(weap.t/5)*2 end player=optraymove(player,Player_buttom,{[3]=true,[2]=true}) end --###########################################-- -- world update --###########################################-- function WorldUpdate() for i=60,119 do for j=102,135 do if mget(i,j)<3 then mset(i,j,0) end end end if mget(player.posX%60+60,player.posY%34+102)<1 then mset(player.posX%60+60,player.posY%34+102,1)end for _,p in pairs(object)do if p.blocked then mset(p.posX%60+60,p.posY%34+102,2) end end for k,p in pairs(animatedtexture) do m=(timer//1%#p)+1 texture[p.num]=texture[p[m]] end for k,p in pairs(animatedfloat) do m=(timer//5%#p)+1 float[p.num]=float[p[m]] end timer=timer+.5 --switch local px,py=player.posX+player.dirX,player.posY+player.dirY local sw_tail=mget(px,py) if btnp(5)and switch[sw_tail]then sfx(1) local text=texture[switch.num[sw_tail][1]] texture[switch.num[sw_tail][1]]=texture[switch.num[sw_tail][2]] texture[switch.num[sw_tail][2]]=text door[switch.num[sw_tail][3]][1]=true wall[sw_tail+1]=false block[sw_tail+1]=false middle[sw_tail+1]=true switch[sw_tail]=false for i=Level_PosX,Level_PosX+60 do for j=Level_PosY,Level_PosY+34 do if mget(i,j)==sw_tail+1 then mset(i%60+60,j%34+102,0) end end end end for k,p in pairs(door)do if p[2]==0 then p.texture=texture[p[3]] p[2]=p[2]-1 elseif p[1]and p[2]>1 then p[2]=p[2]-4 table.move(texture[p[3]],p[2]//16*16,(p[2]+16)//16*16,(p[2]+16)//16*16) for i=1,16 do texture[p[3]][p[2]//16*16+i]=0 end end end end door={ {false,256,texture={},62}, {false,256,texture={},64}, {false,256,texture={},66}, {false,256,texture={},68} } switch={ num={[112]={61,70,1},[114]={63,71,2},[116]={65,72,3},[118]={67,73,4}}, [112]=true,[114]=true,[116]=true,[118]=true } --###########################################-- -- object update --###########################################-- function setRelObjAngle(mass,ang) ang=ang%360+1 local oldDirX=mass.dirX mass.dirX=mass.dirX*cos[ang]-mass.dirY*sin[ang] mass.dirY=oldDirX*sin[ang]+mass.dirY*cos[ang] oldPlaneX=mass.planeX mass.planeX=mass.planeX*cos[ang]-mass.planeY*sin[ang] mass.planeY=oldPlaneX*sin[ang]+mass.planeY*cos[ang] return mass end function setAbsObjAngle(mass,ang) ang=ang%360+1 mass.dirX=1 mass.dirY=0 mass.planeX=0 mass.planeY=0.66 local oldDirX=mass.dirX mass.dirX=mass.dirX*cos[ang]-mass.dirY*sin[ang] mass.dirY=oldDirX*sin[ang]+mass.dirY*cos[ang] oldPlaneX=mass.planeX mass.planeX=mass.planeX*cos[ang]-mass.planeY*sin[ang] mass.planeY=oldPlaneX*sin[ang]+mass.planeY*cos[ang] return mass end state = {} function Create_State(name,mass) if mass then state[name]=mass end end function Next_State(e, state) state = state or 1 e.state=e.statelist[e.state][state+1] e.timer=0 end Create_State("empty", function(e) return e end) Create_State("death", function(e) if e.timer%2==0 then e.sprite=1 else e.sprite=e.death_sprite end if e.timer>60 then e.bool=true end return e end) Create_State("damage", function(e) e.sprite=e.damage_sprite if e.health<0 then Next_State(e,2) end if e.timer>30 then Next_State(e) end return e end) Create_State("sleep_enemy",function(e) local angle=(math.atan2(player.posY-e.posY,player.posX-e.posX)/math.pi*180)%360 if hitscan(e,angle,player) then Next_State(e) end return e end) Create_State("run_enemy",function(e) local a = e.timer>60 if (a) then Next_State(e) end e.button[1] = not a return e end) Create_State("closing_enemy", function(e) local is_far = e.dirX*e.dirX+e.dirY*e.dirY > 25 -- = 5^2 if e.timer%15 == 0 then e.dirX = player.posX - e.posX e.dirY = player.posY - e.posY if is_far then setRelObjAngle(e, math.random(-45, 45)) end end e.spd = 0.005 e.button[1] = is_far if not is_far then Next_State(e) end return e end) Create_State("predash_enemy",function(e) e.dirX = player.posX - e.posX e.dirY = player.posY - e.posY e.sprite=e.stay_sprite if e.timer>30 then Next_State(e) end return e end) Create_State("dash_enemy",function(e) e.spd = 0.06 local angle=(math.atan2(player.posY-e.posY,player.posX-e.posX)/math.pi*180)%360 e.sprite=e.attack_sprite if e.timer>9 then Next_State(e) end if e.dirX*e.dirX+e.dirY*e.dirY <= 9 and hitscan(e,angle,player) then damage_player(1) end return e end) Create_State("aim_enemy",function(e) e.dirX = player.posX - e.posX e.dirY = player.posY - e.posY e.sprite=e.stay_sprite if e.timer>120 then Next_State(e) end return e end) Create_State("aim_enemy_2",function(e) e.dirX = player.posX - e.posX e.dirY = player.posY - e.posY e.sprite=e.stay_sprite if e.timer>40 then Next_State(e) end return e end) Create_State("shoot_bullet",function(e) local angle=(math.atan2(e.dirY,e.dirX)/math.pi*180+math.random(-45,45))%360 e.sprite=e.attack_sprite if e.timer>8 then sfx(3) if hitscan(e,angle,player) then damage_player(15)end Next_State(e) end return e end) Create_State("wait_enemy",function(e) e.dirX = player.posX - e.posX e.dirY = player.posY - e.posY e.sprite=e.stay_sprite if e.timer>90 then Next_State(e) end return e end) Create_State("explove",function(e) local n=0 sfx(6) for i=1,#object do e.dirX = object[i].posX - e.posX e.dirY = object[i].posY - e.posY local angle=(math.atan2(e.dirY,e.dirX)/math.pi*180)%360 local bool,dist=hitscan(e,angle,object[i]) if bool and dist<.3 then damage_enemy({damag_value=50},object[i]) end end e.dirX = player.posX - e.posX e.dirY = player.posY - e.posY local angle1=(math.atan2(e.dirY,e.dirX)/math.pi*180+math.random(-45,45))%360 local bool1,dist1=hitscan(e,angle1,player) if bool1 and dist1<.3 then damage_player(50) end Next_State(e) return e end) function Create_object(mass,shabi) object[#object+1]={ posX=0, posY=0, dirX=1, dirY=0, dir=1, spd=0,as=0, aspd=0, health=3, planeX=0, planeY=0.66, collision = {}, state=1, statelist={{"empty", 1},{"empty", 1}}, timer=0,bool=false, button={false,false,false,false}, update=function(e) return e end } if shabi then for k,p in pairs(shabi)do object[#object][k]=p end end for k,p in pairs(mass)do object[#object][k]=p end end function ObjectUpdate() if (time()//100)%100==50 and math.random(0,1000)==999 then Create_object({posX=Level_PosX+math.random(0,59)+.5,posY=Level_PosY+math.random(0,33)+.5} ,shablon.ghost) end for i=1,#object do if object[i]~=nil then local e=object[i] e=e.update(e) e=optraymove(e,e.button,e.collision,e.aspd) e.timer=e.timer+1 e = state[e.statelist[e.state][1]](e) -- state["run"](e) sprite[#sprite+1]={e.posX,e.posY,24,16,e.sprite} -- add to draw array if e.bool then table.remove(object,i) end end end local objdist={} for i=1,#object do object[i].id=false if object[i].act then objdist[#objdist+1]={(player.posX*8-object[i].x)^2+(player.posY*8-object[i].y)^2,i} end end table.sort(objdist,function(a,b)return a[1]0) or (angl<360 and angl>315)then e.sprite=2+(e.timer//10)%2*4 elseif angl>45 and angl<135 then e.sprite=5+(e.timer//10)%2*4 elseif angl>135 and angl<225 then e.sprite=3+(e.timer//10)%2*4 elseif angl>225 and angl<315 then e.sprite=4+(e.timer//10)%2*4 end return e end }, skelet = { name="bone", blocked=true, sprite = 13, damage_sprite = 21, death_sprite = 23, attack_sprite = 22, stay_sprite=13, health=20, collision = {[1]=true,[3]=true}, state=3, statelist={ {"death", 1}, -- 1 {"damage", 4,1}, -- 2 {"sleep_enemy", 4}, -- 3 {"closing_enemy", 5}, -- 4 {"aim_enemy", 6}, -- 5 {"shoot_bullet", 4}, -- 6 }, update = function(e) local angl = searchangle(e,player) if (angl<45 and angl>0) or (angl<360 and angl>315)then e.sprite=13+(e.timer//10)%2*4 elseif angl>45 and angl<135 then e.sprite=16+(e.timer//10)%2*4 elseif angl>135 and angl<225 then e.sprite=14+(e.timer//10)%2*4 elseif angl>225 and angl<315 then e.sprite=15+(e.timer//10)%2*4 end return e end, }, turret = { name="marusya", blocked=true, sprite = 24, damage_sprite = 27, death_sprite = 29, attack_sprite = 28, stay_sprite=24, health=15, collision = {[1]=true,[3]=true}, state=3, statelist={ {"death", 1}, -- 1 {"damage", 4,1}, -- 2 {"sleep_enemy", 4}, -- 3 {"wait_enemy", 5}, -- 4 {"aim_enemy_2", 6}, -- 5 {"shoot_bullet", 7}, -- 6 {"aim_enemy_2", 8}, -- 5 {"shoot_bullet", 9}, -- 6 {"aim_enemy_2", 10}, -- 5 {"shoot_bullet", 4}, -- 6 }, update = function(e) local angl = searchangle(e,player) if (angl<45 and angl>0) or (angl<360 and angl>315)then e.sprite=24 elseif angl>45 and angl<135 then e.sprite=27 elseif angl>135 and angl<225 then e.sprite=25 elseif angl>225 and angl<315 then e.sprite=26 end return e end, }, burrel={ name = "caboom", blocked=true, sprite = 31, death_sprite = 32, state=3, statelist={ {"death", 1}, {"explove", 1}, {"sleep_enemy",3}, }, update=function(e) return e end }, glass = { name = "trava", sprite = 33, notcollision=true, update = function(e) return e end, }, tree = { name = "derevo", blocked=true, sprite = 34, update = function(e) return e end, }, lump1 = { name = "migalka", sprite = 36, notcollision=true, update = function(e) local timer=e.timer//10 e.sprite=timer%4+36 flashlight(e.posX,e.posY,50,e.timer%45*8+1) return e end, }, lump2 = { name = "lumpa", sprite = 35, notcollision=true, update = function(e) if e.timer%70>60 or e.timer%120>110 then dinlight(e.posX,e.posY,15) end return e end, }, lump3 = { name = "piypuy", sprite = 40, notcollision=true, update = function(e) local timer=e.timer//10 e.sprite=timer%4+40 dinlight(e.posX,e.posY,(cos[(e.timer%45*8+1)]+1)*10) return e end, }, ghost = { name = "timmy", sprite = 45, stat=0, notcollision=true, update = function(e) if e.timer%2==0 then e.sprite=1 else e.sprite=45 end if e.timer>128 then e.stat=math.random(0,32) e.timer=0 end if e.stat==0 then e.dirX=0 e.dirY=1 e.spd=0.01 elseif e.stat==1 then e.dirX=0 e.dirY=-1 e.spd=0.01 elseif e.stat==2 then e.dirX=1 e.dirY=0 e.spd=0.01 elseif e.stat==3 then e.dirX=-1 e.dirY=0 e.spd=0.01 elseif e.stat==4 then e.dirX = player.posX - e.posX e.dirY = player.posY - e.posY e.spd=0.01 elseif e.stat==5 then e.posX=math.random(0,59) e.posY=math.random(0,33) e.timer=129 end return e end, }, oblako = { name = "dumok", sprite = 46, notcollision=true, update = function(e) if e.timer%2==0 then e.sprite=1 else e.sprite=46 end return e end, }, shotgun = { name = "boomstick", sprite = 47, notcollision=true, update = function(e) local bool,bl e,bool=item(e) for i=1,#weap.id_list do if weap.id_list[i]=="shot" then bl=true end end if bool and not bl then weap.id_list[#weap.id_list+1]="shot" weap.ammo[2]=weap.ammo[2]+2 sfx(2) deb(e.name) elseif bool then weap.ammo[2]=weap.ammo[2]+2 sfx(2) end return e end, }, plasmagun = { name = "plasma", sprite = 49, notcollision=true, update = function(e) local bool e,bool=item(e) for i=1,#weap.id_list do if weap.id_list[i]=="plsm" then bl=true end end if bool and weap.id_list["plsm"]==nil then weap.id_list[#weap.id_list+1]="plsm" weap.ammo[3]=weap.ammo[3]+5 deb(e.name) sfx(2) elseif bool then weap.ammo[3]=weap.ammo[3]+5 sfx(2) end return e end, }, heal1 = { name = "hl", sprite = 51, notcollision=true, update = function(e) local bool e,bool=item(e) if bool and player.health<100 then player.health=player.health+25 sfx(2) deb(e.name) else e.bool=false end return e end, }, heal2 = { name = "hl", sprite = 52, notcollision=true, update = function(e) local bool e,bool=item(e) if bool and player.health<100 then player.health=player.health+25 sfx(2) deb(e.name) else e.bool=false end return e end, }, pt1 = { name = "boxammo", sprite = 50, notcollision=true, update = function(e) local bool e,bool=item(e) if bool and weap.ammo[1]1 then aim=510 obj.health = obj.health - mass.damag_value obj.state = 2 end end if pmem(0)==6 then Create_object({posX=Level_PosX+math.random(0,59)+.5,posY=Level_PosY+math.random(0,33)+.5} ,shablon.ghost) trace(#object) end --###########################################-- -- effects update --###########################################-- effects = {} function new_effects() end --###########################################-- -- draw 3dworld --###########################################-- function CameraUpdate() camera.posX=player.posX camera.posY=player.posY camera.dirX=player.dirX camera.dirY=player.dirY camera.planeX=player.planeX camera.planeY=player.planeY rayfloor(camera,68,132) for i=1,ScreenW do local rx,ry,dist,tail,wallx,wally zbuff[i]={} camera,rx,ry,dist,tail,wallx,wally= raycaster(camera,i,ScreenW) local num=0 while dist<20 and middle[tail] and num<5 do num=num+1 local oldx,oldy=wallx,wally wallx,wally,camera.side,rx,ry,dist,tail= RaycasterRepeat(wallx,wally,i,ScreenW,rx,ry,dist,camera.side) end end raysprite(camera) for i=1,ScreenW do table.sort(zbuff[i],function(a,b) return a[2]>b[2] end) raycasterdraw(zbuff[i][1][1],zbuff[i][1][2],zbuff[i][1][3],zbuff[i][1][4],zbuff[i][1][5],i) for j=2,#zbuff[i] do if #zbuff[i][j]<7 then raycasterdrawmiddle(zbuff[i][j][1],zbuff[i][j][2],zbuff[i][j][3],zbuff[i][j][4],zbuff[i][j][5],i) else SpriteDraw(zbuff[i][j],i) end end end end function rayfloor(mass,i,h) rayDirX0 = mass.dirX - mass.planeX rayDirY0 = mass.dirY - mass.planeY rayDirX1 = mass.dirX + mass.planeX rayDirY1 = mass.dirY + mass.planeY for y=i,h-16 do local p=y-68 local rowDistance=68/p local floorStepX = rowDistance * (rayDirX1 - rayDirX0) / 240 local floorStepY = rowDistance * (rayDirY1 - rayDirY0) / 240 local floorX = mass.posX + rowDistance * rayDirX0 local floorY = mass.posY + rowDistance * rayDirY0 local tx,ty,color for x=1,239,2 do local celltex=mget(floorX//1,floorY//1) local light=mget(floorX%60+120,floorY%34+102) if float.num[celltex]==nil then celltex=2 end if light>4 then light=4 end tx=math.floor(texs * (floorX-floorX//1))%texs ty=math.floor(texs * (floorY-floorY//1))%texs floorX=floorX+floorStepX*2 floorY=floorY+floorStepY*2 color=float[float.num[celltex][1]][(texs * ty + tx)%256+1] if color then if color%4>light then color=color-1 end end screen[x][y]=color screen[x+1][y]=color screen[x][y+1]=color screen[x+1][y+1]=color if not floatsky[celltex] then color = float[float.num[celltex][2]][(texs * ty + tx)%256+1] if color then if color%4>light then color=color-1 end end screen[x][132-y]=color screen[x+1][132-y]=color screen[x][133-y]=color screen[x+1][133-y]=color else screen[x][134-y]=nil screen[x+1][134-y]=nil screen[x][135-y]=nil screen[x+1][135-y]=nil end end end end function raycaster(mass,i,maxi) local mapX=math.floor(mass.posX) local mapY=math.floor(mass.posY) local cameraX=2*i/maxi-1 local rayDirX=mass.dirX+mass.planeX*cameraX local rayDirY=mass.dirY+mass.planeY*cameraX local deltaDistX = math.abs(1 / rayDirX) local deltaDistY = math.abs(1 / rayDirY) local stepX,stepY local tail if rayDirX<0 then stepX=-1 sideDistX=(mass.posX-mapX)*deltaDistX else stepX=1 sideDistX=(mapX+1-mass.posX)*deltaDistX end if rayDirY<0 then stepY=-1 sideDistY=(mass.posY-mapY)*deltaDistY else stepY=1 sideDistY=(mapY+1-mass.posY)*deltaDistY end local hit=0 local n=0 while hit==0 and nb[1] end) for i = 1,#sprite do local id=spriteDistance[i][2] local light=mget(math.floor(sprite[id][1])%60//1+120,math.floor(sprite[id][2])%34//1+102) local spriteX = sprite[id][1] - mass.posX local spriteY = sprite[id][2] - mass.posY local invDet = 1 / (mass.planeX * mass.dirY - mass.dirX * mass.planeY) local transformX = invDet * (mass.dirY * spriteX - mass.dirX * spriteY) local transformY = invDet * (-mass.planeY * spriteX + mass.planeX * spriteY) local spriteScreenX = math.floor(120 * (1 + transformX / transformY)) local spriteHeight = math.abs(math.floor(136 / (transformY))) local drawStartY = -spriteHeight //2 + 68 if drawStartY < 10 then drawStartY = 10 end local drawEndY = spriteHeight // 2 + 68 if drawEndY >= 117 then drawEndY = 117 end local spriteWidth = spriteHeight-- math.abs((136 // (transformY))) local drawStartX = -spriteWidth // 2 + spriteScreenX if drawStartX < 1 then drawStartX = 1 end local drawEndX = spriteWidth // 2 + spriteScreenX if drawEndX >= 240 then drawEndX = 240 end if sprite[id][6] then player.ang=drawStartX/20-5 end for stripe = drawStartX+1,drawEndX-1 do local texX = (256 * (stripe - (-spriteWidth / 2 + spriteScreenX)) * 16 / spriteWidth) // 256 if(transformY > 0 and stripe > 0 and stripe < 240 and zbuff[stripe]~=nil and transformY < zbuff[stripe][#zbuff[stripe]][2]) then zbuff[stripe][#zbuff[stripe]+1]={drawEndY,transformY,texX,drawStartY,spriteHeight,id,light} end end end end function raycasterdraw(side,perpWallDist,WallX,WallY,tail,i) local texwall if side==0 then texwall=WallY-math.floor(WallY) else texwall=WallX-math.floor(WallX) end local texX=(math.floor(texwall*texs))%16+1 local lineH=math.floor(136/perpWallDist) local drawStart = math.floor(-lineH /2 + 68) if drawStart < 0 then drawStart = 1 end local drawEnd = math.floor(lineH / 2 + 68) if drawEnd >= 117 then drawEnd = 117 end local step=texs/lineH local texPos = (drawStart-68 + lineH/2) * step if texture.num[tail]~=nil and texture[texture.num[tail]]~=nil then local light=mget(WallX%60+120,WallY%34+102) for y=drawStart,drawEnd do local texY =math.floor(texPos)%texs texPos =texPos + step local text=texture[texture.num[tail]][texs*texY+texX] if text then if text%4>light then text=text-1 end screen[i][y]=text else screen[i][y]=nil end end end end function raycasterdrawmiddle(side,perpWallDist,WallX,WallY,tail,i) local texwall if side==0 then texwall=WallY-math.floor(WallY) else texwall=WallX-math.floor(WallX) end local texX=(math.floor(texwall*texs))%16+1 local lineH=math.floor(136/perpWallDist) local drawStart = math.floor(-lineH / 2 + 68) if drawStart < 0 then drawStart = 1 end local drawEnd = math.floor(lineH / 2 + 68) if drawEnd >= 117 then drawEnd = 117 end local step=texs/lineH local texPos = (drawStart-68 + lineH/2) * step if texture.num[tail]~=nil and texture[texture.num[tail]]~=nil then local light=mget(WallX%60+120,WallY%34+102) for y=drawStart,drawEnd do local texY =math.floor(texPos)%texs texPos =texPos + step local text=texture[texture.num[tail]][texs*texY+texX] if text~=nil and text>0 then if text%4>light then text=text-1 end screen[i][y]=text end end end end function SpriteDraw(mass,stripe) for y = mass[4]+1,mass[1]-1 do local d = y * 4 - 136 * 2 + mass[5] * 2 local texY = ((d * sprite[mass[6]][4]) / mass[5]) // 2.6 local color = sprites[sprite[mass[6]][5]][(16 * texY + mass[3])%384+1] if color~=3 then if color%4>mass[7] then color=color-1 end screen[stripe//1][y//1] = color end end end local scrl=0 function drawscreen() if not rendermap then local mass=player local invDet = 1 / (mass.planeX * mass.dirY - mass.dirX * mass.planeY) local transformX = invDet * (mass.dirY * 10 - mass.dirX * 10) local transformY = invDet * (-mass.planeY * 10 + mass.planeX * 10) local scrl = (math.atan2(transformY,transformX)/math.pi*180+180) map(scrl/8,85,31,12,-scrl%8,0) for i=1,ScreenW do for j=1,ScreenH do if screen[i][j] then pix(i,j,screen[i][j]) end screen[i][j]=0 end end sprite={} --]] end end function drawscreenpain() --poke4(2*0x03FFC, 4) angl=angl%240 scrl=cos[math.floor((t)*16)%360+1]*player.spd*10 --map((angl/8),102,31,12,8-angl%8+scrl,0) poke4(2*0x03FFC,2)--[ for j=1,ScreenH do if math.random(1,30)>=5 then for i=1,ScreenW do if screen[i][j] then -- pix((i+scrl+math.random(-25,25))%240,j,screen[i][j]) else -- pix(i+scrl,j,screen[i][j]) end screen[i][j]=0 end end end --]] end --###########################################-- -- debuging --###########################################-- text_debil={} function deb(string) text_debil[#text_debil+1]=string end function debug_panel() local global="" for k,p in pairs(text_debil)do if k%3==0 then global=global.."["..tostring(p).."]\n" else global=global.."["..tostring(p).."]" end end print(global,0,0,13) print(global,2,0,15) if timer%64==0 then text_debil[#text_debil]=nil end -- text_debil={} end --###########################################-- -- lighting --###########################################-- local lightblock={} local lamps={} for i=48,63 do lightblock[i]=true lamps[i]=true end function pekolight(x,y,w,h) local massive={ posX=0, posY=0, dirX=1, dirY=0, planeX=0, planeY=0.66, dist=10 } local distlight=5 for i=0,119 do for j=0,33 do mset(120+i,102+j,0) if mget(i,j)==52 then mset(120+i,102+j,3) end end end if distlight<35 then for i=x,x+w do for j=y,y+h do if lightblock[mget(i,j)] then local x1,y1=180+i-x,102+j-y mset(x1,y1,240) massive.posX=x1+.5 massive.posY=y1+.5 if lamps[mget(i,j)] then massive.dist=10 else massive.dist=5 end local angl=5 for k=1,72 do local oldDirX=massive.dirX massive.dirX=massive.dirX*cos[angl]-massive.dirY*sin[angl] massive.dirY=oldDirX*sin[angl]+massive.dirY*cos[angl] oldPlaneX=massive.planeX massive.planeX=massive.planeX*cos[angl]-massive.planeY*sin[angl] massive.planeY=oldPlaneX*sin[angl]+massive.planeY*cos[angl] optray(massive,k,360,x,y,1,180,102) end end end end end end function dinlight(x,y,dist) local massive={ posX=x%60+120, posY=y%34+102, dirX=1, dirY=0, planeX=0, planeY=0.66, dist=dist/2 } mset(x%60+120,y%34+102,mget(x%60+180,y%34+102)+dist) local angl=10 for k=1,36 do local oldDirX=massive.dirX massive.dirX=massive.dirX*cos[angl]-massive.dirY*sin[angl] massive.dirY=oldDirX*sin[angl]+massive.dirY*cos[angl] oldPlaneX=massive.planeX massive.planeX=massive.planeX*cos[angl]-massive.planeY*sin[angl] massive.planeY=oldPlaneX*sin[angl]+massive.planeY*cos[angl] optray(massive,k,360,0,0,dist,120,102) end end function flashlight(x,y,dist,ang) local massive={ posX=x%60+120, posY=y%34+102, dirX=1, dirY=0, planeX=0, planeY=0.66, dist=20 } local oldDirX=massive.dirX massive.dirX=massive.dirX*cos[ang]-massive.dirY*sin[ang] massive.dirY=oldDirX*sin[ang]+massive.dirY*cos[ang] oldPlaneX=massive.planeX massive.planeX=massive.planeX*cos[ang]-massive.planeY*sin[ang] massive.planeY=oldPlaneX*sin[ang]+massive.planeY*cos[ang] mset(x+120,y+102,dist) local angl=2 for k=1,45 do local oldDirX=massive.dirX massive.dirX=massive.dirX*cos[angl]-massive.dirY*sin[angl] massive.dirY=oldDirX*sin[angl]+massive.dirY*cos[angl] oldPlaneX=massive.planeX massive.planeX=massive.planeX*cos[angl]-massive.planeY*sin[angl] massive.planeY=oldPlaneX*sin[angl]+massive.planeY*cos[angl] optray(massive,k,360,0,0,dist,120,102) end end function optray(mass,i,maxi,x,y,dist,x1,y1) local mapX,mapY=mass.posX//1,mass.posY//1 local cameraX=2*i/maxi-1 local rayDirX=mass.dirX+mass.planeX*cameraX local rayDirY=mass.dirY+mass.planeY*cameraX local deltaDistX = math.abs(1 / rayDirX) local deltaDistY = math.abs(1 / rayDirY) local stepX,stepY if rayDirX<0 then stepX=-1 sideDistX=(mass.posX-mapX)*deltaDistX else stepX=1 sideDistX=(mapX+1-mass.posX)*deltaDistX end if rayDirY<0 then stepY=-1 sideDistY=(mass.posY-mapY)*deltaDistY else stepY=1 sideDistY=(mapY+1-mass.posY)*deltaDistY end local hit=0 local n=0 local k=mass.dist while hit==0 and nx1 and mapY>y1 and mapX4 then bll=4 end mset(mapX,mapY,bll) end end end --###########################################-- -- tech function --###########################################-- function searchangle(mass,obj) return math.floor((math.atan2(mass.posY-obj.posY,mass.posX-obj.posX)+math.pi-math.atan2(mass.dirY,mass.dirX))/math.pi*180)%360 end function move(p,bool) if bool[1]then p.sy=p.sy-.1 p.dir=1 elseif bool[2]then p.sy=p.sy+.1 p.dir=3 else if p.sy<0.1 and p.sy>-0.1 then p.sy=0 end if p.sy>0 then p.sy=p.sy-.05 elseif p.sy<0 then p.sy=p.sy+.05 end end if bool[3]then p.sx=p.sx-.1 p.dir=4 elseif bool[4]then p.sx=p.sx+.1 p.dir=2 else if p.sx<0.1 and p.sx>-0.1 then p.sx=0 end if p.sx>0 then p.sx=p.sx-.05 elseif p.sx<0 then p.sx=p.sx+.05 end end if p.sx>p.ms then p.sx=p.ms elseif p.sx<-p.ms then p.sx=-p.ms end if p.sy>p.ms then p.sy=p.ms elseif p.sy<-p.ms then p.sy=-p.ms end return(p) end function collision(p) local boolx,booly=false,false local h,w=p.h/3,p.w/3 if solid(p.x+p.sx,p.y) or solid(p.x+p.sx+p.w,p.y) or solid(p.x+p.sx,p.y+h) or solid(p.x+p.sx,p.y+p.h-h) or solid(p.x+p.sx+p.w,p.y+h) or solid(p.x+p.sx+p.w,p.y+p.h-h) or solid(p.x+p.sx+p.w,p.y+p.h) or solid(p.x+p.sx,p.y+p.h)then p.sx=0 boolx=true end if solid(p.x,p.y+p.sy) or solid(p.x+p.w,p.y+p.sy) or solid(p.x+w,p.y+p.sy) or solid(p.x+w,p.y+p.sy+p.h) or solid(p.x+p.w-w,p.y+p.sy) or solid(p.x+p.w-w,p.y+p.sy+p.h) or solid(p.x+p.w,p.y+p.h+p.sy) or solid(p.x,p.y+p.h+p.sy)then p.sy=0 booly=true end return p,boolx,booly end function solid(x,y) return wall[mget(x/8,y/8)] end function callcirc(x1,y1,x2,y2,r) return dist(x1,y1,x2,y2)x2 and x1y2 and y1x2 and x1y2 and y1=0 and a<=1 and b>=0 and b<=1)then return true else return false end end function hitscan(mass,i,obj) local blocked={[3]=true} local mapX,mapY=mass.posX//1,mass.posY//1 local cameraX=math.cos(i/180*math.pi)*2 local cameraY=math.sin(i/180*math.pi)*2 local rayDirX=mass.dirX+cameraX local rayDirY=mass.dirY+cameraY local deltaDistX,deltaDistY if rayDirX==0 then deltaDistX=1 else deltaDistX = math.abs(1 / rayDirX) end if rayDirY==0 then deltaDistY=1 else deltaDistY = math.abs(1 / rayDirY) end local stepX,stepY if rayDirX<0 then stepX=-1 sideDistX=(mass.posX-mapX)*deltaDistX else stepX=1 sideDistX=(mapX+1-mass.posX)*deltaDistX end if rayDirY<0 then stepY=-1 sideDistY=(mass.posY-mapY)*deltaDistY else stepY=1 sideDistY=(mapY+1-mass.posY)*deltaDistY end local hit=0 local n=0 while hit==0 and n<20 do n=n+1 if sideDistX0 then if not block[mget((math.floor(mass.posX%60+60+mass.dirX*mass.spd*mass.dir)),(math.floor(mass.posY%34+102)))] then mass.posX=mass.posX+mass.dirX*mass.spd*mass.dir end if not block[mget((math.floor(mass.posX%60+60)),(math.floor(mass.posY%34+102+mass.dirY*mass.spd*mass.dir)))] then mass.posY=mass.posY+mass.dirY*mass.spd*mass.dir end end if left then mass.dir=-1 if not block[mget((math.floor(mass.posX%60+60+mass.planeX*0.1*mass.dir)),(math.floor(mass.posY%34+102+mass.planeY*0.1*mass.dir)))] then mass.posX=mass.posX+mass.planeX*0.1*mass.dir mass.posY=mass.posY+mass.planeY*0.1*mass.dir end elseif right then mass.dir=1 if not block[mget((math.floor(mass.posX%60+60+mass.planeX*0.1*mass.dir)),(math.floor(mass.posY%34+102+mass.planeY*0.1*mass.dir)))] then mass.posX=mass.posX+mass.planeX*0.1*mass.dir mass.posY=mass.posY+mass.planeY*0.1*mass.dir end end if mass.spd<.05 then mass.spd=0 end if mass.spd>0 then mass.spd=mass.spd-.03 end if mass.spd>.2 then mass.spd=.2 end if b[4] then mass.as=mass.as+.2 elseif b[3] then mass.as=mass.as-.2 else if mass.as>-.5 and mass.as<.5 then mass.as=0 end if mass.as>0 then mass.as=mass.as-.5 end if mass.as<0 then mass.as=mass.as+.5 end end local ms=5 if mass.as>ms then mass.as=ms elseif mass.as<-ms then mass.as=-ms end local ang=math.floor(mass.as%359+1) if mass.as~=0 then local oldDirX=mass.dirX mass.dirX=mass.dirX*cos[ang]-mass.dirY*sin[ang] mass.dirY=oldDirX*sin[ang]+mass.dirY*cos[ang] oldPlaneX=mass.planeX mass.planeX=mass.planeX*cos[ang]-mass.planeY*sin[ang] mass.planeY=oldPlaneX*sin[ang]+mass.planeY*cos[ang] end return mass end --###########################################-- -- guns --###########################################-- gun={ { vertex={ --1 {x= 0,y=-5,z= 80}, {x= 5,y= 0,z= 80}, {x= 0,y= 5,z= 80}, {x=-5,y= 0,z= 80}, {x= 0,y=-5,z= 10}, {x= 5,y= 0,z= 10}, {x= 0,y= 5,z= 10}, {x=-5,y= 0,z= 10}, {x= 0,y=-10,z= 10}, {x=- 8,y= -5,z= 10}, {x=- 8,y= 5,z= 10}, {x= 0,y= 10,z= 10}, {x= 8,y= 5,z= 10}, {x= 8,y= -5,z= 10}, {x= 0,y=-10,z=-10}, {x=- 8,y= -5,z=-10}, {x=- 8,y= 5,z=-10}, {x= 0,y= 10,z=-10}, {x= 8,y= 5,z=-10}, {x= 8,y= -5,z=-10}, {x= 0,y=-10,z= 50}, {x= 0,y=-5,z= 50}, {x= 0,y=-5,z= 75}, {x= 0,y= -2,z=-10}, {x= -4,y= 2,z=-10}, {x= -4,y= 10,z=-40}, {x= 0,y= 6,z=-40}, {x= 4,y= 2,z=-10}, {x= 4,y= 10,z=-40}, }, lines={ }, tringle={ {1,4,8,14}, {1,5,8,15}, {1,2,6,13}, {1,5,6,14}, { 9,14,20,14}, { 9,15,20,14}, { 9,10,16,15}, { 9,15,16,15}, {14,20,19,14}, {14,13,19,14}, {10,11,17,13}, {10,16,17,13}, {21,22,23,15}, {15,16,17,14}, {17,18,19,13}, {19,20,15,14}, {15,17,19,13}, {24,25,26,12}, {24,27,26, 8}, {24,28,29,12}, {24,27,29,12}, } }, { vertex={ --1 {x= 5,y=-5,z= 80}, {x= 10,y= 0,z= 80}, {x= 5,y=-5,z= 80}, {x= 0,y= 0,z= 80}, {x= 5,y=-5,z= 10}, {x= 10,y= 0,z= 10}, {x= 5,y= 5,z= 10}, {x= 0,y= 0,z= 10}, {x=-5 ,y=-5,z= 80}, {x= 0 ,y= 0,z= 80}, {x=-5 ,y=-5,z= 80}, {x=-10,y= 0,z= 80}, {x= -5,y=-5,z= 10}, {x= 0,y= 0,z= 10}, {x= -5,y= 5,z= 10}, {x=-10,y= 0,z= 10}, --2 {x= 0,y=-10,z=10}, {x= 15,y= 0,z=10}, {x= 10,y= 10,z=10}, {x=-10,y= 10,z=10}, {x=-15,y= 0,z=10}, {x= 0,y=-10,z=-10}, {x= 15,y= 0,z=-10}, {x= 10,y= 10,z=-10}, {x=-10,y= 10,z=-10}, {x=-15,y= 0,z=-10}, --3 {x= 0,y=-8,z=-10}, {x= 10,y= 2,z=-10}, {x= 8,y= 8,z=-10}, {x= -8,y= 8,z=-10}, {x=-10,y= 2,z=-10}, {x= 0,y=-8,z=-30}, {x= 10,y= 2,z=-30}, {x= 8,y= 8,z=-30}, {x= -8,y= 8,z=-30}, {x=-10,y= 2,z=-30}, }, lines={ }, tringle={ {1,4,8,13}, {1,5,8,15}, {1,2,6,13}, {1,5,6,14}, {9,12,16,14}, {9,13,16,15}, {9,10,14,13}, {9,13,14,14}, {17,21,26, 8}, {17,22,26, 8}, {17,18,23,12}, {17,22,23,12}, {21,26,25,8}, {21,20,25,8}, {18,19,24,12}, {18,23,24,12}, {22,23,24,12}, {24,25,26,8}, {22,26,24,8}, {27,31,36,15}, {27,32,36,14}, {27,28,33,13}, {27,32,33,14}, {32,33,34,13}, {34,35,36,13}, {32,36,34,13}, } }, { vertex={ --1 {x= 0,y=-15,z=30}, {x= 12,y= 0,z=30}, {x= 0,y= 15,z=30}, {x=-12,y= 0,z=30}, {x= 0,y=-15,z=0}, {x= 12,y= 0,z=0}, {x= 0,y= 15,z=0}, {x=-12,y= 0,z=0}, {x= 0,y=-15,z=100}, {x= 12,y= 0,z=100}, {x= 0,y= 15,z=100}, {x=-12,y= 0,z=100}, {x= 0,y= -5,z=100}, {x= 4,y= 0,z=100}, {x= 0,y= 5,z=100}, {x= -4,y= 0,z=100}, {x= 0,y= 15,z= 5}, {x= 0,y= 15,z= 30}, {x= 0,y=-15,z= 5},--19 {x= 0,y= -5,z= 0}, {x=-12,y= 0,z= 0}, {x= -6,y= 15,z=-15}, {x= 0,y= 10,z=-15}, {x= 6,y= 15,z=-15}, {x= 12,y= 0,z= 0}, }, lines={ }, tringle={ {1,4,8,13}, {1,5,8,15}, {1,2,6,13}, {1,5,6,14}, {3,2,6,13}, {3,4,8,13}, {9,13,1,7}, {10,14,2,11}, {12,16,4,11}, {11,15,3,7}, {17,18,19,11}, {20,21,22,15}, {20,23,22,15}, {20,25,24,14}, {20,23,24,14}, } } } cx=0 cy=40 cz=170 t=0 weap={ id=1, pist=1, shot=2, plsm=3, id_list={"pist"}, ammo={0,0,0}, maxamm={50,25,25}, clr=0, lth=false, t=0, tr=0, updt={ pist=function(e) if weap.t>0 and weap.t<16 then e.lth=true weap.t=weap.t+1 weap.clr=9 elseif weap.t>15 then e.lth=false aim=511 weap.t=0 cz=170 weap.clr=0 elseif btn(4)and weap.t<1 and weap.ammo[1]>0 then weap.ammo[1]=weap.ammo[1]-1 weap.t=weap.t+1 sfx(3) for i=1,#object do if #object[i].statelist>1 and hitscan(player,math.atan2(player.dirY,player.dirX)/0.017,object[i])then damage_enemy({damag_value=5},object[i]) end end end return e end, shot=function(e) if e.t>0 and e.t<64 then e.lth=true e.t=e.t+1 e.clr=10 elseif e.t>63 then e.lth=false aim=511 e.t=0 cz=170 e.clr=0 elseif btn(4)and e.t<1 and weap.ammo[2]>0 then weap.ammo[2]=weap.ammo[2]-1 e.t=e.t+1 sfx(4) for i=1,#object do if #object[i].statelist>1 and hitscan(player,math.atan2(player.dirY,player.dirX)/0.017,object[i])then damage_enemy({damag_value=30},object[i]) end end end return e end, plsm=function(e) if e.t>0 and e.t<24 then e.lth=true e.t=e.t+1 e.clr=10 elseif e.t>23 then e.lth=false aim=511 e.t=0 cz=170 e.clr=0 elseif btn(4)and e.t<1 and weap.ammo[3]>0 then weap.ammo[3]=weap.ammo[3]-1 e.t=e.t+1 sfx(5) Create_object({dirX=player.dirX,dirY=player.dirY,posX=player.posX,posY=player.posY},shablon.projectail) end return e end } } aim=511 function guns() spr(aim,116,64,0) if weap.tr>24 then weap.id=weap.id%#weap.id_list+1 weap.tr=0 weap.t=0 elseif btn(5)then weap.tr=weap.tr+1 else weap.tr=0 end weap.updt[weap.id_list[weap.id]](weap) local gun=gun[weap[weap.id_list[weap.id]]] local vertex3d={} for i=1,#gun.vertex do vertex3d[i]=rotate(gun.vertex[i],{x=0,y=0,z=0},math.cos(player.posX+player.posY)/10*player.spd+0.1,-player.as/35,player.as/35) end local vertex={} for i=1,#vertex3d do local x,y=p2d(vertex3d[i]) vertex[i]={x=x,y=y} end for i=1,#gun.lines do local x1,y1=vertex[gun.lines[i][1]].x,vertex[gun.lines[i][1]].y local x2,y2=vertex[gun.lines[i][2]].x,vertex[gun.lines[i][2]].y end local polygone={} local list_polygone={} for i=1,#gun.tringle do local e1=vertex[gun.tringle[i][1]] local e2=vertex[gun.tringle[i][2]] local e3=vertex[gun.tringle[i][3]] polygone[i]={x1=e1.x,y1=e1.y,x2=e2.x,y2=e2.y,x3=e3.x,y3=e3.y,color=gun.tringle[i][4], z=(gun.vertex[gun.tringle[i][1]].z+gun.vertex[gun.tringle[i][2]].z+gun.vertex[gun.tringle[i][3]].z)} local p=polygone[i] list_polygone[i]={p.z,i} end table.sort(list_polygone,function(a,b) return a[1]>b[1] end) if weap.id_list[weap.id]then for i=1,#list_polygone do local p=polygone[list_polygone[i][2]] tri(p.x1,p.y1-1,p.x2,p.y2-1,p.x3,p.y3-1,weap.clr) tri(p.x1,p.y1,p.x2,p.y2,p.x3,p.y3,p.color) end end t=t+0.17 end function p2d(p3d) local fov = 180 local x0 = p3d.x + cx local y0 = p3d.y + cy local z0 = p3d.z + cz local x2d = fov * x0 / z0 local y2d = fov * y0 / z0 x2d = x2d + 120 y2d = y2d + 68 return x2d,y2d end function rotate(p3d,center,ax,ay,az) local a,b,c local a1,b1,c1 local a2,b2,c2 local a3,b2,c3 local np3d={x=0,y=0,z=0,c=0} a = p3d.x-center.x b = p3d.y-center.y c = p3d.z-center.z a1 = a*math.cos(az)-b*math.sin(az) b1 = a*math.sin(az)+b*math.cos(az) c1 = c c2 = c1*math.cos(ay)-a1*math.sin(ay) a2 = c1*math.sin(ay)+a1*math.cos(ay) b2 = b1 b3 = b2*math.cos(ax)-c2*math.sin(ax) c3 = b2*math.sin(ax)+c2*math.cos(ax) a3 = a2 np3d.x=a3 np3d.y=b3 np3d.z=c3 np3d.c=p3d.c return np3d end