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

Why one smoke shouldn't catch two lanes

Dota Captain
5 min read

A gank happens in one place. When my kill model let a single smoke catch heroes standing in two different lanes, it broke the one thing a Dota player knows is impossible. Here is how I fixed it.

A smoke gank is a group of heroes walking to one spot to kill someone. It has a location. So when my simulation produced a single gank that killed a mid laner and an offlaner at opposite ends of the map in the same beat, it was showing something every Dota player instantly knows cannot happen. Fixing that taught me a general lesson about how a kill event has to respect space.

The bug: a gank with no place

Under the hood, a kill in the sim is assembled from a few systems: who is where, who has pressure, who commits to a fight. It is easy for those systems to agree that two kills should happen around the same time without anyone checking that the victims were physically near each other. The result was a gank that caught two heroes who were nowhere near one another, as if a single smoke had teleported across the map.

A viewer forgives a lot from a simulation, but not this. Space is one of the first things a Dota player reads. If the same commitment kills a hero top and a hero bottom at once, the illusion breaks and the tool stops feeling like Dota.

The fix: make the second victim coherent

The change I shipped pulls a gank's second and later victims toward the zone of the first body. Once the first kill fixes a location for the gank, any additional victim is drawn to be someone who was actually near that fight. One smoke now catches heroes who are plausibly together, not a scattered pair in different lanes.

I paired that with a presentation fix so the story matches the geometry: the killer is pinned to the lane where the gank actually happened, and mutual trades are phrased as trades rather than as two unrelated pickoffs. The engine and the narration now agree on where a fight took place.

The Dota lesson underneath

This is really a statement about how ganks work. A smoke gank is a decision to collapse on one location, and its power is bounded by the fact that the attackers can only be in one place. Counterplay follows directly from that: do not be the isolated body far from your team, keep vision on the routes into your lane, and respect that a missing enemy support usually means a specific part of the map just got dangerous.

When I make the simulation obey that constraint, it stops producing impossible highlights and starts reinforcing a real habit: read where the enemy can actually be, and do not hand a single smoke two kills it never earned.

Match engineDesign notes