// calculates whether or not to regroup bool Squad::needsToRegroup() { if (!Config::Micro::UseSparcraftSimulation) { return false; } // if we are not attacking, never regroup if (units.empty() || (order.type != SquadOrder::Attack)) { regroupStatus = std::string("\x04 No combat units available"); return false; } BWAPI::UnitInterface* unitClosest = unitClosestToEnemy(); if (!unitClosest) { regroupStatus = std::string("\x04 No closest unit"); return false; } SparCraft::ScoreType score = 0; //do the SparCraft Simulation! CombatSimulation sim; sim.setCombatUnits(unitClosest->getPosition(), Config::Micro::CombatRegroupRadius + InformationManager::Instance().lastFrameRegroup * 300); score = sim.simulateCombat(); // if we are DT rushing and we haven't lost a DT yet, no retreat! if (Config::Strategy::StrategyName == "Protoss_DTRush" && (BWAPI::Broodwar->self()->deadUnitCount(BWAPI::UnitTypes::Protoss_Dark_Templar) == 0)) { regroupStatus = std::string("\x04 DARK TEMPLAR HOOOOO!"); return false; } bool retreat = score < 0; int switchTime = 100; bool waiting = false; // we should not attack unless 5 seconds have passed since a retreat if (retreat != lastRetreatSwitchVal) { if (!retreat && (BWAPI::Broodwar->getFrameCount() - lastRetreatSwitch < switchTime)) { waiting = true; retreat = lastRetreatSwitchVal; } else { waiting = false; lastRetreatSwitch = BWAPI::Broodwar->getFrameCount(); lastRetreatSwitchVal = retreat; } } if (retreat) { regroupStatus = std::string("\x04 Retreat - simulation predicts defeat"); } else { regroupStatus = std::string("\x04 Attack - simulation predicts success"); } return retreat; }
// calculates whether or not to regroup bool Squad::needsToRegroup() { if (!Config::Micro::UseSparcraftSimulation) { return false; } // if we are not attacking, never regroup if (_units.empty() || (_order.getType() != SquadOrderTypes::Attack)) { _regroupStatus = std::string("\x04 No combat units available"); return false; } BWAPI::Unit unitClosest = unitClosestToEnemy(); if (!unitClosest) { _regroupStatus = std::string("\x04 No closest unit"); return false; } // if none of our units are in attack range of any enemy units, don't retreat std::vector<UnitInfo> enemyCombatUnits; const auto & enemyUnitInfo = InformationManager::Instance().getUnitInfo(BWAPI::Broodwar->enemy()); bool anyInRange = false; for (const auto & eui : enemyUnitInfo) { bool inRange = false; for (const auto & u : _units) { int range = UnitUtil::GetAttackRange(eui.second.type, u->getType()); if (range + 128 >= eui.second.lastPosition.getDistance(u->getPosition())) { inRange = true; break; } } if (inRange) { anyInRange = true; break; } } if (!anyInRange) { _regroupStatus = std::string("\x04 No enemy units in attack range"); return false; } SparCraft::ScoreType score = 0; //do the SparCraft Simulation! CombatSimulation sim; sim.setCombatUnits(unitClosest->getPosition(), Config::Micro::CombatRegroupRadius); score = sim.simulateCombat(); // if we are DT rushing and we haven't lost a DT yet, no retreat! if (Config::Strategy::StrategyName == "Protoss_DTRush" && (BWAPI::Broodwar->self()->deadUnitCount(BWAPI::UnitTypes::Protoss_Dark_Templar) == 0)) { _regroupStatus = std::string("\x04 DARK TEMPLAR HOOOOO!"); return false; } bool retreat = score < 0; int switchTime = 100; bool waiting = false; // we should not attack unless 5 seconds have passed since a retreat if (retreat != _lastRetreatSwitchVal) { if (!retreat && (BWAPI::Broodwar->getFrameCount() - _lastRetreatSwitch < switchTime)) { waiting = true; retreat = _lastRetreatSwitchVal; } else { waiting = false; _lastRetreatSwitch = BWAPI::Broodwar->getFrameCount(); _lastRetreatSwitchVal = retreat; } } if (retreat) { _regroupStatus = std::string("\x04 Retreat - simulation predicts defeat"); } else { _regroupStatus = std::string("\x04 Attack - simulation predicts success"); } return retreat; }