archive by month
Skip to content

Iron’s surprise losses

Among SSCAIT tournament watchers, the talk of the moment is of Iron’s two surprise defeats against zergs Steamhammer by me and GarmBot by Aurelien Lermant. Iron got unlucky 2 games in a row.

In the Steamhammer game, Iron became overcautious against the few early zerglings, bunkered its ramp, and was late with its vulture attack. Provoking reactions like that is one of the reasons Steamhammer makes zerglings. When the mutalisks came out, they soon had enough numbers to safely break the bunker and then were free to ravage Iron’s base (they could have gone ravaging from the start, but they were obsessed with the bunker). Iron’s vultures moved in and quickly wiped out every drone, but the mutalisk swarm split up, some cleaning vultures and the rest cleaning the terran base. Steamhammer won with empty bases but unchallenged air supremacy. In my testing, Steamhammer has never won against Iron with this build order—Iron got unlucky, or perhaps a late change weakened its play in this situation.

In the GarmBot game, GarmBot randomly expanded to Iron’s natural and built a sunken that covered the ramp. Iron was again overcautious: It double bunkered its ramp and blocked with vultures and many SCVs, and sent no vultures past the sunken. It seemed in no hurry to get tanks and blow away the sunken. Mutalisks showed up and started picking at a supply depot; nothing stopped them. But the lethal blow did not come until lurkers arrived and burrowed in good position on the ramp. There was no detection. Lurkers defeated the blocking units and cleared the bunkers while mutalisks killed the engineering bay, and then there was no hope. Iron reacted poorly to GarmBot’s bizarre expansion and GarmBot followed up well.

It’s a hard game! Even a bot as well-rounded as Iron is not prepared for everything.

Steamhammer’s surprises

Krasi0 and LetaBot congratulated me in comments on Steamhammer’s strong 4-1 start in the SSCAIT tournament. It’s too early—5 games are not enough to say, of course. For myself, I have mixed feelings because Steamhammer sprung one of its surprises, and it backfired resulting in the 1 loss!

I gave Steamhammer 5 counter-builds for 7 specific opponents.

  • Killerbot by Marian Devecka - 11 pool into spire
  • Iron by Igor Dimitrijevic - 2 hatch hydra
  • ZZZKBot by Chris Coxe - 9 pool into expo and finally spire
  • PeregrineBot - the same anti-rush 9 pool build
  • XIMP by Tomas Vajda - 3 hatch before pool into hydras
  • ZerGreenBot - the same 3 hatch build
  • Jakub Trancik the cannonbot - a 9 pool zergling build

The counter-builds for Killerbot and Iron score about 50% in my local tests. The build vs Iron scored nearly 100% against a November version of Iron, but Iron improves fast! Killerbot and Iron are far more sophisticated than Steamhammer, and only countering their strategies can make up the difference.

I’m eager to see how the 3 hatch before pool build does, especially since Steamhammer still has a terribly weak macro game. The opening is sound against the forge expand of those 2 protoss bots, but I know some of the mistakes Steamhammer will make. And the anti-cannon build for Jakub Trancik is a shot in the dark that I haven’t really tested. Steamhammer ought to tech to guardians once nearby cannons are eliminated, but time was short.

The anti-rush 9 pool build is slow and cautious and it’s effective against the version of ZZZKBot that I tested. (I haven’t tried PeregrineBot; I just hope it’s close enough.) So when I tuned in to Steamhammer vs. Chris Coxe on the stream and saw mutalisks beating up a barren zerg base, at first I thought “Good, it worked.” But no, Steamhammer was losing! ZZZKBot had switched to an entirely different ZvZ build! ZZZKBot built 5 sunkens to hold off lings and then went mutalisks, which counters builds that counter ZZZKBot’s former 4 pool. Steamhammer’s usual ZvZ 12 pool would crush, but instead my evil plot was thwarted. I expect that Killerbot will also find itself countered, and Zia may or may not be able to adapt.

It’s a double-edged lesson in the risk of fixed builds. By the way, Steamhammer’s 12 pool also counters most of Zia’s strategies, but Zia does have 1 strategy that beats it and soon learns. I expect to lose against Zia this tournament.

With enough time, I could find counter-builds for other troublesome opponents. But the best, like Krasi0 and Bereaver, play more strategically soundly and good openings would not make up much of the skill difference. Or at least that’s what I figured. I thought the effort would go to waste.

