Composition getCounters(BWAPI::UnitType enemyUnitType) { auto allUnitTypes = BWAPI::UnitTypes::allUnitTypes(); std::unordered_map<BWAPI::UnitType, int> unitTypeCounterAmount; //LF new name pls auto groundDamageType = enemyUnitType.groundWeapon().damageType(); auto airDamageType = enemyUnitType.airWeapon().damageType(); auto sizeType = enemyUnitType.size(); bool flyer = enemyUnitType.isFlyer(); for each (auto unitType in allUnitTypes) { if (unitType.getRace() != util::game::getSelf()->getRace() || unitType.isHero() || unitType.isBuilding() || unitType.isWorker()) continue; //if enemy unit flies and friendly unit can damage it... if (flyer) { if (unitType.airWeapon().damageAmount() > 0) { unitTypeCounterAmount[unitType]++; //if friendly unit flies and enemy unit can't damage it... if (!(enemyUnitType.airWeapon().damageAmount() > 0)) unitTypeCounterAmount[unitType]++; //if enemy unit damage type is concussive and friendly unit size is small... if (airDamageType == BWAPI::DamageTypes::Concussive && unitType.size() == BWAPI::UnitSizeTypes::Small) unitTypeCounterAmount[unitType]++; //if enemy unit damage type is explosive and friendly unit size is large... else if (airDamageType == BWAPI::DamageTypes::Explosive && unitType.size() == BWAPI::UnitSizeTypes::Large) unitTypeCounterAmount[unitType]++; //if enemy unit size is small and friendly damage type is explosive... if (sizeType == BWAPI::UnitSizeTypes::Small && unitType.airWeapon().damageType() == BWAPI::DamageTypes::Explosive) unitTypeCounterAmount[unitType]++; //if enemy unit size is medium or large and friendly damage type is concussive... else if ((sizeType == BWAPI::UnitSizeTypes::Medium || sizeType == BWAPI::UnitSizeTypes::Large) && unitType.airWeapon().damageType() == BWAPI::DamageTypes::Concussive) unitTypeCounterAmount[unitType]++; } else continue; } //if enemy unit is ground unit and friendly unit can damage it... if (!flyer && unitType.groundWeapon().damageAmount() > 0) { unitTypeCounterAmount[unitType]++; //if friendly unit flies and enemy unit can't damage it... if (unitType.isFlyer() && !(enemyUnitType.airWeapon().damageAmount() > 0)) unitTypeCounterAmount[unitType]++; //if enemy unit damage type is concussive and friendly unit size is small... if (groundDamageType == BWAPI::DamageTypes::Concussive && unitType.size() == BWAPI::UnitSizeTypes::Small) unitTypeCounterAmount[unitType]++; //if enemy unit damage type is explosive and friendly unit size is large... else if (groundDamageType == BWAPI::DamageTypes::Explosive && unitType.size() == BWAPI::UnitSizeTypes::Large) unitTypeCounterAmount[unitType]++; //if enemy unit size is small and friendly damage type is explosive... if (sizeType == BWAPI::UnitSizeTypes::Small && unitType.groundWeapon().damageType() == BWAPI::DamageTypes::Explosive) unitTypeCounterAmount[unitType]++; //if enemy unit size is medium or large and friendly damage type is concussive... else if ((sizeType == BWAPI::UnitSizeTypes::Medium || sizeType == BWAPI::UnitSizeTypes::Large) && unitType.groundWeapon().damageType() == BWAPI::DamageTypes::Concussive) unitTypeCounterAmount[unitType]++; } else continue; } Composition counterComposition; for (auto &unitType = unitTypeCounterAmount.begin(); unitType != unitTypeCounterAmount.end(); unitType++) { if (unitType->first == BWAPI::UnitTypes::Spell_Scanner_Sweep) counterComposition.addType(BWAPI::UnitTypes::Terran_Comsat_Station, unitType->second); else if (unitType->first == BWAPI::UnitTypes::Terran_Siege_Tank_Siege_Mode) counterComposition.addType(BWAPI::UnitTypes::Terran_Siege_Tank_Tank_Mode, unitType->second); else if(unitType->first == BWAPI::UnitTypes::Terran_Vulture_Spider_Mine) counterComposition.addType(BWAPI::UnitTypes::Terran_Vulture, unitType->second); else counterComposition.addType(unitType->first, unitType->second); } return counterComposition; }