archive by month
Skip to content

Steamhammer 3.5.10 change list

Steamhammer 3.5.10 is the AIIDE 2021 tournament version. The current version on SSCAIT and BASIL is 3.5.2. The change list covers everything in between. I’ll upload the new version shortly, and source before long.

I wanted to improve lurker play to the point of having working lurker contain skills, but it was too ambitious for the time available. Even so, the improvements to lurker play should be easy to see. I soon decided it would be more effective to work on smaller fixes. There are always many short to-dos that each make a difference... because they accumulate faster than I can retire them.

tournament preparation

• Special preparation against 9 prospective AIIDE 2021 opponents—the ones it might make a difference against, plus Stardust where Steamhammer is at risk of scoring zero. I followed the same preparation plan as last year: For each opponent, choose a small number of builds that have historically won, or that seem to have good chances, and enter them into history as fictional single winning games. Let learning do the rest.

It amounts to giving hints “try this a few times before giving it up.” Steamhammer has a better chance of finding good builds early, and is not weighed down with masses of outdated learning data if the opponent brings surprises.

information

• Remember whether the enemy has used psionic storm this game. I wanted to feed the information into lurker spacing decisions, but ended up not implementing lurker spacing, so the feature is unused for now. There are other potential uses.

static defense

Changes to static defense include tuning to make the right amount in different situations—zerg static defense is expensive, and needs to be worth it. I think the tuning is improved versus terran, fairly good versus protoss, and still weak versus zerg.

• Fixed a crash due to division by zero. The bug fix does not affect strength, because the crash only happened when Steamhammer had no bases left. Yes, it was dividing by the number of bases. How easy it is to forget that you may already be dead! For my part, I forget that nearly every day.

Morph forgotten creep colonies into sunkens or spores, if and when they happen to be needed. The building manager sometimes slips up and forgets to morph a creep colony that was intended to become static defense. If defense is not needed, it will remain a creep for the time being. When the static defense planner decides that it is needed, it may turn into either a sunken or a spore. At some point I’ll implement tactical analysis and Steamhammer will have an idea of when the enemy might attack in strength. Then it will be able to leave all colonies until they are needed.

Try to place spore colonies in the mineral line, rather than somewhere vaguely near the hatchery. This helps ZvZ the most.

• Make one sunken colony less per base, compared to before.

• If the enemy has many tanks with siege mode, sharply limit the number of sunkens. They become a waste of minerals.

• Make more spores versus mass wraiths and mass scouts.

buildings

Anti-cannon sunken reaction failed due to errors in building placement introduced in a recent version. Fixed.

• Other attempted improvements to anti-cannon sunken placement.

• Added configuration option Config::Skills::UseSunkenRangeBug so that I can turn the feature off when it’s not allowed. It’s part of building placement; see BuildingPlacer::getAntiCannonSunkenPosition(). It’s off for AIIDE, where use of the bug is not allowed. It’s on for SCHNAIL, since it’s allowed in human games.

Steamhammer might try to build a macro hatchery directly on top of the main hatchery in the opening. The hatchery failed to build and the drone assigned to build it was left idle for a time, a serious breakdown. Fixed.

• In rare cases, a building might be placed invalidly so that it could not be built. Fixed.

squad orders

• Each squad keeps track of the last time its order was changed to a different target. It also remembers the most recent frame that any cluster of the squad attacked, and the most recent frame of a retreat. (“Attack” usually means that the combat sim said “go attack”, not that any unit fired a shot.)

• The above info is used by the air squad in deciding whether to keep attacking its current target, or seek an undefended target of opportunity. If the last attack was a long time ago and the last retreat was just now, then the mutas are sitting around and should try another target. They look for the closest undefended thing and try that instead. Unfortunately, the closest undefended target is often as inaccessible as the original target—it can be attacked in theory, but Steamhammer doesn’t have the smarts to do it in practice. So far, the feature is not worth the effort I put into it. I think it will become worth it when I implement more pathing and harassing skills.

• In defense, defeat enemy proxy pylons when nothing more dangerous threatens. There was always code to do this, but it was broken in a subtle way. The method for assigning units to squads is too complicated; I’ve got to find a better idea.

• In defense, count an enemy proxy creep colony as 2 units, not 1. When pulling drones to defeat the proxy before it can finish morphing into a sunken, Steamhammer will pull 4 drones and win the fight instead of 2 drones and lose. (3 drones would be ideal, if no other unit interferes.)

recon squad

