From 615faf47d53094254a2c1875d23a12d6d7f70b22 Mon Sep 17 00:00:00 2001
From: Anton Andell <antan048@student.liu.se>
Date: Tue, 4 Dec 2018 12:59:32 +0100
Subject: [PATCH] ability, ability at target and buffs

---
 python-api-src/lib_unit.cpp |  3 +++
 python-api-src/library.cpp  |  7 +++++++
 src/Common.h                |  1 +
 src/Unit.cpp                | 22 ++++++++++++++++++++++
 src/Unit.h                  |  3 +++
 5 files changed, 36 insertions(+)

diff --git a/python-api-src/lib_unit.cpp b/python-api-src/lib_unit.cpp
index 58cd79158..90aedec40 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 50ec422ac..026e7d7f8 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 fa45feb4e..a8538c47b 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 a18995967..1590442fc 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 5770bd80b..74b2b50a2 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;
-- 
GitLab