コード例 #1
0
ファイル: PvPAdeptAllIn.cs プロジェクト: kblood/TyrSc2
        public override void OnFrame(Tyr tyr)
        {
            if (!ChatMessageSent)
            {
                if (Completed(UnitTypes.ADEPT_PHASE_SHIFT) > 0)
                {
                    tyr.Chat("As requested by AndyMan, we're doing some Adept harass!");
                    ChatMessageSent = true;
                }
            }
            AdeptPhaseEnemyMainController.Stopped = tyr.Frame >= 22.4 * 60 * 6 && TotalEnemyCount(UnitTypes.IMMORTAL) == 0;
            ForwardProbeTask.Task.EnemyBaseRange  = 80;

            ForwardProbeTask.Task.Stopped = tyr.Frame < 22.4 * 165 || SkippedNatural.Get().Detected;
            if (ForwardProbeTask.Task.Stopped)
            {
                ForwardProbeTask.Task.Clear();
            }
        }
コード例 #2
0
ファイル: SCVRush.cs プロジェクト: slemvs/TyrSc2
        public override void OnFrame(Tyr tyr)
        {
            if (!MessageSent)
            {
                if (tyr.Enemies().Count > 0)
                {
                    MessageSent = true;
                    tyr.Chat("Prepare to be TICKLED! :D");
                }
            }

            if (tyr.Frame - LastReinforcementsFrame >= 100 &&
                WorkerTask.Task.Units.Count >= (tyr.EnemyStrategyAnalyzer.LiftingDetected ? 22 : 12) &&
                !tyr.EnemyStrategyAnalyzer.LiftingDetected)
            {
                LastReinforcementsFrame     = tyr.Frame;
                WorkerRushTask.TakeWorkers += 6;
            }
        }
コード例 #3
0
ファイル: WorkerRush.cs プロジェクト: slemvs/TyrSc2
        public override void OnFrame(Tyr tyr)
        {
            if (tyr.EnemyStrategyAnalyzer.LiftingDetected)
            {
                int surfaceEnemies = 0;
                foreach (Unit unit in tyr.Enemies())
                {
                    if (!unit.IsFlying)
                    {
                        surfaceEnemies++;
                    }
                }

                if (surfaceEnemies < 3 && WorkerTask.Task.Units.Count < 16)
                {
                    WorkerRushTask.Clear();
                    WorkerRushTask.Stopped = true;
                }
            }

            if (!MessageSent)
            {
                if (tyr.Enemies().Count > 0)
                {
                    MessageSent = true;
                    tyr.Chat("Prepare to be TICKLED! :D");
                }
            }

            if (tyr.Frame - LastReinforcementsFrame >= 100 &&
                WorkerTask.Task.Units.Count >= (tyr.EnemyStrategyAnalyzer.LiftingDetected ? 22 : 12) &&
                !tyr.EnemyStrategyAnalyzer.LiftingDetected)
            {
                LastReinforcementsFrame     = tyr.Frame;
                WorkerRushTask.TakeWorkers += 6;
            }
        }
