archive by month
Skip to content

Steamhammer games and status

Steamhammer played an excellent game versus Monster today. The game is kind of long and boring to watch, with repetitive action, but I’m pleased by the good play against stubborn defense. Steamhammer wasted some resources and missed some opportunities, but made no severe mistake at any point. It even expanded at a good time, which is depressingly rare in its ZvZs. Near the end, Steamhammer tried to put the cherry on top by ensnaring Monster’s mutalisks, but the mutas zoomed by too fast, the ensnare missed, and the queen was shot down. Oh well, dropping the cherry didn’t change the rest!

For a game that is not in the least excellent but is interesting for its mistakes, I like yesterday’s Steamhammer-Slater game. I watched the game live, and when Steamhammer bumbled the defense of its natural I steeled myself for a quick upset. But it was not so quick after all. The game is a showcase of ways to go wrong on both sides. Some of Steamhammer’s mistakes remain unresolved because my planned fixes are complicated and need to be implemented as projects.

The latency compensation bug is still making me scratch my head. The easiest way to work around it is to use the Micro module’s order tracking; Steamhammer already keeps track of what orders it has given to units, including larvas, so it doesn’t need to rely on BWAPI to keep it straight. I traced the backbone of the production code and added the minimal workaround, a two-line addition to the code that decides whether a unit should be added to the set of candidate producers. And... it didn’t work. In order to control where zerg units are made, to do things like make drones at bases that don’t have enough drones, there is a special-case low-level routine, and it ignores the set of candidate producers and does its own calculations from scratch—slightly complicated calculations that the candidates don’t make easier. I’m still thinking about the right fix. Maybe I can find a way to make it simple and powerful at the same time.

It is, by the way, a serious bug. In Steamhammer, the effect is to sometimes—at predictable times—drop a unit that was queued for production. Among other things, it turns 12 hatch openings into 11 hatch. I had noticed that Steamhammer was playing 11 hatch surprisingly often, but it does have a full suite of intentional 11 hatch openings, so I didn’t realize that it was due to a bug.

how to beat Monster

Monster’s elo is settling close to 2900, making it the top zerg with a margin. It has been updated at least once. One of the changes was to place outward-facing sunkens in a neat line, rather than a somewhat ragged formation, a clear improvement. I expect some authors will be thinking about how to beat Monster in the upcoming annual SSCAIT tournament, so here are a few thoughts. Though Monster’s author could read this too and make changes....

Monster does not want its sunkens to be broken, and often builds too many too early near the start of the game. That delays its economic growth. You can take advantage by delaying your own expansion a little to look threatening, and perhaps by killing Monster’s scout drone quickly. If Monster makes 2 or 3 sunkens in response to only a few units of yours, you are ahead. Don’t try for a bust at any early timing (even Stardust has to build up forces first). If you do make a lot of units early, you can try to contain Monster, to prevent it from expanding until you can get ahead, as in PurpleWave-Monster on La Mancha (an exciting game; the plan barely worked).

If you can run by the sunkens in the natural and get into Monster’s main, do it. Sometimes Monster walls tightly enough that it’s impossible, though. If you get in, Monster will run drones from its main to its natural, so you won’t kill many, but that is OK. There’s no need to destroy anything to get ahead. Stay alive in the main as long as possible to prevent drones from returning. Monster will be mining only one geyser and fewer than half as many mineral patches, and its economy will fall behind with every second. If mutalisks come out, they will come on half as strong at first, and they will need to clear Monster’s main before they head across the map to attack, so you have more time to prepare.

Against protoss, Monster most often plays with hydralisks, but may switch to mutalisks if you skimp too much on air defense. Corsairs are good for air defense, but I have yet to see a protoss bot which understands how to get the most value out of them. Monster is skilled with scourge, so you have to be careful with corsairs. You can see the general idea in pro games: As long as zerg has no spire, corsairs can scout and can clear overlords away. When scourge appears, protoss makes a cannon at the main nexus (initially only one, maybe more later) for short-term air defense and parks corsairs there until there are enough corsairs that they can shoot down scourge before it strikes. That’s about 5 corsairs. +1 air attack helps. Keep the corsairs in a tight group and they can go out on the map again, vulnerable only to determined scourge attacks with spread scourge, and even then the corsairs can shoot down some of it, raising zerg’s gas cost. If zerg has a lot of scourge, put dragoons or archons in your army and keep corsairs nearby; when in danger, fly over your anti-air units.

Against protoss and zerg, Monster opens with safe overpool builds that are not easy to exploit. Against terran, Monster plays a greedy three-hatchery build that leaves openings. Terran can try a cheese rush, or can take advantage of the slow zerg start to go for heavy macro itself. Hao Pan and Krasi0 have both tried proxy barracks, with partial success. Monster does have cheese reactions and defends itself fairly well if it sees the rush coming, though even then it may fall behind and lose. See Hao Pan-Monster, bunker rush not scouted and Hao Pan-Monster, bunker rush scouted (the scout overlord saw the first marine). In the second game Monster skipped its natural hatchery (it will also cancel a natural already started), made the hatch in its main instead, and got a sunken for defense. If Monster breaks the bunker early (which it often does) it typically wins; if it stays contained too long it will lose.

