Designing chaos: ants that eat your ink
Draw-and-guess is a solved genre – which is exactly the problem. Our answer is the chaos system: round effects that actively sabotage your drawing while the AI keeps judging it. Red ants march across the canvas erasing your strokes (you can squash them mid-round), silver balls scribble their own trails over your art, the whole canvas rotates, mirrors, or fades your ink. This is the postmortem of designing them.
Why sabotage?
The tension in a drawing game usually comes from one place: time pressure. After enough rounds, skilled players converge on efficient sketches (our German tutorials teach exactly that) and rounds become predictable. Chaos effects re-inject uncertainty without punishing skill: your knowledge of what makes a cat readable still wins the round – you just have to defend it against ants eating your whiskers. The design goal in one line: disrupt the canvas, never the player’s mastery.
The architecture: effects are data
Every effect is planned server-side when the round starts. The plan is a small, boring dataclass – and boring is a feature:
@dataclass(frozen=True)
class PlannedRoundEffect:
effect_id: str
effect_kind: str
start_after_sec: float
duration_sec: float
payload: dict[str, object]
The payload dict fully parameterizes the client’s rendering:
an ant carries its path, speed, sprite size and erase radius; a silver
ball its trail width; a rotation its degrees per second. The client owns
animation frames, the server owns truth. Two consequences we love:
adding an effect variant is usually a payload-factory change with zero
client releases, and every effect is reproducible from logs because its
entire configuration went over the wire.
{
"runway": "path9", "one_shot": False,
"speed_vpx_per_sec": 360.0,
"ant_height": 24.0,
"erase_radius_px": 14.0, # the sabotage
"wander_seed": rng.randint(1, 2**31 - 1),
}
Note the wander_seed: ant wandering is random, but
seeded randomness – all clients in a room render the identical
ant walk. Chaos must be fair chaos.
Case study: the red ants
The ants went through more iterations than any other feature in the game. The concept was obvious from day one – something walks over your drawing and erases it – but every detail fought back:
- Erasing is communication. The ant doesn’t delete your strokes in one frame; it eats them continuously along its path (an erase event every few pixels). Players must see the damage happening to feel the threat – an instantly-missing line just reads as a bug.
- Counterplay changed everything. The single best iteration: making ants squashable. Tap an ant, it splats (0.9 s fade), your ink is safe. Suddenly the effect isn’t something that happens to you but a real-time decision – keep drawing or go hunting? Playtests flipped from “annoying” to “favorite effect” on this one change.
- Fairness needed two patches. Full-speed ants left too little time to react, and tap targets the size of the sprite demanded pixel-perfect aim on phones. Squashable ants now walk ~35% slower than decorative ones, and their invisible tap target is padded well beyond the sprite. Nobody notices either change – everybody feels them.
Announcing chaos (harder than building it)
Our longest-running design bug wasn’t an effect – it was telling players about effects. The announcement banner went through a fly-through phase (too fast to read), a slower fly-through (too annoying), a bouncing badge (cute, unreadable) and a static in-canvas badge (readable, but players confused it with the word badge showing what to draw). The lesson we finally accepted: information about the canvas must not live on the canvas. Effect announcements now appear in the prediction panel, in the player’s peripheral vision, as colored chips that fade in for a second, hold for five, and fade out – and when several effects stack, the chips take turns instead of crowding. Unmissable, unconfusable, and out of the way of the actual drawing.
Tuning knobs we ended up needing
- A chaos slider per room – from “never” to “every round”, because groups differ wildly in how much sabotage they find funny.
- Effect exclusion rules – some pairs must not stack (two canvas transforms at once is nausea, not chaos).
- Announce flags per effect instance – eight ants are one logical effect and get one chip, not eight.
- Sound ownership groups – simultaneous ants share one loop instead of eight overlapping ones. Audio chaos is the bad kind of chaos.
What we learned
Three takeaways if you’re adding modifiers to any skill game. First, every disruption needs counterplay or it reads as punishment – the squash mechanic carried the entire system. Second, seeded determinism is non-negotiable in multiplayer: shared chaos is funny, divergent chaos is a desync bug report. Third, budget as much design time for communicating a mechanic as for building it; our ants took days, their announcement banner took weeks.
Previous: the 150 ms budget. Next and last in the series: what happened when we tried to monetize all this.
Meet the ants
Set the chaos slider high, start a round, and see how long you keep calm when your cat’s whiskers start disappearing.
Play DrawLa