archive by month
Skip to content

Steamhammer 2.3.5 uploaded

I have uploaded Steamhammer 2.3.5 to SSCAIT. It is the same code as the AIIDE 2019 tournament version 2.3.4. The main difference is that it is configured to play all races. I did a little work on the openings, since that’s autonomic and proceeds without volition. Also I didn’t include pre-learned data files; they’re not helpful for SSCAIT and BASIL.

Source release soon.

change list

• Fixed the protoss ForgeExpand opening. At some point it was edited incorrectly and started to place the cannons in the main, where they were nicely protected since the enemy tore down the natural first.

• Added a protoss 10-12ForwardGateExpo opening. It puts gateways in the natural and tries to scare the enemy with some zealots before expanding. Whether the gateways successfully fit in the natural may vary by map....

• Added a zerg UltraRush opening. It’s not useful as written, unless maybe some opponent is extremely passive and at the same time highly skilled in stopping defilers. But I left it in.

Steamhammer 2.3.4 change list

The change list is longer than I originally predicted! This is the Steamhammer version that I submitted to the AIIDE 2019 tournament. The list includes changes from unreleased versions 2.3.1, 2.3.2, and 2.3.3 that played on SSCAIT for testing, as well as final changes in version 2.3.4 that never played on SSCAIT.

This version is configured to play zerg only, and all changes affect zerg play. A few of them should also improve play by terran and protoss. As usual, the most important changes are in bold.

opponent model

Support pre-learned data files. If Steamhammer does not find a learning file for a given opponent in the read directory, it looks next in a “static” directory to see if there is a data file for the opponent there. The config variable Config::IO::StaticDirectory points to the static directory, and is set to bwapi-data/AI/om/ in the release version (“om” stands for “opponent model”). After the game, it proceeds as usual: It writes the pre-learned game records, followed by the game record for the current game, into the write directory; after write is copied to read, there is no reason to refer back to the static directory. Locutus does it essentially the same way.

The AIIDE version of Steamhammer includes pre-learned opponent model files for 12 of the registered bots. Most of these files don’t have much in them beyond a few sample strategies that have won in the past, so that Steamhammer doesn’t have to cast about blindly to find a likely build. Best play against Iron is more complicated—Steamhammer knows 3 very different successful openings with varying win rates depending on the map—so the pre-learned file for Iron includes 50 games to give Steamhammer an excellent winning rate right from the start. All the game records were originally extracted from Steamhammer’s learning files on BASIL.

operations

Squad targeting: In deciding what enemy base to attack, count defenders in a smaller radius, unless the enemy is terran and has siege mode (then we need the wide radius to include any tanks that may be sieged). This helps Steamhammer more accurately choose the least-defended enemy base to attack next.

• There was a copy-paste error in the code to detect whether the enemy has siege mode. The siege mode information was returned correctly, but it mistakenly set the flag that means “the enemy has static air defense,” so Steamhammer would believe there were turrets whether there were or not.

• Squad targeting: Don’t order a squad to attack an addon. I changed ranged units to never attack addons, to avoid wasting time when they should be attacking something else. (Melee units will, though, because it may be the closest thing.) That unexpectedly caused difficulties in finishing off games versus terran, when units might collect around an enemy addon and never attack it, rather than attacking a known building that was perhaps farther away.

• Squad targeting: If no enemy buildings are known, seek enemy units which may still be findable. This can help Steamhammer finish off winning games faster.

A terrific bug caused enemy unit counts to be horribly wrong in many cases. Steamhammer sometimes believed that the enemy had a negative number of units of some type. The broken unit counts were not used by many decisions—the most important decisions use the player snapshot unit counts, which are accurate—but decisions that did use them could be completely wrong.

UnitInfo projects when enemy buildings will complete, based on their HP when last seen. It’s not entirely accurate; the calculation leaves out some factor that I haven’t figured out yet. To see the calculated times on the screen, turn on the config option Debug::DrawEnemyUnitInfo. In code, the call getEnemyBuildingTiming() is one way to get the information. This data could make plan recognition more accurate, but is not used for that yet; it is used only to check the enemy spire timing in ZvZ.

tactics

Calculate map tiles in range of enemy static defense and keep the data available. There are separate grids of ground danger zones and air danger zones. A few uses of the data are implemented; many more are possible. Steamhammer will not place buildings in a ground danger zone; this is a vital skill to survive cannon rushes, and has saved games for Steamhammer against AIUR by Florian Richoux. The information also feeds into unit targeting decisions. Steamhammer’s units prefer to fight outside enemy static defense range when possible; Steamhammer has a stronger preference to pick off undefended targets.

