For the upcoming Steamhammer version, I’ve added a set of configuration features that make the strategy mixes more expressive. A strategy mix is a set of openings with numeric weights, which Steamhammer chooses among randomly according to the weights.
1. In a strategy mix, you can specify different weights depending on the map size—actually the number of starting positions, from 2 to 8. A weight given as “Weight” is a default weight that applies to all map sizes. A weight given with a number, like “Weight2”, is specific to that map size and overrides the default weight. This line says that the 9PoolSpeed opening should be played more often on 2-player maps:
{ "Weight" : 5, "Strategy" : "9PoolSpeed", "Weight2" : 15 },
MicroDK wanted this feature, and now it is done.
2. You can use strategy mixes in the EnemySpecificStrategy section. In the current version, you can only specify fixed openings against specific opponents. The syntax is slightly different, to make it possible to play random: Instead of one list headed “StrategyMix”, you can write up to three lists headed “Terran”, “Protoss”, and “Zerg” for the race you end up as.
3. I added a new subsection StrategyCombos which defines strategy mixes that you can refer to by name. For example, Steamhammer knows the names of a bunch of zerg rushbots, and will follow the same strategy mix against all of them. So in the EnemySpecificStrategy section, it lists each one and tells it to follow the AntiRush strategy mix, which gives 6 alternate zerg openings, plus a protoss and a terran opening to defeat 4 pool and 5 pool.
A strategy combo can be given anywhere that you can give a strategy name, including recursively in another strategy mix. (Suggestion: Do not make an infinite loop.) That way you can build strategy mixes piece by piece. Steamhammer does this for its 4 and 5 pool openings. It knows 3 variants, and it is tedious to write them all into each matchup’s strategy mix, so they are pulled out into a separate FastPool strategy mix in the StrategyCombos section:
"FastPool" : {
"Zerg" : [
{ "Weight" : 0, "Strategy" : "4PoolHard", "Weight2" : 5 },
{ "Weight" : 0, "Strategy" : "4PoolSoft", "Weight2" : 15 },
{ "Weight" : 80, "Strategy" : "5Pool" }
]
},
Nested strategy mixes are resolved one at a time. If the outer strategy mix says to play FastPool 5% of the time, then that’s what happens (it may vary depending on the map size). Then FastPool says “oh, this is a 2-player map, I’ll play 5Pool 80% of the time and the others less often,” or it says “this is a 4-player map, I’ll always play 5Pool.”
an example
I made a strategy mix to try against Krasi0 which happens to use all the features. Maybe it will provide an edge over the default. Here’s how it stands today:
"krasi0" : {
"Zerg" : [
{ "Weight" : 3, "Strategy" : "FastPool" },
{ "Weight" : 17, "Strategy" : "9PoolSpeed" },
{ "Weight" : 15, "Strategy" : "ZvT_12Pool" },
{ "Weight" : 20, "Strategy" : "ZvT_2HatchMuta" },
{ "Weight" : 25, "Strategy" : "ZvT_3HatchMuta", "Weight2" : 0 },
{ "Weight" : 20, "Strategy" : "3HatchPoolMuta", "Weight2" : 0 }
],
"Protoss" : [
{ "Weight" : 10, "Strategy" : "1ZealotCore" },
{ "Weight" : 5, "Strategy" : "DTRush" },
{ "Weight" : 25, "Strategy" : "DTDrop" },
{ "Weight" : 10, "Strategy" : "12Nexus" },
{ "Weight" : 50, "Strategy" : "13Nexus" }
]
},
There are zerg and protoss entries. If Randomhammer rolls terran against Krasi0, it will fall back on its default strategy mix.
Krasi0’s favorite thing is to sit back and macro up, so I selected a mix of some fast openings (that stand a chance of busting early, or that may cause trouble if terran should lose and try another build), and some macro openings to try to keep up (including a greedy three hatchery before spawning pool build that Steamhammer doesn’t normally dare to play). I de-emphasized the middle range that seems to me less successful against Krasi0.
Also, the 3 hatchery openings do not happen on 2 player maps. That is because Steamhammer is likely to get a drone stuck behind map blocks, which is a sure loss against a strong opponent. A future version will understand the map blocks, and then I’ll change the weights.