bool UnitAgent::canAttack(UnitType attacker, UnitType target) { if (!attacker.canAttack()) { return false; } if (target.isFlyer() || target.isFlyingBuilding()) { if (getAirRange(attacker) >= 0) { return true; } else { return false; } } else { if (getGroundRange(attacker) >= 0) { return true; } else { return false; } } return false; }
Unit* GhostAgent::findLockdownTarget() { int fCnt = friendlyUnitsWithinRange(224); if (fCnt < 2) { //If we dont have any attacking units nearby, //dont bother with lockdown. return NULL; } int maxRange = getGroundRange(); Unit* target = NULL; int cTargetVal = 0; for(set<Unit*>::const_iterator i=Broodwar->enemy()->getUnits().begin(); i!=Broodwar->enemy()->getUnits().end(); i++) { if ((*i)->getType().isMechanical() && !(*i)->getLockdownTimer() == 0 && !(*i)->getType().isBuilding()) { int targetVal = (*i)->getType().destroyScore(); if (targetVal >= 200 && targetVal > cTargetVal) { target = (*i); cTargetVal = targetVal; } } } return target; }
void SiegeTankAgent::computeActions() { if (Broodwar->self()->hasResearched(TechTypes::Tank_Siege_Mode)) { bool goSiege = false; //If we have enemy targets nearby, go into siege mode int eCnt = enemyGroundUnitsWithinRange(getGroundRange(UnitTypes::Terran_Siege_Tank_Siege_Mode)); if (eCnt > 0) { goSiege = true; } if (eCnt == 0) { goSiege = false; } //If we are defending and are at the defense position, go //in siege mode Squad* sq = Commander::getInstance()->getSquad(squadID); if (sq != NULL) { if (!sq->isActive()) { int range = UnitTypes::Terran_Siege_Tank_Siege_Mode.groundWeapon().maxRange() * 0.5; double d = unit->getDistance(Position(goal)); if (d <= range) goSiege = true; } } if (goSiege && !unit->isSieged()) unit->siege(); if (!goSiege && unit->isSieged()) unit->unsiege(); } defensive = false; TargetingAgent::checkTarget(this); //The tank cant move if sieged if (!unit->isSieged()) { NavigationAgent::getInstance()->computeMove(this, goal, defensive); } }
int UnitAgent::getGroundRange() { return getGroundRange(unit->getType()); }
int UnitAgent::enemyAttackingUnitsWithinRange(UnitType type) { return enemyGroundAttackingUnitsWithinRange(unit->getTilePosition(), getGroundRange(type)) + enemyAirAttackingUnitsWithinRange(unit->getTilePosition(), getAirRange(type)); }