StarCraft 1 BWAPI - Running multiple AI modules on Local PC with different races

Written on

BWAPI is a very strong tool for interacting with StarCraft: Brood War. It allows for the creation of intelligent agents to play the game and for pitting said agents against each other to determine the best.

I needed to run many many games of StarCraft, between various AI agents, on the same machine. While BWAPI allows you to load different agents while running locally, it, for some reason, does not let you have different races set up for each independent agent. Or, at least, I couldn’t find a creative way of doing that. Thus, a bit of C++ solved the problem.

If this is something that you would require (or BWAPI devs find it useful to include in the official release), here’s the quick requirements:

  • in AutoMenuManager.cpp (BWAPI), under this->autoMenuRace = LoadConfigStringUCase("auto_menu", "race", "RANDOM"); , just add
std::stringstream raceList(this->autoMenuRace);

std::string currentrace = this->autoMenuRace.substr(0, this->autoMenuRace.find_first_of(','));

for (int i = 0; i < (int)gdwProcNum && raceList; ++i)
    std::getline(raceList, currentrace, ',');

auto trimBegin = currentrace.find_first_not_of(" \"");
auto trimEnd = currentrace.find_last_not_of(" \"") + 1;
currentrace = currentrace.substr(trimBegin, trimEnd - trimBegin);

this->autoMenuRace = currentrace;
  • recompile BWAPI

  • copy the resulting BWAPI.dll and BWAPI_PluginInjector.bwl to bwapi-data and Chaoslauncher/Plugins respectively

You can now separate multiple races via commas in your bwapi.ini file!

ai = bwapi-data/AI/ZZZKBot.dll, bwapi-data/AI/AI_krasi0_2_35.dll

race = Zerg, Terran

And it works too.