pico-8/picogora.p8

204 lines
3.7 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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