private List <SC2APIProtocol.Action> Run(int frame, List <UnitCommander> unitCommanders, BaseLocation selfBase) { var actions = new List <SC2APIProtocol.Action>(); var otherBase = BaseData.BaseLocations.FirstOrDefault(b => b.Location.X != selfBase.Location.X && b.Location.Y != selfBase.Location.Y); if (otherBase != null) { foreach (var commander in unitCommanders) { if (commander.UnitCalculation.EnemiesInRangeOf.Count() > 0 && (commander.UnitCalculation.Unit.Health < commander.UnitCalculation.Unit.HealthMax || commander.UnitCalculation.Unit.Shield < commander.UnitCalculation.Unit.ShieldMax)) { if (commander.UnitRole == UnitRole.Minerals || commander.UnitRole == UnitRole.Gas) { commander.UnitRole = UnitRole.Defend; } if (commander.UnitCalculation.Unit.Health + commander.UnitCalculation.Unit.Shield < commander.UnitCalculation.EnemiesInRangeOf.First().Damage || commander.UnitCalculation.UnitTypeData.MovementSpeed < commander.UnitCalculation.EnemiesInRangeOf.First().UnitTypeData.MovementSpeed) { var action = WorkerMicroController.Retreat(commander, otherBase.MineralLineLocation, null, frame); if (action != null) { actions.AddRange(action); } } else { var action = WorkerMicroController.Bait(commander, BaseData.BaseLocations.Last().Location, BaseData.BaseLocations.First().Location, null, frame); if (action != null) { actions.AddRange(action); } } } else if (commander.UnitCalculation.Unit.WeaponCooldown == 0 && commander.UnitCalculation.EnemiesInRange.Count() > 0) // TODO: test this, attack any units if they walk by { var action = commander.Order(frame, Abilities.ATTACK, null, commander.UnitCalculation.EnemiesInRange.OrderBy(e => e.Unit.Health + e.Unit.Shield).FirstOrDefault().Unit.Tag); if (action != null) { actions.AddRange(action); } } } } return(actions); }