From 47e9cfcb1f1fa78b7f06c7c92186d604b74a1303 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonathan=20=C3=96hrling?= <jonoh749@student.liu.se>
Date: Thu, 6 Dec 2018 12:15:58 +0100
Subject: [PATCH] Added methods to use abilities.

---
 python-api-src/library.cpp | 35 +++++++++++++++++++----------------
 src/IDABot.cpp             | 14 ++++++++++++++
 src/IDABot.h               |  5 +++++
 3 files changed, 38 insertions(+), 16 deletions(-)

diff --git a/python-api-src/library.cpp b/python-api-src/library.cpp
index 50ec422ac..c1c0dc019 100644
--- a/python-api-src/library.cpp
+++ b/python-api-src/library.cpp
@@ -63,22 +63,25 @@ PYBIND11_MODULE(library, m)
         .def(py::init());
 
     // IDABot is a specialization of Agent
-    py::class_<IDABot, PyIDABot, sc2::Agent>(m, "IDABot")
-        .def(py::init())
-        .def("on_game_start", &IDABot::OnGameStart)
-        .def("on_step", &IDABot::OnStep)
-        .def("get_all_units", &IDABot::GetAllUnits, "Returns a list of all units")
-        .def("get_my_units", &IDABot::GetMyUnits, "Returns a list of all units beloning to the player")
-        .def("get_player_race", &IDABot::GetPlayerRace)
-        .def_property_readonly("base_location_manager", &IDABot::Bases)
-        .def_property_readonly("tech_tree", &IDABot::GetTechTree)
-        .def_property_readonly("map_tools", &IDABot::Map)
-        .def_property_readonly("building_placer", &IDABot::GetBuildingPlacer)
-        .def_property_readonly("start_location", &IDABot::GetStartLocation, "CCPosition representing the start location")
-        .def_property_readonly("minerals", &IDABot::GetMinerals, "How much minerals we currently have")
-        .def_property_readonly("current_supply", &IDABot::GetCurrentSupply, "How much supply we are currently using")
-        .def_property_readonly("max_supply", &IDABot::GetMaxSupply, "How much supply we can currently use")
-        .def_property_readonly("gas", &IDABot::GetGas, "How much gas we currently have");
+	py::class_<IDABot, PyIDABot, sc2::Agent>(m, "IDABot")
+		.def(py::init())
+		.def("on_game_start", &IDABot::OnGameStart)
+		.def("on_step", &IDABot::OnStep)
+		.def("get_all_units", &IDABot::GetAllUnits, "Returns a list of all units")
+		.def("get_my_units", &IDABot::GetMyUnits, "Returns a list of all units beloning to the player")
+		.def("get_player_race", &IDABot::GetPlayerRace)
+		.def_property_readonly("base_location_manager", &IDABot::Bases)
+		.def_property_readonly("tech_tree", &IDABot::GetTechTree)
+		.def_property_readonly("map_tools", &IDABot::Map)
+		.def_property_readonly("building_placer", &IDABot::GetBuildingPlacer)
+		.def_property_readonly("start_location", &IDABot::GetStartLocation, "CCPosition representing the start location")
+		.def_property_readonly("minerals", &IDABot::GetMinerals, "How much minerals we currently have")
+		.def_property_readonly("current_supply", &IDABot::GetCurrentSupply, "How much supply we are currently using")
+		.def_property_readonly("max_supply", &IDABot::GetMaxSupply, "How much supply we can currently use")
+		.def_property_readonly("gas", &IDABot::GetGas, "How much gas we currently have")
+		.def("use_ability", &IDABot::CallUnitCommand, "Use an ability with the given unit")
+		.def("use_ability", &IDABot::CallUnitCommandWithPoint, "Use ability at point with the given unit")
+		.def("use_ability", &IDABot::CallUnitCommandWithTarget, "Use ability at target with the given unit");
 
     py::class_<sc2::PlayerSetup>(m, "PlayerSetup");
 
diff --git a/src/IDABot.cpp b/src/IDABot.cpp
index f61dc8329..5a7b4dd30 100644
--- a/src/IDABot.cpp
+++ b/src/IDABot.cpp
@@ -219,3 +219,17 @@ const TypeData & IDABot::Data(const MetaType & type) const
 	return m_techTree.getData(type);
 }
 
+void IDABot::CallUnitCommand(const Unit* unit, sc2::AbilityID ability)
+{
+	Actions()->UnitCommand(unit->getUnitPtr(), ability, false);
+}
+
+void IDABot::CallUnitCommandWithPoint(const Unit* unit, sc2::AbilityID ability, const sc2::Point2D& point)
+{
+	Actions()->UnitCommand(unit->getUnitPtr(), ability, point, false);
+}
+
+void IDABot::CallUnitCommandWithTarget(const Unit* unit, sc2::AbilityID ability, const Unit* target)
+{
+	Actions()->UnitCommand(unit->getUnitPtr(), ability, target->getUnitPtr(), false);
+}
diff --git a/src/IDABot.h b/src/IDABot.h
index eca954f01..7578bef16 100644
--- a/src/IDABot.h
+++ b/src/IDABot.h
@@ -62,4 +62,9 @@ public:
     const TypeData & Data(const CCUpgrade & type) const;
     const TypeData & Data(const MetaType & type) const;
     const TypeData & Data(const Unit & unit) const;
+
+	// Used for giving "raw" commands to units
+	void CallUnitCommand(const Unit* unit, sc2::AbilityID ability);
+	void CallUnitCommandWithPoint(const Unit* unit, sc2::AbilityID ability, const sc2::Point2D& point);
+	void CallUnitCommandWithTarget(const Unit* unit, sc2::AbilityID ability, const Unit* target);
 };
-- 
GitLab