Squad detectors avoid danger and seek cloaked enemies. Formerly, detectors stayed with their squads and otherwise ignored the world around them. Steamhammer lost overlords freely, a major weakness. Now they retreat out of range of enemies that could shoot them down, and move toward cloaked enemies that need to be detected. Science vessels and observers benefit too. It’s usually a big improvement, but there are cases where enemy ranged units zone out the overlords, or enemy cloaked units distract them from where they need to be. Overlords that are not acting as squad detectors (some act as base detectors and some are left idle) are as carefree as ever and can still be lost at a high rate.

• A squad detector is supposed to move back home when it finds itself abandoned—when the squad it was detecting for is gone. I don’t think this feature works, or at least, detectors still make all sorts of illogical movements.

Better combat sim results against cloaked enemies. If all enemies in the area are undetected and they can hit us, retreat without further calculation. If some enemies are detected, do the sim to see whether to fight or run. The change makes play vastly stronger in certain situations.

• FAP accounts for cost of scarabs and interceptors, and the full cost of zerg morphed stuff. It doesn’t make a big difference, but combat sim scores are a little more accurate.

• Ranged units are better at ignoring enemy zerg larvas when moving somewhere else. They’ll get distracted less often.

micro

Issue at most 1 move command per 3 frames in the micro system. Zerglings get stuck less often. I still see it happen from time to time, but I think most watchers will see zergling movement as smooth. The underlying code can send move commands to the micro system every frame if it likes, but the micro system will skip or delay some of the commands if they are too closely spaced.

MoveNear() had a potential crashing bug. It never happened as far as I saw, but a unit being given its first command ever could execute invalid code and crash.

• Use MoveNear() rather than Move() in more cases, to reduce unnecessary commanding. MoveNear() ignores commands that “don’t make a difference”—it says, “eh, we’ll end up close enough, don’t bother.” It’s for use when precision doesn’t matter, which is a lot of the time.

• Builder workers were being issued an unnecessary move command on the same frame that they were told to start construction. In the worst case, which was not frequent, building construction might be delayed by 1 frame. Still, it’s fixed.

• Steamhammer’s melee units can be configured to retreat when low on health, to regenerate health (by zerg regeneration or terran medic healing or protoss shield regeneration). The change is, this no longer happens if the unit is irradiated. Net regeneration will not happen, and since it’s a melee unit it’s likely to be right next to the enemy, exposing enemies to the radiation. This mainly helps ultralisks.

• Clip the result of DistanceAndDirection() to the map boundaries, instead of returning a bad result for the caller to deal with. In practice, the effect is that in some situations a unit will move to the edge of the map rather than not moving at all. I’m not sure it’s an improvement in play terms, but the code is safer.

zerg defilers

An outrageous bug could put a defiler into both the defiler controller and the melee unit controller, meaning that defilers were issued zergling commands intermixed with their defiler commands. “Now AttackUnit() that building!” I was floored. The error was in code that was “so simple it could not have a bug,” and the bug was caught by an error check in the micro system, far away from the underlying problem. At least it was easy to fix.

Cast dark swarm over enemy ranged units, not only over enemy buildings. Formerly, Steamhammer could not use swarm against, say, marines on the open field; it had to reach the enemy base before the conditions for the spell were triggered. It was a severe limitation (justified by Steamhammer’s poor swarm skills at the time).

Choose the nearest zerglings as defiler food, not the first zerglings that happen to come up in looping through units. Defilers consume sooner and cast swarm and plague at a higher rate. A defiler generally arrives at the front line already charged up with energy, so even if it is irradiated instantly it is still likely to get a swarm or plague off.

• A typo prevented research of Metasynaptic Node, the defiler energy upgrade. I fixed it and adjusted the conditions to be safer.

• Slightly loosen the conditions for making a defiler in the first place. They work better now, make ‘em sooner.

Swarm and plague scoring adjusted for better effect. The thresholds are reduced, so that the spells can be cast in more situations. Swarm over lurkers counts double. Plague counts more on carrier interceptors, less on buildings. Various other tweaks.

• Fixed a bug in avoiding the overlap of dark swarms. Swarms less often overlap wastefully (though it still happens, for at least 3 reasons).