The Recon squad has been a valuable feature ever since I implemented it. But lately Steamhammer has become strong enough that Recon’s weaknesses are hurting. For example, classically the Recon squad only pays attention to units that it can see, ignoring the remembered positions of enemy units, because its purpose is to see what’s going on. But suppose the squad consists of 1 zergling and it wants to scout an area defended by a sieged tank. The ling approaches to see, gets splatted by the tank. Another ling is assigned, approaches, splatted, etc., until the target times out. The process is, as people say nowadays, unsustainable.

I made 3 changes. None is critical in itself, but together they make the Recon squad safer and more effective and count as an important improvement.

• Combat sim attends to all enemy units, as for other squads, not only visible enemy units.

• When the squad is restored after it has become empty (for any reason, not only losing all units to the enemy), reset its target to somewhere else.

• Don’t assign the squad a target that is already in view. If the Watch squad or an overlord can see the target, the Recon squad doesn’t need to. As always, if no targets need scouting, disband the squad.

irradiated squad

I improved the behavior of irradiated units, but it still doesn’t work as intended. I’m convinced that bugs are hidden somewhere in the infrastructure code, not in the top-level decision code.

• The code was already clean, but I simplified it a little more.

• An irradiated unit keeps farther away from its friends than before. This is the most important change, even though the old distance was already outside the irradiation splash range.

• Flying units seek in a wider radius to find enemy units to splash radiation onto. Mutas are fast and may get there in time to do a little splashing.

• A slight change to burrow decisions.

scouting

• Release the scout worker early in a few special cases: If there is an overlord nearby to continue the scouting work; if the scout runs into a completed enemy bunker or photon cannon. There are details to the conditions; for example, if no enemy unit type has been seen yet beyond those the enemy had at the start of the game, then the scout stays on the job. Steamhammer usually scouts early, and returning the scout is economically good. An enemy bunker or cannon (if not a proxy) means on the one hand that the scout cannot advance, and on the other that the enemy has no intention of attacking right away, so Steamhammer can return the scout now and wait for zerglings to arrive to keep watch.

squad tactics

Don’t retreat forward if the enemy is near at all. The feature was meant to fix the case where one cluster of units is attacking the enemy, while a smaller cluster farther away was afraid to approach because it could not win on its own. But if an enemy was between the two clusters, which could happen despite a triangle-inequality test to try to prevent it, the cluster retreating forward would walk through the enemy and get shredded. Instead, a Regroup cluster close to an Attack cluster is itself changed to Attack in a second pass through the cluster status decisions before they are executed. The failure cases are non-horrible, and the change fixes one of Steamhammer’s biggest tactical weaknesses. At some point I’ll rewrite it so that clusters fighting the same enemies are treated together, not separately, but that’s for the future.

Enemy unit clustering is turned on, so that known enemy units are grouped into clusters just as Steamhammer’s units are. The config option Config::Debug::DrawClusters draws the enemy clusters in red circles to contrast with Steamhammer’s clusters in white circles. The enemy clusters are used in various decisions at the cluster and unit level.

An unhandled case led to poor lurker retreat decisions. I rewrote the code to simplify it and fix the bug.

When retreated all the way to the retreat point, lurkers burrow and tanks siege. Formerly, both remained ready to move, which meant that they were unready if the enemy advanced. It may not sound important, but it’s a big improvement. Indecision between advancing and retreating is common, which causes the familiar burrow/unburrow frenzy, but it’s a net gain by a wide margin.

• When retreating, count a sieged tank or a burrowed lurker as immobile defense, an option to retreat toward. Formerly, Steamhammer only looked for static defense.

• When seeking a cluster ahead to join this cluster with, use the squad’s order distance instead of the air distance. The order distance is the ground distance for ground clusters or the air distance for air clusters. This fixes some poor decisions made by ground units near terrain features.

• The code to retreat behind static defense was rewritten to be correct for a change. The actual behavior doesn’t change much, though.

• Be a little quicker to declare overlord danger at a base, so that new overlords are not spawned there to die uselessly.

combat sim

• The configuration option Config::Debug::DrawCombatSimInfo now draws information for each cluster, rather than for the most recent cluster simulated. It shows both the raw and the smoothed attack/regroup results, so you can see how the raw results flip-flop more. Combat sim is that much more debuggable—still not very.

A bug could leave the combat sim in an out-of-date state. Fixed. The bug (mentioned earlier in Steamhammer is progressing) is responsible for most or all of the 50-100 elo strength loss on BASIL in version 3.5.2. It’s what caused units to sit back instead of, say, attacking an undefended base.

