BWAPI
|
#include <DefenseSquad.h>
Public Member Functions | |
DefenseSquadTask (ArmyBehaviour behaviour) | |
virtual int | getEndTime () const |
virtual int | getEndTime (Unit unit) const |
virtual int | getPriority (Unit unit) const |
virtual Position | getStartLocation (Unit unit) const |
virtual Position | getEndLocation (Unit unit) const |
virtual bool | preUpdate () |
virtual bool | update () |
virtual bool | waitingForUnit (Unit unit) const |
virtual void | giveUnit (Unit unit) |
virtual void | returnUnit (Unit unit) |
virtual bool | morph (Unit unit, BWAPI::UnitType previousType) |
virtual UnitGroup | getFinishedUnits () |
virtual std::string | getTaskName () const |
virtual std::string | getOutputName () const |
unsigned int | controlSize () |
virtual void | updateRequirements () |
void | setGoal (Goal goal) |
Private Attributes | |
UnitGroup | mUnits |
std::map< Unit, Behaviour > | mUnitBehaviours |
int | mNeededWorkers |
bool | mNeedsAntiAir |
bool | mNeedsAntiGround |
UnitGroup | mWorkerDefenders |
Unit | mObserver |
Goal | mDefenseGoal |
Definition at line 8 of file DefenseSquad.h.
DefenseSquadTask::DefenseSquadTask | ( | ArmyBehaviour | behaviour | ) |
Definition at line 9 of file DefenseSquad.cpp.
: BaseSquadTask(behaviour) , mNeededWorkers(0) , mDefenseGoal() { }
unsigned int DefenseSquadTask::controlSize | ( | ) | [inline, virtual] |
Implements BaseSquadTask.
Definition at line 33 of file DefenseSquad.h.
References mUnits, and UnitGroup::size().
Position DefenseSquadTask::getEndLocation | ( | Unit | unit | ) | const [virtual] |
Implements BaseSquadTask.
Definition at line 67 of file DefenseSquad.cpp.
{
return unit->getPosition();
}
int DefenseSquadTask::getEndTime | ( | ) | const [virtual] |
Implements BaseSquadTask.
Definition at line 16 of file DefenseSquad.cpp.
References Requirement::maxTime.
{ return Requirement::maxTime; }
int DefenseSquadTask::getEndTime | ( | Unit | unit | ) | const [virtual] |
Implements BaseSquadTask.
Definition at line 21 of file DefenseSquad.cpp.
References Requirement::maxTime.
{ return Requirement::maxTime; }
UnitGroup DefenseSquadTask::getFinishedUnits | ( | ) | [virtual] |
Implements BaseSquadTask.
Definition at line 126 of file DefenseSquad.cpp.
References mUnits.
{ return mUnits; }
virtual std::string DefenseSquadTask::getOutputName | ( | ) | const [inline, virtual] |
int DefenseSquadTask::getPriority | ( | Unit | unit | ) | const [virtual] |
Implements BaseSquadTask.
Definition at line 26 of file DefenseSquad.cpp.
References mNeededWorkers, mNeedsAntiAir, mNeedsAntiGround, mWorkerDefenders, and UnitGroup::size().
{ if(!unit->getType().isWorker()) { bool isNeeded = false; if(mNeedsAntiAir && unit->canAttackAir()) isNeeded = true; if(mNeedsAntiGround && unit->canAttackGround()) isNeeded = true; if(isNeeded) return 30; else return 1; } int workersToReturn = int(mWorkerDefenders.size()) - mNeededWorkers; if(workersToReturn > 0) { int count = 1; for each(Unit worker in mWorkerDefenders) { if(worker == unit) { if(count <= workersToReturn) return 1; break; } ++count; } } return 30; }
Position DefenseSquadTask::getStartLocation | ( | Unit | unit | ) | const [virtual] |
Implements BaseSquadTask.
Definition at line 62 of file DefenseSquad.cpp.
{
return unit->getPosition();
}
virtual std::string DefenseSquadTask::getTaskName | ( | ) | const [inline, virtual] |
void DefenseSquadTask::giveUnit | ( | Unit | unit | ) | [virtual] |
Implements BaseSquadTask.
Definition at line 96 of file DefenseSquad.cpp.
References UnitGroup::insert(), mObserver, mUnitBehaviours, mUnits, mWorkerDefenders, and BWAPI::UnitTypes::Protoss_Observer.
{ if(unit->getType() == BWAPI::UnitTypes::Protoss_Observer) mObserver = unit; else if(unit->getType().isWorker()) mWorkerDefenders.insert(unit); mUnits.insert(unit); mUnitBehaviours[unit] = Behaviour(unit); }
bool DefenseSquadTask::morph | ( | Unit | unit, |
BWAPI::UnitType | previousType | ||
) | [virtual] |
bool DefenseSquadTask::preUpdate | ( | ) | [virtual] |
Implements BaseSquadTask.
Definition at line 72 of file DefenseSquad.cpp.
References Task::hasEnded(), and updateRequirements().
{ updateRequirements(); return hasEnded(); }
void DefenseSquadTask::returnUnit | ( | Unit | unit | ) | [virtual] |
Implements BaseSquadTask.
Definition at line 108 of file DefenseSquad.cpp.
References UnitGroup::erase(), mObserver, mUnitBehaviours, mUnits, mWorkerDefenders, and StaticUnits::nullunit.
{ mUnits.erase(unit); mUnitBehaviours[unit].onDeleted(); mUnitBehaviours.erase(unit); mWorkerDefenders.erase(unit); if(unit == mObserver) mObserver = StaticUnits::nullunit; }
void DefenseSquadTask::setGoal | ( | Goal | goal | ) | [inline] |
Definition at line 37 of file DefenseSquad.h.
References mDefenseGoal.
Referenced by SquadManagerClass::update().
{ mDefenseGoal = goal; }
bool DefenseSquadTask::update | ( | ) | [virtual] |
Implements BaseSquadTask.
Definition at line 79 of file DefenseSquad.cpp.
References ActionTypeDef::Attack, UnitGroup::empty(), Goal::getActionType(), Goal::getBase(), Task::hasEnded(), mDefenseGoal, mUnitBehaviours, mUnits, and BWAPI::BulletTypes::None.
{ if(mDefenseGoal.getActionType() != ActionType::None) { Goal enemiesGoal(ActionType::Attack, mDefenseGoal.getBase()->getEnemyThreats()); for(std::map<Unit, Behaviour>::iterator it = mUnitBehaviours.begin(); it != mUnitBehaviours.end(); ++it) it->second.update(enemiesGoal, mUnits); } return hasEnded() && mUnits.empty(); }
void DefenseSquadTask::updateRequirements | ( | ) | [virtual] |
Reimplemented from BaseSquadTask.
Definition at line 131 of file DefenseSquad.cpp.
References Task::addRequirement(), RequirementGroup::addUnitFilterRequirement(), BWAPI::Broodwar, UnitFilterFlags::CanAttackAir, UnitFilterFlags::CanAttackGround, Task::clearRequirements(), BWAPI::Game::drawTextMap(), Goal::getActionType(), Goal::getBase(), Task::hasEnded(), UnitFilterFlags::IsArmyUnit, UnitFilterFlags::IsComplete, UnitFilterFlags::IsWorker, Requirement::maxTime, mDefenseGoal, mNeededWorkers, mNeedsAntiAir, mNeedsAntiGround, mObserver, mUnits, mWorkerDefenders, BWAPI::BulletTypes::None, BWAPI::UnitTypes::Protoss_Observer, UnitGroup::size(), BWAPI::Position::x(), BWAPI::Position::y(), BWAPI::Races::Zerg, and BWAPI::UnitTypes::Zerg_Lurker.
Referenced by preUpdate().
{ clearRequirements(); mNeededWorkers = 0; mNeedsAntiAir = false; mNeedsAntiGround = false; // Basic idea is to have a defense goal for each base that will take only the amount of units it needs to take out the threat // and also take workers if it cannot take out the threat with the number of units it has // This should make it do important things such as kill the threat while the rest of the army in the default squad stay at the choke // stopping any other units from entering if(!hasEnded() && mDefenseGoal.getActionType() != ActionType::None) { //TODO: currently picks units based on it getting units with a score higher than 100, if its zerg it could get zerglings in which case it wont have enough // TODO: maybe do some modification based on current units health int AirThreatScore = 0; int GroundThreatScore = 0; int GroundThreatCount = 0; bool needsDetection = false; for each(Unit enemy in mDefenseGoal.getBase()->getEnemyThreats()) { if(!needsDetection && (enemy->getType().isCloakable() || enemy->getType().hasPermanentCloak() || enemy->isBurrowed() || enemy->getType() == BWAPI::UnitTypes::Zerg_Lurker)) needsDetection = true; if(enemy->isLifted() || enemy->getType().isFlyer()) { if(enemy->canAttackGround()) AirThreatScore += enemy->getType().buildScore(); else if(enemy->getType().spaceProvided() > 0) { if(enemy->getPlayer()->getRace() != BWAPI::Races::Zerg) AirThreatScore += 400; else if(BWAPI::Broodwar->getFrameCount() > 24*60*6) //TODO: has the player researched drop? AirThreatScore += 250; else AirThreatScore += 50; } else AirThreatScore += 50; } else { ++GroundThreatCount; if(enemy->canAttackGround()) GroundThreatScore += enemy->getType().buildScore(); else GroundThreatScore += 50; } } // Temp till defense squad is good enough to use army units and not just workers if(needsDetection) return; if(GroundThreatScore > 0) mNeedsAntiGround = true; if(AirThreatScore > 0) mNeedsAntiAir = true; int AntiAirScore = 0; int AntiGroundScore = 0; for each(Unit unit in mUnits) { if(unit->getType().isWorker()) continue; if(unit->canAttackGround()) { --GroundThreatCount; AntiGroundScore += unit->getType().buildScore(); } if(unit->canAttackAir()) AntiAirScore += unit->getType().buildScore(); } mNeededWorkers = std::max((GroundThreatScore - AntiGroundScore) / 50, 0); if(mNeededWorkers == 0 && (GroundThreatScore - AntiGroundScore) > 0) mNeededWorkers = 1; if(mNeededWorkers < GroundThreatCount) mNeededWorkers = GroundThreatCount; int canAttackGroundNeeded = mNeededWorkers / 2; if(mNeededWorkers > 14) mNeededWorkers = 0; //If we cannot defend with 14 workers, don't try, probably not worth possible losses if(mNeededWorkers > 1) mNeededWorkers += 1; if(mNeededWorkers > 2) mNeededWorkers += 1; if(mNeededWorkers > 14) mNeededWorkers = 14; int workersNeeded = std::max(mNeededWorkers - int(mWorkerDefenders.size()), 0); canAttackGroundNeeded -= (int(mWorkerDefenders.size()) / 2); // Get as many as we can for now // TODO: maybe check if its our only mining base or do something better for(int i = 0; i < workersNeeded; ++i) { RequirementGroup reqWorkers; reqWorkers.addUnitFilterRequirement(30, Requirement::maxTime, UnitFilter(UnitFilterFlags::type(UnitFilterFlags::IsWorker | UnitFilterFlags::IsComplete)), mDefenseGoal.getBase()->getCenterLocation()); addRequirement(reqWorkers); } // Temp till defense squad is good enough to use army units and not just workers // in the below state can cause the bots army to get too seperated and cause the main army to get possibly destroyed engaging a group elsewhere return; RequirementGroup reqMain; if(canAttackGroundNeeded > 0) reqMain.addUnitFilterRequirement(30, Requirement::maxTime, UnitFilter(UnitFilterFlags::type(UnitFilterFlags::IsArmyUnit | UnitFilterFlags::CanAttackGround | UnitFilterFlags::IsComplete)), canAttackGroundNeeded, mDefenseGoal.getBase()->getCenterLocation()); int canAttackAirNeeded = std::max((AirThreatScore - AntiAirScore) / 100, 0); if(canAttackAirNeeded > 0) reqMain.addUnitFilterRequirement(30, Requirement::maxTime, UnitFilter(UnitFilterFlags::type(UnitFilterFlags::IsArmyUnit | UnitFilterFlags::CanAttackAir | UnitFilterFlags::IsComplete)), canAttackAirNeeded, mDefenseGoal.getBase()->getCenterLocation()); if(!mObserver && needsDetection) reqMain.addUnitFilterRequirement(30, Requirement::maxTime, UnitFilter(BWAPI::UnitTypes::Protoss_Observer) && UnitFilter(UnitFilterFlags::IsComplete), mDefenseGoal.getBase()->getCenterLocation()); addRequirement(reqMain); Position goalpos = mDefenseGoal.getBase()->getCenterLocation(); const int x = goalpos.x(); const int y = goalpos.y(); BWAPI::Broodwar->drawTextMap(x, y, "canAttackGroundNeeded : %d", canAttackGroundNeeded); BWAPI::Broodwar->drawTextMap(x, y+10, "canAttackAirNeeded : %d", canAttackAirNeeded); BWAPI::Broodwar->drawTextMap(x, y+20, "workersNeeded : %d", workersNeeded); BWAPI::Broodwar->drawTextMap(x, y+30, "workers Have : %d", int(mWorkerDefenders.size())); BWAPI::Broodwar->drawTextMap(x, y+40, "Units Have : %d", int(mUnits.size())); if(!mObserver && needsDetection) BWAPI::Broodwar->drawTextMap(x, y+50, "Needs Observer"); } }
bool DefenseSquadTask::waitingForUnit | ( | Unit | unit | ) | const [virtual] |
Goal DefenseSquadTask::mDefenseGoal [private] |
Definition at line 49 of file DefenseSquad.h.
Referenced by setGoal(), update(), and updateRequirements().
int DefenseSquadTask::mNeededWorkers [private] |
Definition at line 43 of file DefenseSquad.h.
Referenced by getPriority(), and updateRequirements().
bool DefenseSquadTask::mNeedsAntiAir [private] |
Definition at line 44 of file DefenseSquad.h.
Referenced by getPriority(), and updateRequirements().
bool DefenseSquadTask::mNeedsAntiGround [private] |
Definition at line 45 of file DefenseSquad.h.
Referenced by getPriority(), and updateRequirements().
Unit DefenseSquadTask::mObserver [private] |
Definition at line 48 of file DefenseSquad.h.
Referenced by giveUnit(), returnUnit(), and updateRequirements().
std::map<Unit, Behaviour> DefenseSquadTask::mUnitBehaviours [private] |
Definition at line 41 of file DefenseSquad.h.
Referenced by giveUnit(), returnUnit(), and update().
UnitGroup DefenseSquadTask::mUnits [private] |
Definition at line 40 of file DefenseSquad.h.
Referenced by controlSize(), getFinishedUnits(), giveUnit(), returnUnit(), update(), and updateRequirements().
UnitGroup DefenseSquadTask::mWorkerDefenders [private] |
Definition at line 47 of file DefenseSquad.h.
Referenced by getPriority(), giveUnit(), returnUnit(), and updateRequirements().