• FAP bugs in understanding dark swarm are fixed (I added dark swarm to FAP, so all the bugs are my doing). There was an error in recognizing melee units that can hit under dark swarm because of a confusion between range and squared range (I renamed stuff and added comments to make it clearer). FAP also now realizes that a worker cannot do damage under dark swarm, while a reaver can. The effect of the fixes is that units under dark swarm make more accurate decisions about whether to keep attacking.

• A rare bug could allow multiple defiler mounds.

zerg scourge

Do not target an enemy that is covered by enemy static air defense. Steamhammer used to throw scourge away by the ton to cannons or turrets; this solves the issue. Scourge will chase the enemy, but turn around for home if the enemy reaches a defended area. (Mobile enemies might still shoot down the scourge; retreating in that case is decided by combat sim and the regular advance/retreat logic.)

Do not target overlords or interceptors. Shooting down those targets is usually a waste of gas. Neither the scourge squad nor the scourge units will seek overlords or interceptors. This solves another serious issue.

Predict the target’s movement. This helps scourge hit the target directly, instead of doing that weird little loop before suiciding. It also means that scourge cut corners in a turn, but only a hair.

• There was a bug in choosing scourge squad targets that were goneFromLastPosition, that is, known to no longer be where they were last seen. It caused wasteful scourge movement.

• In choosing a scourge unit target, pay less attention to target priority (“the science vessel is more important to destroy than the wraith”) and more attention to target distance (“it’s right here, just hit it!”). That wraith is now less likely to shoot the scourge down while the scourge chases a more distant science vessel.

• If we have lurkers, then enemy observers are higher priority to destroy.

• Further limit scourge production. I tuned it down repeatedly, but Steamhammer was still sometimes spending too much gas on scourge, leaving too little for everything else.

other zerg skills

Sometimes make 1 queen, use parasite, infest command centers. The queen likes to parasite expensive units like carriers and arbiters, and it also likes shuttles and dropships. It will parasite something else if it has excess energy or gets irradiated. As I expected, few enemies understand what to do when they get parasited. A common outcome is that the parasited unit gets scourged at the first opportunity. If the parasited unit stays in a safe place instead, it’s often a valuable spy. The infested command centers don’t do anything but sit there and get in the way; I haven’t yet seen this cause Steamhammer any problems in game, but it could happen. If the queen dies, which happens a lot because it plays recklessly, the strategy boss waits 3 game minutes and makes another queen.

There was a critical crashing bug affecting spellcasters in the late game. Fixed, whew.

In an emergency, set the drone production rate to 0.15 rather than the previous 0.10—that is, make a drone instead of a combat unit 15% of the time. This helps Steamhammer build up its economy even while under heavy pressure, without falling to the pressure. It increases the win rate against zealot rushers and other opponents that press attacks over a long period, like Gaoyuan Chen.

Prefer to make units at hatcheries with more larvas. Steamhammer used to often lose production capacity by using up all the larvas at one hatchery before moving to the next hatchery. A hatchery with 3 larvas will not produce more larvas, so that meant the total rate of larva production was lower, and more total hatcheries were needed to cover the next surge of zergling or drone production (cheap units that call for a lot of larvas).

• Prefer to make drones at undersaturated bases. It is a smaller improvement than it may sound. Formerly, Steamhammer used a cheap but effective trick: It preferred to make drones at the base farthest from the main base. It was the right choice most of the time, but could go wrong if the main was attacked and lost drones. The new method balances workers well in all cases, not only the common case.

• Steamhammer tries to make fewer macro hatcheries before expanding beyond its first and second bases. I saw games where it made as many as 4 hatcheries in its main before taking the natural—it might be OK if the bot is contained, but not the other 6 days of the week.

• Delay the second gas a little. Steamhammer consistently took the second geyser too soon. I think it’s still usually too soon, but the loss is reduced.

• Dark templar more strongly indicate the need for static defense. They hit hard.

• Make a defensive spire in reaction to enemy drop or certain air units. Formerly, only overlord hunters like corsairs would trigger a defensive spire.

• In ZvZ, prefer to counter hydras and especially lurkers with mutas, not lings only. Steamhammer usually did the right thing, but in a few games made a severe strategy mistake.