Next time! Late last night I fixed the double overlord bug, which sometimes caused Steamhammer to spawn 2 overlords when it needed 1. That messed up its opening timings, which led me to write overcautious opening builds in some cases. Expect more accurate openings in January.

SSCAIT 2016 surprise entries

The deadline is past. Here are the surprise eleventh-hour SSCAIT entrants this year:

  • Aman Zargarpur - terran
  • auxanic - zerg
  • BeeBot - terran
  • Tommy Fang - terran
  • XelnagaII - protoss

Of these, XelnagaII is the only name I recognize. It finished in the middle of the pack in AIIDE 2016. As LetaBot says, BeeBot had a bug in its first upload which was fixed before the deadline, explaining its inconsistent results. It may be a dangerous mech bot. Auxanic has been around long enough for me to get an impression of its style: It is a single-minded macro zerg which doesn’t believe in making units for early defense. Auxanic can recover and win after having its main and tech destroyed, so at least it’s robust. Aman Zargarpur has played 1 game so far and Tommy Fang none yet.

I think we’re in for some variety, and that is good.

As LetaBot notes in the comments, they have returned to calling this the 2016 tournament, so that the sequence of numbers is unbroken. They called it 2017 until lately.

BeeBot

So, who’s watching the brand-new terran BeeBot? As I write, its record on SSCAIT is 4 wins and 9 losses. 2 of its wins are a crash by the opponent and a timeout where the game went over the time limit and BeeBot won on points. Surely it should be no threat to the top bots! And yet the other 2 of its 4 wins are against top bots Iron and Martin Rooijackers (that is, the latest LetaBot). Those are legitimate “BeeBot played better” wins. What’s going on here?

Steamhammer 0.2

Steamhammer 0.2 is up on SSCAIT. Unless I discover a last-minute bug, and it’s a simple bug that I can fix without risk, this is the tournament version. It includes improvements at all levels, strategy, tactics, and micro. Most are inconspicuous, but some should be easy to see. The glaring weaknesses that I didn’t have time to fix are also easy to see!

I have built in some surprises. My hope is that after the tournament, a few bot authors will be thinking “Uh oh, I really need to do something about that.”

Steamhammer’s web page with downloads and discussion should be up some time tomorrow.

Still next: Future development will take a sharp left turn. I’ll outline my plans.

Steamhammer 0.1 download

Want to run Steamhammer 0.1 yourself? Here is Steamhammer’s zip file as I uploaded it to SSCAIT. The contents are:

  • Steamhammer.dll
  • Steamhammer_Config.json
  • BWAPI.dll

Steamhammer needs the config file and expects it at the path bwapi-data/AI/Steamhammer_Config.json. The BWAPI version is 4.1.2.

The config file system was inherited from UAlbertaBot (I made minor changes). The config file is easy to read and modify, and fun to play around with. Besides the active build orders and other config settings, it includes a few leftover build orders from UAlbertaBot plus build order experiments that I tried or meant to get around to trying. Items at the top of the “Strategy” section declare which build orders are active. In my view, the current ZvZ and ZvT build orders are adequate, the ZvP build order is poor but an interesting try, and the ZvRandom build order is awful.

Expect Steamhammer 0.2 in time for the SSCAIT tournament. It will have some surprises.

Around this weekend, Steamhammer will get its own web page where I’ll post new versions in source and binary as they come out.

Steamhammer (Z)

ZerGreenBot was re-uploaded today. I hope it’s much improved! And I uploaded my bot for the first time today, not because it plays an interesting game (because it doesn’t) but to start getting my hand in and see what’s up.

My bot is named Steamhammer, a reference to the legend of John Henry. Steamhammer plays zerg.

Steamhammer’s play is crude, at the level of figuring-out-how-this-stuff-works. I hope to squeeze in one more update before the SSCAIT deadline and put the fear of zerg into at least a few opponents. Steamhammer won’t begin to resemble my intentions for it until some time next year. While SSCAIT is running I should be able to get the first fun ideas in place.

UAlbertaBot

I chose UAlbertaBot as my base, because UAlbertaBot seems neatly organized, comes with some documentation though never enough, and is designed to be flexible and extensible. It’s basically designed to be a research platform for trying new ideas, and that’s what I want. It can play any race, though it seems best tested for protoss. I find its code more readable than other bots I’ve looked at; only Skynet comes close, and Skynet is specialized for protoss and has a more rigid design.

