Exemplo n.º 1
0
        public void DetermineNextBuilding(Dictionary <uint, int> unitCounts)
        {
            if (BuildRequests.Count > 0)
            {
                return;
            }
            Dictionary <uint, int> desiredUnitCounts = new Dictionary <uint, int>();

            foreach (ProxyBuilding building in Buildings)
            {
                if (!building.Test())
                {
                    continue;
                }
                CollectionUtil.Add(desiredUnitCounts, building.UnitType, building.Number);

                if (desiredUnitCounts[building.UnitType] > CollectionUtil.Get(unitCounts, building.UnitType))
                {
                    BuildingType buildingType = BuildingType.LookUp[building.UnitType];
                    Point2D      placement    = ProxyBuildingPlacer.FindPlacement(GetHideLocation(), buildingType.Size, building.UnitType);
                    if (placement != null)
                    {
                        BuildRequests.Add(new BuildRequest()
                        {
                            Type = building.UnitType, Pos = placement
                        });
                    }
                    return;
                }
            }
        }
Exemplo n.º 2
0
        public override void OnFrame(Bot bot)
        {
            BuildingType barracksType = BuildingType.LookUp[UnitTypes.BARRACKS];

            if (Bot.Main.UnitManager.Count(UnitTypes.BARRACKS) < 2 && bot.Minerals() >= 150 && BuildRequests.Count == 0)
            {
                Point2D placement = ProxyBuildingPlacer.FindPlacement(GetHideLocation(), barracksType.Size, UnitTypes.BARRACKS);
                BuildRequests.Add(new BuildRequest()
                {
                    Type = UnitTypes.BARRACKS, Pos = placement
                });
            }
            else if (Bot.Main.UnitManager.Count(UnitTypes.BUNKER) < 2 && bot.Minerals() >= 100 && BuildRequests.Count == 0 && bot.UnitManager.Completed(UnitTypes.BARRACKS) > 0 && bot.UnitManager.Count(UnitTypes.BARRACKS) >= 2)
            {
                PotentialHelper helper = new PotentialHelper(bot.MapAnalyzer.GetEnemyNatural().Pos);
                helper.Magnitude = 4;
                helper.From(bot.MapAnalyzer.GetEnemyRamp(), 1);
                Point2D placement = ProxyBuildingPlacer.FindPlacement(helper.Get(), barracksType.Size, UnitTypes.BUNKER);
                BuildRequests.Add(new BuildRequest()
                {
                    Type = UnitTypes.BUNKER, Pos = placement
                });
            }
            else if (Bot.Main.UnitManager.Count(UnitTypes.BUNKER) >= 2 && bot.Minerals() >= 100 && BuildRequests.Count == 0 && bot.UnitManager.Count(UnitTypes.SIEGE_TANK) >= 2 && bot.UnitManager.Count(UnitTypes.BARRACKS) >= 2 && bot.UnitManager.Completed(UnitTypes.ENGINEERING_BAY) >= 1 && bot.UnitManager.Count(UnitTypes.MISSILE_TURRET) < 2)
            {
                PotentialHelper helper = new PotentialHelper(bot.MapAnalyzer.GetEnemyNatural().Pos);
                helper.Magnitude = 4;
                helper.From(bot.MapAnalyzer.GetEnemyRamp(), 1);
                Point2D placement = ProxyBuildingPlacer.FindPlacement(helper.Get(), new Point2D()
                {
                    X = 2, Y = 2
                }, UnitTypes.MISSILE_TURRET);
                BuildRequests.Add(new BuildRequest()
                {
                    Type = UnitTypes.MISSILE_TURRET, Pos = placement
                });
            }

            List <BuildRequest> doneRequests = new List <BuildRequest>();

            foreach (BuildRequest request in BuildRequests)
            {
                if (request.worker != null && !Bot.Main.UnitManager.Agents.ContainsKey(request.worker.Unit.Tag))
                {
                    request.worker = null;
                }
                if (request.worker == null)
                {
                    foreach (Agent agent in Units)
                    {
                        if (BuildingType.BuildingAbilities.Contains((int)agent.CurrentAbility()))
                        {
                            continue;
                        }
                        request.worker = agent;
                        break;
                    }
                }

                if (!ProxyBuildingPlacer.CheckPlacement(request.Pos, BuildingType.LookUp[request.Type].Size, request.Type, null, true))
                {
                    doneRequests.Add(request);
                    continue;
                }
                foreach (Agent agent in bot.UnitManager.Agents.Values)
                {
                    if (agent.Unit.UnitType == request.Type &&
                        agent.DistanceSq(request.Pos) < 4)
                    {
                        doneRequests.Add(request);
                        break;
                    }
                }
            }

            foreach (BuildRequest request in doneRequests)
            {
                BuildRequests.Remove(request);
            }

            Agent bunker = null;

            foreach (Agent agent in bot.UnitManager.Agents.Values)
            {
                if (agent.Unit.UnitType != UnitTypes.BUNKER)
                {
                    continue;
                }
                if (agent.Unit.BuildProgress < 0.99)
                {
                    continue;
                }
                if (bunker == null || agent.Unit.Health < agent.Unit.HealthMax)
                {
                    bunker = agent;
                }
            }
            Agent bc = null;

            foreach (Agent agent in bot.UnitManager.Agents.Values)
            {
                if (agent.Unit.UnitType != UnitTypes.BATTLECRUISER)
                {
                    continue;
                }
                if (bunker == null || agent.DistanceSq(bunker.Unit.Pos) >= 5 * 5)
                {
                    continue;
                }
                if (agent.Unit.Health < agent.Unit.HealthMax)
                {
                    bc = agent;
                }
            }

            foreach (Agent agent in Units)
            {
                bool building = false;
                foreach (BuildRequest request in BuildRequests)
                {
                    if (request.worker == null || request.worker.Unit.Tag != agent.Unit.Tag)
                    {
                        continue;
                    }

                    building = true;
                    agent.Order(BuildingType.LookUp[request.Type].Ability, request.Pos);
                    break;
                }
                if (building)
                {
                    continue;
                }

                if (bunker != null)
                {
                    if (bunker.Unit.Health < bunker.Unit.HealthMax)
                    {
                        agent.Order(Abilities.REPAIR, bunker.Unit.Tag);
                    }
                    else if (bc != null)
                    {
                        agent.Order(Abilities.REPAIR, bc.Unit.Tag);
                    }
                    else
                    {
                        agent.Order(Abilities.MOVE, bunker.From(bot.TargetManager.PotentialEnemyStartLocations[0], 3));
                    }
                    continue;
                }

                if (agent.DistanceSq(GetHideLocation()) >= 4 * 4)
                {
                    agent.Order(Abilities.MOVE, GetHideLocation());
                    continue;
                }
            }
        }
