Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
s7jones committed Feb 8, 2018
2 parents 8ba5978 + 69499d8 commit 3dcc3d0
Show file tree
Hide file tree
Showing 5 changed files with 158 additions and 71 deletions.
21 changes: 16 additions & 5 deletions PeregrineBot/Source/ArmyManager.cpp
Expand Up @@ -124,7 +124,9 @@ void ArmyManager::ZerglingAttack(Unit u)
ZerglingScoutSpreadOut(u);
}
} else {
if (isEnemyBaseFromOverlordSpotting) {
if (enemyBuildings.size() != 0) {
ZerglingAttackKnownBuildings(u);
} else if (isEnemyBaseFromOverlordSpotting) {
OrderManager::Instance().Move(u, enemyBase);
DebugMessenger::Instance() << "scout overlord spot" << std::endl;
} else {
Expand Down Expand Up @@ -186,7 +188,7 @@ void ArmyManager::ZerglingAttackKnownBuildings(Unit u)
float distanceBuilding = DistanceAir(u->getPosition(), buildingPos);
if (distanceBuilding < distanceEnemyBuildingAccessible) {
distanceEnemyBuildingAccessible = distanceBuilding;
buildingAccessiblePos = buildingPos;
buildingAccessiblePos = buildingPos;
}
}

Expand Down Expand Up @@ -242,6 +244,15 @@ void ArmyManager::ZerglingScoutSpreadOut(Unit u)
scoutLocationsZergling.push_back(unscoutedLocation);
}

// TODO: don't add duplicate cases
for (const auto& base : BWTA::getBaseLocations()) {
auto region = base->getRegion();
if (!BWTA::getRegion(u->getPosition())->isReachable(region)) {
continue;
}
scoutLocationsZergling.push_back(base->getPosition());
}

for (const auto& region : BWTA::getRegions()) {
// if region isn't reachable then skip
if (!BWTA::getRegion(u->getPosition())->isReachable(region)) {
Expand All @@ -260,9 +271,9 @@ void ArmyManager::ZerglingScoutSpreadOut(Unit u)
} else {
DebugMessenger::Instance() << "Zergling Scouting!" << std::endl;

auto it = scoutLocationsZergling.begin();
Position perimeterPoint = (*it);
OrderManager::Instance().Move(u, perimeterPoint);
auto it = scoutLocationsZergling.begin();
Position p = (*it);
OrderManager::Instance().Move(u, p);
scoutLocationsZergling.erase(it);
}
}
94 changes: 47 additions & 47 deletions PeregrineBot/Source/BaseManager.cpp
Expand Up @@ -15,53 +15,6 @@ BaseManager& BaseManager::Instance()
return instance;
}

void BaseManager::onUnitShow(BWAPI::Unit unit)
{
// if something morphs into a worker, add it
if (unit->getType().isWorker() && unit->getPlayer() == Broodwar->self() && unit->getHitPoints() >= 0) {
workers.insert(unit);
}
}

void BaseManager::onUnitCreate(BWAPI::Unit unit)
{
// if something morphs into a worker, add it
if (unit->getType().isWorker() && unit->getPlayer() == Broodwar->self() && unit->getHitPoints() >= 0) {
workers.insert(unit);
}
}

void BaseManager::onUnitDestroy(BWAPI::Unit unit)
{
if (unit->getType().isResourceDepot() && unit->getPlayer() == Broodwar->self()) {
hatcheries.erase(unit);
}

if (unit->getType().isWorker() && unit->getPlayer() == Broodwar->self()) {
workers.erase(unit);
}
}

void BaseManager::onUnitMorph(BWAPI::Unit unit)
{
// if something morphs into a worker, add it
if (unit->getType().isWorker() && unit->getPlayer() == Broodwar->self() && unit->getHitPoints() >= 0) {
workers.insert(unit);
}

// if something morphs into a building, it was a worker?
if (unit->getType().isBuilding() && unit->getPlayer() == Broodwar->self() && unit->getPlayer()->getRace() == Races::Zerg) {
workers.erase(unit);
}
}