コード例 #4
0
ファイル: PvZMassPhoenix.cs プロジェクト: kblood/TyrSc2
        public override void OnFrame(Tyr tyr)
        {
            if (Tyr.Bot.Frame == (int)(45 * 22.4))
            {
                tyr.Chat("This build was requested by Infy!");
            }
            foreach (Agent agent in tyr.UnitManager.Agents.Values)
            {
                if (tyr.Frame % 224 != 0)
                {
                    break;
                }
                if (agent.Unit.UnitType != UnitTypes.GATEWAY)
                {
                    continue;
                }

                if (Count(UnitTypes.NEXUS) < 2 && TimingAttackTask.Task.Units.Count == 0)
                {
                    agent.Order(Abilities.MOVE, Main.BaseLocation.Pos);
                }
                else
                {
                    agent.Order(Abilities.MOVE, tyr.TargetManager.PotentialEnemyStartLocations[0]);
                }
            }

            BalanceGas();


            tyr.TargetManager.TargetCannons = true;


            if (WorkerScoutTask.Task.BaseCircled())
            {
                WorkerScoutTask.Task.Stopped = true;
                WorkerScoutTask.Task.Clear();
            }


            WorkerScoutTask.Task.StartFrame = 600;
            ObserverScoutTask.Task.Priority = 6;

            tyr.NexusAbilityManager.Stopped = Count(UnitTypes.STALKER) == 0 && tyr.Frame >= 120 * 22.4;
            tyr.NexusAbilityManager.PriotitizedAbilities.Add(917);

            TimingAttackTask.Task.RequiredSize = 25;

            TimingAttackTask.Task.Stopped = Completed(UnitTypes.STALKER) + Completed(UnitTypes.ZEALOT) < 5;

            if (ForwardProbeTask.Task.Stopped)
            {
                ForwardProbeTask.Task.Clear();
            }


            if (Count(UnitTypes.NEXUS) <= 1)
            {
                IdleTask.Task.OverrideTarget = OverrideMainDefenseTarget;
            }
            else if (Count(UnitTypes.NEXUS) >= 3)
            {
                IdleTask.Task.OverrideTarget = OverrideDefenseTarget;
            }
            else
            {
                IdleTask.Task.OverrideTarget = null;
            }

            DefenseTask.GroundDefenseTask.ExpandDefenseRadius = 30;
            DefenseTask.GroundDefenseTask.MainDefenseRadius   = 30;
            DefenseTask.GroundDefenseTask.MaxDefenseRadius    = 120;
            DefenseTask.GroundDefenseTask.DrawDefenderRadius  = 80;

            DefenseTask.AirDefenseTask.ExpandDefenseRadius = 30;
            DefenseTask.AirDefenseTask.MainDefenseRadius   = 30;
            DefenseTask.AirDefenseTask.MaxDefenseRadius    = 120;
            DefenseTask.AirDefenseTask.DrawDefenderRadius  = 80;
        }
コード例 #5
0
        public override void OnFrame(Tyr tyr)
        {
            tyr.NexusAbilityManager.PriotitizedAbilities.Add(948);
            tyr.NexusAbilityManager.PriotitizedAbilities.Add(950);
            tyr.buildingPlacer.BuildCompact = true;

            FlyerAttackTask.Task.RequiredSize = RequiredSize;
            IdleTask.Task.FearEnemies         = true;

            DefenseTask.Task.IgnoreEnemyTypes.Add(UnitTypes.VIKING_FIGHTER);

            FlyerDestroyTask.Task.Stopped = !DefendReapers;
            FlyerAttackTask.Task.Stopped  = DefendReapers;

            if (Count(UnitTypes.PROBE) <= 18)
            {
                BaseWorkers.WorkersPerGas = 0;
            }
            else
            {
                BaseWorkers.WorkersPerGas = 3;
            }

            if (tyr.EnemyRace == Race.Zerg)
            {
                Beyond2Cannons = tyr.EnemyStrategyAnalyzer.TotalCount(UnitTypes.ZERGLING) > 0 || Count(UnitTypes.STARGATE) >= 3;
            }

            if (tyr.Frame == 118)
            {
                tyr.Chat("Time for some monobattles!");
            }
            if (tyr.Frame == 163)
            {
                if (BuildCarriers)
                {
                    tyr.Chat("I choose Carriers! :D");
                }
                else
                {
                    tyr.Chat("I choose Skillrays! :D");
                }
            }

            if (!LiftingDetected)
            {
                foreach (Unit unit in tyr.Enemies())
                {
                    if (unit.IsFlying && UnitTypes.BuildingTypes.Contains(unit.UnitType))
                    {
                        LiftingDetected = true;
                    }
                }
            }

            if (LiftingDetected && tyr.EnemyManager.EnemyBuildings.Count == 0 && !ChasingLiftedBuildings)
            {
                ChasingLiftedBuildings = true;
                tyr.TaskManager.Add(new ElevatorChaserTask());
            }


            if (!DefendRush && tyr.Frame <= 4800 && Tyr.Bot.EnemyRace != Race.Zerg)
            {
                int enemyCount = 0;
                foreach (Unit enemy in tyr.Enemies())
                {
                    if (SC2Util.DistanceSq(enemy.Pos, tyr.MapAnalyzer.StartLocation) <= 40 * 40)
                    {
                        enemyCount++;
                    }
                }

                if (enemyCount >= 3)
                {
                    DefendRush = true;
                }
            }

            if ((tyr.EnemyRace == Race.Terran || tyr.EnemyRace == Race.Random) &&
                ReaperDefenseCannonStep.DesiredPos == null &&
                !SkipDefenses)
            {
                foreach (Unit unit in tyr.Enemies())
                {
                    if (unit.UnitType == UnitTypes.REAPER &&
                        Tyr.Bot.MapAnalyzer.StartArea[(int)System.Math.Round(unit.Pos.X), (int)System.Math.Round(unit.Pos.Y)])
                    {
                        Point2D dir    = SC2Util.Point(unit.Pos.X - tyr.MapAnalyzer.StartLocation.X, unit.Pos.Y - tyr.MapAnalyzer.StartLocation.Y);
                        float   length = (float)System.Math.Sqrt(dir.X * dir.X + dir.Y * dir.Y);
                        dir = SC2Util.Point(dir.X / length, dir.Y / length);

                        ReaperDefenseCannonStep.DesiredPos = SC2Util.Point(tyr.MapAnalyzer.StartLocation.X + dir.X * 4f, tyr.MapAnalyzer.StartLocation.Y + dir.Y * 4f);
                        break;
                    }
                }
            }

            if (!DefendReapers && tyr.EnemyStrategyAnalyzer.Count(UnitTypes.REAPER) >= 2)
            {
                FearVikingsController.Stopped = false;
                DefendReapers = true;
                tyr.buildingPlacer.SpreadCannons = false;
                tyr.buildingPlacer.BuildCompact  = true;
                WorkerTask.Task.StopTransfers    = true;
                HideBaseTask.Task.BuildNexus     = true;

                IdleTask.Task.OverrideTarget = FarBase.BaseLocation.Pos;
                DefenseTask.Task.Stopped     = true;
                RequiredSize = 8;

                Set  = new BuildSet();
                Set += HiddenBasePylons();
                Set += HiddenBaseBuild();
            }

            /*
             * if (tyr.EnemyStrategyAnalyzer.Count(UnitTypes.REAPER) >= 2
             *  && NaturalMirrorCannonStep.DesiredBase == null)
             * {
             *  PotentialHelper helper = new PotentialHelper(tyr.BaseManager.Natural.BaseLocation.Pos);
             *  helper.Magnitude = 8;
             *  helper.From(tyr.BaseManager.NaturalDefensePos);
             *  NaturalMirrorCannonStep.DesiredPos = helper.Get();
             *  NaturalMirrorPylonStep.DesiredPos = helper.Get();
             * }
             */
        }