If you as terran go the macro route, you need good timing. Monster plays spire with +1 (usually attack but I have seen carapace too; is that due to an update?), then a second spire and double upgrades from then on. Terran has longer ranged units and low mobility, so terran usually wants to build up before moving out, especially if playing mech. But ground units do not stack and air units do, so if you wait too long then the mutalisks will defeat goliaths—all mutas can fire at once to pick off an edge goliath while not all of its comrades can get into range. Here is Krasi0 fast expanding to outmacro Monster. I think that this one is more instructive, though: XiaoYi-Monster on Empire of the Sun shows good terran unit mix and timing to beat the mutas. Ecgberht has also defeated Monster with the same kind of plan using bio units.

As terran, you also need good defense to survive until it is time to move out. Bots usually space turrets apart to cover ground. Pros don’t position turrets that way against mutalisks: They build turrets in tight groups so that a muta flock killing one turret takes as much damage as possible from others. The turret groups are located to cover vital areas: The mineral lines and production buildings. All buildings need to be placed compactly so that they are easy to defend, and they have to leave movement corridors so that mobile anti-air units can move quickly to counter the mutas. It’s not easy. Defense against strong muta harass needs skills.

Valkyries are potentially a sound defense against the mutas, but bots as far as I have seen do not use valkyries well. The valks act independently rather than together and move carelessly away from air defense, and Monster’s aggressive scourge shoots down too many; I haven’t seen an exception yet. Also, apparently terran bots select a single mutalisk as their valk target (this is my interpretation from watching replays), and Monster instantly separates the targeted muta from the flock so that only it takes damage. I suggest keeping valks in range of anti-air (whether static or mobile) for safety from scourge and trying Valkyrie patrol micro to in effect attack a location rather than a unit while staying safe. If that works, it should force the whole flock to scatter, rather than only forcing a single muta to split off. But I haven’t seen it tried, so I’m not sure it will work.

new bot Monster

New zerg bot Monster has been going Godzilla on the opposition. As I write, it has 58 wins and 4 losses on BASIL (since it is unranked, it is facing opponents of all levels). Its wins include tough enemies like Iron (on Circuit Breaker). Its win rate on SSCAIT is “only” 31-8 as it is being voted tougher opponents on average. The losses on BASIL are to PurpleWave, Krasi0 (twice), and the expert zealot rusher Wuli.

I have yet to see Monster vary its early game build orders, though perhaps it simply hasn’t lost enough games to feel the need to. Versus terran, Monster likes three hatch mutalisk, making only one pair of zerglings at first. Krasi0 earned its 2 wins with proxy rax, beating the greedy build with fast aggression. Against protoss, Monster likes overpool followed by 11 hatchery, a standard build. It gets a hydra den early but does not always make use of it. Here is a win over Locutus where it does make hydras. Versus zerg, Monster likes overpool 9 gas, also one of Steamhammer’s favorite starts and difficult for bots to counter.

Monster is a complex bot with many skills. It appears to adapt its army size, unit mix, and static defense to the game situation. It has nice micro with zerglings, hydralisks, mutalisks, and scourge. (Though I judge McRaveZ’s muta micro is better. See this loss vs McRaveZ from SSCAIT; Monster won the rematch.) It can make queens with broodling, though I haven’t seen it make defilers. It knows how to position a sunken and block its ramp with zerglings to stop a vulture runby cold; see the Iron game above. Like ZZZKBot, when scouting for the location of a zerg opponent, it knows to discount a base when it does not see the creep; it does not have to scout farther to see that there is no hatchery. (See this win over Microwave for an example; watch how early the overlord turns away from its first scouting destination. Also notice Monster’s zergling formations.)

Monster still has a lot of headroom. I immediately saw inefficiencies in its build orders and weaknesses in its play. Its results say that its strengths are bigger than its weaknesses, though. I imagine it must have been thoroughly tested against a range of opponents to gain so many skills with such small loopholes.

Monster gg’s early when losing. I haven’t seen another bot surrender as quickly. There is an advantage to giving up early in testing: You can get more games in, iterate faster, and end up with a stronger bot. Of course the advantage doesn’t show in serious games, but if the gg is accurate then it doesn’t hurt.

Peering into the binary, I am impressed with Monster’s scope. The file I downloaded from SSCAIT is a 2.8MB .exe, pointing to a complex project that must have taken a long time to develop. It uses BWEB. I see a JSON parsing library and signs of a config file that is not included in the SSCAIT download. I see strings suggesting many skills that I have not yet noticed in games, such as scarab dodging.