void BaseManager::onUnitRenegade(BWAPI::Unit unit)
{
if (unit->getType().isWorker() && unit->getPlayer() == Broodwar->self()) {
workers.erase(unit);
}
}

void BaseManager::ManageBases(Unit u)
{
for (auto trainee : workersTraining) {
Expand Down Expand Up @@ -119,3 +72,50 @@ void BaseManager::ManageBases(Unit u)
}
}
}

void BaseManager::onUnitShow(BWAPI::Unit unit)
{
// if something morphs into a worker, add it
if (unit->getType().isWorker() && unit->getPlayer() == Broodwar->self() && unit->getHitPoints() >= 0) {
workers.insert(unit);
}
}

void BaseManager::onUnitCreate(BWAPI::Unit unit)
{
// if something morphs into a worker, add it
if (unit->getType().isWorker() && unit->getPlayer() == Broodwar->self() && unit->getHitPoints() >= 0) {
workers.insert(unit);
}
}

void BaseManager::onUnitDestroy(BWAPI::Unit unit)
{
if (unit->getType().isResourceDepot() && unit->getPlayer() == Broodwar->self()) {
hatcheries.erase(unit);
}

if (unit->getType().isWorker() && unit->getPlayer() == Broodwar->self()) {
workers.erase(unit);
}
}

void BaseManager::onUnitMorph(BWAPI::Unit unit)
{
// if something morphs into a worker, add it
if (unit->getType().isWorker() && unit->getPlayer() == Broodwar->self() && unit->getHitPoints() >= 0) {
workers.insert(unit);
}

// if something morphs into a building, it was a worker?
if (unit->getType().isBuilding() && unit->getPlayer() == Broodwar->self() && unit->getPlayer()->getRace() == Races::Zerg) {
workers.erase(unit);
}
}

void BaseManager::onUnitRenegade(BWAPI::Unit unit)
{
if (unit->getType().isWorker() && unit->getPlayer() == Broodwar->self()) {
workers.erase(unit);
}
}
94 changes: 76 additions & 18 deletions PeregrineBot/Source/InformationManager.cpp
Expand Up @@ -199,6 +199,8 @@ void InformationManager::Update()
}
}

validateEnemyUnits();

UpdateScouting();
}

Expand Down Expand Up @@ -349,29 +351,18 @@ void InformationManager::OverlordRetreatToHome(BWAPI::Unit overlord)
DebugMessenger::Instance() << "Retreat overlord." << std::endl;
OrderManager::Instance().Move(overlord, ownBasePos);
} else {
DebugMessenger::Instance() << "Overlord being attacked in base." << std::endl;
//DebugMessenger::Instance() << "Overlord being attacked in base." << std::endl;
// spamming when enemy race is terran.
}
}

void InformationManager::onUnitShow(BWAPI::Unit unit)
{
if ((IsEnemy)(unit)) {
if ((IsBuilding)(unit)) {
auto iter = enemyBuildings.find(unit);
if (iter != enemyBuildings.end()) {
iter->second.update();
} else {
std::map<Unit, UnitInfo>::value_type value = {unit, UnitInfo(unit)};
enemyBuildings.insert(value);
}
addToEnemyBuildings(unit);
} else {
auto iter = enemyArmy.find(unit);
if (iter != enemyArmy.end()) {
iter->second.update();
} else {
std::map<Unit, UnitInfo>::value_type value = { unit, UnitInfo(unit) };;
enemyArmy.insert(value);
}
addToEnemyArmy(unit);
}
}
}
Expand All @@ -380,14 +371,81 @@ void InformationManager::onUnitDestroy(BWAPI::Unit unit)
{
if ((IsEnemy)(unit)) {
if ((IsBuilding)(unit)) {
enemyBuildings.erase(unit);

removeFromEnemyBuildings(unit);
if (((IsResourceDepot)(unit) == true) && (unit->getPosition() == enemyBase)) {
isEnemyBaseDestroyed = true;
DebugMessenger::Instance() << "destroyed enemy base: " << Broodwar->getFrameCount() << std::endl;
}
} else {
enemyArmy.erase(unit);
removeFromEnemyArmy(unit);
}
}
}

