Skip to content

Commit 9af04ce

Browse files
committed
fix: Fix gas saturation, #34
Checks each refinery for oversaturation, and finds a worker on its way to refinery (not-inside-refinery) to STOP and force OnIdle next turn to be re-distributed to minerals.
1 parent e3e3e6b commit 9af04ce

File tree

5 files changed

+35
-2
lines changed

5 files changed

+35
-2
lines changed

src/Hub.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,22 @@ void Hub::AssignVespeneHarvester(const sc2::Unit& refinery_) {
279279
worker->GatherVespene(refinery_);
280280
}
281281

282+
void Hub::RemoveVespeneHarvester(const sc2::Unit& refinery_) {
283+
const std::list<Worker>& workers = m_busy_workers();
284+
auto vespener = std::find_if(workers.begin(), workers.end(),
285+
[refinery_](const Worker& worker_) {
286+
return !worker_.m_unit->orders.empty() &&
287+
worker_.m_unit->orders.front().target_unit_tag == refinery_.tag &&
288+
worker_.m_unit->last_seen_game_loop == gAPI->observer().GetGameLoop();
289+
});
290+
291+
if (vespener == workers.end())
292+
return;
293+
294+
// NOTE (impulsecloud): STOP forces OnIdle next frame
295+
gAPI->action().Cast(vespener->ToUnit(), sc2::ABILITY_ID::STOP_STOP);
296+
}
297+
282298
bool Hub::AssignLarva(Order* order_) {
283299
if (m_larva.Empty())
284300
return false;

src/Hub.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
template <typename T>
1717
struct Cache {
18+
const std::list<T>& operator()();
19+
1820
bool Empty() const;
1921

2022
uint64_t Count() const;
@@ -37,6 +39,11 @@ struct Cache {
3739
std::list<T> m_objects;
3840
};
3941

42+
template <typename T>
43+
const std::list<T>& Cache<T>::operator()() {
44+
return m_objects;
45+
}
46+
4047
template <typename T>
4148
bool Cache<T>::Empty() const {
4249
return m_objects.empty();
@@ -145,6 +152,8 @@ struct Hub {
145152

146153
void AssignVespeneHarvester(const sc2::Unit& refinery_);
147154

155+
void RemoveVespeneHarvester(const sc2::Unit& refinery_);
156+
148157
bool AssignLarva(Order* order_);
149158

150159
const Cache<GameObject>& GetLarvas() const;

src/objects/GameObject.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
#include "core/API.h"
77

88
GameObject::GameObject(sc2::Tag tag_): m_tag(tag_) {
9+
m_unit = gAPI->observer().GetUnit(tag_);
910
}
1011

11-
GameObject::GameObject(const sc2::Unit& unit_): m_tag(unit_.tag) {
12+
GameObject::GameObject(const sc2::Unit& unit_): m_unit(&unit_), m_tag(unit_.tag) {
1213
}
1314

1415
bool GameObject::operator==(const GameObject& obj_) const {

src/objects/GameObject.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ struct GameObject {
2424

2525
static sc2::Unit ToUnit(sc2::Tag tag_);
2626

27+
const sc2::Unit* m_unit;
28+
2729
private:
2830
sc2::Tag m_tag;
2931
};

src/plugins/Miner.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,12 @@ void SecureVespeneIncome() {
4444
auto refineries = gAPI->observer().GetUnits(IsRefinery());
4545

4646
for (const auto& i : refineries()) {
47-
if (i->assigned_harvesters >= i->ideal_harvesters)
47+
if (i->assigned_harvesters > i->ideal_harvesters) {
48+
gHub->RemoveVespeneHarvester(*i);
49+
continue;
50+
}
51+
52+
if (i->assigned_harvesters == i->ideal_harvesters)
4853
continue;
4954

5055
gHub->AssignVespeneHarvester(*i);

0 commit comments

Comments
 (0)