UAlbertaBot has more bugs than I expected. Well, it was developed by one person and never widely tested, so maybe I should have expected them! A number have me baffled. The most devastating bugs have to do with build order. UAlbertaBot usually automatically schedules overlords when needed, but sometimes makes 2 instead of 1 (often a serious mistake) or doesn’t realize it has hit a supply block, makes no overlord, and freezes the build in its tracks (rare but usually fatal). The build order search BOSS usually behaves sensibly, but sometimes schedules extra buildings which are not implied by the build order goal, such as an extractor or a lair or a hydralisk den. These bugs can be seen occasionally in SSCAIT games. One you won’t see on SSCAIT is that if UAlbertaBot has a lurker on the field, then BOSS falls into a fit of terror and is unable to solve any goal, no matter how simple [the bug is real, but I misidentified the cause; see comments].

UAlbertaBot also has limitations. It can theoretically make any unit (I haven’t tried them all yet, and I had to fix a bug before I could make sunkens or spores), but it can’t use all of them. When I tried making lurkers I found that UAlbertaBot was unable to micro them; they sat around. Well, it’s designed to be easy to extend, and it only took me 20 minutes to code up a simple lurker controller. Not that it helped, with the lurker bug in BOSS! I also suspect that SparCraft does not know how to burrow lurkers, because a squad with lurkers runs away more often than it should.

UAlbertaBot behaviors high on my to-do list to fix: Improve base defense, improve scouting, add building placement code for static defenses and macro hatcheries.

UAlbertaBot as a test opponent

I find that UAlbertaBot makes an excellent test opponent for trying out opening build orders, because it is easy to configure it to play whatever opening you like. Edit the configuration file, add a build order as a list of units and buildings to build and tech to research, and set UAlbertaBot to follow it. No need to recompile.

UAlbertaBot may play the opening poorly, but it will follow the build order efficiently and you can catch the timings.

status

Steamhammer has different builds versus terran, protoss, zerg, or random. All the matchups are poor. ZvRandom is particularly awful—I couldn’t find a sensible build within the existing limitations. One step at a time!

In the next week or so I’ll make a dedicated web page for Steamhammer and put its code up.

Next: Outline development plan.

SSCAIT 2017 final rush

The SSCAIT tournament deadline this year is 18 December. Like the 2015 edition last year, it will start in December and I expect final results in January. Curiously, they seem to have decided to skip a year in the numbering scheme, so this is the 2017 edition.

The final rush is on. The Usual Suspects are updating their bots. Marian Devecka, I’ve already noted, is back in the game. Tyr has been reuploaded for the first time since the middle of the year. Possibly a few bot authors are waiting until the last moment, hoping to gain an advantage with surprise updates.

The admins have been at work too. Some previously disabled bots are alive again: Awesomebot, DAIDOES, Ian Nicholas DaCosta’s bot, JompaBot, the 2013 bot by Oleg Ostroumov, PeregrineBot. The number of games used to track the current winning rate has been bumped from 20 to 50, so that the ranking changes more slowly but ends up more accurate.

I will be jumping in too. I got work underway a week ago and I’m rushing to finish a first primitive version. Stand by for the announcement.

one medic rule

I notice that Iron sometimes trains 1 medic to heal its SCVs. It beats having them repair each other.

Here’s a rule of thumb to try: When you face off against a group of healable units with 1 medic, target the medic first. The rest of the fight will be easier. The rule of thumb is most useful when units are few: In a big battle, one medic hardly makes a difference, but when 1 zergling is trying to kill SCVs it’s another story.

When there are 2 or more medics, they can heal each other and it’s often better to save the medics for last. They have armor.

It’s only a heuristic. If you want to get it exactly right, do the calculation! But I notice that a lot of bots could benefit from a simple heuristic.

Killerbot beats Bereaver

If you’ve been following SSCAIT games between the top bots, you’ll have noticed one striking change: 2015 Killerbot lost most games to recent versions of Bereaver, but the new 2016 Killerbot has just won 4 in a row.

The 4 games followed similar paths.

• Bereaver optimistically puts on some early pressure that Killerbot is more than ready for. Here is Killerbot’s simcity at its natural—it’s nothing you can attack with a few zealots.