コード例 #6
0
        public override void OnFrame(Tyr tyr)
        {
            DefendMarines = tyr.EnemyStrategyAnalyzer.TotalCount(UnitTypes.BARRACKS) >= 3 &&
                            tyr.EnemyStrategyAnalyzer.TotalCount(UnitTypes.REFINERY) == 0 &&
                            tyr.EnemyStrategyAnalyzer.TotalCount(UnitTypes.REAPER) == 0 &&
                            false;

            if (tyr.EnemyStrategyAnalyzer.TotalCount(UnitTypes.REAPER) >= 3 && tyr.Frame <= 210 * 22.4)
            {
                DefendReapers = true;
                RequiredSize  = 6;
            }

            if (RequiredSize > 6)
            {
                if (Completed(UnitTypes.CARRIER) >= 12)
                {
                    RequiredSize = 6;
                }

                foreach (Unit enemy in tyr.Enemies())
                {
                    if ((enemy.UnitType == UnitTypes.MARAUDER ||
                         enemy.UnitType == UnitTypes.MARAUDER) &&
                        SC2Util.DistanceSq(tyr.MapAnalyzer.StartLocation, enemy.Pos) <= 40 * 40)
                    {
                        RequiredSize = 6;
                        break;
                    }
                }
            }

            foreach (Task task in WorkerDefenseTask.Tasks)
            {
                task.Stopped = true;
            }
            tyr.buildingPlacer.BuildCompact = true;
            WorkerTask.Task.StopTransfers   = true;
            HideBaseTask.Task.MoveOutFrame  = 672;
            ConstructionTask.Task.CancelBlockedBuildings = false;
            ConstructionTask.Task.OnlyCloseWorkers       = false;
            ConstructionTask.Task.MaxWorkerDist          = 30;

            tyr.NexusAbilityManager.PriotitizedAbilities.Add(948);
            tyr.NexusAbilityManager.PriotitizedAbilities.Add(950);

            tyr.DrawText("Required size: " + RequiredSize);
            FlyerAttackTask.Task.RequiredSize  = RequiredSize;
            FlyerDestroyTask.Task.RequiredSize = RequiredSize;
            IdleTask.Task.FearEnemies          = true;

            DefenseTask.AirDefenseTask.IgnoreEnemyTypes.Add(UnitTypes.VIKING_FIGHTER);

            if (Count(UnitTypes.PROBE) <= 6)
            {
                BaseWorkers.WorkersPerGas = 0;
            }
            else if (Count(UnitTypes.PROBE) <= 12)
            {
                BaseWorkers.WorkersPerGas = 1;
            }
            else if (Count(UnitTypes.PROBE) <= 18)
            {
                BaseWorkers.WorkersPerGas = 2;
            }
            else
            {
                BaseWorkers.WorkersPerGas = 3;
            }

            if (tyr.Frame == 118)
            {
                tyr.Chat("Time for some monobattles!");
            }
            if (tyr.Frame == 163)
            {
                if (BuildCarriers)
                {
                    tyr.Chat("I choose Carriers! :D");
                }
                else
                {
                    tyr.Chat("I choose Skillrays! :D");
                }
            }

            if (!LiftingDetected)
            {
                foreach (Unit unit in tyr.Enemies())
                {
                    if (unit.IsFlying && UnitTypes.BuildingTypes.Contains(unit.UnitType))
                    {
                        LiftingDetected = true;
                    }
                }
            }

            if (LiftingDetected && tyr.EnemyManager.EnemyBuildings.Count == 0 && !ChasingLiftedBuildings)
            {
                ChasingLiftedBuildings = true;
                tyr.TaskManager.Add(new ElevatorChaserTask());
            }


            if (!DefendRush && tyr.Frame <= 4800 && Tyr.Bot.EnemyRace != Race.Zerg)
            {
                int enemyCount = 0;
                foreach (Unit enemy in tyr.Enemies())
                {
                    if (SC2Util.DistanceSq(enemy.Pos, tyr.MapAnalyzer.StartLocation) <= 40 * 40)
                    {
                        enemyCount++;
                    }
                }

                if (enemyCount >= 3)
                {
                    DefendRush = true;
                }
            }

            if (Count(UnitTypes.STARGATE) > 0)
            {
                HideBaseTask.Task.BuildNexus = true;
            }
        }