• The radius to look for enemy units to include in the combat sim is altered to match what the Squad code does. I think this is a no-op; the enemy units that end up included are those in range to fire into the combat radius, which is different. But it looks tidy.

micro

Cancel a dying egg, cocoon, or unfinished building 1 second before it is predicted to die, not 5 seconds as previously. Lurker eggs were being canceled almost the moment they came under attack, which was bad. The gain of canceling items later outweighs the loss of a few units that come under sudden massive attack and die before they can be canceled.

• In figuring out which direction to kite a hydralisk, Steamhammer knows not to kite back into its own ground units—they are in the way. But it did not check whether the units were burrowed. Hydras had trouble kiting when near burrowed lurkers, because escape paths appeared to be blocked. Fixed.

terran

• Slightly improve the stim calculation, so that marines overstim a little less. It’s a change made in passing while I was working on other stuff, under the rule “if you see it now, fix it now.” (If it were possible to follow this rule all the time, there would be no such thing as technical debt.)

zerg

Macro: Steamhammer did not always make enough macro hatcheries due to a bug. That hurt a lot. Fixed.

• Macro: Make no macro hatchery unless there are at least 3 drones per base. Yeesh. It sounds basic, but the drone count never entered into Steamhammer’s calculation of whether it needed a macro hatch. This is a lenient limit that prevents rare egregious blunders (which I have seen happen). I expect I’ll tighten it in the future, one way or another.

• Macro: I noticed that Steamhammer sometimes became briefly supply blocked in the early middle game. I tweaked an overlord timing parameter by 1 point of supply, which fixed it.

• Macro: Fixed a potential production freeze related to air upgrades. This is a rare freeze; I'm not sure it has ever happened. When I fixed it, I thought it was a less-rare freeze that can happen when the enemy goes mass air. Then I discovered I was wrong. I have fixed the more important freeze, but not in time to get it into this version.

• Queue sunkens ordered by the strategy boss (as well as those ordered by the static defense boss, a change made in version 3.5.2), rather than posting them directly to the building manager. I never saw the old code cause a problem, but it’s likely that the change fixes rare misbehaviors.

• Queens: Be more flexible about parasiting high-priority targets instead of waiting for a good ensnare or broodling. If there is no tank in sight and the queen suddenly notices an enemy dropship, it should know what to do. A parasited dropship cannot surprise you.

• Queens: Get ensnare much less often versus terran, and a little less often versus protoss. I find the improvement in terran play to be visible.

• Defilers: A defiler that is about to die wants to cast a last spell. It’s done in part by a hit point test. Formerly, if the HP were too low but the enemy was gone, the defiler might (say) swarm itself, then consume, then swarm again nearby because the HP were still low, etc. There was often little or no gain, and the consumed zerglings did not appreciate it. Now the defiler only casts its low-HP Hail Mary spell if the enemy is around to shoot at it. (Being irradiated, stormed, or plagued also brings a Hail Mary.)

Lurkers: Avoid burrowing in tank or cannon range unless friends are along to help. This reduces the tendency of lurkers to rush in where angels fear to tread, though they’re still pretty foolish.

• Lurkers: Undetected lurkers look around harder for dangerous enemies nearby before unburrowing.

• Unit mix: Discourage guardians more overall. Discourage ultralisks and encourage hydralisks versus battlecruisers more. Favor hydras a little more versus wraiths. I think guardians may finally be tuned almost acceptably for Steamhammer’s current poor skill with them.

• Unit mix: When seeing 2 or more starports and no other air units, assume wraiths are likely and nudge the unit mix toward countering them. Steamhammer doesn’t make many predictions, but this one seemed important.

• Unit mix: Dark archons discourage queen production, though they don’t always eliminate it.

• I found that some urgent defensive reactions were happening too slowly. Therefore, first, call makeUrgentReaction() twice as often. Second, when making an anti-cannon sunken, it is allowed to start the creep colony before the spawning pool finishes. (Starting the creep before the prerequisite finishes for the final morph to a sunken or spore was already supported in other cases.)

