`,]']±>Sï}WÿÍu§ðp8·d%qy)6o;]ÉA¦ösï÷ôôô”°ÂVl†3Sï}WÿÍu§ðp8·d%qy)6o;]ÉA¦ösï÷ôôô”°ÂVl†3ä4#îþ"4þÿD"ó/#D4D4#"#"@DD@ °@»«@«ª@  @@@DDÜÌÜÌîíîíÌ<ÃÜí#"îÜ#"Ìî-âíÌÜÌÜíîíîÌÌ̼¬ªª«¬;²¬¬;²¬¬»»¬¬;²¬¼Ì̬«ªªªÜÌÜÌîíîíÌ<ÂÜí>âîÜÌÜÌî-âíÌÜÌÜíîíîÌÌ̼¬ªª«¬³;¬¬3#¬¬#"¬¬+²¬¼Ì̬«ªªª "" "" , , ""ÌÌÀÌÌ ÌüÏÌÌû¿ÌÌüÏÌÀÌÌ ð À À ™™À�™™ À, Ì$BÌ`'r ""2#2#2#2# ""320##322"#,Ã"2<Â""" "ff`ff`k¶`k¶|gvÇ|Ç|ÇÀÌÌ ÌÌ@ÄôDD@DDD B$" "ÌÌÀÌDÀLDÀ Ì»ÀÌ» ÌÌ»»»»ªª°»ª »ª° °ÌÌ vvvvvvvvvvvv333##33""!3323#2#2#2q#v"bv0""#3333#3#6#6qvvg&bv0""##3333#!3#!6#!6!v2g&"#°»» ° @° D4° 43° 0° °°»» ÜÌÜÌîíîíÌÓ<Üí3#îÜ#"Ìî-âíÌÜÌÜíîíîUUPUUP\ÅPUUUUUU@ÄôDD@Ddw BV"`w€ˆˆü|wÿÿü ÿÿüüðÿü Ì ÀÌ@DÿDLÿÿÄLÿÿÄDÿÿ@Dÿ""#!3323#!2#!2#!2!"2!""#""#!3323#!2#!2#!2!#"""""#!3323#!2#!2#!2!""!""ÀÌLÌL43ÌL43@4#4#0Ì À\ÌÌÌeÌÌ\fÀ\eÀ\eÌeff\fffe`fËÌ̼º»»«­ªªúþÿÿÿÝÝÝíýÿÿþíÝÝýþÿÿÿ°ÌÌ ËÌ̼º»»«­ªªúþÿÿÿþîîïÝÝþÞÝíÿÞíþÿÞíþÿÞþÿÿíÿÿþþîîËÐîîíÝÝþÝÝíÿÝíþÿÝíþÿÝþÿÿíÿÿþ¼îîËÐîîííÝÝþÝÝíïÝíþïÝíþïÝþÿïíÿÿÞ¼îîíÿÿÿ§g§¦ªjggjjwzvf§ª§g§¦ªjggjjwzvf§ªªªªªªªvªjj§ªvf§ª§g§¦ªjggjjwzvf§ªÿÿðÿÿÿò/ÿÿò/ÿÿò/ÿÿò/ÿðÿÿÿÿªªªª*"ª""¢qÂ,‡Â,‡+"«qº»ªªªªª0""##3333#!3#!3#!3!#"""#!3323#!2#!2#!2!""""!3323#2#2#2"ÌÌÀíÞÀÀÀÀÀÍÜîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªªªÊªº«¬ª»Ëjº»¬jªÊ§jª¬ªzʪª§¬fvª À À˼˼»»»»º«º«ªªªªªªªªªªªªªªªªªÂ,ª*""¢,Â,Â,""Â*ôô¢ªôôªªDDªªªªªªUUªªªeªªZeªªZ¦ªªªªªªZ¦ªªj¦ªª33ª:OO£:OO£ª33ªªj¦ªªj¦ªfj¦fªffªªªªªªªªªªÊ¬ªª¬ÊªÊʪ«Êªª«ª«ºªªº«ª0""#3333#3#3#3#îîîîÿÿÿÿàîÿàîþðÀüÏ ÀüÏ ðÏüðÏüððÿàÿÿàÿÝÝíîíîþÿÝÝÝííîîþíîîþþÿÿÿÝíîþîþÿÿÝÝÝííîîþíîîþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌUUUUUUUUUUUUUUUUUUUUUUUUffffªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÀÌÌÌÌUUUÌUUUÌUUUÌUUUÌUUUÌUUU`fffÌÌÌ UUUfUUUfUUUfUUUfUUUfUUUffffªªªª:£:£32##""#"""¡ª!ªª¡ª*""¢¢ªª*¢ªª*¢ªª*¢ªª*¢ªª*¢ªª**""¢wwwwffffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`fwwUefÌ\UÌ\UÌ\UÌ\UÌ\UÌ\UwwÿfvwUefUefUefUefUefUefÌÌÌÌLDDLLÌÌLLÌÌLLÌÌLLÌÌLÌÌÌLLDDDÌÌÌ̼»»¼¼Ì̼¼Ì̼¼Ì̼¼Ì̼ÌÌ̼¼»»»!""!!!!!!!""/""òòÿÿ/òÿÿ/òÿÿ/òÿÿ/òÿÿ/òÿÿ//""òÀüÏ ÀüÏ ðÏüðÏüðàà33#"#"333##""#""3#""333##""#""ÌUUÌUUÌUUÌUUÌUUÌUUÌUUÌUUUUfUUfUUfUUfUUfUUfUUfUUfÌ\UÌ\UÌ\UÌ\UÌ\UÌ\UÌ\UÌ\UUefUefUefUefUefUefUefUef,""ÂÂÌÌ,ÂÌÌ,ÂÌÌ,ÂÌÌ,ÂÌÌ,ÂÌÌ,,""ÂÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÀÌ» À¼» cUUerffvrwwwrr2rq!#2""#VUU6gff'ww//r!rrq!#2""#ÍÌÌ̾Ì̼®»»«ÞªªêÞíþïÞþÿïíÿÿÞþîîíÌÌÌÜËÌÌ뺻»ê®ªªïÞíþïÞþÿïíÿÿÞþîîí ""      ""°ÌÌ ÌÌÌÌvvvvvvvvgffvþ  """ÿOOOOôD@Dÿ�’’,$$ "  """ÿOOOOôD@Dÿ�’’ ,$$ "  """ÿOOOOôD@Dÿ�’’ Ä$ " Ì"Ì"O"ôD@"ÿ�"’ $$ " ª ªÊªÊϯ�ÌÌÌ�)’™!ªª ª¬  üü ÉÌÌœ™)’™  """ÿOOOOôD@Dÿ�’’ ,$$ "  """ÿOOOOôD@Dÿ�’’,$$ "  """ÿOOOOôD@Dÿ�’’,$$ "  """ÿOOOOôD@Dÿ�’’ $$ "!2#!C4!C42#!° »»°»» ªº«ª° °   ° »«»« ºª ° °   ° ° °   ° °   ° »«»« ºª ° °   Ì,"""OOOOôD@ÿOœ’’ $$ "  """ÿOOOOôD@Dÿ ))œ”” � ™  """ÿOOOOôD@Dÿ )) œ””� ™  """ÿOOOOôD@Dÿ ))�Ä”� ™ Ì"Ì"O"ôD@"ÿ ")�””� ™� �Y¥ª ªÊª�Êϯ�ÌÌÌ@”ñ™™Pªª ª¬ ©üü ÉÌÌ I  """ÿOOOOôD@Dÿ )) œ””� ™  """ÿOOOOôD@Dÿ ))œ”” � ™  """ÿOOOOôD@Dÿ ))œ”” � ™  """ÿOOOOôD@Dÿ )) �”” � ™Æl`fflÆlÆlffÆ`ôôôôDDlf`ffÆlÆfffÆf`OOOODDÆl`fflÆlÆlffÆ`DDDDDDfÆ`ffflÆlflff`ôôôôDD`ÌlfffOOOOôD@ÿOœ–– `dd`f`Æ fffÿôDODOD@ôÿ�––ldd `f`Æ fffÿôDODOD@ôÿ�–– ldd`f`Æ fffÿôDODOD@ôÿ�––`Äd`f`ÌfÌfOfOD@fÿ�f–`dd`f  53S3Ã3ÃÏ? ÌÌÌ� ˜""R33%03<0üüÂÌÌ,� €‰`Æ fffÿôDODOD@ôÿ�–– ldd`f`Æ fffÿôDODOD@ôÿ�––ldd `f`Æ fffÿôDODOD@ôÿ�––ldd `f 53S 33Ì3ÌÏÌÌÌ ’)"˜ 320##322"#,Ã"2<Â""" "320##322"#,Ã"2<Â""" "320##3<Â"#, "000###   `Æ fffÿôDODOD@ôÿ`iiœ”” � ™`Æ fffÿôDODOD@ôÿ`ii œ””� ™`Æ fffÿôDODOD@ôÿ`ii�Ä”� ™`ÌfÌfOfOD@fÿ`fi�””� ™033333Ã? 3ÌÌ R%è 3303303ü2ÃÌ "R€Ž`Æ fffÿôDODOD@ôÿ`ii œ””� ™`Æ fffÿôDODOD@ôÿ`iiœ”” � ™`Æ fffÿôDODOD@ôÿ`iiœ”” � ™0333333Ã3ÃÌR%è.ff`ff`k¶`k¶|gvÇ|Ç|ÇÀÌÌ ÌÌff`ff`k¶|gvÇ|Ç|ÇÀÌÌ ÌÌff|gvÇ|Ç|ÇÀÌÌ ÌÌpgvpgv`k¶lk¶ÆÌÌÌÌÀÌÌ ÌÌwffwwffw`k¶`k¶lffÆÌÌÌÌÀÌÌ ÌÌ`ffff`ff`k¶wk¶wwffwff "" /ò /ò ""DD "" ò" ò" ""DD "" ò" ò" ""DD "" Â" Â" ""DD "" ò" ò" ""DD "" ò" ò" ""DD"" /òDDÀ ÌÌÌÀÌÜÍÌÌÍÌ ÀÌÌÌÌÌÌÌ ÌÌÌÀ ÌÌ ÌÌÀÜÍÌÀÍÌÌÌÌÌ ÌÌÌ ÌÌÀÌÌÀpgfgUvpVÌegVÌegUvffppffgUvgVÌepVÌegUvpgf`ff¶k¶kwffwÌÌÀÌÌ ÌüÏÌÌû¿ÌÌüÏÌÀÌÌ ðÌ ÀÌÌÌÌÌÿÌÌÌ¿ÌÌÌüÀÌÌ ðÌ ÀÌÌÌÌÌÿÌÌÌ¿ÌÌÌüÀÌÌ ðÀ ÌÌÀÌÌÿÌÌÌ¿ÌÌÌüÌÌÌ ÀÌðÌÀÌ ÌÌÌÌÌÌÿÌÌÌ¿ÀÌÌüÌ ðÌÀÌ ÌÌÌÌÌÌÿÌÌÌ¿ÀÌÌüÌ ðððððÿ¿ðÿÿÿÿÿDDDD@ÏDDÿDDD@"BD"""D@DDDÿDDDD$"D""" À À ™™À�™™ À, Ì$BÌ`'rÀÀÀ™É�™™ �™É"ÌÌÌB`ff'ÀÀÀ™É�™™ �™É"ÌÌÌB`ff' �ÉÀ™™ �™É"�™ÌBÌÌf'`fÀœ À™™ �™™ ÌÌÉ"`fÌBf'Àœ À™™ �™™ ÌÌÉ"`fÌBf'`fvBÌÌÌ"�™É DD@DDDDDDDD BD""B ""@ÏDDÿDDDDDDDDD$$""""@DDDDDDDDBD "B"" DDDDDDDDD$$" " "  ""2#2#2#2# "" """""#"""# "" """""#"""# "" """""#"""# "" """""#"""# "" """""#"""# "" """"2#"""" "À Ì»ÀÌ» ̼º»»Ë«ª°»ª »ª° À Ì»À¼º Ì  »» °ª°Ë« »ª° À ¼ºÀ   ¼À ºË° «° ° Ë«° °  °À Ì»  »ª°À° °À À Ì»ÀÌ» °»ª »ª°      UUPUUP\ÅPUUUUUUUUPUUPÅU PUUUUUUPUUUUU\ÅUUUPUUPUUUUPUUP\ÅPUUPUUUUPPUPUUPUUP\ÅPUUUUPPPUPUUPUUP\ÅPUUUUÅUU\UUUUÌ À\ÌÌÌeÌÌ\fÀleÀ\lÌeff\fffe`fÌ À\ÌÌÌeÌfVfÀÆÅÀVÆÌÅÌf\fffe`fÌ À\lffelÌ\l`Ìe `\f lefl\ÌÌle`ff`VÆÌÌÅÆÌ\ÆÀÌeÀ\fÆefÆVffÆÅ ÀÌðÿïþððÞíÿïÍÜþïÍÜþÿÞíïþðÿðÿðÿîîÿïÞíþàÍÜþïÍÜïÞíþÿîîÿðÿÀÌÌ ðÿDÿÿÄDÿÿÄLÿÿDLðÿDÀÌ ðÿDÿÿÄDÿÿÄLÿÿDLðÿDÌ ÀÌDÿÿÄDÿÿÄLÿÿDLðÿDÀÌ ðÿDÿÿÄDÿÿÄLÿÿDLðÿDðÿDÿÿÄLÿüDDÿÌDDðÌL" ""x!Â,x!Â,°"²» "p!""€'Â,€'Â,p±"²» "'""(Â,(Â,·"²» "p!""€'Â,€'Â,p±"²» " ""!""x!Â,°»»€ˆ€ˆ€wˆˆðððÿÏÏwÏÏwðððÿÏÏwÏÏðüüðüüüÿüüüðüüüðüüÿÿÿÿÿÿÿÿÿûÿ ÿûÿ ðüüðüüüÿüüüðüüüðüüÿÏÏÿÿÿÿÿÿÿÿÿÿÿðÿˆŒðˆøŒ€üüÏÏÿÿˆÿÿˆÿÿøÿwˆ€ˆ€€w¼¿ ÏÏðÿˆððˆÿÿÿðÿÿÿÿÿðÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò/ÿò/ÿÿò/ÿÿÿÿÿðÿÿÿÿÿÿÿÿðÿÿÿðÿÿÿÿÿÿÿÿÿÿÿò/ÿò/ÿò/ÿUeP`P```p`fvÿÿÿÿÿÿÿÿðÿÿÿðÿÿÿÿÿÿðÿÿÿÿÿò/ÿÿò/ÿÿò/ÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿðÿÿÿÿÿÿÿÿÿðÿÿÿÿÿò/ÿò/ÿò/ÿÿÿÿÿÿÿÿÿ03#003#0""0"!0032##""#""#"""!003#0""0"! ªª  Ê«  »ª  ªª  ªª  ªª  ªª  ªªª ºÌ« Ë«ª «ªª «ªª ªªª ªªªªªª ªªª ªªª ªªª ªªª ªªª ªªª ppwwpwpwwwww``ff`f`fffff€ˆˆˆˆ™™™˜gff˜fUU˜Vef˜Ve™˜Vef˜VUUˆˆˆ™™™ˆffv‰UUf‰ffv‰™™™‰ffv‰UUf‰ÝÝÝÝíîîîþÿÿÿààààààààààÝÝÝíîîîþÿÿÿÿàààààààààà@DDDLDDDOODÄÏÏDÄÌÌLÀÌÌÀÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÀÌÌÌÀÌÌÌÌ ÌÌÌ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ÌÌ  ªª  ªª  ªª  ªª  ªš  š™  ªª  ªªª ªªª ªªª ªªª ªªª ªªª ªªªªªª ªªª ªªš ªªš ªš™ š™™ ªªª pwwpwwwwwwwwpwwwpwwwwwwwwwwwppwwpwpwwwww`ff`ffffffff`fff`fffffffffff``ff`f`fffff˜VUU˜Vef˜Ve™˜Vef˜fUU˜gffˆ™™™€ˆˆˆUUf‰ffv‰™™™‰ffv‰UUf‰ffv‰™™™ˆˆˆˆààààààààààÝÝÝÝíîîîþÿÿÿààààààààààÝÝÝíîîîþÿÿÿÿ3£:3£:0À À €€€ðÿÀÌÌÀÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÀÌÌÌÀÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ÌÌÌ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ÌÌ  ªª  Ê«  »ª  ªš  š™  ªª  ªªª ºÌ« Ë«ª ªªª ªªª ªªªªªª ªªª ªªš ªš™ š™™ ªªª wwwwwwwwwwwwwwwwwwwwwwppwwpwwwwwwwpwwpwwwpffffffffffffffffffffff``ff`fffffff`ff`fff`€ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýý‘ýýýýŠ€€ýýýýýýýý‘‘ýý€Š€€€ýý‹€�€‹ýý‹——‹€‚€ýý‘ýý�€€‘ýýdewef‘“““ýý€€€�€€€detuvewef‹ýý�€DEEEF�€€‹€‚€ýý€€‘DEEEEEEEF�,WTUUUUVTUUVTU?n?WTUUUVEEEEEEEEEEEEEEEEEEEEEEEEEEE…%%%ƒEEFDEEEEEEEEEEEEEEEFLLLLDEEEEEEEEEEEEEF\\\DEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFýýDEEEFL\L\LDEFNNNTUUUUUUUVTUUUU?>??$%%%%%%%&$7%%%%%%&deeeeef,,,,detTUU??_ϾSPQQQQQQQQQQQQQQQQQQQQQQQQQQQ=QQQQQQQQQQQQQQQQQQQRPQQQQQRPQQQQQQQQQQQQQQ%%%%7%%%%&$%%%%%%%&$%7%%7%%%%%%%7%%%&TUU?o?>?o?_SPRDEEEEEEEEEEEEEEEF.n/$%%%%%%%%%EEEEEEEFLLLDEEEEEEEF'''T?????_ŒŒŒŽŒýý-----------ŒŒŒŒŒŒŒŒýýøøøøNNNýý�---ž----------ýýžž‘‘N�N£�N““ýý-------------‘‘‘žýUUUꌌŒŒŒŒŒŒŒŒŒNNNŒŸŒŒŸŒŒŒŒŒžýý----------------ÁÁ-----------ýUUUUêNNNýýŒŒøø---ž---ÑÑ------------ýUUUUV  `basb‘‘N‘N‘Nýýøøøø------ÑÑÑÑѳÑÑÑÑ----æÙÙÚŒ�Œ]]@üûAüPQRPQ=QQQRÒÐÓMMMÒÐÓMMMÒÐÓPQRPQ=QQQR]]]]SPQQRPýøøøø--------ÑÑÑÑÑÑÑÑÑÑ---- 3!!!!!!æÙÙÚøøøøoo 3!!!!!!"PQQQQQQQQRâàãâàãâàãPQQQQQQQQR 3"O_ !"O_ 3"PQQQQQýÒÓMMÒÓ££££---øøž------------ÁÁ---------ÑÑ---- !!!!!3!æÙÙÙÚ`pqrb`sbNNNN`asab !!!!!3!"PQQ=QQQRPRòáóòáóòáóPQQ=QQQRPR !"NN !"NN !"PQQ=QQý 3!!!!!!!!"âãâã "#### "-------------------ÑÑÑÑÑÑÑѳÑÑÑÑ---- !!!!!!!VTUUUêûAAAüûAüM]M]MM]M]M@AAAB !!3!!!!"PQQQQQQ=QRÒÐÓÒÐÓÒÐÓPQQQQQQ=QR !"/. 3"/. !"PQQQQQ=QRPQR !!!!!!!3!"òóòó "#### "------------------------------ÑÑÑÑÑÑÑÑÑÑÑÑÑ---- !!!!!!!UUUUw 00 ð!ò!""##$$%%&&''(())**++,,--../t`0 „0  ƒ  @/ Œ …0 0`ohkPS@@00  ðÐ ° � Œd0 ‹ … €ŒPP_PP_PP_P P _PP_P P ____V V ____[ [ _ t@  ã 22223456789:;< = >??????????????…  00€P€P`P````````````````````````````€€€€€€€€€€€€€€€€€€€€€€€€€€€€€swpppqrstvy{~P@`PPPPPPPPPPPPPPPPPPPPPPPPPPt00112233445566778899::;;<<==>?`` ``````````````````````````t@  @ @  @„0```` ```````````abcdefghijklmno @```` ```````````abcdefghijklmno@``````````````````````````````c0�0�258?000000000000000000000000Œ0?0000000000000000000000000000 �#€|€|€›€€|€›€|€€|€€›€|€€|€€|€›€€|€›€|€›€|€|€›€€|€t€s€ €t €t€}€€}€É}€À}€€É}€€É}€Å}€Å}€}€}À€}€€}€É}€À}€€É}€€ É}€É}€Å}€}€À]€€€’€€€’€€’€€’€€’€€’€€’€€’€ €’€€ €’€ €’€ €’€ €’€ €’€ €’€ €’€€|€€|€€›€|€|€›€|€›€€ €r€’€’ €’€²€² €²€€²€€ €R€r€r €r€’€R €R€R€R€r €r€r€’ €’€’ €P €P€€p€P€€\ €\€|€z €|€œ€ €|€€\ €\€|€z €|€œ€ €|€ €\€\€|€z €Z €z €Z €z €Z €z €Z €z€�€€�€�€�€�€�€ €� €� €�€�€�€€�€� €�€€�€€�€€€�€}€€�€€€|€|€›€€|€›€|€€|€€›€|€€|€€|€›€€|€›€|€›€|€|€›€€|€|€|€›€|€›€|€|€›€|€|€|€›€|€›€|€›€|€|€›€|€›€›€�€�€�€�€�€€�€�€�€�€�€�€�€�€�€�€� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €�€�€�€�€�€�€�€�€�€¯€¯€¯€¯€¯€¯€¯€¯€¯€¯€¯€¯€¯€¯€¯€¯ €0 €0 €0 €0 €0 €0 €0 €0 €0€ €0 €0 €0 €0 €0 €0 €0€€ €N€€ €N€€€ €N€ €N€ €N€ €N€ €N€€n€ €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0€€ €N€€ €N€€€ €N€ €N€ €N€ €N€ €N€ €N€ €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0€€ €N€€ €N€€€ €N€ €N€ €N€ €N€ €N€€N€ €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0 €0€€ €N€€ €N€€€ €N€ €N€ €N€ €N€€n€ €N€€�€�€� €�€�€�€� €�€�€�€�€�€� €�€�€�€�€�€�€m€�€�€�€�€�€�€�€m€ €�€�€�€�€�€�€�€�€m€ €�€�€�€�€�€� €�€�€ €m€ € € €Y€y€y€y€Y€y€Y€Y€€€ €Y€y €y€y €Y€y €Y€Y€€€€™ €™€™ €™€™ €™€™€y€™ €™€™ €™€™ €™€™ €y€|€€|€€€€›€€€€|€|€€|€€€›€€€€|€€€€|€€€›€|€|€›€€|€› €n€€€n€n€n €n€€n€Ž€n €n€€€n€n€n €n€€n€Ž€n €n€n €n€n€n€n €n€n €n€n€Ž€n€n€n €n€n €n€n €n€n€n€n€Ž€n€Ž€n€Ž€n€n€n €n€n €n€N €n€N€n€N €n€N €n€N€Ž€N€n€N €n€N €n €N €n €N €n €N€n €N€Ž €N€Ž €N€n €N €n €N €K €K €K €K€K€K€K€K€|€€|€€€€›€€€€|€|€€|€€€|€€€€›€€|€€|€€›€ €�€ €�€ € €�€ € € €�€ €�€ €�€ € € €�€ € € €�€ €�€ €�€ €�€ € €�€ € € €�€ €�€ €�€ € € €�€ € € €�€ €�€ €�€ €�€ €�€ €�€ €�€ € € €�€ €�€ € € € € €�€ € € €­€ €­€ €­€ €­€ € €­€ € € €­€ €­€ € €­€ €­€ € € € € €­€ €�1�Á�Á�@ÁP�@ÁP�@ÁP�@ÁPö H²  Ó ÓKã=6*8 then logoy=6*8 logobol=false sfx(2) else logoy=logoy+3 end end if logoy==6*8 then if scoretimer==0 then print("Erick Soto",(18-string.len("Erick Soto"))*8,11*8,5,false,2) if logobol2==true then logobol2=false sfx(3) end else scoretimer=scoretimer-1 end end if logobol2==false then if scoretimer2==0 then logo=false title=true scoretimer=30 else scoretimer2=scoretimer2-1 end end end if title then music() print("Amula",(16-string.len("Amula"))*8,3*8,12,false,2) print("Sisters",(17-string.len("Sisters"))*8,5*8,10,false,2) spr(480,4*16,6.5*8,0,1,0,0,2,2) print("2024 Erick Soto",5.1*16,7.5*8,5,false,1) print("sister: " .. playername,5.5*16,9*8,12,false,1) if pmem(0)>0 then print("(Z) start to Level " .. pmem(0),(29-string.len("(Z) start to Level " .. pmem(0)))*8,11*8,4,false,1) end print("(X) start new Level",(27.5-string.len("(X) start new Level"))*8,12*8,4,false,1) print("(A) Switch Sisters",(27-string.len("(A) Switch Sisters"))*8,13*8,4,false,1) if scoretimer==0 then if btn(4) and pmem(0)>0 then title=false musicbol=false if pmem(1)==0 then pmem(1,3) end if pmem(5)<=0 then pmem(5,1) end next=true scoretimer=30 end if btn(5) then title=false musicbol=false pmem(0,1) pmem(1,3) pmem(2,0) pmem(3,0) pmem(4,0) pmem(5,1) next=true scoretimer=30 end else scoretimer=scoretimer-1 end if btn(6) then if playertypebol==true then playertypebol=false playertype=playertype+1 if playertype>2 then playertype=1 end end else playertypebol=true end end if credit then if musicbol==true and credit then music(5,0,0,false,false,160,6) musicbol=false end t=t+1 if t%4==0 then heartfrm=heartfrm+1 end if heartfrm<0 or heartfrm>3 then heartfrm=0 end spr(heart+heartfrm,14*8,4*8,0,1,0,0,1,1) spr(485,15*8,5*8,0,1,0,0,1,2) if playertype==1 then spr(256,13*8,6*8,0,1,0,0,1,1) elseif playertype==2 then spr(288,13*8,6*8,0,1,0,0,1,1) end print("Thank you for Gems " .. playername .. "!",7*8,8*8,12) if scoretimer==0 then print("(Z) Go back to Title",8*8,9*8,12) if btn(4) then musicbol=false credit=false title=true scoretimer=30 end else scoretimer=scoretimer-1 end end if gameover then if playertype==1 then spr(256,13*8,5.7*8,0,1,0,0,1,1) elseif playertype==2 then spr(288,13*8,5.7*8,0,1,0,0,1,1) end pmem(0,1) pmem(2,0) pmem(3,0) pmem(4,0) pmem(5,1) spr(482,12.5*8,5*8,0,1,0,0,2,2) print("Game Over " .. playername .. "!",7*8,8*8,12) end if game then if lvl==4 or lvl==7 or lvl==8 or lvl==10 or lvl==11 or lvl==12 or lvl==14 or lvl==15 or lvl==16 then clouds(false) else clouds(true) end if start==false then if p.y>(levely+15.8)*8 or timer==0 then if p.hp>0 then killplayer() p.hp=p.hp-1 sfx(16) end end end backgrounds() map((p.x//240)*30,(p.y//136)*17,30,17,0,0,0) print("bonus:" .. bonus,0,0,4) print("lives:" .. lives,0,1*8,4) print("score:" .. score,7*8,0,4) print("timer:" .. timer,7*8,1*8,4) print(playername .. "'s",16*8,0,4) print("health:" .. p.hp,16*8,1*8,4) if musicbol==true and game then if lvlbgm==0 or lvlbgm==3 then music(gamemusic,0,0,true,false,140,6) elseif lvlbgm==2 then music(gamemusic,0,0,true,false,120,8) elseif lvlbgm==4 then music(gamemusic,0,0,true,false,150,6) end musicbol=false end if start==true then p.x,p.y=playerstartx,playerstarty start=false end if stop==true then for i, e in pairs(enemies) do e.x,e.y = e.storex,e.storey end stop=false end if timer>0 then if timercool==0 then timer=timer-1 timercool=30 else timercool=timercool-1 end end controls() update() draw() t=t+1 if upgradetimer>0 then upgraded=1 p.invuln=1 upgradetimer=upgradetimer-0.1 else upgraded=0 upgradetimer=0 end if pmem(5)>10 then pmem(5,10) end end if result then print("Level " .. lvl .. " Clear",10*8,8*8,12) print("timer:" .. timer,7.5*8,10*8,12) print("=",14*8,10*8,12) print("score:" .. score,15*8,10*8,12) if musicbol==true and result then music(gamemusic,0,0,false,false,160,6) musicbol=false end if scoretimer>0 then scoretimer=scoretimer-1 end if timer>0 and scoretimer==0 then if timercool==0 then if timer>99 then timer=timer-100 pmem(2,pmem(2)+1800) elseif timer>9 then timer=timer-10 pmem(2,pmem(2)+600) else timer=timer-1 pmem(2,pmem(2)+150) end sfx(1,45) timercool=3 else timercool=timercool-1 end end if timer==0 then if scoretimer2>0 then scoretimer2=scoretimer2-1 end if scoretimer2==0 then result=false if pmem(0)<16 then pmem(0,pmem(0)+1) next=true musicbol=false scoretimer=30 else credit=true musicbol=true scoretimer=120 end end end end if next then p.dead=false lvl=pmem(0) print("Get Ready " .. playername,10*8,8*8,12) print("Lvl " .. lvl,10*8,10*8,12) if scoretimer>0 then scoretimer=scoretimer-1 end if scoretimer==0 then if lvl==1 then levelx=0 levely=0 lvlbd=1 lvlbg=1 lvlbgm=0 elseif lvl==2 then levelx=120 levely=0 lvlbd=2 lvlbg=1 lvlbgm=0 elseif lvl==3 then levelx=0 levely=17 lvlbd=3 lvlbg=0 lvlbgm=2 elseif lvl==4 then levelx=120 levely=17 lvlbd=4 lvlbg=0 lvlbgm=3 elseif lvl==5 then levelx=0 levely=17*2 lvlbd=2 lvlbg=0 lvlbgm=0 elseif lvl==6 then levelx=120 levely=17*2 lvlbd=1 lvlbg=2 lvlbgm=0 elseif lvl==7 then levelx=0 levely=17*3 lvlbd=5 lvlbg=0 lvlbgm=4 elseif lvl==8 then levelx=120 levely=17*3 lvlbd=4 lvlbg=0 lvlbgm=3 elseif lvl==9 then levelx=0 levely=17*4 lvlbd=1 lvlbg=1 lvlbgm=0 elseif lvl==10 then levelx=120 levely=17*4 lvlbd=6 lvlbg=0 lvlbgm=2 elseif lvl==11 then levelx=0 levely=17*5 lvlbd=7 lvlbg=0 lvlbgm=4 elseif lvl==12 then levelx=120 levely=17*5 lvlbd=5 lvlbg=0 lvlbgm=3 elseif lvl==13 then levelx=0 levely=17*6 lvlbd=8 lvlbg=0 lvlbgm=0 elseif lvl==14 then levelx=120 levely=17*6 lvlbd=9 lvlbg=0 lvlbgm=0 elseif lvl==15 then levelx=0 levely=17*7 lvlbd=10 lvlbg=0 lvlbgm=0 elseif lvl==16 then levelx=120 levely=17*7 lvlbd=5 lvlbg=0 lvlbgm=3 end playerstartx,playerstarty=(2+levelx)*8,(12+levely)*8 start=true if pmem(5)<1 then pmem(5,1) end p.invuln=0 p.vx=0 p.vy=0 next=false gamemusic=lvlbgm timer=250 musicbol=true game=true end end end function add_enemy(x_,y_,mv_,type_,pt_,idx_,spw_,sph_,w_,h_,hp_) table.insert(enemies, { x=x_, y=y_, vx=0, vy=0, mv=mv_, mvup=-1.2, frm=0, flp=0, w=w_, h=h_, type=type_, pt=pt_, idx=idx_, spw=spw_, sph=sph_, hp=hp_, invuln=0, cool=0, cool2=0, wet=false, storex=x_, storey=y_ }) end function add_item(x_,y_,type_,pt_,idx_) table.insert(items, { x=x_, y=y_, vx=0, vy=0, mv=0.05, mvup=-1.2, frm=0, flp=0, w=7, h=7, type=type_, pt=pt_, idx=idx_, wet=false }) end function controls() if p.hp>0 then if btn(1) then c_down(p) end if btn(4) then c_jump(p) end if btn(2) then c_left(p) end if btn(3) then c_right(p) end if btn(5) and powershot>0 then c_shot(p) end end end function check_collision(a, b) return a.x < b.x + b.w and a.x + a.w > b.x and a.y < b.y + b.h and a.y + a.h > b.y end function check_stomp_collision(a, b) return a.x < b.x + b.w and a.x + a.w > b.x and a.y < b.y + b.h - 8 and a.y + a.h > b.y end function update_fireshots() for i = #fire, 1, -1 do local f = fire[i] f.t=4 -- Move the fire particle f.x = f.x + f.vx f.y = f.y + f.vy -- Check for collision with enemies for j = #enemies, 1, -1 do local e = enemies[j] if check_collision(f, e) then sfx(13) if e.invuln==0 then e.hp=e.hp-1 e.invuln=5 end del(fire, i) break end end -- Check if the fire particle goes off-screen or if its timer runs out if f.t <= 0 then del(fire, i) else f.t = f.t - 1 end end end function draw() for i,v in pairs(items) do if onscreen(v) then spr(v.idx+v.frm,v.x%240,v.y%136,0,1,0) end end --draw the particles for i,d in pairs(dust) do if onscreen(d) then circ(d.x%240,d.y%136,d.r,d.c) end end for i,d in pairs(gparticle) do if onscreen(d) then circ(d.x%240,d.y%136,d.r,15) end end for i,d in pairs(brickpiece) do if onscreen(d) then pix(d.x%240,d.y%136,d.c) end end for i,d in pairs(scoretext) do if onscreen(d) then print(d.text,(d.x-string.len(d.text))%240,d.y%136,12,false,1,true) end end for i,d in pairs(coin) do if onscreen(d) then spr(4,d.x%240,d.y%136-6,0) end end for i,d in pairs(coin2) do if onscreen(d) then spr(8,d.x%240,d.y%136-6,0) end end for i,d in pairs(fire) do if onscreen(d) then spr(266,d.x%240,d.y%136-6,0) end end for i,d in pairs(pcorpse) do if onscreen(d) then if playertype==1 then spr(271,d.x%240,d.y%136-6,0) elseif playertype==2 then spr(287,d.x%240,d.y%136-6,0) end end end for i,d in pairs(corpse) do if onscreen(d) then spr(d.idx,d.x%240,d.y%136-6,0) end end for i,d in pairs(corpseanim) do if onscreen(d) then spr(d.idx+d.frm,d.x%240,d.y%136-6,0) end end for i,d in pairs(corpsefall) do if onscreen(d) then spr(d.idx,d.x%240,d.y%136-6,0) end end for i,d in pairs(corpsebig) do if onscreen(d) then spr(d.idx,d.x%240,d.y%136-6,0,1,d.flip,0,2,1) end end for i,d in pairs(corpsebig2) do if onscreen(d) then spr(d.idx,d.x%240,d.y%136-6,0,1,d.flip,0,2,2) end end for i,d in pairs(blockhit) do if onscreen(d) then rect(d.x%240,d.y%136,8,8,12) end end if p.hp>0 then --draw the player spr(p.idx+p.frm,p.x%240,p.y%136,0,1,p.flp) end for i,e in pairs(enemies) do if onscreen(e) then spr(e.idx+e.frm,e.x%240,e.y%136,0,1,e.flp,0,e.spw,e.sph) end end end ----- UPDATES ------------------------ function update() update_player() update_enemies() update_items() update_fireshots() update_tiles() update_shot_timer() particles() if bonus>99 then bonus=0 pmem(1,pmem(1)+1) sfx(14) end end function update_player() if pmem(5)>0 then --applies physics to the player if p.wet==false then py(p,frict,1,grav) else py(p,frict,.85,grav-.025) end --applies collision to the player if collide(p,7,7) then new_dust(p.x+4,p.y+7,2.5) end if upgraded==1 then if p.wet then p.mvup=-1.7 else p.mvup=-2.7 end p.mv=.15 p.shot_sec=15 else if p.wet then p.mvup=-1.5 else p.mvup=-2.25 end p.mv=.1 p.shot_sec=30 end if playertype==1 then if power==1 then p.idx=272 else p.idx=256 end elseif playertype==2 then if power==1 then p.idx=304 else p.idx=288 end end --moves the player move(p) --checks if the player is falling or going up checkanim(p) --animates the prayer p.anim(p) --reset all variables p.x,p.y=p.x%(240*8),p.y%(136*8) p.down=false p.anim=a_idle end end function update_shot_timer() if p.shot_fired then p.shot_timer = p.shot_timer - 1 if p.shot_timer <= 0 then p.shot_fired = false end end end function update_enemies() for i, e in pairs(enemies) do if e.y>(levely+15.8)*8 then del(enemies, i) end if e.type=="enemy" or e.type=="sheep" or e.type=="pricky" or e.type=="roach" or e.type=="ball" or e.type=="bee" or (e.type=="fish" and e.wet==true) then if fget(mget((e.x + 8) // 8, (e.y + 4) // 8), 0) or fget(mget((e.x + 8) // 8, (e.y + 3) // 8), 5) then e.pt=-1 e.vx=-0.5 elseif fget(mget((e.x - 1) // 8, (e.y + 4) // 8), 0) or fget(mget((e.x - 1) // 8, (e.y + 3) // 8), 5) then e.pt=1 e.vx=0.5 end -- Simple patrol logic: move left and right based on patrol direction if e.pt==1 then c_right(e) elseif e.pt==-1 then -- Assume 240 is the screen width c_left(e) end end if e.type=="sheep" or e.type=="roach" then if not ( fget(mget((e.x + 6) // 8, (e.y + 8) // 8), 0) or fget(mget((e.x + 6) // 8, (e.y + 8) // 8), 6) or fget(mget((e.x + 6) // 8, (e.y + 4) // 8), 5) ) then e.pt=-1 e.vx=-0.5 elseif not ( fget(mget((e.x + 1) // 8, (e.y + 8) // 8), 0) or fget(mget((e.x + 1) // 8, (e.y + 8) // 8), 6) or fget(mget((e.x + 1) // 8, (e.y + 4) // 8), 5) ) then e.pt=1 e.vx=0.5 end end if e.type=="enemy" or e.type=="sheep" or e.type=="ball" or e.type=="saucer" or e.type=="boss" or e.type=="roach" or e.type=="slime" or e.type=="bee" or e.type=="butterfly" or (e.type=="fish" and e.wet==false) or e.type=="bossfire" or e.type=="nightmare" then if p.hp>0 then if check_stomp_collision(p, e) then if btn(4) then if upgraded==1 then p.vy=-2.7 else p.vy=-2.25 end else p.vy=-1 end sfx(9) if e.invuln==0 then if upgraded==0 then e.hp=e.hp-1 else e.hp=-1 end e.invuln=5 end end end end if e.invuln>0 then e.invuln=e.invuln-1 end if e.hp<0 then if e.type~="efire" then pmem(2,pmem(2)+300) new_scoretext(e.x,e.y,300) end if e.type=="boss" then add_item(e.x+4,e.y+4,"gem1",1,378) end if e.type=="butterfly" then add_item(e.x+4,e.y+4,"gem2",1,394) end if e.type=="bossfire" then add_item(e.x+4,e.y+4,"gem3",1,167) end if e.type=="nightmare" then add_item(e.x+4,e.y+4,"gem4",1,183) end if e.type=="enemy" then new_corpse(e.x,e.y+4,329) elseif e.type=="sheep" then new_corpse(e.x,e.y+4,345) elseif e.type=="pricky" then new_corpse(e.x,e.y+4,361) elseif e.type=="roach" then new_corpse(e.x,e.y+4,377) elseif e.type=="ball" then new_corpseanim(e.x,e.y+4,301) elseif e.type=="saucer" then new_corpsefall(e.x,e.y+4,319) elseif e.type=="slime" then new_corpse(e.x,e.y+8,393) elseif e.type=="fish" then new_corpse(e.x,e.y+4,409) elseif e.type=="bee" then new_corpse(e.x,e.y+4,404) elseif e.type=="boss" or e.type=="bossfire" then new_corpsebig(e.x,e.y+12,350,e.flip) elseif e.type=="butterfly" then new_corpsebig2(e.x,e.y+12,414,e.flip) end del(enemies, i) end if e.type=="saucer" then local a=t/8 e.y=e.y+cos(a*2)/8 if p.x+4>e.x+7 then e.pt=1 elseif p.x+479 then e.vy=-2 e.cool=0 else if e.vy==0 then e.cool=e.cool+1 end end end if e.type=="nightmare" then if p.x+4>e.x+8 then e.flp=0 elseif p.x+4e.x+8 then add_enemy(e.x,e.y+4,.05,"efire",1,398,1,1,7,7,0) elseif p.x+4e.x+7 then e.pt=1 elseif p.x+4e.x+8 then e.flp=0 elseif p.x+40 then e.pt=-1 end e.cool2=0 else e.cool2=e.cool2+1 end if e.pt==1 then e.vx=0.5 elseif e.pt==-1 then e.vx=-0.5 end end if e.type=="bossfire" then if e.cool==40 then if onscreen(e) then sfx(4) end e.cool=0 if p.x+4>e.x+8 then add_enemy(e.x,e.y+4,.05,"efire",1,332,1,1,7,7,0) elseif p.x+4e.x+8 then e.flp=0 elseif p.x+4e.x+8 then add_enemy(e.x,e.y+4,.05,"efire",1,332,1,1,7,7,0) elseif p.x+40 then e.pt=-1 end e.cool2=0 else e.cool2=e.cool2+1 end if e.pt==1 then e.vy=0.5 elseif e.pt==-1 then e.vy=-0.5 end end if e.type=="efire" then if e.pt==1 then e.vx=1 e.flp=0 elseif e.pt==-1 then e.vx=-1 e.flp=1 end if e.cool==200 then e.cool=0 e.hp=-1 else e.cool=e.cool+1 end if fget(mget((e.x - 1) // 8, (e.y + 4) // 8), 0) or fget(mget((e.x - 1) // 8, (e.y + 3) // 8), 5) or fget(mget((e.x + 8) // 8, (e.y + 4) // 8), 0) or fget(mget((e.x + 8) // 8, (e.y + 3) // 8), 5) then e.hp=-1 end end if e.type=="saucer" then py(e, 0.98, 1, 0) elseif e.type=="bee" or e.type=="butterfly" or e.type=="efire" or e.type=="nightmare" then py(e, frict, 1, 0) elseif (e.type=="fish" and e.wet==true) then py(e, frict, 1, 0) else if e.wet==false then py(e, frict, 1, grav) else py(e, frict, 1, grav-.05) end end if e.type=="boss" or e.type=="butterfly" or e.type=="bossfire" or e.type=="nightmare" then collide(e, 15, 15) else collide(e, 7, 7) end move(e) if e.type=="ball" then e.anim = a_walk e.anim(e) elseif e.type=="saucer" then e.anim = a_idle elseif e.type=="sheepegg" or e.type=="efire" then e.anim = a_idle4 e.anim(e) elseif e.type=="bee" or e.type=="fish" then e.anim = a_idle2 e.anim(e) elseif e.type=="boss" or e.type=="butterfly" or e.type=="bossfire" or e.type=="nightmare" then e.anim = a_idle3 e.anim(e) else checkanim(e) e.anim(e) e.anim = a_idle end end end function update_items() for i, v in pairs(items) do if v.y>(levely+15.8)*8 then del(items, i) end if v.type=="strawberry" or v.type=="upgradepower" or v.type=="bubble" then if fget(mget((v.x + 8) // 8, (v.y + 4) // 8), 0) or fget(mget((v.x + 8) // 8, (v.y + 3) // 8), 5) then v.pt=-1 v.vx=-0.5 elseif fget(mget((v.x - 1) // 8, (v.y + 4) // 8), 0) or fget(mget((v.x - 1) // 8, (v.y + 3) // 8), 5) then v.pt=1 v.vx=0.5 end if v.pt==1 then c_right(v) elseif v.pt==-1 then c_left(v) end end if v.type=="clock" then if check_collision(p, v) then pmem(2,pmem(2)+1000) new_scoretext(v.x,v.y,1000) timer=timer+50 sfx(18) del(items, i) end end if v.type=="strawberry" then if check_collision(p, v) then if power==1 then pmem(2,pmem(2)+1500) new_scoretext(v.x,v.y,1500) sfx(10) else pmem(2,pmem(2)+1000) new_scoretext(v.x,v.y,1000) sfx(7) pmem(3,1) end del(items, i) end end if v.type=="upgradepower" then if check_collision(p, v) then if upgradetimer==0 then upgradetimer=50 else upgradetimer=upgradetimer+30 end pmem(2,pmem(2)+1000) new_scoretext(v.x,v.y,1000) sfx(15) del(items, i) end end if v.type=="bubble" then if check_collision(p, v) then pmem(2,pmem(2)+1000) new_scoretext(v.x,v.y,1000) pmem(5,pmem(5)+1) sfx(15) del(items, i) end end if v.type=="firepower" then if check_collision(p, v) then if powershot>0 then pmem(2,pmem(2)+1500) new_scoretext(v.x,v.y,1500) sfx(10) else pmem(2,pmem(2)+1000) new_scoretext(v.x,v.y,1000) sfx(6) pmem(4,1) end del(items, i) end end if v.type=="bombfruit" then if check_collision(p, v) then if powershot==2 then pmem(2,pmem(2)+1500) new_scoretext(v.x,v.y,1500) sfx(10) else pmem(2,pmem(2)+1000) new_scoretext(v.x,v.y,1000) sfx(6) pmem(4,2) end del(items, i) end end if v.type=="goalpole" then local a=t/8 v.y=v.y+cos(a/6)/10 if check_collision(p, v) then clearlevel() del(items, i) end end if v.type=="gem1" or v.type=="gem2" or v.type=="gem3" then if check_collision(p, v) then pmem(2,pmem(2)+2000) bonus=bonus+50 clearlevel() del(items, i) end end if v.type=="gem4" then if check_collision(p, v) then pmem(2,pmem(2)+4000) bonus=bonus+200 clearlevel() del(items, i) end end if v.type=="coin" then if check_collision(p, v) then pmem(2,pmem(2)+200) sfx(1) bonus=bonus+1 del(items, i) end end if v.type=="heart" then if fget(mget((v.x + 8) // 8, (v.y + 3) // 8), 0) then v.pt=-1 v.vx=-0.5 elseif fget(mget((v.x - 1) // 8, (v.y + 3) // 8), 0) then v.pt=1 v.vx=0.5 end -- Simple patrol logic: move left and right based on patrol direction if v.pt==1 or v.x<0 then c_right(v) elseif v.pt==-1 or v.x>240-v.w then -- Assume 240 is the screen width c_left(v) end if check_collision(p, v) then pmem(2,pmem(2)+1500) new_scoretext(v.x,v.y,1500) sfx(14) pmem(1,pmem(1)+1) del(items, i) end end if v.type=="coin" or v.type=="goalpole" then py(v, frict, 1, 0) elseif v.wet==true then py(v, frict, 1, grav-.05) else py(v, frict, 1, grav) end collide(v, 7, 7) move(v) if v.type=="upgradepower" or v.type=="heart" or v.type=="gem2" then v.anim=a_idle2 v.anim(v) elseif v.type=="gem1" then v.anim=a_idle5 v.anim(v) end end end function update_tiles() local updates = {} -- Precompute the multiplied values local level_height_in_tiles = 17 local level_width_in_tiles = 30*4 -- Assuming this is the width of your map in tiles -- First pass: find all tiles that need updates for my = levely,levely + level_height_in_tiles do -- Iterate through tiles, not pixel coordinates for mx = levelx,levelx + level_width_in_tiles do local tile = mget(mx, my) local tileright = mget(mx+1, my) local tileleft = mget(mx-1, my) if tile == 144 or tile == 145 or tile == 146 or tile == 147 or tile == 148 or tile == 149 or tile == 150 or tile == 160 or tile == 161 or tile == 162 or tile == 163 or tile == 178 or tile == 179 or tile == 192 or tile == 9 or tile == 10 or tile == 11 or tile == 12 or tile == 13 or tile == 14 or tile == 200 or tile == 232 or tile == 15 or tile == 152 or tile == 168 or tile == 167 or tile == 183 or tile == 194 or tile == 195 or tile == 196 or tile == 197 or tile == 212 or tile == 4 or tile == 151 or tile == 8 or tile == 248 or tile == 228 or tile == 229 then table.insert(updates, {x = mx, y = my, tile = tile}) end end end -- Second pass: perform updates on found tiles for i = 1, #updates do local update = updates[i] local mx, my, tile = update.x, update.y, update.tile if tile == 144 then add_enemy(mx * 8, my * 8, .05, "enemy", -1, 320,1,1,7,7,0) elseif tile == 145 then add_enemy(mx * 8, my * 8, .05, "sheep", -1, 336,1,1,7,7,0) elseif tile == 146 then add_enemy(mx * 8, my * 8, .05, "pricky", -1, 352,1,1,7,7,0) elseif tile == 147 then add_enemy(mx * 8, my * 8, .05, "roach", -1, 368,1,1,7,7,2) elseif tile == 148 then add_enemy(mx * 8, my * 8, .05, "ball", -1, 298,1,1,7,7,0) elseif tile == 149 then add_enemy(mx * 8, my * 8, .05, "saucer", -1, 314,1,1,7,7,0) elseif tile == 160 then add_enemy(mx * 8, my * 8, .05, "slime", -1, 384,1,1,7,7,0) elseif tile == 163 then add_enemy(mx * 8, my * 8, .05, "bee", -1, 400,1,1,7,7,0) elseif tile == 179 then add_enemy(mx * 8, my * 8, .05, "fish", -1, 405,1,1,7,7,0) elseif tile == 150 then add_enemy((mx-0.5) * 8, (my-1) * 8, .05, "boss", -1, 346,2,2,15,15,7) elseif tile == 162 then add_enemy((mx-0.5) * 8, (my-1) * 8, .05, "butterfly", -1, 410,2,2,15,15,7) elseif tile == 161 then add_enemy((mx-0.5) * 8, (my-1) * 8, .05, "bossfire", -1, 346,2,2,15,15,7) elseif tile == 178 then add_enemy((mx-0.5) * 8, (my-1) * 8, .05, "nightmare", -1, 442,2,2,15,15,7) elseif tile == 9 or tile == 194 then add_item(mx * 8, my * 8, "strawberry", 1, 9) elseif tile == 10 or tile == 195 then add_item(mx * 8, my * 8, "firepower", 1, 10) elseif tile == 11 or tile == 196 then add_item(mx * 8, my * 8, "bombfruit", 1, 11) elseif tile == 12 or tile == 192 then local ri=rnd(1,2) if ri==1 then add_item(mx * 8, my * 8, "clock", 1, 448) else add_item(mx * 8, my * 8, "upgradepower", 1, 267) end elseif tile == 13 or tile == 212 then add_item(mx * 8, my * 8, "heart", 1, 283) elseif tile == 4 then add_item(mx * 8, my * 8, "coin", 1, 4) elseif tile == 151 then add_item(mx * 8, (my * 8) + 4, "coin", 1, 4) elseif tile == 8 then add_item(mx * 8, my * 8, "coin", 1, 8) elseif tile == 248 then add_item(mx * 8, (my * 8) + 4, "coin", 1, 8) elseif tile == 14 or tile == 200 or tile == 232 then add_item(mx * 8, my * 8, "goalpole", 1, 14) elseif tile == 15 or tile == 197 then add_item(mx * 8, my * 8, "bubble", 1, 15) elseif tile == 152 then add_item(mx * 8, my * 8, "gem1", 1, 378) elseif tile == 168 then add_item(mx * 8, my * 8, "gem2", 1, 394) elseif tile == 167 then add_item(mx * 8, my * 8, "gem3", 1, 167) elseif tile == 183 then add_item(mx * 8, my * 8, "gem4", 1, 183) elseif tile == 228 or tile == 229 then new_blockhit(mx * 8, my * 8) end if tile == 200 then mset(mx, my, 185) elseif tile == 232 then mset(mx, my, 217) elseif tile == 228 then mset(mx, my, 2) elseif tile == 229 then mset(mx, my, 6) elseif tile == 192 or tile == 194 or tile == 195 or tile == 196 or tile == 197 or tile == 212 or tile == 179 then mset(mx, my, 209) else mset(mx, my, 0) end end end --updates the particles function particles() for i,d in pairs(dust) do --applies physics and movement py(d,.95,.95,0) move(d) --changes its color overtime if d.t<5 then d.c=15 else d.c=14 end --when the timer ends, gets tiny and then deleted d.t=d.t-1+rnd() if d.t<1 then d.r=d.r/1.1 end if d.r<1 then del(dust,i) end end for i,d in pairs(gparticle) do --applies physics and movement py(d,.95,.7,0) move(d) d.vy=d.vy+0.1 --when the timer ends, gets tiny and then deleted d.t=d.t-1 if d.t<1 then d.r=d.r/1.1 end if d.r<1 then del(gparticle,i) end end for i,d in pairs(coin) do --applies physics and movement py(d,.95,.95,0) move(d) d.vy=d.vy+0.1 d.t=d.t+0.25 if d.t>8 then del(coin,i) end end for i,d in pairs(scoretext) do --applies physics and movement py(d,.95,.95,0) move(d) d.t=d.t+0.25 if d.t>8 then del(scoretext,i) end end for i,d in pairs(coin2) do --applies physics and movement py(d,.95,.95,0) move(d) d.vy=d.vy+0.1 d.t=d.t+0.25 if d.y>(levely+16)*8 or d.t>8 then del(coin2,i) end end for i,d in pairs(brickpiece) do --applies physics and movement py(d,.95,.95,0) move(d) d.vy=d.vy+0.1 if fget(mget((d.x+4)//8,(d.y+2)//8),0) then del(brickpiece,i) end end for i,d in pairs(fire) do --applies physics and movement py(d,1,.95,0) move(d) if fget(mget((d.x+d.vx+1) // 8, (d.y+d.vy+2) // 8), 1) or fget(mget((d.x+d.vx+d.w-1) // 8, (d.y+d.vy+2) // 8), 1) or fget(mget((d.x+d.vx+1) // 8, (d.y+d.vy+d.h) // 8), 1) or fget(mget((d.x+d.vx+w-1) // 8, (d.y+d.vy+d.h) // 8), 1) then d.wet=true else d.wet=false end if fget(mget((d.x+4)//8,(d.y+2)//8),0) or fget(mget((d.x+4)//8,(d.y-2)//8),5) or fget(mget((d.x+4)//8,(d.y+2)//8),6) then d.vy=-1.125 end if fget(mget((d.x+4)//8,(d.y-6)//8),0) or fget(mget((d.x+4)//8,(d.y-6)//8),5) then d.vy=0.8 end d.vy=d.vy+0.1 d.t=d.t+0.25 if (fget(mget((d.x+5)//8,(d.y)//8),0) or fget(mget((d.x)//8,(d.y)//8),0) or fget(mget((d.x+5)//8,(d.y-4)//8),5) or fget(mget((d.x)//8,(d.y-4)//8),5)) then sfx(8) if powershot==2 then if fget(mget((d.x+5)//8,(d.y)//8),2) then if mget((d.x+5)//8,(d.y)//8)==3 then new_brickbreak(d.x+5,d.y-1,2) elseif mget((d.x+5)//8,(d.y)//8)==7 then new_brickbreak(d.x+5,d.y-1,12) end if d.wet==false then mset((d.x+5)//8,(d.y)//8,0) else mset((d.x+5)//8,(d.y)//8,209) end score=score+50 sfx(12) end if fget(mget((d.x)//8,(d.y)//8),2) then if mget((d.x)//8,(d.y)//8)==3 then new_brickbreak(d.x,d.y-1,2) elseif mget((d.x)//8,(d.y)//8)==7 then new_brickbreak(d.x,d.y-1,12) end if d.wet==false then mset((d.x)//8,(d.y)//8,0) else mset((d.x)//8,(d.y)//8,209) end score=score+50 sfx(12) end end del(fire,i) end if d.y>(levely+16.5)*8 then del(fire,i) end end for i,d in pairs(pcorpse) do --applies physics and movement py(d,.95,1,0) move(d) d.vy=d.vy+0.25 d.t=d.t+0.25 if d.t>10 then del(pcorpse,i) end end for i,d in pairs(corpse) do --applies physics and movement py(d,.95,1,0) move(d) if fget(mget((d.x+4)//8,(d.y+2)//8),0) or fget(mget((d.x+4)//8,(d.y-2)//8),5) or fget(mget((d.x+4)//8,(d.y+2)//8),6) then d.vy=0 else d.vy=d.vy+0.25 end d.t=d.t+0.25 if d.t>50 or d.y>(levely+15.8)*8 then del(corpse,i) end end for i,d in pairs(corpseanim) do --applies physics and movement py(d,.95,1,0) move(d) d.t=d.t+0.25 if d.t>1 then if d.frm==0 then d.frm=1 d.t=0 elseif d.frm==1 then del(corpseanim,i) end end end for i,d in pairs(corpsefall) do --applies physics and movement py(d,.95,1,0) move(d) if fget(mget((d.x+4)//8,(d.y+2)//8),0) or fget(mget((d.x+4)//8,(d.y-2)//8),5) or fget(mget((d.x+4)//8,(d.y+2)//8),6) then new_corpse(d.x,d.y,d.idx+16) del(corpsefall,i) elseif d.y>(levely+15.8)*8 then del(corpsefall,i) else d.vy=d.vy+0.25 end end for i,d in pairs(corpsebig) do --applies physics and movement py(d,.95,1,0) move(d) if fget(mget((d.x+4)//8,(d.y+2)//8),0) or fget(mget((d.x+4)//8,(d.y-2)//8),5) or fget(mget((d.x+4)//8,(d.y+2)//8),6) then d.vy=0 else d.vy=d.vy+0.25 end d.t=d.t+0.25 if d.t>50 or d.y>(levely+15.8)*8 then del(corpsebig,i) end end for i,d in pairs(corpsebig2) do --applies physics and movement py(d,.95,1,0) move(d) d.t=d.t+0.25 if d.t>50 then del(corpsebig2,i) end d.vy=d.vy+0.05 end for i,d in pairs(blockhit) do --applies physics and movement py(d,.95,1,0) move(d) d.t=d.t+0.25 if d.t>1.5 then del(blockhit,i) end end end ----- NEEDED FUNCTIONS --------------- --applies an objects velocity to its position function move(o) o.x=o.x+o.vx o.y=o.y+o.vy end --applies friction and gravity on an object function py(o,frict_x,frict_y,grav) o.vx=o.vx*frict_x o.vy=o.vy*frict_y o.vy=o.vy+grav o.vy=min(max(o.vy,-3),3) end --checks if something is on the same map area of the player function onscreen(o) return p.x//240==o.x//240 and p.y//136==o.y//136 end --checks if an object is in the air to apply the right animation function checkanim(o) if o.vy>0 then o.anim=a_fall elseif o.vy<0 then o.anim=a_jump end end --plays a sfx if the object has the "player" tag function damageplayer() if pmem(5)>0 then if p.invuln==0 then if pmem(3)>0 and pmem(5)<2 then pmem(3,0) else if pmem(5)==1 then killplayer() else pmem(5,pmem(5)-1) end end if pmem(5)<2 then pmem(4,0) end sfx(16) p.invuln=70 else p.invuln=p.invuln-1 end end end function pdeath() if p.dead==true then if deathtimer==0 then game=false musicbol=false if pmem(1)>0 then next=true stop=true scoretimer=30 else gameover=true end music() else deathtimer=deathtimer-1 end end end function killplayer() pmem(1,pmem(1)-1) pmem(5,0) new_pcorpse(p.x,p.y+7) deathtimer=50 pmem(3,0) pmem(4,0) upgraded=0 upgradetimer=0 p.dead=true end function clearlevel() game=false musicbol=true gamemusic=1 result=true scoretimer=30 scoretimer2=120 end --plays a sfx if the object has the "player" tag function psfx(o,i) if o.type=="player" then sfx(i) end end --creates 10 new dust particles and put the in the dust list function new_dust(x_,y_,r_) for i=0,10 do table.insert(dust, { x=x_, y=y_, vx= cos(rnd(30))/2, vy= -sin(rad(rnd(180)))*(rnd()*2)/5, r=rnd()*r_, t=r_*5 }) end end function new_gparticle(x_,y_,r_) table.insert(gparticle, { x=x_, y=y_, vx=cos(rnd(30))/2, vy=4, r=rnd()*r_, t=2 }) end function new_coinfall(x_,y_) table.insert(coin, { x=x_, y=y_, vx=cos(rnd(30))/2, vy=-2, t=0 }) end function new_coinfall2(x_,y_) table.insert(coin2, { x=x_, y=y_, vx=cos(rnd(30))/2, vy=-2, t=0 }) end function new_brickbreak(x_,y_,c_) for i=0,20 do table.insert(brickpiece, { x=x_, y=y_, vx=cos(rnd(30))/2, vy=cos(rnd(30))/2-2, c=c_+rnd(0,2), t=0.5 }) end end function new_fireshot(x_, y_, d_) table.insert(fire, { x = x_, y = y_, vx = d_, vy = -0.5, t = 0.5, w = 4, h = 4, wet = false }) end function new_pcorpse(x_, y_) table.insert(pcorpse, { x = x_, y = y_, vx = 0, vy = -30, t = 0, w = 4, -- Define the width of the fire particle h = 4 -- Define the height of the fire particle }) end function new_corpse(x_,y_,idx_) table.insert(corpse, { x = x_, y = y_, vx = 0, vy = 0, t = 0, w = 4, -- Define the width of the fire particle h = 4, idx = idx_ }) end function new_corpseanim(x_,y_,idx_) table.insert(corpseanim, { x = x_, y = y_, vx = 0, vy = 0, t = 0, w = 4, h = 4, idx = idx_, frm = 0 }) end function new_corpsefall(x_,y_,idx_) table.insert(corpsefall, { x = x_, y = y_, vx = 0, vy = 0, t = 0, w = 4, -- Define the width of the fire particle h = 4, idx = idx_ }) end function new_corpsebig(x_,y_,idx_,flip_) table.insert(corpsebig, { x = x_, y = y_, vx = 0, vy = 0, t = 0, w = 4, -- Define the width of the fire particle h = 4, idx = idx_, flip = flip_ }) end function new_corpsebig2(x_,y_,idx_,flip_) table.insert(corpsebig2, { x = x_, y = y_, vx = 0, vy = -1, t = 0, w = 4, -- Define the width of the fire particle h = 4, idx = idx_, flip = flip_ }) end function new_blockhit(x_,y_) table.insert(blockhit, { x=x_, y=y_, vx=0, vy=0, t=0 }) end function new_scoretext(x_,y_,text_) table.insert(scoretext, { x = x_, y = y_, vx = 0, vy = -0.5, t = 0, text = text_ }) end --stop an object of passing through blocks --and returns true if it just hit the ground -- Update the collide function function collide(o, w, h) local r = false local x, vx, y, vy = o.x, o.vx, o.y, o.vy -- Check for horizontal collision if fget(mget((x+vx+1) // 8, (y+2) // 8), 0) or fget(mget((x+vx+1) // 8, (y+h) // 8), 0) or fget(mget((x+vx+w-1) // 8, (y+2) // 8), 0) or fget(mget((x+vx+w-1) // 8, (y+h) // 8), 0) or fget(mget((x+vx+1) // 8, (y+2) // 8), 5) or fget(mget((x+vx+1) // 8, (y+h-4) // 8), 5) or fget(mget((x+vx+w-1) // 8, (y+2) // 8), 5) or fget(mget((x+vx+w-1) // 8, (y+h-4) // 8), 5) then o.vx = 0 end local vx = o.vx -- Check for vertical collision if (fget(mget((x+vx+1) // 8, (y+vy+2) // 8), 0) or fget(mget((x+vx+w-1) // 8, (y+vy+2) // 8), 0) or fget(mget((x+vx+1) // 8, (y+vy+h) // 8), 0) or fget(mget((x+vx+w-1) // 8, (y+vy+h) // 8), 0) or fget(mget((x+vx+1) // 8, (y+vy+2) // 8), 5) or fget(mget((x+vx+w-1) // 8, (y+vy+2) // 8), 5) or fget(mget((x+vx+1) // 8, (y+vy+h-4) // 8), 5) or fget(mget((x+vx+w-1) // 8, (y+vy+h-4) // 8), 5) or fget(mget((x+vx+1) // 8, (y+vy+h) // 8), 6) and vy >= 0 or fget(mget((x+vx+w-1) // 8, (y+vy+h) // 8), 6) and vy >= 0 or fget(mget((p.x+p.vx+1) // 8, (p.y+p.vy+2) // 8), 7) and p.vy <= 0 or fget(mget((p.x+p.vx+w-1) // 8, (p.y+p.vy+2) // 8), 7) and p.vy <= 0) then if o.vy > .6 then r = true end o.vy = 0 end if fget(mget((x+1) // 8, (y+h+1) // 8), 0) or fget(mget((x+w-1) // 8, (y+h+1) // 8), 0) or fget(mget((x+1) // 8, (y+h-3) // 8), 5) or fget(mget((x+w-1) // 8, (y+h-3) // 8), 5) or fget(mget((x+1) // 8, (y+h+1) // 8), 6) and vy >= 0 or fget(mget((x+w) // 8, (y+h+1) // 8), 6) and vy >= 0 then o.grnd = true else o.grnd = false end if fget(mget((x+1) // 8, (y) // 8), 0) or fget(mget((x+w-1) // 8, (y) // 8), 0) or fget(mget((x+1) // 8, (y) // 8), 5) or fget(mget((x+w-1) // 8, (y) // 8), 5) or fget(mget((p.x+1) // 8, (p.y) // 8), 7) and p.vy<0 or fget(mget((p.x+p.w-1) // 8, (p.y) // 8), 7) and p.vy<0 then o.ceil = false else o.ceil = true end if fget(mget((x+vx+1) // 8, (y+vy+2) // 8), 1) or fget(mget((x+vx+w-1) // 8, (y+vy+2) // 8), 1) or fget(mget((x+vx+1) // 8, (y+vy+h) // 8), 1) or fget(mget((x+vx+w-1) // 8, (y+vy+h) // 8), 1) then o.wet=true else o.wet=false end if fget(mget((p.x+4)//8,(p.y)//8),2) and o.ceil==false and power==1 then if mget((p.x+4)//8,(p.y)//8)==3 then new_brickbreak(p.x,p.y-1,2) elseif mget((p.x+4)//8,(p.y)//8)==7 then new_brickbreak(p.x,p.y-1,12) end score=score+50 p.vy=0 if p.wet==false then mset((p.x+4) //8,(p.y) //8,0) else mset((p.x+4) //8,(p.y) //8,209) end sfx(5) end if fget(mget((p.x+4)//8,(p.y)//8),3) and o.ceil==false then if mget((p.x+4)//8,(p.y)//8)==1 or mget((p.x+4)//8,(p.y)//8)==128 then mset((p.x+4) //8,(p.y) //8,228) new_coinfall(p.x,p.y-8) elseif mget((p.x+4)//8,(p.y)//8)==5 or mget((p.x+4)//8,(p.y)//8)==140 then mset((p.x+4) //8,(p.y) //8,229) new_coinfall2(p.x,p.y-8) end score=score+200 sfx(1) bonus=bonus+1 end if fget(mget((p.x+4)//8,(p.y)//8),4) and o.ceil==false then if mget((p.x+4)//8,(p.y)//8)==129 or mget((p.x+4)//8,(p.y)//8)==130 then mset((p.x+4) //8,(p.y) //8,228) elseif mget((p.x+4)//8,(p.y)//8)==141 or mget((p.x+4)//8,(p.y)//8)==142 then mset((p.x+4) //8,(p.y) //8,229) end if power==0 then if p.wet==true then mset((p.x+4) //8,(p.y-1*8) //8,194) else mset((p.x+4) //8,(p.y-1*8) //8,9) end end if power==1 and powershot==0 then if p.wet==true then mset((p.x+4) //8,(p.y-1*8) //8,195) else mset((p.x+4) //8,(p.y-1*8) //8,10) end end if power==1 and powershot==1 then if p.wet==true then mset((p.x+4) //8,(p.y-1*8) //8,196) else mset((p.x+4) //8,(p.y-1*8) //8,11) end end if power==1 and powershot>1 then if p.wet==true then mset((p.x+4) //8,(p.y-1*8) //8,197) else mset((p.x+4) //8,(p.y-1*8) //8,15) end end if power==1 and powershot>1 and p.hp>9 then if p.wet==true then mset((p.x+4) //8,(p.y-1*8) //8,192) else mset((p.x+4) //8,(p.y-1*8) //8,12) end end sfx(8) end if fget(mget((p.x+4)//8,(p.y)//8),7) and o.ceil==false then if mget((p.x+4)//8,(p.y)//8)==137 or mget((p.x+4)//8,(p.y)//8)==138 or mget((p.x+4)//8,(p.y)//8)==139 then mset((p.x+4) //8,(p.y) //8,228) elseif mget((p.x+4)//8,(p.y)//8)==143 or mget((p.x+4)//8,(p.y)//8)==158 or mget((p.x+4)//8,(p.y)//8)==159 then mset((p.x+4) //8,(p.y) //8,229) end if p.wet==true then mset((p.x+4) //8,(p.y-1*8) //8,212) else mset((p.x+4) //8,(p.y-1*8) //8,13) end sfx(8) end return r end ----- CONTROLS ----------------------- --if an object can jump, jump function c_jump(o) if o.grnd and o.ceil or o.wet and not o.down then o.vy=o.mvup if o.wet==false then psfx(o,0) end end end --crounching function c_down(o) o.anim=a_down o.down=true end function c_shot(o) if not p.down and not p.shot_fired then if p.flp == 1 then new_fireshot(p.x - 2, p.y + 2, -1) else new_fireshot(p.x + 2, p.y + 2, 1) end sfx(11) p.shot_fired = true p.shot_timer = p.shot_sec -- Set a timer for when the player can shoot again end if not o.down then p.anim = a_shot end end function c_left(o) o.flp=1 if o.down then o.anim=a_walkdown o.vx=o.vx-o.mv/3 else o.anim=a_walk o.vx=o.vx-o.mv end end --goes right function c_right(o) o.flp=0 if o.down then o.anim=a_walkdown o.vx=o.vx+o.mv/3 else o.anim=a_walk o.vx=o.vx+o.mv end end ----- ANIMATIONS --------------------- function a_idle(o) o.frm=0 end function a_walk(o) if t%8==0 then o.frm=o.frm+1 end if o.frm<1 or o.frm>2 then o.frm=1 end end function a_down(o) o.frm=3 end function a_walkdown(o) if t%8==0 then o.frm=o.frm+1 end if o.frm<4 or o.frm>5 then o.frm=4 end end function a_jump(o) o.frm=6 end function a_fall(o) if t%4==0 then o.frm=o.frm+1 end if o.frm<7 or o.frm>6 then o.frm=7 end end function a_shot(o) o.frm=9 end function a_idle2(o) if t%8==0 then o.frm=o.frm+1 end if o.frm<0 or o.frm>3 then o.frm=0 end end function a_idle3(o) if t%8==0 then o.frm=o.frm+2 end if o.frm<0 or o.frm>2 then o.frm=0 end end function a_idle4(o) if t%4==0 then o.frm=o.frm+1 end if o.frm<0 or o.frm>1 then o.frm=0 end end function a_idle5(o) if t%4==0 then o.frm=o.frm+1 end if o.frm<0 or o.frm>4 then o.frm=0 end end