Exemplo n.º 3
0
        public override void OnFrame(Tyr tyr)
        {
            BuildingType pylonType    = BuildingType.LookUp[UnitTypes.PYLON];
            BuildingType gatewayType  = BuildingType.LookUp[UnitTypes.GATEWAY];
            Point2D      hideLocation = GetHideLocation();

            if (hideLocation == null)
            {
                return;
            }
            Agent pylon        = null;
            Agent gateway      = null;
            int   gatewayCount = 0;

            foreach (Agent agent in tyr.UnitManager.Agents.Values)
            {
                if (agent.Unit.UnitType != UnitTypes.PYLON &&
                    agent.Unit.UnitType != UnitTypes.GATEWAY &&
                    agent.Unit.UnitType != UnitTypes.WARP_GATE)
                {
                    continue;
                }
                if (agent.DistanceSq(HideLocation) > 20 * 20)
                {
                    continue;
                }
                if (agent.Unit.UnitType == UnitTypes.PYLON)
                {
                    pylon = agent;
                }
                else if (agent.Unit.UnitType == UnitTypes.GATEWAY || agent.Unit.UnitType == UnitTypes.WARP_GATE)
                {
                    gatewayCount++;
                    gateway = agent;
                }
            }
            if (pylon == null && tyr.Minerals() >= 100 && BuildRequests.Count == 0)
            {
                Point2D placement = ProxyBuildingPlacer.FindPlacement(GetHideLocation(), pylonType.Size, UnitTypes.PYLON);
                if (placement != null)
                {
                    BuildRequests.Add(new BuildRequest()
                    {
                        Type = UnitTypes.PYLON, Pos = placement
                    });
                }
            }
            else if (gatewayCount < 2 && pylon != null && pylon.Unit.BuildProgress > 0.99 && tyr.Minerals() >= 150)
            {
                Point2D placement = ProxyBuildingPlacer.FindPlacement(GetHideLocation(), gatewayType.Size, UnitTypes.GATEWAY);
                if (placement != null)
                {
                    BuildRequests.Add(new BuildRequest()
                    {
                        Type = UnitTypes.GATEWAY, Pos = placement
                    });
                }
            }

            List <BuildRequest> doneRequests = new List <BuildRequest>();

            foreach (BuildRequest request in BuildRequests)
            {
                if (request.worker != null && !Tyr.Bot.UnitManager.Agents.ContainsKey(request.worker.Unit.Tag))
                {
                    request.worker = null;
                }
                if (request.worker == null)
                {
                    foreach (Agent agent in Units)
                    {
                        if (BuildingType.BuildingAbilities.Contains((int)agent.CurrentAbility()))
                        {
                            continue;
                        }
                        request.worker = agent;
                        break;
                    }
                }

                if (!ProxyBuildingPlacer.CheckPlacement(request.Pos, BuildingType.LookUp[request.Type].Size, request.Type, null, true))
                {
                    doneRequests.Add(request);
                    continue;
                }
                foreach (Agent agent in tyr.UnitManager.Agents.Values)
                {
                    if (agent.Unit.UnitType == request.Type &&
                        agent.DistanceSq(request.Pos) < 4)
                    {
                        doneRequests.Add(request);
                        break;
                    }
                }
            }

            foreach (BuildRequest request in doneRequests)
            {
                BuildRequests.Remove(request);
            }

            foreach (Agent agent in Units)
            {
                bool building = false;
                foreach (BuildRequest request in BuildRequests)
                {
                    if (request.worker == null || request.worker.Unit.Tag != agent.Unit.Tag)
                    {
                        continue;
                    }

                    building = true;
                    if (agent.DistanceSq(request.Pos) <= 10 * 10)
                    {
                        agent.Order(BuildingType.LookUp[request.Type].Ability, request.Pos);
                    }
                    else
                    {
                        agent.Order(Abilities.MOVE, request.Pos);
                    }
                    break;
                }
                if (building)
                {
                    continue;
                }

                if (agent.DistanceSq(GetHideLocation()) >= 4 * 4)
                {
                    agent.Order(Abilities.MOVE, GetHideLocation());
                    continue;
                }
            }
        }
