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:

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

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