Detailed stats-based item builds for Dota 2 (and stuff like that)

Lea Spectral
15 min readDec 19, 2021

Heya! Leamare is here.

For those who wasn’t there before, aside from constantly updating and working with teams PuckChamp and REDACTED, I’m also creating/updating a series of in-game guides called “Nerds Hero Builds”. And I’m also really into experiments with data in Dota (thanks to STRATZ for providing match data to make this possible).

This time I want to show you results of my long-running experiment, that started a bit more than a year ago (and eventually got delayed because of all the TI10 shenanigans): item builds based on item stats and progression trees.

Русская версия

You could’ve seen my in-game builds before: they all have “Nerds” in their name, and I’m constantly updating them (as well as adding new ones) since 2016, using stats and trends among the best hero players as a basis, as well as covering unorthodox ways to play heroes (like Morphling Support, Ion Cannon Luna, Magic Sniper or Crystal Maiden Core: another passion of mine).

I don’t always get enough time to improve on them, but this topic was always interesting to me. And my interest was just as big as my dissatisfaction with the existing tools

So here I will show you, what I’ve got, what was the problem and how I dealt with it.

The result

I’ll start with the thing that will be the most interesting for the biggest part of readers.

Let me present to you: the stats-based hero item builds section.

An example of a build: Immortal Rank Marci Offlane (almost final version)

Yes, it has a lot of different numbers, but I tried to get everything as intuitive as possible, while leaving the information that will be the most valuable for decision making, without overloading the end user with it (or at least without drawing too much attention to the info).

Where are skill builds and starting items? Sadly, I just didn’t track starting items, consumables and skill builds before, so I don’t have this data now. I have plans to come back to this in future, but honestly I don’t see this as a high priority task.

Because in the end all of this (either starting items, consumables or skill builds) can be easily chosen on the fly. While the item build can help you understand the hero, it’s strong and weak points and understand how to skill it. (besides, there are more important things I have to work on)

Why are there so many numbers? I left everything that might be handy for decision making. I chose the stats that I was using myself, as well as things that were pointed out by high rank players I showed the earlier versions to.

Why there are two kinds of neutral items? The first neutrals block shows the best of the most common neutrals as a part of build overview. Bottom neutrals block shows all the most common choices.

Who is this for

  • first of all it’s made for myself: this way it will be easier for me to update the in-game builds, which are…
  • …made for nerds and very passionate players
  • as well as pro players: while testing this feature I showed the final result to players of various teams, who pointed out multiple times that it increases efficiency of training

What’s so special about it

  • you can see best (of the most commonly chosen) neutrals
  • median timings of purchase, as well as winrate increases compared to games when the item wasn’t purchased
  • for items with important timings: showing time frame as a reference, as well as winrate gradient
  • it takes a note of alternative items that serve similar purpose and can replace each other (which also helps you compare items in a meaningful way, as well as understand why the hero builds a certain type of items and what for)
  • it takes a note of situational items and their time of purchase as well
  • and even shows possible swaps of order in which the items are purchased
  • shows most commonly purchased early game items
  • timescale that shows visually the order in which the items are purchased, as well as all potential choices a player might make

What it is NOT

  • it’s not the full blown hero guide with skill builds, talents choices, starting items, etc: I don’t have data for these yet
  • it’s not an interactive assistant that will guide you through the game
  • and it’s not even an automatically updating build that changes depending on the heroes in your match: it wasn’t ever a purpose *, and besides it’s just a page on the internet lol
  • it’s not a clone of Dota Plus or Dota2ProTracker (while the actual idea behind item builds trees and this feature took shape in one discussion with the D2PT dev we had a while back about how to approach item builds feature on D2PT)

* and a small footnote regarding “enemy dependent item builds”. While doing some experiments with the Immortal Rank data, I noticed that items stats don’t change significantly depending on a specific hero in the enemy team, except for lategame items.

Which made me realize: usually you buy core items for a hero to make it stronger by either amplifying the hero’s strengths or covering weaknesses. And once you’re done with them you get to lategame, where the real branching starts.

But my approach to this is simple enough: I want to make it more clear what choices make sense, but leave the final decision to the player — this is the idea behind alternative and situational items. It wouldn’t really be a good thing to just generate “a guide” to follow without putting any thought into it.

Where can I check this out

You can see this beauty in action in the Stats Hub on my website, in any report that has item build trees for roles (e.g. DPC 2021 reports, competitive meta and so on).

I would recommend checking out the Immortal Rank Last Week report: it always has just enough data and it’s always up-to-date:

And if your first thought while looking at the example above was “it looks cool, but I didn’t understand a thing”: don’t worry. You can open any build and click on the “Explain this to me” button to see the detailed explanation of what’s happening.

And you can also read further: below I will explain how it all started and how it all works.

How it started

So for a long time I had a question: what can we learn from items stats? However, I wasn’t able to find a proper answer to it for a long time.