• In ZvZ, Steamhammer formerly made an evolution chamber if it saw an enemy spire, no matter the state of its own spire. That’s a mistake; the evo is often unneeded, and in ZvZ the drone to make the building is valuable. Now Steamhammer attempts to time the enemy spire and make the evo only if needed. I don’t find it particularly accurate, but it is an improvement.

• In ZvZ, enemy scourge more strongly discourages Steamhammer from making guardians and devourers. See the game I posted last time, where Steamhammer scourged Microwave’s devourers. Devourers and guardians have little ability to defend themselves against scourge; they can only survive with the help of escorts.

• Limit devourers further. Devourers are support units, so try to keep more mutalisks than devourers.

• A lost defiler mound could cause a production freeze. It was rare, but a production freeze can be a game-losing bug. It’s frustrating, but there remain rare production freezes that I have not traced.

• Emergency reactions: When there are 0 drones, Steamhammer can cancel upgrades and more building types. Formerly it could cancel only units and a few building types.

• Emergency reactions: Correctly account for the gain of canceling a building (you get 3/4 of the cost back). It helps in making the right cancelation decisions.

• Emergency reactions: A bug could allow a planned hatchery to be dropped even though it was the only hatchery.

• ZvZ mutalisk target selection adjusted in a few cases.

Lurkers prefer the most distant target. It helps visibly.

• Fixed lurker vibration: Sometimes lurkers would move back and forth, achieving nothing, instead of advancing on the enemy.

• Attackers can no longer permanently drive overlords away from the spore colonies where they are sheltering. This was a bug introduced in a recent version.

zerg openings

3HatchLingBust2 makes the minimum number of drones and goes all-in on the bust. This version is now configured in place of the original 3HatchLingBust as one counter to protoss forge-expand builds.

12Hatch_4HatchLing makes the right number of drones for continuous zergling production from 4 hatcheries. It’s similar to 3HatchLingBust2.

2HatchMutaPure and 3HatchMutaPure each make only 1 pair of zerglings, and instead get as many drones as possible without delaying the mutalisks. The 2 hatchery one is especially elegant. These are for use against opponents that sit back and defend for a time before moving out.

Overpool2HatchLurker and 3GasMuta similarly are more effective against opponents that are late to attack.

DefilerRush rushes for defilers to support highly-upgraded zerglings. I used it mostly in testing defilers, but there are opponents it could be strong against. The defiler rush is similar to the existing HiveRush build, but better optimized (and of course it also makes a defiler).

12PoolHydra is configured as one counter to terran factory-first openings. 12PoolLurker fills a gap in the lineup of lurker openings. ZvZ_12PoolLingB is a minor variant of ZvZ_12PoolLing. ZvZ_12Gas11Pool is a gas-first stem that fills a gap.

Overpool_3HatchSpeed, Overpool_3HatchLing, and Overpool_4HatchLing try to combine the early zerglings of overpool, which can keep the opponent in the dark and defensive, with a mass zergling followup. Overpool_4HatchLing is configured to be played 1% of the time in ZvZ versus an unknown opponent—it’s risky but can also be hard for the opponent to understand and counter (it makes a third base that the opponent is not likely to scout in time).

10Pool9Gas and 10Pool9Hatch fill small gaps in the ZvZ opening repertoire.

7Pool6GasMuta is derived from one of my 7 pool 6 gas dawn lurker rush builds. It’s quite easy to defeat, even without air defense, with an early attack. I suspect it is useful mainly against opponents which want to defend and fail to figure out how to defend so early.

• Minor tweak to 2HatchHydra. Bigger adjustments to OverpoolTurtle so that it can more consistently beat those (weak) opponents it is intended to beat.

Next: Expect Steamhammer 2.3.5, which again plays all races, on Tuesday or Wednesday.

Steamhammer submitted to AIIDE

I have submitted Steamhammer 2.3.4 for AIIDE 2019, a day ahead of the deadline. The latest changes help in specific situations: Better decisions against dark templar, less time wasted when the defiler wants to consume, more accurate strategy choices in ZvZ when the opponent goes hydras, that kind of thing.

Overall, I’m pleased with this version. It is far more solid than any previous tournament version of Steamhammer. There are a couple of game-losing bugs that I did not solve, but they are rare. There are rough edges, but fewer than before. In last year’s AIIDE, Steamhammer was version 2.0, with many new features including unit clustering and defilers—and they were buggy. This year it is version 2.3.4, and the version number is deserved: The strength improvements over 2.0 are due to bug fixes and refinements, not new features.

