archive by month
Skip to content

AIIDE 2021 - Microwave versus BananaBrain

Blue is good for Microwave, red is good for BananaBrain.

microwave strategies versus bananabrain strategies

overall10/12gate1basespeedzeal2basespeedzeal4gate2archon5gategoon9/9gate9/9proxygatebisuneobisusairdtsairgoonsairreaverstove
overall21/157 13%3/86 3%1/1 100%1/2 50%1/2 50%5/30 17%3/15 20%1/2 50%1/2 50%1/2 50%1/5 20%1/5 20%1/2 50%1/3 33%
11Gas10PoolLurker0/3 0%0/2 0%---0/1 0%--------
11HatchTurtleHydra0/1 0%0/1 0%------------
11HatchTurtleMuta0/1 0%0/1 0%------------
12Hatch0/1 0%0/1 0%------------
12HatchTurtle0/3 0%0/1 0%----0/2 0%-------
12PoolMain3/15 20%1/10 10%---2/4 50%-0/1 0%------
12PoolMuta0/1 0%-----0/1 0%-------
2HatchMuta0/2 0%0/1 0%---0/1 0%--------
2HatchMuta_Sparkle0/1 0%0/1 0%------------
3HatchHydra1/7 14%0/3 0%---0/3 0%-----1/1 100%--
3HatchLingBust0/4 0%0/2 0%----0/1 0%----0/1 0%--
3HatchLurker0/1 0%----0/1 0%--------
3HatchMuta0/2 0%0/2 0%------------
3HatchPoolHydra0/3 0%0/1 0%---0/1 0%-----0/1 0%--
4HatchBeforeGas0/1 0%----0/1 0%--------
4HatchPool0/1 0%----0/1 0%--------
4HatchPoolHydra0/3 0%0/2 0%---0/1 0%--------
4PoolHard0/7 0%0/3 0%---0/1 0%0/1 0%---0/1 0%--0/1 0%
4PoolSoft0/1 0%----0/1 0%--------
6Pool0/1 0%0/1 0%------------
7Pool0/2 0%0/2 0%------------
7PoolHydraRush7D0/2 0%0/1 0%--------0/1 0%---
8Pool0/2 0%0/1 0%---0/1 0%--------
9Hatch9Pool9Gas0/2 0%0/2 0%------------
9HatchTurtleHydra0/1 0%--------0/1 0%----
9Pool0/1 0%----0/1 0%--------
9PoolGasHatchSpeed8D16/57 28%2/24 8%1/1 100%1/2 50%1/2 50%3/9 33%3/8 38%-1/2 50%1/1 100%1/3 33%0/2 0%1/1 100%1/2 50%
9PoolHatchGasSpeed8D1/11 9%0/7 0%---0/1 0%0/2 0%1/1 100%------
9PoolSpeed0/1 0%----0/1 0%--------
9PoolSpeedLing0/8 0%0/7 0%---0/1 0%--------
Overpool0/1 0%0/1 0%------------
OverpoolTurtle0/1 0%0/1 0%------------
ZvP_10Hatch9Pool0/1 0%-----------0/1 0%-
ZvP_2HatchHydra0/1 0%0/1 0%------------
ZvP_9Hatch9Pool0/1 0%0/1 0%------------
ZvZ_Overgas11Pool0/1 0%0/1 0%------------
ZvZ_Overgas9Pool0/1 0%0/1 0%------------
ZvZ_Overpool9Gas0/3 0%0/3 0%------------
ZvZ_OverpoolTurtle0/1 0%0/1 0%------------

That 9PoolGasHatchSpeed8D (a variant of the Styx build) must be behind many of the NakedExpand wins. Well, we already knew that, because it is behind most of the wins altogether. The interesting discovery is that it had some success against a wide range of BananaBrain openings.

The overall impression from this table is that both bots were feeling around in the dark. And we know how they work, so we know it’s true!

microwave as seen by bananabrain

microwave played#bananabrain recognized
11Gas10PoolLurker33 12pool
11HatchTurtleHydra11 12hatch
11HatchTurtleMuta11 12hatch
12Hatch11 12hatch
12HatchTurtle33 12hatch
12PoolMain159 12pool | 4 unknown | 2 10hatch
12PoolMuta11 12pool
2HatchMuta22 12hatch
2HatchMuta_Sparkle11 12hatch
3HatchHydra77 12hatch
3HatchLingBust44 12hatch
3HatchLurker11 12hatch
3HatchMuta22 12hatch
3HatchPoolHydra33 12hatch
4HatchBeforeGas11 12hatch
4HatchPool11 12hatch
4HatchPoolHydra32 12hatch | 1 unknown
4PoolHard77 4/5pool
4PoolSoft11 4/5pool
6Pool11 4/5pool
7Pool22 4/5pool
7PoolHydraRush7D22 4/5pool
8Pool22 9pool
9Hatch9Pool9Gas22 10hatch
9HatchTurtleHydra11 10hatch
9Pool11 9pool
9PoolGasHatchSpeed8D5749 9pool | 8 overpool
9PoolHatchGasSpeed8D116 9pool | 3 overpool | 2 unknown
9PoolSpeed11 9poolspeed
9PoolSpeedLing85 9poolspeed | 3 overpool
Overpool11 overpool
OverpoolTurtle11 overpool
ZvP_10Hatch9Pool11 10hatch
ZvP_2HatchHydra11 12hatch
ZvP_9Hatch9Pool11 10hatch
ZvZ_Overgas11Pool11 10hatch
ZvZ_Overgas9Pool11 unknown
ZvZ_Overpool9Gas33 overpool
ZvZ_OverpoolTurtle11 overpool

BananaBrain’s recognition is generally close enough. 11 hatch can be treated like 12 hatch, though it is sometimes possible to exploit the slight slowness of 12 hatch. Treating 7 pool like 5 pool is probably close enough for bot play. The only harmful mistake was in recognizing overpool when facing the aggressive 9PoolGasHatchSpeed8D.

bananabrain as seen by microwave

bananabrain played#microwave recognized
10/12gate8661 HeavyRush | 16 Unknown | 8 NakedExpand | 1 SafeExpand
1basespeedzeal11 Unknown
2basespeedzeal21 NakedExpand | 1 Turtle
4gate2archon21 Turtle | 1 NakedExpand
5gategoon3015 SafeExpand | 7 NakedExpand | 5 Turtle | 2 HeavyRush | 1 Unknown
9/9gate159 HeavyRush | 4 Unknown | 2 NakedExpand
9/9proxygate21 Unknown | 1 HeavyRush
bisu21 SafeExpand | 1 Turtle
neobisu21 NakedExpand | 1 SafeExpand
sairdt53 HeavyRush | 2 Unknown
sairgoon54 SafeExpand | 1 NakedExpand
sairreaver21 Turtle | 1 NakedExpand
stove31 Unknown | 1 HeavyRush | 1 NakedExpand

Here we see where BananaBrain’s NakedExpand losses came from: It didn’t simply play 12 nexus or whatever, but expanded behind the cover of pressure from some other build. Could it be that Microwave often didn’t scout the nexus unless it had defeated the pressure? Looking at this, it seems more like a BananaBrain weakness—eagerness to expand at a given time whether it is safe or not—than a Microwave strength. But then again, Microwave scored well against NakedExpand for almost every opponent that played it.

AIIDE 2021 - what Microwave learned

Microwave’s history files include large doses of training data prepared before the tournament. I snipped that data out, so the tables here include only tournament games and the 7 post-tournament games that are excluded from the official results.


#1 stardust

openinggameswinsfirstlast
10Hatch9Pool9gas20%95115
10HatchMain9Pool9Gas10%8585
10HatchTurtleHydra10%5050
11Gas10PoolLurker10%6060
11HatchTurtleHydra50%4153
11HatchTurtleLurker20%70122
11HatchTurtleMuta20%3076
12Hatch20%72105
12HatchMain20%8889
12HatchTurtle10%00
12Pool10%145145
12PoolMain10%127127
12PoolMuta10%108108
1HatchMuta_Sparkle20%54155
2HatchHydra10%9898
2HatchLurker20%1023
2HatchMuta20%4381
2HatchMuta_Sparkle30%1996
3Hatch20%13132
3HatchExpo10%136136
3HatchHydra20%59114
3HatchHydraBust20%4041
3HatchHydraExpo10%2424
3HatchLingBust40%46151
3HatchMuta10%88
3HatchMutaExpo70%25137
3HatchMuta_Sparkle10%1212
3HatchPool20%1562
3HatchPoolHydra40%65113
3HatchPoolHydraExpo20%4775
4HatchBeforeGas50%16130
4HatchPool10%129129
4HatchPoolHydra10%149149
4PoolHard30%38124
4PoolSoft60%2121
5HatchPoolHydra50%6117
5Pool50%18138
5PoolSpeed10%103103
6Pool10%128128
6PoolSpeed20%7999
7PoolHydraLingRush7D10%2929
7PoolHydraRush7D20%56152
8Pool30%48110
9Hatch9Pool9Gas30%1751
9HatchMain8Pool8Gas20%69140
9Pool20%7492
9PoolExpo10%123123
9PoolGasHatchSpeed7D10%7171
9PoolGasHatchSpeed8D60%590
9PoolHatch30%7119
9PoolHatchGasSpeed7D10%33
9PoolHatchGasSpeed8D20%106142
9PoolLurker30%34120
9PoolSpeed30%11147
9PoolSpeedLing40%36154
9PoolSunken10%118118
OverpoolSpeed60%9146
OverpoolSunken10%148148
OverpoolTurtle40%45135
ZvP_10Hatch9Pool20%4478
ZvP_11Hatch10Pool40%14150
ZvP_2HatchHydra10%156156
ZvP_9Hatch9Pool40%100144
ZvZ_Overgas9Pool20%1139
ZvZ_Overpool11Gas10%5353
ZvZ_Overpool9Gas20%2657
ZvZ_OverpoolTurtle10%109109
67 openings1570%
enemygameswins
HeavyRush230%
NakedExpand130%
Unknown1210%
3 openings1570%


Microwave has many strategies. I counted 79, compared to 73 last year (my first impression was that there were many more this year, but it was not true). Like Steamhammer, when losing badly it flails, trying anything.


#2 bananabrain

openinggameswinsfirstlast
11Gas10PoolLurker30%45133
11HatchTurtleHydra10%8585
11HatchTurtleMuta10%8989
12Hatch10%120120
12HatchTurtle30%6772
12PoolMain1520%39145
12PoolMuta10%8181
2HatchMuta20%52122
2HatchMuta_Sparkle10%8383
3HatchHydra714%30100
3HatchLingBust40%12137
3HatchLurker10%4444
3HatchMuta20%91111
3HatchPoolHydra30%27148
4HatchBeforeGas10%4848
4HatchPool10%5858
4HatchPoolHydra30%46134
4PoolHard70%0141
4PoolSoft10%7777
6Pool10%3737
7Pool20%32128
7PoolHydraRush7D20%2152
8Pool20%56121
9Hatch9Pool9Gas20%101125
9HatchTurtleHydra10%2121
9Pool10%4141
9PoolGasHatchSpeed8D5728%1154
9PoolHatchGasSpeed8D119%13147
9PoolSpeed10%6161
9PoolSpeedLing80%36156
Overpool10%8686
OverpoolTurtle10%155155
ZvP_10Hatch9Pool10%55
ZvP_2HatchHydra10%112112
ZvP_9Hatch9Pool10%9898
ZvZ_Overgas11Pool10%119119
ZvZ_Overgas9Pool10%106106
ZvZ_Overpool9Gas30%66151
ZvZ_OverpoolTurtle10%146146
39 openings15713%
enemygameswins
HeavyRush774%
NakedExpand2348%
SafeExpand225%
Turtle911%
Unknown2619%
5 openings15713%


See NakedExpand in the enemy table: Microwave was able to punish BananaBrain when BananaBrain made nexus before cannons. It’s a theme. I think it indicates general aggressiveness or rushiness in the early game. I get 6:52 for Microwave’s median game length when defeating BananaBrain.


#3 dragon

openinggameswinsfirstlast
10Hatch9Pool9gas10%8787
11Gas10PoolMuta1060%62156
11HatchTurtleHydra10%5959
12HatchTurtle250%9293
12PoolMuta10%142142
1HatchMuta_Sparkle333%30103
2HatchLurker10%9898
2HatchMuta633%7107
3HatchHydra20%2024
3HatchLingBust10%4141
3HatchLurker1747%76110
3HatchMuta20%134135
3HatchMutaExpo10%8484
4PoolHard40%063
4PoolSoft2512%1136
5HatchPool1060%114132
5HatchPoolHydra2268%5154
7Pool10%3434
7PoolHydraRush7D10%6464
9Pool30%973
9PoolHatch10%105105
9PoolHatchGasSpeed8D10%3232
9PoolLurker20%72113
9PoolSpeed2642%3101
9PoolSpeedLing812%53131
ZvZ_Overgas11Pool10%2121
ZvZ_Overgas9Pool10%5454
ZvZ_Overpool9Gas333%12127
28 openings15735%
enemygameswins
Factory5733%
HeavyRush1010%
SafeExpand4236%
Turtle933%
Unknown3741%
WorkerRush2100%
6 openings15735%


