public override void OnFrame(Bot bot) { BalanceGas(); MassTanksDetected = MassTank.Get().Detected; FearTanksController.Stopped = !MassTanksDetected; if (!FourRaxSuspected && bot.Frame <= 22.4 * 60 * 3 && SendScout) { if (EnemyCount(UnitTypes.BARRACKS) >= 3) { FourRaxSuspected = true; } if (bot.Frame >= 22.4 * 90 && EnemyCount(UnitTypes.BARRACKS) >= 2 && EnemyCount(UnitTypes.REFINERY) == 0 && EnemyCount(UnitTypes.COMMAND_CENTER) < 2) { FourRaxSuspected = true; } } ForceFieldRampTask.Task.Stopped = !FourRaxSuspected || Completed(UnitTypes.STALKER) >= 15; if (ForceFieldRampTask.Task.Stopped) { ForceFieldRampTask.Task.Clear(); } if (ProxyPylon && ProxyTask.Task.Stopped && bot.Frame >= 400) { ProxyTask.Task.Stopped = false; } if (ProxyPylon && ProxyTask.Task.UnitCounts.ContainsKey(UnitTypes.PYLON) && ProxyTask.Task.UnitCounts[UnitTypes.PYLON] > 0) { ProxyPylon = false; ProxyTask.Task.Stopped = true; ProxyTask.Task.Clear(); } if (WorkerScoutTask.Task.BaseCircled()) { WorkerScoutTask.Task.Stopped = true; WorkerScoutTask.Task.Clear(); } foreach (Agent agent in bot.UnitManager.Agents.Values) { if (bot.Frame % 224 != 0) { break; } if (agent.Unit.UnitType != UnitTypes.GATEWAY) { continue; } if (Count(UnitTypes.NEXUS) < 3 && TimingAttackTask.Task.Units.Count == 0) { agent.Order(Abilities.MOVE, Main.BaseLocation.Pos); } else { agent.Order(Abilities.MOVE, bot.TargetManager.PotentialEnemyStartLocations[0]); } } bot.NexusAbilityManager.Stopped = Completed(UnitTypes.PYLON) == 0; bot.NexusAbilityManager.PriotitizedAbilities.Add(1006); if (TotalEnemyCount(UnitTypes.BANSHEE) > 0) { StutterForwardController.Stopped = false; StutterController.Stopped = true; } else { StutterForwardController.Stopped = true; StutterController.Stopped = false; } SaveWorkersTask.Task.Stopped = bot.Frame >= 22.4 * 60 * 7 || EnemyCount(UnitTypes.CYCLONE) == 0 || !Natural.UnderAttack; if (SaveWorkersTask.Task.Stopped) { SaveWorkersTask.Task.Clear(); } if (!MedivacsSpotted && EnemyCount(UnitTypes.MEDIVAC) > 0) { MedivacsSpotted = true; MedivacsSpottedFrame = bot.Frame; } DefenseTask.GroundDefenseTask.IncludePhoenixes = EnemyCount(UnitTypes.CYCLONE) > 0; if (MedivacsSpotted && bot.Frame - MedivacsSpottedFrame <= 22.4 * 30 && InterceptMedivacs) { 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) { ObserverScoutTask.Task.Stopped = true; ObserverScoutTask.Task.Clear(); } if (!BansheesDetected && bot.Frame >= 22.4 * 60 * 6 && bot.Frame < 22.4 * 60 * 9.5 && !MedivacsSpotted && InterceptMedivacs) { TimedObserverTask.Task.Target = ScoutingPylonPos; TimedObserverTask.Task.Priority = 11; } else { if (Bot.Main.Frame - bot.EnemyBansheesManager.BansheeSeenFrame <= 22.4 * 10 && bot.EnemyBansheesManager.BansheeLocation != null) { TimedObserverTask.Task.Target = bot.EnemyBansheesManager.BansheeLocation; } else if (Bot.Main.Frame - bot.EnemyBansheesManager.LastHitFrame <= 22.4 * 20) { TimedObserverTask.Task.Target = bot.EnemyBansheesManager.LastHitLocation; } else { TimedObserverTask.Task.Target = SC2Util.To2D(bot.MapAnalyzer.StartLocation); } TimedObserverTask.Task.Priority = 3; } TimingAttackTask.Task.DefendOtherAgents = false; if (FourRaxSuspected) { TimingAttackTask.Task.RetreatSize = 0; TimingAttackTask.Task.RequiredSize = 20; } else if (TotalEnemyCount(UnitTypes.CYCLONE) > 0 && TotalEnemyCount(UnitTypes.BANSHEE) > 0) { TimingAttackTask.Task.RetreatSize = 0; TimingAttackTask.Task.RequiredSize = 25; } else { TimingAttackTask.Task.RetreatSize = 15; TimingAttackTask.Task.RequiredSize = 35; } if (!BansheesDetected && TotalEnemyCount(UnitTypes.BANSHEE) > 0) { BansheesDetected = true; } if (!BansheesDetected && TotalEnemyCount(UnitTypes.STARPORT_TECH_LAB) + TotalEnemyCount(UnitTypes.STARPORT) > 0 && bot.Frame < 22.4 * 60 * 5) { BansheesDetected = true; } DefenseTask.GroundDefenseTask.ExpandDefenseRadius = 20; DefenseTask.GroundDefenseTask.MainDefenseRadius = 20; 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; bot.TargetManager.SkipPlanetaries = true; }
public List <Build> ProtossBuilds(Bot bot) { List <Build> options = new List <Build>(); if (Bot.Debug) { foreach (Strategy strategy in bot.EnemyStrategyAnalyzer.Strategies) { if (strategy.DetectedPreviously) { System.Console.WriteLine("Detected previous strategy: " + strategy.Name()); } } } if (bot.EnemyRace == Race.Terran) { if (Marine.Get().DetectedPreviously && !Reaper.Get().DetectedPreviously && !Marauder.Get().DetectedPreviously && !Cyclone.Get().DetectedPreviously && !Banshee.Get().DetectedPreviously && !SiegeTank.Get().DetectedPreviously && !Medivac.Get().DetectedPreviously && !Viking.Get().DetectedPreviously && !Raven.Get().DetectedPreviously && !Battlecruiser.Get().DetectedPreviously && !WidowMine.Get().DetectedPreviously && !Hellion.Get().DetectedPreviously && !Thor.Get().DetectedPreviously && !Liberator.Get().DetectedPreviously) { // ValinMarineBot options.Add(new NinjaTurtles()); return(options); } if (BattlecruiserRush.Get().DetectedPreviously && Thor.Get().DetectedPreviously && WidowMine.Get().DetectedPreviously) { // BenBotBC options.Add(new OneBaseStalkerImmortal()); return(options); } if (Battlecruiser.Get().DetectedPreviously && !BattlecruiserRush.Get().DetectedPreviously && !Marauder.Get().DetectedPreviously && !Banshee.Get().DetectedPreviously && !Reaper.Get().DetectedPreviously && !Cyclone.Get().DetectedPreviously && !Medivac.Get().DetectedPreviously && !Raven.Get().DetectedPreviously) { options.Add(new MassVoidray() { SkipDefenses = true }); return(options); } /* * if (ProxyDetected.Get().DetectedPreviously * && !Marauder.Get().DetectedPreviously * && Banshee.Get().DetectedPreviously) * { * options.Add(new AntiMicro()); * return options; * } */ if (ProxyDetected.Get().DetectedPreviously && Marauder.Get().DetectedPreviously && Banshee.Get().DetectedPreviously) { // MicroMachine options.Add(new AntiMicro() { HuntProxies = true, CounterProxyMarauder = false }); //options.Add(new NinjaTurtles() { Expand = true }); //options.Add(new OneBaseTempest() { DefendingStalker = true }); return(options); } if (ProxyDetected.Get().DetectedPreviously && !Banshee.Get().DetectedPreviously) { // Strelok //options.Add(new PvTStalkerImmortal() { BuildReaperWall = true, ProxyPylon = false, DelayObserver = true, SendScout = true, MassTanksDetected = MassTank.Get().DetectedPreviously }); options.Add(new OneBaseStalkerImmortal() { UseSentry = true }); options.Add(new OneBaseTempest()); return(options); } if (Marine.Get().DetectedPreviously && Medivac.Get().DetectedPreviously && Viking.Get().DetectedPreviously && Reaper.Get().DetectedPreviously && Raven.Get().DetectedPreviously && !Cyclone.Get().DetectedPreviously && !Marauder.Get().DetectedPreviously && !Banshee.Get().DetectedPreviously) { options.Add(new OneBaseStalkerImmortal()); //options.Add(new PvTStalkerImmortal() { BuildReaperWall = false, ProxyPylon = false, DelayObserver = true, SendScout = false, MassTanksDetected = true }); return(options); } if (Marine.Get().DetectedPreviously && Medivac.Get().DetectedPreviously && Viking.Get().DetectedPreviously && Reaper.Get().DetectedPreviously && !Raven.Get().DetectedPreviously && Marauder.Get().DetectedPreviously && Liberator.Get().DetectedPreviously && !Banshee.Get().DetectedPreviously) { // Jensiiibot //options.Add(new PvTStalkerTempest()); //options.Add(new Builds.Protoss.WorkerRush() { CounterJensiii = true, BuildStalkers = true }); //options.Add(new PvTStalkerImmortal() { BuildReaperWall = true, ProxyPylon = false, DelayObserver = true, MassTanksDetected = MassTank.Get().DetectedPreviously, UseColosus = false }); options.Add(new PvTZealotImmortal()); return(options); } if (Marine.Get().DetectedPreviously && Medivac.Get().DetectedPreviously && Viking.Get().DetectedPreviously && Reaper.Get().DetectedPreviously && Cyclone.Get().DetectedPreviously && !Marauder.Get().DetectedPreviously && !Liberator.Get().DetectedPreviously && !Banshee.Get().DetectedPreviously) { // Rusty options.Add(new OneBaseStalkerImmortal()); return(options); } if (Marine.Get().DetectedPreviously && Medivac.Get().DetectedPreviously && Viking.Get().DetectedPreviously && Reaper.Get().DetectedPreviously && !Raven.Get().DetectedPreviously && Cyclone.Get().DetectedPreviously && Marauder.Get().DetectedPreviously && !Liberator.Get().DetectedPreviously && !Banshee.Get().DetectedPreviously && Thor.Get().DetectedPreviously && SiegeTank.Get().DetectedPreviously && MassTank.Get().DetectedPreviously && Hellbat.Get().DetectedPreviously) { // MechSweep options.Add(new OneBaseTempest() { RequiredSize = 3 }); return(options); } options.Add(new PvTStalkerImmortal() { BuildReaperWall = true, ProxyPylon = false, DelayObserver = true, MassTanksDetected = MassTank.Get().DetectedPreviously, UseColosus = false }); } else if (bot.EnemyRace == Race.Zerg) { if (Bot.Main.OpponentID == "eed44128-f488-4e31-b457-8e55f8a95628") { options.Add(new PvZHjax() { CounterRoaches = false, DefendNydus = false }); return(options); } options.Add(new PvZHjax()); return(options); /* * if (Lurker.Get().DetectedPreviously) * { * //Kagamine * //options.Add(new PvZAdeptIntoVoidray()); * //options.Add(new WorkerRush()); * options.Add(new PvZHjax()); * return options; * } * if (Mutalisk.Get().DetectedPreviously * && !Lurker.Get().DetectedPreviously) * { * options.Add(new OneBaseStalkerImmortal() { StartZealots = true }); * return options; * } * if (Hydralisk.Get().DetectedPreviously && StrategyAnalysis.ZerglingRush.Get().DetectedPreviously) * { * options.Add(new ZealotRush()); * return options; * } * if (RoachRush.Get().DetectedPreviously || StrategyAnalysis.ZerglingRush.Get().DetectedPreviously) * { * options.Add(new PvZRushDefense()); * options.Add(new NinjaTurtles()); * return options; * } * if (Roach.Get().DetectedPreviously * && Zergling.Get().DetectedPreviously * && !Hydralisk.Get().DetectedPreviously) * { * options.Add(new PvZRushDefense()); * options.Add(new NinjaTurtles()); * return options; * } * if (Queen.Get().DetectedPreviously * && Zergling.Get().DetectedPreviously * && !Hydralisk.Get().DetectedPreviously * && !Roach.Get().DetectedPreviously) * { * options.Add(new NinjaTurtles()); * return options; * } * if (bot.PreviousEnemyStrategies.MassHydra * && MassRoach.Get().DetectedPreviously * && !Lurker.Get().DetectedPreviously) * { * options.Add(new OneBaseTempest()); * return options; * } * if (!Zergling.Get().DetectedPreviously * && !Roach.Get().DetectedPreviously * && !Hydralisk.Get().DetectedPreviously * && !Queen.Get().DetectedPreviously * && !Mutalisk.Get().DetectedPreviously) * { * options.Add(new OneBaseTempest()); * return options; * } * if (!Zergling.Get().DetectedPreviously * && Roach.Get().DetectedPreviously * && !Hydralisk.Get().DetectedPreviously * && Queen.Get().DetectedPreviously * && !Mutalisk.Get().DetectedPreviously) * { * options.Add(new OneBaseTempest()); * return options; * } * options.Add(new OneBaseStalkerImmortal() { StartZealots = true }); */ } else if (bot.EnemyRace == Race.Protoss) { if (Zealot.Get().DetectedPreviously && VoidRay.Get().DetectedPreviously && !Carrier.Get().DetectedPreviously && !Tempest.Get().DetectedPreviously && !Stalker.Get().DetectedPreviously && !Adept.Get().DetectedPreviously && !Immortal.Get().DetectedPreviously && !StrategyAnalysis.CannonRush.Get().DetectedPreviously) { // MavBot3 options.Add(new ZealotRush()); return(options); } if (SkippedNatural.Get().DetectedPreviously && !AdeptHarass.Get().DetectedPreviously && VoidRay.Get().DetectedPreviously && Immortal.Get().DetectedPreviously) { // AdditionalPylons options.Add(new DoubleRoboProxy()); return(options); } if (Oracle.Get().DetectedPreviously && ThreeGate.Get().DetectedPreviously && Zealot.Get().DetectedPreviously && !Stalker.Get().DetectedPreviously && !VoidRay.Get().DetectedPreviously && !Immortal.Get().DetectedPreviously) { // LuckyBot options.Add(new OneBaseTempest()); return(options); } if (Carrier.Get().DetectedPreviously && Collosus.Get().DetectedPreviously && SkyToss.Get().DetectedPreviously && Tempest.Get().DetectedPreviously && !Archon.Get().DetectedPreviously && !HighTemplar.Get().DetectedPreviously) { // TheGoldenArmada options.Add(new OneBaseTempest()); return(options); } options.Add(new OneBaseStalkerImmortal() { DoubleRobo = true, EarlySentry = true, AggressiveMicro = true }); return(options); /* * if (AdeptHarass.Get().DetectedPreviously * && SkyToss.Get().DetectedPreviously * && Carrier.Get().DetectedPreviously * && HighTemplar.Get().DetectedPreviously * && VoidRay.Get().DetectedPreviously * && !StrategyAnalysis.CannonRush.Get().DetectedPreviously) * { * options.Add(new ZealotRush()); * options.Add(new OneBaseStalkerImmortal()); * return options; * } * if (AdeptHarass.Get().DetectedPreviously) * { * // SharpenedEdge * options.Add(new OneBaseTempest()); * options.Add(new Dishwasher()); * return options; * } * if (StrategyAnalysis.CannonRush.Get().DetectedPreviously * && Tempest.Get().DetectedPreviously) * { * // ThreeWayLover * //options.Add(new MassVoidray() { SkipDefenses = true }); * options.Add(new OneBaseTempest()); * return options; * } * if (Sentry.Get().DetectedPreviously * && Archon.Get().DetectedPreviously * && !Stalker.Get().DetectedPreviously * && !Zealot.Get().DetectedPreviously) * { * options.Add(new TempestProxy()); * return options; * } * if (Zealot.Get().DetectedPreviously * && StrategyAnalysis.CannonRush.Get().DetectedPreviously * && Oracle.Get().DetectedPreviously * && Phoenix.Get().DetectedPreviously * && Stalker.Get().DetectedPreviously * && !Immortal.Get().DetectedPreviously) * { * //Gumby * options.Add(new NinjaTurtles()); * return options; * } * if (Oracle.Get().DetectedPreviously) * { * options.Add(new OneBaseTempest()); * return options; * } * if (!Stalker.Get().DetectedPreviously * && !Zealot.Get().DetectedPreviously * && !Sentry.Get().DetectedPreviously) * { * options.Add(new ZealotRush()); * return options; * } * if (Zealot.Get().DetectedPreviously * && !Stalker.Get().DetectedPreviously) * { * options.Add(new NinjaTurtles()); * return options; * } * * options.Add(new NinjaTurtles()); * options.Add(new PvPMothershipSiege()); */ } return(options); }