This means, of course, that it is time to get back to work on version 3.0, with new strategy adaptation features. Add bugs for victory!

Before long I’ll either upload version 2.3.4 on SSCAIT as zerg only, or I’ll come out with version 2.3.5 that can play as any race.

By the way, I counted the number of zerg openings. There are now 142.

Steamhammer-Microwave rivalry

Microwave was forked from an early version of Steamhammer, and the two have been struggling against each other ever since.

• AIIDE 2017 - Microwave 70.86%, Steamhammer 64.14%
• SSCAIT 2017 - Steamhammer 83.12%, Microwave 79.87%
• AIIDE 2018 - Steamhammer 54.97%, Microwave 54.16%
• SSCAIT 2018 - Microwave 74.65%, Steamhammer 72.54%

The two bots have different strengths, but most results have been close. Which will edge out the other this time? On BASIL, Steamhammer and Microwave have been trading the top zerg position back and forth. Microwave has an advantage in head-to-head fights, but I think Steamhammer has a slight edge overall. We’ll see how the tournament goes!

Randomhammer (Z)-Microwave is a ZvZ with devourers and defilers. Microwave wins the majority of games, but Steamhammer has better hive tech skills.

Steamhammer for non-programmers

A comment to Undermind Episode 31, which mentions non-programmers entering build orders into Steamhammer. I tried to comment directly at Making Computer Do Things, but WordPress thought I was a bot... which was kind of ironic. So I expanded and posted here instead.

There is documentation for the Steamhammer configuration file. It is not up to date, but it is complete except for newer features. It should be plenty for a non-programmer to enter build orders. Telling Steamhammer to play the build order will look difficult if you only read the config file, because the default config is complex, but if you read the documentation you’ll see it’s trivial. Other tricky parts: Steamhammer doesn’t always play build orders literally; queue reordering will be really confusing for beginners. The unforgiving JSON syntax plus uninformative error message might cause trouble (one misplaced comma and it’s “ha ha, it didn’t work, and I won’t tell you why!”).

Thanks, good discussion! I have new ideas about how to make it easier for people to get started. At some point I’ll try to do them.

• Add a simple sample configuration file for people who don’t feel like being overwhelmed by the performance config.

• Add documentation for non-programmers, that concentrates on the most useful features for them.

• Smooth out some of Steamhammer’s in-game behaviors so they are more intuitive. Somehow. They are there because they help sometimes, but they add complexity and can trip me up too.

defiler bugs to the horizon

I wasn’t planning to work more on defiler play for the time being, but then I discovered two more sets of bugs affecting defiler play. Since defilers are bugs, does it follow that you can’t have defilers without bugs? First, my additions to FAP to understand dark swarm had multiple errors in determining which units can hit under swarm. That could cause Steamhammer to cast swarm over its units, then needlessly retreat from under it. Second, there was an unbelievable bug which assigned defilers not only to the defiler controller, but to the melee unit controller at the same time. In between their regular orders, defilers were being interrupted with nonsense orders to act like zerglings. How did defilers ever work? Because in the buggy live version, defiler play is, somehow, already valuable.

Rule of thumb for the upcoming tournament version: If Steamhammer survives to the late game and has defilers out, it is probably winning.

new bot BetaStar

Based on its authors, BetaStar looks to be associated with China’s State Key Laboratory for Novel Software Technology (page in Chinese) at Nanjing University; it is sometimes translated as “National Key Laboratory” instead. Here are a couple papers that seem to be from the same research group that produced it. They are both about Starcraft II.

On Reinforcement Learning for Full-length Game of StarCraft (September 2018)

Efficient Reinforcement Learning with a Mind-Game for Full-Length StarCraft II (March 2019; by “mind game” they mean a simplified abstract version of the real game)

The papers have similar titles, but the contents are different. The first is about hierarchical reinforcement learning for macro action choices; the second builds on it with the “mind game” to make learning faster and more effective.

I did not find information about how BetaStar is related to this past research. Presumably a new research paper is in preparation, or published somewhere I did not look. Included in the binary are 3 files with the air of learned data, less than 1M each in size, named pvp_params.csv, pvt_params.csv, and pvz_params.csv. If BetaStar uses the methods of the research papers above, then these will be data for choosing macro actions—what to build next, what to research, etc.