Microwave had 3 builds that scored above 50%, and others that were close, but experimented too much. It would have scored much higher if it had exploited more and explored less. I think the lesson is that the learning algorithm’s exploration parameter should be set depending on the opponent’s expected strength. If you’re expecting to score 35% and you find a choice that scores 60%, reduce your exploration and exploit the winner unless and until the opponent adapts. If you have more than one high-scoring build (and they’re not too much alike), switch between them and your opponent will have more trouble adapting. If you’re expecting to score 70%, keep exploring if your best choice is only 60%.


#4 steamhammer

openinggameswinsfirstlast
11HatchTurtleLurker10%9191
12Hatch10%105105
12HatchTurtle743%148156
12Pool10%1919
2HatchLurker10%138138
3HatchExpo933%96136
3HatchHydraExpo20%88126
3HatchLingBust633%83128
3HatchMuta_Sparkle333%142144
3HatchPool10%3838
3HatchPoolExpo10%8282
4PoolHard911%18137
4PoolSoft617%085
5HatchPool10%4343
5HatchPoolHydra10%11
5Pool119%6119
5PoolSpeed10%5252
6Pool10%101101
7PoolHydraRush7D10%111111
8Pool10%7979
9PoolExpo20%68106
9PoolGasHatchSpeed8D10%4141
9PoolHatch425%34125
9PoolHydra10%7878
9PoolLurker10%1414
9PoolSpeed2133%4134
9PoolSpeedLing2748%48157
9PoolSunkHatch10%9292
9PoolSunken10%147147
OverpoolSpeed10%2020
ZvP_11Hatch10Pool10%22
ZvP_2HatchHydra10%121121
ZvZ_Overgas11Pool2540%25135
ZvZ_Overpool11Gas50%9141
ZvZ_Overpool9Gas10%2121
35 openings15827%
enemygameswins
HeavyRush13422%
NakedExpand683%
Turtle825%
Unknown1060%
4 openings15827%


Even against a higher-finishing zerg, Microwave punishes the fast expansion when it recognizes it. It’s striking. Zerg is not able to add static defense to a base before the base finishes, so this ability to restrict the oppoent’s strategy could be even more powerful in ZvZ.


#5 mcrave

openinggameswinsfirstlast
10HatchMain9Pool9Gas20%24124
10HatchTurtleHydra425%2767
12Hatch10%109109
12HatchMain10%44
12PoolMain20%277
12PoolMuta10%88
2HatchHydra10%128128
2HatchLurkerAllIn10%9090
2HatchMuta10%1717
3Hatch838%81101
3HatchMuta10%7676
3HatchPoolHydraExpo20%7188
4HatchBeforeGas10%8484
4HatchPoolHydra10%126126
4PoolHard520%9135
4PoolSoft540%6156
5Pool10%1919
6Pool20%16125
8Pool30%018
8PoolHydraRush8D10%4949
9HatchTurtleHydra10%5757
9Pool838%12122
9PoolExpo633%96117
9PoolGasHatchSpeed7D10%1414
9PoolHatch10%142142
9PoolSpeed1136%1123
Overpool10%7373
OverpoolLurker10%6363
ZvP_10Hatch9Pool4951%38155
ZvP_11Hatch10Pool10%9191
ZvP_9Hatch9Pool3165%10153
ZvZ_Overpool9Gas20%37
32 openings15739%
enemygameswins
FastRush40%
HeavyRush14040%
Turtle714%
Unknown667%
4 openings15739%



#6 willyt

openinggameswinsfirstlast
10Hatch9Pool9gas333%36149
10HatchMain9Pool9Gas333%126146
12HatchMain20%31108
12HatchTurtle10%105105
12Pool1250%78139
12PoolMuta520%35141
2HatchHydra20%77101
2HatchLurker825%3150
3HatchExpo333%115145
3HatchHydraBust10%6969
3HatchLingBust650%95156
3HatchMuta1136%057
3HatchMutaExpo20%54125
3HatchPool10%1212
3HatchPoolHydraExpo333%3347
4PoolSoft2236%59154
5HatchPool10%5656
7PoolHydraRush7D10%117117
8PoolHydraRush8D10%7373
9Hatch9Pool9Gas729%263
9HatchMain8Pool8Gas10%106106
9Pool633%139
9PoolExpo1250%7153
9PoolGasHatchSpeed7D450%7181
9PoolGasHatchSpeed8D250%6282
9PoolHatchGasSpeed7D10%2929
9PoolHydra10%9191
9PoolLurker729%43142
9PoolSpeed450%1458
9PoolSpeedLing10%103103
9PoolSunkHatch10%5151
9PoolSunken1242%2294
OverpoolLurker10%3232
OverpoolSpeed10%5555
OverpoolSunken10%7272
ZvP_10Hatch9Pool10%129129
ZvP_9Hatch9Pool333%4161
ZvZ_Overgas9Pool10%6666
ZvZ_Overpool11Gas10%5252
ZvZ_Overpool9Gas10%8888
40 openings15732%
enemygameswins
Factory5326%
HeavyRush2214%
NakedExpand16100%
Proxy10%
SafeExpand1118%
Unknown5430%
6 openings15732%


And against terran, too. Against Microwave, if expanding early, apparently terran and protoss should add defenses at the natural first.


#8 daqin

openinggameswinsfirstlast
1HatchMuta_Sparkle3382%45153
3HatchHydra10%136136
3HatchLurker10%3838
3HatchMuta10690%0156
3HatchMutaExpo10%108108
4HatchPoolHydra1100%2525
5HatchPoolHydra250%10132
6Pool10%9292
6PoolSpeed10%110110
9PoolHatchGasSpeed7D333%646
9PoolHatchGasSpeed8D650%265
9PoolSpeedLing10%4444
12 openings15782%
enemygameswins
HeavyRush3100%
NakedExpand475%
SafeExpand4372%
Turtle8988%
Unknown1872%
5 openings15782%


The first opponent that Microwave outscored, and it was a runaway. Steamhammer struggled versus DaQin, but the other zergs were fine. Later I’ll examine why to see if there are lessons for Steamhammer.


#9 freshmeat

openinggameswinsfirstlast
2HatchLurker10%2626
4PoolSoft1346%0144
9PoolHatch4486%5156
9PoolSpeedLing6589%1154
OverpoolSpeed3482%3149
5 openings15783%
enemygameswins
FastRush1587%
HeavyRush3661%
NakedExpand11100%
Turtle4185%
Unknown5491%
5 openings15783%


The strong results against NakedExpand show here too.


#10 ualbertabot

openinggameswinsfirstlast
10Hatch9Pool9gas250%87107
11Gas10PoolLurker6874%27147
12Hatch20%24140
12Pool10%1313
1HatchMuta_Sparkle10%148148
2HatchLurker10%121121
2HatchLurkerAllIn10%1414
2HatchMuta_Sparkle10%122122
3HatchHydraExpo10%3333
3HatchLurker10%2020
4PoolSoft617%018
5Pool367%135145
5PoolSpeed933%1116
9Pool10%77
9PoolExpo10%5252
9PoolGasHatchSpeed8D3358%995
9PoolHatch540%4399
9PoolSpeed10%137137
9PoolSpeedLing6100%149154
9PoolSunken333%98141
ZvP_10Hatch9Pool10%110110
ZvP_2HatchHydra10%143143
ZvZ_Overgas11Pool560%111142
ZvZ_Overpool9Gas10%55
24 openings15557%
enemygameswins
Factory1493%
FastRush3253%
HeavyRush7845%
NakedExpand8100%
Unknown2365%
5 openings15557%


Like McRave but apparently for a different reason, Microwave had unnecessary trouble with UAlbertaBot. It takes more than a simpleminded learning algorithm to adapt to a random opponent with such different rushes for each race. The ideal answer is to adapt during the game after scouting. Steamhammer’s answer is a super-turtle build that defeats all of UAlbertaBot’s rushes. But still, see that 100% next to NakedExpand?

AIIDE 2021 - McRave versus WillyT

These tables tell more about McRave than about WillyT. Blue is good for McRave, red is good for WillyT.

mcrave strategies versus willyt strategies

overall1 rush2 fe bio-mech3 fe mech4 tonk
overall48/157 31%16/41 39%9/54 17%12/47 26%11/15 73%
HatchPool,12Hatch,2HatchMuta29/89 33%10/20 50%6/32 19%10/33 30%3/4 75%
PoolHatch,12Pool,3HatchMuta19/55 35%6/18 33%3/16 19%2/12 17%8/9 89%
PoolHatch,Overpool,2HatchMuta0/13 0%0/3 0%0/6 0%0/2 0%0/2 0%

I find it strange that McRave’s overpool into 2 hatch muta failed in every case. Is it a reaction build that turned out to be a misreaction to what WillyT does? Probably not, it was tried against every WillyT opener. McRave’s other 2 builds were about equal, though the table shows that they were best in different cases. Switching between them was likely correct. The ratio that they were tried in also looks good to me: You want a ratio that leads to the final results being about equal.

WillyT would have done better without 15 tonk builds.

willyt as seen by mcrave

willyt played#mcrave recognized
1 rush4140 Unknown,Unknown,Unknown | 1 RaxCC,1RaxFE,Unknown
2 fe bio-mech5423 RaxCC,1RaxFE,Unknown | 20 RaxCC,1RaxFE,1FactTanks | 6 Unknown,Unknown,Unknown | 5 RaxCC,1RaxFE,5FactGoliath
3 fe mech4733 RaxCC,1RaxFE,5FactGoliath | 8 Unknown,Unknown,Unknown | 6 RaxCC,1RaxFE,Unknown
4 tonk1513 Unknown,Unknown,Unknown | 2 RaxFact,Unknown,5FactGoliath

Both the rush and the tonk build usually denied scouting, which seems like it should have been important because the builds call for opposite reactions. Yet McRave defeated the tanks and had less trouble with the rush than with WillyT’s expansion builds. RaxCC and 1RaxFE seem simple enough to recognize, and were. The followup seems harder to recognize, and was. I doubt that so many were actually 5FactGoliath.

AIIDE 2021 - BananaBrain versus WillyT

Not much to see here, because the pairing was one-sided. But there are still a few points to note. In the tables, blue is good for BananaBrain, red is good for WillyT.

bananabrain strategies versus willyt strategies

overall1 rush2 fe bio-mech3 fe mech4 tonk
overall146/157 93%43/46 93%71/79 90%17/17 100%15/15 100%
10/12gate41/44 93%7/10 70%19/19 100%10/10 100%5/5 100%
12nexus5/6 83%1/1 100%1/2 50%1/1 100%2/2 100%
2gatedt0/1 0%-0/1 0%--
32nexus21/24 88%17/17 100%2/5 40%-2/2 100%
9/9proxygate76/77 99%18/18 100%46/47 98%6/6 100%6/6 100%
dtdrop1/2 50%-1/2 50%--
stove2/3 67%-2/3 67%--

It’s striking how quickly BananaBrain gave up on a build; it only had to fail once in six games. The reason is of course that the other builds were doing better than that. Now we see the relative success of WillyT’s build 2 bio-mech: It provided all of the wins in the builds that BananaBrain gave up on, and a few other wins as well. Otherwise, only WillyT’s rush was able to score a few wins, and then only against BananaBrain’s zealot play.

willyt as seen by bananabrain

willyt played#bananabrain recognized
1 rush4639 2rax | 7 unknown
2 fe bio-mech7940 fastexpand | 25 unknown | 14 2rax
3 fe mech1712 fastexpand | 2 unknown | 2 1fac | 1 2rax
4 tonk1510 1fac | 4 unknown | 1 2rax

BananaBrain seems to have diagnosed builds mostly correctly, when it was able to at all. WillyT’s build 2 seemed to be better at denying scouting. There is no sign that reading the opponent’s build helped BananaBrain play better; it’s the opposite if anything. But with the results so lopsided, we shouldn’t expect much of a sign anyway.

AIIDE 2021 - what WillyT learned

A middle group of bots finished close to each other, from #5 McRave at 41.70% to #8 DaQin at 39.63%. #6 WillyT is the second of the group.

WillyT’s learning files record the bot’s strategy as 01, 02, 03, or 04. Last year it only went up to 03. There may be an expectation of going up to 10 someday! Here is how I translated the strategy numbers into names, based on the numbering in the bot’s top-level README.

#namedescription
011 rush2 rax bio + SCVs
022 fe bio-mech 1 rax expand into bio-mech
033 fe mech1 rax expand into mech
044 tonkslowly make many tanks

