Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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);
	}
}
Example #4
0
int UnitAgent::getGroundRange()
{
	return getGroundRange(unit->getType());
}
Example #5
0
int UnitAgent::enemyAttackingUnitsWithinRange(UnitType type)
{
	return enemyGroundAttackingUnitsWithinRange(unit->getTilePosition(), getGroundRange(type)) + enemyAirAttackingUnitsWithinRange(unit->getTilePosition(), getAirRange(type));
}