Esempio n. 1
0
 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);
         }
     }
 }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
                    }
                }
            }
        }