For Hardy’s pixel-art pass · replace the placeholder functions without touching physics
Runner A (baton)
Size: 16×24 px · Anchor: top-left (x, y)
Variants: idle, run-1, run-2, jump, baton-hold
drawRunner(x, y, w=16, h=24, color='#ff2a6d', hasBaton=true)
Runner B (no baton)
Size: 16×24 px · Palette: cyan (#05d9e8)
Eyes: currently at (x+4, y+4) and (x+4, y+10)
drawRunner(x, y, w=16, h=24, color='#05d9e8', hasBaton=false)
Platform
Ground: 720×40 · Small: ~100×12 · Goal platform: ~120×12
Tile left/center/right 16×16 if desired.
drawPlatform({x, y, w, h})
Goal Gate
Size: 50×40 px · any shape inside bounding box
drawGoal({x, y, w=50, h=40})
Hazard Spikes
Box: variable width × 20px tall · spikes render on top edge
drawHazard({x, y, w, h=20})
Orb / Butter Pearl
Radius: 5 px · glowing center + outer ring
drawOrb({x, y, r=5})
Crescent Bonus
Radius: 10–13 px · warm gold (#f7c95c) · subtle shimmer
drawCrescent({x, y, r≈12})
Handoff Zone
Box: 70×50 px · dashed border + label
drawHandoffZone({x, y, w=70, h=50})