From 307ca3a7ba676d8c01a8c1e2443455ec6d0b5688 Mon Sep 17 00:00:00 2001 From: Michael Holtan Date: Thu, 18 Mar 2021 16:03:35 -0500 Subject: [PATCH] feat: Attack first worker-scout, #16 Preemptively attack early scout-worker --- src/objects/Worker.cpp | 5 +++++ src/objects/Worker.h | 3 +++ src/strategies/Strategy.cpp | 19 +++++++++++++++++++ src/strategies/Strategy.h | 5 +++++ 4 files changed, 32 insertions(+) diff --git a/src/objects/Worker.cpp b/src/objects/Worker.cpp index 013c962..3e2882e 100644 --- a/src/objects/Worker.cpp +++ b/src/objects/Worker.cpp @@ -37,3 +37,8 @@ void Worker::Repair(const sc2::Unit& target_) { gAPI->action().ToggleAutocast(Tag(), sc2::ABILITY_ID::EFFECT_REPAIR_SCV); m_job = Job::REPAIRING; } + +void Worker::Attack(const sc2::Unit& target_) { + gAPI->action().Cast(ToUnit(), sc2::ABILITY_ID::SMART, target_); + m_job = Job::ATTACKING; +} diff --git a/src/objects/Worker.h b/src/objects/Worker.h index 3f6239b..c99bc35 100644 --- a/src/objects/Worker.h +++ b/src/objects/Worker.h @@ -13,6 +13,7 @@ enum Job { BUILDING = 2, BUILDING_REFINERY = 3, REPAIRING = 4, + ATTACKING = 5, }; struct Worker: GameObject { @@ -24,6 +25,8 @@ struct Worker: GameObject { void GatherVespene(const sc2::Unit& target_); + void Attack(const sc2::Unit& target_); + void Repair(const sc2::Unit& target_); private: diff --git a/src/strategies/Strategy.cpp b/src/strategies/Strategy.cpp index 1f64fd9..f834a47 100644 --- a/src/strategies/Strategy.cpp +++ b/src/strategies/Strategy.cpp @@ -4,6 +4,7 @@ #include "Historican.h" #include "Strategy.h" +#include "Hub.h" #include "core/API.h" #include "core/Helpers.h" @@ -47,3 +48,21 @@ void Strategy::OnUnitCreated(const sc2::Unit* unit_, Builder*) { m_units.push_back(unit_); } + +void Strategy::OnUnitEnterVision(const sc2::Unit* unit_, Builder*) { + if (IsCombatUnit()(*unit_)) + return; + + if (m_attackFirstScout) { + AssignWorkerAttack(*unit_); + m_attackFirstScout = false; // only attack first scout, first time seen + } +} + +void Strategy::AssignWorkerAttack(const sc2::Unit& target_) { + Worker* worker = gHub->GetClosestFreeWorker(target_.pos); + if (!worker) + return; + + worker->Attack(target_); +} diff --git a/src/strategies/Strategy.h b/src/strategies/Strategy.h index b644f42..f24bc0a 100644 --- a/src/strategies/Strategy.h +++ b/src/strategies/Strategy.h @@ -13,7 +13,12 @@ struct Strategy : Plugin { void OnUnitCreated(const sc2::Unit* unit_, Builder*) override; + void OnUnitEnterVision(const sc2::Unit* unit_, Builder*) override; + + void AssignWorkerAttack(const sc2::Unit& target_); + protected: + bool m_attackFirstScout = true; float m_attack_limit; sc2::Units m_units; };