#1 stardust

openinggameswinsfirstlast
4 tonk1563%0155
1 opening1563%


Stardust got special treatment, and it was still only good enough for 3%. The tonk build seems to have been specially devised to give a chance against Stardust. I checked on BASIL and found that the chance there was never high. But it’s over zero, that’s better than Steamhammer did!


#2 bananabrain

openinggameswinsfirstlast
1 rush467%4156
2 fe bio-mech7910%0154
3 fe mech170%3152
4 tonk150%1141
4 openings1577%


Switching between the rush and bio-mech was able to squeeze a little blood from BananaBrain. It’s interesting that mech scored lower, though the expected win rate is so low that it’s hard to be sure the difference is real. Does the build suffer from a weak timing?


#3 dragon

openinggameswinsfirstlast
1 rush300%3155
2 fe bio-mech353%0156
3 fe mech665%1153
4 tonk260%2154
4 openings1573%


The author explained in a comment that WillyT is weak at TvT because it does not understand siege lines. With only one terran opponent, it wasn’t critical. This version of Dragon always makes a slow start to the game, so any slowness in WillyT’s bio-mech build did not matter, and having tanks likely helped.


#4 steamhammer

openinggameswinsfirstlast
1 rush8649%10155
2 fe bio-mech5345%2156
3 fe mech1118%0150
4 tonk70%3147
4 openings15743%


WillyT could not outscore Steamhammer, but it made a good attempt. I find it distressing that the rush won so many games; it’s a strong rush but not that hard to hold. Again, bio-mech was better than mech. Well, that’s more expected versus zerg, but I wonder whether the reason is the same as versus BananaBrain?


#5 mcrave

openinggameswinsfirstlast
1 rush4161%4155
2 fe bio-mech5483%0154
3 fe mech4774%13156
4 tonk1527%5138
4 openings15769%


McRave is meticulous in defense, which shows in these numbers. But it suffered against 2-base play. I think we can infer that WillyT has good mutalisk defense.


#7 microwave

openinggameswinsfirstlast
1 rush5883%0155
2 fe bio-mech1942%7156
3 fe mech4764%8153
4 tonk3361%6151
4 openings15768%


The tonk build had success against Microwave, but was neither successful nor much played other than here and versus Stardust. I’d say the build is overspecialized, useful only in a narrow range of situations. The rush was overwhelming, though.


#8 daqin

openinggameswinsfirstlast
1 rush1414%235
2 fe bio-mech13044%4154
3 fe mech70%834
4 tonk40%018
4 openings15538%


And again, bio-mech over mech. It’s not conclusive, but I feel that something may be weak in the mech build. Maybe WillyT is just better with marines.


#9 freshmeat

openinggameswinsfirstlast
1 rush13372%4156
2 fe bio-mech1250%239
3 fe mech633%138
4 tonk650%0136
4 openings15768%


FreshMeat is newer and perhaps not ready yet to face the rush.


#10 ualbertabot

openinggameswinsfirstlast
1 rush7381%5151
2 fe bio-mech4961%0154
3 fe mech2654%3148
4 tonk729%12144
4 openings15568%


UAlbertaBot, with aggressive openers and no strong defensive skill, also fell to the rush. It got outrushed. It strikes me that WillyT scored nearly the same against #5 McRave, #7 Microwave, #9 FreshMeat, and #10 UAlbertaBot, even though the four are different in style and strength. WillyT did not crush any opponent. To me that suggests some kind of inconsistency in its play: It may have flaws that even weaker bots can exploit sometimes.

AIIDE 2021 - McRave versus Dragon

McRave recorded all 157 games versus Dragon, but Dragon recorded only 155. I was able to align the files anyway, because Dragon’s missing games were clearly due to Dragon’s 2 crashes. I manually removed the corresponding games from McRave’s records. Then there was one more fix: The game of round 97 that McRave and Dragon both recorded that they had lost. Officially, McRave had timed out and Dragon won, so I manually altered Dragon’s game record to give it the win.

Dragon doesn’t record anything but win/loss and its own strategy, so it has nothing to say about how McRave played.

mcrave strategies versus dragon strategies

overall1rax fe2rax bio2rax mechbiodirty worker rushmass vulturesiege expand
overall51/155 33%4/20 20%14/40 35%6/17 35%9/24 38%2/2 100%3/6 50%13/46 28%
HatchPool,12Hatch,2HatchMuta21/66 32%0/7 0%5/14 36%3/5 60%2/11 18%-2/2 100%9/27 33%
HatchPool,12Hatch,2HatchSpeedling0/1 0%--0/1 0%----
PoolHatch,12Pool,2HatchMuta1/9 11%0/2 0%0/2 0%1/2 50%---0/3 0%
PoolHatch,12Pool,3HatchMuta14/36 39%1/3 33%6/14 43%1/2 50%6/11 55%-0/3 0%0/3 0%
PoolHatch,Overpool,2HatchMuta9/26 35%3/4 75%1/7 14%0/4 0%1/2 50%--4/9 44%
PoolHatch,Overpool,2HatchSpeedling2/2 100%----2/2 100%--
PoolHatch,Overpool,3HatchMuta4/15 27%0/4 0%2/3 67%1/3 33%--1/1 100%0/4 0%

Another reaction build: PoolHatch,Overpool,2HatchSpeedling was a reaction to Dragon’s worker rush, and taught Dragon not to do that.

dragon as seen by mcrave

dragon played#mcrave recognized
1rax fe2012 Unknown,Unknown,Unknown | 5 RaxCC,1RaxFE,5FactGoliath | 3 RaxCC,1RaxFE,Unknown
2rax bio4031 Unknown,Unknown,Unknown | 6 2Rax,Main,Unknown | 1 2Rax,Main,1FactTanks | 1 RaxCC,1RaxFE,Unknown | 1 2Rax,Expand,Unknown
2rax mech1714 Unknown,Unknown,Unknown | 2 2Rax,Main,Unknown | 1 2Rax,Proxy,Unknown
bio2411 RaxCC,1RaxFE,5FactGoliath | 7 Unknown,Unknown,Unknown | 3 RaxCC,1RaxFE,1FactTanks | 3 RaxCC,1RaxFE,Unknown
dirty worker rush22 Unknown,Unknown,WorkerRush
mass vulture65 Unknown,Unknown,Unknown | 1 RaxFact,Unknown,2PortWraith
siege expand4618 Unknown,Unknown,Unknown | 13 RaxFact,Unknown,5FactGoliath | 9 RaxCC,1RaxFE,5FactGoliath | 4 RaxCC,1RaxFE,Unknown | 2 RaxFact,Unknown,Unknown

Not much to see here; we already knew that McRave had trouble scouting Dragon. Much of what it did recognize was correct, at least. Though what McRave saw as a proxy, Dragon called “2rax mech”. The game is game 2767 from round 61 (replay file) on Heartbreak Ridge. Nothing in it resembles a proxy; it must have been a McRave bug.

AIIDE 2021 - McRave versus BananaBrain

McRave and BananaBrain both recorded all 157 of their mutual games. I chose to put McRave down the left side of the strategy cross, because its longer strategy names make the table hard to read otherwise. I also trimmed off the “PvZ_” and “Z_” prefixes from BananaBrain’s strategy names for compactness.

Blue is good for McRave, red is good for BananaBrain.

mcrave strategies versus bananabrain strategies

overall10/12gate1basespeedzeal2basespeedzeal4gate2archon5gategoon9/9gate9/9proxygatebisuneobisusairdtsairgoonsairreaverstove
overall28/157 18%8/54 15%1/3 33%1/5 20%1/1 100%1/1 100%1/1 100%2/8 25%1/5 20%1/4 25%1/3 33%2/12 17%1/1 100%7/59 12%
HatchPool,12Hatch,2HatchMuta16/86 19%3/28 11%1/1 100%1/3 33%1/1 100%1/1 100%1/1 100%0/1 0%-1/4 25%0/2 0%2/10 20%1/1 100%4/33 12%
HatchPool,12Hatch,2HatchSpeedling0/1 0%------0/1 0%------
HatchPool,9Pool,2HatchSpeedling2/2 100%------2/2 100%------
PoolHatch,9Pool,2HatchMuta3/15 20%0/2 0%------0/3 0%----3/10 30%
PoolHatch,9Pool,2HatchSpeedling0/3 0%------0/3 0%------
PoolHatch,9Pool,3HatchMuta4/19 21%4/13 31%-0/1 0%----0/1 0%----0/4 0%
PoolHatch,9Pool,6HatchHydra0/2 0%----------0/1 0%-0/1 0%
PoolHatch,Overpool,2HatchMuta0/4 0%0/2 0%0/1 0%--------0/1 0%--
PoolHatch,Overpool,2HatchSpeedling0/1 0%------0/1 0%------
PoolHatch,Overpool,3HatchMuta3/14 21%1/9 11%0/1 0%-----1/1 100%-1/1 100%--0/2 0%
PoolHatch,Overpool,6HatchHydra0/10 0%--0/1 0%---------0/9 0%

There we have the explanation for the 2 lonely HatchPool,9Pool,2HatchSpeedling games: The strategy was a successful reaction to proxy gates. I read it as meaning that the build is 9 hatch, 9 pool, and gas soon for the zergling speed upgrade.

BananaBrain split its effort between 10-12 gate and the Stove (a scout into dark templar build), very different builds. McRave answered both mostly with 12 hatch into 2 hatch muta. A hydralisk opening would have been a more natural way to counter both, but play what you’re good at.

mcrave as seen by bananabrain

mcrave played#bananabrain recognized
HatchPool,12Hatch,2HatchMuta8684 12hatch | 2 unknown
HatchPool,12Hatch,2HatchSpeedling11 unknown
HatchPool,9Pool,2HatchSpeedling22 12pool
PoolHatch,9Pool,2HatchMuta158 9pool | 7 overpool
PoolHatch,9Pool,2HatchSpeedling32 overpool | 1 9pool
PoolHatch,9Pool,3HatchMuta1913 9pool | 6 overpool
PoolHatch,9Pool,6HatchHydra21 overpool | 1 9pool
PoolHatch,Overpool,2HatchMuta44 overpool
PoolHatch,Overpool,2HatchSpeedling11 overpool
PoolHatch,Overpool,3HatchMuta1414 overpool
PoolHatch,Overpool,6HatchHydra1010 overpool

BananaBrain was accurate in recognizing 12 hatch and overpool, but had trouble with 9 pool. It did not try to narrow the build down any further than that.

bananabrain as seen by mcrave

bananabrain played#mcrave recognized
10/12gate5431 2Gate,10/12,Corsair | 8 2Gate,10/12,DT | 4 2Gate,10/12,ZealotRush | 3 2Gate,10/17,Corsair | 2 2Gate,Unknown,Corsair | 2 2Gate,9/9,DT | 2 2Gate,9/9,Corsair | 1 2Gate,10/17,4Gate | 1 2Gate,10/17,DT
1basespeedzeal32 1GateCore,2Zealot,DT | 1 1GateCore,2Zealot,Corsair
2basespeedzeal53 FFE,Forge,Speedlot | 1 FFE,Nexus,Speedlot | 1 FFE,Nexus,5GateGoon
4gate2archon11 FFE,Forge,5GateGoon
5gategoon11 FFE,Nexus,5GateGoon
9/9gate11 2Gate,9/9,Corsair
9/9proxygate87 2Gate,Proxy,ZealotRush | 1 2Gate,9/9,Unknown
bisu52 FFE,Forge,Unknown | 2 FFE,Forge,5GateGoon | 1 FFE,Nexus,Unknown
neobisu44 FFE,Forge,Speedlot
sairdt33 1GateCore,2Zealot,Corsair
sairgoon126 FFE,Forge,5GateGoon | 2 FFE,Nexus,5GateGoon | 2 FFE,Forge,Unknown | 1 FFE,Gateway,5GateGoon | 1 FFE,Gateway,Unknown
sairreaver11 FFE,Forge,Unknown
stove5927 1GateCore,2Zealot,Corsair | 10 1GateCore,Unknown,Corsair | 6 1GateCore,Unknown,DT | 6 1GateCore,2Zealot,DT | 3 2Gate,10/12,DT | 3 2Gate,10/12,ZealotRush | 2 2Gate,10/17,4Gate | 1 2Gate,10/17,DT | 1 2Gate,10/12,4Gate

In 1-base protoss plays, McRave tried to distinguish when the gates were made, and often got it right but had some trouble. It seems like something you can’t do perfectly, even if you combine direct scouting of the gates with inferences based on the enemy army. Recognizing the enemy build precisely doesn’t seem possible in general, though you can usually get close.

AIIDE 2021 - a questionable game result and fixing it

Working through the learning files of various bots, I ran into a strange discrepancy: One game between Dragon and McRave which both bots recorded as a loss. In the detailed results, the game ID is 4387 from round 97. The official result has Dragon winning after McRave timed out.