Upgrades: Better code for ground upgrades. Historically, in long games Steamhammer went for ultra-ling in all matchups, and I wrote rigid upgrade code to match. It got carapace and then melee attack upgrade, and that’s all, correct preparation for the ultra-ling unit mix, with an exception added later for ZvZ to get melee attack first. Today Steamhammer varies its unit mix more sensitively depending on the situation, and may stick with or switch to hydralisks in the late game if they’re called for. I rewrote the code to be simpler and more flexible. In the planning phase, code puts any or all of melee attack, missile attack, and carapace into priority order depending on the matchup and game situation. In the execution phase, code assigns the top priorities to available evolution chambers.

In ZvT, Steamhammer gets missile attack if it is making hydras to fight goliaths or battlecruisers, because the terran is likely to stick with them. In ZvP, Steamhammer likes hydras and usually gets missile attack first and carapace next, though it depends. In ZvZ, with less variety, upgrades are about the same as before, except that there are extra rules if hive tech is reached. To my eye, play is clearly improved, especially in ZvP. Though the behavior is a lot more complicated, the total code size is small and about the same as the old rigid code.

• Upgrades: Fixed a minor bug where Steamhammer thought it could upgrade in an uncompleted evolution chamber. The worst case result was that the bot might slightly underspend its money on this production round.

openings

Overgas+1 build added to use more of that fast gas. Only one new opening! Is it a record low?

Tomorrow: What’s next for Steamhammer?

Steamhammer is ready for AIIDE 2021

Steamhammer is all set for AIIDE. I’m still making checks and running tests to be extra-duper-sure, but I’m convinced that this is the strongest and least-buggy Steamhammer ever. It hasn’t been uploaded anywhere, so nobody will be 100% ready for it... though I guess Stardust will be 99% ready. I plan to submit it today, a day ahead of time.

I’ll post the change list in a day or so, and the code after the submission deadline is safely past.

close proxy game

Here’s a short and surprising game from SCHNAIL, Steamhammer vs leftchange (T) on Heartbreak Ridge. Terran played an unusual and sneaky proxy. Steamhammer scouted it thanks to the anti-proxy overlord, and its first reaction was almost good; it did things right except for misplacing the sunken because sunken placement is optimized for stupid bot opponents. Steamhammer countered the empty enemy main, and soon neither player was able to mine. But there was a clear winner!

Today’s ASL 12 matches had another surprising and close proxy game with much better play, Soma vs JyJ on Polypoid. It starts at about 34:00 in this round of 16 group A vod with commentary by Nyoken and Scan. (I watched it “excluding restricted content” and didn’t miss anything that I noticed.)

Steamhammer is frozen for AIIDE

Steamhammer is feature-frozen for AIIDE 2021, so that I don’t risk breaking my good version. Well, maybe not entirely frozen, but reduced to a low temperature (keyword simulated annealing). I will fix bugs and prepare for specific opponents, and I’ll probably also make small feature tweaks if they are safe.

My change list right now has 54 items on it, 14 of them marked as important changes that significantly improve play. With that many, obviously none of them is a big project—there hasn’t been time! But major weaknesses are fixed or reduced, affecting the whole range of strategy, tactics, and micro; all levels have important improvements. I’m pleased and optimistic. (Of course I was optimistic before AIST S4, and then Steamhammer lost 0-4, so....)

For one new feature, I ran a test that involved adding a spore colony at every base. At supply 7 (very early, before the spawning pool), Steamhammer started an evolution chamber and made a spore in the main, and then added a spore at every new base for the rest of the game. The opponent didn’t matter for the test, so I ran it against the protoss built-in AI. I was tickled that, even with the giant handicap, Steamhammer won several games in a row with apparent ease.

Big Game Hunters on SCHNAIL

The popular map Big Game Hunters (BGH) has been added on SCHNAIL. It is very different from standard maps: There are 8 start positions, the mineral patches and geysers have 10x or more the usual resources per item, the layout is irregular, and there are imbalances everywhere. Strategy is different than on a tournament map, and bots need different knowledge and tuning to play on it.

Nevertheless, when I noticed last night that BGH was added, I quickly enabled it for Steamhammer. It should be fun, and I expect that different bugs and weaknesses will show. Steamhammer has played 3 games on the map so far. It lost them all, but I did learn stuff—so far, so good.

From the game history, it looks as though Krasi0 is the only other bot to have BGH enabled. I see one game as far back as 8 September. I recommend the map for authors who have time to learn from their bot’s SCHNAIL games, or who just want more fun.

A Fastest map is also added. I did not enable that for Steamhammer. (The layout is different from Fastest AfreecaTV, the closest corresponding map in Liquipedia.) I think it is not as much fun, and without trying it I guess Steamhammer is not likely to work there. Again, Krasi0 seems to be the only bot to enable it.