Exemplo n.º 4
0
        public override void OnFrame(Tyr tyr)
        {
            Point2D hideLocation = GetHideLocation();

            if (hideLocation == null)
            {
                return;
            }
            UnitCounts = new Dictionary <uint, int>();
            foreach (Agent agent in tyr.UnitManager.Agents.Values)
            {
                if (agent.DistanceSq(HideLocation) > 20 * 20)
                {
                    continue;
                }

                CollectionUtil.Increment(UnitCounts, agent.Unit.UnitType);
            }
            DetermineNextBuilding(UnitCounts);
            List <BuildRequest> doneRequests = new List <BuildRequest>();

            foreach (BuildRequest request in BuildRequests)
            {
                if (request.worker != null && !Tyr.Bot.UnitManager.Agents.ContainsKey(request.worker.Unit.Tag))
                {
                    request.worker = null;
                }
                if (request.worker == null)
                {
                    foreach (Agent agent in Units)
                    {
                        if (BuildingType.BuildingAbilities.Contains((int)agent.CurrentAbility()))
                        {
                            continue;
                        }
                        request.worker = agent;
                        break;
                    }
                }

                if (!ProxyBuildingPlacer.CheckPlacement(request.Pos, BuildingType.LookUp[request.Type].Size, request.Type, null, true))
                {
                    doneRequests.Add(request);
                    continue;
                }
                foreach (Agent agent in tyr.UnitManager.Agents.Values)
                {
                    if (agent.Unit.UnitType == request.Type &&
                        agent.DistanceSq(request.Pos) < 4)
                    {
                        doneRequests.Add(request);
                        break;
                    }
                }
            }

            foreach (BuildRequest request in doneRequests)
            {
                BuildRequests.Remove(request);
            }

            foreach (Agent agent in Units)
            {
                if (EvadeEnemies)
                {
                    float dist   = 20 * 20;
                    Unit  target = null;
                    foreach (Unit enemy in Tyr.Bot.Enemies())
                    {
                        if (!UnitTypes.CombatUnitTypes.Contains(enemy.UnitType))
                        {
                            continue;
                        }
                        if (!UnitTypes.CanAttackGround(enemy.UnitType))
                        {
                            continue;
                        }
                        float newDist = agent.DistanceSq(enemy);
                        if (newDist > dist)
                        {
                            continue;
                        }
                        dist   = newDist;
                        target = enemy;
                    }
                    if (target != null)
                    {
                        Tyr.Bot.DrawLine(agent.Unit.Pos, target.Pos);
                        agent.Order(Abilities.MOVE, agent.From(target, 4));
                        continue;
                    }
                }

                bool building = false;
                foreach (BuildRequest request in BuildRequests)
                {
                    if (request.worker == null || request.worker.Unit.Tag != agent.Unit.Tag)
                    {
                        continue;
                    }

                    building = true;
                    if (agent.DistanceSq(request.Pos) <= 10 * 10)
                    {
                        agent.Order(BuildingType.LookUp[request.Type].Ability, request.Pos);
                    }
                    else
                    {
                        agent.Order(Abilities.MOVE, request.Pos);
                    }
                    break;
                }
                if (building)
                {
                    continue;
                }

                if (agent.DistanceSq(GetHideLocation()) >= 4 * 4)
                {
                    agent.Order(Abilities.MOVE, GetHideLocation());
                    continue;
                }
            }
        }