What really happened? I watched the replays recorded by both bots. On the surface, both replays of the game looked the same. McRave destroyed all of Dragon’s buildings, then as usual the replays continued a few more moments. According to OpenBW, Dragon’s replay ended at 22:10 and McRave’s replay at 22:09 (according to the official results, the game ended at 21:57). It’s reflected in the file sizes; Dragon has 1,553,196 bytes while McRave has 1,552,818 bytes (in other cases I checked, differences between replay sizes for the same game are less than 10 bytes). Here is a view at the end of Dragon’s replay, followed by the end of McRave’s. Notice that the valkyrie has moved a little farther in Dragon’s version, and Dragon shows supply 0 for both bots at the end (supporting that they both lost).

Dragon’s replay end McRave’s replay end

On the face of it, Dragon lost because all its buildings were destroyed, then in the brief runout of the game before Broodwar stopped, McRave lost by timing out (the tournament manager said it timed out, plus it recorded its own game result so it didn’t crash). That’s how they both believed they lost. The tournament manager, I have to assume, didn’t expect that situation and took the timeout as definitive, recording that Dragon won.

I wrote to Dave Churchill about it and got this answer:

I don’t have any time to work on this right now and it seems like a pretty small edge case, so if you could post about it and crowd source the fix that would be ideal. I’ll accept any pull request that makes the tournament better!

It’s not critical, it’s a rare case that is not even close to affecting the tournament finishing order. But it would still be nice to fix it.

The first job may be to read code and/or run experiments to figure out more exactly what actually happened. Regardless of the course of events, there are two issues to solve. 1. What should the game result be? 2. How can we tell both bots the correct result?

1. the game result

It was a misplay. Both bots messed up fatally. Don’t count it as a win for either, but skip the game.

McRave won. All terran buildings were destroyed, and that’s the winning condition, right? Never mind that McRave had trouble with time later. Why is there a later at all?

Dragon won. The tournament needs to control how much time bots take, no matter when they take it, as a matter of efficiency and fairness. Therefore the game is not over until Broodwar stops it.

Reasonable people can disagree. I don’t think the answer matters much. What’s more important is to make sure that the actual game, the tournament manager, and the bots all agree on the result as much as possible. I think that issue 1 and issue 2 are interrelated, and should be answered together, not separately.

2. notifying the bots

I don’t understand the technical details of how bots are notified that they won or lost much beyond “somebody calls onEnd()”. But I have poked at it a bit. Looking at it from the tournament end, the software includes a java tournament manager, a C++ tournament module that is part of BWAPI, and then the bots and game itself.

I think the outline is this: When a game completes normally, there is a short runout phase, and then the tournament module notifies both bots of the result, all good. If a bot times out, the tournament module kicks it out of the game immediately and notifies it of its loss. Then Broodwar realizes there is only one player left, calls the game over, and the remaining player wins. Usually good. In this case, I think Dragon lost and the game entered the runout phase. Then McRave timed out, was kicked out and notified of its loss. Then, when Broodwar ended the game slightly later (giving Dragon the longer replay), for whatever reason the tournament module told Dragon it had lost too. Meanwhile, the tournament manager took the timeout as definitive and recorded that Dragon won. Is my thinking correct? I think it’s close, but I may have details wrong.

The goal is to find a fix so that one of the game results of issue 1 is decided on and carried through consistently. It would be nice if the fix only affected the java tournament manager, but I don’t know if that’s possible.

AIIDE 2021 - what McRave learned

I’m taking the bots in finishing order; McRave is next. Last year I analyzed McRave’s three-part strategy representation and learning algorithm. These apparently have not changed in outline, though details may have changed. The set of available strategies has been updated. For example, 6HatchHydra is new this year. It follows that the set of enabled strategy triples has also changed.

McRave is much stronger this year. It has become noted for dangerous mutalisk control.


#1 stardust

openinggameswinsfirstlast
HatchPool,12Hatch,2HatchMuta816%0156
PoolHatch,9Pool,2HatchMuta2214%13155
PoolHatch,9Pool,3HatchMuta110%4147
PoolHatch,9Pool,6HatchHydra90%9143
PoolHatch,Overpool,2HatchMuta90%6145
PoolHatch,Overpool,3HatchMuta138%11125
PoolHatch,Overpool,6HatchHydra120%1149
7 openings1576%
enemygameswins
1GateCore,2Zealot,4Gate1056%
2Gate,10/12,4Gate1010%
2Gate,10/17,4Gate405%
2Gate,9/9,4Gate10%
2Gate,Unknown,4Gate10%
5 openings1576%


9 pool into 2 hatch muta worked best, with 3 wins out of 22. That is not intuitive. The more natural 12 hatch into 2 hatch muta was tried more but was less successful. Did Stardust react inefficiently to the 9 pool? McRave appears to correctly understand that Stardust ends up with 4 gates despite taking different routes to get there. That’s kind of impressive.

Last year McRave scored 3 out of 150 against Stardust. This year it scored 8 out of 150 against a stronger Stardust—which seems to have updates specifically to defeat McRave, since McRave was the only bot to upset it in CoG 2021. Good progress!


#2 bananabrain

openinggameswinsfirstlast
HatchPool,12Hatch,2HatchMuta8619%0156
HatchPool,12Hatch,2HatchSpeedling10%2626
HatchPool,9Pool,2HatchSpeedling2100%30100
PoolHatch,9Pool,2HatchMuta1520%18144
PoolHatch,9Pool,2HatchSpeedling30%2429
PoolHatch,9Pool,3HatchMuta1921%4124
PoolHatch,9Pool,6HatchHydra20%12129
PoolHatch,Overpool,2HatchMuta40%996
PoolHatch,Overpool,2HatchSpeedling10%2525
PoolHatch,Overpool,3HatchMuta1421%16114
PoolHatch,Overpool,6HatchHydra100%1146
11 openings15718%
enemygameswins
1GateCore,2Zealot,Corsair3113%
1GateCore,2Zealot,DT812%
1GateCore,Unknown,Corsair1010%
1GateCore,Unknown,DT60%
2Gate,10/12,4Gate10%
2Gate,10/12,Corsair3116%
2Gate,10/12,DT1127%
2Gate,10/12,ZealotRush70%
2Gate,10/17,4Gate367%
2Gate,10/17,Corsair30%
2Gate,10/17,DT250%
2Gate,9/9,Corsair333%
2Gate,9/9,DT20%
2Gate,9/9,Unknown10%
2Gate,Proxy,ZealotRush729%
2Gate,Unknown,Corsair20%
FFE,Forge,5GateGoon922%
FFE,Forge,Speedlot729%
FFE,Forge,Unknown520%
FFE,Gateway,5GateGoon1100%
FFE,Gateway,Unknown10%
FFE,Nexus,5GateGoon425%
FFE,Nexus,Speedlot10%
FFE,Nexus,Unknown1100%
24 openings15718%


McRave’s wins over BananaBrain are dominated by games where BananaBrain timed out. In game 2754, BananaBrained timed out with 320 frames over 55ms, when McRave had 318 frames over 55ms—close call! McRave had more timeouts than any other bot, but only 3 losses to BananaBrain by timeout. BananaBrain’s timeouts seem to be concentrated on Dragon and McRave, and to a lesser extent on Steamhammer.

If HatchPool,9Pool,2HatchSpeedling was tried twice and won twice, why wasn’t it tried more often? The first try was on game 30 of 0-156. I imagine that it was a reactive build, not enabled as an initial choice but switched to under given circumstances. I didn’t read the source to verify that.

The enemy table shows a complex set of strategies by BananaBrain.


#3 dragon

openinggameswinsfirstlast
HatchPool,12Hatch,2HatchMuta6632%0156
HatchPool,12Hatch,2HatchSpeedling10%6161
PoolHatch,12Pool,2HatchMuta911%27150
PoolHatch,12Pool,3HatchMuta3741%1129
PoolHatch,Overpool,2HatchMuta2733%3127
PoolHatch,Overpool,2HatchSpeedling2100%2199
PoolHatch,Overpool,3HatchMuta1527%25148
7 openings15733%
enemygameswins
2Rax,Expand,Unknown1100%
2Rax,Main,1FactTanks10%
2Rax,Main,Unknown825%
2Rax,Proxy,Unknown10%
RaxCC,1RaxFE,1FactTanks333%
RaxCC,1RaxFE,5FactGoliath2512%
RaxCC,1RaxFE,Unknown1127%
RaxFact,Unknown,2PortWraith1100%
RaxFact,Unknown,5FactGoliath1323%
RaxFact,Unknown,Unknown250%
Unknown,Unknown,Unknown8939%
Unknown,Unknown,WorkerRush2100%
12 openings15733%


Over half of McRave’s losses to Dragon were by timeout. I think Dragon is an especially easy bot to time out against, because its strong macro and big battles with light units put heavy demands on the opponent.

The enemy table shows 89 games with Unknown,Unknown,Unknown. Apparently Dragon often denied scouting. Presumably the scouting overlord was afraid to approach due to marines, and any scouting drone was turned away. Also, I wonder about 2Rax,Proxy,Unknown. Did Dragon really proxy once, or was it a misrecognition? On Python, bases can be close by air. If McRave measures proxy distance by air distance, it might take a barracks in the enemy main for a proxy.


#4 steamhammer

openinggameswinsfirstlast
PoolHatch,12Pool,2HatchMuta2133%3142
PoolHatch,12Pool,2HatchSpeedling1217%1136
PoolLair,9Pool,1HatchMuta12551%0157
3 openings15846%
enemygameswins
HatchPool,10Hatch,1HatchMuta2100%
HatchPool,10Hatch,2HatchSpeedling1681%
HatchPool,10Hatch,3HatchMuta10%
HatchPool,10Hatch,Unknown850%
HatchPool,9Pool,3HatchMuta10%
HatchPool,9Pool,Unknown667%
HatchPool,Unknown,Unknown1100%
PoolHatch,12Pool,3HatchMuta1100%
PoolHatch,12Pool,Unknown250%
PoolHatch,4Pool,LingRush888%
PoolHatch,9Pool,2HatchSpeedling1100%
PoolHatch,9Pool,Unknown838%
PoolHatch,Unknown,2HatchHydra1100%
PoolHatch,Unknown,3HatchMuta2100%
PoolHatch,Unknown,Unknown475%
PoolLair,9Pool,1HatchMuta2100%
PoolLair,Unknown,1HatchMuta425%
Unknown,Unknown,1HatchHydra1100%
Unknown,Unknown,1HatchLurker2100%
Unknown,Unknown,1HatchMuta5127%
Unknown,Unknown,3HatchMuta20%
Unknown,Unknown,Unknown3429%
22 openings15846%


McRave chose from the same fixed set of 3 strategies against all the zergs. Only the 1 hatch mutalisks were able to hold their own with Steamhammer.


#6 willyt

openinggameswinsfirstlast
HatchPool,12Hatch,2HatchMuta8933%0156
PoolHatch,12Pool,3HatchMuta5535%1155
PoolHatch,Overpool,2HatchMuta130%2151
3 openings15731%
enemygameswins
RaxCC,1RaxFE,1FactTanks200%
RaxCC,1RaxFE,5FactGoliath3826%
RaxCC,1RaxFE,Unknown3033%
RaxFact,Unknown,5FactGoliath20%
Unknown,Unknown,Unknown6742%
5 openings15731%


Hurrying the mutas too much did not help against WillyT. The enemy table shows that WillyT sometimes countered with goliaths. Does McRave later make a hydra switch to fight the goliaths? WillyT sometimes goes for goliaths with 2 tanks, and it’s sensible to fight back with hydralisks. I didn’t see a hydra switch in the games I watched.

I noticed that McRave doesn’t clear the terran scout from its main until mutas come out. WillyT gets to know the exact timing for its turrets with no need to spend a scan.


#7 microwave

openinggameswinsfirstlast
PoolHatch,12Pool,2HatchMuta4965%3156
PoolHatch,12Pool,2HatchSpeedling1533%1147
PoolLair,9Pool,1HatchMuta9362%0149
3 openings15761%
enemygameswins
HatchPool,10Hatch,+1Ling10%
HatchPool,10Hatch,1HatchMuta10%
HatchPool,10Hatch,2HatchHydra1100%
HatchPool,10Hatch,2HatchSpeedling4146%
HatchPool,10Hatch,3HatchMuta1182%
HatchPool,10Hatch,Unknown1867%
HatchPool,9Pool,+1Ling10%
HatchPool,9Pool,2HatchSpeedling2100%
HatchPool,9Pool,3HatchMuta250%
HatchPool,9Pool,Unknown2100%
HatchPool,Unknown,2HatchSpeedling250%
PoolHatch,12Pool,+1Ling1100%
PoolHatch,12Pool,1HatchHydra1100%
PoolHatch,12Pool,2HatchSpeedling1100%
PoolHatch,12Pool,3HatchHydra1100%
PoolHatch,12Pool,3HatchMuta922%
PoolHatch,12Pool,Unknown580%
PoolHatch,4Pool,LingRush1479%
PoolHatch,9Pool,+1Ling10%
PoolHatch,9Pool,1HatchMuta10%
PoolHatch,9Pool,2HatchSpeedling1100%
PoolHatch,9Pool,3HatchMuta367%
PoolHatch,9Pool,Unknown250%
PoolHatch,Unknown,2HatchHydra1100%
PoolHatch,Unknown,Unknown3100%
Unknown,9Pool,+1Ling250%
Unknown,9Pool,1HatchHydra1100%
Unknown,Unknown,+1Ling30%
Unknown,Unknown,1HatchLurker1100%
Unknown,Unknown,1HatchMuta1100%
Unknown,Unknown,3HatchHydra250%
Unknown,Unknown,3HatchMuta1060%
Unknown,Unknown,Unknown1173%
33 openings15761%