Aside: If I were in charge, Big Game Hunters and Fastest would only be enabled for practice games. They should not be inflicted on human players when they’re being serious. But SCHNAIL allows it. I see ranked games in the history.

the sunken range bug and AIIDE 2021

In Steamhammer 3.5.1 (see the “zerg” section) I added a defense against cannon rushes which exploits the sunken range bug. The bug makes it possible, under specific conditions, for a sunken colony to target an enemy which is outside the sunken’s range. Exploiting the bug is allowed in human tournaments. In fact, it’s a standard defense against cannon rushes, one that players know and use. An example is ASL 11 Semifinal A, Mini vs Queen, game 1—see about 32 minutes into the vod for a complicated sequence where Mini eventually abandons the cannon rush knowing that it has been countered, and notice that casters Nyoken and Scan have little trouble understanding what happened and why.

At the time I wrote “Use of this bug seems to be universally legal,” but today I checked the AIIDE rules more closely. The rules include a list of allowed bugs to exploit, and add “All other bugs/exploits are forbidden.” The sunken range bug is not on the list.

I sent e-mail to Dave Churchill explaining the situation and its complexities. He’s busy and I don’t know if he’ll have time to look into it. Basically, I’m expecting to disable the behavior in Steamhammer for the tournament. I’m adding a configuration setting Config::Skills::UseSunkenRangeBug so I can turn it on and off.

Most likely no AIIDE 2021 protoss will cannon rush at all, so in a way the point is academic. But who knows?

what should the rules say?

It’s complicated!

The range bug is a game behavior, and it can happen unintentionally in real games, just because events happen to trigger its conditions. It’s fairly rare, but I expect all who play regularly have seen it (whether they recognized it or not). Bots should not be penalized for game behavior that they did not intend, and have no reason to even notice.

Steamhammer deliberately attempts to exploit the bug to beat cannon rushes. I have to interpret that as a violation of the AIIDE rules as they are written.

If you’re actively trying to enforce the rule, how would you do it? First, you’d have to examine the games, presumably with replay analysis software since there are too many to watch in person. Then you’d have to decide whether at least one instance of the bug was a deliberate exploit. That likely involves reading the code to be sure. Tournament organizers are not going to go to so much trouble, so probably the only practical enforcement would be for other authors or observers to point out possible infractions after the fact.

Then there’s the point that exploiting the bug is legal in human play, so presumably it should be legal in bot play. But that has a hidden assumption behind it: Humans can’t or don’t exploit the bug in any way that seems unfair, therefore bots won’t either. It might be true, but how sure are you? Bots with perfect timing and simultaneous view of all information might be able to exploit the bug in a way that feels unfair. Then the rules would be unfair.

Maybe it’s right to allow exploiting the range bug unless and until some bot implements an unfair exploitation.

Even if it may be a good idea to change the rules, it’s no good to change them close to the submission deadline. The rules for this year should stay put. Next year’s rules may be open to debate.

Update: I have mail from Dave Churchill. After some flip-flopping, the final ruling is “INTENTIONAL use of this bug via any specific code that invokes it is not allowed.” That follows the original rules.

popular opponent Steamhammer

When I uploaded Steamhammer 3.5.1 to SCHNAIL, with new weaknesses, the bot lost 200 elo or more and also lost its popularity as a SCHNAIL practice opponent. I guess it’s not as much fun to play an opponent that sometimes plays fine and other times arrays all drones in front of the natural to make sunkens and then has no money to morph them. The bugs are fixed now. Elo is still lagging—elo changes slowly because there are not many ranked games—but Steamhammer’s popularity for practice returned suddenly. The players are getting information from somewhere.

In unrelated news, the name “Leta” is pronounced by some “Leeta”, by some “Layta”, and by some “Lehta” (which I guess is the correct one). In today’s ASL 12 round of 24 group E cast, Nyoken pronounced it all three ways in the space of a minute! Did anybody else notice?

Steamhammer is progressing

I estimate that the Steamhammer version active on SSCAIT and BASIL, 3.5.2, is about 50-100 elo weaker than the previous active version, 3.5. The improvements are outweighed by new issues, the most important of which came from an “optimization” of combat simulation which sometimes fed it stale data. Oops. Advice to all persons: Do not make mistakes, they can hurt.

