private List <Action> DefendWithWorkers(IEnumerable <UnitCalculation> attackingEnemies, int frame) { var bunkersInProgress = attackingEnemies.Where(e => e.Unit.UnitType == (uint)UnitTypes.TERRAN_BUNKER && e.Unit.BuildProgress < 1); if (bunkersInProgress.Count() > 0) { var bunker = bunkersInProgress.OrderByDescending(u => u.Unit.BuildProgress).FirstOrDefault(); // attack with 8 woerkers if (WorkerDefenders.Count() == 0) { var closestWokrers = ActiveUnitData.Commanders.Where(u => u.Value.UnitCalculation.UnitClassifications.Contains(UnitClassification.Worker) && u.Value.UnitRole == UnitRole.Minerals).OrderBy(d => Vector2.DistanceSquared(d.Value.UnitCalculation.Position, bunker.Position)).Take(8); WorkerDefenders.AddRange(closestWokrers.Select(c => c.Value)); foreach (var worker in WorkerDefenders) { worker.UnitRole = UnitRole.Attack; } } foreach (var worker in WorkerDefenders.Where(w => w.UnitCalculation.TargetPriorityCalculation.TargetPriority == TargetPriority.Retreat || w.UnitCalculation.TargetPriorityCalculation.TargetPriority == TargetPriority.FullRetreat)) { worker.UnitCalculation.TargetPriorityCalculation.TargetPriority = TargetPriority.KillBunker; } return(MicroController.Attack(WorkerDefenders, new Point2D { X = bunker.Position.X, Y = bunker.Position.Y }, TargetingData.ForwardDefensePoint, TargetingData.MainDefensePoint, frame)); } return(new List <SC2APIProtocol.Action>()); }
private void StopDefendingWithWorkers() { if (WorkerDefenders.Count() > 0) { foreach (var defender in WorkerDefenders) { defender.UnitRole = UnitRole.None; } WorkerDefenders.Clear(); } }