#8 daqin

openinggameswinsfirstlast
HatchPool,12Hatch,2HatchMuta12383%0156
PoolHatch,9Pool,2HatchMuta333%12138
PoolHatch,9Pool,3HatchMuta250%1120
PoolHatch,9Pool,6HatchHydra20%5898
PoolHatch,Overpool,2HatchMuta2378%83155
PoolHatch,Overpool,3HatchMuta30%37105
PoolHatch,Overpool,6HatchHydra10%11
7 openings15778%
enemygameswins
FFE,Forge,5GateGoon2796%
FFE,Forge,Speedlot8874%
FFE,Forge,Unknown2100%
FFE,Forge,ZealotArchon7100%
FFE,Gateway,5GateGoon250%
FFE,Gateway,Speedlot2374%
FFE,Nexus,5GateGoon2100%
FFE,Nexus,Speedlot633%
8 openings15778%


The mutalisks did in DaQin. DaQin’s slow start puts 12 hatch ahead of other choices; DaQin makes cannons before nexus regardless of what the opponent does. DaQin defends its natural entrance with cannons, but not its nexus, so the mutalisks have a free hand and DaQin finds itself short of probes.


#9 freshmeat

openinggameswinsfirstlast
PoolHatch,12Pool,2HatchMuta4065%3152
PoolHatch,12Pool,2HatchSpeedling1947%1135
PoolLair,9Pool,1HatchMuta9869%0156
3 openings15766%
enemygameswins
HatchPool,10Hatch,2HatchSpeedling2662%
HatchPool,10Hatch,3HatchMuta1338%
HatchPool,10Hatch,Unknown1060%
HatchPool,9Pool,2HatchSpeedling729%
HatchPool,9Pool,Unknown250%
HatchPool,Unknown,3HatchMuta1100%
HatchPool,Unknown,Unknown1100%
PoolHatch,4Pool,LingRush2479%
PoolHatch,9Pool,2HatchSpeedling450%
PoolHatch,9Pool,Unknown2100%
PoolHatch,Unknown,2HatchSpeedling475%
PoolHatch,Unknown,3HatchMuta1100%
PoolLair,Unknown,Unknown1100%
Unknown,9Pool,Unknown4100%
Unknown,Unknown,+1Ling2100%
Unknown,Unknown,1HatchHydra2100%
Unknown,Unknown,1HatchMuta2100%
Unknown,Unknown,3HatchMuta1164%
Unknown,Unknown,3HatchSpeedling10%
Unknown,Unknown,Unknown3967%
20 openings15766%



#10 ualbertabot

openinggameswinsfirstlast
PoolHatch,12Pool,2HatchMuta10%9898
PoolHatch,Overpool,2HatchMuta8542%0156
PoolHatch,Overpool,2HatchSpeedling7131%4154
3 openings15737%
enemygameswins
1GateCore,0Zealot,4Gate2100%
1GateCore,0Zealot,DT1100%
2Gate,10/12,ZealotRush1090%
2Gate,9/9,Unknown20%
2Gate,9/9,ZealotRush3642%
2Rax,Main,MarineRush250%
2Rax,Main,Unknown633%
PoolHatch,4Pool,LingRush5240%
RaxCC,8Rax,Unknown100%
RaxFact,Unknown,2Fact1100%
RaxFact,Unknown,Unknown10%
Unknown,Unknown,Unknown1164%
12 openings15737%


McRave met UAlbertaBot with the same strategies as last year (except for one stray PoolHatch,12Pool,2HatchMuta this year). The same strategies by name, that is. The actual play was different and performed far worse against UAlbertaBot’s pressure builds. I looked at some games. When McRave respected its enemy and defended itself, it generally won. Sometimes it seemed to arrogantly conclude “Pff, you’re not worth spending a sunken on” and got overrun. As far as I could tell from watching games, it wasn’t a scouting miss—though it’s easy to overlook things in watching games. It had the feel of a bug.

AIIDE 2021 - what Steamhammer learned

The submitted Steamhammer was mistakenly configured to retain 100 game records per opponent. I had thought it was set for 200, and didn’t double-check. So of the 157 games against each opponent, of which 150 counted in the tournament, I have records for only the final 100. That’s 93 tournament games plus the 7 extra at the end.

My prepared data was successful. For all opponents which I prepared for, the prepared openings were among the highest scoring (including the zero score versus Stardust). It’s notable that Steamhammer’s gas steal was not successful against any opponent, perhaps another sign of an elite tournament. It was either infeasible or abandoned as a failure against every opponent except DaQin, and did no good then.

Steamhammer’s game records are rich with data. To show a little bit more of it, I added a new feature in the opening table. There are new “wins” and “losses” columns showing the median time that winning and losing games with that opening lasted. The median is a better measure than the mean, because we can expect the distribution of game times to be right-tailed: Games are limited to between zero minutes and one hour, but we expect a hump nearer to zero and a long tail of slower games. That inflates the mean and makes it misleading. For the tournament, I turned off surrendering, so Steamhammer played its losses out to the end.


#1 stardust

openinggameswinswinslossesfirstlast
10Hatch10%-8:484848
10HatchHydra10%-8:414545
11HatchTurtleHydra30%-10:331456
11HatchTurtleMuta30%-10:401067
11Pool10%-8:487474
12Gas11PoolMuta10%-6:536060
12Hatch_4HatchLing10%-14:082525
2HatchLurkerAllIn10%-9:126565
2x10Hatch10%-8:309595
2x10HatchBurrow10%-9:215555
3HatchHydraExpo40%-8:032386
3HatchLateHydras10%-7:4399
3HatchLing10%-7:545151
3HatchLingBurrow10%-8:317171
3HatchLingExpo20%-8:43637
4HatchBeforeLair10%-7:394747
4PoolSoft10%-8:266868
6Pool20%-9:127592
6PoolHide10%-8:351717
6PoolSpeed60%-8:27385
7DroneGas10%-7:518080
7Pool10Hatch10%-8:168383
7Pool12Hatch10%-8:365050
7Pool6GasLurker B10%-9:384444
7PoolHard10%-14:074141
7PoolHarder10%-8:237676
7PoolMid10%-8:038989
7PoolSoft10%-13:094242
8Hatch7PoolBurrow10%-9:476464
8Hatch7PoolBurrowB10%-8:2355
8Scout10%-8:148787
9HatchExpo9Pool9Gas20%-8:291694
9Pool8Hatch10%-8:179898
9Pool9Hatch10%-10:297070
9PoolBurrow10%-9:348484
9PoolBurrowB10%-8:0744
9PoolHatchSpeed7Drone20%-7:583173
9PoolHatchSpeed7DroneB20%-8:01024
9PoolHatchSpeedAllInB10%-8:412222
9PoolLair10%-7:369999
9PoolLurker10%-9:412727
9PoolSpeed20%-9:03826
9PoolSpire10%-9:033232
9PoolSunkSpeed10%-7:417979
AntiFact_13Pool10%-8:175454
AntiFact_2Hatch30%-7:396993
AntiFactoryHydra10%-7:086363
AntiZeal_12Hatch30%-10:203377
HiveRush10%-6:503030
Over10Hatch20%-10:071534
Over10Hatch1Sunk10%-8:359696
Over10Hatch2Sunk30%-10:33188
Over10Hatch2SunkHard10%-9:154646
Over10HatchBust20%-8:211849
Over10HatchSlowLings20%-8:236178
OverhatchExpoLing10%-8:301313
OverhatchLing10%-10:255858
Overpool14Hatch10%-7:3977
Overpool2HatchLurker20%-9:064382
OverpoolLurker10%-8:487272
OverpoolTurtle 010%-8:3222
Overpool_3HatchLing10%-10:292020
PurpleSwarmBuild10%-8:086666
ZvP_2HatchMuta20%-7:553897
ZvP_Overpool3Hatch10%-8:162929
ZvT_13Pool20%-9:185791
ZvT_7Pool10%-8:308181
ZvZ_12Pool10%-7:015353
ZvZ_Overpool11Gas10%-7:503535
ZvZ_Overpool9Gas10%-7:471919
70 openings1000% - 8:30
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Heavy rush100100%0%4040%0%40%58%
Naked expand--22%0%0%0%
Unknown--5858%0%0%0%
timing#medianearlylate
my combat unit1002:541:474:11
my gas993:171:347:33
enemy scout1001:571:187:53
enemy combat unit1002:412:214:37
enemy gas1004:203:376:37
enemy air unit99:428:3011:09
enemy cloaked unit89:439:1411:09
game duration1008:306:5018:12
gas steal#medianearlylatewinsenemy gas
gas steal decision102:121:582:210%4:22
gas steal success62:152:032:310%4:32
none or failed94---0%4:17
gas steal killed62:472:422:58


Steamhammer lost every game, but there is still valuable info here. If you’re losing all games, the game duration is a plausible proxy for how much trouble you caused the opponent. Especially so if you tried a rush opening and ended up in a long game—either the rush did some damage, or the opponent overreacted and was slowed down. Here, a couple of 7 pool builds were among the longest games. Steamhammer probably should have repeated them.

Notice the 4 pool and the hive rush. Steamhammer tried the whole range. Steamhammer recognized Stardust’s build in 2 games as nexus without cannons, a reaction that Stardust did not have last year. Otherwise, results are similar to last year’s.


#2 bananabrain

openinggameswinswinslossesfirstlast
11Gas10PoolMuta10%-6:043333
11Gas10PoolMutaB10%-6:215656
11HatchTurtleLurker1553%15:329:437198
11Pool10%-14:481010
12-11HatchStem10%-16:347878
2x10HatchSlow70%-8:30495
3HatchHydra10%-12:204242
3HatchLingBurrow10%-14:001919
4PoolSoft10%-7:557474
6Scout10%-8:486666
9Hatch8Pool10%-6:126969
9PoolBurrow812%16:2912:534382
9PoolHatchSpeed7DroneB10%-10:2611
9PoolHatchSpeedAllIn520%9:496:515868
9PoolHatchSpeedSpire80%-7:21399
9PoolHatchSpeedSpire210%-7:021515
9PoolSpeed10%-11:011414
9PoolSpeedAllIn10%-13:021616
9PoolSunkHatch10%-11:502828
AntiFact_Overpool11Hatch10%-13:189393
AntiZeal_12Hatch10%-7:482626
Over10Hatch1Sunk10%-15:104747
Over10Hatch2Sunk10%-14:382727
Over10Hatch2SunkHard10%-16:033636
Over10HatchHydra10%-10:353838
Overgas+110%-13:188585
OverhatchExpoLing1118%7:3414:512483
OverpoolLurker10%-6:156161
OverpoolTurtle617%15:0115:591796
ZvP_3HatchPoolHydra157%18:188:27270
ZvT_3HatchMuta10%-15:2700
ZvZ_12HatchMain10%-15:2366
ZvZ_12Pool10%-6:393131
33 openings10014% 15:24 10:42
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush22%0%1111%0%0%50%
Heavy rush9797%14%6363%13%63%22%
Safe expand11%0%33%67%0%0%
Turtle--11%0%0%0%
Unknown--2222%18%0%0%
timing#medianearlylate
my combat unit1003:031:474:38
my gas932:571:337:14
enemy scout1002:101:155:03
enemy combat unit1002:402:185:47
enemy gas946:053:169:12
enemy air unit916:073:1711:33
enemy cloaked unit579:266:0614:59
game duration10011:456:0421:43
gas steal#medianearlylatewinsenemy gas
gas steal decision102:301:513:3310%5:42
gas steal success32:101:552:110%4:22
none or failed97---14%6:07
gas steal killed32:502:482:51


In the 150 tournament games, Steamhammer scored 25 wins versus BananaBrain. Of those, 15 were due to BananaBrain suffering a frame timeout. Ouch. The game scores say that BananaBrain was ahead in 11 of the 15 games when it timed out. So the win percentages and times need to be interpreted carefully. The wins overall were longer games than the losses, possibly because BananaBrain was more likely to time out in a longer game with a larger game state to model and more units to control.

