diff --git a/python-api-src/lib_unit.cpp b/python-api-src/lib_unit.cpp index 58cd791584d095e9004411896b9a29cc54db5d0f..90aedec40182dc55c38ff9ffcf3b0475694bab60 100644 --- a/python-api-src/lib_unit.cpp +++ b/python-api-src/lib_unit.cpp @@ -19,6 +19,7 @@ void define_unit(py::module & m) .def_property_readonly("is_being_constructed", &Unit::isBeingConstructed) .def_property_readonly("is_cloaked", &Unit::isCloaked) .def_property_readonly("is_flying", &Unit::isFlying) + .def_property_readonly("buffs", &Unit::buffs) .def_property_readonly("is_alive", &Unit::isAlive) .def_property_readonly("is_powered", &Unit::isPowered) .def_property_readonly("is_idle", &Unit::isIdle) @@ -28,6 +29,8 @@ void define_unit(py::module & m) .def("stop", &Unit::stop) .def("attack_unit", &Unit::attackUnit) .def("attack_move", &Unit::attackMove) + .def("ability", &Unit::ability) + .def("ability_at_target", &Unit::ability_at_target) .def("move", py::overload_cast<const CCPosition &>(&Unit::move, py::const_)) .def("move", py::overload_cast<const CCTilePosition &>(&Unit::move, py::const_)) .def("right_click", &Unit::rightClick, "Same as right-clicking in the game, for example making workers mine minerals") diff --git a/python-api-src/library.cpp b/python-api-src/library.cpp index 50ec422acb00f0f77d3aa241b671a3fdd45b89fa..026e7d7f804ba4d26cabc6f670c41ffd04ac52c1 100644 --- a/python-api-src/library.cpp +++ b/python-api-src/library.cpp @@ -43,11 +43,18 @@ PYBIND11_MODULE(library, m) TODO: BuffID is not defined, defined as following by Blizzard: typedef SC2Type<BUFF_ID> BuffID; */ + py::class_<sc2::BuffID>(m, "BuffID") + .def(py::init<sc2::BUFF_ID>()); + + py::implicitly_convertible<sc2::BUFF_ID, sc2::BuffID>(); + + py::class_<sc2::UnitTypeID>(m, "UnitTypeID") .def(py::init<sc2::UNIT_TYPEID>()); py::implicitly_convertible<sc2::UNIT_TYPEID, sc2::UnitTypeID>(); + py::class_<sc2::UpgradeID>(m, "UpgradeID") .def(py::init<sc2::UPGRADE_ID>()); diff --git a/src/Common.h b/src/Common.h index fa45feb4e2c7a5fe0d1690082c8c8a1e37fd6313..a8538c47bc7fc66de78c38eec2982bfa91e182f8 100644 --- a/src/Common.h +++ b/src/Common.h @@ -24,6 +24,7 @@ typedef sc2::Tag CCUnitID; typedef sc2::Race CCRace; typedef float CCHealth; typedef float CCPositionType; +typedef sc2::BuffID CCBuff; typedef size_t CCPlayer; diff --git a/src/Unit.cpp b/src/Unit.cpp index a1899596721f341e235b90b2ad678d75e91e36e8..1590442fcd5944fdbcf1f94bb079a33f9396b676 100644 --- a/src/Unit.cpp +++ b/src/Unit.cpp @@ -146,6 +146,16 @@ bool Unit::isFlying() const #endif } +std::vector< CCBuff > Unit::buffs() const +{ + BOT_ASSERT(isValid(), "Unit is not valid"); +#ifdef SC2API + return m_unit->buffs; +#else + return m_unit->buffs(); +#endif +} + bool Unit::isAlive() const { BOT_ASSERT(isValid(), "Unit is not valid"); @@ -285,6 +295,18 @@ void Unit::morph(const UnitType & type) const BOT_ASSERT(isValid(), "Unit is not valid"); m_bot->Actions()->UnitCommand(m_unit, m_bot->Data(type).morphAbility); } +void Unit::ability(sc2::AbilityID & ability) const +{ + BOT_ASSERT(isValid(), "Unit is not valid"); + m_bot->Actions()->UnitCommand(m_unit, ability); +} + +void Unit::ability_at_target(sc2::AbilityID & ability, const Unit & target) const +{ + BOT_ASSERT(isValid(), "Unit is not valid"); + m_bot->Actions()->UnitCommand(m_unit, ability, target.getUnitPtr()); +} + void Unit::research(sc2::UpgradeID upgrade) const { diff --git a/src/Unit.h b/src/Unit.h index 5770bd80b8b0d33faf89747bce3faaed0e993862..74b2b50a2d0be5636293eae47d0b23fc97861535 100644 --- a/src/Unit.h +++ b/src/Unit.h @@ -33,6 +33,7 @@ public: CCHealth getEnergy() const; CCPlayer getPlayer() const; CCUnitID getID() const; + std::vector< CCBuff > buffs() const; float getBuildPercentage() const; int getWeaponCooldown() const; bool isCompleted() const; @@ -51,6 +52,8 @@ public: void attackUnit (const Unit & target) const; void attackMove (const CCPosition & targetPosition) const; void move (const CCPosition & targetPosition) const; + void ability (sc2::AbilityID & ability) const; + void ability_at_target (sc2::AbilityID & ability, const Unit & target) const; void move (const CCTilePosition & targetTilePosition) const; void rightClick (const Unit & target) const; void repair (const Unit & target) const;