Items stats on Dotabuff only represent the endgame inventory, and this doesn’t really represent the real picture. Stratz, on the other hand, allows you to use time filters for specific heroes and represent purchase times, but the way the info is presented makes it hard to understand what’s where.

Eventually this led to creation of items stats section on my website (you can read about it here). This section was heavily inspired by a post in STRATZ blog about item timings. And this post is the reason why I implemented winrates depending on early/late time of purchase.

And while working with items I also decided to combine the data with another thing I love a lot: graphs, creating item build trees, representing item build progression visually.

Around that time the idea of “stats based item builds” was born. That’s why I added timings data, critical timings and manually grouped items into specific categories (partial items, early items, minor, major, etc).

Items stats section

The item build progression trees idea was in my head for a while, and around August of previous year it took shape, thanks to the discussion with the Dota 2 Pro Tracker developer.

Our approach to item builds ended up being rather similar (basically the same trees idea), but looking at the final result of “averaged” resulting builds based on the trees left me dissatisfied. Only with the actual result a major problem surfaced, and I started looking for ways to approach it.

The problem

The issue I was dissatisfied with sounds rather simple: the builds don’t have the full information, while also often containing additional “noise”, like items that sneak into the build without being an actual part of it, or small items, stuff like that.

Purchase pattern @ Stratz

The root of the problem lies deeper: the machine doesn’t “think” like a player when creating the build, and the end user doesn’t have much choice or understanding of what options are there. This problem is a part of Stratz builds, in-game Dota Plus builds and even D2PT.

It’s all while some items are separated into a special category (like boots, which might not be purchased or upgraded by some heroes), or rely heavily on metadata (like items cost and recipes), which might make it less universal.

What should we do?

Let’s take a step back.

Back when I started making in-game builds, I ended up with five major categories of items:

  • early (everything that’s purchased before the main items)
  • core (everything that’s important to use the hero to its full potential)
  • situational early (items that you get along with/instead of early and core items)
  • lategame (items that are not essential for the hero, purchased after core items)
  • situational (everything else that might be purchased, depending on the situation)

These average builds usually end up showing only early, core and some of the lategame items (maybe all at the same time). While situational items often deserve more attention, since these additional choices reflect the actual nature of the hero and purchased items, while also making the player think.

These additional “branches” of decisions can be noticed with the item build based tree. This was the actual purpose behind adding this feature over a year ago.

Spectre item build as a tree

But this leads to another problem: the tree can show multiple different routes to build a hero, it can be interactive, but even for an experienced player this might be hard to use and understand.

The solution is simple: we already have the item timings stats, as well as the “build tree”. We just need a way to go around this tree, taking these branches into account.

If only everything was this simple. But the general idea is pretty much this.

How it works

The first drafts of how it was supposed to look were just simple paper sketches and they are long gone by now. But these are the closest “electronic versions” of them.

And the first major problem that occurred is related to this plural “Builds” in the title. Initially I wanted to go through one tree for one hero, “splitting” it into multiple playstyles.

However, it wasn’t as easy. First, not every playstyle is equal in popularity, so some end up being filtered out in process. Second, playstyles are a spectrum, they might intersect and have completely different key timings, as well as item purchase order. Third, considering previous two things, finding and comparing two different builds, leaving only unique ones, just takes too long.

So I decided to go with a simpler approach: there is a separate build for every role (if the hero has at least 5% of matches played on the role). This covers the biggest branching factor of playing on different roles.

And for one role different playstyles may be covered by alternative and situational item choices.

On paper generating item build by traversing the tree sounds easy enough: you start in the earliest point and choose the item with the most purchases after the current. With this approach, however, you miss out on two major things: some items might swap their order of purchase (meaning one item might be purchased after the other or vice versa), and in some cases the item doesn’t have a specific purchase order, but appears in the build at some point.

A couple of early prototypes

This approach also leaves you without additional item choices, including “alternative” items (or “alts” for short: items that might be purchased instead a core item, not affecting the rest of the build) and “situational” (items that might be skipped altogether, without changing much).

So I ended up with something more complex: every of the nodes gets an “order” assigned, and potential “alts” and “situations” are marked accordingly, and if a match from the current “round” appears as a child in the next one, the number of matches is combined, while the pair of items is marked as possible “order swap”.

As for the commonly appearing items without a specific “order” — I added “favor points”: additional purchase number multipliers based on the item’s placements in previous rounds (the earlier a round happened in relation to the current one, the less valuable it will be).

The last issue is pointing out a specific point in time (or rather the build) when the “lategame” starts, since every hero has a different number of “core” items. And this becomes easy because of a simple observation: core items usually go along a very clear and unified path, and the branching starts once it’s time for “lategame”. So we just need to track down the item after which this branching starts: this will be the “going to late” point.

It all sounds quite boring, but the main point is simple: these tricks covered all the problems that caught my interest. The only unsolved part would be using additional items (not appeared in the build) and purchase times, but this can be easily covered by stats, that also include purchase timings.