11HatchTurtleLurker scored over 50% in 15 games! Is it particularly good at prompting BananaBrain to time out? If I’d known about it ahead of time, I could have added it to my preparation and perhaps scored higher.

The build 2x10HatchSlow is shown as tried 7 times with no wins. I know from watching games that the opening scored wins earlier in the tournament, before the final 100 games; that is why it was tried so often later on. The build is very similar to Broken Horn’s 10 hatch-9 hatch-pool, but (I think) slightly more efficient. Apparently BananaBrain learned to avoid lines that lose to the mass of slow zerglings.

Successfully stealing its gas caused BananaBrain to take its gas sooner. I haven’t seen that before. In any case, it was only 3 games; Steamhammer found the gas steal unprofitable.


#3 dragon

openinggameswinswinslossesfirstlast
2HatchLurkerAllIn10%-30:514141
3HatchHydra10%-10:163333
5HatchPool2471%13:2328:23694
7-7HydraLingRush10%-16:574545
9PoolFastLurker933%9:1627:47192
9PoolHatchSpeed425%3:3116:321758
9PoolSunkSpeed20%-26:541438
AntiFact_13Pool1765%18:0516:345096
AntiZeal_12Hatch10%-38:541212
ZvP_4HatchPoolHydra862%5:5715:586599
ZvT_3HatchMutaExpo3278%15:5024:55098
11 openings10062% 15:36 25:13
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory4141%56%1717%47%24%41%
Naked expand--44%50%0%0%
Safe expand2323%74%1515%80%9%48%
Turtle--11%0%0%0%
Unknown--3131%68%0%0%
Worker rush3636%61%3232%59%75%8%
timing#medianearlylate
my combat unit983:122:137:53
my gas803:491:3412:10
enemy scout982:110:5312:07
enemy combat unit822:482:218:38
enemy gas816:042:4410:40
enemy air unit749:394:3117:18
enemy cloaked unit6210:515:5019:39
game duration10016:283:3160:00
gas steal#medianearlylatewinsenemy gas
gas steal decision172:091:562:5853%6:31
gas steal success92:162:072:3044%7:04
none or failed91---64%6:03
gas steal killed94:053:085:05


The most successful openings were 5HatchPool (5 hatcheries before pool, a supremely greedy build to exploit bots that never attack early) and ZvT_3HatchMutaExpo, the two openings I selected as preparation. For bots carried over from the previous year, good preparation is easier.

Dragon has a chaotic play style. Steamhammer’s wildest game of the tournament may be Steamhammer-Dragon on Longinus (replay file). Dragon played a V strategy: Vultures, valkyries, and vessels.


#5 mcrave

openinggameswinswinslossesfirstlast
11Gas10PoolMuta10%-10:078989
12Gas11PoolLurker10%-9:054040
2HatchHydra10%-6:324545
2HatchMutaPure10%-4:026161
4PoolHard30%-8:521443
9Pool8GasLurker10%-11:258888
9PoolHatchSpeedAllIn1662%6:0310:25096
9PoolLair10%-4:586868
Over10Hatch11Pool1844%10:457:54281
OverhatchLateGas10%-16:085353
ZvZ_12HatchExpo10%-8:182323
ZvZ_12HatchMain1030%11:058:26790
ZvZ_OverpoolTurtle4578%9:2711:10499
13 openings10056% 9:19 9:46
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Heavy rush2323%48%55%60%4%74%
Turtle7777%58%1111%0%8%87%
Unknown--8484%63%0%0%
timing#medianearlylate
my combat unit992:261:493:19
my gas942:091:435:02
enemy scout992:570:415:25
enemy combat unit1002:321:494:26
enemy gas983:472:526:12
enemy air unit945:054:017:07
enemy cloaked unit0---
game duration1009:274:0224:09
gas steal#medianearlylatewinsenemy gas
gas steal decision72:131:582:5557%2:58
gas steal success0-----
none or failed100---56%3:47
gas steal killed0---


Again two of my prepared builds, 9PoolHatchSpeedAllIn and ZvZ_OverpoolTurtle, were the top choices. Both are tough for most zerg bots to handle. My other prepared build, ZvZ_Overgas9Pool, does not appear in these 100 games. Apparently it flopped and was abandoned early. Rushy builds ended up winning faster than they lost, and more macro builds were the reverse, as you might expect. The timing table shows that McRave went spire nearly every game (overlords do not count as “air units” there), and not slowly. That’s normal for ZvZ, of course, but it shows that McRave did not favor builds to overrun the opponent with zerglings.


#6 willyt

openinggameswinswinslossesfirstlast
12Hatch_4HatchLing10%-14:087373
2.5HatchMutaExpo450%19:4214:047694
9HatchExpo9Pool9Gas10%-17:395656
9PoolHatchSpeedAllIn1338%4:538:51097
9PoolHatchSpeedSpire210%-9:337070
9PoolLair10%-16:433030
9PoolLurker1580%12:1520:15398
9PoolSpeed1346%6:2612:49190
9PoolSpeedAllIn1267%5:509:321299
ZvT_13Pool2564%19:3520:09481
ZvT_2HatchMuta10%-22:102929
ZvT_3HatchMuta1354%17:3518:492278
12 openings10056% 13:56 14:57
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory11%100%11%100%0%0%
Fast rush88%38%33%67%0%75%
Heavy rush55%80%22%0%0%60%
Naked expand4747%57%1616%100%17%64%
Safe expand3939%54%1313%46%10%67%
Unknown--6565%48%0%0%
timing#medianearlylate
my combat unit1002:182:135:58
my gas1002:141:456:22
enemy scout1002:141:427:17
enemy combat unit1002:582:066:14
enemy gas855:163:167:59
enemy air unit4414:598:3923:14
enemy cloaked unit3115:227:1920:23
game duration10014:304:4160:00
gas steal#medianearlylatewinsenemy gas
gas steal decision102:061:563:0910%5:34
gas steal success82:142:063:150%5:42
none or failed92---61%5:15
gas steal killed83:593:034:20


WillyT has become much stronger over the past year. It is better at handling Steamhammer’s lurker builds—except for the especially early 9 pool lurker build, which apparently catches it unready. Steamhammer’s improvements in lurker play were important to keep up with progress. I think Steamhammer’s diverse mix of openings was essential to counter WillyT, which has its own diverse mix and will figure out how to counter anything that is too predictable.

Steamhammer’s closest game of the tournament was Steamhammer-WillyT on Empire of the Sun (replay file). Steamhammer decisively stopped WillyT from taking the nearby north island base, but allowed it to hold the distant south island despite scouting it the instant it started. Notice WillyT’s interesting but somewhat uncoordinated dropship play throughout the game.


#7 microwave

openinggameswinswinslossesfirstlast
5HatchPool10%-5:231818
8Hatch7Pool580%10:159:322059
973HydraBust540%13:285:165491
9HatchMain9Pool9Gas10%-4:325656
9PoolHatchBurrow10%-5:264646
9PoolHatchSpeedAllIn2080%6:4812:00099
9PoolHatchSpeedSpire2483%11:056:06493
9PoolSpeedSpire10%-11:098181
ZvZ_12HatchMain2085%11:2017:506596
ZvZ_12PoolMain1173%9:355:06897
ZvZ_Overpool9Gas1164%13:2717:08242
11 openings10074% 11:14 8:31
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush1717%71%1414%93%6%59%
Heavy rush4949%71%2525%76%27%31%
Naked expand2626%81%1616%62%12%35%
Turtle88%75%99%89%12%25%
Unknown--3636%67%0%0%
timing#medianearlylate
my combat unit982:252:133:15
my gas972:311:477:09
enemy scout982:301:224:43
enemy combat unit1002:321:053:31
enemy gas664:352:2517:32
enemy air unit527:513:4317:33
enemy cloaked unit0---
game duration10010:574:2725:22
gas steal#medianearlylatewinsenemy gas
gas steal decision82:111:532:4175%4:33
gas steal success22:292:142:43100%4:34
none or failed98---73%4:35
gas steal killed22:402:212:58


Microwave had too many weaknesses. Of the 4 openings with 80% plus win rates, 3 were from preparation and one was Steamhammer’s discovery during the tournament. It’s interesting that the 12 hatch build ZvZ_12HatchMain was faster to win than to lose. I think that means it won with zerglings from its extra larvas.

The plan table shows that Microwave followed its own broad range of plans. In the timing table, see the wide and matching variation in Microwave’s gas timing and air unit timing. Did Microwave never get zergling speed in long games?


#8 daqin

openinggameswinswinslossesfirstlast
11Gas10PoolMuta10%-11:292424
2HatchLingAllInSpire812%9:3712:165292
2HatchLurkerPure10%-15:314545
2x10HatchSlow10%-9:525555
3HatchHydra20%-17:147293
3HatchHydraBust520%18:0712:092291
3HatchHydraExpo10%-11:0466
3HatchLing1233%7:0611:29373
3HatchLingExpo1217%34:0211:353697
4HatchBeforeGas20%-12:31221
4HatchBeforeLair20%-11:476799
5HatchBeforeGas10%-11:116868
5PoolHard2Player10%-9:4144
9HatchExpo9Pool9Gas1030%8:1212:257595
9Pool9Hatch10%-12:243232
AntiZeal_12Hatch10%-11:404141
Over10Hatch11Pool10%-14:043131
Over10Hatch2Sunk10%-15:217070
Over10PoolHydra10%-9:437474
OverhatchExpoLing3040%6:3410:26098
OverhatchLateGas10%-12:309696
OverhatchMuta10%-14:162929
ZvP_3BaseSpire+Den20%-14:06525
ZvP_3HatchPoolHydra20%-13:175078
24 openings10023% 7:02 11:40
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Heavy rush44%50%1010%0%25%0%
Naked expand33%0%1111%100%0%0%
Safe expand5858%24%4141%10%40%3%
Turtle3535%20%3434%24%40%6%
Unknown--44%0%0%0%
timing#medianearlylate
my combat unit1003:071:533:54
my gas1002:471:476:26
enemy scout1001:311:109:29
enemy combat unit1004:334:066:41
enemy gas945:285:066:52
enemy air unit1216:509:1020:14
enemy cloaked unit2412:396:3517:59
game duration10011:185:4260:00
gas steal#medianearlylatewinsenemy gas
gas steal decision302:081:552:3623%5:35
gas steal success242:172:062:2525%5:36
none or failed76---22%5:23
gas steal killed242:472:353:06


After this upset, I think I’ll take DaQin as a test opponent and finally figure out the skills to defeat it. DaQin is a Locutus fork, so beating it probably means doing better against other protoss bots.

The timing table shows that DaQin was remarkably late with air units. That includes both corsairs and observers—DaQin was late with both of them. In fact, I don’t remember whether it makes corsairs at all. Mutalisks might be a good choice to win.


#9 freshmeat

openinggameswinswinslossesfirstlast
11Gas10PoolMuta1267%7:065:50294
8PoolHard633%8:209:091445
9Hatch8Pool10%-6:489292
9PoolHatchSpeedAllInB3784%5:565:55599
9PoolSunkHatch862%5:069:46474
9PoolSunkSpeed825%8:017:04052
Overpool14Hatch10%-6:198686
OverpoolSunk1771%9:189:45397
ZvT_13Pool333%7:335:439093
ZvZ_12PoolMain743%7:075:351187
10 openings10064% 6:21 6:53
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Fast rush1313%38%1414%71%31%31%
Heavy rush5757%65%3030%67%25%32%
Naked expand--22%100%0%0%
Turtle3030%73%2525%52%10%20%
Unknown--2828%64%0%0%
Worker rush--11%100%0%0%
timing#medianearlylate
my combat unit1002:172:093:27
my gas982:531:467:53
enemy scout792:311:267:29
enemy combat unit1002:341:055:17
enemy gas394:012:559:29
enemy air unit294:434:015:51
enemy cloaked unit0---
game duration1006:304:1716:24
gas steal#medianearlylatewinsenemy gas
gas steal decision112:151:552:5745%3:31
gas steal success62:182:013:0133%-
none or failed94---66%4:01
gas steal killed63:042:314:06


When I was preparing opponent-specific data, Steamhammer had an overwhelming score against FreshMeat on BASIL. This result is good but not overwhelming; FreshMeat improved a lot in a short time. I had recognized that FreshMeat had made great strides, but there was not enough recent data to show what was working in the most recent games. So I made no preparation at all. These tables show an example of how Steamhammer figures out an opponent from scratch. I think it did OK.


#10 ualbertabot

