We're seeing some capacity limits, so parts of the site may be slow or briefly unavailable while we work on an upgrade. Please try again later, or join our Discord for updates.
Discord
Dev blog
Match engine

Giving the match sim a story

Dota Captain
6 min read

Watching pro Dota is fun because of the casters. So instead of handing you a dry match log, I made the sandbox read like a caster calling your game, without ever inventing a moment that did not happen.

The best part of watching pro Dota, for me, was never only the game. It was the casters. Two people who make a teamfight feel like it matters, who tell you why a pickoff swung the game, who turn a screen full of numbers into a story you actually want to follow. Meanwhile my own match simulator just handed you a log: a flat list of events that read like a bank statement. So the idea was simple, if a little ambitious. Instead of making you read a log, I wanted the sandbox to read like a caster was calling your game. This is how I did that, and why staying honest to the events mattered more than sounding clever.

The problem: numbers are not a narrative

If you dump a match as a list of events, it reads like a receipt. A new player learns nothing from it, because the thing that actually teaches Dota is the shape of the game: who won the lanes, when the tempo shifted, which pickoff opened the map, and why the high ground finally fell. That shape lives in the relationships between events, not in any single number.

So I added a caster layer. It reads the whole event stream after a match resolves and narrates it the way a broadcast would, calling the opening, the swing moments, and the closeout. The goal was never flavor for its own sake. It was to make the sandbox explain itself, so a player can see the causal chain from their draft to the result.

The rule I would not break: never invent a beat

The easy way to make narration sound exciting is to let it embellish. That is also the fast way to make it lie. If the caster describes a heroic teamfight hold that the simulation never produced, the player learns a false lesson and stops trusting the tool. So the hard constraint I set was simple: every line of narration must map to a real event or a real trend in the data. No invented fights, no phantom comebacks.

In practice that meant the storytelling and the event log are wired to the same source of truth. When I tightened the narration recently, most of the work was removing places where the prose drifted ahead of what the events supported, and pinning each beat to something that actually happened in that match.

What it teaches you about real Dota

Reading a game as a story is a skill you can carry into your own matches. Almost every Dota game has the same skeleton: the draft sets the win conditions and timings, the laning stage decides who starts ahead, an early pickoff or objective converts that lead into map control, a mid-game window belongs to whoever spiked, and the game ends when one side can force high ground. When you can name which beat you are in, you make better decisions, because you know what the game wants from you right now.

That is the real payoff of narrating the sim. It is not decoration on top of a calculator. It is a way to practice seeing the arc of a game, so that when you play your own, you already know the questions each phase is asking.

Match engineDesign notes