pico-8 cartridge // http://www.pico-8.com version 32 __lua__ -- library black = 0 dark_blue = 1 dark_purple = 2 dark_green = 3 brown = 4 dark_gray = 5 light_gray = 6 white = 7 red = 8 orange = 9 yellow = 10 green = 11 blue = 12 indigo = 13 pink = 14 peach = 15 function print_ctr(s,y,c) print(s,64 - #s * 2,y,c) end -->8 -- game code bg = blue function _init() -- button-press initial delay poke(0x5f5c, 2) -- button-press repeat poke(0x5f5d, 2) init_world() end function init_world() player = {} player.x = 36 player.y = 16 player.spr = 1 drops = {} ramps = {} levers = {} add_ramp(70,25,40,-5) add_ramp(50,20,15,10) add_ramp(60,50,15,-15) add_ramp(52,60,14,0) add_ramp(45,75,10,30) add_ramp(64,76,0,10) add_ramp(64,86,6,0) add_ramp(70,76,0,10) add_lever(30,30,20) end function add_ramp(x,y,dx,dy) r = {} r.x = x r.y = y r.dx = dx r.dy = dy add(ramps, r) end function add_lever(x,y,len) l = {} l.x = x l.y = y l.len = len l.angle = 0.06 l.weight = 0 add(levers, l) end function _update() update_player() update_drops() foreach(levers, update_lever) end function update_player() if btn(0) then player.x -= 1 end if btn(1) then player.x += 1 end if btn(2) then player.y -= 1 end if btn(3) then player.y += 1 end player.x = mid(0, player.x, 127) player.y = mid(0, player.y, 127) if btnp(🅾️) then drop = {} drop.x = player.x drop.y = player.y add(drops, drop) end end function update_lever(l) weight = 0 for i=0,l.len do x = l.x + i y = l.y + i * sin(l.angle) - 1 while pget(x, y) == white do weight += 1 y -= 1 end end l.weight = weight end function update_drop(d) if d.y == 127 or pget(d.x,d.y+1) == bg then d.y += 1 return end left = pget(d.x-1,d.y) == bg and pget(d.x-1,d.y+1) == bg right = pget(d.x+1,d.y) == bg and pget(d.x+1,d.y+1) == bg if left and right then d.y += 1 if rnd() < 0.5 then d.x -= 1 else d.x += 1 end elseif left then d.y += 1 d.x -= 1 elseif right then d.y += 1 d.x += 1 end end function update_drops() draw_world() new_drops = {} for i=1,#drops do d = drops[i] oldx = d.x oldy = d.y update_drop(d) if d.y < 128 then add(new_drops, d) end pset(oldx, oldy, bg) pset(d.x, d.y, white) end drops = new_drops end function _draw() draw_world() spr(player.spr,player.x-1,player.y-1) print("("..player.x..","..player.y..")", 1, 1, white) print("drops: "..#drops, 1, 7, white) end function draw_world() cls(bg) foreach(drops, draw_drop) foreach(ramps, draw_ramp) foreach(levers, draw_lever) end function draw_drop(drop) pset(drop.x, drop.y, white) end function draw_ramp(r) line(r.x,r.y,r.x+r.dx,r.y+r.dy,brown) end function draw_lever(l) dx = l.len * cos(l.angle) dy = l.len * sin(l.angle) line(l.x,l.y,l.x+dx,l.y+dy,brown) circ(l.x,l.y,1,black) print(""..l.weight,1,13,red) end __gfx__ 000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000aaa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 007007000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000