Killerbot’s simcity

• Bereaver sends out 1 initial corsair. Killerbot defends with hydras. Throughout the game, Bereaver usually keeps 1 or 2 corsairs in the air and gets some overlord kills but repeatedly loses corsairs to hydras.

the corsair’s success ends

• Killerbot gets aggressive with its hydralisk force, mixing in some lings. Bereaver gets reavers, defends, then chips away at the zerg army.

Bereaver defends with a reaver

• Bereaver builds up power and pushes the zerg ground army back, aiming for a heavy attack. The wolf is at the door:

reavers fire into the zerg natural

• Killerbot presumably notices the shortage of anti-air and goes mutalisks, the classic zerg counter to reavers. The wolfsbane is also at the door.

mutalisks defeat the protoss army

Bereaver can’t recover after the sudden zerg tech switch.

Both bots show risky over-aggression at times. Killerbot has improved its overlord protection and Bereaver’s corsair control—which used to be effective—is no longer alert enough to keep its corsairs alive. But that’s small beans; Bereaver’s strategic mistake is to rely on reavers without enough air defense to protect them. Corsairs are standard nowadays, but dragoon-reaver is also a classic unit mix.

As Igor Dimitrijevic said, Killerbot’s adaptation skills have become dangerous.

Killerbot versus Iron

I have a feeling that some of the new behavior of Killerbot is designed specifically to counter Iron. Well, I could be wrong. It seemed interesting so I played some games between the two locally, with the 1 December version of Iron and the 27 November version of Killerbot. It was also a chance to see how the two cope with maps outside the SSCAIT pool.

This version of Iron scouts immediately, with one of its first SCVs. That’s a hit to its economy. I guess author Igor Dimitrijevic decided it was important to start adapting to the enemy’s build as soon as possible.

On many maps Iron tried its signature 3-vulture runby. When the runby succeeded, Killerbot could eventually clear the intruding vultures with mutalisks, but was far behind and lost every time. On the map Gladiator, which has an up-ramp out of the low-ground main, Iron felt the need to bunker its ramp and tried the runby later than usual. Killerbot had placed sunkens well and Iron aborted the runby in mid-flight (a skill in itself!). But then Killerbot was ahead and could even expand to the precariously-placed mineral only, with a winning advantage.

In some games, like on Match Point, Killerbot added a sunken in its main. I’m not sure what triggered the extra defense. That blunted the runby, even when the sunken was poorly placed, because Iron was not clever enough at working around it. On Match Point, Iron still gained some advantage and ended up winning a tense game.

I notice that Iron favors citadel defense: It builds heavy static defenses that cover a small area. With repair, the static defenses (bunker or turrets) are expected to hold without reinforcement. Pros usually favor the lightest possible static defense and reinforce with mobile units when needed—that’s more demanding, obviously.

Iron builds its first factory in a distant corner of its base. That way when it gets rushed early, the factory is likely to be overlooked and can get vultures out, which is usually enough to hold off the rush. It’s a clever trick that works well against bots. But later when Iron comes under mutalisk attack, the factory is outside the citadel of turrets and becomes hard to defend.

Killerbot’s mutalisks are attracted to turrets and do not fight them efficiently. In this picture most mutas are attacking the rightmost turret. They surrounded it and are taking fire from all sides, when they should have attacked from an angle where not all turrets were in range. Meanwhile, a couple mutas do not play well with others and attack different turrets on their own.

Killerbot fights turrets badly

On Arcadia II, Killerbot surprised me with a strategy I hadn’t seen it play before. It opened with its usual 3 hatcheries and then, I can’t guess why, took drones off gas after 100 and went all-in speedlings. Iron saw it coming and bunkered its ramp, but it was not enough. The mass zerglings surged over everything. The red lines on the minimap are more zerglings on the way, far more than Iron can hope to save itself from after the bunker falls. I won’t be surprised if this strategy features more prominently in the next tournament version of Killerbot!

Killerbot surges over everything with zerglings

Killerbot depends on an easily-defensible natural expansion. On Outsider, a rather weird map, it didn’t even try to defend its wide natural and soon lost all drones. Fantasy and Jaedong played a famous game on this map in 2009. I think it is a difficult map for bots; you need to understand mineral jumping and drop play.

