`,]']>S}Wup8d%qy)6o;]AsVl3S}Wup8d%qy)6o;]AsVl34#"4D"/#D4D4#"#"@DD@ @@@ @@@DD<#"#"-̼;;;̬<>-̼;3##"+̬ "" "" , , ""  , $B`'r ""2#2#2#2# ""320##322"#,"2<""" "ff`ff`k`k|gv|| @DD@DDD B$" "DLD ̻̻ ̻ 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 @DDLLD@D""#!3323#!2#!2#!2!"2!""#""#!3323#!2#!2#!2!#"""""#!3323#!2#!2#!2!""!""LL43L43@4#4#0 \e\f\e\eeff\fffe`f̼ ̼޼gjggjjwzvfgjggjjwzvfvjjvfgjggjjwzvf////*"""q,,+"q0""##3333#!3#!3#!3!#"""#!3323#!2#!2#!2!""""!3323#2#2#2"ʪjjʧjzʪfv ˼˼,*"",,,""*DDUUeZeZZj33:OO:OO33jjfjfffʬʪʪʪ0""#3333#3#3#3# UUUUUUUUUUUUUUUUUUUUUUUUffffUUUUUUUUUUUUUUUUUU`fff UUUfUUUfUUUfUUUfUUUfUUUffff::32##""#"""!*""*******""wwwwffffUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`fwwUef\U\U\U\U\U\UwwfvwUefUefUefUefUefUefLDDLLLLLLLLLLLDDD̼̼̼̼̼̼!""!!!!!!!""/""///////"" 33#"#"333##""#""3#""333##""#""UUUUUUUUUUUUUUUUUUfUUfUUfUUfUUfUUfUUfUUf\U\U\U\U\U\U\U\UUefUefUefUefUefUefUefUef,"",,,,,,,""̻ cUUerffvrwwwrr2rq!#2""#VUU6gff'ww//r!rrq!#2""#̼̾ު뺻ꮪ ""      "" vvvvvvvvgffv """OOOOD@D,$$ " """OOOOD@D ,$$ " """OOOOD@D $ " ""O"D@"" $$ " ʪϯ̐)! ̜) """OOOOD@D ,$$ " """OOOOD@D,$$ " """OOOOD@D,$$ " """OOOOD@D $$ "!2#!C4!C42#! ,"""OOOOD@O $$ " """OOOOD@D )) """OOOOD@D )) """OOOOD@D ))Ĕ ""O"D@" ") Y ʪϯ@P I """OOOOD@D )) """OOOOD@D )) """OOOOD@D )) """OOOOD@D )) l`fflllff`DDlf`fflffff`OOOODDl`fflllff`DDDDDDf`fffllflff`DD`lfffOOOOD@O `dd`f` fffDODOD@ldd `f` fffDODOD@ ldd`f` fffDODOD@`d`f`ffOfOD@ff`dd`f  53S33? ""R33%03<0, ` fffDODOD@ ldd`f` fffDODOD@ldd `f` fffDODOD@ldd `f 53S 333 )" 320##322"#,"2<""" "320##322"#,"2<""" "320##3<"#, "000###   ` fffDODOD@`ii ` fffDODOD@`ii ` fffDODOD@`iiĔ `ffOfOD@f`fi 033333? 3 R% 33033032 "R` fffDODOD@`ii ` fffDODOD@`ii ` fffDODOD@`ii 03333333R%.ff`ff`k`k|gv|| ff`ff`k|gv|| ff|gv|| pgvpgv`klk wffwwffw`k`klff `ffff`ff`kwkwwffwff "" / / ""DD "" " " ""DD "" " " ""DD "" " " ""DD "" " " ""DD "" " " ""DD"" /DD pgfgUvpVegVegUvffppffgUvgVepVegUvpgf`ffkkwffw  ̿  ̿  ̿  ̿ ̿ DDDD@DDDDD@"BD"""D@DDDDDDD$"D""" , $B`'r "B`ff' "B`ff' "Bf'`f "`fBf' "`fBf'`fvB" DD@DDDDDDDD BD""B ""@DDDDDDDDDDD$$""""@DDDDDDDDBD "B"" DDDDDDDDD$$" " "  ""2#2#2#2# "" """""#"""# "" """""#"""# "" """""#"""# "" """""#"""# "" """""#"""# "" """"2#"""" " ̻̻ ̼˫ ̻ ˫ ˰ ˫ ̻ ̻̻      UUPUUP\PUUUUUUUUPUUPU PUUUUUUPUUUUU\UUUPUUPUUUUPUUP\PUUPUUUUPPUPUUPUUP\PUUUUPPPUPUUPUUP\PUUUUUU\UUUU \e\fle\leff\fffe`f \efVfVf\fffe`f \lffel\l`e `\f lefl\le`ff`V\e\fefVff  DDLDLD DDLDLD DDLDLD DDLDLDDLDDDDL" ""x!,x!," "p!""',',p" "'""(,(," "p!""',',p" " ""!""x!,wwww ww //////UeP`P```p`fv//////03#003#0""0"!0032##""#""#"""!003#0""0"! ʫ ̫˫ ppwwpwpwwwww``ff`f`fffffgfffUUVefVeVefVUUffvUUfffvffvUUf@DDDLDDDOODDL pwwpwwwwwwwwpwwwpwwwwwwwwwwwppwwpwpwwwww`ff`ffffffff`fff`fffffffffff``ff`f`fffffVUUVefVeVeffUUgffUUfffvffvUUfffv3:3:0  ʫ ̫˫ wwwwwwwwwwwwwwwwwwwwwwppwwpwwwwwwwpwwpwwwpffffffffffffffffffffff``ff`fffffff`ff`fff`dewefdetuvewefDEEEFDEEEEEEEF,WTUUUUVTUUVTU?n?WTUUUVEEEEEEEEEEEEEEEEEEEEEEEEEEE%%%EEFDEEEEEEEEEEEEEEEFLLLLDEEEEEEEEEEEEEF\\\DEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFDEEEFL\L\LDEFNNNTUUUUUUUVTUUUU?>??$%%%%%%%&$7%%%%%%&deeeeef,,,,detTUU??_ϾSPQQQQQQQQQQQQQQQQQQQQQQQQQQQ=QQQQQQQQQQQQQQQQQQQRPQQQQQRPQQQQQQQQQQQQQQ%%%%7%%%%&$%%%%%%%&$%7%%7%%%%%%%7%%%&TUU?o?>?o?_SPRDEEEEEEEEEEEEEEEF.n/$%%%%%%%%%EEEEEEEFLLLDEEEEEEEF'''T?????_-----------NNN-------------NNN-------------UUUNNN---------------------------UUUUNNN------------------UUUUV`basbNNN------ѳ----]]@APQRPQ=QQQRMMMMMMPQRPQ=QQQR]]]]SPQQRP------------ 3!!!!!!oo 3!!!!!!"PQQQQQQQQRPQQQQQQQQR 3"O_ !"O_ 3"PQQQQQMM---------------------------- !!!!!3!`pqrb`sbNNNN`asab !!!!!3!"PQQ=QQQRPRPQQ=QQQRPR !"NN !"NN !"PQQ=QQ 3!!!!!!!!" "#### "-------------------ѳ---- !!!!!!!VTUUUAAAAM]M]MM]M]M@AAAB !!3!!!!"PQQQQQQ=QRPQQQQQQ=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:;< = >??????????????  00PP`P````````````````````````````swpppqrstvy{~P@`PPPPPPPPPPPPPPPPPPPPPPPPPPt00112233445566778899::;;<<==>?`` ``````````````````````````t@  @ @  @0```` ```````````abcdefghijklmno @```` ```````````abcdefghijklmno@``````````````````````````````c00258?0000000000000000000000000?0000000000000000000000000000 #|||||||||||||ts t t}}}}}}}}}}}}}}} }}}}]        ||||| r   Rrr rR RRRr rr  P PpP\ \|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 Nn 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 NN 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 N N N N N Nn N   mm m   m  YyyyYyYY Yy yy Yy YY   y    y|||||||||| nnnn nnn nnnn nnn nn nnnn nn nnnnn nn nn nnnnnnnnn nn nN nNnN nN nNNnN nN n N n N n Nn N N Nn N n N K K K KKKKK||||||||                                  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