Skip to content
Snippets Groups Projects
library.cpp 2.45 KiB
Newer Older
#include "library.h"

namespace py = pybind11;

PYBIND11_MODULE(library, m)
{
    m.doc() = "Python API for playing Starcraft II";

    define_typeenums(m);
    define_unit(m);
    define_unittype(m);
    define_util(m);
    define_point(m);
    define_base_location(m);

    py::class_<Coordinator>(m, "Coordinator")
        .def(py::init())
        .def("SetParticipants", &sc2::Coordinator::SetParticipants)
        .def("LaunchStarcraft", &sc2::Coordinator::LaunchStarcraft)
        .def("StartGame", &sc2::Coordinator::StartGame)
        .def("Update", &sc2::Coordinator::Update);

    py::enum_<sc2::Race>(m, "Race")
        .value("Terran", sc2::Race::Terran)
        .value("Zerg", sc2::Race::Zerg)
        .value("Protoss", sc2::Race::Protoss)
        .value("Random", sc2::Race::Random);

    /*
    TODO: These also needs to be defined

    typedef SC2Type<ABILITY_ID>   AbilityID;
    typedef SC2Type<UPGRADE_ID>   UpgradeID;
    typedef SC2Type<BUFF_ID>      BuffID;
    */
    py::class_<sc2::UnitTypeID>(m, "UnitTypeID")
        .def(py::init<sc2::UNIT_TYPEID>());

    py::implicitly_convertible<sc2::UNIT_TYPEID, sc2::UnitTypeID>();

    py::class_<sc2::Agent>(m, "Agent")
        .def(py::init());

    // IDABot is a specialization of Agent
    py::class_<IDABot, PyIDABot, sc2::Agent>(m, "IDABot")
        .def(py::init())
        .def("OnGameStart", &IDABot::OnGameStart)
        .def("OnStep", &IDABot::OnStep)
        .def("OnStep_UpdateIDABot", &IDABot::OnStep_UpdateIDABot)
        .def("GetAllUnits", &IDABot::GetAllUnits)
        .def("GetMyUnits", &IDABot::GetMyUnits)
        .def_property_readonly("base_manager", &IDABot::Bases);

    py::class_<sc2::PlayerSetup>(m, "PlayerSetup");

    py::enum_<sc2::Difficulty>(m, "Difficulty")
        .value("VeryEasy", sc2::Difficulty::VeryEasy)
        .value("Easy", sc2::Difficulty::Easy)
        .value("Medium", sc2::Difficulty::Medium)
        .value("MediumHard", sc2::Difficulty::MediumHard)
        .value("Hard", sc2::Difficulty::Hard)
        .value("HardVeryHard", sc2::Difficulty::HardVeryHard)
        .value("VeryHard", sc2::Difficulty::VeryHard)
        .value("CheatVision", sc2::Difficulty::CheatVision)
        .value("CheatMoney", sc2::Difficulty::CheatMoney)
        .value("CheatInsane", sc2::Difficulty::CheatInsane);

    m.def("CreateParticipant", &sc2::CreateParticipant, "Create participant from agent");

    m.def("CreateComputer", &sc2::CreateComputer, "Create participant from built-in Starcraft computer");
}