I even laid in a game on Jungle Story, an old-school map from before modern macro play was invented. The map was cool at the time but today is very non-standard. It has no close natural; the closest next base is an open mineral-only. The game was hilarious: Killerbot took the center gas expansion and defended it with 1 sunken. That base has 2 openings and Iron could have harassed through the opening not covered by the sunken. Or Iron could have bypassed the expansion and headed for the main. Instead Iron ran by the sunken, through the expansion, and toward the main, losing 2 vultures of the 3 for nothing! Apparently its decision-making is tuned for standard maps. Killerbot’s mutalisks erased the terran main.

Iron unnecessarily runs by a sunken

Usually when Iron worked up to wraiths, Killerbot found itself unable to defend both its overlords and its mineral lines: Pick one, give up the other. Killerbot would benefit from scourge for air defense, or maybe a spore colony in the mineral line at some bases (it already makes an evo chamber).

Overall conclusion: It was fun because both bots are super-aggressive. Iron has better micro and a deadly runby tactic, and usually wins. But when Iron blunders, Killerbot takes over. Both bots could benefit from more geometry smarts in figuring paths and placements. I was surprised that Killerbot does some basic research very late. It fights more than I expected with slow zerglings and slow hydralisks.

Last year, Killerbot was clearly the best around. If it hasn’t kept up, that is a sign of how much progress we’ve seen this year. Here’s to another year of progress!

Killerbot has been updated!

Yesterday was American Thanksgiving. I want to give thanks that Marian Devecka updated Killerbot on that day!

The new binary is about 5% larger, so I expect some improvement in its play but nothing dramatic. I’ve only seen a few games so far. In a game against Bereaver I thought Killerbot put up a tougher fight before losing, with better use of hydralisks, but the 2015 version already put up a pretty tough fight so I’m not sure. In a game against Iron there was a definite change, though: Killerbot went mutalisks and batted away Iron’s early pressure to gain an advantage. I’ve never seen Killerbot go air against terran before. Before this update, Iron had been rolling up Killerbot like a rug, but this game was another tough fight. Iron came out on top after a while, with good use of repair and steady aggression.

The new Killerbot version has not quite caught up with the current leaders, but it shows progress and there’s still time before the 18 December SSCAIT deadline.

The Little Tailor

These 2 pictures are from a game between Bereaver and the AIIDE 2016 version of LetaBot. It was a great game—Bereaver lost its natural and narrowly held its main over and over against LetaBot’s powerful attacks, until finally LetaBot ran out of steam and lost. LetaBot didn’t scout Bereaver’s third base. But I want to pick out a funny detail:

reaver shot in motion...

I dub this reaver The Little Tailor.

... 7 at 1 blow

Seven at one blow! One marine lived and kept shooting until the next scarab got it. It’s good reaver targeting.

Bereaver’s curious weaknesses

Bereaver was reuploaded today, and apparently the new version introduces bugs because its play is worse in obvious ways. Until today Bereaver had been holding the #1 rank with seeming ease. I expect the problems will be ironed out before SSCAIT closes submissions for the tourney!

Even without bugs, Bereaver’s play is curious because it is a top bot, yet some of its weaknesses look simple to fix. Usually the weaknesses of top bots look difficult or time-consuming or at least troublesome to correct. I’ll give a couple examples.

1. Bereaver gets the reaver capacity upgrade, so that a reaver can hold 10 scarabs. Bereaver eventually makes a lot of reavers, so an upgrade makes sense—but the capacity upgrade? The way I see it, the main purpose of the capacity upgrade is to make reavers usable when your hands are too slow. Expert players don’t even use up the normal capacity of 5 scarabs, at least not until later in the game when micro becomes more demanding. It’s normal to send a reaver into the fight with 3 or even 2 scarabs in the magazine, because every scarab is a sunk cost and you never know when the reaver will die. Bereaver invests 200/200 for the upgrade and then builds 5 extra scarabs for 75 minerals more per reaver, and I don’t think it earns any return.

I imagine it would be a 1-line change to order the reaver damage upgrade instead. Instead of more expensive, the reavers would become more lethal.

2. Bereaver makes corsairs against terran, apparently to counter science vessels or dropships. There are times when it could make sense, but mainly on island maps. I have never seen Bereaver’s corsairs pay off in a game against a terran.

Again, it seems like a 1-line change to skip corsairs. It would be a different story if the corsairs used disruption web, but that’s for later in the game and it’s not half as simple.