public List <SC2APIProtocol.Action> NavigateToPoint(UnitCommander commander, Point2D target, Point2D defensivePoint, Point2D groupCenter, int frame) { List <SC2APIProtocol.Action> action = null; if (PreOffenseOrder(commander, target, defensivePoint, null, null, frame, out action)) { return(action); } if (MapDataService.InEnemyDetection(commander.UnitCalculation.Unit.Pos)) { if (commander.UnitCalculation.NearbyEnemies.Count(e => e.DamageAir) > 0) { if (commander.RetreatPathFrame + 20 < frame) { commander.RetreatPath = SharkyPathFinder.GetSafeAirPath(target.X, target.Y, commander.UnitCalculation.Unit.Pos.X, commander.UnitCalculation.Unit.Pos.Y, frame); commander.RetreatPathFrame = frame; } if (FollowPath(commander, frame, out action)) { return(action); } } if (AvoidTargettedDamage(commander, target, defensivePoint, frame, out action)) { return(action); } if (AvoidDamage(commander, target, defensivePoint, frame, out action)) { return(action); } } NavigateToTarget(commander, target, groupCenter, null, Formation.Normal, frame, out action); return(action); }
public override IEnumerable <SC2APIProtocol.Action> PerformActions(int frame) { var commands = new List <SC2APIProtocol.Action>(); AssignHarassers(); foreach (var harassInfo in HarassInfos) { foreach (var commander in harassInfo.Harassers) { if ((!MapDataService.InEnemyDetection(commander.UnitCalculation.Unit.Pos) && (commander.UnitCalculation.Unit.BuffIds.Contains((uint)Buffs.BANSHEECLOAK) || commander.UnitCalculation.Unit.Energy > 50)) || MapDataService.EnemyAirDpsInRange(commander.UnitCalculation.Unit.Pos) < 10) { if (Vector2.DistanceSquared(new Vector2(commander.UnitCalculation.Unit.Pos.X, commander.UnitCalculation.Unit.Pos.Y), new Vector2(harassInfo.BaseLocation.MineralLineLocation.X, harassInfo.BaseLocation.MineralLineLocation.Y)) < 100) { var action = BansheeMicroController.HarassWorkers(commander, harassInfo.BaseLocation.MineralLineLocation, TargetingData.ForwardDefensePoint, frame); if (action != null) { commands.AddRange(action); } if (commander.UnitCalculation.NearbyEnemies.Count(e => e.UnitClassifications.Contains(UnitClassification.Worker) && (Vector2.DistanceSquared(new Vector2(commander.UnitCalculation.Unit.Pos.X, commander.UnitCalculation.Unit.Pos.Y), new Vector2(e.Unit.Pos.X, e.Unit.Pos.Y)) <= 100)) < 1 && MapDataService.SelfVisible(harassInfo.BaseLocation.MineralLineLocation)) { harassInfo.LastClearedFrame = frame; harassInfo.Harassers.Remove(commander); return(commands); } else if (commander.UnitCalculation.NearbyEnemies.Any(e => e.DamageAir && Vector2.DistanceSquared(new Vector2(harassInfo.BaseLocation.MineralLineLocation.X, harassInfo.BaseLocation.MineralLineLocation.Y), new Vector2(e.Unit.Pos.X, e.Unit.Pos.Y)) < 100)) { if (commander.UnitCalculation.TargetPriorityCalculation.TargetPriority == TargetPriority.FullRetreat || commander.UnitCalculation.TargetPriorityCalculation.TargetPriority == TargetPriority.Retreat || commander.UnitCalculation.Unit.Shield <= 5) { harassInfo.LastDefendedFrame = frame; harassInfo.Harassers.Remove(commander); return(commands); } } } else if (!commander.UnitCalculation.NearbyEnemies.Any(e => e.DamageAir) && commander.UnitCalculation.NearbyEnemies.Count(e => e.UnitClassifications.Contains(UnitClassification.Worker)) > 2) // if near woerkers and nothing can attack it just kill workers { var action = BansheeMicroController.HarassWorkers(commander, harassInfo.BaseLocation.MineralLineLocation, TargetingData.ForwardDefensePoint, frame); if (action != null) { commands.AddRange(action); } } else { var action = BansheeMicroController.NavigateToPoint(commander, harassInfo.BaseLocation.MineralLineLocation, TargetingData.ForwardDefensePoint, null, frame); if (action != null) { commands.AddRange(action); } } } else { var action = BansheeMicroController.NavigateToPoint(commander, TargetingData.ForwardDefensePoint, TargetingData.MainDefensePoint, null, frame); if (action != null) { commands.AddRange(action); } } } } return(commands); }
public override IEnumerable <SC2APIProtocol.Action> PerformActions(int frame) { var commands = new List <SC2APIProtocol.Action>(); AssignHarassers(); foreach (var harassInfo in HarassInfos) { foreach (var commander in harassInfo.Harassers) { if (commander.UnitCalculation.Unit.Shield == commander.UnitCalculation.Unit.ShieldMax && !MapDataService.InEnemyDetection(commander.UnitCalculation.Unit.Pos) && commander.UnitCalculation.NearbyEnemies.Count(e => e.UnitClassifications.Contains(UnitClassification.Worker) && !MapDataService.InEnemyDetection(e.Unit.Pos)) > 0) { var action = DarkTemplarMicroController.HarassWorkers(commander, harassInfo.BaseLocation.MineralLineLocation, TargetingData.ForwardDefensePoint, frame); if (action != null) { commands.AddRange(action); } } else if (Vector2.DistanceSquared(commander.UnitCalculation.Position, new Vector2(harassInfo.BaseLocation.MineralLineLocation.X, harassInfo.BaseLocation.MineralLineLocation.Y)) < 100) { var action = DarkTemplarMicroController.HarassWorkers(commander, harassInfo.BaseLocation.MineralLineLocation, TargetingData.ForwardDefensePoint, frame); if (action != null) { commands.AddRange(action); } if (!commander.UnitCalculation.NearbyEnemies.Any(e => Vector2.DistanceSquared(new Vector2(harassInfo.BaseLocation.MineralLineLocation.X, harassInfo.BaseLocation.MineralLineLocation.Y), e.Position) < 100)) { harassInfo.LastClearedFrame = frame; harassInfo.Harassers.Remove(commander); return(commands); } else if (commander.UnitCalculation.NearbyEnemies.Any(e => e.UnitClassifications.Contains(UnitClassification.Detector) && Vector2.DistanceSquared(new Vector2(harassInfo.BaseLocation.MineralLineLocation.X, harassInfo.BaseLocation.MineralLineLocation.Y), e.Position) < 100)) { if (commander.UnitCalculation.TargetPriorityCalculation.GroundWinnability < 1 && commander.UnitCalculation.Unit.Shield < commander.UnitCalculation.Unit.ShieldMax) { harassInfo.LastDefendedFrame = frame; harassInfo.Harassers.Remove(commander); return(commands); } } } else if (!MapDataService.InEnemyDetection(commander.UnitCalculation.Unit.Pos) && commander.UnitCalculation.NearbyEnemies.Any(e => !e.Unit.IsFlying && (e.Unit.Health + e.Unit.Shield < commander.UnitCalculation.Damage) && Vector2.DistanceSquared(commander.UnitCalculation.Position, e.Position) < 8)) // if undetected and near one hit kills just kill them { var action = DarkTemplarMicroController.HarassWorkers(commander, harassInfo.BaseLocation.MineralLineLocation, TargetingData.ForwardDefensePoint, frame); if (action != null) { commands.AddRange(action); } } else { var action = DarkTemplarMicroController.NavigateToPoint(commander, harassInfo.BaseLocation.MineralLineLocation, TargetingData.ForwardDefensePoint, null, frame); if (action != null) { commands.AddRange(action); } if (commander.RetreatPath.Count() == 0) { if (commander.UnitCalculation.NearbyEnemies.Any(e => e.UnitClassifications.Contains(UnitClassification.Detector) && Vector2.DistanceSquared(commander.UnitCalculation.Position, e.Position) < 120)) { harassInfo.LastPathFailedFrame = frame; harassInfo.Harassers.Remove(commander); return(commands); } } } } } return(commands); }