2021-06-10 20:17:14 +00:00
|
|
|
pico-8 cartridge // http://www.pico-8.com
|
|
|
|
version 32
|
|
|
|
__lua__
|
2021-06-10 20:54:45 +00:00
|
|
|
-- 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
|
2021-06-10 20:17:14 +00:00
|
|
|
-- game code
|
|
|
|
|
2021-06-10 21:28:26 +00:00
|
|
|
bg = blue
|
|
|
|
|
|
|
|
function _init()
|
|
|
|
-- button-press initial delay
|
|
|
|
poke(0x5f5c, 2)
|
|
|
|
-- button-press repeat
|
|
|
|
poke(0x5f5d, 2)
|
|
|
|
init_world()
|
|
|
|
end
|
2021-06-10 20:53:56 +00:00
|
|
|
|
2021-06-10 20:17:14 +00:00
|
|
|
function init_world()
|
|
|
|
player = {}
|
2021-06-10 23:51:28 +00:00
|
|
|
player.x = 36
|
2021-06-10 20:17:14 +00:00
|
|
|
player.y = 16
|
|
|
|
player.spr = 1
|
2021-06-10 20:34:33 +00:00
|
|
|
|
|
|
|
drops = {}
|
2021-06-10 20:53:56 +00:00
|
|
|
ramps = {}
|
2021-06-10 23:02:14 +00:00
|
|
|
levers = {}
|
|
|
|
|
2021-06-10 23:51:28 +00:00
|
|
|
add_ramp(70,25,40,-5)
|
|
|
|
|
2021-06-10 20:53:56 +00:00
|
|
|
add_ramp(50,20,15,10)
|
|
|
|
add_ramp(60,50,15,-15)
|
2021-06-10 23:02:14 +00:00
|
|
|
add_ramp(52,60,14,0)
|
2021-06-10 21:28:26 +00:00
|
|
|
add_ramp(45,75,10,30)
|
2021-06-10 22:04:02 +00:00
|
|
|
|
2021-06-10 23:02:14 +00:00
|
|
|
add_ramp(64,76,0,10)
|
|
|
|
add_ramp(64,86,6,0)
|
2021-06-10 22:04:02 +00:00
|
|
|
add_ramp(70,76,0,10)
|
2021-06-10 23:02:14 +00:00
|
|
|
|
|
|
|
add_lever(30,30,20)
|
2021-06-10 20:17:14 +00:00
|
|
|
end
|
|
|
|
|
2021-06-10 20:53:56 +00:00
|
|
|
function add_ramp(x,y,dx,dy)
|
|
|
|
r = {}
|
|
|
|
r.x = x
|
|
|
|
r.y = y
|
|
|
|
r.dx = dx
|
|
|
|
r.dy = dy
|
|
|
|
add(ramps, r)
|
|
|
|
end
|
|
|
|
|
2021-06-10 23:02:14 +00:00
|
|
|
function add_lever(x,y,len)
|
|
|
|
l = {}
|
|
|
|
l.x = x
|
|
|
|
l.y = y
|
|
|
|
l.len = len
|
2021-07-07 15:18:16 +00:00
|
|
|
l.angle = 0.06
|
|
|
|
l.weight = 0
|
2021-06-10 23:02:14 +00:00
|
|
|
add(levers, l)
|
|
|
|
end
|
|
|
|
|
2021-06-10 21:28:26 +00:00
|
|
|
function _update()
|
|
|
|
update_player()
|
|
|
|
update_drops()
|
2021-06-10 23:51:28 +00:00
|
|
|
foreach(levers, update_lever)
|
2021-06-10 21:28:26 +00:00
|
|
|
end
|
|
|
|
|
2021-06-10 20:17:14 +00:00
|
|
|
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
|
2021-06-10 23:51:28 +00:00
|
|
|
player.x = mid(0, player.x, 127)
|
|
|
|
player.y = mid(0, player.y, 127)
|
2021-06-10 20:17:14 +00:00
|
|
|
|
2021-06-10 20:34:33 +00:00
|
|
|
if btnp(🅾️) then
|
2021-06-10 20:17:14 +00:00
|
|
|
drop = {}
|
|
|
|
drop.x = player.x
|
|
|
|
drop.y = player.y
|
2021-06-10 20:34:33 +00:00
|
|
|
add(drops, drop)
|
2021-06-10 20:17:14 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-06-10 23:02:14 +00:00
|
|
|
function update_lever(l)
|
2021-07-07 15:18:16 +00:00
|
|
|
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
|
2021-06-10 23:02:14 +00:00
|
|
|
end
|
|
|
|
|
2021-06-10 21:28:26 +00:00
|
|
|
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
|
|
|
|
|
2021-06-10 20:17:14 +00:00
|
|
|
function update_drops()
|
2021-06-10 20:53:56 +00:00
|
|
|
draw_world()
|
2021-06-10 20:17:14 +00:00
|
|
|
new_drops = {}
|
|
|
|
for i=1,#drops do
|
2021-06-10 21:28:26 +00:00
|
|
|
d = drops[i]
|
2021-06-10 23:06:50 +00:00
|
|
|
oldx = d.x
|
|
|
|
oldy = d.y
|
2021-06-10 21:28:26 +00:00
|
|
|
update_drop(d)
|
|
|
|
if d.y < 128 then
|
|
|
|
add(new_drops, d)
|
2021-06-10 20:17:14 +00:00
|
|
|
end
|
2021-06-10 23:06:50 +00:00
|
|
|
pset(oldx, oldy, bg)
|
|
|
|
pset(d.x, d.y, white)
|
2021-06-10 20:17:14 +00:00
|
|
|
end
|
|
|
|
drops = new_drops
|
|
|
|
end
|
|
|
|
|
|
|
|
function _draw()
|
2021-06-10 20:53:56 +00:00
|
|
|
draw_world()
|
2021-06-10 20:17:14 +00:00
|
|
|
spr(player.spr,player.x-1,player.y-1)
|
2021-06-10 23:02:14 +00:00
|
|
|
print("("..player.x..","..player.y..")", 1, 1, white)
|
|
|
|
print("drops: "..#drops, 1, 7, white)
|
2021-06-10 20:17:14 +00:00
|
|
|
end
|
|
|
|
|
2021-06-10 20:53:56 +00:00
|
|
|
function draw_world()
|
|
|
|
cls(bg)
|
|
|
|
foreach(drops, draw_drop)
|
|
|
|
foreach(ramps, draw_ramp)
|
2021-06-10 23:02:14 +00:00
|
|
|
foreach(levers, draw_lever)
|
|
|
|
end
|
|
|
|
|
|
|
|
function draw_drop(drop)
|
|
|
|
pset(drop.x, drop.y, white)
|
2021-06-10 20:53:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
function draw_ramp(r)
|
|
|
|
line(r.x,r.y,r.x+r.dx,r.y+r.dy,brown)
|
|
|
|
end
|
|
|
|
|
2021-06-10 23:02:14 +00:00
|
|
|
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)
|
2021-06-10 23:51:28 +00:00
|
|
|
circ(l.x,l.y,1,black)
|
2021-07-07 15:18:16 +00:00
|
|
|
print(""..l.weight,1,13,red)
|
2021-06-10 20:17:14 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
__gfx__
|
|
|
|
000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
|
|
00000000aaa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
|
|
007007000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
|
|
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
|
|
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
|
|
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|