public override void Produce(Bot bot, Agent agent) { if (agent.Unit.UnitType == UnitTypes.NEXUS && Minerals() >= 50 && Count(UnitTypes.PROBE) < 23 - Completed(UnitTypes.ASSIMILATOR)) { if (Count(UnitTypes.PROBE) < 13 || Count(UnitTypes.PYLON) > 0) { agent.Order(1006); } } else if (agent.Unit.UnitType == UnitTypes.GATEWAY) { if (Completed(UnitTypes.CYBERNETICS_CORE) > 0 && Minerals() >= 125 && Gas() >= 50 && UpgradeType.LookUp[UpgradeType.WarpGate].Progress() < 0.7 && Count(UnitTypes.STALKER) < 10 || UpgradeType.LookUp[UpgradeType.Blink].Done()) { agent.Order(917); } } else if (agent.Unit.UnitType == UnitTypes.WARP_GATE) { if (ProxyFourGateTask.Task.BuildRobo && Count(UnitTypes.ROBOTICS_FACILITY) == 0 && (Minerals() < 300 || Gas() < 150)) { return; } if (Completed(UnitTypes.ROBOTICS_FACILITY) > 0 && !RobosActive() && (Minerals() < 350 || Gas() < 150) && (Count(UnitTypes.IMMORTAL) < 2 || Count(UnitTypes.STALKER) >= 7)) { return; } if (Completed(UnitTypes.CYBERNETICS_CORE) > 0 && Minerals() >= 125 && Gas() >= 50 && DefendReapers && ReaperDefenseTask.Units.Count == 0) { Point2D aroundTile = SC2Util.To2D(bot.MapAnalyzer.StartLocation); Point2D placement = WarpInPlacer.FindPlacement(aroundTile, UnitTypes.STALKER); if (placement != null) { agent.Order(1414, placement); } } else if (Completed(UnitTypes.STALKER) >= 4 && Minerals() >= 100 && Bot.Main.EnemyRace == Race.Zerg && !Roach.Get().DetectedPreviously && Count(UnitTypes.ZEALOT) < Count(UnitTypes.STALKER)) { Point2D aroundTile = ProxyFourGateTask.Task.GetHideLocation(); if (aroundTile == null) { aroundTile = SC2Util.To2D(bot.MapAnalyzer.StartLocation); } Point2D placement = WarpInPlacer.FindPlacement(aroundTile, UnitTypes.ZEALOT); if (placement != null) { agent.Order(1413, placement); } } else if (Completed(UnitTypes.CYBERNETICS_CORE) > 0 && Minerals() >= 125 && Gas() >= 50) { Point2D aroundTile = ProxyFourGateTask.Task.GetHideLocation(); if (aroundTile == null) { aroundTile = SC2Util.To2D(bot.MapAnalyzer.StartLocation); } Point2D placement = WarpInPlacer.FindPlacement(aroundTile, UnitTypes.STALKER); if (placement != null) { agent.Order(1414, placement); } } } else if (agent.Unit.UnitType == UnitTypes.ROBOTICS_FACILITY) { if (Count(UnitTypes.OBSERVER) == 0 && Minerals() >= 25 && Gas() >= 75 && FoodLeft() >= 1) { agent.Order(977); } else if (Minerals() >= 275 && Gas() >= 100 && FoodLeft() >= 4) { agent.Order(979); } } }
private bool WarpIn(Agent warpGate, TrainingType trainType) { int framesSinceLastWarpIn = Bot.Main.Frame - LastWarpInFrame; if (framesSinceLastWarpIn <= 4) { foreach (Agent agent in Bot.Main.Units()) { if (agent.DistanceSq(LastWarpInLocation) <= 0.5f * 0.5f) { LastWarpInFrame = 0; break; } } } Point2D aroundTile; Point2D placement; if (WarpInLocation != null) { aroundTile = WarpInLocation; placement = WarpInPlacer.FindPlacement(aroundTile, trainType.UnitType); if (placement != null) { if (framesSinceLastWarpIn >= 10) { LastWarpInFrame = Bot.Main.Frame; LastWarpInLocation = placement; } warpGate.Order((int)trainType.WarpInAbility, placement); return(true); } } if (Bot.Main.BaseManager.Natural.Owner == Bot.Main.PlayerId && Bot.Main.BaseManager.Natural.BuildingsCompleted.ContainsKey(UnitTypes.PYLON) && Bot.Main.BaseManager.Natural.BuildingsCompleted[UnitTypes.PYLON] >= 1) { aroundTile = Bot.Main.BaseManager.Natural.OppositeMineralLinePos; placement = WarpInPlacer.FindPlacement(aroundTile, trainType.UnitType); if (placement != null) { if (framesSinceLastWarpIn >= 10) { LastWarpInFrame = Bot.Main.Frame; LastWarpInLocation = placement; } warpGate.Order((int)trainType.WarpInAbility, placement); return(true); } } aroundTile = SC2Util.To2D(Bot.Main.MapAnalyzer.StartLocation); placement = WarpInPlacer.FindPlacement(aroundTile, trainType.UnitType); if (placement != null) { if (framesSinceLastWarpIn >= 10) { LastWarpInFrame = Bot.Main.Frame; LastWarpInLocation = placement; } warpGate.Order((int)trainType.WarpInAbility, placement); Bot.Main.UnitManager.UnitTraining(trainType.UnitType); return(true); } return(false); }
public override void OnFrame(Bot bot) { UpdateWarpingInUnits(); Point2D armyLocation = GetArmyFrontPosition(); Point2D closestEnemyToArmy = armyLocation == null ? null : GetClosestEnemy(armyLocation, false); if (closestEnemyToArmy != null && SC2Util.DistanceSq(closestEnemyToArmy, armyLocation) <= 6 * 6) { armyLocation = new PotentialHelper(armyLocation, 4).From(closestEnemyToArmy).Get(); } if (armyLocation != null) { if (Units.Count >= 1) { bot.DrawSphere(new Point() { X = armyLocation.X, Y = armyLocation.Y, Z = Units[0].Unit.Pos.Z }); } DeterminePickupTargets(armyLocation); } foreach (Agent agent in Units) { Point2D closestEnemy = GetClosestEnemy(SC2Util.To2D(agent.Unit.Pos), false); Point2D closestAirEnemy = GetClosestEnemy(SC2Util.To2D(agent.Unit.Pos), true); float enemyDist = closestEnemy == null ? 1000000 : agent.DistanceSq(closestEnemy); float airEnemyDist = closestAirEnemy == null ? 1000000 : agent.DistanceSq(closestAirEnemy); if (agent.Unit.UnitType == UnitTypes.WARP_PRISM && agent.Unit.Passengers.Count < (airEnemyDist < 5 * 5 ? 1 : 2) && agent.Unit.Health + agent.Unit.Shield >= 60) { bool pickingUp = false; foreach (WarpPrismObjective objective in Objectives) { if (objective is PickUpObjective) { ulong tag = ((PickUpObjective)objective).UnitTag; pickingUp = true; agent.Order(911, tag); break; } } if (pickingUp) { continue; } } if (enemyDist < 6 * 6 && agent.Unit.UnitType == UnitTypes.WARP_PRISM_PHASING) { if (!WarpInInProgress) { agent.Order(Abilities.WarpPrismTransportMode); } continue; } if (enemyDist >= 5 * 5 && agent.Unit.Passengers.Count > 0) { agent.Order(913, SC2Util.To2D(agent.Unit.Pos)); continue; } if (enemyDist <= 8 * 8 && agent.Unit.UnitType == UnitTypes.WARP_PRISM) { Point2D fleePos = new PotentialHelper(agent.Unit.Pos, 6).From(closestEnemy).Get(); agent.Order(Abilities.MOVE, fleePos); continue; } if (armyLocation == null) { agent.Order(Abilities.MOVE, bot.BaseManager.NaturalDefensePos); continue; } if ((agent.DistanceSq(armyLocation) >= 10 * 10 || Bot.Main.Frame - WarpInStartFrane >= 22.4 * 20) && agent.Unit.UnitType == UnitTypes.WARP_PRISM_PHASING && !WarpInInProgress && (!WarpInObjectiveSet() || Bot.Main.Frame - WarpInStartFrane >= 22.4 * 20)) { agent.Order(Abilities.WarpPrismTransportMode); continue; } /* * if (agent.Unit.UnitType == UnitTypes.WARP_PRISM * && agent.DistanceSq(armyLocation) >= 10 * 10) * { * agent.Order(Abilities.MOVE, armyLocation); * continue; * } */ if (agent.Unit.UnitType == UnitTypes.WARP_PRISM && WarpInObjectiveSet()) { WarpInStartFrane = bot.Frame; agent.Order(Abilities.WarpPrismPhasingMode); continue; } if (agent.Unit.UnitType == UnitTypes.WARP_PRISM && agent.DistanceSq(armyLocation) >= 4 * 4) { agent.Order(Abilities.MOVE, armyLocation); continue; } if (agent.Unit.UnitType == UnitTypes.WARP_PRISM_PHASING) { WarpInObjective warpInObjective = null; foreach (WarpPrismObjective objective in Objectives) { if (objective is WarpInObjective) { warpInObjective = (WarpInObjective)objective; break; } } if (warpInObjective != null) { Point2D warpInLocation = WarpInPlacer.FindPlacement(SC2Util.To2D(agent.Unit.Pos), warpInObjective.UnitType); WarpIn(warpInLocation, warpInObjective.UnitType); } } } }