byo.games

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.