antipattern

Use when

Randomness affects outcomes players feel they controlled.

What it is. Randomness sits on the output of a decision instead of its input, so a correct play loses to a die roll. The player did the math, made the read, executed — and the result was overwritten by a number they never saw coming.

Why it hurts. Skill only feels like skill when the same input reliably yields the same result. When a coin flip stands between choice and consequence, the game stops teaching. Wins feel unowned, losses feel robbed, and both erode the trust that keeps a player pressing forward. See pattern-fairness-and-trust and pattern-mastery-and-flow.


The smell

Attribution flips from self to fate. The player stops saying “I misjudged that” and starts saying “the game screwed me.” Once losses route to luck instead of choice, the feedback loop that drives system-mastery-curve is severed — nothing learned, nothing to do differently next time.

How it happens

TrapWhat it does
Output randomnessThe move is committed, then a roll decides if it lands. 85% hit that whiffs three times running.
No floorA drop table with no system-loot-tables pity can leave a player 0-for-40 on the item the build needs.
Compounding rollsTen independent coin flips per run; one bad tail cascades into an unrecoverable state.
Invisible mathThe die is rolled behind the curtain — the player can’t price the risk, so they can’t consent to it.
Swing > playThe variance band is wider than the skill band. The best and worst players converge on the same win rate.

The tell (check your own design)

The fix

Randomize the inputs, not the outputs. Deal the hand randomly, then let skill resolve it deterministically. The randomness that sets the problem is generative; the randomness that overturns the answer is theft.

CureHowLink
Move RNG upstreamRandom draw, random spawn, random board — deterministic resolution. The player adapts to the variance instead of being punished by it.system-procgen-design · system-spawn-directors
Pity & floorsBad-luck protection: rising odds, guaranteed drop after N misses, no-repeat windows.system-loot-tables · system-reward-schedules
Surface the mathShow the hit chance before commit, and consider showing the roll. Consented risk stops feeling stolen.pattern-fairness-and-trust · pattern-readability
Bound the swingCap variance so the skill band stays wider than the luck band. Deterministic damage, telegraphed enemy intent.system-difficulty-and-dda · system-telegraphs
Grant recoveryOne bad roll shouldn’t end the run. Rerolls, mulligans, second chances keep agency alive.system-grace · pattern-anti-frustration

Design axiom: if you can’t remove the die, make the player choose to roll it with the odds in hand. See also antipattern-fake-choice — invisible RNG turns a real choice into a fake one.

Twist seams

Seen in…

Verify / guard

Design here, prove there. Assert that skill dominates variance before handoff: simulate skilled vs. unskilled agents over many seeded runs and confirm their win rates separate — if they don’t, the swing is too wide. Confirm pity floors actually trigger and that every advertised probability is visible pre-commit. The frontmatter’s verify-with (design/FUN.md, traditional roguelike) is the fun bar; run the fairness checks in pattern-fairness-and-trust and the schedule guards in system-reward-schedules alongside it.

This module rendersthe repo's markdowndirectly — edit it there, it changes here.