0,;UN*DUwf7;Cww)̹C 2TvͫgE#͛W#2dޜ6!ca0"3DUfw hffHff̈df̈Df̈Hd̈4̈4̈tDD@DDDDDDf@DDfDDff03̀HDD̈@D̈̈̈DDHDDDDDDDDDDDDDDDD3333̄DDHDHDDDDDDDDDDDD3333fHf̈d̈D̈Ḧ4̈4̈ẍẍẍHẍHẍẍHẍHẍxffffffffffff00HH0̈D̈Ḧ4̈4̈tHt̰Ht tİtF@ {fpfF@ ̈ẗẍẍẍẍẍ8D̄H@DDDDDD@DDDD03f`̸̈ ̈@̈{̈xDD@DDDDf@DDfDD03f`LtDLDtDD 333̌HDDDDDHDDfDDfHD@3̈ẍxDxȈxDDxDDxDDD|3333DDDD D DDDD3333DDDDDDDD3333DDDD@D@DDDD3333 ss3| 0 <3s p f`6000p=Hf3@@Ḧ̈D̈Ḧ4̈4̈xfHf̈d̈Ḧ̈ẍẍx(x̰>x xȰx@ {fpf HDDDD@DHDDD@DDDD03`fff@D`ho ffDONK @ D@DONK @ D@#2f6"c032 f#2f03fd fGfGfH'H玈GGH玈DONK3 @ D@cf2f"0# 200233ff ffff333#2" 6"3f3f` F瀈f玈HfHf@HfDLfffffff3ff#c#23223f3ff ffffffffffffffffffffffff>>> > 03 pww73p3DD  ww pwwwwGwwGwwNwwNwwwwFwwwwffffffffffffffffffDL @fs`3spwf`ff f0~`~0fffwwwwwwwwwwwwwwww@DD̈@D̈83̈87̈8DDDDDHDDDDD03@3GDDDDDDDDDDD3CDDL3DDjs03wwnwwnwwowwOODDFDDDD̈8̈8̈8̈8̈8ẅ8ẅ8ẅ8wD7D7wD| s0=ww3ww3wsFswsHs33fffffffDffffffff̈8ẅ8ẅ̈0̈̈8̈ẍxwsws~3fffff`f#"rff` FdjoffffD t@}w ww HDHD̈3333fHfdHDf@tfD|03̈H@DD3333HD@DD@3333f`h 0ff00 pL@t{0{03 0 (x̰>xxxf{fpffff(x̰>xxxf{fpff`fF(x̰>x xʰxff {pj h@(x̰>xxxf{fpffffff`ff f`f fff ffFDffDdfFDD Fffjff`ffffffffxtxtf{fpffffhffḧ̸ ̈@̈{̈xhf fḧ̸ ̈@̈{̈xhfḧ̸ ̈@̈{̈xxtxtf{fpffffȠȠhfftffDhfDtfDDh333f f ffffjfffjfjfffjHHGDfHDfDDffHD3flflfflf lfflfflfflflfȠFȠhf`tfDh`DtDDh333f d DjfFf`DfjFdf`HHGDfHDfDDjfHD@3flfflfflflfflff`ff@Ƞ ȠOhtHDhDtDDh333f f ff`fffDDDDDHDDDDDlDDlf@3lf ̌HHGDHDftDfHD3̌HHpDfH Kf4rffHG@3̌HHGfHsMf@ffHG@3̌HHwGfH`JfdvffHG@3flfflfflflfflfflfflflf<<3<||ffffllsc| l>wcl ff``0f 00 pLFHGDfHD`DDfHD@3DFDDffffDjDDffjfDjfDFDDffffDjDLfjfjfDFDDfffFDDFLDdffDDwfws3fgffofdfoffoofjdffffjofdLofDoofjdffffjfLfDfffffffffffffffffffwwLDLC034DČ3DDDDHDDDDDCDDD4DDDH333xtDttẍẗẗxp@ffffffffffffffffffD@DDDDDDDDD3333wwLLC4DDHL3ffffffffffFDfffHfffoOkǩOggkk <|||swww7www>~sw|~~3w~~~|||wcl lll lffff||s|||ww>w~s~7Dt@DwwwDDDD3333̰x̀xxx̀xẍẍxghOFh=0`=sw}sfsJDjfjƌdDH@`p3p0p  "`v0 7`67ps`f`DLHD` p`cppHx30pppLLLDLD03DHČffffffDfDfDfHfffffffffffffjffffffffffffffjfffffffffffffffffffffffffffffffǑ ̌DDȌDDFȎ@DDDDDDODDDDD@DDD$DDD3DDDDD$DDDOBD$@DOD43DDDO@DDD$@DD3DDDDD DDDBDO @DO03@H# #C@H# #C@Hfc00` ffLf@D@# #C@H# #C@@D@H# #C@H# #C@H@DDD@DDDDDDD DDDBD @@DD03ffffffffffffffffffffffff fffffffffffj ff H@DDD@@DDL@HL0C@@ D@H0C@@Hffffffffffffffffffffffffff`www8f0f0<<3<||ppp|||<ppp 3s3 0 pppfffff`wwwffff̈8̨4̨̨ǪffffffwffffFHffffffff̨J̨ḧ̈ẅp̈f7fffffwHHtDfHpDfGfHG@3HHtGDfHpDfGffHG@3HHtGDfHpDfGffHG@3DDDDt7GDDwsDDtGDDDD3333DDDDtGDDwpDD4GDDDD3333DDDDtGDD7pDD4pGDDDD3333DDDDt7GDD7pDDtGDDDD3333DDDDtGDDpDD4pGDDDD3333Ƞ xȠOphjtFDhjDtfDD333@ȰxtLxt{DL0DtDDL333@ sw p swww7wwww033w33wswswswswwwwwwww3>33333 www;ww73773s77777Lt@DLDtDD 333wwwww~w@wwwwwwwwD@@D77777777DḦ̈D@̈Ḧ4̈4̈xwwwww{ws@w3{www3333D@@wwww3333D777@77;7www33333̄HDD@DDDDDD@DDDD03DDDD̄Č  ̈HDD@̌HHH@@73s3f f  sw 0ww~ sw 0ww̌ D̄H@@@HD̄B@@L @@DD@H@DDHHLĎĎHHȈDD@fffjfffffffffjffffffffffffffffjfw03s0sww07pwswwsw{ 00@0D00D00pDpp3033ps3p@H@@4sC@0p3p00pp0p30 ppp0s7@0psp  p}7p 0 D@074@À@0@@ pffFDFDDDFDDdFDDdDDDdDDDdDDff 0}ppw003p3p sp00Lp00Lpp00Lpsp=s73pw0s7pp@D00fff`ffhfffflffffffffffff 00Lppss=7s77}s 3077sp0Lpp000Lpp00Lpp333s~s~~~w{3{~~wwww0@D@dDd@DdDDd@Dff60fD0Dd0DDDDdDfFvDps0~~0~~~0{wwwwDs~@G~wwww`fFDDDD0@DdDd@dpd`fFFDDdDD60Dd0Ddppp733sp>~~p~{p~wp333>>@@3ww33>3@ Dww@wwNwwwwwwDDDD̄ČĽ@ HDD@̌HHH@@ ppGw7C03GsG7C0C3GwG7C0C3GwG730". />"3?2#>/200 0. 032". />"3?2#>/200032 2"330"232 33 #203000 @ D@̄H@@@HD̄B@@L 3 03 p3 0 0ww` 0337 ssw 0wݪ 3 03 p3 0 0wwݠ 033s? kk ݪݯj" " "P """"""" H" "" "P""P"""""@"""" "@ @ f`ff`f`f`@aajDDD ` fjfDDs `  jz f aps7w@ a pjjЪfjs0p7@ s  @0 sp Є@f` j`Цw?s7 G@  """""" "H"   af "" @ "`"""""O@H """a"f" "@τ@@D OD s 0s p~ 0wݠРjj 073w7s pfjj s 0s p~ 0w`ݠݠo?s~ ݳgp`m ݪݪj`" " """""""" """ """ """ """Y  Čʪ@@@@DHffffhhffDDDDD@fffffffD@HDHj:f1Dt@H`@Ha@H `  pݪ f0s0s f jj w0p7 `  ݪ`j`3{0ppD ao `pݦ mpsݏ ""P""""""@""@""@ Y "L"L" "@@@@DH @DDLd@OψfADD@DD 3 p3s p3w 0~w` 03737ss pp `fpݪ 3 p3s p3w 0~wݠ==g}ݪo"  " ""P""""" """ """ """"""" @] O  OOOO @O@ @ OO OOOOO ` fj1Я1Ъf0`sC0H ݯ:o:C@jp;@p H ` ` ݦ s3H` @p @ ``m0= ݄"""P""""""H"""" Y@@H   " "" @ OOO @OLt0s 0s 0  O @ OOOO 3 0s p ps q 0337{w> 0 p`jp 3 0s p ps `=g}"""""""" "" P""""""""""""""    """""""""""""""""""""""""""""""""""""""" """  ""0"003 0#003"/2C"B0B;#  `f j pfjj Ц70s 3 `j ` jݦ0f07@s0 j ݦݪ 0CoCf@mm` m ݄LH@"@` """"H "̏ j """"""̘ LP"""""" YY"""" 03"022 #@@ @ 0@3@@ a 3 D607jsj:Ъj   # "0#3#  @@3+ /2  2 #]0#0#"0"3+/ ;  3 %2 0  0 H  3  #0 " 0" 0 @DBB@D0 0s3s73~p 0wݪݪj`jjp 00@   L @0#0@ @ 0"" @@ 4 4@ @@D   C("@ 00 " 2 @"@ 0@ @K 00 2  3@@"+  fjff@@DD``L/""/L@DD$)wGyG$)IFtfFtgfI@DDDDDDDD@D@@@@D@@HȌDHD@D@@sp77HpL0ww00 0af`` "" "" "" DHD@D@@@@HHHH@ȌHόḦHόHs0|<@x0psDDG>>>>>>>>>>>>>>>t 0012468:<>>>>>>>>>>>>>>>>>>>>> sp`P@0  |l\L<, p`P@0  0011223344 5 5 6 6 778899::;;<<==>> uvggWWGGGGtteeVWGGGGGGGGGGGG tteeVVGGGGGGGGtteeVVGGGGGGGG tteeVVGGGGGGGGp`P@0  p`P@0 zssssз sstteeVVGGGGGGGGtteeVVGGGGGGGGtteeVVGGGGGGGGtteeVVGGGGGGGG00|l\L<,  00|l\L<,  tteeVVGGGGGGGG  tteeVVGGGGGGGG00|l\L<,   tteeVVGGGGGGGGssp`P@0  {tteeVVGGGGGGGGGGGGGGGG{s$]YUq]}f]YUQ=]f]YUq]f R Q S SS]]]YUq]}f]YUQ=]f]YUq]f R Q S SS]]6I6D6K 6D0TT]YUq]}f]YUQ=]f]YUq]}f]YUQ ]]]]]YUq]}f]YUQ=]f]YUq]fR Q S SS]]6I6D6I6D6I6D6I6DX8XxX8XxX8XxX8XxX8XxX8XxX8XxX8XxTT]YUq}]fb]YUq}]fb] YU p} ]ib]Y 5q} =db]YUq}]fb]YUq}]fb] YU p} ]ib] Y U q } ]kb    n@  @  ]YUq}]fb]YUq}]fb]YUq}fb] Y U q]}ib]YUq}]fb]YUq}]fb]YUq}fb] Y U q]}ibj h  j h   j h  j h  ]YUq}]fb]YUQ=]fP0 @0]YUq]}f]YUQ=]f]YUq]}f]YUQ ]]]]]YUq]}f]YUQ=]f]YUq]}f]YUQ ]]]d]X8XxX8XxX8XxX8XxX8XxX8XxX8XxX8XxWYUs]]fSR U S ] ]f]WYUY}]fAa5a a a~us ss } s qrr}}} }u q }u q } u r s }]]]]]]]]]]]]] ] ] ] ]]]]]]]]]]]]]]] ] ] ] ]]6D6 D6 {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{]ww]}]}]ww]}]}]ww]}]} ] w w ] } ]]]ww]}]}]ww]}]}]ww]}]} ] w w ] } ]]{8{|8{8{|8{8{|8{8{|8{8{|8{8{|8{8{|8{8{|8]ww]}]}]ww]}]}]ww]}]} ] w w ] } ]]byzYffzfbYf f B Y f]}]]}]]}]}}]}]]}]]}]}}{{{{{{{{t{{{{{{{{t]}]]}]]}]}}]}]]}]]}]}}]}]]}]]}]}}]}]]}]]}]}}7pEppUp7pEppUp]7}]7]}]]7}7]}}]E}]E]}]]D}]D]]Q]7}]7]}]]7}7]}}]E}]E]}]]7}]7]] P p@p` p@p`]7}]7]}]]7}7]}}]E}]E]}]]E}E]Eq]7}]7]}]]7}7]}}]E}]E]} ] ]L{ = ]L{]q  {{{{{{{{t{{{{{{{{xP0]}]]}]]}]}}]}]]}]]}]}}]}]]}]]} ]]}]}]]}]]} ]]}]7}]7]}]]7}7]}}]E}]E]}]]E}E ]]}=?{]=?{=]==?{]?{ ] ]] =={ ] =={ = ] = =={ ]={ ] ]]ttTsttttTstrtt qPttTstTTtT4StT TTtT4StT R T t tw P T t T 4 S t T T{{{{{{{{{{{{{{{{ =={ ] =={ = ] = =={ ]={ ] ] ] =={ ] =={ = ] = =={ ]={ ] ] ] =={ ] =={ = ] = =={ ]={ ] ] ] =={ ] =={ = ] = =={ ] { ] ]q           {{{{{{{{{{{{{{{{tf0Dabb cMOaP$SD5BBCə !HHyÇÇCC?aaAADDADDDDDDDDDDDDDDDDDDADDDDDDDkADDDDDDDDDDDDADDDDDDDDADADDDDDDffADDDDDDDDDDDDDDADDDDDD@DDDDDDDDDDDkAD@DDADDDD@DDDDDADDDDDD@DDDDDDDDDDDDDffADDDDDDDDDADDDDADDDDD@DDD@DADDDDDDDDfDADDDffaf`fafafffffafADDDDDDfDD@DADADADDADDDDDDADADDDDDD@DDDADfafafafffffffffffafafafffDDDDaADDDADADDDDADDDDDDDDADADAD@DDDDDaffafaffffffaffffffffafafffafafffDDDakffafaffffafafaffffffffafafffafffafffDDDfafffffafffffffafffffffafafffafffffffFDff  DDDakaffffffffafffffffafffffafafafaffff`f   a  afff    fffakk   kf    a   a    afkffffw pw"pww1""ww #"2"pww 3333""""wpw """""""2"pwpw"""""""""pww"""""""""www3"""""""""w w""""""""""w w"""""    """""pw pw0"""""   """"1"313pw pw """"""    """1!""!"pwww "2"""""""""!!""!"pwwwwpw """""""1333333""""!!""!"pwwpz ww ""2"""""-"  """"!!""2!"pwwzwww """""""""""""!""!"wwwzw""""2"""""    """!  """!"wwwzw """""""""  !"" "   3""""!p p ""!""pwwz"""""2"""""  #"" "   "3""""!23 !""wwz """""""""""""""""1""""!"" !""wzw""""""""""""""31""""!"" !""pz """"""""""" ""(!"""2#""3wwwww!""ww """"""""""" """!"""""""""wwwpww!""z"""""""""" "" """ """"""pwwwwpwwww!""ww"""""""""""0 "" """"""""ppwwp03#""""""""""+""2  "" 0 " p """"pwpw """"""""""""""""  pp"""""ppfp`w """"""""""""""+"2 03  wpw """"pwfp`w ""+""""""""""""""3# 23"""  wpw """"ppp """""""""""""""""21"""""""!"""""""!"""""""""" w! w""b"ppwwp """""""""""""""""#"""""""!"""""""!""""""""""pw!p""""3ppwwwwwwww """"""""""""""""23""""""""!"""""""!""""""""""1pw!"pw """"pppp """"""""""""""""""""""""""""!""""""!""""""""""#pw0#" w """"pp """""""""""""""""""2"""""""""!"""""""!"""""2"""""1"pw "" w """"wp """+""""""""""""""""""""""""""!"""""""!"+""""2"""""#"pw"" w b"""pw """""""""""""""""""""""""""+"""!"""""""33!"""""""""""1""pw""pw """"w ""b"""ww"""""""""""""""""+""""""!"""""""""!""""""""""""#""pw""pw """"w """"""1"""&""""""&"""""""""""""""!"""""""""!""""""""""""""" ww w ""&"w """"&"w 1"""""""""""""""""""""""""!"""""""""!"""""""""""""" ww """"w """"""33www#""""""""""""""""""""""""""!""""""""!""+""""""""""pwwpw """"w """"""""wz#"""""""""""""""""""""""""!"""""""2""!"""""""""""""pwwwww """"w """"""""pww 1"""""""""""""""""""""""""!""""""""""!""""""""""""" wwwwz """"w ""$"""""pww 1"""""""""""""""""""""""""""!""""""""2""!""""""""""+"wwwz """"w """"""""pww #""b"""""""""""""""""""""""!"""+"+"""""!"""""23""""""""wz "$"" """"""""wz#"""""b""&""""""""""""""""!"+"""""""2""!"b""""""""""""ww """"ww """""""""www1"""""""""""""""""""33""""""""!""""""""""""!"""""""""""""""pw """$ """"&""""pw 1""""""""""""""""""23"""""""""""!""""""""""""!"""""""""""" """"pww""B""""""ww!""""B"""3"""""""""+""""""""""""""""""""""""""!"""""23""""""""ww """""""""""""""pww!"""""""""""$""""""""""""""""""""!""""""""""""!"""""""""b""""""wz "B""pww""""""""""ww !""$""""""""""""b"""""""""""b"""""""b""""b"""""!b"""""""""""""""" z """"2333 """"""""pww !""""""""""""""""""""""""""""""""!""""""""""""!"""B"""""B""""""p""""""" """"ww "!""""""""""""""""""""""""""""""""!"""B""""""""!"""""""""""""231"""p"""""zwww """"pww "!""""$""""""""""""""""&""""""""&"""""""""""""""!"""""""""""""""!""" z """" wwwwwwwwww ""ww ""!"""""""""B""$"""""""""""b"""""""""""""""""""""!"""""""""""""""!""" z """ wwwwwwwwwwwww "pww ""!""$"""""""""""""""""""""""""""""!B"""""""""""#"B""""""b""""""2333#"b""p""" wwwwwwwwwwwwwwp ww """333#"""""""""""""""""B"&"""""""""$""!""""""$"""""2"""""""""""""""&"""""""""p"" wwzwwwwwwwpww """""""""""""""""""""""""""""""""$"""""!""""""""B""""""""""""""""""""""""""""" zp wwwwwwzwwww """"""""""""""""""""""""""""""""""""""""2#"""B"""""""""""""""23""""""""""""""""""" zwwwwwwwwwwwwwwwwpww """"""""""""""""""""""""""""""""""""""""""""""""""""23""""""""""""""""""$""""""""B"""ppwwpwwwwwwwwwwwwwwww """""""""""""""""""""""""$""""""""""B"""""""""""""""""""""""""""""""""""""""""""""""""pwpwwwwwwwwwwwpw """"""b"""""""""""""""""""""$""""B""""""""""""""""""""""""""""""""""""$"""""""""b""""" wzz"wwwwwwzwwp """"""""""$""""""""""""""""""""""2"""""""""""""""""""""""""""""$"""""""""""""""""""""""" wzz "wwwwwwwwwwwwww """"""""""""""""""""""""""""""""""33"""""""""""""""""""""""""""""""""""""""""""""""""""""" wzz""wwwwwwwwwwwwww """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" wzz""wwwwwwwww"""""""""B""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""pw ""wwwwwwzw""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""pww ""wwwwwwwwwwwww"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" w"""pwwwwwwwwwwwww"""""""""""""""""""""""""""""""""""""//""/"""/"//"""""""""""""""""""""""""""""" """pwwwwwwwwwwwww""""""""""""""""""""""""""""""""""""""//""""/""""""""""""""""""""""""""""""""""""""pwwwwwwwwwwwww"""""""""""""""""""""""""""""""""""""""  " """/ """""""""""""""""""""""""""""""""""""""pwwwwwwwwwwww""""""""""""""""""""""""""""""""""""""/" " """  """"""""""""""""""""""""""""""""""""""pwzwwwwwwwww """""""""""""""""""""""""""""""""""""" /" """/""""""""""""""""""""""""""""""""""""""pwwwwwwwwwww """"""""""""""""""""""""""""""""""""" "   " """" """""""""""""""""""""""""""""""""""""""pwwwwwwwwwzw """""""""""""""""""""""""""""""""""""RU%UU%U""UU%RU"RU%"""UR%RU"UU"""""""""""""""""""""""""""""""""""""""pwwwwwwwwwwww """""""""""""""""""""""""""""""""""""UUU "UU%"U"""UUU%U%""""""""""""""""""""""""""""""""""""""pwwwwwwww """""""""""""""""""""""""""""""""""""RU"UU"U "UU"U "U """UUU U """"""""""""""""""""""""""""""""""""""""wwww """"""""""""""""""""""""""""""""""""""U%U U "U U %"U """UUUU""""""""""""""""""""""""""""""""""""""""zwwwwww """""""""""""""""""""""""""""""""""""UUUU%UU%UU%RU"U """UU """"""""""""""""""""""""""""""""""""""""zwwwww"""""""""""""""""""""""""""""""""""""""" " " """"  """""""""""""""""""""""""""""""""""""""""z""""""""""""""""""""""""""""""""""""""""U"%RU"UU"UR%RU"U""""""""""""""""""""""""""""""""""""""""""""""""""""""ww""""""""""""""""""""""""""""""""""""""""U%U%U%UUU%U """"""""""""""""""""""""""""""""""""""""""""""""""""wwwwwwww """""""""""""""""""""""""""""""""""""""UUU U UUU U """"""""""""""""""""""""""""""""""""""""""""""""""""pzwwwwww"""""""""""""""""""""""""""""""""""""""UPU UUUUU """""""""""""""""""""""""""""""""""""""""""""""""""wzwwwwww """"""""""""""""""""""""""""""""""""""U RUU%UUU%""""""""""""""""""""""""""""""""""""""""""""""""""wwzw """""""""""""""""""""""""""""""""""""" "  " """""""""""""""""""""""""""""""""""""""""""""""""wpw B"""""""""""""""""""""""""""""""""""""RU"UU"UU%UU"RU%RU%RU%""""""""""""""""""""""""""""""""""""""""""""""zwwwwww B$"B""""""""""""""""""""""""""""""""""U%U%UU%"U"UU"""""""""""""""""""""""""""""""""""""""""""""Bzwwwww BD"D""""""""""""""""""""""""""""""""""U U UU"U "U "U RU""""""""""""""""""""""""""""""""""""""""""""""Dwpw@DDDD"""""""""""""""""""""""""""""""""U %UUU U "U "U "U%""""""""""""""""""""""""""""""""""""""""""DDDDw ww@DDDDD$"""""""""""""""""""""""""""""""RUU%UU%UURU%"U UU"""""""""""""""""""""""""""""""""""""""""""DDDww pww DDDDD"""""""""""""""""""""""""""""""""   ""  """"""""""""""""""""""""""""""""""""""""""""Ddwwwpww DdDDD"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""BDDDddzwwwwwwwwwww ddDFDD""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""DDddwzwwwwwwwwz`ddFfDD$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""BDdfwzwwwwwwbfdffF$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""DDddfwwwwwwwbffff$""""""""""""""""""""""""""""UR%RU"UU""""RU""U""""UU"UU%RU%UU%RU"UU"RU"U"%"""U""RU"UU"""""""""DDdddfF"rwwwwww bfffD""""""""""""""""""""""""""""UUU%U%"""UP%RU """U%UUUU%U%U%U """U "U%U%""""""BDDfddffKr'"wwwwwwww""wbkkFB$"""""""""""""""""""""""""""UUU U """U%"U RU"U UU"RU"UU"U U U UU"""U "U UU""""""""""bdkrzw"rwwwww'"wzbF"""""""""""""""""""""""""""""UUUU"""U"U " UUU "U%U UUUUU %U"""U "UUU%""""""""""ddkrw'wwww'"wz&"""""""""""""""""""""""""""""UU """RURU%"""U%UU%UUUU%UU%RUU """UU%UUU"""""""""Ddr'ww'rrwzKD&""""""""""""""""""""""""""""""  """"" """"    "  """  """"""""Bdr'r'""rwwz$"Dk""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""D"BKD+'""""r"rwwB"""D$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B$"BF$"B+wwww"""""""rw"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""D$""B+wwww""""""""rB""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B{"""r"""""""""B$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""",0,;UN*DUwf7;Cww)̹C*2TvͫgE#͛W#2dޜ6!ca0"3DUfw! hffHff̈df̈Df̈Hd̈4̈4̈tDD@DDDDDDf@DDfDDff03̀HDD̈@D̈̈̈DDHDDDDDDDDDDDDDDDD3333̄DDHDHDDDDDDDDDDDD3333fHf̈d̈D̈Ḧ4̈4̈ẍẍẍHẍHẍẍHẍHẍxffffffffffff00HH0̈D̈Ḧ4̈4̈tHt̰Ht tİtF@ {fpfF@ ̈ẗẍẍẍẍẍ8D̄H@DDDDDD@DDDD03f`̸̈ ̈@̈{̈xDD@DDDDf@DDfDD03f`LtDLDtDD 333̌HDDDDDHDDfDDfHD@3̈ẍxDxȈxDDxDDxDDD|3333DDDD D DDDD3333DDDDDDDD3333DDDD@D@DDDD3333 ss3| 0 <3s p f`6000p=Hf3@@Ḧ̈D̈Ḧ4̈4̈xfHf̈d̈Ḧ̈ẍẍx(x̰>x xȰx@ {fpf HDDDD@DHDDD@DDDD03`fff@D`ho ffDONK @ D@DONK @ D@#2f6"c032 f#2f03fd fGfGfH'H玈GGH玈DONK3 @ D@cf2f"0# 200233ff ffff333#2" 6"3f3f` F瀈f玈HfHf@HfDLfffffff3ff#c#23223f3ff ffffffffffffffffffffffff>>> > 03 pww73p3DD  ww pwwwwGwwGwwNwwNwwwwFwwwwffffffffffffffffffDL @fs`3spwf`ff f0~`~0fffwwwwwwwwwwwwwwww@DD̈@D̈83̈87̈8DDDDDHDDDDD03@3GDDDDDDDDDDD3CDDL3DDjs03wwnwwnwwowwOODDFDDDD̈8̈8̈8̈8̈8ẅ8ẅ8ẅ8wD7D7wD| s0=ww3ww3wsFswsHs33fffffffDffffffff̈8ẅ8ẅ̈0̈̈8̈ẍxwsws~3fffff`f#"rff` FdjoffffD t@}w ww HDHD̈3333fHfdHDf@tfD|03̈H@DD3333HD@DD@3333f`h 0ff00 pL@t{0{03 0 (x̰>xxxf{fpffff(x̰>xxxf{fpff`fF(x̰>x xʰxff {pj h@(x̰>xxxf{fpffffff`ff f`f fff ffFDffDdfFDD Fffjff`ffffffffxtxtf{fpffffhffḧ̸ ̈@̈{̈xhf fḧ̸ ̈@̈{̈xhfḧ̸ ̈@̈{̈xxtxtf{fpffffȠȠhfftffDhfDtfDDh333f f ffffjfffjfjfffjHHGDfHDfDDffHD3flflfflf lfflfflfflflfȠFȠhf`tfDh`DtDDh333f d DjfFf`DfjFdf`HHGDfHDfDDjfHD@3flfflfflflfflff`ff@Ƞ ȠOhtHDhDtDDh333f f ff`fffDDDDDHDDDDDlDDlf@3lf ̌HHGDHDftDfHD3̌HHpDfH Kf4rffHG@3̌HHGfHsMf@ffHG@3̌HHwGfH`JfdvffHG@3flfflfflflfflfflfflflf<<3<||ffffllsc| l>wcl ff``0f 00 pLFHGDfHD`DDfHD@3DFDDffffDjDDffjfDjfDFDDffffDjDLfjfjfDFDDfffFDDFLDdffDDwfws3fgffofdfoffoofjdffffjofdLofDoofjdffffjfLfDfffffffffffffffffffwwLDLC034DČ3DDDDHDDDDDCDDD4DDDH333xtDttẍẗẗxp@ffffffffffffffffffD@DDDDDDDDD3333wwLLC4DDHL3ffffffffffFDfffHfffoOkǩOggkk <|||swww7www>~sw|~~3w~~~|||wcl lll lffff||s|||ww>w~s~7Dt@DwwwDDDD3333̰x̀xxx̀xẍẍxghOFh=0`=sw}sfsJDjfjƌdDH@`p3p0p  "`v0 7`67ps`f`DLHD` p`cppHx30pppLLLDLD03DHČffffffDfDfDfHfffffffffffffjffffffffffffffjfffffffffffffffffffffffffffffffǑ ̌DDȌDDFȎ@DDDDDDODDDDD@DDD$DDD3DDDDD$DDDOBD$@DOD43DDDO@DDD$@DD3DDDDD DDDBDO @DO03@H# #C@H# #C@Hfc00` ffLf@D@# #C@H# #C@@D@H# #C@H# #C@H@DDD@DDDDDDD DDDBD @@DD03ffffffffffffffffffffffff fffffffffffj ff H@DDD@@DDL@HL0C@@ D@H0C@@Hffffffffffffffffffffffffff`www8f0f0<<3<||ppp|||<ppp 3s3 0 pppfffff`wwwffff̈8̨4̨̨ǪffffffwffffFHffffffff̨J̨ḧ̈ẅp̈f7fffffwHHtDfHpDfGfHG@3HHtGDfHpDfGffHG@3HHtGDfHpDfGffHG@3DDDDt7GDDwsDDtGDDDD3333DDDDtGDDwpDD4GDDDD3333DDDDtGDD7pDD4pGDDDD3333DDDDt7GDD7pDDtGDDDD3333DDDDtGDDpDD4pGDDDD3333Ƞ xȠOphjtFDhjDtfDD333@ȰxtLxt{DL0DtDDL333@ sw p swww7wwww033w33wswswswswwwwwwww3>33333 www;ww73773s77777Lt@DLDtDD 333wwwww~w@wwwwwwwwD@@D77777777DḦ̈D@̈Ḧ4̈4̈xwwwww{ws@w3{www3333D@@wwww3333D777@77;7www33333̄HDD@DDDDDD@DDDD03DDDD̄Č  ̈HDD@̌HHH@@73s3f f  sw 0ww~ sw 0ww̌ D̄H@@@HD̄B@@L @@DD@H@DDHHLĎĎHHȈDD@fffjfffffffffjffffffffffffffffjfw03s0sww07pwswwsw{ 00@0D00D00pDpp3033ps3p@H@@4sC@0p3p00pp0p30 ppp0s7@0psp  p}7p 0 D@074@À@0@@ pffFDFDDDFDDdFDDdDDDdDDDdDDff 0}ppw003p3p sp00Lp00Lpp00Lpsp=s73pw0s7pp@D00fff`ffhfffflffffffffffff 00Lppss=7s77}s 3077sp0Lpp000Lpp00Lpp333s~s~~~w{3{~~wwww0@D@dDd@DdDDd@Dff60fD0Dd0DDDDdDfFvDps0~~0~~~0{wwwwDs~@G~wwww`fFDDDD0@DdDd@dpd`fFFDDdDD60Dd0Ddppp733sp>~~p~{p~wp333>>@@3ww33>3@ Dww@wwNwwwwwwDDDD̄ČĽ@ HDD@̌HHH@@ ppGw7C03GsG7C0C3GwG7C0C3GwG730". />"3?2#>/200 0. 032". />"3?2#>/200032 2"330"232 33 #203000 @ D@̄H@@@HD̄B@@L" 3 03 p3 0 0ww` 0337 ssw 0wݪ 3 03 p3 0 0wwݠ 033s? kk ݪݯj" " "P """"""" H" "" "P""P"""""@"""" "@ @ f`ff`f`f`@aajDDD ` fjfDDs `  jz f aps7w@ a pjjЪfjs0p7@ s  @0 sp Є@f` j`Цw?s7 G@  """""" "H"   af "" @ "`"""""O@H """a"f" "@τ@@D OD s 0s p~ 0wݠРjj 073w7s pfjj s 0s p~ 0w`ݠݠo?s~ ݳgp`m ݪݪj`" " """""""" """ """ """ """Y  Čʪ@@@@DHffffhhffDDDDD@fffffffD@HDHj:f1Dt@H`@Ha@H `  pݪ f0s0s f jj w0p7 `  ݪ`j`3{0ppD ao `pݦ mpsݏ ""P""""""@""@""@ Y "L"L" "@@@@DH @DDLd@OψfADD@DD 3 p3s p3w 0~w` 03737ss pp `fpݪ 3 p3s p3w 0~wݠ==g}ݪo"  " ""P""""" """ """ """"""" @] O  OOOO @O@ @ OO OOOOO ` fj1Я1Ъf0`sC0H ݯ:o:C@jp;@p H ` ` ݦ s3H` @p @ ``m0= ݄"""P""""""H"""" Y@@H   " "" @ OOO @OLt0s 0s 0  O @ OOOO 3 0s p ps q 0337{w> 0 p`jp 3 0s p ps `=g}"""""""" "" P""""""""""""""    """""""""""""""""""""""""""""""""""""""" """  ""0"003 0#003"/2C"B0B;#  `f j pfjj Ц70s 3 `j ` jݦ0f07@s0 j ݦݪ 0CoCf@mm` m ݄LH@"@` """"H "̏ j """"""̘ LP"""""" YY"""" 03"022 #@@ @ 0@3@@ a 3 D607jsj:Ъj   # "0#3#  @@3+ /2  2 #]0#0#"0"3+/ ;  3 %2 0  0 H  3  #0 " 0" 0 @DBB@D0 0s3s73~p 0wݪݪj`jjp 00@   L @0#0@ @ 0"" @@ 4 4@ @@D   C("@ 00 " 2 @"@ 0@ @K 00 2  3@@"+  fjff@@DD``L/""/L@DD$)wGyG$)IFtfFtgfI@DDDDDDDD@D@@@@D@@HȌDHD@D@@sp77HpL0ww00 0af`` "" "" "" DHD@D@@@@HHHH@ȌHόḦHόHs0|<@x0psDDG 001122334 4 5 5 6 677889:;<=>      0011223344 5 5 6 6 778899::;;<<==>>p`P@0   ssccSSCCCCCCCCCCCCCCCC @QbsscSCCCCCCCCCCCCCCCCCCCCCCcs/7T77T7 = ] 6 = U ] ] 6K= 4T] = ] 6 = U ] ] = = 5=:L :L:L :L:L :L:L :L{yx|{yx|{yx|{yxz{yx|{yxz{yx|{yxz = ] 6 = U ] ] 6K= 4T] = ] 6 = U ] ] = = 5= = ] 6 = U ] ] 6K= 4T] = ] 6 = U ] ] = = 5==K=I =K=I 8=K=I =K=I 8{yx|{yxz{yx|{yxz{yx|{yxz{yx|{y = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = =      sSs  s S s{yx|{yxz{yx|{yxz{yx|{yxz{yx|{yxz      sSs  s S sӔ{yx|{yxz{yx|{yxz{yx|{yxz{yx|{yxPsK=KpPK PISsK=KpPK IsSK=KPsK PIpSK=KSSSK I{yx|{yxs{yx|{yxs{yx|{yxs{yx|{yxK=II K=II8h{yx|{yxz{yx|{y = 6 ] =K=I = 6 ] =I = 6 ] =K=I = 6 ] =I = 6 ] =I;G = 6 ] =G = 6 ] =I;G = 6 ] =G                                 = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = =         sSsS s S sS         sSsS  s S Ss = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = = = 6 ] = = =I;GG I;GG6K=II K=II8 = 6 ] =K=I = 6 ] =I = 6 ] =K=I = 6 ] =I = 6 ] =K=I = 6 ] =I = 6 ] =K=I = 6 ] =I       = ] = ] = ] = ] = ]=] = ] = ] = ] = ] = ]=]{{{{{{{{{{{{{{{{{{{{{{{{ = ] = ] = ] = ] = ]=] = ] = ] = ] = ] = ]=] = ] = ] = ] = ] = ]=] = ] = ] = ] = ] = ]=] c b c b c bcb c b c b c b {{{{{{{{{{{{{{{{{{{{{{{{ = ]L ] = ] = ]: ]=] = ]L ] = ] = ]: ]=] = ]L ] = ] = ]: ]=] = ]L ] = ] = ]: ]=] aa g ~ `  aa g ~  aa g ~ `  aa g ~  aa g ~ `  aa g ~  aa g ~ ``gGG_ y x { W W  y x { W v{{{{{{{{{{{{{{{{{{{{{{{{;e;;e;e;;e;e;;e;e[{d = ] = ] = ] = ] = ]=] = ] = ] = ] = ] = ]=]=] = ] = ]=] = ]=]=] = ] = ]=] = ]=] c b b b b cbb bb cb bb bbbbbbbbb:L :L:L :L:L :L:L :L{t{{{t{{{t{{t{t{{t{t{{{t{{{t{{t{t{{t;e;;e;e;;e;e;;e;e[{а u 5 U  5 u U u U 5 U u 5 U  5 u U u U U u .fp`P@0   ssccSSCCCCCCCCCCCCCCCC CScscsE /.-,K K*+,-N N/.-,K K*+,-N No n m l kihd h i j klmo n m l kihd h i j klm[[[[[[[[[[[[[[[[>9~Yyy~Y>9>9~Yy~>y/.-,K K*+,-N N/.-,K K****J Jo n m l kihd h i j klmo n m l kihd d Ɯd d ؝dd垄d>9~Yyy~Y>9>9~Yyy[[[[[[[[[[[[[[[|\=====] ]=====] ]=====] ]=====] ]d d d d dddd d d d dddd d d d dddd d d d dddyY? yYM[wWWw[wWWw[wWWw[wWWw[wWWw[wWWw[wWWw[wWWwd d d d dddd d d d dd yYyY y[wWWw[wWWw[wWWw[wWWw[wWWw[wWWw[wWWw[wW|\365365d h i j kmno n m l kjid h i j kmno n m l kji[[[[[[[[[[[[[[[[[[[[SVUSVUd h i j kmno n m l kjid h i j kmno m k i Ŝߝd垄[[[[[[[[[[[[[[[[[|\=====] ]=====] ]]]]]]] ] = = = = = ] ]     0          0     =====] ]=====] ]]]]]]] ]]]]]]} =  pP`Pп 0  pP`Pк   UPXп 0  UPXкp0=====] ]=====] ]p^ppZpXpVpTpRpP`^``Z`X`V`T`R`PP^PPZPXPVPTPRPPpP0yY y [wWWw[wWWw[wWWw[wW|\[[|?\ { [ ; ] ] ] ] ]]}}} } { [ ;  p`P@0   p`P@0  | \ [  | [  | [  | [  | \'> >pP0  p`P@0   p`P@0 G^ ^pP00j @ q 0Ip`P@0   ssccSSCCCCCCCCCCCCCCCC CScscsE /.-,K K*+,-N N/.-,K K*+,-N No n m l kihd h i j klmo n m l kihd h i j klm[[[[[[[[[[[[[[[[>9~Yyy~Y>9>9~Yy~>y/.-,K K*+,-N N/.-,K K****J Jo n m l kihd h i j klmo n m l kihd d Ɯd d ؝dd垄d>9~Yyy~Y>9>9~Yyy[[[[[[[[[[[[[[[|\=====] ]=====] ]=====] ]=====] ]d d d d dddd d d d dddd d d d dddd d d d dddyY? yYM[wWWw[wWWw[wWWw[wWWw[wWWw[wWWw[wWWw[wWWwd d d d dddd d d d dd yYyY y[wWWw[wWWw[wWWw[wWWw[wWWw[wWWw[wWWw[wW|\365365d h i j kmno n m l kjid h i j kmno n m l kji[[[[[[[[[[[[[[[[[[[[SVUSVUd h i j kmno n m l kjid h i j kmno m k i Ŝߝd垄[[[[[[[[[[[[[[[[[|\=====] ]=====] ]]]]]]] ] = = = = = ] ]     0          0     =====] ]=====] ]]]]]]] ]]]]]]} =  pP`Pп 0  pP`Pк   UPXп 0  UPXкp0=====] ]=====] ]p^ppZpXpVpTpRpP`^``Z`X`V`T`R`PP^PPZPXPVPTPRPPpP0yY y [wWWw[wWWw[wWWw[wW|\[[|?\ { [ ; ] ] ] ] ]]}}} } { [ ;  p`P@0   p`P@0  | \ [  | [  | [  | [  | \'> >pP0  p`P@0   p`P@0 G^ ^pP00j @ q 0I0 then local colours = {3,2,7,14,7,2,3} cls(colours[bg_hurt+1]) erase_colour = colours[bg_hurt+1] bg_hurt = bg_hurt - 1 poke(0x03FF8,colours[bg_hurt+1],8) --EMP background flash effect elseif bg_emp>0 then local colours = {1,6,10,15,10,6,1} bg_emp = bg_emp - 1 cls(colours[bg_emp+1]) erase_colour = colours[bg_emp+1] bg_emp = bg_emp - 1 poke(0x03FF8,colours[bg_emp+1],8) end himap(px-5,py-3,s_shake.o) end --draws the ingame map view. uses the map data in loaded TIC-80'S map to draw. function onscreenmap(m) cls(0) --a grid of colours based of the in-game tile set. local colours = {00,00,15,15,15,15,15,15,15,01,15,15,15,15,00,15, 15,15,15,15,15,15,15,07,09,15,15,15,15,02,15,08, 02,15,08,02,02,15,08,02,06,07,07,07,06,07,07,07, 15,15,15,07,15,05,05,06,15,05,02,01,13,13,15,15, 15,15,06,14,12,12,12,12,12,12,12,12,12,12,12,12, 12,12,12,12,12,12,12,12,12,12,15,12,12,12,12,12, 07,07,00,00,00,00,00,00,15,15,15,14,12,12,01,01, 15,15,15,08,01,01,15,15,01,07,07,07,07,07,07,07, 15,15,00,13,15,15,09,13,15,15,07,07,06,06,06,07, 12,12,12,12,03,01,00,00,15,01,08,08,15,15,06,06, 07,07,07,01,00,00,15,01,01,08,15,07,15,15,15,07, 15,15,15,15,15,12,12,07,07,07,07,15,07,00,07,15, 07,07,07,15,12,12,13,13,12,12,12,12,06,08,07,03, 05,05,05,09,08,08,08,09,15,15,15,13,15,15,15,13, 15,15,15,01,08,08,01,01,08,08,01,01,07,07,12,12, 14,14,07,00,14,14,14,00,15,14,02,03,06,06,12,12 } local i = 1 for y = 0, 63 do for x = 0, 127 do local pixc=colours[mget(x,y)+1] --pick a colour from the grid based of the tile on the map. pix(x+24, y+8,pixc) --plot this colour onto the screen i = i + 2 end end local colours = {1,6,10,15,15,10,6} local flashcol = colours[math.floor(t / 8)%7 + 1] pix(px+24,py+8,flashcol) --plot player x and y onto the map end --draws robots to the map screen function draw_map_units() local colours = {4,8,12,15,15,12,8} local flashcol = colours[math.floor(t / 8)%7 + 1] for i,u in ipairs(units) do if is_bot(u.type) then pix(u.x+24,u.y+8,flashcol) end end end --draws text for the map, automatically aligning text to the map's centre as well as providing a flag for additional effects function map_text(text,y,alt) local l = string.len(text)*2 local o = 24 + 64 - l local colours = {4,8,12,15,15,12,8} local flashcol = colours[math.floor(t / 8)%7 + 1] if alt == false then print(text,o,y,15,true,1,true) else print(text,o,y,flashcol,true,1,true) end end --call to get the number of hidden objects left in a level function count_secrets() local total = 0 for _,u in ipairs(units) do if is_secret(u.type) then total = total + 1 end end return total end --call to get the number of robots left in a level function count_robots(checkalive) local total = 0 for _,u in ipairs(units) do if is_bot(u.type) then if checkalive == true and u.hp > 0 then --we count if they aren't waiting for despawn total = total + 1 elseif checkalive == false then --we count regardless of waiting for despawn total = total + 1 end end end return total end --tells the player remaining robots after one is killed function count_robotalert() if count_robots(true) < last_robotcount then if count_robots(true) > 0 then add_msg("One down... "..tostring(count_robots(true)).." to go!") elseif count_robots(true) == 0 then messages[1] = lang.proceed_a messages[2] = lang.proceed_b end last_robotcount = count_robots(true) end end --calls all map screen related functions function map_screen() onscreenmap(currentmap) local x = 24 local totalSeconds = math.floor(playtime / 60) local minutes = math.floor(totalSeconds / 60) local seconds = totalSeconds % 60 local timeString = string.format("%02d:%02d", minutes, seconds) local idstring = string.format("%02d",selected_map_id) map_text(idstring.."-"..map_names[selected_map_id],0,true) map_text("DIFFICULTY: "..difficulties[difficulty+1],76,false) map_text("ROBOTS REMAINING: "..count_robots(false),84,false) map_text("SECRETS REMAINING: "..count_secrets(),92,false) map_text("TIME ELAPSED: "..timeString,100,false) p_mc_c = 20 end --draws nicely formatted text. 's' is short for special function stext(t,x,y,c,alt) local bg = 0 if alt == true then bg = 1 end print(t,x+1,y+1,bg,true,1,alt) print(t,x,y,c,true,1,alt) end --draws the boxes used for hud labels 's' is short for special function draw_sbox(x,y,w) rect(x,y,w,10,6) rectb(x,y,w,10,1) line(x,y,x,y+8,10) line(x,y,x+w-2,y,10) end -- compressed tilesheet data tiledata = "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccccf011611111a6ccccf80111111611ccccf87011111111ccccf8b401111111ccccf8b840111111ccccf8b884061111ccccf8b888401116ccccf8b884840111ccccf8b888484011ccccf8b888848401ccccf8b888884800ccccf8b888888405ccccf8b888888805ccccf8b888888405ccccf8b888888809ccccf8b888888409ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff448484444448484807777777777777771044444444448484110444444444484411104444444444441111044444444444111610444444444411a1110444444444116111104444444411611161000000001611111110555555cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccfffffffffffccccf04848444848ccccf43373777777ccccf8b044444484ccccf8b404444444ccccf8b840444444ccccf8b884040444ccccf8b888404040ccccf8b884840404ccccf8b888484040ccccf8b888848400ccccf8b888484840ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44848444484484447777777777777777444844444484844444444444444844444444444444444444444444444444444444444444444444444444444444444444444444444444444400000000000000005555555555555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44484848448444447777777777777373484484844844844444484844444444404444444444444404444444444444404044444444444444044444444444404040444444444404040000000000000000005555555555555555ccccf00000000000ccccf40001111110ccccf87001111110ccccf87401111110ccccf8b840111160ccccf8b884011160ccccf8b888401660ccccf8b884840000ccccf8b888484000ccccf8b888848400ccccf8b888884800ccccf8b888888405ccccf8b888888805ccccf8b888888405ccccf8b888888809ccccf8b888888809ccccf8b888884809ccccf8b888888809ccccf8b888884809ccccf8b888888809ccccf8b888884809ccccf8b888848809ccccf8b888884809ccccf8b888848809ccccf8b888884809ccccf8b888888809ccccf8b888884809ccccf8b888848809ccccf8b888884809ccccf8b888848809ccccf8b888884809ccccf8b8888888090000000000000000011111100111111001111110011111100111116001111110011111600111111001111160011111600111666001111660000000000000000000000000000000000111111001111110011111100111116001111110011111100111116001111160011111600111116001166660016166600000000000000000ccccf00000000000ccccf40050050005ccccf87000000000ccccf87400000590ccccf8b840050000ccccf8b484000005ccccf8b848400050ccccf8b884840000ccccf8b888484000ccccf8b888848400ccccf8b888884800ccccf8b888888405ccccf8b888884805ccccf8b888888405ccccf8b888884809ccccf8b888888409ccccc8b8888848098888c8b888848409000008b888884809ccccf08b88848409fffff808b888480988888c808b888409480000c808b848090480440c808b840900480440c808b409010480440c808b090110480440c8040901110480440c8009011110480440c8090111110480440c8001616660480440c00000000000000000ccccf8b888888809ccccf8b888888409ccccf8b888888809ccccf8b888888809ccccf8b888888409ccccf8b888884809ccccf8b888888809ccccf8b888888809ccccf8b888888409ccccf8b888884809ccccf8b888888409ccccf8b888884809ccccf8b888888405ccccf87888484805ccccf8b884848405ccccf47444000000ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff444848444448484807777777777777770044444444848484000444444448484400004444444444440500044444444444000000444444444400005004444444440090000044444444000000000000000000000000005555550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccccf40000000000ccccf8400111111000000884011111608888c08840111110ccccc40884011110ccccf88088401160ccccf4b808840660ccccf8bb80884000ccccf4b8b8088400ccccf8b88b808840ccccf8b888b80804ccccf8b8888b8004ccccf8b88888b800ccccf8b888888b09ccccf8b888888409ccccf8b888884809ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44848444484848480777777777777777004444444448484800044444444484840110444444444444011104444444444401111044444444440111110444444444011111604444444401666660000000000000000000555555c80cf80000000000c80cf88001111110c80cf80801111110c80cf80080111110cc0ff8040801111048408c0440801160777408c0440806604447408c0440800044447408c0440800444447408c0440804444447408c0440044444447408c0440444444447408c0404444444447408c0000000000000008c05555555555555080cc08cccccccccccccc08cccccccccccccc08cccccccccccccc08ccccccccccccfc0cffffffffffff48044484848484840480477777777777004804744848444400048047444444440110480474444444011104804744444401111048047444440111110480474444011611604804744401666660044000000000000000440555ccccf8b888888809ccccf8b888888809ccccf8b888888809ccccf8b888888809fffff8b88888880984848cb888888809777777e8888888094848484c8888880944448484c8888809444444444c8888094444444444c8880944444444444c8809444444444444c8094444444444444c0900000000000000095555555555555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff4444444444444444c0000000000000004c0000000000000044c0000000000000444c0000000000004444c0000000000044444c0000000000444444cccccccccc444444444444444400000000000000005555555555555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff4444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cccccccccccccccc444444444444444400000000000000005555555555555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff4444444444848484000000000847777700000000008448480000000000084444000000000000844400000000000008440000000000000084ccccccccccccccc84444444444444444000000000000000055555555555555553cccc3ccccc000503cccc7ecccc070003eccc7ccccc700003cccc7ecccc050003eccc3ecccc000007eccc377733705053ccc3cccccc500007cc7ccccccc00055777cccccccc00000ceecccccccc00dd0ceecceeeeec005703cc33333333700003eecccccccc005003eecccccccc050073eecccccccc750050eecceeeccc0057000000000000000000111000105005050011050505005050001050950000599500050950550595950000050559055050000050095550595000000095ddd5de9500005959ded95d9000059955ddd5550000005505595050400010005000000a80401105959504a8804011105050004440801111000004000400000000000044800ccccf00000000000ccccf40000000000ccccf87000000000ccccf87400000000ccccf8b840000000ccccf8b884000000ccccf8b888400000ccccf8b884840000ccccf8b888484000ccccf8b888848400ccccf8b888884800ccccf8b888888405ccccf8b888884805ccccf8b888888405ccccf8b888888809ccccf8b888888809ccccf00000000000ccccf40001111110ccccf84001111110ccccf8b401111110ccccf8bb40111110ccccf8b8b4011160ccccf8b88b401660ccccf8b888b40000ccccf8b8888b4000ccccf8b88888b400ccccf8b888888b00ccccf8b888888809ccccf8b888888809ccccf8b888888809ccccf8b888888809ccccf8b888888809ccccf8b3888888098888c8b283888809000008b332088809ccccf08b3e238809fffff808b023880980000c808b388809080440c808b888090080880c808b880901080000c808b809011080440c808b090111080880c8080901111080000c8009011111080440c8050111611080880c8001116660080000c80000000000888884ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff448484844484848407777777777777770044444444484844000444444444844400004444444444440000044444444444000000444444444400000004444444440000000044444444000000000000000000000000005555550000000000000000a0111110011111106101111001111110a140116001111110d141000000000000a1814014141414100a8140186868686100a1408888888881000a8068686868640080a16cacdfdfd10040001666666666008cc48000000cc00000000001110000011111600111116001116660016166600000000000000000040440000004404000400eeeeee00400040ee0000007204000e004444440020000e04000000402000f040048840040200f0404cffc4040200e0408ffff8040700e0408ffff8040700b0404cffc4040700b0400488400407000b040000004070000b0044444400700040b70000002204000400777722004000404400000044040040440000004404000400eeeeee00400040ee0000007204000e004444440020000e04000000402000f040048840040200f0404cffc4040200e0408f00f8040700e0408f00f8040700b0404cffc4040700b0400488400407000b040000004070000b0044444400700040b700000022040004007777220040004044000000440400333333300000000032222b3311111100032222b3311111001032222b3311110011032222b301110011003000033016001110333333300600000032322230c400000033222230080011103222223010001110322222301600111003333330110011160000000006001111160c4010c40011166600801608000000000000000000000077777700000011167e44ee80110011117e00ee88110011117e44ee88800011117e00ee88880011117eeeee88884011167e323e88848000007e222e88884000087e323e88888010847eeeee88848014447eeeee8888401f847e44ee8884801f847e00ee8888801c847e44ee8888401f847e00ee8884800c847eeeee88888040440000004404000400eeeeee00400040ee0000007204000e004444440020000e04000000402000f040230032040200f0403b33b3040200e04003be30040700e040032b30040700b0403233b3040700b0402300320407000b040000004070000b0044444400700040b700000022040004007777220040004044000000440400000000000000000330111100111111032301110011111103223016001111110322230600111111032222033333011603b2220322223066033b2203222230000033b233222230c000033b033222304800103333232230000011003333333011001111000000000600111110c01110c000116666480616480000000000000000000000000000000000111111001111110011111100111111001111110011111100000000000000110033333033333016002222b3322223000032222b322223c400032222b3232308001032222b3233000011032222b3331600111033333303110011110000000000001111100c0110c400111666048011080000000000000000000c487eeeee8888401c8477007e88848014c470770e884840114070ee0e88848011117e00ee88884011117eeeee88888011167e44ee88888000007e00ee88884000007e44ee88848011117e00ee88884011117eeeee8888801111044444c8884011111044444c8480111116044444c8401166660044444c80000000000000000440040000000000044004010011111104400401001111110440040600111111044004060011111104400406001111160440040600111166044004000000000004400400000000000440040100111111044004010011111604400401001111110440040600111116044004060011111604400406001616660440040000000000000000000000000000111132301111110011113223011111001116322230111100116632222301110011003b2222311600110003b2223066000003303b2230000000032303b230c000110322303b304800110323230330000011103333330011001116000000000600111110c01111c000116666481616480000000000000000000000000000000006666666666a1011066666666666101106666661666a1001066666166666108006666666666a100c06666666666a101086666666666a100006616666666a100006166666666a101106666666666a101106666666666a101106666616166a101106666661666a101106666666666a101106666666666a1000077777777777000007bbeebeebee031107bbeeeeeeee073107bebbebeeee377307bbbebeeeef0b77077bbbeeeeef3b4707bbebbbeeee3bc707b7bbbebeef3bc7077bb7ebeebf3bc70777bbbeebef3bc707eeeeeefeff3b470000000333333bbb0037777777777ebb00037373777773eb001037377777377e00000000000000000eeeeeeeeeee00000e733030300e73110e370303030e77310e303000000eb7730b030300000fbb770b300044444fbb470b030044040ebbc70b300040400fbbc70b000044000fbbc70b000040000fbbc70eeeeeeefeffbb47007777777777ebbb0037777777777ebb00037373777773eb001037377777377e0000000000000000077777777777000007777777777740110777777777e7440107777777777748400777777777e748840777777777e748848777777777e748848777777777e74c848777777777e744c48777777777e704488777777777e70044c777777777e701144777777777e710110777777777e701110777777777e710110777777777e7000006666666666a100006666666666a101106666666666a101106666666166a101106666661666a101106666666666a101606666666666a106601616666666f100006166666666a100001666666666f101101a6a6aafaff1016011111111111101100004000000044160011084448c848c0001160c00000008c0000000800000004477777300000000007beee330011111107ebee373011111107bbbe3b7301111107beee3bb73011110333333b7b7301160037777eb773016600037777eb730000000037377e7300000011037377e301110011103333330116001111000000111100111116001111160011111600111116001166660016166600000000000000000eeeeeb0000000000e7000b7001111110e0300b7701111110e0030e7770111110e0000e77700111107bbeee7770301160033333e7707016600033333b7370000000033333b37000000110000003701110011103333370116001111000000011100111116001111160011111600111116001166660016166600000000000000000777777777e700000777777777e701010777777777e700110777777777e701010777777777e700110777777777e701060777777777e700660777777777e700000777777777e700000777777777e700110777777777e701060777777777e700110777777777e701060777777777e700160777777777e706060777777777e700000ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffccccf04444484848ccccf43377777777ccccf8b044448484ccccf8b404444444ccccf8b840444444ccccf8b884000000ccccf8b848055555ccccf8b884059595ccccf8b888055955ccccf8b88805995cccccf8b8880595c8ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff4444444844848444777777777777777744444444484444444444444444444444444444444444444400000000000000005508405555505555908480559590999950f4055559509994808400885990994a440044448590994fccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44444484844444887777777777777777444444484444444444444444444444444444444444444444000000444444444455555304444444444449933044444444aca4937304444444c8c64377300000008aa6437770035355777777777e700000777777777e710110777777777e701110777777777e710110777777777e701110777777777f710160777777777f701660777777777f740000777777777f7480107eefefefff74884033333333337488800444444444488888004448448844c8880104444444444c8801104444444444c80000044444444448ccccf8b8884595c8ccccf8b8884595c8ccccf8b8884595c8ccccf8b8884595c8ccccf8b8884595c8ccccf8b8884595c8ccccf8b8884595c8ccccf8b88845995cccccf8b888459995ccccf8b888459999ccccf8b888400505ccccf8b888455959ccccf8b888459599ccccf8b888455999ccccf8b888459599ccccf8b888455999444444485995999a84844448599099958808444c599599998484440c59959999844440c599d5dddd84440c599d0033488440c599d0330330cccc5d9d033730335555d9d033737303999d9d033737373055555037777773089999d303777730809999d330377308009999d373033080609999d387300801609999d3c730800000caa6437770400000466493777080111055599377704011109999937770801110ddfff37770801110888433b7708011600003373b70c0166033333373b0c000003333333730c000000000000000c0111044448884448011600000000000001110011111100111116001111110011111600111116001616660000000000000000000000000000000006666666666a0111066666666666001106666666666a0401066666666666008006666644466a000c066666aca46a01108666648aaf6a00000666648caf6a0000066666aff46a011106666644466a011606666666666a011106666666666a011606666666666a011606666666666a066606666666666a00000ccccf8b888455999ccccf8b888459999ccccf8b888459999ccccf8b888459999ccccf8b888459999ccccf8b888400000ccccf8b888840333ccccf8b888884033ccccf8b888888403ccccf8b888888800ccccf8b888888803ccccf8b888888803ccccf8b888888809ccccf8b888888809ccccf8b888888809ccccf8b888888809999d93c7708000009999d3c770801110999d93c7708011109999d38770801110d9ddd37770c0116000000e7770c01160333333e770c016603333737b70c0000033333737b0c000000000000000c011100040444444c011600000000000001110011111600111116001111160011111600111666001616660000000000000000000000000000000000111111001111110011111100111111001111100001111100111103333011110011103222230116001103223322b066000003232272b400000003232272e0c0001103227722e00400111022222e00100011110bbee0c0110011111040000f06001111160c0010c00011166600401608000000000000000006666666666a000006664446666a01110666aca4666a011106648aaf666a011106648caf666a01110666aff4666a011606664446666a016601666666666f000006666666666a000001666666666f011101a6a6aafaff0116000000000000001100040000000004160010804448c804c000110c000000008c0000008000000004804444405595959994cffc489dd9d9d9d4fccf4cdd9d9d9dd4ffff4cddddddddd4ffff8cddddddddd4ffff8cddddddddd4ffff8cddddddddd4ffff8fddddddddd488ccffddddddddd8ffffff9ddeeeeee4888888599999999000000000000000000440044444444440004400000000000011088000161666000000000000000005555595599500000ddd9d9d9dd9040109ddd9d9d9d904400ddddd9d9de900440dddddd9ddd904040ddddd9d9de908000dddddddddd904060dddddd9dde908000ddddddddde908000eeefeffeed90801099999999995080600000000000000010444444884808c060000000000000880001166660016108800000000000000000ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff484444844844444400000000000000008c8cc8c88c8cc8cc0000000000000000000000000000000000000000000000000000000000000000aaaaaaaaaaaaaaaa00000000000000000000000000000000555555555555555588888000000000008cccc800011111108cccc870011111108cccc8b4011111108cccc8b84011111048484cb884011160077777e8884016600088484c8884000000048484c8884000011044444c8884100111044444c8840901111044444c8409011111044444c4090111116044444c0901166660000000050000000000555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff48484848444848447000000000000000404444488888888844040000000000004440800000000000444408000000000044444040000000004444440116166a6a444444000000000000000000000000005555555555555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff484448484848444400000000077777778c8ccc8c804444440000000008044444000000000080444400000000000804440000000000004044aaaaaaaa6a6611040000000000000000000000000000000055555555555555550661111661000050016aa611606a000000188000006aa0000001680610686a0000001680110688869005016111111660500500400000000000000008000550550000095080005500000050000c0005005000500000f0090000500009500f0000000900050000c0400000500000900c0400000000005040040000000090000440000000005000005000444e0000500000044844700000000004c084e700005000044844ee7000000003888bb7e300500503ebbb7e73000000003ebbb7b30000550003e7bbb0000500000033330c8009005000000004c8055000500000004c8000000900050004c8000000500000054c8000000000000904800000000090000000ccccf8b3888888098888c8b283888809000008b332088809ccccf08b3e238809ccccf408b0238809000008408b3888090666608408b888090aaaf608408b88090aaaf6108408b8090aaaf61108408b090aaaf616108408090aaaf616610840090aaaf616661084090aaaf616666108400aaaf616661610400aaaf61666616100ccccf8b3888888098888c8b283888809000008b332088809ccccf08b3e238809ccccf408b0238809000008408b3888090666608408b888090aaaf618408b88090aaaa6108408b8090aaaf61618408b090aaaf616608408090aaaf616666840090afffa16666084090111110660a618400166a11a6106608404888111a6106114ccccf8b3888888098888c8b283888809000008b332088809ccccf08b3e238809ccccf408b023880900000c808b388809066660c408b888090aaaaa1c808b880901111110c408b8090166a1611c808b09048881a610c408090040484a611c800901040484a110c409011040484a611c8001110404846110c40000004048461014ccccf8b3888888098888c8b283888809000008b332088809ccccf08b3e238809ccccf408b0238809000008808b3888090666608408b888090aaaf618808b88090aaaf6108408b8090aaaf61618808b090aaaf616608408090aaaf616661880090aaaf616666084090aaaf616666618800aaaf616666160440aaaf616666666100afffa1666666160011111a660a661600166a11a610666100166a141a6106610011111041a6161600aaafa4041a611600aaaf6a4041a66100aaaf61a4041a6100aaaf611a4041a600aaaf6161a4041a00aaaf61661a404100aaaf616661a40400aaaf6166661a4000aaaf61666661a400aaaf616666661a00000011666666610004048411a6161100104048411a6116001104048411a6610011104048411a6100111104048411a6001111104048411a00111661040484110000000000404841000000000004048400aaafa00010404800aaaf6a0011040400aaaf61a011100000aaaa611a01111600aaaa6161a0111600aaaa61661a0666000000116661a000000000004041061000111111040411110011111100404101001111160004041100111116001040410011111600110444001116660011100000000000000000000000000000000000001111110011111100111111001111160011111100111111000000000011111600aaaa660011111600aaaa6110161666000000116a0000000ccccf8bb00b88809ccccf8b0995b8809000008bb099b8409ccccf080d990b409ccccf400d99508090000084080000809066660840bbbb4090aaaf608408bb4090aaaf610840bb8090aaaf61608408b090aaaf61660840b090aaaf616660840090aaaf616666084090aaaf616666608400aaaf616666660440aaaf61666666600ccccf01666666160ccccf8016666666000000880166666608888c08801661660ccccc40880166660ccccf88088016610ccccf4b808801160ccccf8bb80880160ccccf4b8b8088010ccccf8b88b808800ccccf8b888b80800ccccf8b8888b8004ccccf8b88888b800ccccf8b888888b09ccccf8b888888409ccccf8b888884809ccccf0166661a000ccccf80166661a0000000880116661a08888c08801666610ccccc40880116160ccccf88088011110ccccf4b808801110ccccf8bb80880110ccccf4b8b8088010ccccf8b88b808800ccccf8b888b80800ccccf8b8888b8004ccccf8b88888b800ccccf8b888888b09ccccf8b888888409ccccf8b888884809ccccf0166a000000ccccf80166a0111000000880166a01108888c0880166a010ccccc40880116a00ccccf880880166a0ccccf4b808801160ccccf8bb80880160ccccf4b8b8088010ccccf8b88b808800ccccf8b888b80800ccccf8b8888b8004ccccf8b88888b800ccccf8b888888b09ccccf8b888888409ccccf8b888884809ccccf8bb0bb88809ccccf8b00060b809888888b0a6000409ccccf080a610b409ccccf80b00a60809000000808000b809066660080bb0b4090aaaf610808bb4090aaaf611080bb8090aaaf61610808b090aaaf61661080b090aaaf616661080090aaaf616666108090aaaf616666610800aaaf616666161080aaaf61666666610c80cc00000000000c80cc06aaaaaaaaac80cc06aaaaaaaaac80cc06aaaaaaaaafc0ff06fffffffff444048066666666677740480111111114447404801666666444474048016666644444740480166664444447404801666444444474048016144444444740480164444444447404801000000000000044055555555555550000000000000000000a1111aaaaaaaaaa0f1661aaaaaaaaaa0f1661aaaaaaaaaa0f1aa1ffffffffff06111166666666661a01110a1111111116a01110a6666666666a01110a6666666a01a01110a6666666a01a01110a6666666a01a01110a6166161616a01110a6166161616a01110a6111111111101110110000000000000000cc0ccccccccccccccc0ccccccccccccccc0ccccccccccccccc0cccccccccccccff0cffffffffffff080448448888888810804777777777776108047bb7744444661080477774444466610804722074446666108040e2044466616108047444441666161080474444616161610804744411111111108000000000000000005555000000000000000001111c6661c0111001111c6661c6011001111c6661c6a01001111c6661c6a60001111c6661c6aa6001116c6661c6aa6800000c6661c6aa6800000c6661c6aa6801111c6661c6aa6801111c6661c6aa6801111c6661c6aa6801111c6661c6aa6801111c6661c6aa6801166c6661c6aa6800000c6661c6aa68c80cc00000000000c80cc06aaaaaa114c80cc06aaaaaf168c80cc06aaaaaf168fc0ff06faffff1a8444048066666a0117774048011111a0144474048066666a0444474048066666a44444740480660164444447404806a01444444474048066044444444740480664444444447404801000000000000044055555555555550000000000000000000011111100aaaaaa0401111100aaaaaa0440111600aaaaaa0444011600fffaaa0840401600a6666611848406000a1111111844400000a6666011840400000a666a011848401110a666a011844400110a616a011840401110a616a0118484011601166a0118440116016116a01184066600000000000000000cc0ccccccccccccccc0ccccccccccccccc0ccccccccccccccc0cccccccccccccff0fffffffffffff080448448888888810804777777777776108047bb774444466108047777444446611080472d074446666108040e204446666110804744444a1666110804744440a6611110804744400a1611110800000000000000004455500000c6661c6aa6801110c6661c6aa6801110c6661c6aa6801110c6661c6aa6801110c6661c6aa6801110c6661c6aa6801110c6661c6aa6800000c6661c6aa6800000c6661c6aa6801110c1111c6aa6801110cccccc6aa6801110011111faa68011111066666fa680111116016666c680116666001111168000000000044444cc80cc00000000000c80cc06aaa401110c80cc06aaf840110c80cc06aaf844010fc0ff06aff844400444048066a0840407774048016a0848444474048016a0844444474048016a0844444474048011a0844444474048016a0444444474048011a44444444740480114444444447404801000000000000044055555555555550000000000000000000011111100110aaa0011111100110aaa0011111600110aaa0011111600110ffa0011111600110a6660111666001660a1140000000000000a6040000000000000a484011100111111084440110011111100840401001111110a0848400011111101a0844000111116011a08400016166600000000000000000ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44844484448484847777777777777777484844448448484444444444444444444444444444444444444440000004444444444c6661c0444444444c6661c6044444444c6661c6a04400000c6661c6a60053533c6661c6aa60cc08cccccccccccccc08cccccccccccccc08cccccccccccccc08ccccccccccccff0cffffffffffff480448448888888804804777777777770048047bb7744444000480477774444401104804799074440111048040d9044401111048047774440111110480474444011111604804744401616660048000000000000000000555cc08cccccccccccccc08cccccccccccccc08cccccccccccccc08ccccccccccccff0cffffffffffff080448448888888810804777777777776108047b700774446610804770b007446661080470222b046666108040322b0466666108047322b76661661080400007166666110804777466666166108000000000000000044555cc08cccccccccccccc08cccccccccccccc08cccccccccccccc08ccccccccccccff0cffffffffffff080448448888888810804777777777776108047b70000744661080470590d0746661080405999d04666610804059990466666108040090746661661080470774166666110804774466666166108000000000000000040555cc08cccccccccccccc08cccccccccccccc08cccccccccccccc08ccccccccccccff0cffffffffffff080448448888888810804777777777776108047b77070744661080477060a0746661080470066a0446661080406610044666610804060607466166108040707716666611080477746666616610800000000000000004055500000c6661c6aa6801111c6661c6aa6801111c6661c6aa6801111c6661c6aa6801111c6661c6aa6801111c6661c6aa6801116c6661c6aa6800000c6661c6aa6800000c6661c6aa6801111c6661c6aa6801111c6661c6aa6801111c6661c6aa6801111c6661c6aa6801111c6661c6aa6801166c6661c6aa6800000c6661c6aa68333773333cc00000cccccccc7eeeeeeecccccccc77777777ccccccc3ccc3cccccccccc3cccc3ccce333333cccce3ccceccccc3cccce7ccceccccc7cccce7ccceccccc7ccccc7ccccccccc3ccccc7ccccccccc3ccccc3cccc011111100111111001111160011111600111116001111160011666600161666000000000000000003cccc3ccccc000003cccc7ecccc111103cccc7ccccc111103cccc7ecccc111103cccc3ecccc111107cccc377733111603ccc7cccccc116607cc7ccccccc00000777cccccccc00000ceecccccccc11110ceecceeeeec111603ee33777733111103eecccccccc111603eecccccccc111603eecccccccc166600eecceeeccc000000110000000011110016aaaaaa6166111001160aaaa061610000116000006610000001160aa061000900501160aa0600050050041aaa6000000000008000550550000095080005500000050000c0005005000500000f0090000500009500f0000000900050000c0400000500000900c04000000000050400400000000900004404488888888888844400000000000000443223032230223344488888888888844400000000000000443223032230223344488888888888844400000000000000443223032230223344488888888888844400000000000000443223032230223344488888888888844400000000000000443223032230223344488888888888844000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc0ccccccccccccccc0ccccccccccccccc0ccccccccccccccc0cccccccccccccff0fffffffffffff610448448888888811804777777777776608047bb77444446610804777744444a611080472d074440a66108040e2044400a6110804744444010a1660804744440110a6110804744401110a11108000000000000000044555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff14444144441444444144404444414444111111011111111144414a104444400044441a6104440fff11111a661010f88c144441166100ccc841444a6166108c8811111a66466108c844414a666166100444441a66661614c8ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff14444144441444444144404444414444111111011111111144414a104444400004441a6104440ffff0111a661010f88c8c0441166100ccc88c044a6166108c8888801a66466118c844404a666166100466884a66661614c8ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff14444144441444444144441444414440111111111111111444414444144441400444144441444400f1111111111110108c044414444144008c014441444410408880111111111100444041444144401066884414441404007eee700000000000e737e30001111080e3e3e37001110800e737e3770110f0107eeef77e710c011033337fe7e700116007efeffe7e711660007eeeffe77000000007efeffe70000001117eeee701111001110777708011600110801000080110010c01600110c06000f0116001110f000f066660016110c0000000000000000000000f66666164c601110f16666614c601110a61666664c601110f661666618c01110f666466611f01110f66664cc460011100f6664fff610000000a66404f8100000000f66cc881011111100a6664410111111000f6666001111110010a6661011111600110a6610111116001110a6101166660016160a1000000000000000aa61c8f66666164c6a61f8f16666614c6661f8a61666664c6ccc48f661666618ccff84f666466611f14444f66664cc460014400f6664fff610000000a66404f8100000000f66cc881011111100a6664410111111000f6666001111110010a6661011111600110a6610111116001110a6101166660016160a1000000000000000aa61c800000000000a61f801001111110661f801001111110ccc4806001111110cff8406001111110144440600111116001440660011116600000000000000000000000000000000001111110011111100111111001111160011111100111111001111160011111600111116001111160011666600161666000000000000000000000000000000000011111100111111001111110011111100111116001111110011111600111111001111660011111600111666001111660000000000000000000000000000000000111111001111110011111100111116001111110011111100111116001111160011111600111116001166660016166600000000000000000ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff077777c7cce444440ccccccccce037770cccccccccf403443ccccccccce4403400333333333c44033cceceefeffc444008888888840c0444408888888844c4444408848ccc888c0800008800008888c45353388888888880ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44848484448484447777777777777777444848444448444444444444444444444444444444444444344444444444444403444444444444444034444444444444440344444444444484400000000000000844033355555555ccccf8bb88888809ccccf8b0b8888809ccccf8b00b888809ccccf8b000b88409ccccf8b0000b8809ccccf8b00444b409ccccf8b00488b809ccccf8b00488b409ccccf8b0444cb809ccccf8b0448cb809ccccf8bb044cb809ccccf8b8b48cb409ccccf8b88b4cb809ccccf8b888b8b409ccccf8b8888bb809ccccf8b88888b80900000000000000000000000000000000000000000000000009fd5000000000000dd5f0000008000009dd0009d00000800099000d900000000000000084408000000000080000800000000004ccf840000008000040840000000000100000011000000016610006a000000000000000000000000000000000000000000000000000000000000000000111110888888888011111108848ccc80111116008800008011111600088888801111660000000000111666001111660000000000000000000000000000000000111111001111110011111100111116001111110011111100111116001111160011111600111116001166660016166600000000000000000c0c84000000000008c0840100111111088c0801001111110888c0060011111108888c0600111111000000060011111600111666001111660000000000000000000000000000000000111111001111110011111100111116001111110011111100111116001111160011111600111116001166660016166600000000000000000ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44848888888888887777777777777777700000000074444447440000000744444478440044007444444784444444474444447888848444744444477777777777444444444444444400000000000000005555555555555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff077777c7cce444880ccccccccce037770cccccccccf403443ccccccccce400343cccccccccfc04033ffefeefeffc044004888408884c0444404888408884c0444404888408884c0400004888408884c0535304888408884c61111111611111aa11a11161111116111a61111111111111111111116111111114444444444444440ffccccccccccccc0ffccccccccccccc0ffccccccccccccc0ffccccccccccccc0fffffffffffffff0444444444444444111611111104040411a1111111108044116111111166080411611161166aa0041611111116666fa60bb44443333000000b4cffc4bbb1111004c4444c4bb1111000cbbbbc0bb11110448777780bb16660ccccccc883300000ccc4444487b11110cc4cffc447b11110c4c4444c47b11110f4cccc8c47b1666044f4444f47b00000048033380bb11110004077707bb111100e7bbbbbbbb111100eebbbbbbbb111100eebbbbbbbb000003cccc3ccccc3cccc3cccc3ccccc3cccc7cccc3ccccc7cccc3cccc7cccce7cccc7cccc3ccccc7ccce7cccc7cccce7ccce7cccc7cccce7ccce7cccc7ccccc7cccc7777777777777777ceeeeceeeeeeeeeecffffcffffffffff73777737777737777737777377777377777377773777773777773777737777730000000000000000337377777cc77770cccccccc7ef37770cccccccc7ef73770cccccccc7ef77370cccccccc7ef77730333737777cc77770cccccccc7ef37770cccccccc7ef73770cccccccc7ef77370cccccccc7ef77730cccceeec7ef77770337377777ef77770cccccccc7ef37770cccccccc7ef73770cccccccc7ef77370cccceecc7ef777300000000000000000ceeeeceeeeeeeeee77777777777777777cccc7cccce7ccce7cccc7cccce7ccce3cccc7cccce7ccce3cccc7ccccc3cccc7cccc3ccccc7cccc3cccc3ccccc3cccc3cccc3ccccc3cccc3cccc3ccccc3cccc011111100111111001111160011111600111116001111160011666600161666000000000000000007cc33337733000003eecccccccc111103eecccccccc111103eecccccccc111100eecccccccc111107cc33337733111603eecccccccc116603eecccccccc000003eecccccccc000000eecccccccc111100eecceeeccc111603ee33777333111103eecccccccc111603eecccccccc111603eecccccccc166600eecceeeccc000000cc3337733300000ceecccccccc111107773ccccccc111107ccc7cccccc111103cccc377777111103cccc3ececc111603cccc3ecccc116603cccc7ecccc000003cccc7ccccc000003cccc3ccccc111103cccc3ccccc1116001111110011111100111116001111160011111600111116001166660016166600000000000000000ccccc3ccccc3ccccccccc7ccccc7ccccccccc7cccce7ccccccccc7cccce7ccccccccc3cccce7ccce337773cccce7cccecccccc3cccc7ccceccccccc7ccc7cccccccccccc77737777cccccccc7eeeeeeececeeeec3eefffff377777773ee37777cccccccc7ee73777cccccccc7ef77377cccccccc7ef77737cceeeeec7ef77773ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff000000000048488870cccccccc077777470880000880744444708808088c074444470880808880744444708888888c0744444777777777774444444444444444444444444444444400000000000000005555555555555555ccccf0b888888809ccccf0cb88888809ccccf0c0b8888809ccccf0c80b888809ccccf0c880b88809ccccf0c0880b8809ccccf0c0088b8809ccccf0c0808b8809ccccf0c0088b8809ccccf0c8008b8809ccccf80c888b8809ccccf8b0c88b8809ccccf8bb0c8b8809ccccf8b8b0cb8809ccccf8b88b0b8809ccccf8b888bb880900000000000000000000000000000000000000000000000000000000000000000000b00000000000000007111000000000000118141000000000148c18410000000011118c84000000001448cfc40000000014488c8400000000014488410000000000144410000000000000000000000000000000000000000000000000000009d90050000000000d05d055501111100d05d059950111100d05d95d9950111009d9505d099501100090099d05595010090d909d000090100909d09f955090000905509dd95090000590099fddd990100059ddddffd99010010055999dff901001110055999990100111110055995010011616600000001000000000000000000aaaa00000000000a6000a0444444000a0100a6048888400a0000a66088cc840a0000a66608ccc8406666a66616cccc8001116a6616cc8cc0401116a616cc4cf04401666a16cc4cc04840000066cc4cf0488411166acc8cf048ccccccccccccf048cccccccccccfc048cc844448ccfc00048ccccccccfc0400048fcfcfffc04809500000500000500000000a00500000000500a00000000000500600000050000400100590000000401100000009050584010000000500008840400900000055888400050050050088884000050005008888448000000900f888481000000000cf884811166aaaa00cf848100500500940cf448000095005840cf000900005900000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf00cf0000000000cf00cc000000000022002200000000002200b200000000002200b2000000000022bb220000000000222222000000000002222000000000000000000000000000000000000000000000000000000000000000000000000011109e000011005500009d059011005905055059011100955050059e111100d50595550011160000099959501166001050995d90000000090500d595de000005959905599d010099550590000016000e0005d5011111001010599d01111600111100de01111600116666001616610000000000000000009004444448fc048000004444448fc040004804444448fc000501804444448fc090011800000000f900100400488840050600000081118000a00000900010000a0000005000100000000500005060500500050000006090000500009500a000000090005000a050000005000050a000900000000000a0005000000009000059088404000500000508880884000500000480888840000000000888488400050004888884884000000c8808884884905050c8808888c05000000c88088c0000055000c888c005005000000c8c00500050050000c0000000900005000095009000000090005000005000000500005005009000000000009500500000000900005904888888888c000008c8cccccccc4011088ccccccccf440108cccccccccf484008cccccccccf448408ccccccccce444840ccccccccce444480cccccccccf444443ccccccccce4444400333333333844443cceceefeff0844408888888840c0844008888888844c0840108848ccc888c0801108800008888c0000008888888888c00000000000000000111111001111110011111100111111001111160011111100111116001111110011116600111116040116660011116608400000000000000484000000000000044840010011111104448401001111160444440100111111044444060011111604444406001111160844440600161666008444000000000001a11111161111111611111661111111a11111611111111a116611116111116116a111116111161111111111a1111611111111661111116161111611111111a1111111111111166111111111111661111111111111a1111111111161116111116111161111611111611116111611111611166111111161111111111111a611111111111611111111a111116a11111116116111611111611611111611111611111111111116a11111111111116111111116611111611116111111111a1111a111a1111116116a111161166111161111161161111116111111111111111111111611111616111111a11111161111111161111661116611161111111116116a61116000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048888888888000008f44ccccccfc011084884cccccccc11084884cccccf84c008c44ccccccf848c08ccccc8888c8444c8cccc8ccccf844488cccc4c44cf844448cccc4c44cf844448cccc8ccccf84444ccfffcfffffc844404888c8c22c0c444004888c8848c08440104888c8e4880c401104888c8888c040000044444444444cccccccccccccccccccccccccccccccc0000000000000000044444444444444008888888888888800cccffffffffffc440400000800004f8240480488408888f424084088840004844240444444444444442408c8c8c8f8f400424044444444440e042408c8c8c8f444224240444444400000002408c8c8c5555555024044444ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff044444444488444440277777777733738402444444444444f8402444444444408f8402444444440088f8402444444044448f8402400040448f88f840240e040044448f84024020008f8f88f8402000004444448f84033555cccccccccccccccccfcfcfffffffffcc444444444444444080004400440000008400000000000000044444444444444008888888888888840cccffffffffffc400400000800004f8400480488408888f4400840888400048400004444444444440e0008c8c8c8f8f4442200444444444000000008c8c8c8f5555555004444444ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff04444444448844440427777777773373c002444444444444440424444444444084c0024444444400f8440424444440448f84c0024000404488f84404240e0400448f8480024020008f88f8440420000044448f84800335554488888888888844400000000000000447ee7032230223344488888888888844400000000000000447ee7032230223344488888888888844400000000000000447ee7032230223344488888888888844400000000000000447ee7032230223344488888888888844400000000000000447ee703223022334448888888888884400000000d0500000011111105090111001111110009011100000000005011110055950005011111000550005d0111160c500555090111660cc00599000000000c4c5000000000000cccc001001111110ccc8c01001111160ccc8401001111110ccc4806001111160ccc4806001111160ccc8406001616660ccc840000000000044888888008c8c8c40000000000444444322303223044444448888888880000440000000000000044322303223022334448888888888884440000000000000044322303223022334448888888888884440000000000000044322303223022334000000000000000008888fffffffffff088888888888888800440004004004008f8f88f8408888444444448f84000004444444448002233440000000088888444000000000000004432230322302233444888888888888444000000000000004432230322302233444888888888888444000000000000004432230322302233404888888888888440000000000000004f0223032230223340008888888888844cccccccccccccccccfcfcfffffffffcc44444444444444408044400044000440880404440044404088404cf8448ff40048804cf8448ff4042484048040088400424408c8004cc004442408f8004ff04c444300080040004c44443440000440080000000000000004044444444444444408888888888888880cccffffffffffc8cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc0444444444884444042777777777337300024444444444444004244444444440c400024444444400c404042444444044840000024000404480044004240e040000048400024020004044840400000000840444040003355511111111161616661161616666666666161666661666666666666666661666661666666666666666666666666666666666666166666666666666166666666666661666666666666666661666666666666661666666aaaaaa6666666666a000006666666666a480006666666666a04c006666666666a004c06666666666a000481661666666a000006616666666a011106666666666a011106166666666a0111066666666666011106666666666a011606666666666a016606666a66661a0000066aa6666aaf0000061a66a11aaf01160aaafaffffff01160000000000000011001111160011480600111116001114c0001166660016164c00000000000000048484400000800004f4500480488408888400808408884000444000044444444444000088c8c8c8f8f08888888888888c008888888888888f808888888888888fc0cccfcfffffffffc444440044440048f4044448044084448400404f0000f84444440400044004444400008f8404fc040403308f8004fc0444444400800400000cc40400444448844fcc40000000000048ccc40000033223448fcc400044888448f8cc840000000040848fc840003233404488cc840088844c00448cc80000004c8044c88c0322334ccc0044480448844fcc80000000000044fc8c0000003233444fc840044448844044c8880000000048044cc840003233400000000004488446666666666661611661666666666616661666666666666666666666666666666666666666666666666666661666666666666661666666666666666666666666666666666666666666666666666666666666a6aaaaaaaaaaa00000000000000000481116001111160014c1160011111100114c6600161666000004800000000000000000000000000011111100111111001111110011111100111116001111110011111600111111001111660000111600000000008000000999999908999999955555550c555555500000000080500000111111000050000011111100005901001111160005990100111116050550110011666609500111000000000d5000000333773333cc00000cccccccc7eeeeeeecccccccc77777777ccccccc3ccc3cccccccccc3cccc3ccce333333cccce3ccceccccc3cccce7ccceccccc7cccce7ccceccccc7ccccc7ccccccccc3ccccc7ccccccccc3ccccc3cccc0000000750070000005d5005000005000000000003705007000000000007500500000000700005700000000000000000ceeeeceeeeeeeeee77777777777777777cccc7cccce7ccce7cccc7cccce7ccce3cccc7cccce7ccce3cccc7ccccc3cccc7cccc3ccccc7cccc3cccc3ccccc3cccc3cccc3ccccc3cccc3cccc3ccccc3cccc0000000750070000005d5005000005000000000003705007000000000007500500000000700005700cc3337733300050ceecccccccc070007773ccccccc700007ccc7cccccc050003cccc3ccccc000003cccc333333705053cccc3ecccc500003cccc7ecccc000553cccc7ccccc000003cccc3ccccc00dd03cccc3ccccc005700000000750070000005d5005000005000000000003705007000000000007500500000000700005700000000000000000011111100111111001111110011111100111116001111110011111600111111001111660001111600000000008000000999999908999999955555550c55555550000000008000000011111100011116001111110011111100111116001111160011111600111116001166660016166600000000000000000448888888888884440000000000000044322307ee7022334448888888888884440000000000000044322307ee7022334448888888888884440000000000000044322307ee7022334448888888888884440000000000000044322307ee7022334448888888888884440000000000000044322307ee702233444888888888888444488888888888844400000000000000443223032230ee7344488888888888844400000000000000443223032230ee7344488888888888844400000000000000443223032230ee7344488888888888844400000000000000443223032230ee7344488888888888844400000000000000443223032230ee7344488888888888844ccccf88888888809ccccf86888888805ccccf86488888409ccccf86a68888405ccccf86aa4888805ccccf86aaa6bbbbbccccf86aaf6eeeeeccccf86afa6fccfeccccf86faf6fc8ceccccf86affc4488eccccf86fff44c88eccccf86fff8fc88eccccf86fff6fc88eccccf86ffa6fc88eccccf86ffa6ef88eccccf86aaf6eeeee0000000000000000011111100111111001111110011111100111116001111110011111600111111001111660011111607011666001111660b700000000000000b770000000000000b7b7011001111110b7bb701001111160b7bb701001111110b7bb306001111160b7bb306001111160b7bb306001616660b7bb30000000000000000048884088840111110488840888011111104888408801111160048884080111116000488840011116600100000001116660011116600000000000000000000000000000000001111110011111100111111001111160011111100111111001111160011111600111116001111160011666600161666000000000000000000000000000000000484048404840484084808480848084804840484048404840000000000000000048404840484048408480848084808480484048404840484000000000000000004840484048404840848084808480848048404840484048400000000000000000484048404840484084808480848084804840484048404840ccccf86afa6eeeeeccccf86faa6fccfeccccf86afa6fc8ceccccf86aaac4488eccccf86aaa44c88eccccf86aaa8fc88eccccf86aaa6fc88eccccf8b6aa6fc88eccccf8b46a6ef88eccccf8b8466eeeeeccccf8b8846eeeeeccccf8b888407777ccccf8b888840333ccccf8b888884077ccccf8b888884007ccccf8b888888050b7bb300000000000b7bb311001111110b77b311001111110b7b3316001111110b7bb316001111110b7bb366001111160b7bb366001111660b7bb300000000000b7bb300000000000b7bb711001111110b7bb31100111116077bb7110011111103ebb31600111116077eb716001111160777e7660016166607777700000000000cc0ccccccccccccccc0ccccccccccccccc0ccccccccccccccc0ccccccccccccccc0ccccccccccccc08044844888888880080477777777777000804770778444400008047000744440111080470077444011110804700074401111108047027740111116080470777011111600804774401166660008000000000000000044555cc0ccccccccccccccc0ccccccccccccccc0ccccccccccccccc0ccccccccccccccc0ccccccccccccc0804484488888888108047777777777761080477077444446610804700074444661108047007744466661080470007446666110804702774a166611080470777066611110804774400616111108000000000000000044555cc0ccccccccccccccc0ccccccccccccccc0ccccccccccccccc0ccccccccccccccc0ccccccccccccc088448448888888814804777777777776108847707744444661480470007444466610884700774446666148047000744666661088470277466616614804707771666661108847744666661661480000000000000000445550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44444444444444447777777777777777447777037744444444477700377444444444770703774444444447777033744444444477000007444444444777777774444444444444444400000000000000005555555555555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44444444444444447777777777777777447773003744444444477037037444444444777770374444444447770377744444444473000037444444444777777774444444444444444400000000000000005555555555555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44444444444444447777777777777777447773003744444444477077037444444444777300374444444447777303744444444473000777444444444777777774444444444444444400000000000000005555555555555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44444444444444447777777777777777447777037744444444477703737444444444770370374444444447300003744444444477773077444444444777777774444444444444444400000000000000005555555555555555ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff44444444444444447777777777777777447773000744444444477037777444444444770000374444444447777303744444444473003777444444444777777774444444444444444400000000000000005555555555555555c80cc00000048809c80cc06aaa004809c80cc06aaf040409c80cc06aaf044009fc0ff06aff044409444088066a0180807774088016a0148444474088016a0184444474088016a0144444474088016a0144444474088016a0444444474088016a4444444474088016444444444740880000000000000008405555555555555044c80cc0b888888809c80cc08b88888809c80cc008b8888409c80cc0408b888409fc0ff04408b8880944404c04408b8809777404c04408b4094447404c04408b0944447404c0440805444447404c0440054444447404c0440544444447404c0440444444447404c0444444444447404c0400000000000004c055555555555550447c337377777000503ecccccccc7070003ecccccccc7700003ecccccccc7050000ecccccccc7000007c333737777705053ecccccccc7500003ecccccccc7000553ecccccccc7000000ecccccccc700dd00ecccceeec7005703e337377777700003ecccccccc7005003ecccccccc7050073ecccccccc7750050ecccceecc700570333333333333333333e7777777777777373e7777777777773773e7777777777737773eeeeeeeeeee3777e033333333333777e303333333333777e330333333333777e373033333333777e377300000003777e377733333333777e377737004003777e377737000003777e377737000003777e377737040403777e377737000003333333333333333777777777777777777777777777777777777777777777777eeeeeeeeeeeeeeee33330e3333333333333330b3333333333333330b3333333333333330b3333333000000000b0000003333333330b333330000000040000400004000040040000000000000000000000004000000004040400004000000000033333333333333337777777777777b33777777777777b37377777777777b3773eeeeeeeeeeb3777333330733333b777333333073330b777333333307330b777333333330700b777300000000033b777333333030303b777300000000403b777300400004003b777300000000003b777300040000003b777340000400003b7773c80cf80000000000c80cf88000000000c80cf80800000000c80cf80080000040cc0ff8040804040048408c0440800000777408c0440804004447408c0440800444447408c0440800444447408c0440804444447408c0440044444447408c0440444444447408c0404444444447408c0000000000000008c055555555555550803777e777737000003777e777737000003777e777737000003777e777737000403777e377737404003777ee37737000003777e7e3737004003777e77e337000043777e777e37000003777e7777e3004003777e77773e000003777e777737004003777e777737000003777e777737000003777e777737040403777e77773700000000000000000000000400404000000000000000000000000000800000000004000000040400404000000000000000000000000004000040000000000000000040000000004000000000000404004040040000400000000000000000040000400004000040040000000000000000000000004000000004040400004000000000000000000003b777300400404003b777300000000003b777300080000003b777300000040403b777300000000003b777300000000403b777300000000003b777300000000003b777300000040003b777340000400003b777300000000403b777300400004003b777300000000003b777300040000003b777340000400003b7773ccccf00000000000ccccf40400000000ccccf87000000000ccccf87400000040ccccf8b840040400ccccf8b884000000ccccf8b888400400ccccf8b884840004ccccf8b888484000ccccf8b888848400ccccf8b888884800ccccf8b888888405ccccf8b888884805ccccf8b888888405ccccf8b888888809ccccf8b8888888093777b777737000003777b777737000003777b777737000003777b777737000403777b373737404003777bb37337000003777b7b3733004003777b337337000043777b333733000003777b333373000003777b33333333333377b3bbbbbbbbbbb37b37777777777773b377777777777773377777777777777333333333333333300000000000000000040040400000000000000000000000000080000000000400000004040040400000000000000000000000000400004000004000000000004000000000400000000000000000000003333333333333333bbbbbbbbbbbbbbbb777777777777777777777777777777777777777777777777333333333333333300000000003b777300400404003b777300000000003b777300080000003b777300000040403b777300000000003b777300000000403b777300040000003b777300000000003b777300000000003b777333333333333b7773bbbbbbbbbbb377737777777777773773777777777777737377777777777777333333333333333333ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff444848444484844403337777777777770044444444448444000444444448444400004444444444444000044444444444000000444444444400400004444444440000000044444444000400000000000040000400003535558888888888888888844444444444444484888884cccccccc8488884ccccccccc848884c8cccccccc84884c8ccff000008484c8ccf000cf00844c8cc808888c408cccccc048888cc08ccccc80048888808ccccc0000488cc08ccccc00000000008ccccc00000048848ccccc0fc880cccc8ccccc0c8cc4cccf8ccccc0c88884884888888888888000044444444444c4004ccccc48888cf4400cccccc4888cf4440ccccc8c488cf48800ccccc8c48cf8880000cccc8c4cf488000008ccc8c8f888400000ccccccf8880000808cccccf8884000880cccccf8884088880cccccf88848888c0cccccf04844c88f0cccccf808404ccf0cccccf0484000000cccccf8084ddddddddddd50000d905050505e95000d090505050e99500d505000000ed9950d050500000eddd90d500011111eddd90d050011010edd9d0d500010100edddd0d050011000eddd90d500010000edddd0eeeeeeeeeeedddd055999999999eddd0055990000999edd00055599999999ed00005555555555590400000000000000099999999999500009ddeedeedee950009ddeeeeeeee995009deddedeeeed99509dddedeeeeeddd9099dddeeeeeeddd909ddedddeeeedd9d09d9dddedeeedddd099dd9edeededdd90999dddeedefdddd09ddedeeeeffdddd055999999999eddd0055990000999edd00055599999999ed0000555555555559040000000000000008ccccc08884000448ccccc0884000cc88ccccc80400008888cccccc000000cc8844c8cc8000000c88484c8ccc00000fc84884c8cccc00000848884c8cccccccc8488884ccccccccc84888884cccccccc84444444444444448cffcfffffffffff0444444444444444004000000000000005044444444444440050000000000000000000cccccf0484800000cccccf8084888008cccccf048488880ccccccf808488808ccc8c8f0884000cccc8c4cf00840ccccc8c48cf0984ccccc8c488cf0484cccccc4888cf0484ccccc48888cf028444444444444f0484ffffffffffff8084444444444444c8840000000000044c8444444444444444c400000000000000080888c4000000000084000c400040000080400f8404004000c0040fc840000080c0000f8c840404004cffffc8c840000004888cfc8c844444004848cfc8c840840004848ccc8c804400004848ccc8c484040004848ccc84c44000004848cc84c400400044888888c400000040000488f4000400484888cff44000004444444444ccccc04444400000c000804888c40000c000404888c84000c000804888c48400c848c0444448484044000cccccc48484c8888cccccf04844c8888cccccf80484c8888cccccf88044c8888cccccf888048ccc8cfffff8888048048048888c8888048048044848c8880048048044848c8805044044044848c8000044044044848c61111111611111a611a1116611111a111661161111111611111111116111161111111111111161111111111116a61111111111661111111611111a11611611111111a11161111111111111111111a1111111111111161111111661111111111111a111111611111611611111611111111161116611161111161111111a6111110000000000000000077770333333333003337033333333300337703333373770077770333333333007777000000000000777703333033330077770333703377007777033770777700b7bb0377707777000000000000777700377777777077770033333777b0777b003377777bb077bb0077777777b0777700000000000000000095000005000005000050005004400000050005004444000000330000444800005037009008800009005500000500005504400053000337004448005330033700048090337000000000050000000050050000000004409000003300954448000003337050048005000077000000050090050000000095005000000009000059000330000500000000333500500503305333530000003337035337000000733770357000550033737000055335300333000090355330048400000000730044844000044000504448800044480000448c0000488400000880000508800440500300000000444800333555755048800003005557000000440000000000090440000095000050000005000000050050000000005050000000000005000000005500009000059000000009000500000090505500950000005000000000009000000550000000500500500000050000500050050005000000009000050009500090000000900500000050000005000550050090000000000095005000000009000059009500000500000500000000500900000000500500000000007e000000000500003700005900000009000500000090505500950000005000000000000000000550000007e005000000000500005000dd050005000000005900000000950090000005d5005000005000000000003705009000000000009500500000000900005900950000050000050000000050050000000590050000000000000500000005000000000090003300090000000530737055000440000337000000448800000005500044800050005000000500000000500500050000030090000500009533700000009000500700000000050000000500900000000000950050000000090000590000009900d0000000dd059d099d000500590059090000500000000005d505d50050e0005090005000007e0000000007000030e000007007e05000000050ee70059900005000300e09000000007000030000090000ee000000dd909050300000009dd0000000000000099dd0000050d500000900dd00505d00000000000005d50000000000000000050484800500800005404800800034000004c8404004000000404c4000000088000040000434000000000000484303fc0900550000000330050000009043000000048459044000000004c0050004cc0000000000004cf40000054400034cfc490090330803438840505003400034480050000000040340000008805000000000003cc80984000004003ff800000484000048c400408c04000004400484884009000450084300008000009540040408480440050000004c4480050000000488c4800500c80004948c00000044000054800000840088050005000440488c005055400000498840004080000045008050400005050000000005001111111111141440111114444444444011111114144444401444444444444440144444444444444014444444444444601444444444444440144444444444446014444444444444404444444444444460144444444444446044444444444444604444444446466660444444444444466044444464666666600000000000000000077700000000770073eed0050337dd70377e7000037e7e700e9750d0007e7770e779d00d0077ed700e5d07333330770000000337073000000900037b73000000000900be309d090000003733370000003707030033377e0777e7e00903777d07e77ede0d0333dee7e7edde00507defe07edfd00000deffe007700005000eee009500000500000500048000500500000048fc0500000000008cff00000005000008c8009000000009000084050000005000000c4000000000000000f4088888800000500c4044444000050080c440500500050084088090000500008444c0000000900084000000000005008400050090000000840095005000000084000059009500000500000500048000500500000048fc0500000000008cff00000005000008c8009000000009000084050000005000000c4000000008888880f4088888844444440c4044444000050000c440500500050000088090000500009044c0000000900050000000000005000000050090000000000095005000000009000059009500000500000500048000500500000048fc0500000000008cff00000005000008c8009000000009000084050000005000000c4000000008888800f4000000044444400c4040000000050084c440500500050084088090000500008444c0000000900084000000000005008400050090000000840095005000000084000059009500000000000500000059909500000000505900dd0000000000009dd5550000000000dd00590009599055000505905559d959035509d9000000373000005500599d0003735959009ddd0070709d0d00999e000003590e00005559909055000000595955dd595000000000dde0050090000000dd00950050000900000000590000000084000000005000008409000000048000840500000048fc0084000095008cff00840005000008c8000405000099000084040000005000050c4000000000000000f4000005509500500c4040000000050080c440500000000084088000000500008444c000090050008400000000000500840005009000009084005000061111111611111a61148016111111611148fc1111111111118cff01161111111108c8011111111111110184116a61111000000c4000000008888880f4088888844444440c4044444111111110c41111111111161108116111116111a6111611111a11111666a111611611111111111111161116111161111161111111661111109500008400000500048000840500000048f80084000000008cff00840005000008c80084000000000000c4040000005000000c4400000008888880c4000005544444440c4040500000050000c4405005000500040c8090000500000488c00000009000000000000000050000000500900000000000950050000000090000590095000000055500000599500059995000559dd9509dd95000559dd9509dd9500005599595599590059955599595599559dd955559d9055005dd99599ddd00305059959999dd507000055559d999500000559959955950000059dd95555573030059dd9950007730000599950700033700505550330003735000000009000000009500008400000500048000840500000048fc0084000000008cff00840005000008c8008400000009000084040000005500500c4000000000000009f4088888800000950c4044444000050000c440500500050000088090000500009044c0000000900050000000000005000000050090000000000095005000000009000059009500000500000500048000500500000048fc0500000000008cff00000005000008c8009000000000000084050000005000000c4000000008888880f4000005544444440c4000500000050000c440500500050000088090000500009044c0000000900050000000000005000000050090000000000095005000000009000059009500000500000500048000500500000048fc0500000000008cff00000005000008c8009000000009000084050000005500000c4000000000000009f4088888800000950c4044444000050000c44050050005000008809000050000904%4c00000009000500000000000050000000500900000000000950050000000090000590777777777777777773333333333333377377e77ee777ee37737ee33eebbeee3773ee7e7bbeee7b3773e7e7eeeeeeee3773ee7eeeeeeeee3773eeeee7beeeee3773eeee7eeeeeee3773eee7e7eeeeeb3773eeee7beeebee3773e3eeeeebb7ee3773eeeeeeeeeeee3773eeeeeebeeeee37733333333333333777777777777777770950000050000001000000050050001400050050000001440050000000001444090000059001444490005000001444465009500001444444000000501444444600000001444444440000001444444446500001444444444600001444444444460501444444646666001444444444446601444446466666660000000000000000010000005000005001055005005000000110505000000000011100000000500004441009000000000444410050000005044444100000000004444441000000550444444410000500044444444100500004444444441009000444444444410000044444446466100004444444444461090444464666666615000000000000000000000000000000070040040400000077000000000000073700080000000073370000004040073e37000000000073ee3700000000473eee370000000073eeee37000000073eeeee3700000073eeeebe374000073eeee7ee37000073eeee77ee3700473eeee7eeee370073eeee7eeeeb3707333333333333377777777777777777700000000000000077000404000000007370000000000000733700000000004073e3704040040400737e37000000000073eee3704000040073eeee370000000473eeeee37400000073eeee7e3704040073eeeeeee370000073ee7eeeee37040073e7eeeeeee3700073beeeeeeeee37007333333333333370777777777777777701111111111141440011114444444444000111114144444400001444444444440000014444444444900550144444444650050001444444440000009014444446000009500144444400005000001444465000500000014446005000095000144600090005000001660000500000005016000000000009500100000000900005900111111111114141011111444444441001111111414441000144444444461050044444444441000004444444461500050444444441000000044444461000005504444661050005000444661050000500044441000000090004461009500900000441000500000000041050000000500901000000000950050000000090000590777777777777777707333333333333370073e7e7ee77ee3700073ee3eebeee37000073e7bbee7b370000073eeeeeee3700000073e7eeee37000000073eeeee370000000073e7ee3700000040473eeb37400004000073e7370000000040073e3700400004004073370000000000000737000400000000407740000400000000077777777777777777733333333333337073e7eeeeeeee370073beeeeeeee3704073eeeebeee37040073eeeeeee370000073eebeee3700040073eeeee37000000473beee370400000073eee3704004040073ee37000000000073e370004000040073370004004000007370000000000000770400000000404070000400000000003333300000000000777703c000000000777703300000000077770333c0000040777703333004040033330e3333000000333330c3330004003333330c3300000433333330c3000000000000000c0004003333333330000000000000004000040000400004004000000000000000000000000400000000404040000400000000000000000000000000004004040000000000000000000000000008000000000040000000404004040037773e3000000000377773e3400004003777773e3000000437777773e3000000377777773e3404003777777773e00000377777777370040037777777737000003777777773700000377777777370404037777777737000008888888888888888844444444444444484888884cccccccc8488884ccccccccc848884c8cccccccc84884c8ccff000008484c8ccf0000008844c8cc8000000088cccccc0f40000088ccccc8c8cc400088ccccc0c888c40088ccccc08888880048ccccc04888848848ccccc000000cccc8ccccc000000cccf8ccccc0000004884888888888888000044444444444c4004ccccc48888cf4400cccccc4888cf4440ccccc8c488cf48800ccccc8c48cf8880400cccc8c4cf488088c08ccc8c8f88848ccf0ccccccf888088c008cccccf88848c4000cccccf8884c00000cccccf8884000000cccccf0484000000cccccf8084000000cccccf0484888880cccccf80840000000b00000000000000ef700000000000000ff000000000000b0e0b0000000000000b000000000000000b0000000000000b0e0b0000000000000ff0000000000000ef700000000000000b00000000000000000000000000000b0e0b000000000000ef70000000000000ef7000000000000b0e0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b00b0000b00b00000770007f0000f700effe0bffebbeffb00ee000e000000e00b00b0000b00b00000000000000000000000000000000000000000000000000000000000000000000000000000000000030033333330033037047777777087733704777777708773030800030330833337487777777487733708777777748773374877777774877303480003033483333748777777748773374877777774877337487777777487730348003033348333374c777777748773374c77777774c7733b04bbeeebe4cee3030033333330433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000e000000000000000e000000000000000e000000000000000f000000000000000f000000000000000f000000000000000f000000000000000f000000000000000f000000000000000f000000000000000f000000000000000e000000000000000e000000000000000e000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeffffffffeeee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000333300000000332322e22300000032e22eee223000032efe22eeee230033effe22eeee230032eeee322222230032ee22332322e2332ee2333333eefe33eeee2333332efe302eee22333222ee3022e222333222ee3032eefe2222ee223032eefe2e22ee2300033222eee2ee30000033332e2223000000000033330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032200000000000032ee300000000000efffe20000000000efffe2000000000032ee3000000000000322000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033330000000000032222300000000002effe22300000032eefffe220000032eefffffe2300032eeffffffe2300032effffffffe230032efffffffffe20003eeffffffffe200032efffffffe23000032efeeffe2300000032e22ee220000000032332233000000000000333000000000000000000000000000333300000000002322e22300000032e22eee223000032efe22eeee230033effe22eeee230032eeee322222230032ee22332322e2332ee2333333eefe33eeee2333332efe302eee22333222ee3022e222333222ee3032eefe2222ee223032eefe2e22ee2300033222eee2ee30000033332e222300000000003333000000000000033000000000333033223000000032333222230000032223332223000033222303322300003333303003333300223000000000320322203000300322332223030003032233333300030003223033330030030322300022333333333300032233323322230003223322223233000033332223333000000003333000000000000000000000000003000033300000003330330330000000330000000000000000000003300000003300000000300000030000000033000300000000003300330000000000030030000000000000000000000033000000000000000003300000300000000033000333030333000000003000333000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ccccc00004c40088ccccc0004c880048ccccc800ccc80008cccccc0fc888000844c8cc80cc880008484c8ccc004800084884c8cccc00000848884c8cccccccc8488884ccccccccc84888884cccccccc84444444444444448cffcfffffffffff0444444444444444004000000000000005044444444444440050000000000000888880cccccf0484cc88c0cccccf808404ccc8cccccf0484004f4ccccccf808400008ccc8c8f0884000cccc8c4cf00840ccccc8c48cf0984ccccc8c488cf0484cccccc4888cf0484ccccc48888cf028444444444444f0484ffffffffffff8084444444444444c8840000000000044c8444444444444444c40000000000000008" --decompresses the tilesheet into a list of tiles function unpack_tiledata(hexstr) local bytes = hex_to_byte(hexstr) local tiles = {} local tile_id = 0 local px = {} for i = 1, #bytes do local byte = bytes[i] local hi = (byte >> 4) & 0x0F local lo = byte & 0x0F table.insert(px, hi) table.insert(px, lo) if #px == 256 then tiles[tile_id] = px tile_id = tile_id + 1 px = {} end end return tiles end --store decompressed tilesheet tiles = unpack_tiledata(tiledata) function draw_tile(tile, sx, sy, disabletrans) for y=0,15 do for x=0,15 do local c = tile[y * 16 + x + 1] if c ~= 0 or disabletrans == true then pix(sx + x, sy + y, c) end end end end function himap(x,y,o) for w = 0,10 do for h = 0,6 do draw_tile(tiles[mget(x+w,y+h)],w*16,h*16+o) end end end --GAMEPLAY SPECIFIC FUNCTIONS --makes sure that the player always has an item selected function next_item() local function get_item() if itm_select == 0 then return p_inv.bomb elseif itm_select == 1 then return p_inv.magnet elseif itm_select == 2 then return p_inv.medkit elseif itm_select == 3 then return p_inv.emps end end local itm_total = p_inv.bomb + p_inv.magnet + p_inv.emps + p_inv.medkit local items = get_item() --bomb > magnets > medkit > emp while itm_total > 0 and get_item() == 0 do itm_select = itm_select + 1 if itm_select > 3 then itm_select = 0 end end end --draws and manages the HUD function hud() local function zero_fill(num) return string.format("%03d",num) end local o = s_shake.o --weapons draw_sbox(184,0+o,56) stext("WEAPON",194,2+o,15) if wpn_select == 0 then --Pistol if p_inv.pistol > 0 then spr(268,196,10+o,00,1,0,0,4,2) stext(zero_fill(p_inv.pistol),222,26+o,15) end elseif wpn_select == 1 then --Plasma if p_inv.plasma > 0 then spr(299,192,10+o,00,1,0,0,5,2) stext(zero_fill(p_inv.plasma),222,26+o,15) end end --items draw_sbox(184,34+o,56) stext("ITEM",200,36+o,15) --bomb > magnets > medkit > emp if itm_select == 0 then if p_inv.bomb > 0 then spr(416,192,46+o,00,1,0,0,5,3) stext(zero_fill(p_inv.bomb),222,70+o,15) end elseif itm_select == 1 then if p_inv.magnet > 0 then spr(421,192,46+o,00,1,0,0,5,3) stext(zero_fill(p_inv.magnet),222,70+o,15) end elseif itm_select == 2 then if p_inv.medkit > 0 then spr(468,192,46+o,00,1,0,0,5,3) stext(zero_fill(p_inv.medkit),222,70+o,15) end elseif itm_select == 3 then if p_inv.emps > 0 then spr(426,188,46+o,00,1,0,0,6,3) stext(zero_fill(p_inv.emps),222,70+o,15) end end --keys draw_sbox(184,78+o,56) stext("KEYS",200,80+o,15) local keysx = 190 if rkey==true then spr(490,keysx,90+o,00,1,0,0,2,2) end if gkey==true then spr(492,keysx+16,90+o,00,1,0,0,2,2) end if bkey==true then spr(494,keysx+32,90+o,00,1,0,0,2,2) end --health bar (label) draw_sbox(184,110+o,56) stext("HEALTH",194,112+o,15) --information rect(0,115+o,172,4,01) tri(172,115+o,172,119+o,176,115+o,1) line(0,116+o,172,116+o,6) draw_sbox(0,112+o,40) stext("INFO",8,114+o,15) stext(messages[1],0,123+o,13,true) stext(messages[2],0,130+o,13,true) --draw the health bar and notches local y = 125+o local x = 0 for x=0,6 do pix(188+x*8,y+8,15) pix(188+x*8,y+9,15) line(188,y+10,188+48,y+10,15) end local bar = php*4 rect(188,y-2,bar,8,13) rect(188,y-2,bar,1,9) rect(188,y,bar,1,15) rect(188,y+4,bar,2,9) for a=0,1 do for b=0,1 do pix(188+a*(bar-1),y+5-b*7,erase_colour) end end if wpn_select == 0 and p_inv.pistol == 0 and p_inv.plasma > 0 then wpn_select = 1 end if wpn_select == 1 and p_inv.plasma == 0 and p_inv.pistol > 0 then wpn_select = 0 end next_item() end --draws and manages the selection wheel for gamepad users function hud_wheel() if btn(7) and mm == false and php > 0 and pmm == 0 and game_controls == "gamepad" then if hud_wr < 24 then hud_wr = hud_wr + 4 end if btnp(0) then paused = true hud_wr = 0 messages[1] = lang.paused_a sfx(01,"C-6",14,3) if game_controls == "gamepad" then messages[2] = lang.paused_b else messages[2] = lang.paused_b_key end end if btnp(1) then mm = not mm sfx(01,"C-6",14,3) messages[1] = "A Close map" messages[2] = "B Toggle Robots" end if btnp(3) then itm_select = itm_select + 1 if itm_select > 3 then itm_select = 0 end sfx(14,"C-4",20,3) end if btnp(2) then wpn_select = wpn_select + 1 if wpn_select > 1 then wpn_select = 0 end sfx(13,"C-5",20,3) end else if hud_wr > 0 and mm == false then hud_wr = hud_wr - 4 end end if hud_wr > 0 then circ(88,56,hud_wr,0) spr(412,90-hud_wr,52) spr(413,80+hud_wr,52) spr(414,86,48+hud_wr) spr(415,86,58-hud_wr) end end --draws gameover text box function hud_gameover() local x = 60 local y = 50 rect(x-6,y-2,65,9,1) rectb(x-7,y-3,67,11,15) local colours = {4,8,12,15,15,12,8} local flashcol = colours[math.floor(t / 8)%7 + 1] stext("GAME OVER",x,y,flashcol) end --draws pause text box function hud_paused() local x = 60 local y = 50 rect(x-6,y-2,65,9,1) rectb(x-7,y-3,67,11,15) local colours = {4,8,12,15,15,12,8} local flashcol = colours[math.floor(t / 8)%7 + 1] stext("PAUSED!",x+8,y,flashcol) end --checks if it's the first move since stopping function fmc() mm = false if fm==false then return 6 --if this isn't the first move, move faster end fm = false return 12 --if this is the first move we continue with it as false and be slower for this first move. end --freezes on screen robots for 5 sec function emp_bots(x,y) add_msg(lang.emp) for i,u in ipairs(units) do if is_bot(u.type) then local dx = u.x - px local dy = u.y - py if math.abs(dx) < 6 and math.abs(dy) < 4 then --See if unit is close enough to be in playfield u.frozen = 255 end end end end --checks if the player shot plasma already function exist_plasma() for i,u in ipairs(units) do if u.type == 14 then if u.d == 1 then return true end end end end --creates the shot bullet and handles the type and direction function shoot(dir) local bullet = { type = 14, x=px, y=py, a=dir, b=0, c=0, d=wpn_select, hp=0 } pd = dir if explosion_inprogress == false then if wpn_select == 0 and p_inv.pistol > 0 then --remove pistol ammo if we shot using the pistol table.insert(units,bullet) p_inv.pistol = p_inv.pistol - 1 sfx(07,"C-5",20,3) elseif not exist_plasma() and p_inv.plasma > 0 then --remove plasma ammo if we shot using the plasma table.insert(units,bullet) p_inv.plasma = p_inv.plasma - 1 sfx(08,"C-5",20,3) end end end function player_outoflift() local result = true for _,u in ipairs(units) do if u.type == 19 and px == u.x and py == u.y - 1 then result = false end end return result end --manages player controls, movement, mode and more function update_player() if php > 0 then if mc>0 then mc=mc-1 end if pmm==0 then if mc==0 and hud_wr==0 and not btn(6) then local directions = { [0] = { dx = 0, dy = -1, pd = 0 }, [1] = { dx = 0, dy = 1, pd = 1 }, [2] = { dx = -1, dy = 0, pd = 2 }, [3] = { dx = 1, dy = 0, pd = 3 } } local moved = false for btn_id, dir in pairs(directions) do if btn(btn_id) then local tx, ty = px + dir.dx, py + dir.dy if not fget(mget(tx, ty), 0) and not is_unit_at(tx, ty) then px, py = tx, ty mc = fmc() ps = ps + 1 pd = dir.pd else ps = 1 end moved = true break end end if not moved then fm = true ps = 1 end end if keyp(40) then itm_select = itm_select + 1 if itm_select > 3 then itm_select = 0 end sfx(14,"C-4",20,3) end if keyp(39) then wpn_select = wpn_select + 1 if wpn_select > 1 then wpn_select = 0 end sfx(13,"C-5",20,3) end if keyp(49) then mm = not mm if mm then sfx(01,"C-6",14,3) messages[1] = "A Close map" messages[2] = "B Toggle Robots" else messages[1],messages[2] = "","" hud_wr = 0 end end end if ps>4 then ps = 1 end if btn(6) then ps = 1 for i = 0,3 do if btnp(i) then shoot(i) end end end --Search and move modes if pmc_allow == true and p_mc_c == 0 then --ensure it's safe to change the mode if btnp(4) and pmm == 0 then pmm = 1 --search mode initialize p_search.x,p_search.y,p_search.t,p_search.p = 0,0,0,0 p_search.start = false sfx(01,"C-6",14,3) elseif (btnp(4) and pmm == 1) or (not key(64) and keyp(13) and pmm == 0) then pmm = 2 --move mode initialize p_move.x,p_move.y = px,py p_move.grabbed = false sfx(01,"C-6",14,3) elseif btnp(4) and pmm == 2 or keyp(13) and pmm == 2 then if p_move.grabbed == true then add_msg(lang.mrelease) end pmm = 0 --return to normal state end --bomb > magnets > medkit > emp if (btnp(5) and pmm == 0) or (keyp(48) and pmm == 0) then if itm_select == 0 or itm_select == 1 then --bomb/magnet if itm_select == 0 and p_inv.bomb > 0 or itm_select == 1 and p_inv.magnet > 0 then sfx(01,"C-6",14,3) pmm = 3 end elseif itm_select == 2 and p_inv.medkit > 0 then --Medkit if php < 12 then local hp_togive = 12 - php for i = 1,hp_togive do if p_inv.medkit > 0 then php = php + 1 p_inv.medkit = p_inv.medkit - 1 end end sfx(09,"C-7",20,3) add_msg(lang.healed) end elseif itm_select == 3 then --EMP if p_inv.emps > 0 then emp_bots() bg_emp = 4 sfx(10,"C-4",20,3) p_inv.emps = p_inv.emps - 1 end end end end if pmm == 1 then mode_search() end if pmm == 2 then mode_move() end if pmm == 3 then mode_place() end if pmm == 5 then mode_elevator() end if player_outoflift() and p_inelevator == true then pmm = 0 p_inelevator = false messages[1] = "" messages[2] = "" end end if php == 0 then time_to_gameover = time_to_gameover + 1 end if pmm == 4 and ptele_prog < 32 then ptele_prog = ptele_prog + 1 end if pmm == 4 and ptele_prog == 32 then local over_transporter = false for _,u in ipairs(units) do if u.type == 7 and u.c ~= 0 then if px == u.x and py == u.y then pmm = 0 ptele_prog = 0 ps = 1 px,py = u.c, u.d end end end end if pmm == 6 and ptele_prog < 32 then ptele_prog = ptele_prog + 1 end if pmm == 6 and ptele_prog == 32 then time_to_gameover = time_to_gameover + 1 end end --draw player and related icons to playfield function draw_player() local sol = {0,-2,0,2} local indexes = {258,290,322,354} local index = indexes[pd+1] + sol[ps] if php > 0 and pmm ~= 6 and pmm ~= 4 then spr(index,80,48,13,1,0,0,2,2) end if pmm == 1 then local s_ox = 0 local s_oy = 0 local offsets = { [1] = {8, 0}, [5] = {8, 0}, [2] = {0, 8}, [6] = {0, 8}, [3] = {-8, 0}, [7] = {-8, 0}, [4] = {0, -8}, [8] = {0, -8} } local offset = offsets[p_search.p] or {0, 0} local s_ox, s_oy = offset[1], offset[2] spr(332,80+p_search.x*16+s_ox,48+p_search.y*16+s_oy,13,1,0,0,2,2) end if pmm == 2 then if p_move.grabbed == false then spr(334,80,48,13,1,0,0,2,2) else local md_sx = 80 - (px - p_move.x)*16 local md_sy = 48 - (py - p_move.y)*16 spr(330,md_sx,md_sy,13,1,0,0,2,2) end end if pmm == 3 then spr(366,80,48,13,1,0,0,2,2) end if pmm == 6 or pmm == 4 then if ptele_prog < 32 then spr(262 + math.floor(ptele_prog/8)*32,80,48,13,1,0,0,2,2) end end end --player mode for searching objects function mode_search() local search_msg = "Searching." if p_search.x == 0 and p_search.y == 0 and p_search.p == 0 then --if a search position isn't selected yet then continue local offsets = { [0] = {0,-1}, [1] = {0,1}, [2] = {-1,0}, [3] = {1,0} } local function show_open(x,y) if mget(x,y) == 41 then mset(x,y,42) end if mget(x,y) == 199 then mset(x,y,198) end if mget(x,y) == 45 then mset(x,y,46) end end local function tile_searchable() return fget(mget(px+p_search.x,py+p_search.y),1) end for btn_id,dir in pairs(offsets) do --what direction based on input? if btnp(btn_id) then p_search.x,p_search.y = dir[1],dir[2] add_msg(search_msg) pd = btn_id if not tile_searchable() then --check if the tile is searchable messages[2] = lang.sfail pmc_allow = true pmm = 0 p_search.start = false sfx(03,"C#5",30,3) else p_search.start = true show_open(px + p_search.x, py + p_search.y) end end end end mc = 12 if p_search.start == true then pmc_allow = false p_search.t = p_search.t + 1 if p_search.t % 16 == 0 and p_search.t ~= 0 then p_search.p = p_search.p + 1 messages[2] = "Searching"..string.rep(".",p_search.p) if p_search.p == 9 then p_search.p = 0 p_search.start = false pmc_allow = true pmm = 0 search_at(px+p_search.x,py+p_search.y) --find the searched item end end end end --player mode for pushing and pulling objects function mode_move() local function is_moveable() if fget(mget(p_move.x,p_move.y),2) then p_move.grabbed = true add_msg(lang.mgrab) sfx(01,"C-6",14,3) else pmc_allow = true pmm = 0 add_msg(lang.mcant) sfx(03,"C#5",30,3) end end local function p_goto_tile() px = p_move.x py = p_move.y end local function is_free_tile(tileid) local result = false for _,t in ipairs({9,99,148,164,165,189}) do if tileid == t then result = true end end return result end local function is_elevator_at(x,y) for _,u in ipairs(units) do if u.type == 19 then if u.x == x and u.y == y then return true end end end end local function can_move(x,y) if is_free_tile(mget(x,y)) and not is_unit_at(x,y) and not is_elevator_at(x,y) then allowblock = true return true elseif allowblock == true then add_msg(lang.mblocked) allowblock = false sfx(03,"C#5",30,3) end end local function push(x,y) move_tile(p_move.x,p_move.y,p_move.x+x,p_move.y+y) p_goto_tile() sfx(04,"C-1",14,3) p_move.x,p_move.y = p_move.x+x,p_move.y+y mc = 12 ps = ps + 1 if ps>4 then ps = 1 end end local function push_back(x,y) move_tile(p_move.x,p_move.y,p_move.x+x,p_move.y+y) sfx(04,"C-1",14,3) px,py = px + x,py + y p_move.x,p_move.y = p_move.x+x,p_move.y+y mc = 12 ps = ps - 1 if ps<1 then ps = 4 end allowblock = true end local function push_backaround(x,y) move_tile(p_move.x,p_move.y,p_move.x-y,p_move.y-x) sfx(04,"C-1",14,3) px = px + x py = py + y p_move.x = p_move.x-y p_move.y = p_move.y-x mc = 12 ps = ps - 1 if ps<1 then ps = 4 end end if p_move.grabbed == false then --make sure player has grabbed somthing first local directions = { [0] = {0,-1}, [1] = {0,1}, [2] = {-1,0}, [3] = {1,0} } for btnid,dir in pairs(directions) do if btnp(btnid) then p_move.x = p_move.x + dir[1] p_move.y = p_move.y + dir[2] is_moveable() pd = btnid mc = 12 end end else --player has grabbed a tile so can start moving it --direction mapping: {btn, dx, dy, pd_check, pd_set} local directions = { {0, 0, -1, 1, 0}, -- up {1, 0, 1, 0, 1}, -- down {2, -1, 0, 3, 2}, -- left {3, 1, 0, 2, 3} -- right } for _, dir in ipairs(directions) do --start looking at what we want to do local btn_id, dx, dy, pd_check, pd_set = table.unpack(dir) --unpack the information about what we want to do if btn(btn_id) and mc == 0 then local nx, ny = p_move.x + dx, p_move.y + dy if can_move(nx, ny) then --can we go this way? if pd ~= pd_check then --are we going straight? push(dx, dy) pd = pd_set else --we aren't going straight so pull backward if not fget(mget(px + dx, py + dy), 0) and not is_unit_at(px + dx, py + dy) then push_back(dx, dy) elseif p_move.allowblock then --we can't move it there, so tell the player once add_msg(lang.mblocked) sfx(03,"C#5",30,3) end end end break --only process one direction per frame end end end end --allows the player to place bomb or magnet function mode_place() local place_x = 0 local place_y = 0 local stop = false local offsets = { [0] = {0,-1}, [1] = {0,1}, [2] = {-1,0}, [3] = {1,0} } for btn_id,offset in pairs(offsets) do if btnp(btn_id) then place_x = offset[1] place_y = offset[2] end end if place_x ~= 0 or place_y ~= 0 then local new = { type = 71, x = px + place_x, y = py + place_y, d = 0 } if itm_select == 1 then new.type = 72 for _,u in ipairs(units) do if u.type == 72 then add_msg(lang.item_one) stop = true sfx(03,"C#5",30,3) end end end if fget(mget(px+place_x,py+place_y),0) then stop = true add_msg(lang.cantplace) sfx(03,"C#5",30,3) end if stop == false then table.insert(units,new) sfx(13,"C-5",20,3) if itm_select == 0 then p_inv.bomb = p_inv.bomb - 1 end if itm_select == 1 then p_inv.magnet = p_inv.magnet - 1 end end pmm = 0 mc = 16 end end function count_elevators() local total = 0 for _,u in ipairs(units) do if u.type == 19 then total = total + 1 end end return total end function mode_elevator() local lifts = count_elevators() messages[2] = " " for i = 1,lifts do if i ~= pll+1 then messages[2] = messages[2].." "..tostring(i).." " else messages[2] = messages[2].."["..tostring(i).."]" end end local changed = false if btnp(2) and pll > 0 then pll = pll - 1 changed = true sfx(01,"C-6",14,3) end if btnp(3) and pll < lifts-1 then pll = pll + 1 changed = true sfx(01,"C-6",14,3) end if changed == true then for _,u in ipairs(units) do if u.type == 19 and u.c == pll + 1 then px = u.x py = u.y - 1 end end end if btnp(1) then pmm = 0 messages[1] = "" messages[2] = "" end end function is_unit_at(x,y) for i,u in ipairs(units) do local iscol = false --check if it's a collidable unit if is_bot(u.type) then iscol = true end if iscol == true then if u.x == x and u.y == y then return true end end end end --looks for whatever may be hidden there! function search_at(x,y) local got = false for i,u in ipairs(units) do local found = false if x >= u.x and x <= u.x+u.c then --are we searching in a hidden object's zone? if y >= u.y and y <= u.y+u.d then if is_secret(u.type) then --is this even a secret? found = true --we got something! end end end --bomb > magnets > medkit > emp if found == true then local amount = u.a if difficulty == 0 then amount = amount * 2 end --if we play on easy, get twice as much items if u.type == 128 then add_msg("You found a key card!") if u.a == 0 then rkey = true got = true elseif u.a == 1 then gkey = true got = true elseif u.a == 2 then bkey = true got = true end table.remove(units,i) elseif u.type == 129 then add_msg("You found some timebombs!") got = true p_inv.bomb = p_inv.bomb + amount table.remove(units,i) itm_select = 0 elseif u.type == 130 then add_msg("You found an EMP Device!") got = true p_inv.emps = p_inv.emps + amount table.remove(units,i) itm_select = 3 elseif u.type == 131 then add_msg("You found a Pistol!") got = true p_inv.pistol = p_inv.pistol + amount table.remove(units,i) wpn_select = 0 elseif u.type == 132 then add_msg("You found a Plasma Gun!") got = true p_inv.plasma = p_inv.plasma + amount table.remove(units,i) wpn_select = 1 elseif u.type == 133 then add_msg("You found a medkit!") got = true p_inv.medkit = p_inv.medkit + amount table.remove(units,i) itm_select = 2 elseif u.type == 134 then add_msg("You found some magnets!") got = true p_inv.magnet = p_inv.magnet + amount table.remove(units,i) itm_select = 1 end end end if got == false then add_msg(lang.sfail) sfx(03,"C#5",30,3) else sfx(02,"C-6",30,3) end end --moves a tile from one tile to another and moves any hidden objects inside them function move_tile(x,y,tox,toy) mset(tox,toy,mget(x,y)) if mget(x,y) == 199 or mget(x,y) == 198 then mset(x,y,189) else mset(x,y,9) end for i,u in ipairs(units) do if u.x == x and u.y == y and is_secret(u.type) then u.x = tox u.y = toy end end end --check can a unit go somewhere function unit_can_go(x,y,wflag) local function is_water(x, y) local ignored = {204, 140, 141} for i, t in ipairs(ignored) do if mget(x, y) == t then return true end end return false end local able = true if fget(mget(x,y),0) then --check if the tile at coords is marked as collidable if is_water(x,y) and wflag == true then able = true else able = false end end if x == px and y == py and php > 0 then --check if the player is at the coords able = false end if is_unit_at(x,y) then --check if another unit is at the coords able = false end return able end --check if a tile should be ignored by a bullet as logically it should fly over function is_shootover(tile) local ignored = {140,141,204,135,43,47,51,114,118,32,35,36,41,42,45,46,39,55,58,59,198,199,216,217,218,220,221,222,224,225,226,95,87} -- shitty quick fix for i,t in ipairs(ignored) do if t == tile or fget(tile,6) then return true end end end --attacks the player if they are at the attack coords function attack_p(x,y, dmg) if px == x and py == y and php > 0 then php = php - dmg bg_hurt = 6 if php < 0 then php = 0 end fx_hit(x,y) sfx(15,"C-6",20,3) end end --creates the shot bullet and handles the type and direction function robot_shoot(ux,uy,dir) local bullet = { type = 14, x=ux, y=uy, a=dir, b=0, c=0, d=3, hp=0 } table.insert(units,bullet) sfx(07,"C-4",20,3) end function bot_in_tc(tc) local result = false for i,u in ipairs(units) do if is_bot(u.type) then if u.x == tc.x and u.y == tc.y then if u.hp > 0 then result = true end end end end return result end explosion_inprogress = false patdoor = false l_patdoor = false function update_sound() if patdoor ~= l_patdoor then local note = "C-6" if patdoor == false then note = "C-5" end sfx(05,note,30,3) l_patdoor = patdoor end end --updates AI Units function update_units() local HIT_COOLDOWN = 3 local function get_unit_at(x,y) for i,u in ipairs(units) do if u.x == x and u.y == y then return i end end end local function robot_randmove(u) local dir = math.random(0, 3) local offsets = { [0] = {0,-1}, [1] = {0,1}, [2] = {-1,0}, [3] = {1,0} } for d,offset in pairs(offsets) do if dir == d and unit_can_go(u.x+offset[1], u.y +offset[2],true) then u.x = u.x + offset[1] u.y = u.y + offset[2] end end end for i,u in ipairs(units) do if is_bot(u.type) then if u.dazzled > 0 then u.dazzled = u.dazzled - 1 end if u.perma_dazzled == true then u.dazzled = 765 end if u.dazzled > 0 then local ignored = {204, 140, 141} for i, t in ipairs(ignored) do if mget(u.x, u.y) == t and u.hp > 0 then sfx(06,"C-4",45,3) u.hp = 0 end end end if u.e == nil then u.e = 0 end end if u.type == 12 then if explosion_inprogress == false then explosion(u.x,u.y) u.a = true explosion_inprogress = true end if u.a == true then u.b = u.b + 1 end if u.b > 30 then table.remove(units,i) explosion_inprogress = false end end --Robots local hoverbot_interval = 10 if u.type == 2 then --hoverbot (Horizontal) if u.hp > 0 then u.b = u.b + 1 if u.b % hoverbot_interval == 0 and u.frozen == 0 then u.c = u.c + 1 if u.c > 1 then u.c = 0 end if u.dazzled == 0 then if u.a == 0 and unit_can_go(u.x+1,u.y,true) then u.x = u.x + 1 elseif u.a == 1 and unit_can_go(u.x-1,u.y,true) then u.x = u.x - 1 else if u.a == 0 then u.a = 1 else u.a = 0 end end else robot_randmove(u) end end else u.d = u.d + 1 if u.d > 120 then table.remove(units,i) end end if u.frozen > 0 then u.frozen = u.frozen - 1 end end if u.type == 3 then --hoverbot (Vertical) if u.hp > 0 then u.b = u.b + 1 if u.b % hoverbot_interval == 0 and u.frozen == 0 then u.c = u.c + 1 if u.c > 1 then u.c = 0 end if u.dazzled == 0 then if u.a == 0 and unit_can_go(u.x, u.y-1,true) then u.y = u.y -1 elseif u.a == 1 and unit_can_go(u.x, u.y+1,true) then u.y = u.y +1 else if u.a == 0 then u.a = 1 else u.a = 0 end end else robot_randmove(u) end end else u.d = u.d + 1 if u.d > 120 then table.remove(units,i) end end if u.frozen > 0 then u.frozen = u.frozen - 1 end end --logic to drown frozen Hoverbots if u.type >= 2 and u.type <= 4 then if u.frozen > 0 and mget(u.x,u.y) == current_water_tile then u.type = 5 u.d = 0 end end if u.type == 4 then --angry hoverbot local hit_player = false if u.hp > 0 then u.b = u.b + 1 if u.b % hoverbot_interval == 0 and u.frozen == 0 then if u.e > 0 then u.e = u.e - 1 end u.c = u.c + 1 if u.c > 1 then u.c = 0 end if u.dazzled == 0 then if px < u.x then --LEFT u.a = 2 if hit_player == false and u.e == 0 then attack_p(u.x-1,u.y,1) hit_player = true u.e = HIT_COOLDOWN end if unit_can_go(u.x-1,u.y) then u.x = u.x - 1 end end if px > u.x then --RIGHT u.a = 3 if hit_player == false and u.e == 0 then attack_p(u.x+1,u.y,1) hit_player = true u.e = HIT_COOLDOWN end if unit_can_go(u.x+1,u.y) then u.x = u.x + 1 end end if py < u.y then --UP u.a = 0 if hit_player == false and u.e == 0 then attack_p(u.x,u.y-1,1) hit_player = true u.e = HIT_COOLDOWN end if unit_can_go(u.x,u.y-1) then u.y = u.y - 1 end end if py > u.y then --DOWN u.a = 1 if hit_player == false and u.e == 0 then attack_p(u.x,u.y+1,1) hit_player = true u.e = HIT_COOLDOWN end if unit_can_go(u.x,u.y+1) then u.y = u.y + 1 end end else robot_randmove(u) end end else u.d = u.d + 1 if u.d > 120 then table.remove(units,i) end end if u.frozen > 0 then u.frozen = u.frozen - 1 end end if u.type == 5 then u.d = u.d+1 if u.d > 120 then table.remove(units,i) end end -- Transporter if u.type == 7 then if u.c == 0 then if count_robots(false) == 0 then mset(u.x,u.y,30+(t/8)%2) end if px == u.x and py == u.y then if count_robots(false) == 0 then if pmm ~= 6 and mc == 0 then pmm = 6 sfx(12,"C-7",45,3) messages[1] = "" messages[2] = "" end else if messages[1] ~= lang.noproceed_a then messages[1] = lang.noproceed_a messages[2] = lang.noproceed_b sfx(03,"C#5",30,3) end end end else mset(u.x,u.y,30+(t/8)%2) if px == u.x and py == u.y then if pmm ~=4 and mc == 0 then pmm = 4 sfx(12,"C-7",45,3) end end end end --evilbot if u.type == 9 then u.b = u.b + 1 if u.hp > 0 then if u.b % 10 == 0 and u.frozen == 0 then local hit_player = false if u.dazzled == 0 then if u.e > 0 then u.e = u.e - 1 end if px < u.x then --LEFT u.a = 2 if hit_player == false and u.e == 0 then attack_p(u.x-1,u.y,6) hit_player = true u.e = HIT_COOLDOWN end if unit_can_go(u.x-1,u.y) then u.x = u.x - 1 end end if px > u.x then --RIGHT u.a = 3 if hit_player == false and u.e == 0 then attack_p(u.x+1,u.y,6) hit_player = true u.e = HIT_COOLDOWN end if unit_can_go(u.x+1,u.y) then u.x = u.x + 1 end end if py < u.y then --UP u.a = 0 if hit_player == false and u.e == 0 then attack_p(u.x,u.y-1,6) hit_player = true u.e = HIT_COOLDOWN end if unit_can_go(u.x,u.y-1) then u.y = u.y - 1 end end if py > u.y then --DOWN u.a = 1 if hit_player == false and u.e == 0 then attack_p(u.x,u.y+1,6) hit_player = true u.e = HIT_COOLDOWN end if unit_can_go(u.x,u.y+1) then u.y = u.y + 1 end end if u.frozen > 0 then u.frozen = u.frozen - 1 end else robot_randmove(u) end end else u.d = u.d + 1 if u.d > 120 then table.remove(units,i) end end if u.frozen > 0 then u.frozen = u.frozen - 1 end end --explosion effcet if u.type == 11 then u.b = u.b + 1 if u.b % 4 == 0 then u.a = u.a + 1 end if u.a > 5 then table.remove(units,i) end end local function rollerbot_update(x,y,unit) local dx = math.abs(px-x) local dy = math.abs(py-y) if dx < 6 and dy < 4 and units[i].dazzled == 0 then if py < y and px == x then robot_shoot(x,y,0) end if py > y and px == x then robot_shoot(x,y,1) end if px < x and py == y then robot_shoot(x,y,2) end if px > x and py == y then robot_shoot(x,y,3) end units[i].has_shot = true end end --rollerbot (VERTICAL) local roller_interval = 10 if u.type == 17 then if u.hp > 0 then u.b = u.b + 1 if u.b % roller_interval == 0 then u.has_shot = false end if u.b % roller_interval == 0 and u.frozen == 0 then u.c = u.c + 1 if u.c > 1 then u.c = 0 end if u.dazzled == 0 then if u.a == 0 and unit_can_go(u.x, u.y-1) then u.y = u.y -1 elseif u.a == 1 and unit_can_go(u.x, u.y+1) then u.y = u.y +1 else if u.a == 0 then u.a = 1 else u.a = 0 end end else robot_randmove(u) end end if u.has_shot == false and u.frozen == 0 then rollerbot_update(u.x, u.y, i) end else u.d = u.d + 1 if u.d > 120 then table.remove(units,i) end end if u.frozen > 0 then u.frozen = u.frozen - 1 end end --rollerbot (Horizontal) if u.type == 18 then if u.hp > 0 then u.b = u.b + 1 if u.b % roller_interval == 0 then u.has_shot = false end if u.b % roller_interval == 0 and u.frozen == 0 then u.c = u.c + 1 if u.c > 1 then u.c = 0 end if u.dazzled == 0 then if u.a == 0 and unit_can_go(u.x+1,u.y) then u.x = u.x + 1 elseif u.a == 1 and unit_can_go(u.x-1,u.y) then u.x = u.x - 1 else if u.a == 0 then u.a = 1 else u.a = 0 end end else robot_randmove(u) end end if u.has_shot == false and u.frozen == 0 then rollerbot_update(u.x, u.y, i) end else u.d = u.d + 1 if u.d > 120 then table.remove(units,i) end end if u.frozen > 0 then u.frozen = u.frozen - 1 end end --elevator if u.type == 19 then local dx = math.abs(u.x-px) local dy = math.abs(u.y-py) if dx < 2 and dy < 2 and pmm ~= 5 then if u.d < 3 then open_door(i,u.a,true) patdoor = true end else if u.d > 0 and not is_unit_at(u.x,u.y) then if not fget(mget(u.x,u.y),2) then close_door(i,u.a,true) patdoor = false end end end if px == u.x and py == u.y-1 and p_inelevator == false and mc == 0 then pll = u.c - 1 pmm = 5 messages[1] = "[ ELEVATOR PANEL ] DOWN OPENS DOOR" p_inelevator = true end end --automatic doors if u.type == 10 then local dx = math.abs(u.x-px) local dy = math.abs(u.y-py) if dx < 2 and dy < 2 then if u.d < 3 then if u.c == 0 then open_door(i,u.a) patdoor = true elseif u.c == 1 and rkey == true then open_door(i,u.a) patdoor = true elseif u.c == 2 and gkey == true then open_door(i,u.a) patdoor = true elseif u.c == 3 and bkey == true then open_door(i,u.a) patdoor = true end end else if u.d > 0 and not is_unit_at(u.x,u.y) then if not fget(mget(u.x,u.y),2) then close_door(i,u.a) patdoor = false end end end end --player bullet if u.type == 14 then local dx = math.abs(u.x-px) local dy = math.abs(u.y-py) if u.d ~= 3 then if dx > 4 or dy > 2 then table.remove(units,i) end elseif u.x == px and u.y == py then php = php - 1 bg_hurt = 6 if php < 0 then php = 0 end fx_hit(u.x,u.y) table.remove(units,i) end u.b = u.b + 1 if u.b % 2 == 0 then if u.a == 0 then u.y = u.y-1 elseif u.a ==1 then u.y = u.y+1 elseif u.a ==2 then u.x = u.x-1 elseif u.a ==3 then u.x = u.x+1 end end if fget(mget(u.x,u.y),0) and not is_shootover(mget(u.x,u.y)) then --If we hit a solid tile that the bullet does not pass over if mget(u.x, u.y) == 131 then --Explode if we hit a canister queue_explosion(u.x,u.y) else fx_hit(u.x,u.y) --Play hit FX if not, as it is just solid. end if u.d == 1 then --Explode at last position if it was a plasma shot. queue_explosion(u.x,u.y) end table.remove(units,i) end if is_unit_at(u.x,u.y) and u.d ~= 3 then --Are we overlapping a unit? local hit_bot_id = get_unit_at(u.x,u.y) if is_bot(units[hit_bot_id].type) then if u.d == 0 then units[hit_bot_id].hp = units[hit_bot_id].hp - 1 fx_hit(u.x,u.y) if units[hit_bot_id].type == 2 or units[hit_bot_id].type == 3 then --Anger hit Hoverbots local newbot = units[hit_bot_id] newbot.type = 4 end elseif u.d == 1 then queue_explosion(u.x,u.y) end table.remove(units,i) end end end if u.type == 22 then --raft if u.d == 0 then local water = current_water_tile mset(u.x,u.y,water) u.d = 2 if u.a == 1 then if u.x == px and u.y == py then px = px + 1 end u.x = u.x + 1 if u.x == u.c then u.a = 0 u.d = 16 end else if u.x == px and u.y == py then px = px - 1 end u.x = u.x - 1 if u.x == u.b then u.a = 1 u.d = 16 end end mset(u.x,u.y,242) else if t % 4 == 0 then u.d = u.d - 1 end end end if u.type == 71 then --placed Bomb u.d = u.d + 1 if u.d > 100 and explosion_inprogress == false then queue_explosion(u.x,u.y) table.remove(units,i) end end if u.type == 72 then if px == u.x and py == u.y then p_inv.magnet = p_inv.magnet + 1 table.remove(units,i) end if is_unit_at(u.x,u.y) then --Are we overlapping a unit? local hit_bot_id = get_unit_at(u.x,u.y) if is_bot(units[hit_bot_id].type) then sfx(11,"C-5",30,3) if units[hit_bot_id].dazzled == 0 then units[hit_bot_id].dazzled = 765 table.remove(units,i) else units[hit_bot_id].perma_dazzled = true add_msg("Robot permanently disorientated!") table.remove(units,i) end end end end local function animate_tc(x,y,index) tile_list = { {144,145,148,148}, {146,147,150,151}, {152,153,156,157}, {146,147,150,151}, {144,145,148,148} } local tiles = tile_list[index] mset(x,y-1,tiles[1]) mset(x+1,y-1,tiles[2]) mset(x,y,tiles[3]) mset(x+1,y,tiles[4]) end -- trash compactor if u.type == 16 then if u.a == true then if t % 16 == 0 then u.b = u.b + 1 if u.b == 2 then if u.x == px and u.y == py then php = 0 bg_hurt = 6 sfx(15,"C-6",20,3) end for i,nontc in ipairs(units) do if nontc.x == u.x and nontc.y == u.y then if is_bot(nontc.type) and nontc.hp > 0 then nontc.hp = 0 add_msg(lang.crushed) fx_hit(u.x,u.y) sfx(06,"C-4",45,3) elseif is_secret(nontc.type) then table.remove(units,i) end end end end if u.b == 4 then u.b = 0 u.a = false end end animate_tc(u.x,u.y,u.b+1) else if u.x == px and u.y == py and php > 0 then u.a = true sfx(05,"C-6",30,3) end local tcheck = false for _,t in ipairs({99,148,164,165}) do if t == mget(u.x,u.y) then tcheck = true end end if not tcheck then u.a = true pmm = 0 sfx(05,"C-6",30,3) end if bot_in_tc(u) then u.a = true sfx(05,"C-6",30,3) end end end end end function draw_cinemas() for i,u in ipairs(units) do if u.type == 512 then local dx = u.x - px local dy = u.y - py clip(0,0,176,112) if math.abs(dx) < 7 and math.abs(dy) < 5 then --see if unit is close enough to be in playfield local CINEMA_MESSAGE = " coming soon: space balls 2 - the search for more money, attack of the paperclips: clippy's revenge, it came from planet earth, rocky 5000, all my circuits the movie, conan the librarian, and more! comin" --calculate screen location local sx = 80 + dx * 16 local sy = 48 + dy * 16 print(string.sub(CINEMA_MESSAGE,u.a,u.a+8),sx-10,sy+6,15,true,1,true) end if t % 8 == 0 then u.a = u.a + 1 end if u.a > 230 then u.a = 0 end clip() end end end function anim_conveyor() for i,u in ipairs(units) do if u.type == 514 and t % 16 == 0 then u.a = (u.a + 1)%4 local tiles = {99,148,164,165} mset(u.x,u.y,tiles[u.a+1]) end end end function draw_units_under() for i,u in ipairs(units) do local dx = u.x - px local dy = u.y - py if math.abs(dx) < 6 and math.abs(dy) < 4 then --see if unit is close enough to be in playfield --calculate screen location local sx = 80 + dx * 16 local sy = 48 + dy * 16 if u.type == 71 then draw_tile(tiles[130],sx,sy+s_shake.o) end if u.type == 72 then draw_tile(tiles[134],sx,sy+s_shake.o) end end end end --draws AI Units to the 11x7 playfield function draw_units() for i,u in ipairs(units) do local dx = u.x - px local dy = u.y - py if math.abs(dx) < 6 and math.abs(dy) < 4 then --see if unit is close enough to be in playfield --calculate screen location local sx = 80 + dx * 16 local sy = 48 + dy * 16 if u.type == 2 or u.type == 3 or u.type == 4 then --hoverbot if u.hp > 0 then spr(296+u.c*32,sx,sy,2,1,0,0,2,2) else spr(362,sx,sy,2,1,0,0,2,2) end elseif u.type == 17 or u.type == 18 then if u.hp > 0 then spr(264+u.c*2,sx,sy,2,1,0,0,2,2) else spr(360,sx,sy,2,1,0,0,2,2) end end if u.type == 5 then spr(480 + (math.floor(u.d/4) % 2)*2,sx,sy,9,1,0,0,2,2) end if u.type == 9 then if u.hp > 0 then spr(386+u.a*2,sx,sy,10,1,0,0,2,2) else spr(364,sx,sy,10,1,0,0,2,2) end end if u.type == 14 then --player bullet if u.d ~= 1 then if u.a < 2 then spr(478,sx+4,sy,0,1,0,1,2,1) elseif u.a >= 2 then spr(478,sx,sy+4,0,1,0,0,2,1) end else if u.a < 2 then spr(476,sx+4,sy,0,1,0,1,2,1) elseif u.a >= 2 then spr(476,sx,sy+4,0,1,0,0,2,1) end end end if dev_mode == true then --if we are a dev, display the unit's data at it's locarion. local hp_display = false if hp_display == false then stext("T:"..u.type,sx,sy,15,true) stext("A:"..tostring(u.a),sx,sy+6,15,true) stext("B:"..tostring(u.b),sx,sy+12,15,true) stext("C:"..tostring(u.c),sx,sy+18,15,true) stext("D:"..tostring(u.d),sx,sy+24,15,true) else stext("HP:"..u.hp,sx,sy,15,true) end end else if u.type == 14 then table.remove(units,i) end end end end --same idea as draw_units but goes above the player function draw_units_over() for i,u in ipairs(units) do local dx = u.x - px local dy = u.y - py if math.abs(dx) < 6 and math.abs(dy) < 4 then --see if unit is close enough to be in playfield --calculate screen location local sx = 80 + dx * 16 local sy = 48 + dy * 16 if u.type == 11 then draw_tile(tiles[248+u.a],sx,sy+s_shake.o) end if u.type == 16 then if u.b == 2 then draw_tile(tiles[156],sx,sy+s_shake.o,true) end end end end end function tileswap_door(door,iselevator) local x = door.x local y = door.y if door.a == 1 and iselevator ~= true then --vertical door if door.d == 0 then mset(x,y-1,68) mset(x,y,72) mset(x,y+1,76) elseif door.d == 1 then mset(x,y-1,69) mset(x,y,73) mset(x,y+1,77) elseif door.d == 2 then mset(x,y-1,70) mset(x,y,74) mset(x,y+1,78) elseif door.d == 3 then mset(x,y-1,27) mset(x,y,9) mset(x,y+1,15) end else --horizontal door if door.d == 0 then mset(x-1,y,80) mset(x,y,81) mset(x+1,y,82) elseif door.d == 1 then mset(x-1,y,84) mset(x,y,85) mset(x+1,y,86) elseif door.d == 2 then mset(x-1,y,88) if iselevator then mset(x-1,y,181) end mset(x,y,89) mset(x+1,y,103) elseif door.d == 3 then mset(x-1,y,17) if iselevator then mset(x-1,y,182) end mset(x,y,9) mset(x+1,y,91) end end end function open_door(i,o,iselevator) local door = units[i] if t%12 == 0 then door.d = door.d+1 end tileswap_door(door,iselevator) end function close_door(i,o,iselevator) local door = units[i] if t%12 == 0 then door.d = door.d-1 end tileswap_door(door,iselevator) end function fx_hit(inx,iny) local fx = { type = 11, x = inx, y = iny, a = 0, b = 0, c = 0, d = 0, hp = 0 } table.insert(units,fx) end anim_ind_w = 1 --animation index for water current_water_tile = 0 --current tile we are using for water, this is mainly for the raft to know what to replace tiles with when moving --replaces old water tiles with new to create a water animation. probably really inefficent but i'm not too bothered. function anim_water() local tiles = {141,204,140,141} if t % 16 == 0 then anim_ind_w = anim_ind_w + 1 if anim_ind_w > 3 then anim_ind_w = 1 end for x = 0,127 do for y = 0,63 do if mget(x,y) == tiles[anim_ind_w] then mset(x,y, tiles[anim_ind_w+1] ) end end end end current_water_tile = tiles[anim_ind_w+1] end function anim_aircon() local tiles = {{196,197,200,201},{238,239,254,255}} for i,u in ipairs(units) do if u.type == 513 then if t % 8 == 0 then u.a = (u.a+1)%2 local set = tiles[u.a+1] mset(u.x,u.y,set[1]) mset(u.x+1,u.y,set[2]) mset(u.x,u.y+1,set[3]) mset(u.x+1,u.y+1,set[4]) end end end end function add_msg(t) messages[1] = messages[2] messages[2] = t end function queue_explosion(inx,iny) local u = { type = 12, x = inx, y = iny, a = 0, b = 0, c = 0, d = 0 } local already_queued = false for i,u in ipairs(units) do if u.type == 12 and u.x == inx and u.y == iny then already_queued = true end end if already_queued == false then table.insert(units,u) end end --creates an explosion function explosion(x,y) local function can_explode(x,y) allowed = {131,135,32,35,36,39,58,140,141,204,216,217,218,220,221,222,224,225,226} for _,t in ipairs(allowed) do if mget(x,y) == t or fget(mget(x,y),7) then return true end end if not fget(mget(x,y),0) then return true end end local function destroy(x,y) local tile = mget(x,y) local indoor = {24,29,32,35,36,39,41,42,45,46,58} local outdoor = {208,209,210,215,219,223} for i,u in ipairs(units) do if u.x == x and u.y == y then if is_bot(u.type) then u.hp = u.hp - 10 if u.hp < 0 then u.hp = 0 end end if tile == 41 or tile == 199 then if is_secret(u.type) then table.remove(units,i) end end end end if fget(tile,7) then for _,t in ipairs(indoor) do if tile == t then mset(x,y,9) end end for _,t in ipairs(outdoor) do if tile == t then mset(x,y,206) end end end if tile == 205 then mset(x,y,current_water_tile) end if px == x and py == y then php = php - 10 bg_hurt = 6 if php < 0 then php = 0 end end if mget(x,y) == 131 then queue_explosion(x,y) end end s_shake.p = 16 fx_hit(x,y) sfx(-1,-1,-1,3) sfx(06,"C-3",45,3) if can_explode(x,y) then --pattern[dx+(dy+d)*5] fx_hit(x,y) destroy(x,y) end if mget(x,y) == 131 then mset(x,y,135) end --waiting to refactor this part when bugs are fixed for i = 0,7 do local stopped = false for d = 1,2 do if i == 0 then if can_explode(x,y-d) and stopped == false then --pattern[dx+(dy+d)*5] fx_hit(x,y-d) destroy(x,y-d) else stopped = true end end if i == 1 then if can_explode(x+d,y-d) and stopped == false then --pattern[dx+d+(dy+d)*5] fx_hit(x+d,y-d) destroy(x+d,y-d) else stopped = true end end if i == 2 then if can_explode(x+d,y) and stopped == false then --pattern[dx+d+dy*5] fx_hit(x+d,y) destroy(x+d,y) else stopped = true end end if i == 3 then if can_explode(x+d,y+d) and stopped == false then --pattern[dx+d+(dy+d)*5] fx_hit(x+d,y+d) destroy(x+d,y+d) else stopped = true end end if i == 4 then if can_explode(x,y+d) and stopped == false then --pattern[dx+d+(dy+d)*5] fx_hit(x,y+d) destroy(x,y+d) else stopped = true end end if i == 5 then if can_explode(x-d,y+d) and stopped == false then --pattern[dx+d+(dy+d)*5] fx_hit(x-d,y+d) destroy(x-d,y+d) else stopped = true end end if i == 6 then if can_explode(x-d,y) and stopped == false then --pattern[dx+d+(dy+d)*5] fx_hit(x-d,y) destroy(x-d,y) else stopped = true end end if i == 7 then if can_explode(x-d,y-d) and stopped == false then --pattern[dx+d+(dy+d)*5] fx_hit(x-d,y-d) destroy(x-d,y-d) else stopped = true end end end end end function is_bot(type) for _,t in ipairs(botids) do if type == t then return true end end end function is_secret(type) if type >= 128 and type <= 134 then return true end end function shakeoffset() if t % 2 == 0 then s_shake.i = s_shake.i + 1 if s_shake.i > 4 then s_shake.i = 1 end if s_shake.p > 0 then s_shake.p = s_shake.p - 1 end end local multis = {0,-1,0,1} local offset = s_shake.p * multis[s_shake.i] s_shake.o = offset end function cheater() rkey = true gkey = true bkey = true php = 12 p_inv.pistol = 255 p_inv.plasma = 255 p_inv.bomb = 255 p_inv.medkit = 255 p_inv.magnet = 255 p_inv.emps = 255 add_msg("EXCEPTIONALLY DELIGHTFUL MUNITION ADDED") sfx(09,"C-7",20,3) end --Gameplay Variables lang = { sfail = "Nothing found here.", mgrab = "Grabbed!", mrelease = "Released!", mcant = "Can't move that!", mblocked = "Blocked!", crushed = "You're terminated!", healed = "Ahhh, much better!", emp = "EMP activated! Nearby robots are rebooting.", proceed_a = "All robots are terminated!", proceed_b = "Exit transporter is now active.", paused_a = "Paused!", paused_b = "Hold < and B to exit.", item_one = "Only one can be deployed at a time!", cantplace = "You can't place it there!", noproceed_a = "Transporter will not activate", noproceed_b = "until all robots are destroyed.", music_on = "Music enabled.", music_off = "Music disabled." } s_shake = { p = 0, i = 1, } botids = {2,3,4,9,17,18} dev_mode = false -- initialize these once lastTime = time() fps = 60 -- Starting estimate smoothing = 0.9 -- Adjust between 0 (no smoothing) and 1 (maximum smoothing) function updateFPS() local currentTime = time() local dt = currentTime - lastTime lastTime = currentTime if dt > 0 then local instantFPS = 1000 / dt fps = (fps * smoothing) + (instantFPS * (1 - smoothing)) end return math.floor(fps + 0.5) -- Rounded to nearest integer end --Title screen map_names = { "RESEARCH LAB", "HEADQUARTERS", "THE VILLAGE", "THE ISLANDS", "DOWNTOWN", "PI UNIVERSITY", "MORE ISLANDS", "ROBOT HOTEL", "FOREST MOON", "DEATH TOWER", "RIVER DEATH", "BUNKER", "CASTLE ROBOT", "ROCKET CENTER", "PILANDS" } menu_selected = 1 selected_map_id = 1 difficulty=1 --Returns the level to load based off an id function get_level(id) local levels = { level_a, level_b, level_c, level_d, level_e, level_f, level_g, level_h, level_i, level_j, level_k, level_l, level_m, level_n, level_o } return levels[id] end about_toggled = false function title_screen() local colours = {10,15,15,10,7} local flashcol = colours[math.floor(t / 8)%5 + 1] local menu = { "START GAME", "SELECT MAP", "DIFFICULTY", "CREDITS" } difficulties = { "EASY", "NORMAL", "HARD" } menu[3] = difficulties[difficulty+1] if menu_selected == 3 then if btnp(4) or keyp(50) then difficulty = difficulty + 1 if difficulty > 2 then difficulty = 0 end sfx(04,"C-6",14,3) end end if (btnp(4) and menu_selected == 4) or (keyp(50) and menu_selected == 4) then game_state = "jukebox" jpbt = 0 jpbon = false jb_cs = 0 jb_csw = 120 jb_aind = 0 jb_ic = 30 m=1 end rect(16,94,112,64,2) for i,m in ipairs(menu) do local col = 5 if i == menu_selected then col = flashcol end print(m,17,91+i*6,0,true) print(m,16,90+i*6,col,true) end if about_toggled == false then if btnp(1) and menu_selected < 4 then menu_selected = menu_selected+1 sfx(04,"C-6",14,3) end if btnp(0) and menu_selected > 1 then menu_selected = menu_selected-1 sfx(04,"C-6",14,3) end end if (btnp(4) and menu_selected == 2) or (keyp(50) and menu_selected == 2) then selected_map_id = selected_map_id + 1 if selected_map_id > 15 then selected_map_id = 1 end sfx(04,"C-6",14,3) end if menu_selected == 2 then if btnp(2) then selected_map_id = selected_map_id - 1 if selected_map_id < 1 then selected_map_id = 15 end sfx(04,"C-6",14,3) end if btnp(3) then selected_map_id = selected_map_id + 1 if selected_map_id > 15 then selected_map_id = 1 end sfx(04,"C-6",14,3) end end local idstring = string.format("%02d",selected_map_id) print("MAP "..idstring.."-"..map_names[selected_map_id],9,125,0,true) print("MAP "..idstring.."-"..map_names[selected_map_id],8,124,5,true) spr(256+difficulty*3,160,48,-1,1,0,0,3,2) if (btnp(4) and menu_selected == 1) or (keyp(50) and menu_selected == 1) then local songs = { {0,0}, {1,0}, {0,1}, {1,1} } local index = (selected_map_id-1) % 4 local song = songs[index+1] sync(0,song[1]) poke(0x03FF8,0,8) load_map(get_level(selected_map_id)) game_state = "ingame" sfx(-1) if musicenabled then music(song[2]) else music() end musiclast = song[2] end end --Defines and resets variables for gameplay function game_setup() t=0 mm=false --Map Mode toggle mshowbot = false --Toggle bot display on the map playtime = 0 mc=0 --Move cooldown bg_hurt = 0 --Background Hurt effect timer bg_emp = 0 --Background EMP effect timer hud_wr = 0 --HUD Wheel Radius wpn_select = 0 itm_select = 0 p_inv = { pistol = 0, plasma = 0, bomb = 0, medkit = 0, magnet = 0, emps = 0 } pd = 1 --Player Direction ps = 1 --Player Sprite-index php = 12 --Player Health Points pll = 0 --Player Lift Level pmm = 0 --Player Move Mode (0 = walk 1 = search 2 = move 3 = place item 4 = teleport 5 = lift 6 = victory teleport ) pmc_allow = true --Player Movement Change allowed p_mc_c = 30 --Player Mode Change Cooldown p_inelevator = false --Player In Elevator ptele_prog = 0 --Player Teleport Progress time_to_gameover = 0 p_search = { x = 0, y = 0, t = 0, p = 0, start = false } p_move = { x = 0, y = 0, allowblock = false, grabbed = false } rkey = false gkey = false bkey = false messages = {"Welcome to TIC-80 Robots by David Murray 2021","TIC-80 port by Dominic Horrocks."} fm = true --First Move flag last_screen = nil --fix for explosion errors explosion_inprogress = false end function decompress_results_screen() local result = {} local i = 1 while i <= #results_screen_data do local count = results_screen_data[i] local value = results_screen_data[i+1] for j=1,count do table.insert(result, value) end i = i + 2 end return result end time_on_results = 0 function draw_results_image() local bytes = decompress_results_screen() local idx = 1 for y = 0, 135 do for x = 0, 239, 2 do local byte = bytes[idx] local hi = (byte >> 4) & 0x0F local lo = byte & 0x0F pix(x, y, hi) pix(x+1, y, lo) idx = idx + 1 end end end function results_init() sync(0,6) poke(0x03FF8,1,8) draw_results_image() if game_state == "win" then music(1,0,0,false) else music(2,0,0,false) end end ci = 1 function results_screen(win) local totalSeconds = math.floor(playtime / 60) local minutes = math.floor(totalSeconds / 60) local seconds = totalSeconds % 60 local timeString = string.format("%02d:%02d", minutes, seconds) local idstring = string.format("%02d",selected_map_id) local results = { idstring.."-"..map_names[selected_map_id], timeString, tostring(count_robots(false)), tostring(count_secrets()), difficulties[difficulty+1] } local result_text = "" if win == false then result_text = "YOU LOSE!" else result_text = "YOU WIN!" end local center = 120 - string.len(result_text)*3 local cols if win == false then cols = {2,4,6,13,15,15,13,6,4} else cols = {3,5,8,14,15,15,14,8,5} end print(result_text, center+1, 27, 0,true,1) print(result_text, center, 26, cols[math.floor(t / 8)%9 + 1],true,1) for i = 1,5 do local ypos = {42,56,70,84,98} print(results[i],117,ypos[i]+1,0,true,1,true) print(results[i],118,ypos[i],15,true,1,true) end if btnp(4) and time_on_results >= 60 then time_on_results = 0 game_state = "title" game_setup() title_init() end if time_on_results < 60 then time_on_results = time_on_results + 1 end end function decompress_intro_screen() local result = {} local i = 1 while i <= #intro_screen_data do local count = intro_screen_data[i] local value = intro_screen_data[i+1] for j=1,count do table.insert(result, value) end i = i + 2 end return result end function draw_intro_image() local bytes = decompress_intro_screen() local idx = 1 for y = 0, 135 do for x = 0, 239, 2 do -- NOTE: increment by 2 because each byte = 2 pixels local byte = bytes[idx] local hi = (byte >> 4) & 0x0F -- high nibble local lo = byte & 0x0F -- low nibble pix(x, y, hi) -- draw first pixel pix(x+1, y, lo) -- draw second pixel idx = idx + 1 end end end function title_init(skipmusicswap) poke(0x03FF8,2,8) if not skipmusicswap then music(0) sync(0,7) end draw_intro_image() end boot = { t = 0, lpbar = 0, pbar = 0, logo_h = 0, pbar_text = 0, pbar_btext = 0, hex_lines = {}, max_lines = 20, hex_scroll = 0 } function boot_animation() boot.t = boot.t + 1 if boot.t < 240 then cls(02) spr(320,96,112,-1,1,0,0,7,2) spr(400,60,48,-1,1,0,0,15,boot.logo_h) if boot.logo_h < 7 and boot.t > 72 then if boot.t % 12 == 0 then boot.logo_h = boot.logo_h + 1 end end if boot.lpbar < 7 and boot.t % 2 == 0 and boot.t > 12 then boot.lpbar = boot.lpbar + 1 sfx(01) end spr(368,8,8,02,1,0,0,boot.lpbar,1) if boot.t < 30 then rect(8+boot.lpbar*8,8,8,8,9) end local text = { "HUMAN PRESENCE DETECTED.", "WAKING UP THE ROBOTS..." } if boot.t > 60 then local topline = string.sub(text[1],1,boot.pbar_text) print(topline,8,24,9,true) if boot.t % 2 == 0 and boot.pbar_text < string.len(text[1]) then boot.pbar_text = boot.pbar_text + 1 sfx(01) rect(8+boot.pbar_text*6,24,5,5,9) end end if boot.t > 120 then local bottomline = string.sub(text[2],1,boot.pbar_btext) print(bottomline,8,32,9,true) if boot.t % 2 == 0 and boot.pbar_btext < string.len(text[2]) then boot.pbar_btext = boot.pbar_btext + 1 sfx(01) rect(8+boot.pbar_btext*6,32,5,5,9) end end end if boot.t == 240 then cls(00) end if boot.t > 300 then title_init() game_state = "title" end end results_screen_data = { 38,17,1,20,1,68,1,65,1,20,6,68,1,65,2,68,2,17,1,68, 1,65,1,20,1,65,1,20,1,65,4,17,1,68,1,65,1,17,3,68, 4,17,4,68,1,65,1,20,1,65,3,68,75,17,1,68,1,0,1,68, 1,17,1,4,1,64,2,0,1,68,1,0,1,4,1,64,1,4,1,65, 1,20,1,64,1,68,1,20,1,64,1,68,1,0,3,17,1,20,2,68, 1,17,1,68,2,0,1,1,3,17,1,16,1,68,1,0,1,4,1,64, 1,20,1,64,1,68,2,0,1,1,68,17,1,136,4,17,1,20,1,64, 1,4,1,64,1,1,1,68,1,0,1,17,1,20,1,64,1,1,1,68, 1,0,1,68,1,1,1,68,1,0,1,16,2,68,1,16,1,1,3,17, 1,68,1,0,1,68,1,4,1,64,1,1,5,17,1,20,1,64,1,1, 1,68,1,0,1,68,1,4,1,64,1,1,5,17,1,136,63,17,1,24, 1,136,4,17,1,20,1,64,1,4,1,64,1,17,1,68,1,1,1,17, 1,20,1,64,1,17,1,68,1,0,1,68,1,4,1,64,1,1,1,17, 2,68,1,1,4,17,1,68,1,0,1,68,1,4,1,64,6,17,1,20, 1,64,1,17,1,68,1,0,1,68,1,4,1,64,6,17,1,136,1,129, 62,17,2,136,4,17,1,68,1,0,1,68,1,0,1,20,1,64,1,1, 1,17,1,68,1,0,1,20,1,64,1,4,1,64,1,68,1,0,1,17, 1,20,1,68,1,0,1,1,3,17,1,20,1,64,1,4,1,64,2,68, 1,65,5,17,1,68,1,0,1,20,2,68,1,64,2,68,1,65,5,17, 2,136,62,17,2,136,4,17,3,68,1,1,1,20,1,64,2,17,1,68, 1,1,1,20,2,68,1,64,1,68,1,1,1,17,1,20,1,68,1,65, 4,17,1,20,1,64,1,4,1,64,1,68,2,0,5,17,1,68,1,1, 1,20,1,64,1,4,1,64,1,68,2,0,5,17,2,136,35,17,29ۧ,136, 4,17,1,68,1,0,1,68,1,1,1,20,1,64,2,17,1,68,1,1, 1,20,1,64,1,4,1,64,1,68,1,1,1,17,1,20,1,68,1,64, 4,17,1,20,1,64,1,4,1,64,1,68,1,1,6,17,1,68,1,1, 1,20,1,64,1,4,1,64,1,68,1,1,6,17,29,136,7,17,30,136, 3,17,1,20,1,64,1,4,1,64,1,1,1,68,1,0,1,17,1,20, 1,64,1,1,1,68,1,0,1,68,1,0,1,68,1,4,1,65,1,68, 1,4,1,64,4,17,1,20,1,68,1,64,1,4,1,64,1,1,5,17, 1,20,1,64,1,1,1,68,1,0,1,68,1,4,1,64,1,1,6,17, 30,136,5,17,1,24,30,136,3,17,1,20,1,64,1,20,1,64,1,17, 1,68,1,1,1,17,1,20,1,64,1,17,1,68,1,1,1,68,1,1, 1,20,1,68,1,0,1,68,1,1,1,68,5,17,1,68,1,0,1,20, 1,64,6,17,1,20,1,64,1,17,1,68,1,1,1,68,1,4,2,68, 1,65,5,17,30,136,1,129,4,17,1,24,30,136,4,17,1,0,1,17, 1,0,1,17,1,16,1,1,2,17,1,0,1,17,1,16,1,1,1,16, 1,1,1,17,1,0,1,1,1,16,1,1,1,16,1,1,4,17,1,16, 1,1,1,17,1,0,7,17,1,0,1,17,1,16,1,1,1,16,1,1, 3,0,5,17,30,136,1,129,4,17,3,136,1,129,25,17,2,136,2,17, 3,255,1,31,2,255,1,241,3,255,1,31,2,255,1,241,3,255,1,31, 2,255,1,241,3,255,4,17,3,255,1,17,3,255,1,31,2,255,1,17, 3,255,1,17,3,255,1,31,2,255,1,241,2,17,2,136,25,17,1,24, 3,136,4,17,2,136,1,129,26,17,2,136,2,17,1,240,1,0,2,15, 3,0,1,16,1,255,1,0,1,15,1,240,1,0,2,240,1,0,1,255, 1,1,1,15,2,0,1,16,1,240,1,0,1,1,3,17,1,240,1,0, 1,255,1,1,1,240,1,0,2,15,1,0,1,255,1,1,1,240,1,0, 1,15,1,1,1,16,1,255,1,0,1,15,1,240,1,0,1,240,2,17, 2,136,26,17,1,24,2,136,4,17,2,136,1,129,26,17,1,24,1,136, 2,17,1,240,1,17,1,31,1,15,1,1,3,17,1,255,1,1,1,31, 1,240,1,17,1,16,1,240,1,17,1,255,1,1,1,31,1,1,2,17, 1,240,5,17,1,240,1,17,1,255,1,1,1,240,1,17,1,31,1,15, 1,1,1,255,1,1,1,240,1,17,1,31,1,1,1,17,1,255,1,1, 1,31,1,240,1,17,1,16,2,17,1,136,1,129,26,17,1,24,2,136, 4,17,2,136,28,17,1,136,2,17,3,170,1,10,2,170,1,161,1,17, 1,170,1,1,1,26,2,170,1,161,1,160,1,17,1,16,1,1,1,26, 1,161,2,17,1,170,5,17,3,170,1,161,1,160,1,17,1,170,1,10, 2,170,1,1,1,160,1,17,1,170,1,1,1,17,1,170,1,1,1,26, 2,170,1,161,2,17,1,136,28,17,2,136,4,17,2,136,31,17,1,255, 2,0,1,15,1,240,2,0,1,17,1,255,1,1,1,17,2,0,2,240, 1,17,1,31,1,17,1,31,1,240,2,17,1,255,1,1,4,17,1,255, 1,0,1,15,2,240,1,17,1,255,1,15,1,0,1,15,1,241,1,240, 1,17,1,255,1,1,1,17,1,255,1,1,1,17,2,0,1,240,31,17, 2,136,4,17,2,136,31,17,1,170,1,1,1,17,1,26,1,160,3,17, 1,170,1,1,1,26,1,161,1,17,2,160,1,17,1,26,1,1,1,26, 1,160,2,17,1,170,1,1,4,17,1,170,1,1,1,26,2,160,1,17, 1,170,1,10,1,1,1,26,2,160,1,17,1,170,1,1,1,17,1,170, 1,1,1,26,1,161,1,17,1,160,31,17,2,136,4,17,2,136,31,17, 1,170,1,1,1,17,1,26,2,170,1,161,1,17,1,170,1,1,1,26, 2,170,1,160,3,170,1,10,2,170,1,161,3,170,4,17,1,170,1,1, 1,26,1,160,3,170,1,10,2,170,1,160,3,170,1,1,1,17,1,170, 1,1,1,26,2,170,1,160,31,17,2,136,4,17,2,136,31,17,1,16, 1,1,2,17,3,0,1,17,1,16,1,1,1,17,3,0,1,16,2,0, 1,1,3,0,1,16,2,0,1,1,3,17,1,16,1,1,1,17,1,0, 1,16,2,0,1,1,3,0,1,16,2,0,1,1,1,17,1,16,1,1, 1,17,3,0,31,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136, 112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136, 112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136, 112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136, 112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136, 112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,31,17,1,26,1,170,1,17,1,170,1,26,1,170,1,26, 1,17,1,161,1,26,1,161,1,26,1,170,1,17,1,170,1,161,1,26, 1,161,63,17,2,136,4,17,2,136,31,17,1,161,1,17,1,26,1,17, 1,26,1,17,1,26,3,161,2,26,1,17,1,161,1,26,1,17,1,161, 1,26,1,17,1,161,61,17,2,136,4,17,2,136,31,17,1,26,1,161, 1,26,1,17,1,26,1,161,2,26,1,161,2,170,1,26,1,170,1,17, 1,26,1,17,1,161,1,26,63,17,2,136,4,17,2,136,32,17,2,26, 1,17,1,26,1,17,1,26,1,17,2,161,2,26,1,17,1,161,1,26, 1,17,1,161,1,26,1,17,1,161,61,17,2,136,4,17,2,136,31,17, 1,170,1,161,1,17,1,170,1,26,1,170,1,26,1,17,2,161,2,26, 1,17,1,161,1,170,1,161,1,26,1,161,63,17,2,136,4,17,2,136, 112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136, 112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,112,17,2,136,4,17,2,136,22,17,1,26,1,170,1,26, 2,17,1,170,1,17,1,170,1,161,1,17,1,170,1,161,1,170,1,161, 1,170,1,161,2,17,1,26,1,170,1,26,1,170,1,26,1,17,2,26, 1,170,63,17,2,136,4,17,2,136,22,17,1,26,1,17,1,26,1,17, 1,26,1,17,2,161,2,26,2,17,1,161,1,17,1,161,1,26,3,17, 1,161,1,17,1,161,1,26,1,161,1,170,1,26,2,17,1,161,61,17, 2,136,4,17,2,136,22,17,1,26,1,161,1,26,1,17,1,26,1,170, 1,161,1,170,1,161,1,17,1,170,1,17,1,170,1,17,1,161,1,26, 3,17,1,161,1,17,1,161,4,26,1,161,63,17,2,136,4,17,2,136, 22,17,1,26,1,17,1,26,1,17,1,26,1,17,2,161,3,17,2,161, 1,17,1,161,1,26,3,17,1,161,1,17,1,161,1,26,1,17,2,26, 2,17,1,161,61,17,2,136,4,17,2,136,22,17,1,26,1,170,1,26, 1,170,1,26,1,17,2,161,1,17,1,26,1,170,1,17,1,170,1,161, 1,170,1,161,3,17,1,161,1,26,1,170,1,26,1,17,2,26,1,170, 63,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136, 112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136, 11,17,1,26,1,170,1,17,1,26,1,161,1,26,1,170,1,17,1,26, 1,161,1,26,1,170,1,17,1,170,1,161,2,17,1,170,1,161,1,26, 1,170,1,26,1,17,1,26,1,17,1,170,1,17,1,170,2,161,2,26, 1,170,1,26,1,17,1,161,1,26,1,161,63,17,2,136,4,17,2,136, 11,17,1,26,1,17,2,161,2,26,1,17,2,161,1,26,1,17,1,161, 1,26,4,17,1,161,2,26,1,17,1,26,1,161,1,170,1,26,1,17, 1,161,1,26,1,17,1,170,1,26,1,17,1,161,1,26,3,161,2,17, 1,161,61,17,2,136,4,17,2,136,11,17,1,26,1,170,1,17,1,161, 2,26,1,170,1,17,1,161,1,26,1,17,1,161,1,17,1,170,3,17, 1,170,1,161,1,26,1,161,4,26,1,170,1,161,1,26,1,17,1,161, 1,170,1,17,1,161,2,26,2,161,1,170,63,17,2,136,4,17,2,136, 11,17,1,26,1,17,2,161,2,26,1,17,2,161,1,26,1,17,1,161, 2,17,1,161,2,17,1,161,2,26,1,17,1,26,1,17,2,26,1,17, 1,161,1,26,1,17,1,161,1,170,1,17,1,161,2,26,2,161,1,26, 1,17,1,161,61,17,2,136,4,17,2,136,11,17,1,26,1,17,1,161, 1,26,1,161,1,26,1,170,1,17,1,26,1,161,1,17,1,161,1,26, 1,170,3,17,1,161,2,26,1,170,1,26,1,17,2,26,1,17,1,161, 1,170,2,161,2,26,1,170,1,26,1,17,1,161,1,26,1,161,63,17, 2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17, 2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17, 2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17, 2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,10,17, 1,26,1,170,1,26,1,170,1,17,1,170,1,17,1,170,1,161,1,26, 1,170,1,26,1,170,1,17,1,170,1,161,2,17,1,170,1,161,1,26, 1,170,1,26,1,17,1,26,1,17,1,170,1,17,1,170,2,161,2,26, 1,170,1,26,1,17,1,161,1,26,1,161,63,17,2,136,4,17,2,136, 10,17,1,161,1,17,1,26,1,17,1,26,2,17,1,161,2,26,2,17, 1,161,1,26,4,17,1,161,2,26,1,17,1,26,1,161,1,170,1,26, 1,17,1,161,1,26,1,17,1,170,1,26,1,17,1,161,1,26,3,161, 2,17,1,161,61,17,2,136,4,17,2,136,10,17,1,26,1,161,1,26, 1,161,1,26,2,17,1,170,1,161,1,26,1,161,1,17,1,161,1,17, 1,170,3,17,1,170,1,161,1,26,1,161,4,26,1,170,1,161,1,26, 1,17,1,161,1,170,1,17,1,161,2,26,2,161,1,170,63,17,2,136, 4,17,2,136,11,17,2,26,1,17,1,26,2,17,1,161,2,26,2,17, 1,161,2,17,1,161,2,17,1,161,2,26,1,17,1,26,1,17,2,26, 1,17,1,161,1,26,1,17,1,161,1,26,1,17,1,161,2,26,2,161, 1,26,1,17,1,161,61,17,2,136,4,17,2,136,10,17,1,170,1,161, 1,26,1,170,1,17,1,170,1,17,1,161,2,26,1,170,1,17,1,161, 1,26,1,170,3,17,1,161,2,26,1,170,1,26,1,17,2,26,1,17, 1,161,1,170,2,161,2,26,1,170,1,26,1,17,1,161,1,26,1,161, 63,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136, 112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136, 4,17,2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136, 27,17,1,26,1,170,1,17,1,170,1,161,1,170,1,161,1,170,1,161, 1,170,1,161,1,26,2,161,2,26,1,17,1,26,1,170,1,26,1,17, 1,26,63,17,2,136,4,17,2,136,27,17,1,26,1,17,1,161,1,26, 1,17,1,161,1,17,1,161,1,17,1,26,1,17,1,161,1,17,1,161, 2,26,2,17,1,161,1,26,1,17,1,26,1,17,1,161,61,17,2,136, 4,17,2,136,27,17,1,26,1,17,1,161,1,26,1,17,1,170,1,17, 1,170,1,17,1,26,1,17,1,161,1,17,1,161,2,26,2,17,1,161, 1,17,2,161,63,17,2,136,4,17,2,136,27,17,1,26,1,17,1,161, 1,26,1,17,1,161,1,17,1,161,1,17,1,26,1,17,1,161,1,17, 1,161,2,26,2,17,1,161,1,17,1,26,2,17,1,161,61,17,2,136, 4,17,2,136,27,17,1,26,1,170,1,17,1,170,2,161,1,17,1,161, 1,17,1,170,1,161,1,26,1,161,1,26,1,161,1,26,1,170,1,17, 1,161,1,17,1,26,64,17,2,136,4,17,2,136,112,17,2,136,4,17, 2,136,112,17,2,136,4,17,2,136,112,17,2,136,4,17,2,136,112,17, 2,136,4,17,2,136,112,17,2,136,4,17,2,136,80,17,2,119,30,17, 2,136,4,17,2,136,44,17,1,18,1,38,1,97,1,17,1,38,1,34, 14,17,1,142,1,232,13,17,1,23,2,187,1,113,29,17,2,136,4,17, 2,136,44,17,1,18,1,102,1,193,1,130,1,18,1,98,1,18,3,17, 1,123,1,177,7,17,1,24,1,255,1,238,1,129,9,17,1,113,2,119, 1,27,2,255,1,177,29,17,2,136,4,17,2,136,44,17,1,22,1,102, 1,193,1,226,1,18,1,38,1,18,2,17,1,23,1,177,8,17,1,136, 1,239,1,17,1,81,2,17,1,241,1,17,1,31,6,17,1,119,1,27, 1,255,1,17,1,113,29,17,2,136,4,17,2,136,23,17,1,18,2,34, 18,17,1,22,1,207,1,33,1,226,1,18,1,98,1,33,1,18,1,97, 2,123,1,177,7,17,1,24,1,225,1,254,1,129,2,17,1,241,1,17, 1,27,7,17,1,23,1,177,1,255,1,177,29,17,2,136,4,17,2,136, 23,17,2,34,1,38,1,33,18,17,1,33,1,24,1,102,1,18,1,38, 1,33,10,17,2,24,1,136,1,95,1,229,1,81,2,17,1,177,1,17, 1,27,8,17,1,123,1,255,1,113,29,17,2,136,4,17,2,136,23,17, 1,38,1,34,1,38,1,22,14,17,1,24,1,17,1,136,1,238,1,136, 1,134,1,97,1,34,1,98,1,97,13,17,1,21,1,88,1,225,2,17, 1,123,1,17,1,183,8,17,1,23,1,119,1,183,29,17,2,136,4,17, 2,136,23,17,1,38,1,34,1,45,1,28,1,97,17,17,1,18,1,102, 1,18,1,38,1,102,1,97,14,17,1,142,1,129,2,17,1,23,1,187, 1,113,9,17,1,123,1,183,29,17,2,136,4,17,2,136,23,17,1,38, 1,102,1,221,1,108,1,193,1,51,6,17,1,22,11,17,1,18,1,102, 1,108,1,97,1,113,1,123,1,17,1,23,1,113,14,17,1,113,10,17, 1,23,1,113,29,17,2,136,4,17,2,136,23,17,1,18,1,109,1,209, 1,108,1,193,1,51,1,123,1,187,1,183,2,17,1,22,1,223,1,221, 1,102,8,17,1,34,1,22,1,102,1,207,1,97,1,113,1,23,1,113, 1,23,1,183,10,17,1,27,1,187,1,113,1,17,1,23,11,17,1,24, 1,136,1,81,2,17,1,127,1,183,23,17,2,136,4,17,2,136,24,17, 1,38,1,22,1,204,1,19,1,55,1,189,1,75,1,119,1,123,1,182, 1,109,1,255,1,253,1,221,1,102,1,97,6,17,1,98,1,22,1,108, 1,255,1,97,1,113,1,33,2,17,1,187,10,17,1,187,1,177,1,187, 1,27,1,123,1,113,10,17,1,142,1,229,1,133,1,17,1,23,1,247, 1,123,23,17,2,136,4,17,2,136,24,17,1,18,2,97,1,57,1,23, 1,123,1,17,1,44,2,17,1,22,1,221,1,102,9,17,2,38,1,207, 1,255,1,97,1,177,1,98,1,33,1,23,8,17,1,27,1,113,1,27, 1,187,1,255,1,27,1,113,1,183,1,177,9,17,1,24,1,239,1,254, 1,88,1,81,1,23,1,241,1,187,23,17,2,136,4,17,2,136,26,17, 1,51,1,153,1,49,1,17,1,194,1,18,14,17,1,18,1,38,1,207, 1,252,1,97,1,177,1,102,1,98,9,17,2,23,1,27,1,191,1,17, 1,241,1,113,11,17,1,24,1,239,1,255,1,88,1,27,1,183,1,241, 1,187,23,17,2,136,4,17,2,136,25,17,1,19,1,159,1,145,1,19, 1,18,1,204,15,17,1,22,1,38,1,204,1,198,1,33,1,177,1,102, 1,98,9,17,1,27,1,17,1,119,1,187,1,17,1,241,1,113,11,17, 1,21,1,142,1,238,1,232,1,17,1,23,1,177,1,123,23,17,2,136, 4,17,2,136,25,17,1,19,1,159,1,147,1,153,1,49,1,17,1,23, 1,177,13,17,2,18,1,102,1,98,1,23,1,177,1,204,1,98,9,17, 1,23,1,17,1,23,1,123,1,255,1,183,1,113,11,17,1,21,1,136, 1,238,1,136,1,129,1,23,1,183,1,27,23,17,2,136,4,17,2,136, 26,17,3,153,1,17,1,34,1,27,1,113,17,17,1,119,1,18,2,34, 8,17,1,23,1,187,1,113,1,17,1,119,1,187,1,119,13,17,1,88, 1,136,1,133,2,17,1,123,1,183,23,17,2,136,4,17,2,136,26,17, 1,19,1,153,1,49,1,34,1,17,1,119,11,17,2,18,3,34,1,98, 2,17,1,34,10,17,1,123,1,17,1,183,1,17,1,23,1,119,1,113, 1,17,1,49,11,17,1,21,1,85,1,81,27,17,2,136,4,17,2,136, 28,17,1,18,1,98,16,17,1,98,1,102,1,198,3,17,2,23,1,113, 7,17,1,177,1,17,1,27,3,17,1,23,1,17,1,19,41,17,2,136, 4,17,2,136,28,17,1,34,1,97,18,17,1,108,1,33,2,17,1,123, 1,23,1,177,7,17,1,241,1,17,1,31,3,17,1,123,1,113,1,51, 13,17,1,177,27,17,2,136,4,17,2,136,28,17,1,34,20,17,1,33, 12,17,1,241,1,17,1,31,2,17,1,49,1,23,1,17,1,57,11,17, 1,123,1,113,1,241,1,119,26,17,2,136,4,17,2,136,26,17,1,23, 1,113,1,33,1,23,19,17,1,28,1,97,1,108,1,198,1,17,1,187, 1,177,11,17,1,51,1,17,1,19,1,57,10,17,1,23,1,187,1,177, 1,241,1,187,1,113,25,17,2,136,4,17,2,136,1,129,23,17,2,23, 1,119,1,113,1,119,1,123,19,17,1,22,1,97,1,17,1,102,1,23, 1,177,10,17,1,19,1,49,1,57,2,153,1,241,10,17,1,23,4,187, 1,113,24,17,1,24,2,136,4,17,2,136,1,129,27,17,1,27,1,177, 24,17,1,27,1,177,7,17,2,19,1,51,1,49,1,19,1,159,1,255, 12,17,1,123,1,191,1,255,1,183,25,17,1,24,2,136,4,17,3,136, 1,129,108,17,1,24,3,136,4,17,1,24,114,136,1,129,4,17,1,24, 114,136,1,129,5,17,114,136,7,17,112,136,4,17, } intro_screen_data = { 107,17,1,22,12,187,107,17,1,22,12,187,3,17,1,20,9,17,1,20, 1,68,92,17,1,107,12,187,3,17,1,68,1,65,4,17,1,20,5,68, 1,65,91,17,1,107,2,187,1,107,9,187,2,17,3,68,1,17,9,68, 1,64,1,17,1,68,1,65,3,17,1,20,3,68,1,17,1,68,1,65, 1,17,1,65,4,17,3,68,69,17,1,107,1,187,1,182,10,187,1,17, 1,20,3,68,1,1,9,68,1,64,1,20,2,68,3,17,4,68,1,65, 2,68,1,20,1,68,3,17,1,20,4,68,1,17,2,68,65,17,1,107, 1,187,1,102,2,187,1,102,7,187,1,17,1,20,3,68,1,65,8,68, 1,64,1,0,3,68,1,65,1,17,1,20,4,68,1,64,2,68,1,4, 1,68,1,1,2,17,5,68,1,65,5,68,1,65,61,17,1,107,1,187, 1,182,2,187,1,107,7,187,1,17,1,20,1,68,1,4,2,68,1,20, 4,68,1,4,2,68,1,0,1,17,3,68,1,64,1,17,1,20,4,68, 1,64,2,68,1,4,1,68,1,1,2,17,5,68,1,64,5,68,1,64, 2,68,59,17,1,107,1,187,1,102,2,187,1,102,7,187,1,17,1,20, 1,68,1,1,2,68,1,65,4,68,1,1,2,68,1,1,1,20,4,68, 1,17,1,20,2,68,1,0,1,68,1,64,2,68,1,4,1,68,1,1, 2,17,2,68,1,0,1,4,1,68,1,64,1,20,4,68,1,0,4,68, 57,17,1,107,1,187,1,102,2,107,8,187,2,17,1,68,1,65,1,20, 1,68,1,64,1,16,1,0,2,68,1,1,2,102,1,1,1,22,1,102, 1,96,1,6,1,102,1,1,1,22,1,102,1,96,1,1,1,16,1,0, 1,22,3,102,1,1,2,17,2,102,1,1,1,22,1,102,1,96,1,20, 1,68,3,0,1,1,5,68,56,17,1,107,2,187,1,102,9,187,2,17, 2,68,1,17,1,4,1,68,1,65,1,17,1,20,1,68,1,1,1,20, 1,68,1,1,1,20,1,68,1,64,1,17,1,68,1,65,1,20,1,68, 1,64,4,17,3,68,1,1,2,17,2,68,1,1,1,20,1,68,1,64, 1,20,1,68,1,1,3,17,5,68,1,4,1,68,54,17,1,107,12,187, 2,17,2,68,1,1,1,20,1,68,1,102,1,17,1,22,1,102,1,1, 1,22,1,102,1,97,1,22,2,102,1,17,2,102,1,17,2,102,4,17, 3,102,1,1,2,17,2,102,1,1,1,22,1,102,1,96,1,22,1,102, 1,1,3,17,1,22,3,102,1,96,1,68,1,64,1,1,2,68,1,65, 1,68,49,17,1,22,12,187,2,17,1,20,1,68,1,65,1,17,2,68, 1,1,1,20,1,68,1,65,1,20,2,68,1,17,2,68,1,1,1,20, 1,68,1,65,2,68,1,1,3,17,3,68,1,1,2,17,2,68,1,1, 1,20,1,68,1,64,1,20,1,68,1,1,3,17,1,20,1,68,1,64, 1,0,1,4,1,68,1,64,1,17,2,68,1,0,2,68,48,17,1,22, 12,187,3,17,2,102,1,17,1,22,1,102,1,97,1,22,2,102,1,17, 2,102,1,1,2,102,1,97,1,22,1,102,1,96,2,102,1,97,3,17, 3,102,1,1,2,17,2,102,1,1,1,22,1,102,1,96,1,22,3,102, 1,97,1,17,1,22,1,102,1,96,1,17,1,22,1,102,1,0,1,17, 2,102,1,1,3,68,47,17,1,22,4,187,1,182,1,102,3,187,1,102, 2,187,3,17,1,22,1,102,1,1,1,22,2,102,1,17,2,102,1,1, 1,22,1,102,1,1,1,22,1,102,1,96,1,22,1,102,1,96,2,102, 1,96,3,17,3,102,1,1,2,17,2,102,1,1,1,22,1,102,1,96, 1,22,3,102,1,96,1,17,1,22,1,102,1,96,1,17,2,102,1,1, 1,22,1,102,1,96,2,102,3,68,47,17,1,107,3,187,1,102,4,187, 2,107,1,187,3,17,1,22,1,102,1,1,1,17,2,102,1,1,2,102, 1,97,1,22,1,102,1,1,6,102,1,22,2,102,3,17,3,102,1,1, 2,17,2,102,1,1,1,22,1,102,1,96,1,22,3,102,1,0,1,17, 1,22,1,102,1,0,1,17,2,102,1,1,2,102,1,0,2,102,1,96, 1,100,1,68,1,1,46,17,1,107,3,187,1,102,4,187,1,102,1,107, 1,187,3,17,6,187,1,177,1,27,1,187,1,176,1,27,1,187,1,177, 6,187,1,1,2,187,1,1,2,17,1,27,2,187,1,177,2,17,2,187, 1,1,1,27,1,187,1,176,1,27,2,187,1,176,1,1,1,17,1,27, 1,187,1,1,1,17,2,187,1,11,2,187,1,1,2,68,1,64,1,68, 1,64,1,1,46,17,1,22,3,187,1,182,2,107,5,187,2,17,1,22, 6,102,1,96,1,17,1,102,1,96,1,17,1,102,1,96,1,22,5,102, 1,1,2,102,1,1,2,17,1,22,3,102,2,17,2,102,1,1,1,22, 1,102,1,96,1,22,1,102,2,0,2,17,1,22,1,102,1,1,1,22, 4,102,1,96,1,6,1,102,1,96,1,0,1,16,1,0,48,17,1,107, 10,187,3,17,6,187,1,176,1,17,2,187,1,17,1,187,1,176,1,17, 2,187,1,0,1,11,1,187,1,177,2,187,1,1,2,17,1,27,3,187, 1,1,1,17,2,187,1,1,1,27,1,187,1,176,1,27,1,187,1,1, 3,17,2,187,1,1,5,187,1,0,1,27,2,187,1,177,50,17,1,22, 10,187,3,17,1,16,1,11,2,187,1,0,2,187,1,17,2,187,1,1, 1,27,1,187,1,17,2,187,1,1,1,17,1,187,1,176,1,27,4,187, 1,27,1,187,1,11,1,187,1,177,1,17,2,187,1,1,1,27,1,187, 1,176,1,27,1,187,1,1,3,17,2,187,1,1,2,187,1,0,2,187, 1,1,1,22,3,102,1,97,50,17,1,107,9,187,5,17,2,187,1,1, 1,27,1,187,1,1,1,27,1,187,1,1,1,27,1,187,1,177,1,27, 1,187,1,177,1,17,2,187,1,27,4,187,1,11,1,187,1,1,1,187, 1,176,1,17,5,187,1,176,1,27,1,187,1,1,2,17,1,27,1,187, 1,176,1,1,1,187,1,176,1,1,2,187,1,1,1,187,3,102,1,0, 50,17,1,22,3,187,2,182,1,107,3,187,5,17,2,187,1,177,1,27, 2,187,1,27,1,187,1,177,1,17,1,187,1,176,1,17,2,187,1,17, 2,187,1,1,4,187,1,11,1,187,1,1,1,187,1,176,1,17,5,187, 1,0,1,27,1,187,1,1,2,17,1,27,1,187,1,0,1,27,1,187, 1,176,1,27,2,187,1,11,1,187,1,182,1,17,1,0,1,1,51,17, 1,107,3,187,1,102,4,187,5,17,1,27,1,187,1,176,1,17,2,187, 1,11,1,187,1,176,1,17,2,187,1,17,1,27,1,187,1,177,1,27, 1,187,1,1,1,16,3,187,1,1,1,187,1,1,1,187,1,176,1,17, 1,27,4,187,1,1,1,27,1,187,1,1,3,17,1,11,1,1,1,27, 1,187,1,0,1,27,1,187,1,176,1,11,2,187,1,17,1,187,52,17, 1,22,1,107,7,187,6,17,2,187,1,17,2,187,1,1,2,187,1,17, 2,187,1,1,1,27,1,187,1,176,1,27,1,176,1,1,1,17,1,16, 2,0,1,1,1,16,1,1,1,16,1,0,2,17,4,0,1,1,1,17, 1,0,1,1,4,17,1,1,1,187,1,176,1,1,1,17,1,11,1,176, 5,187,1,1,52,17,1,22,1,107,6,187,6,17,1,27,1,176,1,1, 1,16,1,176,1,1,1,27,1,176,1,1,1,27,1,176,1,1,1,17, 1,187,1,0,1,17,1,0,25,17,1,16,1,0,3,17,1,0,1,16, 1,11,3,187,1,1,4,17,1,49,48,17,1,22,1,102,4,187,1,182, 7,17,1,0,2,17,1,16,2,17,1,0,2,17,1,0,2,17,1,16, 1,1,35,17,3,0,1,1,4,17,1,33,50,17,4,102,1,97,64,17, 1,33,39,17,3,0,1,1,26,17,1,24,3,136,1,129,1,17,4,136, 1,129,2,17,1,24,2,136,1,17,4,136,1,129,1,17,3,136,1,129, 3,17,1,24,2,136,3,17,2,136,1,129,11,17,1,33,1,49,37,17, 1,16,1,119,1,112,1,170,1,160,26,17,5,136,1,24,4,136,1,128, 5,136,1,8,5,136,1,24,4,136,1,129,5,136,1,8,4,136,1,128, 11,17,2,33,23,17,1,49,13,17,1,7,1,119,1,112,2,170,1,1, 25,17,1,136,3,0,1,136,1,8,1,128,4,0,1,16,1,0,1,136, 2,0,1,8,1,128,3,0,1,136,1,8,1,128,2,0,1,8,1,128, 1,16,1,0,1,136,2,0,1,1,1,0,1,8,1,128,2,0,11,17, 2,33,23,17,1,34,13,17,1,7,2,119,1,10,1,170,1,1,25,17, 1,136,1,1,2,17,1,136,1,8,1,128,6,17,1,136,1,1,1,17, 1,24,1,128,3,17,1,24,1,8,1,128,2,17,1,24,1,128,2,17, 1,136,1,1,3,17,1,24,1,128,12,17,1,19,1,34,1,33,23,17, 1,34,7,17,1,16,2,0,1,1,2,17,1,16,2,119,1,10,1,170, 1,160,25,17,1,136,1,1,2,17,1,136,1,8,1,128,6,17,1,136, 1,1,1,17,1,24,1,128,4,17,1,8,1,128,2,17,1,24,1,128, 2,17,1,136,1,1,3,17,1,24,1,128,12,17,1,50,1,34,1,35, 23,17,1,34,7,17,1,7,1,10,1,170,1,1,2,17,1,16,2,119, 1,10,1,170,1,160,7,17,4,51,14,17,1,136,1,1,2,17,1,136, 1,8,1,128,6,17,1,136,1,1,1,17,1,24,1,128,4,17,1,24, 1,128,2,17,1,24,1,128,2,17,1,136,1,1,3,17,1,24,1,128, 12,17,3,34,1,49,22,17,1,34,6,17,1,16,1,119,1,10,1,170, 1,1,3,17,1,7,1,119,1,10,1,170,1,160,7,17,4,34,14,17, 5,136,1,8,4,136,3,17,1,136,1,129,1,17,1,24,4,136,1,17, 1,24,1,136,3,17,1,0,2,17,1,136,1,129,3,17,1,24,1,136, 12,17,3,34,1,35,22,17,1,34,6,17,1,7,1,119,1,10,1,170, 1,1,3,17,1,7,1,119,1,112,2,170,1,1,6,17,4,34,14,17, 4,136,1,128,1,8,4,136,1,1,2,17,1,136,1,128,2,17,4,136, 1,129,1,24,1,136,1,1,5,17,1,136,1,128,3,17,1,24,1,136, 1,1,11,17,4,34,1,49,21,17,1,34,6,17,1,7,1,119,2,0, 1,1,3,17,1,16,1,119,1,112,2,170,1,1,6,17,4,34,14,17, 1,136,1,128,3,0,1,24,1,136,3,0,1,1,2,17,1,136,1,128, 2,17,1,16,2,0,1,8,1,136,1,24,1,136,1,1,5,17,1,136, 1,128,3,17,1,24,1,136,1,1,11,17,4,34,1,33,21,17,1,34, 5,17,1,16,2,119,1,10,1,170,1,1,3,17,1,16,1,119,1,112, 2,170,1,1,5,17,1,51,4,34,14,17,1,136,1,128,3,17,1,24, 1,136,1,1,5,17,1,136,1,128,5,17,1,24,1,136,1,8,1,136, 1,1,5,17,1,136,1,128,3,17,1,24,1,136,1,1,11,17,4,34, 1,33,21,17,1,34,5,17,1,16,1,119,1,112,1,170,1,160,4,17, 1,16,1,119,1,112,2,170,1,1,5,17,5,34,14,17,1,136,1,128, 3,17,1,24,1,136,1,1,5,17,1,136,1,128,1,17,1,24,1,136, 2,17,1,24,1,136,1,8,1,136,1,1,1,17,1,24,1,129,2,17, 1,136,1,128,3,17,1,24,1,136,1,1,11,17,4,34,1,33,21,17, 1,34,5,17,1,16,1,119,1,112,1,170,1,160,4,17,1,16,1,119, 1,112,2,170,1,1,5,17,5,34,14,17,1,221,1,208,3,17,1,29, 1,221,1,1,5,17,1,221,1,208,1,17,1,29,1,221,1,1,1,17, 1,29,1,221,1,13,1,221,1,1,1,17,1,29,1,208,1,1,1,17, 1,221,1,208,3,17,1,29,1,221,1,1,11,17,4,34,1,33,21,17, 1,34,5,17,1,7,1,119,1,112,1,170,1,160,4,17,1,7,1,119, 1,112,2,170,1,3,5,17,5,34,14,17,1,221,1,208,3,17,1,29, 4,221,1,209,2,17,1,221,1,208,1,17,1,29,5,221,1,13,4,221, 1,208,5,221,1,29,4,221,1,209,10,17,4,34,1,33,20,17,1,19, 1,34,1,51,1,49,1,17,1,19,1,51,1,7,1,119,1,112,1,170, 1,160,4,17,1,7,1,119,1,10,1,170,1,160,1,34,1,49,4,17, 5,34,14,17,1,221,1,208,3,17,1,29,4,221,1,208,2,17,1,221, 1,208,2,17,4,221,1,208,1,0,3,221,1,208,1,0,5,221,1,13, 4,221,1,208,10,17,2,34,1,43,1,34,1,33,1,19,1,49,18,17, 1,18,2,34,1,33,1,17,1,18,1,34,1,7,1,119,1,112,1,170, 2,0,2,17,1,16,2,119,1,10,1,170,1,160,1,34,1,35,4,17, 5,34,14,17,1,16,1,0,4,17,5,0,2,17,1,16,1,0,2,17, 1,16,4,0,1,17,1,16,3,0,1,17,1,16,4,0,1,1,5,0, 10,17,4,34,1,33,1,18,1,33,18,17,1,18,2,34,1,33,1,17, 1,18,1,34,1,7,2,119,1,0,2,119,2,0,1,7,1,119,1,112, 2,170,1,2,2,34,1,49,3,17,5,34,23,17,1,19,6,51,33,17, 4,34,1,33,1,18,1,33,18,17,1,18,2,34,1,33,1,17,1,18, 1,34,1,7,2,119,1,7,1,122,1,167,1,112,1,160,2,119,1,112, 2,170,1,2,2,34,1,35,3,17,5,34,16,17,3,221,1,209,2,17, 4,221,1,210,1,34,3,221,1,209,2,17,4,221,1,208,3,17,3,221, 1,208,4,221,1,209,12,17,4,34,1,33,1,18,1,33,18,17,1,18, 2,34,1,35,1,49,1,18,1,34,1,7,1,119,1,112,1,119,1,167, 1,122,1,119,1,10,2,119,1,10,1,170,1,160,4,34,1,49,2,17, 5,34,15,17,1,29,4,221,1,17,1,29,5,221,1,45,4,221,1,17, 1,29,5,221,1,29,5,221,1,13,5,221,12,17,4,34,1,33,1,18, 1,33,11,17,2,0,4,17,2,0,1,43,2,34,1,33,1,18,1,34, 1,32,1,119,1,112,1,122,2,119,1,167,1,10,1,119,1,112,2,170, 1,1,4,34,1,35,2,17,5,34,15,17,1,29,1,208,2,0,1,221, 1,1,1,29,1,208,3,0,1,221,1,13,1,208,2,0,1,221,1,1, 1,29,1,208,3,0,1,221,1,1,1,0,1,13,1,208,2,0,1,13, 1,208,3,0,1,221,1,1,11,17,1,34,1,43,2,34,1,33,1,18, 1,33,10,17,1,16,1,10,1,160,3,17,1,16,1,10,1,160,3,34, 1,33,1,18,1,34,1,32,1,119,1,112,1,122,2,119,1,167,1,10, 1,119,1,10,1,170,1,160,1,17,5,34,1,49,1,17,3,34,1,43, 1,34,15,17,1,29,1,208,2,17,1,221,1,1,1,29,1,208,1,18, 2,34,1,221,1,13,1,208,1,34,1,17,1,221,1,1,1,29,1,208, 3,17,1,221,1,1,1,17,1,29,1,208,2,17,1,29,1,208,1,51, 2,17,1,29,1,1,11,17,4,34,1,33,1,18,1,33,10,17,1,7, 1,10,1,160,3,17,1,7,1,10,1,160,2,34,1,33,1,17,1,18, 2,34,1,7,1,112,1,122,2,119,1,167,1,10,1,0,2,170,1,1, 1,17,5,34,1,35,1,17,5,34,15,17,1,29,1,208,2,17,1,221, 1,1,1,29,1,208,1,50,2,34,1,221,1,13,1,208,1,34,1,17, 1,221,1,1,1,29,1,208,3,17,1,221,1,1,1,17,1,29,1,208, 2,17,1,29,1,208,1,34,1,51,2,17,1,1,11,17,4,34,1,33, 1,18,1,35,1,51,8,17,1,16,10,0,1,2,1,33,1,17,1,18, 2,34,1,16,1,112,1,122,2,119,1,167,1,10,2,170,1,160,2,17, 6,34,1,17,5,34,15,17,1,24,1,128,2,17,1,136,1,1,1,24, 1,128,3,34,1,136,1,8,1,128,1,34,1,17,1,136,1,1,1,24, 1,128,3,17,1,136,1,1,1,17,1,24,1,128,2,17,1,24,1,128, 2,34,1,19,13,17,4,34,1,33,1,18,2,34,8,17,1,0,10,170, 1,2,1,33,1,17,1,18,2,34,1,17,1,0,1,119,1,167,1,122, 1,119,1,10,2,170,1,1,2,17,6,34,1,17,5,34,15,17,1,24, 4,136,1,1,1,24,1,136,3,34,1,136,1,8,4,136,1,129,1,24, 1,136,3,17,1,136,1,1,1,17,1,24,1,136,2,17,1,24,4,136, 1,51,11,17,1,19,4,34,1,33,1,18,2,34,7,17,1,16,1,112, 10,170,1,2,1,33,1,17,1,18,2,34,2,17,1,7,1,122,1,167, 1,112,2,170,1,160,3,17,6,34,1,17,5,34,15,17,1,24,4,136, 1,129,1,24,1,136,1,2,2,34,1,136,1,8,5,136,1,24,1,136, 1,1,2,17,1,136,1,1,1,17,1,24,1,136,1,1,2,17,1,8, 3,136,1,130,11,17,1,18,2,34,1,43,1,34,1,35,1,50,2,34, 1,51,6,17,2,0,2,119,1,0,3,119,1,112,1,0,1,119,1,112, 1,0,1,1,1,17,1,18,2,34,2,17,1,16,2,119,1,10,1,170, 1,160,1,1,3,17,6,34,1,17,5,34,15,17,1,24,1,136,2,0, 1,8,1,136,1,24,1,136,1,2,2,34,1,136,1,8,1,136,3,0, 1,136,1,8,1,136,1,1,2,17,1,136,1,1,1,17,1,56,1,136, 1,1,2,17,1,34,2,0,1,8,1,136,11,17,1,18,9,34,5,17, 1,16,1,112,1,170,3,119,1,0,2,119,1,7,2,119,1,112,1,170, 1,1,1,17,1,18,2,34,3,17,2,0,1,167,1,112,1,1,4,17, 2,34,1,43,3,34,1,17,5,34,15,17,1,24,1,136,1,1,2,17, 1,136,1,8,1,136,1,2,2,34,1,136,1,8,1,136,1,2,2,17, 1,136,1,8,1,136,1,1,2,17,1,136,1,1,1,17,1,40,1,136, 1,1,2,17,3,34,1,40,1,136,1,1,10,17,1,16,2,0,1,2, 6,34,5,17,1,7,1,112,1,170,4,119,1,7,1,112,4,119,1,170, 1,1,1,17,1,18,2,34,3,17,1,16,2,119,1,112,1,161,4,17, 6,34,1,17,5,34,1,49,14,17,1,24,1,136,1,3,2,17,1,136, 1,8,1,136,1,2,2,34,1,136,1,8,1,136,1,2,2,17,1,136, 1,8,1,136,1,1,2,17,1,136,1,1,1,17,1,40,1,136,1,1, 1,17,1,24,1,136,2,34,1,40,1,136,1,1,6,17,1,16,1,0, 1,1,1,17,1,16,2,170,1,0,6,34,5,17,1,7,1,112,1,170, 1,7,1,112,2,0,2,119,2,0,1,7,1,112,1,170,1,3,1,51, 1,50,2,34,3,17,1,16,1,122,1,170,1,112,1,161,4,17,6,34, 1,17,2,34,1,178,2,34,1,35,14,17,1,24,1,136,1,2,1,49, 1,17,1,136,1,8,1,136,1,2,2,34,1,136,1,8,1,136,1,2, 2,17,1,136,1,8,1,136,1,1,2,17,1,136,1,1,1,17,1,40, 1,136,1,3,1,49,1,24,1,136,1,2,1,34,1,40,1,136,1,1, 6,17,1,10,1,170,1,160,1,1,1,16,2,170,1,7,1,2,1,34, 1,43,3,34,5,17,1,7,1,112,1,170,1,119,3,0,1,7,1,112, 3,0,1,119,1,170,1,2,4,34,3,17,1,16,1,122,1,170,1,112, 1,161,4,17,6,34,1,17,6,34,1,49,13,17,1,24,1,136,1,2, 1,33,1,17,1,136,1,8,5,136,1,8,5,136,1,8,5,136,1,1, 1,17,1,40,1,136,1,2,1,33,1,24,5,136,1,1,5,17,1,16, 2,170,1,7,1,112,1,16,2,170,1,7,1,112,5,34,5,17,1,7, 1,112,1,170,1,7,1,0,1,102,1,0,1,7,1,112,1,6,1,96, 1,0,1,119,1,170,1,2,4,34,3,17,1,16,1,122,1,170,1,112, 1,161,4,17,6,34,1,17,4,34,1,178,1,34,1,35,13,17,1,24, 1,136,1,2,1,33,1,17,1,136,1,1,4,136,1,128,1,8,4,136, 1,128,1,1,4,136,1,128,1,3,1,51,1,40,1,136,1,2,1,33, 1,17,4,136,1,128,1,1,5,17,1,10,1,170,1,160,1,119,1,112, 1,16,2,170,1,7,1,119,1,2,4,34,5,17,1,7,1,112,1,170, 1,119,1,0,1,102,1,0,1,7,1,112,1,6,1,96,1,0,1,119, 1,170,1,2,2,34,1,178,1,34,3,17,1,16,1,122,1,170,1,112, 1,161,4,17,6,34,1,17,7,34,1,49,11,17,1,51,1,50,1,0, 1,2,1,35,1,51,1,48,1,1,1,16,4,0,1,34,5,0,1,17, 1,16,4,0,2,34,1,32,1,0,1,2,1,33,1,17,1,32,4,0, 6,17,1,10,1,170,1,160,1,119,1,112,1,16,2,0,1,7,1,119, 1,2,4,34,5,17,1,7,1,112,1,170,1,7,3,0,1,7,1,112, 3,0,1,112,1,170,1,2,4,34,3,17,1,16,1,122,1,170,1,112, 1,161,4,17,6,34,1,17,7,34,1,35,10,17,1,19,7,34,1,33, 1,18,7,34,8,17,1,18,5,34,1,33,1,17,5,34,6,17,1,10, 1,170,1,160,1,119,1,112,1,18,1,10,1,170,1,160,1,119,1,112, 2,34,1,38,1,34,5,17,1,7,1,112,1,170,1,7,1,112,2,0, 2,119,2,0,1,7,1,112,1,170,1,2,4,34,3,17,1,16,1,122, 1,170,1,112,1,161,4,17,3,34,1,43,2,34,1,17,8,34,1,49, 9,17,1,50,7,34,1,33,1,18,7,34,8,17,1,18,5,34,1,33, 1,17,5,34,5,17,1,16,2,170,1,7,1,119,1,112,1,18,1,32, 2,170,1,7,1,112,4,34,1,51,1,49,3,17,1,7,1,112,1,170, 1,7,8,119,1,112,1,170,1,2,1,43,3,34,3,17,1,16,1,122, 1,170,1,112,1,161,4,17,6,34,1,17,2,34,1,43,5,34,1,35, 3,17,1,51,5,17,8,34,1,33,1,18,7,34,8,17,1,18,5,34, 1,33,1,17,5,34,2,17,1,19,1,49,1,17,1,16,2,170,1,7, 1,119,1,1,1,18,1,34,1,10,1,170,1,7,1,119,1,2,4,34, 1,33,3,17,1,7,1,112,7,0,3,7,1,112,1,0,1,2,4,34, 3,17,1,16,1,122,1,170,1,112,1,161,4,17,6,34,1,17,9,34, 1,49,2,17,1,34,5,17,8,34,1,33,1,18,2,34,1,43,4,34, 8,17,1,18,5,34,1,33,1,17,5,34,2,17,1,50,1,33,1,17, 1,16,2,170,1,7,1,119,1,3,1,50,1,34,1,10,1,170,1,160, 1,119,1,2,4,34,1,33,3,17,2,7,1,112,1,10,8,170,1,160, 1,112,5,34,3,17,1,16,1,122,1,170,1,112,1,161,4,17,1,34, 1,43,4,34,1,17,9,34,1,35,2,17,1,34,5,17,8,34,1,33, 1,18,7,34,8,17,1,18,5,34,1,35,1,49,5,34,1,17,1,19, 1,34,1,33,1,17,1,16,2,170,1,7,1,119,1,2,2,34,1,32, 1,170,1,160,1,119,1,2,4,34,1,33,3,17,1,0,1,119,1,7, 1,10,8,170,1,160,1,2,3,34,1,178,1,34,3,17,1,16,1,122, 1,170,1,112,1,161,4,17,6,34,1,17,10,34,1,49,1,17,1,34, 5,17,8,34,1,33,1,18,7,34,8,17,1,18,1,34,1,178,4,34, 1,35,5,34,1,17,1,50,1,34,1,33,1,17,1,16,2,170,1,7, 1,119,1,112,2,34,1,32,1,170,1,160,1,119,1,2,1,38,3,34, 1,33,3,17,1,7,1,112,1,119,1,10,8,0,1,160,6,34,3,17, 1,16,1,122,1,170,1,112,1,161,4,17,6,34,1,17,10,34,1,33, 1,17,1,34,5,17,4,34,1,178,3,34,1,33,1,18,7,34,5,17, 2,51,1,49,1,18,9,34,1,43,2,34,1,19,2,34,1,33,1,17, 1,16,2,170,1,7,1,119,1,112,2,34,1,10,1,170,1,7,1,119, 1,2,4,34,1,33,3,17,1,16,1,0,1,119,1,10,1,15,1,240, 1,255,1,15,1,240,1,255,1,15,1,240,1,160,2,34,1,38,3,34, 3,17,1,16,2,119,1,112,1,161,4,17,6,34,1,17,8,34,1,43, 1,34,1,33,1,17,1,34,5,17,1,34,1,178,6,34,1,33,1,18, 7,34,5,17,2,34,1,33,1,18,12,34,1,50,2,34,1,33,1,17, 1,16,2,170,1,7,1,119,1,112,2,34,1,10,1,170,1,7,1,119, 1,2,4,34,1,33,4,17,1,16,1,119,1,10,1,15,1,240,1,255, 1,15,1,240,1,255,1,15,1,240,1,160,6,34,3,17,1,16,3,0, 1,1,3,17,1,19,3,34,1,98,6,34,1,98,6,34,1,33,1,17, 1,34,5,17,8,34,1,33,1,18,7,34,5,17,2,34,1,33,1,18, 15,34,1,33,2,17,1,10,1,170,1,160,2,119,2,0,1,170,1,160, 1,119,1,112,1,2,2,34,1,98,1,34,1,33,4,17,1,16,1,119, 1,10,8,0,1,160,4,34,1,98,1,34,3,17,1,0,1,119,1,112, 1,10,1,160,3,17,1,19,6,34,1,17,10,34,1,33,1,17,1,34, 5,17,8,34,1,33,1,18,7,34,5,17,2,34,1,33,1,18,5,34, 1,33,9,34,1,33,2,17,1,10,1,170,1,160,2,119,1,112,2,170, 3,0,1,2,4,34,1,33,4,17,1,16,1,119,1,10,1,15,1,240, 1,255,1,15,1,240,1,255,1,15,1,240,1,160,6,34,2,51,1,48, 3,119,1,112,1,170,1,1,2,17,1,50,17,34,1,33,1,17,1,34, 5,17,8,34,1,33,1,18,1,34,1,43,5,34,1,49,4,17,2,34, 1,33,1,18,2,34,1,178,2,34,1,33,1,17,8,34,1,33,2,17, 1,16,2,170,1,7,2,119,2,0,1,7,1,119,1,112,1,2,4,34, 1,33,4,17,1,16,1,119,1,10,1,15,1,240,1,255,1,15,1,240, 1,255,1,15,1,240,1,160,8,34,1,32,1,119,1,170,1,167,1,112, 1,170,1,1,2,17,1,50,6,34,1,17,10,34,1,33,1,17,1,34, 5,17,8,34,1,33,1,18,7,34,1,35,4,17,2,34,1,33,1,18, 5,34,1,33,1,17,8,34,1,33,2,17,1,16,2,170,1,7,3,119, 1,0,1,119,1,170,1,119,1,2,4,34,1,33,4,17,1,16,1,119, 1,10,8,0,1,160,8,34,1,7,1,122,1,119,1,122,1,119,1,10, 1,160,1,17,1,19,7,34,1,17,10,34,1,33,1,17,1,34,5,17, 3,34,1,43,4,34,1,33,1,18,8,34,1,49,3,17,2,34,1,33, 1,18,5,34,1,33,1,17,8,34,1,33,3,17,1,10,1,170,1,160, 3,119,1,0,1,122,1,119,1,167,1,2,4,34,1,33,4,17,1,16, 1,119,1,10,8,170,1,160,2,34,1,66,5,34,1,7,1,122,1,119, 1,122,1,119,1,10,1,160,1,17,1,19,18,34,1,33,1,17,1,34, 5,17,8,34,1,33,1,18,8,34,1,35,3,17,2,34,1,33,1,18, 5,34,1,33,1,17,2,34,1,43,3,34,1,178,1,34,1,33,3,17, 1,16,2,170,1,0,2,119,1,0,1,122,1,119,1,167,1,2,4,34, 1,33,4,17,1,16,1,119,6,0,3,10,1,160,8,34,1,7,1,122, 1,119,1,122,1,119,1,10,1,160,1,17,1,50,2,34,1,38,15,34, 1,33,1,17,1,34,5,17,5,34,1,43,2,34,1,33,1,18,3,34, 1,178,1,34,1,178,3,34,1,49,2,17,2,34,1,33,1,18,5,34, 1,35,1,51,8,34,1,33,4,17,1,10,2,170,3,0,1,122,1,119, 1,167,1,2,1,34,1,66,2,34,1,33,4,17,1,16,1,112,9,170, 1,2,8,34,1,32,1,119,1,170,1,167,1,112,1,170,1,1,1,17, 1,50,5,34,1,38,1,34,1,17,1,34,1,98,4,34,1,43,3,34, 1,33,1,17,1,34,5,17,8,34,1,33,1,18,1,34,1,178,7,34, 1,35,2,17,2,34,1,33,1,18,1,43,1,34,1,38,12,34,1,33, 4,17,1,16,5,170,1,119,1,170,1,119,1,2,4,34,1,33,4,17, 1,16,1,10,3,170,2,119,3,170,1,160,9,34,1,32,3,119,1,112, 1,170,1,1,1,19,8,34,1,17,10,34,1,33,1,17,1,34,1,51, 1,49,2,17,1,51,8,34,1,33,1,18,10,34,1,49,1,17,2,34, 1,33,1,18,15,34,1,33,5,17,1,10,4,170,1,7,1,119,1,112, 1,2,3,34,1,66,1,33,4,17,1,16,3,170,1,160,2,170,1,10, 2,170,1,2,4,34,1,98,4,34,1,7,1,0,1,119,1,112,1,10, 1,160,1,17,1,19,8,34,1,17,10,34,1,35,1,51,2,34,1,33, 2,17,9,34,1,33,1,18,10,34,1,33,1,17,2,34,1,33,1,18, 5,34,1,33,1,17,4,34,1,43,3,34,1,33,5,17,1,16,1,10, 3,170,1,160,2,0,1,2,4,34,1,33,4,17,1,16,3,0,1,7, 2,119,1,112,2,0,2,34,1,36,6,34,1,32,2,119,3,0,1,1, 1,17,1,18,4,34,1,36,3,34,1,51,9,34,1,178,4,34,1,33, 2,17,2,34,1,43,18,34,1,33,1,17,2,34,1,33,1,18,5,34, 1,35,1,51,8,34,1,33,6,17,1,32,1,10,1,170,2,0,2,119, 1,2,4,34,1,33,8,17,1,16,2,170,1,0,11,34,1,7,2,119, 1,10,1,170,1,1,2,17,1,18,11,34,1,66,11,34,1,33,2,17, 9,34,1,33,1,18,10,34,1,33,1,17,2,34,1,33,1,18,9,34, 1,38,5,34,1,33,6,17,1,34,1,32,1,0,1,119,1,112,1,122, 1,167,1,2,1,34,1,36,2,34,1,33,3,17,1,16,3,0,1,17, 1,7,2,119,1,112,10,34,1,32,2,119,1,112,1,170,1,160,3,17, 1,18,2,34,1,66,12,34,1,38,7,34,1,33,2,17,4,34,1,38, 7,34,1,38,4,34,1,38,3,34,1,33,1,17,2,34,1,33,1,18, 1,38,14,34,1,33,6,17,2,34,1,32,1,122,1,160,1,122,1,167, 1,2,4,34,1,35,3,51,1,10,3,170,6,0,1,2,8,34,1,7, 2,119,1,10,1,170,1,2,3,17,1,18,23,34,1,33,2,17,9,34, 1,33,1,18,10,34,1,33,1,17,2,34,1,33,1,18,3,34,1,36, 1,34,1,33,1,17,4,34,1,36,3,34,1,33,6,17,3,34,1,10, 1,170,1,7,1,170,1,112,7,34,1,32,10,170,1,160,2,0,1,2, 4,34,1,32,2,119,1,112,1,170,1,160,1,34,3,17,1,18,23,34, 1,33,2,17,9,34,1,33,1,18,3,34,1,36,6,34,1,33,1,17, 2,34,1,33,1,18,5,34,1,33,1,17,8,34,1,35,1,51,1,49, 3,17,1,19,3,34,1,10,1,170,1,7,1,170,1,112,5,34,1,32, 2,0,1,167,3,119,9,170,1,160,4,34,1,7,2,119,1,10,1,170, 1,2,1,34,3,17,1,18,4,34,1,66,16,34,1,98,1,34,1,33, 2,17,7,34,1,98,13,34,1,33,1,17,2,34,1,33,1,18,5,34, 1,33,1,17,10,34,1,33,3,17,1,18,3,34,1,32,1,170,1,160, 1,122,1,167,1,2,4,34,1,10,1,160,1,112,10,119,1,122,3,170, 1,2,2,34,1,32,2,119,1,112,1,170,1,160,2,34,3,17,1,18, 9,34,1,36,2,34,1,66,10,34,1,33,2,17,1,34,1,38,19,34, 1,33,1,17,2,34,1,33,1,18,5,34,1,33,1,17,10,34,1,33, 3,17,1,18,3,34,1,32,1,170,1,160,1,122,1,167,1,2,3,34, 1,32,1,170,2,160,13,119,1,122,1,0,1,2,1,34,1,7,2,119, 1,10,1,170,1,2,2,34,3,17,1,18,2,34,1,66,20,34,1,33, 2,17,9,34,1,33,1,18,1,36,9,34,1,33,1,17,2,34,1,33, 1,50,1,34,1,36,3,34,1,33,1,17,3,34,1,38,6,34,1,35, 3,51,1,50,1,34,1,38,2,34,1,10,1,170,1,7,1,170,1,112, 3,34,1,10,1,170,1,0,1,160,14,119,1,7,1,2,1,32,2,119, 1,112,1,170,1,160,3,34,3,51,1,50,17,34,1,36,1,34,1,98, 3,34,1,33,2,17,6,34,1,66,2,34,1,33,1,18,6,34,1,66, 3,34,1,33,1,17,2,34,1,35,6,34,1,33,1,17,9,34,1,98, 9,34,1,10,1,170,1,7,1,170,1,112,2,34,1,32,1,170,1,160, 2,112,2,119,4,170,1,167,7,119,1,10,1,0,1,7,2,119,1,10, 1,170,1,2,30,34,1,33,2,17,3,34,1,66,5,34,1,33,1,18, 8,34,1,36,1,34,1,33,1,17,9,34,1,33,1,17,19,34,1,32, 1,170,1,160,1,122,1,167,2,0,1,10,1,170,1,7,1,112,1,160, 6,119,1,122,4,170,1,167,2,119,1,10,1,0,2,119,1,112,1,170, 1,160,31,34,1,33,2,17,9,34,1,35,1,50,3,34,1,36,6,34, 1,33,1,17,9,34,1,35,1,51,19,34,1,32,1,170,1,160,1,122, 1,167,1,0,1,119,1,112,1,0,1,119,2,112,14,119,1,7,1,0, 2,119,1,10,1,170,1,2,31,34,1,33,2,17,21,34,1,35,1,51, 18,34,1,66,8,34,1,36,3,34,1,10,1,170,1,7,1,170,1,7, 2,119,1,7,1,119,2,112,14,119,1,10,1,0,1,119,1,112,1,170, 1,160,25,34,1,66,6,34,1,33,2,17,4,34,1,36,49,34,1,10, 1,170,2,0,1,7,1,122,1,119,1,7,1,119,1,0,1,112,2,119, 4,170,8,119,1,7,1,0,1,119,1,10,1,170,1,2,6,34,1,38, 21,34,1,66,3,34,1,33,2,17,1,34,1,36,36,34,1,66,9,34, 1,38,5,34,1,32,1,0,1,10,1,160,1,119,2,167,2,112,1,34, 1,0,6,119,5,170,1,167,2,119,1,7,1,0,1,112,1,170,1,160, 10,34,1,66,22,34,1,35,2,17,29,34,1,66,24,34,1,32,2,170, 1,160,1,119,2,167,1,112,1,2,1,34,1,0,13,119,1,112,1,119, 3,0,1,2,34,34,2,51,54,34,1,32,2,170,1,160,1,119,2,167, 1,112,2,34,1,0,13,119,1,112,1,119,1,2,93,34,1,32,2,170, 1,160,1,119,2,167,1,112,2,34,1,0,2,119,4,170,7,119,1,112, 1,0,9,34,1,36,84,34,1,32,3,170,1,7,1,122,1,119,1,2, 2,34,1,0,6,119,5,170,1,167,1,119,1,112,96,34,1,10,2,170, 1,7,2,119,1,2,2,34,1,0,13,119,1,112,96,34,1,32,2,170, 1,160,1,119,1,112,3,34,1,7,13,119,1,112,97,34,4,0,1,2, 3,34,1,7,13,119,1,112,105,34,1,7,13,119,1,112,105,34,1,7, 2,119,1,170,10,119,1,112,105,34,1,7,1,119,1,122,1,170,1,167, 9,119,1,2,105,34,1,7,2,119,1,170,7,119,1,170,2,119,1,2, 105,34,1,7,9,119,1,122,1,170,1,167,1,119,1,2,105,34,1,7, 10,119,1,170,2,119,1,2,105,34,5,0,1,7,8,119,1,2,107,34, 1,32,2,119,1,112,6,0,2,119,1,2,107,34,1,32,1,167,6,119, 1,122,1,160,2,0,1,2,107,34,1,32,1,170,1,167,5,119,1,170, 1,112,110,34,1,32,1,122,6,170,1,167,1,112,110,34,1,32,1,119, 1,122,5,170,1,119,1,112,109,34,1,32,1,0,8,119,1,0,1,2, 108,34,1,7,1,0,1,167,6,119,1,122,1,0,1,112,107,34,1,32, 1,119,1,112,1,170,1,167,5,119,1,170,1,0,1,119,1,2,106,34, 1,0,2,119,1,122,6,170,1,167,1,0,1,119,1,2,105,34,1,32, 1,0,2,170,1,119,1,122,5,170,1,112,1,7,1,119,1,2,1,36, 104,34,1,32,1,112,2,170,1,167,6,119,1,112,2,170,1,2,1,36, 1,66,1,34,1,36,100,34,1,36,1,64,1,112,3,170,1,167,5,119, 2,170,1,160,1,112,1,36,1,68,1,34,1,68,100,34,1,68,1,64, 1,119,1,10,10,170,1,7,1,119,1,4,4,68,96,34,4,68,1,64, 1,119,1,112,1,10,8,170,1,160,2,119,1,4,5,68,1,66,95,34, 3,68,1,64,2,119,1,112,1,0,1,10,5,170,1,160,1,7,2,119, 1,2,5,68,97,34,1,68,1,70,1,64,1,122,3,119,1,112,5,0, 1,7,1,119,1,122,1,119,1,2,1,68,1,70,3,68,93,34,1,36, 3,68,2,70,1,96,1,122,1,167,10,119,1,170,1,119,1,2,2,70, 1,68,1,100,2,68,94,34,2,68,2,70,1,96,1,119,1,170,1,167, 8,119,1,170,1,167,1,112,1,6,2,70,1,100,1,102,2,68,1,66, 93,34,1,36,1,68,1,70,1,102,1,96,1,119,1,122,1,167,1,122, 1,170,4,119,1,170,1,119,1,170,1,119,1,112,1,38,1,102,1,70, 2,102,1,100,1,66,93,34,2,68,2,70,1,102,1,96,3,119,1,122, 2,170,1,119,1,122,2,170,3,119,1,0,1,38,4,102,1,66,93,34, 2,68,3,70,1,102,1,100,1,34,1,39,2,119,1,122,1,170,1,119, 1,122,1,170,3,119,1,32,1,2,1,38,1,107,3,102,1,68,91,34, 1,36,2,68,1,102,2,70,2,102,1,180,1,39,1,114,1,34,8,119, 2,34,1,119,1,38,1,107,2,182,1,100,1,36,1,66,94,34,1,38, 1,70,2,107,1,182,1,39,1,167,1,119,1,34,1,39,5,119,1,114, 1,34,1,119,1,167,1,38,3,187,1,100,96,34,2,70,2,107,1,182, 1,39,2,170,1,119,1,114,4,119,1,114,1,34,1,119,1,170,1,167, 1,43,3,187,1,98,95,34,1,68,1,107,1,70,1,187,1,107,1,187, 1,39,3,170,1,114,2,119,1,114,2,39,1,119,1,122,1,170,1,167, 1,43,1,180,1,68,1,187,1,98,94,34,1,36,1,70,1,43,1,75, 3,187,1,39,3,170,1,114,1,39,1,114,2,34,1,39,2,119,1,122, 1,167,1,43,1,66,1,34,1,68,1,182,94,34,1,68,1,34,1,36, 1,107,1,180,1,68,1,75,1,178,1,122,2,170,1,114,4,34,1,39, 1,34,1,39,2,119,1,36,3,34,1,68,1,66,92,34,1,36,1,66, 1,34,1,36,1,100,1,66,1,34,1,36,1,178,4,119,7,34,1,39, 1,119,101,34,1,68,1,66,2,34,1,36,1,178,4,119,8,34,1,39, 1,36,104,34,1,36,1,183,3,34,1,39,9,34,1,36,1,66,255,34, 13,34, } game_setup() game_state = "boot" game_controls = "gamepad" paused = false exit_held = 0 sync(0,7,false) poke(0x03FF8,2,8) l=false m=1 c=0 b={7,7,7,0,1,0,1} s={0,1,2,0,0,1,1} n={"METAL HEADS","ALL CLEAR","END OF THE LINE","METALLIC BOP","RUSHIN' IN","ROBOT ATTACK!","GET PSYCHED"} jpbt = 0 jb_cs = 0 jb_csw = 120 jb_aind = 0 jb_ic = 30 function jukebox() cls(2) if l then startmusic() elseif jb_ic == 0 then if btnp(2) and m>1 then m=m-1 end if btnp(3) and m<#n then m=m+1 end if btnp(4) then setupmusic() end end if jb_ic > 0 then jb_ic = jb_ic - 1 end jpbt = jpbt + 1 local colours = {3,4,6,11} rect(2,9,104,32,0) rect(38,16,31,17,15) rect(38,16,20,17,4) local dx = 21 for i = 0,1 do local offs = i*64 circ(dx+offs,24,8,15) for i = 0,5 do local r = 8 local a = jpbt*0.025 + (math.pi * (i)+1)/3 local x = r* math.cos(a)+offs local y = r* math.sin(a) line(dx+offs,24,dx+x,24+y,7) end circ(dx+offs,24,4,2) circ(dx+offs,24,1,0) end local curr=n[c] prev="< " next=" >" fxn={1,1,1,0,1,0,1,0,0,0,0,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,0,1,1,0,1} if curr==nil then curr="" end if m==1 then prev=" " elseif m==#n then next=" " end print(prev..n[m]..next,-1,61,0,true) print(prev..n[m]..next,0,60,15,true) stext("<> Select",12,114,4) stext(" A Play",12,120,6) stext(" B Exit",12,126,11) rect(11,84,50,16,0) local t_av = 0 local h_av = 0 for c=0,3 do local registerbase=peek(0xFF9C+18*c+1)<<8|peek(0xFF9C+18*c) sfxvol=(registerbase&0xf000)>>12 volreg1=(peek(0x14000+c))&0x0f volreg2=((peek(0x14000+c))&0xf0)>>4 waveformtab={} wavenoise=0 wavefixnoise=0 local avol = math.floor((sfxvol * volreg1) / 16) rect(1+12*(c+1),100-avol,10,avol,colours[math.ceil(avol/4)]) print(c,15+12*c+c,102,colours[math.floor(avol/4)],true,1,true) h_av = math.max(avol,h_av) end if jb_aind == nil then jb_aind = h_av end -- initialize once local smoothing = 0.2 -- smaller = slower response jb_aind = jb_aind + (h_av - jb_aind) * smoothing -- Now use jb_aind instead of h_av for visuals rect(70, 80, 32, 32, colours[math.floor(1.5*jb_aind / 4)]) spr(327, 70, 80, 9, 1, 0, 0, 4, 4) local songtext = curr print(songtext,11,77,0,true,1,true) print(songtext,12,76,15,true,1,true) local about_text = { "#PROGRAMMING", "", "Dominic Horrocks", "", "", "#ORIGINAL GAME", "", "The 8-Bit Guy", "A.K.A. David Murray", "", "", "#GRAPHICS", "", "Dominic Horrocks", "(original) Piotr Radecki", "", "", "#MUSIC", "", "Retropone", "(original) Noelle Amelie Aman", "", "", "#FEEDBACK", "", "David Murray", "Jacket", "TIC-80 community", "", "", "#SPECIAL THANKS", "", "Vadim 'Nesbox' Grigoruk", "borbware", "", "", "#HEY YOU!", "", "#THANKS FOR PLAYING!" } local ax = 120 if jb_csw ~= 0 then jb_csw = jb_csw - 1 else jb_cs = jb_cs + 0.25 end local cs = math.floor(jb_cs) local max_sc = 450 spr(400,ax,(30-cs+56)%max_sc-56,-1,1,0,0,15,7) print("BY",ax+60,(90-cs)%max_sc,15,true,1,true) spr(320,ax+34,(100-cs+16)%max_sc-16,-1,1,0,0,7,2) for i,t in ipairs(about_text) do local heading = false if string.sub(t,1,1) == "#" then heading = true end if heading == true then for xi = 0,2 do print(string.sub(t,2, -1),2+ax-2+xi,-8+(i*7-cs+156+2-xi)%max_sc,colours[xi+2]) end else print(t,ax,-8+(i*7-(cs)+156)%max_sc,15,true,1,true) end end --if jb_cs > 430 then jb_cs = -96 end if btn(1) then jb_cs = jb_cs+1 end if btnp(5) then c=0 w=-1 jpbon = false game_state = "title" if m == 1 then title_init(true) else title_init() sync(false,7) end end end function setupmusic() music() sync(8,b[m]) l=true end function startmusic() sync(16,b[m]) music(s[m]) c=m l=false jpbon = true end musicenabled = true function TIC() t=t+1 if game_state == "title" then title_screen() end if game_state == "jukebox" then jukebox() end if game_state == "boot" then boot_animation() end if game_state == "ingame" then if key(64) and keyp(13) then musicenabled = not musicenabled if not musicenabled then music() add_msg(lang.music_off) else music(musiclast) add_msg(lang.music_on) end end if paused == false then if p_mc_c > 0 then p_mc_c = p_mc_c - 1 end shakeoffset() update_player() if time_to_gameover < 60 then anim_water() anim_aircon() anim_conveyor() update_units() update_sound() if php > 0 then playtime = playtime + 1 end end if mm == false then playfield() end if php == 0 then pmm = 0 spr(384,80,48,13,1,0,0,2,2) end draw_cinemas() draw_units_under() draw_units() hud_wheel() draw_player() draw_units_over() if php == 0 then mm = false end if mm == true then map_screen() if mshowbot == true then draw_map_units() end if btnp(4) then mm = false hud_wr = 0 p_mc_c = 30 messages[1],messages[2] = "", "" elseif btnp(5) then mshowbot = not mshowbot sfx(01,"C-6",14,3) end end hud() if time_to_gameover > 60 then hud_gameover() music() if btnp(4) and php == 0 then game_state = "lose" results_init() exit_held = 0 paused = false elseif btnp(4) and pmm == 6 then game_state = "win" results_init() exit_held = 0 paused = false end end exit_held = 0 else hud_paused() if btnp(4) then paused = false messages[1] = "" messages[2] = "" end if btn(2) and btn(5) then exit_held = exit_held + 1 if exit_held > 120 then game_state = "lose" results_init() exit_held = 0 paused = false end end local konamicode = {0,0,1,1,2,3,2,3,5,4} if konami_progress == nil then konami_progress = 1 end for i=0,5 do if btnp(i) and i ~= konamicode[konami_progress] then konami_progress = 1 end end -- check for the correct button if btnp(konamicode[konami_progress]) then konami_progress = konami_progress + 1 if konami_progress > #konamicode then cheater() konami_progress = 1 end end end count_robotalert() end if game_state == "lose" then results_screen(false) end if game_state == "win" then results_screen(true) end --rect(0,0,18,6,0) --print(updateFPS()) end