openinggameswinswinslossesfirstlast
Over10HatchSlowLings10%-8:169999
OverhatchExpoMuta1759%5:216:262195
OverpoolTurtle8294%6:1711:51098
3 openings10087% 6:00 8:16
planpredictedrecognizedaccuracy
countgameswinscountgameswinsgood?
Factory1010%100%1313%100%10%0%
Fast rush3333%82%2727%85%36%18%
Heavy rush4949%90%3131%81%31%20%
Naked expand88%75%1212%100%0%12%
Unknown--1717%82%0%0%
timing#medianearlylate
my combat unit1002:262:153:13
my gas992:582:396:33
enemy scout882:081:219:58
enemy combat unit892:331:474:30
enemy gas823:442:3714:24
enemy air unit1414:2011:5015:59
enemy cloaked unit1014:212:3716:46
game duration1006:314:3521:33
gas steal#medianearlylatewinsenemy gas
gas steal decision82:321:482:5488%7:00
gas steal success42:292:102:4475%13:15
none or failed96---88%3:37
gas steal killed43:022:513:06


Comparing this year to last year, Steamhammer actually did a little worse against UAlbertaBot. The skills I improved over the last year didn’t include skills to defeat UAlbertaBot’s pressure builds, or to adapt better to its random race.


overall

totalZvTZvPZvZZvR
openinggameswinsgameswinsgameswinsgameswinsgameswins
10Hatch10% 10%
10HatchHydra10% 10%
11Gas10PoolMuta1553% 20% 1362%
11Gas10PoolMutaB10% 10%
11HatchTurtleHydra30% 30%
11HatchTurtleLurker1553% 1553%
11HatchTurtleMuta30% 30%
11Pool20% 20%
12-11HatchStem10% 10%
12Gas11PoolLurker10% 10%
12Gas11PoolMuta10% 10%
12Hatch_4HatchLing20% 10% 10%
2.5HatchMutaExpo450% 450%
2HatchHydra10% 10%
2HatchLingAllInSpire812% 812%
2HatchLurkerAllIn20% 10% 10%
2HatchLurkerPure10% 10%
2HatchMutaPure10% 10%
2x10Hatch10% 10%
2x10HatchBurrow10% 10%
2x10HatchSlow80% 80%
3HatchHydra40% 10% 30%
3HatchHydraBust520% 520%
3HatchHydraExpo50% 50%
3HatchLateHydras10% 10%
3HatchLing1331% 1331%
3HatchLingBurrow20% 20%
3HatchLingExpo1414% 1414%
4HatchBeforeGas20% 20%
4HatchBeforeLair30% 30%
4PoolHard30% 30%
4PoolSoft20% 20%
5HatchBeforeGas10% 10%
5HatchPool2568% 2471% 10%
5PoolHard2Player10% 10%
6Pool20% 20%
6PoolHide10% 10%
6PoolSpeed60% 60%
6Scout10% 10%
7-7HydraLingRush10% 10%
7DroneGas10% 10%
7Pool10Hatch10% 10%
7Pool12Hatch10% 10%
7Pool6GasLurker B10% 10%
7PoolHard10% 10%
7PoolHarder10% 10%
7PoolMid10% 10%
7PoolSoft10% 10%
8Hatch7Pool580% 580%
8Hatch7PoolBurrow10% 10%
8Hatch7PoolBurrowB10% 10%
8PoolHard633% 633%
8Scout10% 10%
973HydraBust540% 540%
9Hatch8Pool20% 10% 10%
9HatchExpo9Pool9Gas1323% 10% 1225%
9HatchMain9Pool9Gas10% 10%
9Pool8GasLurker10% 10%
9Pool8Hatch10% 10%
9Pool9Hatch20% 20%
9PoolBurrow911% 911%
9PoolBurrowB10% 10%
9PoolFastLurker933% 933%
9PoolHatchBurrow10% 10%
9PoolHatchSpeed425% 425%
9PoolHatchSpeed7Drone20% 20%
9PoolHatchSpeed7DroneB30% 30%
9PoolHatchSpeedAllIn5459% 1338% 520% 3672%
9PoolHatchSpeedAllInB3882% 10% 3784%
9PoolHatchSpeedSpire3262% 80% 2483%
9PoolHatchSpeedSpire220% 10% 10%
9PoolLair30% 10% 10% 10%
9PoolLurker1675% 1580% 10%
9PoolSpeed1638% 1346% 30%
9PoolSpeedAllIn1362% 1267% 10%
9PoolSpeedSpire10% 10%
9PoolSpire10% 10%
9PoolSunkHatch956% 10% 862%
9PoolSunkSpeed1118% 20% 10% 825%
AntiFact_13Pool1861% 1765% 10%
AntiFact_2Hatch30% 30%
AntiFact_Overpool11Hatch10% 10%
AntiFactoryHydra10% 10%
AntiZeal_12Hatch60% 10% 50%
HiveRush10% 10%
Over10Hatch20% 20%
Over10Hatch11Pool1942% 10% 1844%
Over10Hatch1Sunk20% 20%
Over10Hatch2Sunk50% 50%
Over10Hatch2SunkHard20% 20%
Over10HatchBust20% 20%
Over10HatchHydra10% 10%
Over10HatchSlowLings30% 20% 10%
Over10PoolHydra10% 10%
Overgas+110% 10%
OverhatchExpoLing4233% 4233%
OverhatchExpoMuta1759% 1759%
OverhatchLateGas20% 10% 10%
OverhatchLing10% 10%
OverhatchMuta10% 10%
Overpool14Hatch20% 10% 10%
Overpool2HatchLurker20% 20%
OverpoolLurker20% 20%
OverpoolSunk1771% 1771%
OverpoolTurtle8889% 617% 8294%
OverpoolTurtle 010% 10%
Overpool_3HatchLing10% 10%
PurpleSwarmBuild10% 10%
ZvP_2HatchMuta20% 20%
ZvP_3BaseSpire+Den20% 20%
ZvP_3HatchPoolHydra176% 176%
ZvP_4HatchPoolHydra862% 862%
ZvP_Overpool3Hatch10% 10%
ZvT_13Pool3057% 2564% 20% 333%
ZvT_2HatchMuta10% 10%
ZvT_3HatchMuta1450% 1354% 10%
ZvT_3HatchMutaExpo3278% 3278%
ZvT_7Pool10% 10%
ZvZ_12HatchExpo10% 10%
ZvZ_12HatchMain3165% 10% 3067%
ZvZ_12Pool20% 20%
ZvZ_12PoolMain1861% 1861%
ZvZ_Overpool11Gas10% 10%
ZvZ_Overpool9Gas1258% 10% 1164%
ZvZ_OverpoolTurtle4578% 4578%
total90048%20059%30012%30065%10087%
openings played12523101303

AIIDE 2021 - BananaBrain versus Dragon

BananaBrain and Dragon both recorded their own opening builds for all 157 games played, so I can align their learning files and see how their strategies matched up against each other. BananaBrain also recorded its representation of what the opponent played, so I can compare its idea of Dragon’s build with Dragon’s own idea. I first did this last year. Dragon is carried over from last year unchanged, while BananaBrain is much stronger now.

The win rates and coloring are from the point of view of BananaBrain. Blue is good for BananaBrain and red is good for Dragon.

bananabrain strategies versus dragon strategies

overall1rax fe2rax bio2rax mechbiodirty worker rushmass vulturesiege expand
overall117/157 75%8/8 100%19/30 63%8/8 100%12/13 92%8/8 100%27/36 75%35/54 65%
PvT_10/12gate34/48 71%1/1 100%9/17 53%1/1 100%2/2 100%2/2 100%3/5 60%16/20 80%
PvT_1gatedtexpo0/1 0%-0/1 0%-----
PvT_28nexus3/6 50%-1/2 50%---1/1 100%1/3 33%
PvT_2gaterngexpo2/4 50%-0/1 0%---1/1 100%1/2 50%
PvT_32nexus0/1 0%------0/1 0%
PvT_9/9gate78/96 81%7/7 100%9/9 100%7/7 100%10/11 91%6/6 100%22/29 76%17/27 63%
PvT_9/9proxygate0/1 0%------0/1 0%

dragon as seen by bananabrain

dragon played#bananabrain recognized
1rax fe87 T_unknown | 1 T_fastexpand
2rax bio3030 T_unknown
2rax mech88 T_unknown
bio1313 T_unknown
dirty worker rush88 T_unknown
mass vulture3621 T_1fac | 14 T_unknown | 1 T_2fac
siege expand5438 T_1fac | 16 T_unknown

Last year this table showed that BananaBrain was weak at recognizing Dragon’s builds, with a lot of unknowns. There are more recognized builds this year, but BananaBrain plays differently so I’m not sure whether BananaBrain has improved at recognition. What is clear is that everything is blue. Recognizing some builds does not seem to have helped BananaBrain; it did well no matter what.

AIIDE 2021 - what Dragon learned

Dragon records for each game only its own build and win/loss, so the information is sparse. It has a total of 7 builds. Dragon is a carryover bot, and I analyzed its game records from AIIDE 2020 last year. Dragon considers that “the opening” is a very brief phase of the game: It quickly adapts to what it sees of the opponent’s play, and the opening build fades out of view. Last year I found that, against many opponents, the choice of opening build made little difference; the game was decided later.


#1 stardust

openinggameswinsfirstlast
1rax fe240%5156
2rax bio356%1153
2rax mech180%2146
bio205%3144
dirty worker rush190%0133
mass vulture200%4152
siege expand210%6150
7 openings1572%


It’s interesting that the only openings to make a dent were “2rax bio” and “bio”. Was Stardust surprised by marines? If Stardust made zealots to get units faster, that may have backfired.


#2 bananabrain

openinggameswinsfirstlast
1rax fe80%682
2rax bio3037%1156
2rax mech80%7109
bio138%8140
dirty worker rush80%5148
mass vulture3625%2151
siege expand5435%0145
7 openings15725%


Again, the marines were a relatively successful choice against protoss. It’s a surprise. #8 DaQin below is different. Yesterday we saw that BananaBrain liked zealot openings against Dragon, and it’s true that marines with good micro can hold their own against zealots. Maybe BananaBrain liked zealots because they upset Dragon’s tech builds, and Dragon found that marines answered best, so that the two settled into this equilibrium with neither bot able to 100% counter the other. It’s a nice story, at least.


#4 steamhammer

openinggameswinsfirstlast
1rax fe5345%8124
2rax bio714%0153
2rax mech1225%4121
bio1729%6135
dirty worker rush4740%2156
mass vulture1527%10117
siege expand60%5122
7 openings15736%


Switching between opposite builds like fast expand (“1rax fe”) and worker rush (“dirty worker rush”) is not a bad plan for defeating Steamhammer. I don’t think Dragon did it on purpose, though. Most openings scored about equal.


#5 mcrave

openinggameswinsfirstlast
1rax fe2080%34153
2rax bio4065%0109
2rax mech1765%2390
bio2462%64100
dirty worker rush20%2098
mass vulture633%63137
siege expand4672%11154
7 openings15566%


Again, most were about equal, with only a couple of exceptions. “1rax fe” was also best against last year’s McRave, even though it played rather differently.


#6 willyt

openinggameswinsfirstlast
2rax bio10%5353
mass vulture15498%0154
2 openings15597%


Last year Dragon chose “2rax mech” as its build to trample on WillyT (winning fewer, 94%, even though this year’s WillyT is substantially stronger). I think it found something that worked and felt no need to experiment any further.


#7 microwave

openinggameswinsfirstlast
1rax fe2467%1120
2rax bio2861%31152
2rax mech6674%0149
bio2662%46147
dirty worker rush20%8124
mass vulture540%12156
siege expand633%43153
7 openings15765%



#8 daqin

openinggameswinsfirstlast
1rax fe9856%8156
2rax bio617%14104
2rax mech1136%1105
bio1331%7136
dirty worker rush50%5153
mass vulture2050%9103
siege expand40%0132
7 openings15747%


Best was the fast expansion. (“1rax fe” is faster than “siege expand”.) That makes sense against DaQin’s style of play.


#9 freshmeat

openinggameswinsfirstlast
1rax fe1225%4128
2rax bio1233%18143
2rax mech2536%0141
bio1030%9139
dirty worker rush3435%7155
mass vulture4953%10156
siege expand1527%15142
7 openings15739%


Mostly about equal again. At some point I’ll look at the games and see how FreshMeat upset Dragon.


#10 ualbertabot

openinggameswinsfirstlast
1rax fe4092%116155
2rax bio667%5473
2rax mech250%114115
bio1377%3649
dirty worker rush1776%5074
mass vulture7684%0113
siege expand250%85110
7 openings15683%

AIIDE 2021 - what BananaBrain learned

Here’s my summary of BananaBrain’s learning files. BananaBrain records both its own strategy and the recognized enemy strategy for every game.

#1 stardust