Unsolved issues

Of course, there are still some unsolved issues left.

First: the builds needs data, the more = the better. Obviously, if there’s not enough data, you have to improvise. I ended up using “pure stats” of items by grouping them together by purchase timings. It somewhat helped compensate the problems for cases when there isn’t enough data.

Good example would be TI10 report and builds in it. In cases like this you will see a special warning about the build not having enough data.

Second: the builds don’t take metadata into account (like items recipes), so sometimes you might see items that are OBVIOUSLY combined, but their combined version doesn’t actually appear in the build. But the only thing to do for now is rely on the player’s understanding of the game.

Queen of Pain mid would be a good example of this problem: Kaya and Sange are obviously combined into a single item, but Kaya & Sange isn’t a part of the main build

Third: sometime situational items are shown as “alternatives” and vice versa. It might disappear naturally, but in most cases it’s enough to just think for a bit when spotting something suspicious (and generally treat alternative items as another version of situational).

Arc Warden mid shows the third issue quite well: Dragon Lance is mentioned as an alternative to Mjolnir, but in reality they end up complimenting each other

The last one is a rare beast, but pops up from time to time. Some heroes are flexible and don’t have a specific playstyle, which leads to some wild results. But in a way it’s just a nature of these heroes.

Monkey King support as an embodiment of chaotic build

Generally speaking (in my opinion) these issues are small enough and don’t affect the overall experience that much if you’re being thoughtful about it — but this was expected from the very beginning.

It doesn’t matter I’m not going to revisit these issues eventually, but they are not going to be a priority for me.

What’s cool about it

Aside from how cool it looks, the main thing that I love about it is the ability to understand how the hero is played and what to do with them in, all of that in a quick way.

When I was showing this to players of the (professional) teams I am working with, as well as various influencers, most of them immediately pointed this out (as well as the builds being pretty accurate).

The most important aspect of it is being able to understand how to play the hero by looking at alternative items. Using Spectre’s item build as an example: Falcon Blade is commonly used as an early stats item, as well as a farm item, since it gives a lot of mana regen to compensate for constant Spectral Dagger spam. Alternatives to Falcon are other items that are used to compliment the same sides of Spectre: Echo Sabre (tankiness, damage, mana regen), Soul Ring (tankiness, mana restore), Blade Mail (armor for tankiness, farm by using passive aspect of the item), Hand of Midas (maximize your farm, damage through attack speed).

And it also allows you to compare all alternatives at the same time. Combine it with reduction of visual noise, and you can concentrate on the most important things.

Displaying it this way also helps you understand the key timings of the hero, as well as power spikes.

Of course, there aren’t any explanations about specific item purchases against specific enemies, but I don’t think it’s needed: usually item builds rarely focused towards countering an opponent, but rather meant to compliment the hero and make them stronger. But displaying it all this way helps you reduce the number of options to choose from, speeding up and simplifying the decision making process.

As a nice bonus you get order swaps and situational items displayed with their approximate winrate shifts. This helps you see clearly what you get and what you lose by prioritizing one of the items or throwing another one into your build. And this, in turn, helps you understand in what cases this choice is worth it, and in which it’s not. And if you decide to go with it, how to minimize the losses.

As a side note, a list of things I’m aware of, but will probably figure out later:

  • it’s not very mobile friendly
  • neutral items appear twice: first time there are only the best ones, then as a full list (this was my intentional choice, but I’m not 100% sure about it)
  • there aren’t starting items and skill builds (I don’t have the data for now, but I plan to add it once I’ll be able to)

So what now?

I have some small experiments left this year, but that’s probably it for this year. The only upcoming thing will be the yearly Spectral Report about what I’ve done throughout the year.

While the item builds don’t have the starting items and skill builds data, I already have some plans on fixing that. I want to create a brand new website subsection for my Nerds Hero Builds, where I will include all of my in-game builds, while also adding these data-based builds (and appending additional info to them). So I’ll make a slightly improved version of it rather soon.

Speaking of, in future this approach to builds might become a part of Dota 2 Pro Tracker (at least we were discussing this).

I also had some cool ideas on how to use the builds to create the power spikes charts — another idea that I was thinking about for quite some time. Current implementation of it already looks promising. However, it’s just a prototype, and I’m not sure when I’ll get back to it.

My main goal for now is to finally throw away the old junk of a code I was using and update everything, including the data schema, to add more cool stuff in future. Then we’ll see.

Closing words

That’s about it for now!

I’ll return soon enough, and will show you even more exciting stuff!

If you don’t want to miss it, you can follow me on Twitter or join my Discord (or you can also follow me on VK and Telegram if you understand Russian).

I often show sneak peeks of early stuff and experiments on my discord, so there will more than enough things to draw your attention.

And you can also donate here, this will be really helpful.

Until next time!