int UnitClass::getTimeToKill(Unit unit) { int health = unit->totalHitPoints(); BWAPI::WeaponType weapon = getWeapon(unit); int weaponDamage = weapon.damageAmount() + (weapon.damageFactor() * getPlayer()->getUpgradeLevel(weapon.upgradeType())); if(weaponDamage == 0) return 5000; int thisNumberOfShots = health / weaponDamage; if(weapon.damageType() == BWAPI::DamageTypes::Concussive) { if(unit->getType().size() == BWAPI::UnitSizeTypes::Large) thisNumberOfShots *= 4; else if(unit->getType().size() == BWAPI::UnitSizeTypes::Medium) thisNumberOfShots += thisNumberOfShots; } else if(weapon.damageType() == BWAPI::DamageTypes::Explosive) { if(unit->getType().size() == BWAPI::UnitSizeTypes::Small) thisNumberOfShots += thisNumberOfShots; else if(unit->getType().size() == BWAPI::UnitSizeTypes::Medium) thisNumberOfShots += thisNumberOfShots / 2; } if((BWAPI::Broodwar->getGroundHeight(getTilePosition()) - BWAPI::Broodwar->getGroundHeight(unit->getTilePosition())) < 0) thisNumberOfShots += thisNumberOfShots; return thisNumberOfShots * weapon.damageCooldown(); }
double UnitUtil::CalculateLTD(BWAPI::Unit attacker, BWAPI::Unit target) { BWAPI::WeaponType weapon = GetWeapon(attacker, target); if (weapon == BWAPI::WeaponTypes::None) { return 0; } return static_cast<double>(weapon.damageAmount()) / weapon.damageCooldown(); }
// returns whether or not this unit can attack a given unit at a given time const bool Unit::canAttackTarget(const Unit & unit, const TimeType & gameTime) const { BWAPI::WeaponType weapon = unit.type().isFlyer() ? type().airWeapon() : type().groundWeapon(); if (weapon.damageAmount() == 0) { return false; } // range of this unit attacking PositionType r = range(); // return whether the target unit is in range return (r * r) >= getDistanceSqToUnit(unit, gameTime); }
// returns whether or not this unit can attack a given unit at a given time bool Unit::canAttackTarget(const Unit & unit, const TimeType & gameTime) const { BWAPI::WeaponType weapon = unit.type().isFlyer() ? type().airWeapon() : type().groundWeapon(); if (weapon.damageAmount() == 0 || unit.isloaded() ) { return false; } // range of this unit attacking PositionType r = range(); if(!unit.type().isBuilding()) return (r * r) >= getDistanceSqToUnit(unit, gameTime); const Position &ours=currentPosition(gameTime); const Position &his=unit.currentPosition(gameTime); PositionType lines[]={his.y()-unit.type().dimensionUp(), his.y()+unit.type().dimensionDown(), his.x()-unit.type().dimensionLeft(), his.x()+unit.type().dimensionRight()}; PositionType dists[]={lines[0]-ours.y(),lines[1]-ours.y(),lines[2]-ours.x(),lines[3]-ours.x()}; if(sign(dists[0])==sign(dists[1])){ if(sign(dists[2])==sign(dists[3])){ //diagonal return (r*r) >=std::min(abs(dists[0]),abs(dists[1]))* std::min(abs(dists[0]),abs(dists[1]))+ std::min(abs(dists[2]),abs(dists[3]))* std::min(abs(dists[2]),abs(dists[3])); }else{ //top or bottom return r >= std::min(abs(dists[0]),abs(dists[1])); } }else if(sign(dists[2])==sign(dists[3])){ //left or right return r >= std::min(abs(dists[2]),abs(dists[3])); }else{ std::cerr<<"WARNING: Unit "<<ID()<<" is inside unit "<<unit.ID()<<std::endl; return true; } }