コード例 #7
0
ファイル: TempestProxy.cs プロジェクト: kblood/TyrSc2
        public override void OnFrame(Tyr tyr)
        {
            if (!ChatMessageSent)
            {
                if (Completed(UnitTypes.TEMPEST) > 0)
                {
                    tyr.Chat("This build is dedicated to Andyman!");
                    ChatMessageSent = true;
                }
            }

            if (HideLocation == null)
            {
                HideLocation = ProxyTask.Task.GetHideLocation();
            }
            if (HideLocation != null)
            {
                if (ProxyTask.Task.UnitCounts.ContainsKey(UnitTypes.PYLON) &&
                    ProxyTask.Task.UnitCounts[UnitTypes.PYLON] > 0 &&
                    ProxyTask.Task.UnitCounts.ContainsKey(UnitTypes.STARGATE) &&
                    ProxyTask.Task.UnitCounts[UnitTypes.STARGATE] > 0)
                {
                    float dist      = 10 * 10;
                    Unit  fleeEnemy = null;
                    foreach (Unit enemy in tyr.Enemies())
                    {
                        if (!UnitTypes.CanAttackAir(enemy.UnitType))
                        {
                            continue;
                        }
                        float newDist = SC2Util.DistanceSq(enemy.Pos, HideLocation);
                        if (newDist > dist)
                        {
                            continue;
                        }
                        dist      = newDist;
                        fleeEnemy = enemy;
                    }
                    if (fleeEnemy != null)
                    {
                        TempestController.RetreatPos = new PotentialHelper(HideLocation, 6).From(fleeEnemy.Pos).Get();
                    }
                    else
                    {
                        TempestController.RetreatPos = HideLocation;
                    }
                }
                else
                {
                    TempestController.RetreatPos = null;
                }
            }
            if (TempestController.RetreatPos == null)
            {
                TempestController.RetreatPos = ProxyTask.Task.GetHideLocation();
            }

            DepoweredStargates = 0;
            foreach (Agent agent in tyr.Units())
            {
                if (agent.Unit.UnitType == UnitTypes.STARGATE &&
                    !agent.Unit.IsPowered &&
                    agent.Unit.BuildProgress >= 0.99)
                {
                    DepoweredStargates++;
                }
            }
            tyr.DrawText("DepoweredStargates: " + DepoweredStargates);

            tyr.NexusAbilityManager.PriotitizedAbilities.Add(1568);
            ProxyTask.Task.EvadeEnemies = true;

            tyr.buildingPlacer.BuildCompact      = true;
            tyr.TargetManager.PrefferDistant     = false;
            tyr.TargetManager.TargetAllBuildings = true;


            TrainStep.WarpInLocation = ProxyTask.Task.GetHideLocation();
            DefendRegionTask.Task.DefenseLocation = ProxyTask.Task.GetHideLocation();


            TimingAttackTask.Task.RequiredSize = 1;
            TimingAttackTask.Task.RetreatSize  = 0;
            TimingAttackTask.Task.UnitType     = UnitTypes.TEMPEST;


            if (tyr.Frame >= 22.4 * 60 * 4)
            {
                ProxyTask.Task.Stopped = true;
            }
            else
            {
                ProxyTask.Task.Stopped = Count(UnitTypes.GATEWAY) == 0;
                if (ProxyTask.Task.Stopped)
                {
                    ProxyTask.Task.Clear();
                }
            }
            if (UpgradeType.LookUp[UpgradeType.WarpGate].Progress() >= 0.5 &&
                IdleTask.Task.OverrideTarget == null &&
                (tyr.EnemyRace != Race.Protoss || tyr.Frame >= 22.4 * 4 * 60))
            {
                IdleTask.Task.OverrideTarget = tyr.MapAnalyzer.Walk(ProxyTask.Task.GetHideLocation(), tyr.MapAnalyzer.EnemyDistances, 10);
            }

            foreach (Agent agent in tyr.UnitManager.Agents.Values)
            {
                if (tyr.Frame % 224 != 0)
                {
                    break;
                }
                if (agent.Unit.UnitType != UnitTypes.GATEWAY)
                {
                    continue;
                }

                agent.Order(Abilities.MOVE, agent.From(tyr.MapAnalyzer.GetMainRamp(), 4));
            }
        }
