This post will be about the opponentID in StarCraft 2 AI. The opponentID is a number that a bot can use to recognize the bot it plays against. By recording information about your opponent you can adjust your play in subsequent matches. If you don’t win the first time, you will be able to try something different next time and hopefully win. The opponentID was introduced at the start of season 6 of the ladder, but some people don’t like it and it is now up for discussion whether it will be removed for season 7. You can watch this podcast for the original discussion. I like the opponentID a lot and I think it wil actually benefit the Starcraft 2 AI community as a whole. Below I will set out why I think the opponentID should remain.
The main reason why I think it should remain is because it encourages varied play styles. I believe these varied play styles are crucial to a healthy meta. Consider tournaments for the top Starcraft 2 players. During these tournaments, players will almost always switch up their build orders at least somewhat. If anyone becomes too predictable then the opponent will figure out how to counter their strategies. Cheeses, for the most part are used rarely, but occasionally you will see a player play some cheese build. This is mostly to keep the opponent in check. They can’t play too greedy without risking losing to some early rush. For bots, if they do not have opponentIDs, they will be unable to even tell they are playing the same opponent. This makes it impossible to throw in the odd cheese at a tactical moment in a series. This eventually leads to ever greedier play styles; if you can’t punish your opponents greedy play with a cheese, then you must become greedier yourself to keep up. Ultimately I fear that this will stifle variety in play styles for high level bots.
So what arguments are there against opponentIDs? During the podcast, Hjax brings up the following:
“[Suppose] I make a bot that does two things really well, and someone else makes a bot that does 100 crappy things. [Say] four of those crappy things can beat the things my bot does well, it will switch between them to find the things that beats it.”
Is it unfair that a bot with 100 simple strategies beats a bot that does two things really well? Does this allow low-effort bots to beat high effort bots? I would argue that a bot that does 100 different things is itself a high effort bot, even if those are not all very refined.
I have a different concern, namely what happens to a bot that does 100 different strategies really well? Imagine a bot that can switch between a well executed one base all-in to an incredible macro style from one game to the next. It also can do pretty much anything in between. Now this bot does not just switch between those 100 strategies randomly looking for one that happens to beat the opponent. No. It plays a single game against the opponent, analyses the game and if it sees a greedy opponent it will prefer some punishing timing attack. If it recognizes some cheese, it will know a counter to it. You might now object: “But Tyr, such an advanced bot is way beyond what anyone can build right now. You are talking about some imaginary, all-powerful bot!”. Not at all. The bot I am describing is called Steamhammer and it plays brood war. Its main race is Zerg, which knows 90 different opening build orders. It can also play random and knows another 32 openings for the other two races. The reason it can execute all of these builds well, is that it only needs to specify the opening build order. The details are executed by a more general system. Mind you, the strategy selection is not advanced enough to recognize all opponent builds and so far it still relies a lot on experimenting with its different builds to see what works. It is getting ever closer to that ideal though. If we want to have a Starcraft 2 AI that can play with such a variety of builds we need the opponentID.
Another Brood War bot I want to mention is SAIDA. This was a bot that was developed by a team of South Korean researchers at Samsung. It was released fairly recently and quickly climed up the ladder. Among other thing, it is capable of changing its build order dynamically between games. If you play a Dark Templar rush you might catch it off guard, but try that a second game and you may find that it has built some turrets just in time to hold it off. If you want to read more about this bot, here is a blog post on it by Jay Scott, the author of Steamhammer himself! This sort of dynamic reaction to an opponents build certainly is not possible without the opponentID. It only works if you have already coded when to scout for whatever sort of attack an opponent may throw at you.
There will most likely be a vote on the matter of disabling the opponentID (or not). In the end, the question of whether you choose for or against it comes down to deciding what you find more important: If we keep the opponentID, we will be rewarding a bot with 100 low effort strategies over a bot with one highly polished strategy. However if we remove the opponentID, then we will reward a bot that does one standard strategy well over a bot with 100 highly polished and varied strategies. I will certainly be voting for the variety.