StarCraft: Brood War AI — a neural network trained by self-play RL.
58
4 commits
updated Sep 23, 2026
Pluto is a StarCraft: Brood War AI. A single neural network, trained by self-play reinforcement learning, plays the whole game — macro and micro, all three races; there is no scripted play. It plays 1v1 melee through BWAPI (https://bwapi.github.io/).
Status: binary releases. This repo hosts binary releases of Pluto.
The current one is the model that played the CoG 2026 StarCraft AI
Competition (md07x02_cog2026_2578600_int8mv), with CPU inference — no
GPU needed. Grab it from the Releases page.
Unpack the release zip into your StarCraft folder's bwapi-data/AI/
(the usual place for bots), so the files land like this:
bwapi-data/AI/pluto.dll 32-bit BWAPI module
bwapi-data/AI/pluto/pluto_infer.exe 64-bit CPU inference engine
bwapi-data/AI/pluto/pluto_weights.bin network weights (int8)
Point bwapi.ini at the DLL as usual: ai = bwapi-data/AI/pluto.dll
Register the bot as Zerg, Terran, Protoss, or Random — it plays all of them. It announces itself in chat on game start: "Pluto online (md07x02_cog2026_2578600_int8mv). gl hf!"
The binaries are unsigned, so Windows SmartScreen or antivirus software may warn on first run.
On game start, pluto.dll launches pluto_infer.exe (found next to the DLL) and talks to it over shared memory. No network connections are made and no files outside the StarCraft folder are touched. The engine process exits with the game.
The model takes one step every 6 game frames. The DLL gives the engine up to 40 ms in the frame it observed and, if the answer isn't in by then, waits for it at the next frame — so every decision is acted on exactly when the model was trained to expect it. On a slow CPU the game runs slower; the bot does not play worse. A step takes ~20 ms on a current desktop CPU and ~60 ms on a 2021 6-core (i5-12500T) with 200 units on the map, up to ~3x that in big late-game fights. When the stalls stay long for a sustained stretch, Pluto says so once in chat ("Pluto: this machine can't keep up ... sorry about the pace") and notes it in its game record.
If the engine cannot start (missing files, unsupported CPU) or dies mid-game, the bot reports the reason in game chat and in the logs ("Pluto: quitting in 10 seconds"), then exits the StarCraft process. This looks like a crash, and is meant to: it is an error, not a game. Check pluto.log and pluto_infer.log in the StarCraft folder.
pluto.log DLL log (StarCraft folder)
pluto_infer.log engine log (StarCraft folder)
bwapi-data/write/pluto_bandit_<opponent>.txt
per-opponent build-order stats and the running
record against that opponent
The bot picks its opening with a bandit over the per-opponent win/loss
counts; every build is listed with its mask and name, so you can edit
the numbers to steer it. The file is re-read every game (from write/ or
read/, whichever is newer, so the usual write/ -> read/ copy between
games works too); if you edit it, bump the seq line so your copy wins
and keep the closing end line. Below the stats, the file keeps one
JSON line per game: a start record (opponent, map, chosen build), an
end record (result, frame timing, the model's win-probability
trajectory) and any error or resign events.
pluto_infer.exe --bench once per machine (~2-4 min).
It times the thread counts on that hardware and writes the best one
to pluto/pluto_config.json, which the engine then uses. Without it
the engine uses up to 6 threads.BWRL_DRAW=1 in the environment draws the model's win-probability
graph on screen (off by default; nice for watching games).BWRL_STRADDLE=1: the DLL then never holds a frame past the budget,
and a late decision slips to a later frame instead (the competition
behaviour; the bot decides less often). BWRL_FRAME_BUDGET_MS=<ms>
changes the budget for either mode.4 commits
StarCraft: Brood War AI — a neural network trained by self-play RL.
58
4 commits
updated Sep 23, 2026
Pluto is a StarCraft: Brood War AI. A single neural network, trained by self-play reinforcement learning, plays the whole game — macro and micro, all three races; there is no scripted play. It plays 1v1 melee through BWAPI (https://bwapi.github.io/).
Status: binary releases. This repo hosts binary releases of Pluto.
The current one is the model that played the CoG 2026 StarCraft AI
Competition (md07x02_cog2026_2578600_int8mv), with CPU inference — no
GPU needed. Grab it from the Releases page.
Unpack the release zip into your StarCraft folder's bwapi-data/AI/
(the usual place for bots), so the files land like this:
bwapi-data/AI/pluto.dll 32-bit BWAPI module
bwapi-data/AI/pluto/pluto_infer.exe 64-bit CPU inference engine
bwapi-data/AI/pluto/pluto_weights.bin network weights (int8)
Point bwapi.ini at the DLL as usual: ai = bwapi-data/AI/pluto.dll
Register the bot as Zerg, Terran, Protoss, or Random — it plays all of them. It announces itself in chat on game start: "Pluto online (md07x02_cog2026_2578600_int8mv). gl hf!"
The binaries are unsigned, so Windows SmartScreen or antivirus software may warn on first run.
On game start, pluto.dll launches pluto_infer.exe (found next to the DLL) and talks to it over shared memory. No network connections are made and no files outside the StarCraft folder are touched. The engine process exits with the game.
The model takes one step every 6 game frames. The DLL gives the engine up to 40 ms in the frame it observed and, if the answer isn't in by then, waits for it at the next frame — so every decision is acted on exactly when the model was trained to expect it. On a slow CPU the game runs slower; the bot does not play worse. A step takes ~20 ms on a current desktop CPU and ~60 ms on a 2021 6-core (i5-12500T) with 200 units on the map, up to ~3x that in big late-game fights. When the stalls stay long for a sustained stretch, Pluto says so once in chat ("Pluto: this machine can't keep up ... sorry about the pace") and notes it in its game record.
If the engine cannot start (missing files, unsupported CPU) or dies mid-game, the bot reports the reason in game chat and in the logs ("Pluto: quitting in 10 seconds"), then exits the StarCraft process. This looks like a crash, and is meant to: it is an error, not a game. Check pluto.log and pluto_infer.log in the StarCraft folder.
pluto.log DLL log (StarCraft folder)
pluto_infer.log engine log (StarCraft folder)
bwapi-data/write/pluto_bandit_<opponent>.txt
per-opponent build-order stats and the running
record against that opponent
The bot picks its opening with a bandit over the per-opponent win/loss
counts; every build is listed with its mask and name, so you can edit
the numbers to steer it. The file is re-read every game (from write/ or
read/, whichever is newer, so the usual write/ -> read/ copy between
games works too); if you edit it, bump the seq line so your copy wins
and keep the closing end line. Below the stats, the file keeps one
JSON line per game: a start record (opponent, map, chosen build), an
end record (result, frame timing, the model's win-probability
trajectory) and any error or resign events.
pluto_infer.exe --bench once per machine (~2-4 min).
It times the thread counts on that hardware and writes the best one
to pluto/pluto_config.json, which the engine then uses. Without it
the engine uses up to 6 threads.BWRL_DRAW=1 in the environment draws the model's win-probability
graph on screen (off by default; nice for watching games).BWRL_STRADDLE=1: the DLL then never holds a frame past the budget,
and a late decision slips to a later frame instead (the competition
behaviour; the bot decides less often). BWRL_FRAME_BUDGET_MS=<ms>
changes the budget for either mode.4 commits