コード例 #8
0
ファイル: PvTStalkerImmortal.cs プロジェクト: kblood/TyrSc2
        public override void OnFrame(Tyr tyr)
        {
            BalanceGas();

            ReaperDefenseTask.Stopped = Completed(UnitTypes.STALKER) < 4 || TimingAttackTask.Task.AttackSent || Completed(UnitTypes.PHOENIX) > 0;
            if (ReaperDefenseTask.Stopped)
            {
                ReaperDefenseTask.Clear();
            }
            if (ReaperDefenseTask.Stopped)
            {
                DefenseTask.GroundDefenseTask.IgnoreEnemyTypes.Remove(UnitTypes.REAPER);
            }
            else
            {
                DefenseTask.GroundDefenseTask.IgnoreEnemyTypes.Add(UnitTypes.REAPER);
            }

            tyr.NexusAbilityManager.Stopped = Count(UnitTypes.STALKER) == 0;
            tyr.NexusAbilityManager.PriotitizedAbilities.Add(917);

            if (TotalEnemyCount(UnitTypes.BANSHEE) > 0)
            {
                StutterForwardController.Stopped = false;
                StutterController.Stopped        = true;
            }
            else
            {
                StutterForwardController.Stopped = true;
                StutterController.Stopped        = false;
            }

            SaveWorkersTask.Task.Stopped = tyr.Frame >= 22.4 * 60 * 7 || EnemyCount(UnitTypes.CYCLONE) == 0 || !Natural.UnderAttack;
            if (SaveWorkersTask.Task.Stopped)
            {
                SaveWorkersTask.Task.Clear();
            }

            if (tyr.Observation.Chat != null && SendAirUnitsText == -1)
            {
                foreach (ChatReceived chat in tyr.Observation.Chat)
                {
                    if (chat.PlayerId == tyr.PlayerId)
                    {
                        continue;
                    }
                    if (chat.Message.ToLower().Contains("air"))
                    {
                        SendAirUnitsText = tyr.Frame + 67;
                    }
                }
            }

            if (tyr.Frame == SendAirUnitsText)
            {
                tyr.Chat("Yes, I am going for air units! How do you like my Phoenixes? :D");
            }

            foreach (Agent agent in tyr.Units())
            {
                if (LiftedTextSent)
                {
                    break;
                }
                if (agent.Unit.UnitType != UnitTypes.PHOENIX)
                {
                    continue;
                }
                if (agent.PreviousUnit == null)
                {
                    continue;
                }
                if (agent.PreviousUnit.Energy - agent.Unit.Energy >= 45)
                {
                    LiftedTextSent = true;
                    tyr.Chat("I love your micro! Those flying Cyclones look especially scary!");
                }
            }



            foreach (ActionError error in tyr.Observation.ActionErrors)
            {
                DebugUtil.WriteLine("Error with ability " + error.AbilityId + ": " + error.Result);
            }


            if (!MedivacsSpotted && EnemyCount(UnitTypes.MEDIVAC) > 0)
            {
                MedivacsSpotted      = true;
                MedivacsSpottedFrame = tyr.Frame;
            }

            DefenseTask.GroundDefenseTask.IncludePhoenixes = EnemyCount(UnitTypes.CYCLONE) > 0;

            if (MedivacsSpotted && tyr.Frame - MedivacsSpottedFrame <= 22.4 * 30)
            {
                IdleTask.Task.OverrideTarget = DefendDropsPos;
                DefenseTask.AirDefenseTask.IgnoreEnemyTypes.Add(UnitTypes.MEDIVAC);
            }
            else
            {
                IdleTask.Task.OverrideTarget = null;
                DefenseTask.AirDefenseTask.IgnoreEnemyTypes.Remove(UnitTypes.MEDIVAC);
            }

            WorkerTask.Task.EvacuateThreatenedBases = true;

            if (!BansheesDetected &&
                tyr.Frame >= 22.4 * 60 * 6 &&
                tyr.Frame < 22.4 * 60 * 9.5 &&
                !MedivacsSpotted)
            {
                TimedObserverTask.Task.Target   = ScoutingPylonPos;
                TimedObserverTask.Task.Priority = 11;
            }
            else
            {
                if (Tyr.Bot.Frame - tyr.EnemyBansheesManager.BansheeSeenFrame <= 22.4 * 10 &&
                    tyr.EnemyBansheesManager.BansheeLocation != null)
                {
                    TimedObserverTask.Task.Target = tyr.EnemyBansheesManager.BansheeLocation;
                }
                else if (Tyr.Bot.Frame - tyr.EnemyBansheesManager.LastHitFrame <= 22.4 * 20)
                {
                    TimedObserverTask.Task.Target = tyr.EnemyBansheesManager.LastHitLocation;
                }
                else
                {
                    TimedObserverTask.Task.Target = SC2Util.To2D(tyr.MapAnalyzer.StartLocation);
                }
                TimedObserverTask.Task.Priority = 3;
            }

            TimingAttackTask.Task.DefendOtherAgents = false;

            TimingAttackTask.Task.RequiredSize = 25;
            TimingAttackTask.Task.RetreatSize  = 0;

            if (!BansheesDetected && TotalEnemyCount(UnitTypes.BANSHEE) > 0)
            {
                BansheesDetected = true;
            }
            if (!BansheesDetected &&
                TotalEnemyCount(UnitTypes.STARPORT_TECH_LAB) + TotalEnemyCount(UnitTypes.STARPORT) > 0 &&
                tyr.Frame < 22.4 * 60 * 5)
            {
                BansheesDetected = true;
            }

            DefenseTask.GroundDefenseTask.ExpandDefenseRadius = 30;
            DefenseTask.GroundDefenseTask.MainDefenseRadius   = 30;
            DefenseTask.GroundDefenseTask.MaxDefenseRadius    = 120;
            DefenseTask.GroundDefenseTask.DrawDefenderRadius  = 80;

            DefenseTask.AirDefenseTask.ExpandDefenseRadius = 30;
            DefenseTask.AirDefenseTask.MainDefenseRadius   = 30;
            DefenseTask.AirDefenseTask.MaxDefenseRadius    = 120;
            DefenseTask.AirDefenseTask.DrawDefenderRadius  = 80;

            if (BansheesDetected && EnemyCount(UnitTypes.VIKING_ASSUALT) + EnemyCount(UnitTypes.VIKING_FIGHTER) >= 3)
            {
                BuildTempest = true;
            }

            tyr.TargetManager.SkipPlanetaries = true;
        }