Published 2026-09-26
The line between difficult and unfair is almost always a telegraph. Here is the whole warning system of REELS read out of the source: the 1.7 second poster that freezes the toll clock, the ground marker primitive written at 01:37 on 18 August 2026, the four attacks that use it with their exact delays, and the one bug class that quietly breaks every telegraph in a game.
Every player can tell the difference between a game that is hard and a game that is unfair, and almost nobody can say where the line is. It is not damage. A hit that takes sixty percent of your health is not unfair by itself. It is not speed either, and it is not the number of things on screen.
The line is almost always a telegraph. A hit is fair when the information needed to avoid it existed, on screen, early enough to act on, and you can name what you should have done instead. A hit is unfair when the honest answer to "what should I have done" is "started dodging before the thing existed."
That makes telegraphing a measurable design problem rather than a matter of taste, which is convenient, because it means you can read a game's answer straight out of its source. So here is mine. REELS is a slot machine roguelite I shipped on 2 September 2026, it has eleven guardians and seventeen ordinary beasts, and this is every warning it gives, with the numbers and the dates.
In REELS a run is a stack of sixty second tolls. Every third toll has a guardian, and the guardian is drawn when you enter the toll, not when it spawns. The distinction matters more than it sounds, and there is a comment in the engine explaining why the draw is never repeated at spawn time: re-rolling there would be the only way to announce one guardian and then send a different one.
So the arena opens and a poster lands. It holds for 1.7 seconds and it carries the count and the names, one per line. One guardian reads TOLL WARDEN. Two read DOUBLE BILL. Three read TRIPLE BILL, and the font drops from 34 points to 28 to 24 so that three names still fit on an iPhone SE.
The staging is deliberate to an embarrassing degree, and every beat has a reason written next to it. A white flash first, gone in about six hundredths of a second, because it cuts the read and forces the eye to restart. Then two brass blades sliding in from opposite edges, because opposing motion creates tension and a crossfade creates none. Then the names, each one entering 0.09 seconds after the last, because watching them land one after another says "there are several" better than any word would. Each name arrives at 1.9 times its final size and overshoots below it before settling, because text that arrives exactly at its size has no impact. And the poster leaves upward rather than fading, because you chase a card off, you do not erase it.
Then the part that actually makes it a telegraph rather than a cutscene: the sixty second clock does not run while the poster is up. There is a flag for it, `enPresentation`, and the reasoning on it is one line. A warning is preparation information. It is only worth anything if you can read it before you have to play. Without the freeze, the countdown started underneath the poster and the warning became an interruption instead.
Announcements are unusually good at breaking silently, because a warning that fails looks like no warning at all rather than like a crash. This one failed three times.
The first version read the run clock to animate itself. That clock stops, because the descent cage between tolls freezes the engine. So the poster froze on its own first instant, which is the white flash: the whole screen washed out, measured at 153 average luminance against 20 at rest. The fix is that a staged effect never depends on a clock the game is allowed to suspend, so the poster now runs on the view's own timeline.
The second was worse because it was invisible. The view compared the engine's announcement number to a counter it kept itself, and that counter outlived the run. A player who had met three guardians started their next run holding a 3 against a fresh engine counting from 0, so the first three guardians of the new run arrived in complete silence. The fix was to make the announcement a consumable value owned by the engine, which cannot desynchronise because a fresh engine is born empty.
The third was geometric. The two brass blades were pinned at plus and minus 38 points, sized for a single name. On a triple bill the third name fell underneath the bottom blade and read as a missing name. The frame is now computed from the count.
Until that night, every danger in REELS was one of two things: a body you touch, or a projectile you dodge. Both are read from their position. You look at where the thing is, you infer where it will be, you move.
The commit that landed at 01:37 on 18 August added six new beasts, and the note in it says the real addition was not any of them:
> A telegraphed ground slam is a new primitive, and it is the real addition. Every danger in the game so far was either a body you touch or a projectile you dodge, two dangers that are read from their position. A ground slam is read from its countdown: the player has to reason about time. Written once, it will serve the guardians.
That is the whole idea. A marked circle on the floor is a danger that has no position problem at all, because it is already exactly where you are. The only question it asks is *when*, and the only correct answer is *before*.
The beast that introduced it, The Crusher, was built to make the point as bluntly as possible: it never touches you. It parks at range, retreats if you get within 105 points, holds still between 105 and 150, and marks the floor under your feet. It is the only beast in the game you dodge by moving rather than by moving away from it. It waits 1.4 seconds after spawning before its first mark, then marks once every 3.4 seconds, and it only enters the spawn table at toll 9 with a weight of 0.07, because it is the hardest read in the ordinary bestiary and it should not be the first one you meet.
The marker has to communicate two different things at once, and it has three seconds of the player's peripheral attention to do it in. It does it with three visual parts, none of which is a bar or a number.
The outer ring gives the exact footprint. Not an approximation, not a glow: the stroke is the hitbox, and the engine tests the same radius the ring draws. You have to be able to tell at a pixel whether you are inside.
The inner disc fills from the centre outward. That is the countdown, and it is a fill rather than a dial because a fill is legible in a fraction of a second at the edge of your vision.
And the last stretch pulses. Past 62 percent of its delay, the ring goes from 2 points wide to 3, its opacity swings between 0.55 and 0.95, and the fill swings between 0.12 and 0.24, all driven by a sine at 26 radians per second, a little over four beats a second. The threshold is not decorative. Sixty two percent of the delay leaves 38 percent, and across every delay the game uses, that lands between 0.36 and 0.53 seconds. The pulse is, always, roughly the last half second, which is the only moment the information becomes urgent.
The impact adds one more thing that costs nothing mechanically: a shockwave with zero damage and no hostility, purely for the crash. The circle had already decided who got hit. Without the wave, the impact was invisible, because the circle simply vanished and that was the whole event.
| Attacker | Delay | Radius | Damage | |---|---|---|---| | The Human Cannonball, guardian | 0.95 s | 62 | 26 | | The Slugger, guardian | 1.2 s | 56, or 84 enraged | 24 | | The Crusher, ordinary beast | 1.25 s | 48 | 20 | | The Fortune Teller, guardian | 1.4 s | 54 | 22 |
Look at the delay column against the damage column. They are not correlated, and that is the interesting part, because the intuitive rule would be "bigger hit, longer warning." The delay is not priced against damage. It is priced against how hard the read is.
The Human Cannonball has the shortest fuse and the biggest hit. His circle appears exactly where you are standing, so the read is trivial: move. He is also two beats on one timer, which is why the delay and his cooldown are the same 0.95 seconds. He aims, the circle drops, and he lands in it at the precise instant it detonates, because the landing and the crash have to be the same event or you cannot work out what hit you. The consequence is stated in the commit that added him: you cannot dodge him by running, because he is coming to where you were. You have to leave early.
The Fortune Teller has the longest fuse and one of the smaller hits, because her read is the hardest in the game. She does not mark where you are, she marks where you are going. One circle on you, then two more ahead of you along your current heading, spaced 0.42 seconds of travel apart at your exact speed of 168 points per second, so the chain reaches about 141 points down your own trajectory. Enraged, five circles, reaching about 282. It is the first attack in REELS that punishes a trajectory rather than a position, and it makes continuing in a straight line the single worst reflex available. Her circles are also clamped to stay 30 points inside the arena walls, because a read you can beat by hugging a wall is not a read.
The Slugger sits between them, and he is the clean case: a guardian whose body is slow and nearly harmless because the floor hits for him. His drawn hammer follows the real cadence, slow lift and short fall, so the animation is not an illustration of the timer, it is the timer. Enraged he halves his cycle from 3.2 seconds to 1.6, widens from 56 to 84, and adds a second circle where you would be if you ran straight, which is the Fortune Teller's read arriving inside a different fight.
Two beasts telegraph without any marker at all, and both were written the same night as the primitive.
The Charger runs three beats off its own age on a 2.4 second cycle. For the first 0.9 seconds it aims, tracking you, standing still. Then for 0.45 seconds it crosses in a straight line along the heading it froze at the end of the aim. Then it recovers, immobile, for the rest of the cycle. Its nostril visibly blows during the wind-up, and its horn is drawn in the game's hazard material because the horn is the part that connects. The comment above it is the thesis of this whole post:
> This is the only enemy you beat by reading its wind-up. During the nine tenths of a second it spends aiming you know exactly where not to be, and it is standing still, so it is easy to hit. A telegraphed enemy is not a weak enemy, it is an enemy that rewards attention.
Note what the aim window actually is. It is a warning for you and a free window for your weapons, at the same time, in the same 0.9 seconds. That is why telegraphing does not make a fight easier so much as it makes a fight about something. The trade is legible, so there is a skilled way to take it.
The Watcher inverts the same clock. It is planted, it does nothing, and it is invulnerable with its eye shut, open for 1.5 seconds out of every 3. The question it poses is not where it is, it is when you are allowed to hurt it, and the cost it imposes is the firing time you spend waiting.
Both of those have the same failure mode, and it is the reason the Watcher's eye lives in a single function read by two callers.
A telegraph is a promise made by the drawing to the simulation. The moment the picture and the rule run off separate clocks, the promise breaks, and it breaks in the worst possible direction: the player believes something that is not true. The Watcher's eyelid was originally not fed the individual beast's age, which means the lid would have sat shut while the engine had the eye open. The note on the fix is blunt about what that is: an enemy you think is vulnerable is not a difficulty, it is an unplayable bug.
The same night produced its mirror. The Harpooner's pull was computed from a heading vector that had already been inverted while it backed away, so it pushed the player instead of pulling them. Every visual cue was correct. The rule did the opposite.
Neither of those crashes. Neither shows up in a test. They just make the game feel like it is lying, which is exactly the feeling players describe as unfair, and they are right, because it is. So the rule I ended up with is not about delays or radii at all: one clock, one owner, read by both the picture and the rule. The Watcher's open eye is one pure function. The Slugger's hammer animation is driven by the real attack cadence. The slam ring draws the radius the engine tests.
None of this means the warning has to stay generous. Every guardian in REELS has a single rage threshold at half health, and rage is mostly implemented by shortening telegraphs: the Slugger from 3.2 to 1.6 seconds, the Fortune Teller from 4.4 to 2.8 with five circles instead of three, the Human Cannonball from 3.6 to 2.2.
Shortening a telegraph is fair in a way that removing one never is. The information is still there, it is still complete, and it is still early enough to act on. What changed is how much of your attention it costs to keep reading it, which is the actual skill the fight was testing all along. I wrote about that threshold and what it does to a fight in half health changes the rules.
The one thing the game never does is shorten the delay below the point where the pulse can finish. 0.95 seconds is the floor, and it belongs to the read that only asks you to move.
If you are building anything in this genre, the useful version of all this is not the numbers, it is the ordering. Decide how hard the read is first. Then price the delay against the read, not against the damage. Then make the countdown a shape rather than a number, give the last half second a different look, and put the picture and the rule on the same clock, forever.
A player who dies to a telegraphed attack says "I should have moved." A player who dies to an untelegraphed one says "this game is cheap." Those are the same death. The only difference is whether the game was willing to tell them first.
REELS is free to try through toll 05 on iPhone, and one purchase unlocks the whole machine, permanently: https://apps.apple.com/app/id6801441632
New to the genre and wondering what all these words mean? Start with what a roguelike actually is.