openinggameswinsfirstlast
PvP_10/12gate50%9121
PvP_12nexus50%10119
PvP_2gatedt50%3120
PvP_2gatedtexpo1619%0125
PvP_2gatereaver50%1118
PvP_3gaterobo50%13123
PvP_3gatespeedzeal50%5116
PvP_4gategoon2425%12126
PvP_9/9gate50%6122
PvP_9/9proxygate3829%8156
PvP_nzcore1315%4149
PvP_zcore50%7117
PvP_zcorez911%11144
PvP_zzcore1724%2127
14 openings15717%
enemygameswins
P_1gatecore650%
P_2gate2619%
P_2gatefast1331%
P_4gategoon10714%
P_cannonturtle10%
P_unknown40%
6 openings15717%


The most successful: Double proxy gates. Stardust plays the same every game, except for reactions to its opponent, so it’s interesting that BananaBrain diagnosed so many different openings. I suspect that they were all, or nearly all, 4 gate goon, and BananaBrain was not always able to scout long enough to see it. I think the variety is what you get when BananaBrain sees only part of the build.


#3 dragon

openinggameswinsfirstlast
PvT_10/12gate4871%0156
PvT_1gatedtexpo10%1616
PvT_28nexus650%13119
PvT_2gaterngexpo450%1091
PvT_32nexus10%8989
PvT_9/9gate9681%2118
PvT_9/9proxygate10%9292
7 openings15775%
enemygameswins
T_1fac5966%
T_2fac1100%
T_fastexpand1100%
T_unknown9679%
4 openings15775%


The best builds were zealot builds. BananaBrain seems to be especially successful with early zealot pressure.


#4 steamhammer

openinggameswinsfirstlast
PvZ_10/12gate367%57
PvZ_1basespeedzeal2186%37157
PvZ_2basespeedzeal978%21149
PvZ_4gate2archon10%3131
PvZ_5gategoon250%2930
PvZ_9/9gate9288%61156
PvZ_9/9proxygate10%5757
PvZ_bisu580%3236
PvZ_neobisu1283%819
PvZ_sairdt367%146148
PvZ_sairgoon10%2020
PvZ_sairreaver367%5860
PvZ_stove580%04
13 openings15883%
enemygameswins
Z_10hatch3284%
Z_12hatch5775%
Z_12hatchmain1100%
Z_12pool2100%
Z_4/5pool1100%
Z_9pool2396%
Z_9poolspeed888%
Z_overpool1984%
Z_unknown1580%
9 openings15883%


Again, zealot builds. Steamhammer tried a wide variety of counters, of which 12 hatch worked best. BananaBrain records only the earliest steps of zerg openings, so what BananaBrain calls Z_12hatch could have a range of followups.


#5 mcrave

openinggameswinsfirstlast
PvZ_10/12gate5485%17119
PvZ_1basespeedzeal367%5860
PvZ_2basespeedzeal580%15
PvZ_4gate2archon10%6161
PvZ_5gategoon10%6666
PvZ_9/9gate10%66
PvZ_9/9proxygate875%24100
PvZ_bisu580%5357
PvZ_neobisu475%6265
PvZ_sairdt367%1416
PvZ_sairgoon1283%7105
PvZ_sairreaver10%00
PvZ_stove5988%31156
13 openings15782%
enemygameswins
Z_12hatch8481%
Z_12pool20%
Z_9pool2378%
Z_overpool4589%
Z_unknown3100%
5 openings15782%


Most things worked against McRave, but especially tech openings. The earliest steps of McRave’s openings are stereotyped, so BananaBrain recognized few choices.


#6 willyt

openinggameswinsfirstlast
PvT_10/12gate4493%750
PvT_12nexus683%05
PvT_2gatedt10%66
PvT_32nexus2488%5174
PvT_9/9proxygate7799%80156
PvT_dtdrop250%7879
PvT_stove367%7577
7 openings15793%
enemygameswins
T_1fac12100%
T_2rax5595%
T_fastexpand5288%
T_unknown3895%
4 openings15793%


The proxy gates won 76 times out of 77. Ouch.


#7 microwave

openinggameswinsfirstlast
PvZ_10/12gate8697%31156
PvZ_1basespeedzeal10%2323
PvZ_2basespeedzeal250%1920
PvZ_4gate2archon250%2425
PvZ_5gategoon3083%3979
PvZ_9/9gate1580%982
PvZ_9/9proxygate250%6364
PvZ_bisu250%78
PvZ_neobisu250%2122
PvZ_sairdt580%04
PvZ_sairgoon580%2630
PvZ_sairreaver250%56
PvZ_stove367%1618
13 openings15787%
enemygameswins
Z_10hatch8100%
Z_12hatch3197%
Z_12pool1385%
Z_4/5pool13100%
Z_9pool5879%
Z_9poolspeed6100%
Z_overpool2075%
Z_unknown888%
8 openings15787%


Zealots were best again, though dragoons were good too. I wonder why the economic 10/12 gates were more successful than the fast 9/9 gates? It suggests that Microwave may overdefend, fearing fast zealots, and not have a strong enough economy to hold off efficient zealots instead. Or the followup after the zealots; BananaBrain likes to expand quickly.


#8 daqin

openinggameswinsfirstlast
PvP_2gatedt1080%037
PvP_2gatedtexpo10%66
PvP_2gatereaver14292%7156
PvP_9/9gate367%3133
PvP_zcore10%2626
5 openings15790%
enemygameswins
P_1gatecore6988%
P_4gategoon6891%
P_ffe1100%
P_unknown1989%
4 openings15790%


DaQin was apparently not ready for reavers. Otherwise it did not badly against a powerful opponent.


#9 freshmeat

openinggameswinsfirstlast
PvZ_4gate2archon888%2633
PvZ_9/9gate122100%35156
PvZ_neobisu1486%013
PvZ_sairgoon10%3434
PvZ_stove1283%1425
5 openings15796%
enemygameswins
Z_12hatch2785%
Z_12hatchmain2291%
Z_12pool1100%
Z_4/5pool27100%
Z_9pool11100%
Z_overpool3100%
Z_unknown66100%
7 openings15796%



#10 ualbertabot

openinggameswinsfirstlast
PvU_10/12gate475%03
PvU_9/9gate10%44
PvU_9/9proxygate580%1014
PvU_nzcore580%59
PvU_zcore14297%15156
5 openings15795%
enemygameswins
P_1gatecore19100%
P_2gate1100%
P_2gatefast2584%
P_4gategoon3100%
P_unknown6100%
T_1fac1100%
T_2fac22100%
T_2rax1694%
T_unknown11100%
Z_12hatch26100%
Z_4/5pool2387%
Z_overpool3100%
Z_unknown1100%
13 openings15795%

AIIDE 2021 - Stardust table in minutes and seconds

It occurred to me a little late that many people would find the Stardust data table easier to understand if the frame times were converted to minutes and seconds. So here’s that version. See the previous post from today.

firstDarkTemplarCompleted pylonInOurMain firstMutaliskCompleted
opponent games n min median max n min median max n min median max
bananabrain 155 20 5:15 5:29 16:11 0 - - - 0 - - -
dragon 156 0 - - - 0 - - - 0 - - -
steamhammer 158 0 - - - 0 - - - 17 4:59 5:43 7:11
mcrave 157 0 - - - 0 - - - 124 6:17 7:35 11:12
willyt 157 0 - - - 0 - - - 0 - - -
microwave 157 0 - - - 0 - - - 17 5:07 5:55 7:54
daqin 156 126 5:13 5:29 12:36 2 1:53 1:54 1:55 0 - - -
freshmeat 157 0 - - - 0 - - - 1 11:40 11:40 11:40
ualbertabot 157 17 4:19 4:29 4:36 0 - - - 0 - - -

AIIDE 2021 - Stardust’s learning

I investigated how Stardust’s learning works, and what it learned. It’s unusual, so it was worth a close look.

In its learning file of game records for each opponent, Stardust records values for 3 keys for each game, firstDarkTemplarCompleted, pylonInOurMain, and firstMutaliskCompleted. If the event occurs in the game, the value is the frame time of the event; otherwise the value is 2147483647 (INT_MAX, the largest int value, in this C++ implementation). It also records whether the game was a win or a loss. It records the hash of the map, too, but that doesn’t seem to be used again.

summarizing the data

The class Opponent is responsible for providing the learned information to the rest of the bot. It summarizes the game records via two routines.

  int minValueInPreviousGames(const std::string &key, int defaultNoData, int maxCount = INT_MAX, int minCount = 0);

If there are at least minCount games, then look through the game records, most recent first, for up to maxCount games. Look up the key for each game and return its minimum value, or the default value if there are none. This amounts to finding the earliest frame at which the event happened, or the default if it did not happen in the specified number of games.

   double winLossRatio(double defaultValue, int maxCount = INT_MAX);

Look through the game records, most recent first, for up to maxCount games and return the winning ratio, or the default value if there are no games yet.

using the summarized data

Each of the 3 keys is used in exactly one place in the code. Here is where firstDarkTemplarCompleted is looked up in the PvP strategy code:

    if (Opponent::winLossRatio(0.0, 200) < 0.99)
    {
        expectedCompletionFrame = Opponent::minValueInPreviousGames("firstDarkTemplarCompleted", 7300, 15, 10);
    }

This means “If we’re rolling you absolutely flat (at least 99% wins in the last 200 games), then it doesn’t matter. Otherwise there’s some risk. In the most recent 15 games, find the earliest frame that the first enemy dark templar was (estimated to be) completed, or return frame 7300 if none.” The default frame 7300 is not the earliest a DT can emerge; they can be on the map over a thousand frames earlier. So it is not a worst-case assumption. Further code overrides the frame number if there is scouting information related to dark templar production. It attempts to build a defensive photon cannon just in time for the enemy DT’s arrival, and sometimes to get an observer.

The key pylonInOurMain is part of cannon rush defense. Stardust again checks the win ratio and again looks back 15 games with a minimum game count of 10, this time with a default of 0 if there are not enough games. It starts scouting its base 500 frames (about 21 seconds) ahead of the earliest seen enemy pylon appearing in its base, which may be never. The idea is that Stardust doesn’t waste time scouting its own base if it hasn’t seen you proxy a pylon in the last 15 games, and delays the scout if the pylon is proxied late.

The key firstMutaliskCompleted is used very similarly, to decide whether and when to defend each nexus with cannons. The goal is to get cannons in time in case mutalisks arrive without being scouted. There are simple rules to decide how many cannons at each nexus:

    // Main and natural are special cases, we only get cannons there to defend against air threats
    if (base == Map::getMyMain() || base == Map::getMyNatural())
    {
        if (enemyAirUnits > 6) return 4;
        if (enemyAirThreat) return 3;
        if (enemyDropThreat && BWAPI::Broodwar->getFrameCount() > 8000) return 1;
        return 0;
    }

    // At expansions we get cannons if the enemy is not contained or has an air threat
    if (!Strategist::isEnemyContained() || enemyAirUnits > 0) return 2;
    if (enemyAirThreat || enemyDropThreat) return 1;
    return 0;

If the firstMutaliskCompleted check says that it’s time, it sets enemyAirThreat to true and makes 3 cannons each at main and natural, and at least 1 at each other base.

the data itself

Here’s my summary of the data in Stardust’s files. The files include prepared data. I left the prepared data out; this covers only what was recorded during the tournament. The tournament was run for 157 rounds, although the official results are given after round 150. The table here is data for all 157 rounds. I don’t have a way to tell which unrecorded games were from rounds 1-150 and which were from 151-157... though I think I could guess.

n is the number of games for which a value (other than 2147483647) was recorded for the key. The values are frame numbers.

firstDarkTemplarCompleted pylonInOurMain firstMutaliskCompleted
opponent games n min median max n min median max n min median max
bananabrain 155 20 7579 7897.5 23319 0 - - - 0 - - -
dragon 156 0 - - - 0 - - - 0 - - -
steamhammer 158 0 - - - 0 - - - 17 7188 8241 10355
mcrave 157 0 - - - 0 - - - 124 9070 10939 16146
willyt 157 0 - - - 0 - - - 0 - - -
microwave 157 0 - - - 0 - - - 17 7371 8534 11397
daqin 156 126 7533 7912.5 18154 2 2721 2743.5 2766 0 - - -
freshmeat 157 0 - - - 0 - - - 1 16801 16801 16801
ualbertabot 157 17 6230 6477 6627 0 - - - 0 - - -

As you might expect after deep contemplation of the nature of reality, only protoss makes dark templar or proxy pylons, and only zerg makes mutalisks. Nothing interesting was recorded for the terran opponents.

Notice that UAlbertaBot sometimes makes dark templar much earlier than the no-data 7300 frame default time; the others do not. DaQin is recorded as twice placing a proxy pylon in Stardust’s main. I didn’t think it ever did that. I guess it’s a holdover from the Locutus proxy pylon play, to trick opponents into overreacting? DaQin made DTs in most games, and McRave went mutalisks in most games. FreshMeat is recorded as having made a mutalisk (or more than one) in exactly one game, which seems unusual.