I fixed that yesterday. The only remaining new weakness (that I can see) is a tendency to sometimes overdo it on the sunkens. I trimmed that back with limits based on additional information. It is less severe than the earlier weakness of forgetting the sunkens or leaving them until too late, and there are other improvements besides. I have the strongest Steamhammer yet.

I have time for more improvements. Early signs for Steamhammer in AIIDE 2021 look good, provided I can follow my own advice to all persons.

AIIDE 2021 prospects

The AIIDE registration list is available today. There are 14 bots on the list, compared to 15 last year. I count 7 protoss, 5 zerg, 1 terran, and 1 random, though among the updated returning bots protoss and zerg are 3-4. Zerg seems to be gaining in popularity. (As it should, ahem. I have been ahead of the curve the whole time!)

The familiar bots, in order of their BASIL ranks today:

botauthor
StardustBruce Nielsen
BananaBrainJohan de Jong
PurpleWaveDan Gant
MicrowaveMicky Holdorf
McRaveChristian McCrave
Fresh MeatHao Pan
WillyTNico Klausner
SteamhammerJay Scott

Protoss dominance is showing, but it already cracked in CoG without the help of Monster. Terran shyness is also showing, but I notice that WillyT has improved a lot in the last year. I counted new zerg Fresh Meat as a familiar bot even though neither Fresh Meat nor its terran counterpart Halo by Hao Pan has participated in AIIDE before—Hao Pan is an old stalwart. It will be interesting to see how Fresh Meat performs in the different world of a long tournament. Steamhammer is last on this list, but I have already fixed key weaknesses. It will perform better in the tournament.

We have 3 newcomers, a fair number. Last year there were 4 newcomers, and unfortunately only EggBot ended up playing.

botauthor
Blue SoupEujain Ting
real5droneKim TaeYoung
TaijiWang Bin

Eujain Ting seems to have some experience. I found old repos related to Broodwar and BWAPI on Bitbucket: Eujain Ting repositories. And I see Eujain Ting registered for the 2011(!) AIIDE tournament without playing. The name “Blue Soup” (after the debris of a destroyed dragoon) suggests either low expectations or a sense of humor! Kim TaeYoung last year registered protoss DanDanBot (which did not play). This year, the zerg name “real5drone” suggests a 5 pool strategy, whether honestly or otherwise. Wang Bin last year registered Taij, which I’m guessing was a typo for this year’s allusive name Taiji (and which also did not play). From past experience I do not have high hopes for the newcomers, but occasionally a great one appears. And I think it’s valuable experience to participate no matter how good or bad your bot is.

Plus 3 holdovers from previous tournaments, with their win rates from last year.

botauthor
Dragon 62.38%Vegard Mella
DaQin 50.14%Lion GIS
UAlbertaBot 31.14%Dave Churchill

It’s too bad that we don’t get an updated Dragon. It’s a complicated and interesting opponent. UAlbertaBot is here for yet another year, I gather, mainly as a long-term baseline to measure progress. I forecast that it will score less than 15% against the updated bots, and this year or next it is likely to lose its value as a baseline. 2017 champion ZZZKBot scored 39.89% last year and is not being carried over—now that’s a sign of progress.

ZvZ lurker game

Here’s a ZvZ SCHNAIL game where the human played an unusual strategy. It was a ranked game, so maybe the human shouldn’t be playing around... but they were clearly playing around. The game is Randomhammer - jki, appearing in the replay as Anonymous AI (rolling zerg) versus jk.

Randomhammer made an unfortunate choice of build, a hidden base with each base protected by a sunken. The goal is to survive a rush and hit back. Jki (who didn’t know at first that Randomhammer was zerg) went overpool then natural ahead of the hidden base, gaining an advantage from the start. And used the advantage ingeniously.

1. Contain Randomhammer to its main base with zerglings.
2. Get a spire.
3. Make scourge and repeatedly kill overlords. Overlords don’t cost gas and are usually a poor choice of scourge target, but since Randomhammer was already behind, it kept getting supply blocked and was unable to make enough units, air or ground, to break out. It didn’t help that it fought poorly.
4. Get lurkers too! The plan costs a lot of gas.
5. Win. If an overlord approaches to detect the lurkers, scourge it.

The picture shows the lurkers breaking down the hidden base. The lair is there because Randomhammer tries to morph the lair where it won’t be seen right away. Notice the human player’s much larger army supply.

lurkers versus hatchery

In other ZvZ games, jki has played normal ZvZ strategies. The lurker plan was apparently an on-the-fly decision to have fun with Randomhammer’s poor start. Bots can’t do that... yet.