Sprite programs
Sprites are programs, not pixel grids. gen/sprites.lua runs at game
boot; each sprite.def draws onto an indexed canvas and registers the
result by name for spr(...) and map layers.
sprite.def("slime", 16, 16, function(c)
c:sym_x()
c:oval(2, 6, 12, 9, P.moss, true)
c:px(5, 9, P.ink)
c:outline(P.ink)
end)
sprite.def("walk", 24, 24, { frames = 4 }, function(c, f)
-- called once per frame, f = 1..4
end)
Canvases go up to full screen (768×432) — a stage backdrop is one sprite, one blit. Earlier-defined sprites can be stamped into later ones.
Ops
Shapes and pixels:
px(x,y,c) get(x,y) line(...) rect(...) oval(...) circ(...)
tri(...) poly({x1,y1,x2,y2,...}, c, fill) flood(x,y,c)
fill(c) clear() replace(from,to)
Strokes (the figure-drawing kit):
capsule(x0,y0,x1,y1, r, c) thick round-capped line
taper(x0,y0,x1,y1, r0, r1, c) width lerps end to end
qcurve(x0,y0, cx,cy, x1,y1, r0,r1,c) tapered quadratic curve
Painterly (deterministic, seeded):
brush(cx,cy, r, c, jitter, seed) noise-edged dab
feather(a, b, strength, seed, n?) dither-swap along every a|b edge
featherr(x,y,w,h, a,b, s, seed, n?) feather confined to a rect
glaze(x,y,w,h, from, to, dens, seed) scatter-replace wash
vgrad(x,y,w,h, {c1,c2,...}, blend, seed) banded gradient, dithered seams
ridge(x0,y0,x1,y1, amp, seed, c, "down"|"up"|"left"|"right")
fractal skyline / strata edge, filled
mottle(x,y,w,h, target, {ramp}, scale, seed) fBm stone/texture recolor
Form and light:
shade(base, {ramp}, "down"|"up"|"left"|"right") banded replace of a color
bevel(target, hi, lo) 1px lit top edge + core shadow, per mass
form(target, hi, lo, kTop, kBot, seed) banded core shading, dithered
rimtop(c, skip?, keep?) rim light along every top edge
outline(c, diag?) contour into transparent pixels
outline_open(c, lit) outline that opens on lit crests
Texture and transforms:
dither(c, level) noise(c, p, seed) checker(...) pattern(...)
sym_x(on?) sym_y(on?) flip_x() flip_y()
stamp(name, x, y, flipx?, flipy?, frame?) composite an earlier sprite
The look loop
Render, look, edit, repeat:
byo sprite render slime --game mycart --zoom 8 -o slime.png
Over the venue API the same loop is screenshot — the returned image URL
embeds in chat as markdown.