Skip to main content

snekmaze2.p8 (Source)

-- snekmaze ii
-- by arborelia
function _init()
-- tiles to move per frame
-- don't make this more than 1
fstep = 1/6
-- step counter
-- it can overflow, that's fine
step = 0
trailpos = 0
-- number of frames in trail
ntrail = 20
-- size of the grid (even)
gsize = 10
-- where to go in the tile
enterx = -1
entery = 0
exitx = 0
exity = -1
-- which tile we're in
tx = 0
ty = 0
grid = {}
local x,y,i
for x=0,gsize-1 do
  grid[x] = {}
  for y=0,gsize-1 do
   grid[x][y] = 0
  end
end
-- size of each tile
tsize = flr(128/gsize)
border = (128 - tsize*gsize)/2
camera(-border,-border)
-- trail of prev. locations
trail = {}
trail.x = {}
trail.y = {}
for i=0,ntrail-1 do
  trail.x[i] = 0
  trail.y[i] = 0.5
end
-- draw starting grid
cls(7)
for x=0,gsize-1 do
  for y=0,gsize-1 do
   draw_tile(x,y)
  end
end
flip_tile()
end
-- run updates at 60 fps
function _update60()
-- previous step
p_step = step
step += fstep
if flr(step) != flr(p_step) then
  enter_tile()
end
trailpos = (trailpos + 1) % ntrail
update_trail()
end
function enter_tile()
old_fx = fx
old_fy = fy
enterx = -exitx
entery = -exity
tx = (tx+exitx) % gsize
ty = (ty+exity) % gsize
local way = grid[tx][ty]
if enterx == 0 then
  exity = 0
  exitx = entery * (1-(2*way))
else
  exitx = 0
  exity = enterx * (1-(2*way))
end
flip_tile()
draw_tile(old_fx, old_fy)
end
function flip_tile()
-- which tile's being flipped
-- (global)
fx = (tx + gsize/2) % gsize
fy = (ty + gsize/2) % gsize
grid[fx][fy] = 1-grid[fx][fy]
end
function update_trail()
local half=tsize/2
local frac = step - flr(step)
local unfrac = 1-frac
local posx = (
  tsize*tx + half
  + half * unfrac * enterx
  + half * frac * exitx
)
local posy = (
  tsize*ty + half
  + half * unfrac * entery
  + half * frac * exity
)
trail.x[trailpos] = posx
trail.y[trailpos] = posy
end
function _draw()
local p = trailpos
local n = ntrail
draw_tile(fx,fy)
spot(
  trail.x[(p+1) % n],
  trail.y[(p+1) % n],
  7
)
spot(
  trail.x[(p+2) % n],
  trail.y[(p+2) % n],
  7
)
spot(
  trail.x[(p-1) % n],
  trail.y[(p-1) % n],
  3
)
spot(
  trail.x[p],
  trail.y[p],
  3
)
-- debug()
end
function spot(x,y,c)
local size=flr(tsize/8)
if size < 2 then
  rectfill(x,y,x+1,y+1,c)
else
  circfill(x,y,tsize/8,c)
end
end
function draw_tile(x,y)
local xin,yin,xout,yout,way,c
rectfill(
  x*tsize, y*tsize,
  (x+1)*tsize,
  (y+1)*tsize,
  7
)
way=grid[x][y]
-- where the gate goes, in
-- tile coordinates
xin=x
xout=(x+1)
yin=(y+(1-way))
yout=(y+way)
if way==0 then c=12 else c=14 end
-- is it the flipping tile?
if x==fx and y==fy then
  frac = step - flr(step)
  if way==1 then
   yin=(y+(1-frac))
   yout=(y+frac)
  else
   xin=(x+(1-frac))
   xout=(x+frac)
  end
  -- change line color
  c=1
end
if tsize > 8 then
  -- draw a thick line
  for dx=-1,1 do
   for dy=-1,1 do
    local pxin = xin*tsize + dx
    local pyin = yin*tsize + dy
    local pxout = xout*tsize+dx
    local pyout = yout*tsize+dy
    pxin=mid(x*tsize, (x+1)*tsize, pxin)
    pyin=mid(y*tsize, (y+1)*tsize, pyin)
    pxout=mid(x*tsize,(x+1)*tsize, pxout)
    pyout=mid(y*tsize,(y+1)*tsize, pyout)
    line(pxin,pyin,pxout,pyout,c)
   end
  end
else
  line(
   xin*tsize,yin*tsize,
   xout*tsize,yout*tsize,c
  )
end
draw_grid()
end
function draw_grid()
local x,y
for x=0,gsize-1 do
  for y=0,gsize-1 do
   px = x * tsize
   py = y * tsize
   if tsize > 8 then
    rectfill(px-1,py-1,px+1,py+1,6)
   else
    pset(px,py,6)
   end
  end
end
end
function debug()
rectfill(0,0,128,6,0)
print(step,0,0,7)
end