BetaStar is derived from CSE. The line of descent is UAlbertaBot > Steamhammer > Locutus > CSE > BetaStar. It has strong inherited skills. CSE finished #3 in AIIDE 2018, ahead of Locutus. I could not figure out where the name BetaStar comes from. In this context, it sounds like an algorithm name, but if so I guess it is a new algorithm.

So I found a bunch of clues about BetaStar, but I don’t actually know a thing about how it works! It finished #9 in the CoG tournament (formerly CIG), with a 59.04% win rate, ahead of MetaBot and behind ZZZKBot. As I write, it has the BASIL elo of 2314, which is above average but well below the top; it is ranked #31 out of 83 active bots, between Arrakhammer and TyrProtoss. It has 55 wins, 23 losses, and—this is the amazing part—49 crashes. It often fails to start games at all. Its basic play is quite strong, with Locutus dragoon micro and other skills. So far, between SSCAIT and BASIL, Steamhammer has several losses and only 1 win against it. BetaStar scored 2-0 versus #3 PurpleWave on BASIL. But besides crashing, BetaStar has play bugs that other bots do not: It likes to build 2 cybernetics cores. It sometimes plays an unsafe opening and loses to a rush, then repeats the opening against the same opponent and loses the same way (see vs legacy 1 and vs legacy 2—#50 legacy is 3-0 versus BetaStar). It seems that BetaStar has both great strengths and great weaknesses.

Without much to go on, I nevertheless read BetaStar as similar to past Chinese research projects I’ve looked into: It is meant to be a one-off project to demonstrate a specific research goal, and aspects outside the goal were afforded no more effort than absolutely needed; solving crashes was not part of the goal. If so, it may have a successor next year in the same way that it succeeded CSE, but I don’t expect updates in the meantime.

It’s good to have a new bot! They have been few lately.

Steamhammer 2.3.3 test version

I’ve uploaded tournament test version Steamhammer 2.3.3 to SSCAIT, zerg only as usual. This version has critical bug fixes, and changes to make defilers more active. The bug fixes are the important part, but it’s a delight to see Steamhammer swarm cannons with alacrity. At least sometimes!

I expect that the final tournament version will be 2.3.4, and that I won’t much benefit from another test version. I have an idea for one new feature that is low risk but should significantly improve the strength.

Next: New bot BetaStar.

AIIDE 2019 registered participants

