Designing Inkloop: loops, cuts and seals
Why the only way to die in Inkloop is to be enclosed, why cutting never kills, how the bots are tuned to feel human, and what changed after simulation.
In Inkloop you are a brush running across rice paper. The tip always moves forward and your mouse steers it. Cross your own stroke and you close a loop: the ink dots inside become yours, and any rival tip inside is stamped with a vermilion seal and knocked out. This piece covers why the rules work this way and what simulation made us change. If you'd rather try it first, Inkloop is here.
One verb: draw a loop
We planned three io-style games together, and each needed its own core verb so we wouldn't end up with three reskins of one eat-and-grow game. Inkloop's verbs are loop and cut.
The rules are deliberately few:
- Every step, the game checks whether the newest bit of your stroke crosses an older part of it. If it does, the crossing point, everything drawn since and the tip form a loop.
- Every dot inside is collected and every enemy tip inside is sealed. Tiny loops don't count, so a shaky mouse can't close one by accident.
- The sealer gets 40% of the victim's ink at once; another 40% spills along the victim's stroke, and the rest is gone.
Touching dots also eats them, but enclosing them is far more efficient. The pace of the game rests on that gap: wandering keeps you alive, loops make you grow.
You only die by being enclosed
There's no dying by hitting a wall or touching a stroke; you slide along the edge of the paper. The only death is being sealed, so every death has a clear answer to "who, and how", and the answer is always something another player drew. New brushes can't be sealed for 3 seconds, so nobody spawns straight into a loop.
Cutting is a counter, not a kill
When your tip crosses an enemy's stroke, the stroke is severed there. Everything older than the crossing vanishes and leaves a few dots behind.
We made cuts non-lethal on purpose. If crossing a stroke killed its owner, the game would turn into Snake, a contest of who bumps into whom first. A cut only tears down the other brush's net, so the real contest becomes surrounding versus escaping. When you're being fenced in, cutting your way out is the only escape, and the most important move in the game.
Only the closed part is spent
When a loop closes, only the stretch that formed it is used up; the older tail stays. Clearing the whole stroke would be simpler, but a long-stroked player would lose their advantage every time they scored. Keeping the tail makes figure-eights and chains of loops an advanced technique.
Bigger means clumsier
Your ink is your score, starting at 20. More ink means a longer maximum stroke (520 + 2.2 × ink, capped at 5200) that can enclose more ground, but also slower turning: your tightest turning radius grows from about 55 to about 82.
Every io game has to give the big fish a weakness, or the leader snowballs. Here, a long stroke takes a long time to close, and that time is a smaller player's window to cut it.
Boosting follows the same thinking. Holding the action key gives you 1.75 times the speed for 5 ink a second, and that ink drips out behind you as dots, so a chase leaves a trail that gives a third brush a reason to come closer.
Bots that surround, escape and make mistakes
There are 24 bot brushes. They forage by circling dense patches of dots, hunt by looping around another brush's recent path, close fast when someone wanders into their loop, and cut their way out when fenced in. Aggressive ones also slash through strokes just ahead.
What makes them beatable is a handful of limits:
- A bot only hunts what it can enclose. It estimates the circle its target has covered over roughly the last 700 units of travel and gives up if its own stroke can't go around it. So it's usually a big brush hunting a small one.
- Noticing a fence takes time. Cautious bots notice once an enemy stroke has wrapped about 220° around them, careless ones not until about 265°. Then comes a reaction delay of up to almost 0.8 seconds, shorter for skilled bots.
- Crowded pools are worth less, so bots don't all pile onto one spot and cut each other to pieces.
Ink on rice paper
Each game in the plan has its own art direction, and Inkloop is the only light one: off-white rice paper (#f2ead7) with a fibre texture, a faint grid, and a double-lined border like the edge of a carved seal.
The player is always black ink; every bot is a coloured pigment such as indigo, malachite, ochre or gamboge. On a screen full of crossing strokes, finding yourself comes first, and black has the strongest contrast on off-white paper. Vermilion is kept for the seal and never given to a brush.
Strokes taper and fade from tip to tail, and the feedback borrows from calligraphy: a closed loop gets a translucent wash in its owner's colour that spreads and fades, a seal is a tilted vermilion stamp of 封 ("seal"), and a cut is a splash of ink with 切 ("cut").
Danger hints: telling the human what the bot knows
A bot can calculate exactly how far it has been surrounded; a person watching a busy screen usually can't. So when one enemy stroke wraps more than 200° around you, a vermilion vignette rises at the screen edges and a heartbeat plays.
The angle is a winding angle: walk along the enemy stroke and add up how much its bearing from you changes. A straight stroke passing by tops out at 180°; a real loop approaches 360°. The bots' escape check uses the same calculation.
What changed after simulation
Once the original design was built, we ran it headless with 25 brushes for 5 to 10 minutes at a time. The main changes:
- The starting stroke grew from 394 to 564. 394 was barely longer than the tightest possible circle (about 344 around), and people drawing with a mouse go wider. New players couldn't close a loop at all; now loops of radius 80 or so close.
- Cuts became zero-sum. Cuts used to create dots from nothing and pay the cutter +3. With 20 to 30 cuts a second, median ink hit 1200 within 3 minutes. Now both come out of the victim's ink (never below 20), which also makes a long stroke a liability.
- Ink gathers in moving pools. Spread evenly, a loop of radius 150 caught about 6 dots, no better than wandering. Now 60% of new ink lands around 9 pools, so looping one yields 30 to 60. One pool moves every 25 seconds, and refilling is capped.
- Surround detection switched to the winding angle. Counting 16 sectors scored a passing straight stroke as more than 180°, so a third of the bots were always escaping.
- Bots got reaction time. Escaping instantly, they allowed fewer than ten seals in five minutes. With the delay, the crowding penalty and fast closing, simulations settled at about 9 to 12 seals a minute.
- Interface fixes. The kill feed shows only seals, since cuts happen several times a second, and on touch screens the minimap moved left to make room for the boost button.
The bot and simulation approach is shared across the plan; the details are in io games without servers.