DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@D@DD@DDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@D@DDD@DDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@DD@D@DDD@DDDDDDDDDDDDDDDDDDDDDDDDDDD@@DDDDDD@D@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@DDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@D@DDD@DDDDD@DD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@D@DDD@DDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@D@DDD@DDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@D@DDD@DDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDD@DDD@DD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@00C40DÌCDÄ4CDD40DD0C40™™™™ ™™ "" ™™ ™™ ™™ ™™ ™™ ™™ ™™ ™™ ™™ ™™ ™™ ™™™™ ()*+,-./89:;<=>?@ABCDEFGPQRSTUVW`abcdefgpqrstuvwHIJKLMNOXYZ[\]^_hijklmnoxyz{|}~€‚ƒ„…†‡‘’“”•–— ¡¢£¤¥¦§°±²³´µ¶·"#$% >À?ªªªª   ªª       ª  ª  ª  ªª ªª ªªªª ª ªªª   ª    ª    ª  ªªªªª ªª   ª  ª ª ªª ª    ª  ªª  ª   ªª  ª    ª      ª ª ª ª ªª ª    ª ª  ª ª        ª  ªª ª   ª ªª     ª ªªª ª  ªªª   ªªª    ªªª     ª     ª ª ª ª    ª ªffff`f`fff`f`ffff`ff`fffff```f``f`f`fffff`ffff`f`ff`ffff`ff```f`f````````f`f`ff```ff`f``f`fff`ff```f`f```ff`````ffff```ff`f`ff`f`fff`f``ffff`f````ff`ff`f`fff``f`f`f``f`ffff``f`fffff`fffffffff`fffff`ff``ffff`fff``f```f```f`f`f`ff`f```f`f`f`````f`f``ff`ffff``f```ff`f`ff`f``f`fff`````f`f``ff```ffff``fff`ffff`ff`ffffffff```f`fffff`f````fff`ff`ff```ff`f`ffff``ff`fffff`ff``fffffffff``````f`````f`f`f`f``ff`ff`fff`fffff``````f````f`f```fff`ff`fff`f`f`f`f``ff`f`f`fff```f`ff`f`ffff`ff``f00C40ÌDCLD4CDD40DD0C40D@@D@DDDD@DDDDDDDDDDDDDDD@DDDDD@DDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDD@DDDDDDDDDDDDD@DDDDDDDDDDDDDDD@DDDDD@DDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDD@DDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD-- title: Marble Hills -- author: karl -- desc: short description -- site: website link -- license: MIT License (change this to your license of choice) -- version: 0.1 -- script: lua t=0 -- Time px,py=0.0,90.0 -- Player (x,y) position py_max=-136 vx,vy=0,0 -- Player (x,y) velocity g=0.025 -- Gravity r=0 -- Rotation -- Hill height maps hmaps={ {32,32,32,31,31,31,30,30,30,29,29,28,28,27,27,26,25,24,23,22,21,20,19,18,17,16,15,15,14,14,13,13,13,13,14,14,15,15,16,17,18,19,20,21,22,23,24,25,26,27,27,28,28,29,29,30,30,30,31,31,31,32,32,32}, {32,32,32,31,31,31,30,30,30,29,29,28,28,27,27,26,25,24,23,22,21,20,19,18,17,16,15,15,14,14,13,13,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,17,17,17,18,18,19,19,20,21,22,23,24,25,26,28,30,32}, {32,31,30,29,28,28,27,27,27,26,26,26,25,25,25,25,25,24,24,24,24,23,23,23,23,23,23,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,24,24,24,24,25,25,25,25,25,26,26,26,27,27,27,28,28,29,30,31,32}, {32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,17,16,16,15,15,14,14,13,13,13,12,12,12,11,11,11,11,11,11,12,12,12,13,13,14,14,15,16,17,18,19,20,22,24,25,26,27,28,29,30,30,31,31,32,32,32,32,32} } -- Hill slope maps smaps={ {1/3,1/3,1/3,1/3,1/3,1/3,1/3,1/3,1/3,1/2,1/2,1/2,1/2,1/2,1/2,1,1,1,1,1,1,1,1,1,1,1,1/2,1/2,1/2,1/2,0,0,0,0,-1/2,-1/2,-1/2,-1/2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1/2,-1/2,-1/2,-1/2,-1/2,-1/2,-1/3,-1/3,-1/3,-1/3,-1/3,-1/3,-1/3,-1/3,-1/3}, {1/3,1/3,1/3,1/3,1/3,1/3,1/3,1/3,1/3,1/2,1/2,1/2,1/2,1/2,1/2,1,1,1,1,1,1,1,1,1,1,1,1/2,1/2,1/2,1/2,0,0,0,0,0,0,-1/4,-1/4,-1/4,-1/4,-1/4,-1/4,-1/4,-1/4,-1/3,-1/3,-1/3,-1/3,-1/3,-1/3,-1/2,-1/2,-1/2,-1/2,-1,-1,-1,-1,-1,-1,-1,-2,-2,-2}, {1,1,1,1,1/2,1/2,1/3,1/3,1/3,1/3,1/3,1/3,1/5,1/5,1/5,1/5,1/5,1/4,1/4,1/4,1/4,1/6,1/6,1/6,1/6,1/6,1/6,0,0,0,0,0,0,0,0,0,0,-1/6,-1/6,-1/6,-1/6,-1/6,-1/6,-1/4,-1/4,-1/4,-1/4,-1/5,-1/5,-1/5,-1/5,-1/5,-1/3,-1/3,-1/3,-1/3,-1/3,-1/3,-1/2,-1/2,-1,-1,-1,-1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1/2,1/2,1/2,1/2,1/2,1/2,1/2,1/2,1/3,1/3,1/3,1/3,1/3,1/3,0,0,0,0,0,0,-1/3,-1/3,-1/3,-1/2,-1/2,-1/2,-1/2,-1,-1,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-1,-1/2,-1/2,-1/2,-1/2,-1/5,-1/5,-1/5,-1/5,-1/5} } hills={} starting=true broken=false trace("START============") function TIC() cls(0) if starting then print("Hold the down key to start!",50,30,6) print("Try getting as far as you can",45,50,6) print("without breaking the marble.",50,60,6) if btn(1) then starting=false end else vy=vy+g end if btn(1) then vx=vx+0.003 vy=vy+0.03 end -- Randomly select new hills if needed new_px=px+vx if px>64 then new_hills=new_px//64-px//64 for i=1,new_hills do table.remove(hills,1) end end while #hills<5 do table.insert(hills,math.random(4)) end -- Update position px=new_px py=py+vy -- Handle collisions current_hill=hills[1] if px>64 then current_hill=hills[2] end px_intersect=px//1+3 h_intersect=hmaps[current_hill][px_intersect%64+1] if py+8>136-h_intersect then new_y=136-h_intersect-8 -- Approximate angle of hill --approx_angles={} --for i=1,1 do -- h_back=hmaps[current_hill][(px_intersect-i)%64+1] -- h_forward=hmaps[current_hill][(px_intersect+i)%64+1] -- approx_angles[i]=(math.atan((h_back-h_intersect)/i)+ -- math.atan((h_intersect-h_forward)/i))/2 --end --sum=0 --for i=1,#approx_angles do -- sum=sum+approx_angles[i] --end --hill_angle=sum/#approx_angles hill_angle=math.atan(smaps[current_hill][px_intersect%64+1]) v_angle=math.atan(vy/vx) d_angle=v_angle-hill_angle --trace("Hill angle:"..hill_angle) --trace("v:"..v_angle) --trace("d:"..d_angle) speed=(vx^2+vy^2)^0.5 if d_angle>0.7*math.pi/2 and speed>1 then trace("BREAK") broken=true trace(speed) end new_speed=speed*math.cos(d_angle) new_vx=speed*math.cos(hill_angle) new_vy=speed*math.sin(hill_angle) py=new_y vx=new_vx vy=new_vy end -- Rotation of ball if t%10==0 and not broken then r=(r+1)%4 end -- Redraw sprites if px>64 then for i,v in ipairs(hills) do map(0,4*(v-1),8,4,64*(i-1)-px%64,104,0) end spr(256,64,py,0,1,0,r) else for i,v in ipairs(hills) do map(0,4*(v-1),8,4,64*(i-1),104,0) end spr(256,px,py,0,1,0,r) end -- Print UI print("Distance: "..px//64,40,0,10) print("|",119,0,10) print("Height: "..math.abs(136-py//1),135,0,10) --print(t//60,120,0) if py