void InformationManager::onUnitMorph(BWAPI::Unit unit)
{
if ((IsEnemy)(unit)) {
if ((IsBuilding)(unit)) {
addToEnemyBuildings(unit);
removeFromEnemyArmy(unit);
} else {
addToEnemyArmy(unit);
removeFromEnemyBuildings(unit);
}
}
}

void InformationManager::addToEnemyBuildings(BWAPI::Unit unit)
{
auto iter = enemyBuildings.find(unit);
if (iter != enemyBuildings.end()) {
iter->second.update();
} else {
std::map<Unit, UnitInfo>::value_type value = { unit, UnitInfo(unit) };
enemyBuildings.insert(value);
}
}

void InformationManager::addToEnemyArmy(BWAPI::Unit unit)
{
auto iter = enemyArmy.find(unit);
if (iter != enemyArmy.end()) {
iter->second.update();
} else {
std::map<Unit, UnitInfo>::value_type value = { unit, UnitInfo(unit) };
enemyArmy.insert(value);
}
}

void InformationManager::removeFromEnemyBuildings(BWAPI::Unit unit)
{
enemyBuildings.erase(unit);
}

void InformationManager::removeFromEnemyArmy(BWAPI::Unit unit)
{
enemyArmy.erase(unit);
}

void InformationManager::validateEnemyUnits()
{
for (auto iter = enemyBuildings.begin(); iter != enemyBuildings.end(); iter++) {
auto unit = *iter;
if (unit.second.exists()) {
if ((!IsBuilding || !IsEnemy)(unit.second.u)) {
removeFromEnemyBuildings(unit.first);
DebugMessenger::Instance() << "remove enemy building on validation" << std::endl;
}
}
}

for (auto iter = enemyArmy.begin(); iter != enemyArmy.end(); iter++) {
auto unit = *iter;
if (unit.second.exists()) {
if ((IsBuilding || !IsEnemy)(unit.second.u)) {
removeFromEnemyArmy(unit.first);
DebugMessenger::Instance() << "remove enemy army on validation" << std::endl;
}
}
}
}
9 changes: 8 additions & 1 deletion PeregrineBot/Source/InformationManager.h
@@ -1,7 +1,7 @@
#pragma once
#include "Common.h"
#include "Utility.h"
#include "UnitInfo.h"
#include "Utility.h"

struct ScoutingOptionFor4 {
std::array<BWAPI::TilePosition, 3> startToP1ToP2;
Expand Down Expand Up @@ -59,6 +59,7 @@ class InformationManager {
static InformationManager& Instance();
void onUnitShow(BWAPI::Unit unit);
void onUnitDestroy(BWAPI::Unit unit);
void onUnitMorph(BWAPI::Unit unit);

void Setup();
void SetupScouting();
Expand Down Expand Up @@ -94,6 +95,12 @@ class InformationManager {
std::map<BWAPI::Unit, UnitInfo> enemyArmy;

private:
void addToEnemyBuildings(BWAPI::Unit unit);
void addToEnemyArmy(BWAPI::Unit unit);
void removeFromEnemyBuildings(BWAPI::Unit unit);
void removeFromEnemyArmy(BWAPI::Unit unit);
void validateEnemyUnits();

float maxBaseToBaseDistance;
bool isPastSpottingTime = false;
};
11 changes: 11 additions & 0 deletions PeregrineBot/Source/PeregrineBot.cpp
Expand Up @@ -262,6 +262,17 @@ void PeregrineBot::onUnitDestroy(BWAPI::Unit unit)

void PeregrineBot::onUnitMorph(BWAPI::Unit unit)
{
/*
Called when a unit changes its UnitType.
For example, when a Drone transforms into a Hatchery, a Siege Tank uses Siege Mode, or a Vespene Geyser receives a Refinery.
Parameters
unit Unit object representing the unit that had its UnitType change.
Note
This is NOT called if the unit type changes to or from UnitTypes::Unknown.
*/
InformationManager::Instance().onUnitMorph(unit);
BaseManager::Instance().onUnitMorph(unit);

if (Broodwar->isReplay()) {
Expand Down

0 comments on commit 3dcc3d0

Please sign in to comment.