First, an aside: The original CIG 2019 tournament web site (https://cilab.sejong.ac.kr/sc_competition2019/) is gone. Presumably there is a new one with the results. Did they change the name to CoG? It’s confusing, and I don’t have time to dig through it myself as usual; it’s not a priority. Who can tell me?

The AIIDE 2019 list of registered participants arrived in my e-mail today. That’s my priority, and I do have time for it. There are 26 bots altogether, 21 registered players and five held over from last year.

The holdover bots from last year are #1 SAIDA, #3 CSE, #6 Iron, #9 ZZZKBot, and #17 UAlbertaBot (ranks from last year’s tournament). Since they are unchanged from last year, top competitors will be ready for them. In particular, this version of SAIDA is strong in regular play but vulnerable to a number of known exploits. I expect SAIDA to finish in the middle, losing most games to the top protoss bots and to Steamhammer and Microwave among the zergs. CSE and ZZZKBot may possibly be more robust. UAlbertaBot is much weaker and risks falling out of the tournament this year, not being held over for another year.

Twelve bots are familiar from past tournaments. Over half of them are protoss, with only two terrans and three zergs. The favorites are the protoss death squad of Locutus, McRave, and PurpleWave, and possibly Dragon, plus terran XiaoYi from the newcomer bots in the next table. Don’t miss that Dragon is listed as playing protoss, not terran as on SSCAIT. I expect BananaBrain, DaQin, LetaBot, MetaBot, Microwave, and Steamhammer to stand in the middle. CDBot and Stormbreaker have come out on the lower end in past tournaments.

botauthor
BananaBrainJohan de Jong
CDBotSeevan Yang
DaQinLion GIS
DragonVegard Mella
LetaBotMartin Rooijackers
LocutusBruce Nielsen
McRaveChristian McCrave
MetaBotAnderson Tavares
MicrowaveMicky Holdorf
PurpleWaveDan Gant
SteamhammerJay Scott
StormbreakerMingqiang Li

Nine bots are new to me. That’s an ample supply of newcomers; almost as many as the updated returning competitors. It’s interesting that only two are protoss, although this is a protoss age—the race distribution of newcomers is fairly even, trending toward terran.

botauthor
AITPYang Xia
ApolloApollo Hanl
BunkerBoxeRHaoda Fan
DanDanBotTaeyoung Kim
FirefrogFeng Gao
KimBotTaeja Kim
MurphFrancisco Javier Sacido
OpheliaJean Chassoul
XiaoYiBenchang Zheng

BunkerBoxeR, whose name refers to BoxeR the terran bonjwa, is on github and comes with a handy text explanation of its strategy: A bunker rush—and not a trivial one, but one that adapts to the situation.

Taeyoung Kim is the name of the former professional Starcraft II zerg Freaky. Surely it’s not the same person?

Protoss Murph by Francisco Javier Sacido is by the same author as terran Ecgberht.

Ophelia is on github. It is written in Lua. The available code is brief, despite recent commits. It does not give me the impression of a complete bot—for example, the file micro.lua contains no code.

XiaoYi is the Chinese name of a company that in English is called YI Technology. The bot scored highly in the CIG tournament—and that’s all I know about it. Perhaps they repurpose some cool computer vision algorithms?

Steamhammer 2.3.2 with bug fix

The test paid for itself! Version 2.3.1 has a crashing bug that can strike replacement defilers. I got two crashes on SSCAIT, though strangely none on BASIL. I’ve uploaded Steamhammer 2.3.2, which fixes the bug—I hope it’s the only new defiler bug. Also in the new version are a micro improvement for smoother maneuvering, plus tweaks to plague usage.

The tournament test versions are configured to play zerg only.

I’ve seen a few games with queens and some parasites cast, but Steamhammer hasn’t infested a command center in public yet. I’m sure it will before long. It leaves the infested command center sitting there, blocking the base. I’m curious to find out whether that causes more problems for the opponent, or for itself.

Steamhammer 2.3.1 uploaded

I’ve uploaded Steamhammer 2.3.1 to SSCAIT. It is a test version to smoke out any major new bugs before AIIDE. Opponents that tune against Steamhammer will be able to test against a near-final version, but if I catch an important bug that will more than make up for it.

This version sometimes makes one queen, and knows how to parasite and infest. That’s the only difference that a casual watcher will notice. (In the stream you’ll be able to see the extra vision from parasited enemy units, but the OpenBW player does not show fog of war.) I put in a wide variety of smaller bug fixes and improvements, though unless you watch closely you may not detect them. The improvements tend to make Steamhammer’s behavior more complex, and I foresee a high chance of surprises.

No detailed change list until after tournament submission. It’s not all that short.

hiatus starts to tail off

I have regained enough time and energy to make occasional posts. Expect a low level of activity.

I registered Steamhammer for AIIDE 2019. I rolled back the BWAPI 4.4.0 upgrade for now, but I have started to make a few other changes that I have strength for. Last year the AIIDE version of Steamhammer got a multi-page change list broken down by category; this year it will be a short list. I expect to upload versions to SSCAIT once or twice before the deadline, to try to catch any bugs I’m adding in.

Doing little may actually be good for tournament performance. Last year I added so many features that I was fixing bugs for months, and the current mostly-fixed version is performing well on BASIL. At the moment, Steamhammer is the top zerg. When it loses, the most frequent cause is a gross strategic blunder, and apparently Steamhammer’s wide choice of openings allows it to eventually learn to avoid most strategic blunders. A long tournament like AIIDE should show the same effect.

long hiatus :-(

It appears that I am the correct person to be placed in charge of unwinding a complex estate. It will eat my time. Expect an extended hiatus.

I promise that I am more unhappy about it than you are.

Update 16 July: I’m still extremely busy, shuttling between states and trying to accomplish way too much that I’m not good at. I’m able to follow the scene—a little, I have no time to watch the stream. AIIDE 2019 has opened submission; it is an open question whether I will be able to enter, even with the current live version.

cancellation and destruction

If you cancel a unit, or cancel research for tech or for an upgrade, you get back its full cost in minerals and gas. Some bots know how to cancel a zerg egg if it is about to die, to save the cost. For example, Steamhammer cancels eggs, lurker eggs, and guardian/devourer cocoons that are very low on hit points (not the ideal criterion, but it helps).

If you cancel a building that is under construction, you get back 75% of the original cost in gas and minerals, rounded down to the nearest integer. Buildings tend to be expensive, so many bots cancel buildings that are about to be destroyed. If a terran SCV is killed while constructing a building, the player should either dispatch another SCV to finish the building, or cancel the building, depending on the situation; it’s not an easy decision. If the building is destroyed before it is completed, which is easier because it doesn’t have all its hit points yet, you lose the full value.

But these are not all the cases!

If a building is carrying out research when it is destroyed, the research is cancelled by force majeure. You get back 75% of the research cost, again rounded down. Do any bots cancel research when a tech building is about to be destroyed? Steamhammer does not (yet). You save 25% of the research cost, which is not much, and you accept a risk that the building might survive (maybe the enemy will stop shooting it), and you’ll have canceled for nothing.

If a building is producing units when it is destroyed, you are refunded the full cost of the units. It’s the same whether the unit is actually in production, or is queued behind other units for later. There is still a theoretical advantage to canceling pending units that will not be produced, though. It returns the resources sooner (minerals, gas, and supply), which might be valuable if you are resource constrained and can use the resources another way.

The refund for pending units of a destroyed building is an advantage for terran and protoss (though not a big one). Zerg has to worry about canceling eggs and cocoons, and must accept the risk of canceling incorrectly versus losing the unit for nothing.

SAIDA updated?

Oh look, SAIDA is updated! And the update is... that it is disabled on SSCAIT. It has an update on BASIL too, but it is still active there.

A confusing development. Will the disabling propagate to BASIL later? Will SAIDA now play on BASIL exclusively? Is it so they can keep their binary to themselves while they prepare for tournaments? I can only speculate. I found no new information on the github page. There is a March issue Expect the next SAIDA update to bring something more interesting, though I imagine it’s just some random user expressing a wish.

I'm a random user with a wish, too. I hope we get a new and improved SAIDA version in AIIDE. If so, with their resources and skill they may overwhelm all opponents again. So far, the updated version on BASIL does have a loss against Krasi0, but wins against 12 other opponents.

insanitybot can drop

The latest insanitybot update is able to carry out drops. The author seems to be systematically adding All The Features. Here’s a typical drop game, insanitybot-WillyT. Insanitybot plays a battlecruiser rush (compare PurpleSpirit’s battlecruiser rush), and follows up with a vulture drop.

I think insanitybot performs a drop in most of its games which go over 10 minutes. There are plenty more examples.

The drop feature is clearly leaning on the limited support for drop in insanitybot’s parent Steamhammer. The drop is a usually vulture drop, just like Steamhammer’s terran drop, and the dropship follows the same path around the edge of the map and unloads in the same location. Notable differences from Steamhammer’s drop skills are: 1. If there are no vultures, the dropship will carry marines instead. Are there other possibilities? 2. The drop is a middle game behavior, rather than being coded into the opening. 3. Insanitybot can lay mines, so spider mines may end up in the enemy base. I notice that the drop location near the mineral line is not ideal for laying mines, though. 4. Insanitybot attempts to set up for another drop. The dropship comes home after the drop, and sometimes picks up new units. If the dropship dies, another is eventually made. I have yet to see the second drop land, though.

The game insanitybot-Gaoyuan Chen is a highly effective marine drop. The dropship returns home and starts picking up fresh marines, but the marines are more interested in the fight in front of them than in the distant enemy base. The dropship is finally shot down before it can make the second drop.

Drop in the general case is of course a very complex set of skills. There are cliff drops (Icebot and SAIDA can drop tanks on a cliff), mixed unit drops (marines and medics are good), not filling the transport (to reduce the loss in case it is shot down, or to speed up the drop timing; it is normal for protoss to load only 2 dark templar into a shuttle, for example), multi-ship killing drops versus harassment drops, good play after dropping (lay mines in front of the enemy gateways, for example), changing the drop point based on new information (the dropship may fly over an unscouted enemy base), scanning the drop zone to make final plans (“ack, turn back, it’s well defended!” or “I only see zerglings, let’s go behind the minerals so we’re hard to reach”), and so on. Then there is coordinating the drop with other actions. In pro games, it’s common to escort the dropship across the map, load up near the destination, and carry the troops only a short distance. And there are tricks to draw forces away from the drop zone, or to use the drop to draw forces away from the front. It’s far more than any bot can do, for now. Another way to say it is, there are plenty of ways available to surprise your opponents in the next tournament.

What’s next for insanitybot? I think there are still some terran skills to add, but not that many!