def cannon_expand(self) -> ActBase: self.knowledge.print(f"Cannon expand", "Build") natural = self.knowledge.expansion_zones[-2] pylon_pos: Point2 = natural.behind_mineral_position_center return BuildOrder([ [ ActUnitOnce(UnitTypeId.PROBE, UnitTypeId.NEXUS, 14), GridBuilding(UnitTypeId.FORGE, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 18), ], [ BuildPosition(UnitTypeId.PYLON, pylon_pos, exact=False, only_once=True), Step( None, BuildPosition( UnitTypeId.PHOTONCANNON, pylon_pos.towards(natural.center_location, 4), exact=False, only_once=True, ), skip=RequireCustom(lambda k: k.lost_units_manager. own_lost_type(UnitTypeId.PYLON) > 0), ), Expand(2), GridBuilding(UnitTypeId.GATEWAY, 1), DefensiveCannons(2, 0, 1), ], ])
async def create_plan(self) -> BuildOrder: stop_gas = RequiredAny([RequiredGas(100), RequiredTechReady(UpgradeId.ZERGLINGMOVEMENTSPEED, 0.001)]) end_game = RequiredAny([RequiredSupply(70), UnitExists(UnitTypeId.LAIR, 1)]) return BuildOrder( ActUnitOnce(UnitTypeId.DRONE, UnitTypeId.LARVA, 24), LingFloodBuild(), SequentialList( InjectLarva(), Step(None, PlanDistributeWorkers(3, 3), skip=RequiredAny([stop_gas, end_game])), Step(None, PlanDistributeWorkers(0, 0), skip_until=stop_gas, skip=end_game), Step(None, PlanDistributeWorkers(None, None), skip_until=end_game), WorkerAttack(), DummyZergAttack(), ), )
async def create_plan(self) -> BuildOrder: return BuildOrder([ SequentialList([ ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 15), GridBuilding(UnitTypeId.SUPPLYDEPOT, 1), ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 17), GridBuilding(UnitTypeId.BARRACKS, 1), GridBuilding(UnitTypeId.SUPPLYDEPOT, 2), GridBuilding(UnitTypeId.BARRACKS, 5), GridBuilding(UnitTypeId.SUPPLYDEPOT, 3), ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 18), BuildOrder([ AutoDepot(), ActUnit(UnitTypeId.MARINE, UnitTypeId.BARRACKS, 200), ]) ]), SequentialList([ PlanCancelBuilding(), LowerDepots(), PlanZoneDefense(), DistributeWorkers(), Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), ManTheBunkers(), Repair(), ContinueBuilding(), PlanZoneGatherTerran(), AllInPlanZoneAttack(10), PlanFinishEnemy(), ]) ])
async def create_plan(self) -> BuildOrder: return BuildOrder( Step( None, ChronoUnitProduction(UnitTypeId.PROBE, UnitTypeId.NEXUS), skip=UnitExists(UnitTypeId.PROBE, 40, include_pending=True), skip_until=UnitExists(UnitTypeId.ASSIMILATOR, 1), ), SequentialList( ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 14), GridBuilding(UnitTypeId.PYLON, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 16), StepBuildGas(1), GridBuilding(UnitTypeId.GATEWAY, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 20), ActExpand(2), GridBuilding(UnitTypeId.CYBERNETICSCORE, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 21), StepBuildGas(2), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22), GridBuilding(UnitTypeId.PYLON, 1), BuildOrder( AutoPylon(), ActTech(UpgradeId.WARPGATERESEARCH), [ ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22), Step(UnitExists(UnitTypeId.NEXUS, 2), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 44)), StepBuildGas(3, skip=RequiredGas(300)), ], [GateUnit(UnitTypeId.STALKER, 100)], [ GridBuilding(UnitTypeId.GATEWAY, 7), StepBuildGas(4, skip=RequiredGas(200)) ], ), ), SequentialList( PlanZoneDefense(), RestorePower(), PlanDistributeWorkers(), PlanZoneGather(), Step(RequiredUnitReady(UnitTypeId.GATEWAY, 4), PlanZoneAttack(4)), PlanFinishEnemy(), ), )
async def create_plan(self) -> BuildOrder: number = random.randint(10, 15) attack = TheAttack(number + 1) return BuildOrder([ Step(None, ChronoUnitProduction(UnitTypeId.PROBE, UnitTypeId.NEXUS), skip=RequiredUnitExists(UnitTypeId.PROBE, 20, include_pending=True), skip_until=RequiredUnitExists(UnitTypeId.ASSIMILATOR, 1)), SequentialList([ GridBuilding(UnitTypeId.PYLON, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 14), GridBuilding(UnitTypeId.GATEWAY, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 16), StepBuildGas(1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 17), GridBuilding(UnitTypeId.GATEWAY, 2), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 20), ArtosisPylon(2), BuildOrder( [ AutoPylon(), SequentialList( [ Step(None, GridBuilding(UnitTypeId.CYBERNETICSCORE, 1), skip_until=RequiredUnitReady(UnitTypeId.GATEWAY, 1)), Step(RequiredUnitReady(UnitTypeId.CYBERNETICSCORE, 1), GateUnit(UnitTypeId.ADEPT, 2, only_once=True)), ActTech(UpgradeId.WARPGATERESEARCH), GateUnit(UnitTypeId.ADEPT, 100) ]), Step(RequiredUnitExists(UnitTypeId.CYBERNETICSCORE, 1), GridBuilding(UnitTypeId.GATEWAY, 4), skip_until=RequiredMinerals(200)), Step(None, ProtossUnit(UnitTypeId.ZEALOT, 100), skip=RequiredGas(25), skip_until=RequiredMinerals(200)), ]), ]), SequentialList( [ PlanZoneDefense(), RestorePower(), PlanDistributeWorkers(), PlanZoneGather(), DoubleAdeptScout(number), attack, PlanFinishEnemy(), ]) ])
def cannon_rush(self) -> ActBase: self.knowledge.print(f"Cannon rush", "Build") return BuildOrder([ [ GridBuilding(UnitTypeId.PYLON, 1), GridBuilding(UnitTypeId.FORGE, 1, priority=True), ], ProxyCannoneer(), ProtossUnit(UnitTypeId.PROBE, 18), ChronoUnitProduction(UnitTypeId.PROBE, UnitTypeId.NEXUS), [ Step(RequiredMinerals(400), GridBuilding(UnitTypeId.GATEWAY, 1)), Step(RequiredMinerals(700), ActExpand(2), skip=RequiredUnitExists(UnitTypeId.NEXUS, 2)), GridBuilding(UnitTypeId.CYBERNETICSCORE, 1), ] ])
async def create_plan(self) -> BuildOrder: attack = PlanZoneAttack(1) attack.retreat_multiplier = 0.1 attack.attack_on_advantage = False return BuildOrder( [PlanDistributeWorkers(), Step(RequiredTime(60), attack)])
async def create_plan(self) -> BuildOrder: return BuildOrder( Step( None, ChronoUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS), skip=UnitExists(UnitTypeId.PROBE, 20, include_pending=True), skip_until=UnitExists(UnitTypeId.ASSIMILATOR, 1), ), # ChronoTech(AbilityId.RESEARCH_BLINK, UnitTypeId.TWILIGHTCOUNCIL), SequentialList( ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 14), GridBuilding(UnitTypeId.PYLON, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 16), GridBuilding(UnitTypeId.GATEWAY, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 17), BuildGas(2), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 19), GridBuilding(UnitTypeId.GATEWAY, 2), BuildOrder( AutoPylon(), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22), SequentialList( Step( None, GridBuilding(UnitTypeId.CYBERNETICSCORE, 1), skip_until=UnitReady(UnitTypeId.GATEWAY, 1), ), Step( UnitReady(UnitTypeId.CYBERNETICSCORE, 1), ProtossUnit(UnitTypeId.ADEPT, 2, only_once=True), ), Tech(UpgradeId.WARPGATERESEARCH), ProtossUnit(UnitTypeId.STALKER, 100), ), Step(UnitExists(UnitTypeId.CYBERNETICSCORE, 1), GridBuilding(UnitTypeId.GATEWAY, 4)), ), ), BuildOrder( DistributeWorkers(), PlanZoneAttack(), PlanFinishEnemy(), ), )
async def create_plan(self) -> BuildOrder: self._bot.building_solver.wall_type = WallType.ProtossMainZerg attack = PlanZoneAttack(4) return BuildOrder([ ChronoUnit(UnitTypeId.TEMPEST, UnitTypeId.STARGATE), SequentialList( ProtossUnit(UnitTypeId.PROBE, 14), GridBuilding(UnitTypeId.PYLON, 1), ProtossUnit(UnitTypeId.PROBE, 15), GridBuilding(UnitTypeId.GATEWAY, 1), GridBuilding(UnitTypeId.FORGE, 1), BuildGas(2), ProtossUnit(UnitTypeId.PROBE, 18), GridBuilding(UnitTypeId.PYLON, 2), GridBuilding(UnitTypeId.CYBERNETICSCORE, 1), ProtossUnit(UnitTypeId.PROBE, 22), BuildOrder( AutoPylon(), SequentialList( GridBuilding(UnitTypeId.STARGATE, 1), Step(UnitReady(UnitTypeId.STARGATE, 1), GridBuilding(UnitTypeId.FLEETBEACON, 1)), ), [ProtossUnit(UnitTypeId.TEMPEST, 100, priority=True)], [ Step(UnitExists(UnitTypeId.FLEETBEACON, 1), GridBuilding(UnitTypeId.STARGATE, 2)) ], ), ), DefensiveCannons(4, 2, 0), SequentialList( PlanZoneDefense(), RestorePower(), DistributeWorkers(), Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), PlanZoneGather(), Step(UnitExists(UnitTypeId.TEMPEST, 1, include_killed=True), attack), PlanFinishEnemy(), ), ])
def cannon_contain(self) -> ActBase: self.knowledge.print(f"Cannon contain", "Build") enemy_main = self.knowledge.expansion_zones[-1] natural = self.knowledge.expansion_zones[-2] enemy_ramp = self.knowledge.enemy_base_ramp return Step(None, BuildOrder( [ [ ActUnitOnce(UnitTypeId.PROBE, UnitTypeId.NEXUS, 14), GridBuilding(UnitTypeId.FORGE, 1), ActUnitOnce(UnitTypeId.PROBE, UnitTypeId.NEXUS, 18), ], [ BuildPosition(UnitTypeId.PYLON, natural.center_location), BuildPosition(UnitTypeId.PHOTONCANNON, natural.center_location.towards(enemy_ramp.bottom_center, 5), exact=False, only_once=True), BuildPosition(UnitTypeId.PYLON, natural.center_location.towards(enemy_ramp.bottom_center, 8), exact=False, only_once=True), BuildPosition(UnitTypeId.PHOTONCANNON, natural.center_location.towards(enemy_ramp.top_center, 13), exact=False, only_once=True), BuildPosition(UnitTypeId.PYLON, natural.center_location.towards(enemy_ramp.bottom_center, 16), exact=False, only_once=True), BuildPosition(UnitTypeId.PHOTONCANNON, natural.center_location.towards(enemy_ramp.top_center, 20), exact=False, only_once=True), ], [ BuildPosition(UnitTypeId.PYLON, natural.behind_mineral_position_center, exact=False, only_once=True), BuildPosition(UnitTypeId.PHOTONCANNON, natural.center_location.towards(enemy_main.behind_mineral_position_center, 5), exact=False, only_once=True), BuildPosition(UnitTypeId.PYLON, natural.center_location.towards(enemy_main.behind_mineral_position_center, 8), exact=False, only_once=True), BuildPosition(UnitTypeId.PHOTONCANNON, natural.center_location.towards(enemy_main.behind_mineral_position_center, 12), exact=False, only_once=True), BuildPosition(UnitTypeId.PYLON, natural.center_location.towards(enemy_main.behind_mineral_position_center, 16), exact=False, only_once=True), BuildPosition(UnitTypeId.PHOTONCANNON, natural.center_location.towards(enemy_main.behind_mineral_position_center, 20), exact=False, only_once=True), ], ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 16), ]), # Skip cannon rushing if we started nexus, or have over 750 minerals, the build is probably stuck skip=RequiredAny([RequiredUnitExists(UnitTypeId.NEXUS, 2), RequiredMinerals(750)]))
async def create_plan(self) -> BuildOrder: perform_cleanup = RequireCustom( lambda k: self._bot.zone_manager.enemy_main_zone. is_scouted_at_least_once and not self._bot.zone_manager. enemy_main_zone.is_enemys) return BuildOrder([ Step( None, SequentialList( SetGameStepSize(1), # improve our worker micro WorkerAttack()), skip=perform_cleanup), Step( None, SequentialList( SetGameStepSize(self._bot.client.game_step ), # back to the original step size await self.cleanup.create_plan()), skip_until=perform_cleanup), ])
async def create_plan(self) -> BuildOrder: build_step_buildings = [ # 12 Pool Step(None, ActBuilding(UnitTypeId.SPAWNINGPOOL, 1), UnitExists(UnitTypeId.SPAWNINGPOOL, 1)), ] finish = [ Step( RequireCustom(lambda k: self._bot.enemy_structures.flying. exists and self._bot.supply_used > 30), BuildGas(2)), Expand(2), UnitExists(UnitTypeId.DRONE, 20), MorphLair(), UnitExists(UnitTypeId.DRONE, 30), BuildGas(4), ActBuilding(UnitTypeId.SPIRE), ZergUnit(UnitTypeId.MUTALISK, 10, priority=True), ] build_step_units = [ # 12 Pool followed by overlord Step( UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2), UnitExists(UnitTypeId.OVERLORD, 2), ), # TheMusZero Step( UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14), UnitExists(UnitTypeId.DRONE, 14), ), # Queen for more larvae # BuildStep(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 1), UnitExists(UnitTypeId.QUEEN, 1)), # Endless zerglings Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA), None), ] return BuildOrder( build_step_buildings, Step(SupplyLeft(0), AutoOverLord()), finish, build_step_units, AutoOverLord(), DistributeWorkers(), Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), InjectLarva(), PlanWorkerOnlyDefense(), PlanZoneDefense(), PlanZoneGather(), PlanZoneAttack2(2), PlanFinishEnemy(), )
def macro(self) -> BuildOrder: worker_scout = Step( None, WorkerScout(), skip_until=RequireCustom(lambda k: len(self.enemy_start_locations) > 1) ) distribute = PlanDistributeWorkers() return BuildOrder( [ LingSpeedBuild(), SequentialList([worker_scout, SpreadCreep(), InjectLarva(), distribute, DummyZergAttack()]), ] )
async def create_plan(self) -> BuildOrder: worker_scout = Step(None, WorkerScout(), skip_until=UnitExists(UnitTypeId.SUPPLYDEPOT, 1)) tactics = [ PlanCancelBuilding(), LowerDepots(), PlanZoneDefense(), worker_scout, Step(None, CallMule(50), skip=Time(5 * 60)), Step(None, CallMule(100), skip_until=Time(5 * 60)), Step(None, ScanEnemy(), skip_until=Time(5 * 60)), DistributeWorkers(), Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), ManTheBunkers(), Repair(), ContinueBuilding(), PlanZoneGatherTerran(), PlanZoneAttack(26), PlanFinishEnemy(), ] return BuildOrder([BuildBio(), tactics])
async def create_plan(self) -> BuildOrder: worker_scout = Step( None, WorkerScout(), skip_until=RequireCustom(lambda k: len(self._bot.enemy_start_locations) > 1) ) distribute = DistributeWorkers() return BuildOrder( [ LingSpeedBuild(), SequentialList( [ worker_scout, SpreadCreep(), InjectLarva(), distribute, Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), DummyZergAttack(), ] ), ] )
async def create_plan(self) -> BuildOrder: self.knowledge.data_manager.set_build("bio") worker_scout = Step(None, WorkerScout(), skip_until=UnitExists(UnitTypeId.SUPPLYDEPOT, 1)) tactics = [ PlanCancelBuilding(), LowerDepots(), PlanZoneDefense(), worker_scout, Step(None, CallMule(50), skip=Time(5 * 60)), Step(None, CallMule(100), skip_until=Time(5 * 60)), Step(None, ScanEnemy(), skip_until=Time(5 * 60)), DistributeWorkers(), ManTheBunkers(), Repair(), ContinueBuilding(), PlanZoneGatherTerran(), self.attack, PlanFinishEnemy(), ] return BuildOrder([BuildBio(), tactics])
async def create_plan(self) -> BuildOrder: attack = PlanZoneAttack(120) attack.retreat_multiplier = 0.3 tactics = [ PlanCancelBuilding(), InjectLarva(), DistributeWorkers(), Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), attack, PlanFinishEnemy(), ] return CounterTerranTie([MacroBuild(), tactics])
async def create_plan(self) -> BuildOrder: self.attack = Step(None, PlanZoneAttack(random.randint(50, 80))) worker_scout = Step(None, WorkerScout(), skip_until=UnitExists(UnitTypeId.SUPPLYDEPOT, 1)) tactics = [ PlanCancelBuilding(), LowerDepots(), PlanZoneDefense(), worker_scout, CallMule(100), ScanEnemy(), PlanDistributeWorkers(), ManTheBunkers(), Repair(), ContinueBuilding(), PlanZoneGatherTerran(), self.attack, PlanFinishEnemy(), ] return BuildOrder([BuildTanks(), SequentialList(tactics)])
async def create_plan(self) -> BuildOrder: flying_buildings = lambda k: self._bot.enemy_structures.flying.exists and self._bot.supply_used > 30 in_case_of_air = [ Step(flying_buildings, StepBuildGas(2)), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 20), MorphLair(), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 30), StepBuildGas(4), ActBuilding(UnitTypeId.SPIRE), ZergUnit(UnitTypeId.MUTALISK, 10, priority=True) ] return BuildOrder([ SequentialList([ ActBuilding(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14), StepBuildGas(1), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14), StepBuildGas(2), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14), ActBuilding(UnitTypeId.ROACHWARREN, 1), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14), ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA, 3), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 3), ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA, 4), ActUnit(UnitTypeId.RAVAGER, UnitTypeId.ROACH, 3), ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA, 100), ]), in_case_of_air, SequentialList([ DistributeWorkers(4), Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), PlanZoneDefense(), AutoOverLord(), InjectLarva(), PlanZoneGather(), Step(UnitExists(UnitTypeId.RAVAGER), PlanZoneAttackAllIn(10)), PlanFinishEnemy(), ]) ])
async def create_plan(self) -> BuildOrder: attack = PlanZoneAttack(6) return BuildOrder( Step( None, ChronoUnitProduction(UnitTypeId.PROBE, UnitTypeId.NEXUS), skip=UnitExists(UnitTypeId.PROBE, 20, include_pending=True), skip_until=UnitExists(UnitTypeId.ASSIMILATOR, 1), ), ChronoTech(AbilityId.RESEARCH_BLINK, UnitTypeId.TWILIGHTCOUNCIL), SequentialList( ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 14), GridBuilding(UnitTypeId.PYLON, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 16), GridBuilding(UnitTypeId.GATEWAY, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 17), StepBuildGas(2), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 19), GridBuilding(UnitTypeId.GATEWAY, 2), BuildOrder( AutoPylon(), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22), SequentialList( Step( RequiredUnitReady(UnitTypeId.CYBERNETICSCORE, 1), GridBuilding(UnitTypeId.TWILIGHTCOUNCIL, 1), ), Step(RequiredUnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), ActTech(UpgradeId.BLINKTECH)), ), SequentialList( Step( None, GridBuilding(UnitTypeId.CYBERNETICSCORE, 1), skip_until=RequiredUnitReady(UnitTypeId.GATEWAY, 1), ), Step( RequiredUnitReady(UnitTypeId.CYBERNETICSCORE, 1), GateUnit(UnitTypeId.ADEPT, 2, only_once=True), ), ActTech(UpgradeId.WARPGATERESEARCH), GateUnit(UnitTypeId.STALKER, 100), ), Step(UnitExists(UnitTypeId.CYBERNETICSCORE, 1), GridBuilding(UnitTypeId.GATEWAY, 4)), ), ), SequentialList( PlanZoneDefense(), RestorePower(), PlanDistributeWorkers(), PlanZoneGather(), Step(RequiredTechReady(UpgradeId.BLINKTECH, 0.9), attack), PlanFinishEnemy(), ), )
def aggressive(self) -> BuildOrder: worker_scout = Step( None, WorkerScout(), skip_until=RequireCustom(lambda k: len(self.enemy_start_locations) > 1) ) stop_gas = RequiredAny([RequiredGas(100), RequiredTechReady(UpgradeId.ZERGLINGMOVEMENTSPEED, 0.001)]) end_game = RequiredAny([RequiredSupply(90), UnitExists(UnitTypeId.LAIR, 1)]) return BuildOrder( [ LingFloodBuild(), SequentialList( [ worker_scout, SpreadCreep(), InjectLarva(), Step(None, PlanDistributeWorkers(3, 3), skip=RequiredAny([stop_gas, end_game])), Step(None, PlanDistributeWorkers(0, 0), skip_until=stop_gas, skip=end_game), Step(None, PlanDistributeWorkers(None, None), skip_until=end_game), DummyZergAttack(), ] ), ] )
async def create_plan(self) -> BuildOrder: worker_scout = Step( None, WorkerScout(), skip_until=RequireCustom(lambda k: len(self._bot.enemy_start_locations) > 1) ) stop_gas = Any([Gas(100), TechReady(UpgradeId.ZERGLINGMOVEMENTSPEED, 0.001)]) end_game = Any([Supply(90), UnitExists(UnitTypeId.LAIR, 1)]) return BuildOrder( [ LingFloodBuild(), SequentialList( [ Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), worker_scout, SpreadCreep(), InjectLarva(), Step(None, DistributeWorkers(3, 3), skip=Any([stop_gas, end_game])), Step(None, DistributeWorkers(0, 0), skip_until=stop_gas, skip=end_game), Step(None, DistributeWorkers(None, None), skip_until=end_game), DummyZergAttack(), ] ), ] )
async def create_plan(self) -> BuildOrder: stop_gas = Any( [Gas(100), TechReady(UpgradeId.ZERGLINGMOVEMENTSPEED, 0.001)]) end_game = Any([Supply(70), UnitExists(UnitTypeId.LAIR, 1)]) return BuildOrder( ActUnitOnce(UnitTypeId.DRONE, UnitTypeId.LARVA, 24), LingFloodBuild(), SequentialList( Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), InjectLarva(), Step(None, DistributeWorkers(3, 3), skip=Any([stop_gas, end_game])), Step(None, DistributeWorkers(0, 0), skip_until=stop_gas, skip=end_game), Step(None, DistributeWorkers(None, None), skip_until=end_game), WorkerAttack(), DummyZergAttack(), ), )
async def create_plan(self) -> BuildOrder: worker_scout = Step( None, WorkerScout(), skip=RequireCustom(lambda k: len(self.enemy_start_locations) == 1), skip_until=RequiredSupply(20)) distribute = PlanDistributeWorkers() return BuildOrder([ MutaliskBuild(), SequentialList([ PlanCancelBuilding(), PlanZoneGather(), PlanZoneDefense(), worker_scout, SpreadCreep(), InjectLarva(), distribute, PlanZoneAttack(), PlanFinishEnemy() ]), ])
def __init__(self): ultras = [ Step(UnitExists(UnitTypeId.ULTRALISKCAVERN, 1), None), Step( Gas(500), ActUnit(UnitTypeId.ULTRALISK, UnitTypeId.LARVA, priority=True)), ] units = [ Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 100), skip=UnitExists(UnitTypeId.HIVE, 1)), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 50)), Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA), None), ] build_step_expansions = [ Step(None, Expand(999)), ] queens = [ Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), None), Step(Minerals(500), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 5)), ] pool_and_tech = [ Step(None, ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)), StepBuildGas(2, None), Step(None, Tech(UpgradeId.ZERGLINGMOVEMENTSPEED)), Step(Gas(120), ActBuilding(UnitTypeId.EVOLUTIONCHAMBER, 2)), Step(UnitExists(UnitTypeId.EVOLUTIONCHAMBER, 1), Tech(UpgradeId.ZERGMELEEWEAPONSLEVEL1)), Step(None, Tech(UpgradeId.ZERGGROUNDARMORSLEVEL1)), Step(None, MorphLair(), skip=UnitExists(UnitTypeId.HIVE, 1)), StepBuildGas(4, None), Step(None, Tech(UpgradeId.ZERGMELEEWEAPONSLEVEL2)), Step(None, Tech(UpgradeId.ZERGGROUNDARMORSLEVEL2)), # Infestation pit required Step(None, ActBuilding(UnitTypeId.INFESTATIONPIT, 1)), Step(UnitReady(UnitTypeId.INFESTATIONPIT, 1), MorphHive()), Step(UnitReady(UnitTypeId.HIVE, 1), Tech(UpgradeId.ZERGLINGATTACKSPEED)), StepBuildGas(6, None), Step(None, ActBuilding(UnitTypeId.ULTRALISKCAVERN, 1)), Step(None, Tech(UpgradeId.ZERGMELEEWEAPONSLEVEL3)), Step(None, Tech(UpgradeId.ZERGGROUNDARMORSLEVEL3)), Step(None, Tech(UpgradeId.CHITINOUSPLATING)), Step(None, Tech(UpgradeId.ANABOLICSYNTHESIS)), ] super().__init__(self.overlords, ultras, units, build_step_expansions, queens, pool_and_tech)
async def create_plan(self) -> BuildOrder: buildings = [ Step(RequiredSupply(13), GridBuilding(UnitTypeId.SUPPLYDEPOT, 1)), Step(RequiredSupply(16), ActExpand(2)), Step(RequiredSupply(18), GridBuilding(UnitTypeId.BARRACKS, 1)), StepBuildGas(1), Step(RequiredSupply(20), GridBuilding(UnitTypeId.SUPPLYDEPOT, 2)), Step(None, StepBuildGas(2), skip_until=UnitExists(UnitTypeId.MARINE, 2)), Step(None, GridBuilding(UnitTypeId.FACTORY, 1), skip_until=RequiredUnitReady(UnitTypeId.BARRACKS, 1)), GridBuilding(UnitTypeId.FACTORY, 1), ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 1), StepBuildGas(4), Step(None, ActExpand(3)), GridBuilding(UnitTypeId.FACTORY, 2), ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 2), Step( None, ActTech(UpgradeId.CYCLONELOCKONDAMAGEUPGRADE), skip_until=RequiredUnitReady(UnitTypeId.FACTORYTECHLAB, 1), ), StepBuildGas(5), Step(None, ActTech(UpgradeId.HIGHCAPACITYBARRELS), skip_until=RequiredUnitReady(UnitTypeId.FACTORYTECHLAB, 2)), StepBuildGas(6, None, RequiredGas(100)), Step(RequiredMinerals(400), GridBuilding(UnitTypeId.FACTORY, 4)), Step( None, ActBuildAddon(UnitTypeId.FACTORYREACTOR, UnitTypeId.FACTORY, 1)), ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 3), Step(RequiredMinerals(400), ActExpand(4)), GridBuilding(UnitTypeId.ENGINEERINGBAY, 1), StepBuildGas(8), GridBuilding(UnitTypeId.FACTORY, 6), Step(RequiredMinerals(400), GridBuilding(UnitTypeId.FACTORY, 8)), ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 7), Step(RequiredSupply(120), GridBuilding(UnitTypeId.ARMORY, 2)), ] upgrades = [ Step(RequiredUnitReady(UnitTypeId.ARMORY, 1), ActTech(UpgradeId.TERRANVEHICLEWEAPONSLEVEL1)), ActTech(UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL1), ActTech(UpgradeId.TERRANVEHICLEWEAPONSLEVEL2), ActTech(UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL2), ActTech(UpgradeId.TERRANVEHICLEWEAPONSLEVEL3), ActTech(UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL3), ] self.attack = PlanZoneAttack(40) worker_scout = Step(None, WorkerScout(), skip_until=UnitExists(UnitTypeId.SUPPLYDEPOT, 1)) self.distribute_workers = PlanDistributeWorkers() tactics = [ PlanCancelBuilding(), LowerDepots(), PlanZoneDefense(), worker_scout, Step(None, CallMule(50), skip=RequiredTime(5 * 60)), Step(None, CallMule(100), skip_until=RequiredTime(5 * 60)), Step(None, ScanEnemy(), skip_until=RequiredTime(5 * 60)), self.distribute_workers, ManTheBunkers(), Repair(), ContinueBuilding(), PlanZoneGatherTerran(), Step(RequiredTechReady(UpgradeId.CYCLONELOCKONDAMAGEUPGRADE, 0.95), self.attack), PlanFinishEnemy(), ] return BuildOrder( Step(UnitExists(UnitTypeId.BARRACKS, 1), SequentialList(self.depots)), [ Step( UnitExists(UnitTypeId.COMMANDCENTER, 2), MorphOrbitals(3), skip_until=RequiredUnitReady(UnitTypeId.BARRACKS, 1), ), Step(None, MorphPlanetary(2), skip_until=RequiredUnitReady(UnitTypeId.ENGINEERINGBAY, 1)), ], [ Step(None, ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 40)), Step( UnitExists(UnitTypeId.COMMANDCENTER, 3), ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 70), ), ], upgrades, ActUnit(UnitTypeId.MARINE, UnitTypeId.BARRACKS, 4), [ ActUnit(UnitTypeId.CYCLONE, UnitTypeId.FACTORY, 4), ActUnitOnce(UnitTypeId.HELLION, UnitTypeId.FACTORY, 1), ActUnit(UnitTypeId.CYCLONE, UnitTypeId.FACTORY, 4), ActUnit( UnitTypeId.CYCLONE, UnitTypeId.FACTORY, 120, priority=True), ], Step( RequiredUnitReady(UnitTypeId.FACTORYREACTOR, 1), ActUnit(UnitTypeId.HELLION, UnitTypeId.FACTORY, 60), skip_until=RequiredMinerals(300), ), buildings, SequentialList(tactics), )
def depots(self) -> List[Step]: return [ Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 1), None), Step(RequiredSupplyLeft(6), GridBuilding(UnitTypeId.SUPPLYDEPOT, 2)), Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 2), None), Step(RequiredSupplyLeft(14), GridBuilding(UnitTypeId.SUPPLYDEPOT, 4)), Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 4), None), Step(RequiredSupplyLeft(20), GridBuilding(UnitTypeId.SUPPLYDEPOT, 6)), Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 5), None), Step(RequiredSupplyLeft(20), GridBuilding(UnitTypeId.SUPPLYDEPOT, 7)), Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 6), None), Step(RequiredSupplyLeft(20), GridBuilding(UnitTypeId.SUPPLYDEPOT, 10)), Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 8), None), Step(RequiredSupplyLeft(20), GridBuilding(UnitTypeId.SUPPLYDEPOT, 12)), Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 10), None), Step(RequiredSupplyLeft(20), GridBuilding(UnitTypeId.SUPPLYDEPOT, 14)), Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 13), None), Step(RequiredSupplyLeft(20), GridBuilding(UnitTypeId.SUPPLYDEPOT, 16)), Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 16), GridBuilding(UnitTypeId.SUPPLYDEPOT, 20)), ]
def __init__(self): gas_related = [ Step(RequiredUnitExists(UnitTypeId.HATCHERY, 2), ActTech(UpgradeId.ZERGLINGMOVEMENTSPEED), skip_until=RequiredGas(100)), Step(None, ActBuilding(UnitTypeId.ROACHWARREN, 1), skip_until=RequiredGas(100)), StepBuildGas(2, RequiredTime(4 * 60), RequiredGas(100)), StepBuildGas(3, RequiredUnitExists(UnitTypeId.HYDRALISKDEN, 1), RequiredGas(50)), StepBuildGas(4, RequiredSupply(60, SupplyType.Workers), RequiredGas(25)), StepBuildGas(6, RequiredMinerals(749), RequiredGas(25)), StepBuildGas(8, RequiredMinerals(1000), RequiredGas(25)), ] buildings = [ Step(RequiredUnitExists(UnitTypeId.DRONE, 14), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2)), Step(RequiredSupply(16), ActExpand(2)), Step(RequiredSupply(18), ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)), StepBuildGas(1, RequiredSupply(20)), Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 2), skip_until=RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1)), Step( RequiredUnitExists(UnitTypeId.DRONE, 24, include_killed=True, include_pending=True), ActExpand(3)), Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 3)), Step(None, MorphLair(), skip=RequiredUnitExists(UnitTypeId.HIVE, 1)), Step(RequiredUnitExists(UnitTypeId.DRONE, 30, include_killed=True), ActExpand(4)), Step(RequiredUnitReady(UnitTypeId.LAIR, 1), ActBuilding(UnitTypeId.HYDRALISKDEN, 1)), MorphOverseer(1), Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 4)), Step(RequiredSupply(100), ActExpand(5)), Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 10), skip_until=RequiredMinerals(500)), # anti air defense! ] units = [ Step(RequiredUnitExists(UnitTypeId.HATCHERY, 1), None), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 23)), # Early zerglings Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 4), None), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 28)), Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 12), None), # Queen for more larvae Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 1)), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 35), None), Step(None, ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 16), None), Step(None, ActUnitOnce(UnitTypeId.ROACH, UnitTypeId.LARVA, 4), skip_until=RequiredGas(25)), Step(None, ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 100), skip_until=RequiredMinerals(750)), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 45), None), Step(None, ActUnit(UnitTypeId.HYDRALISK, UnitTypeId.LARVA, 7), skip=RequiredUnitReady(UnitTypeId.HYDRALISKDEN, 1)), Step(None, ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 24), None), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 50), None), Step(None, ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA, 10), skip_until=RequiredGas(25)), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 70), None), Step(None, ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA), skip=RequiredUnitReady(UnitTypeId.HYDRALISKDEN, 1)), # Endless hydralisk Step(None, ActUnit(UnitTypeId.HYDRALISK, UnitTypeId.LARVA), None) ] super().__init__([self.overlords, buildings, gas_related, units])
def __init__(self): gas_related = [ StepBuildGas(1, UnitExists(UnitTypeId.HATCHERY, 2)), Step(None, Tech(UpgradeId.ZERGLINGMOVEMENTSPEED), skip_until=Gas(100)), ] buildings = [ # 12 Pool Step(None, ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)), Step(UnitExists(UnitTypeId.ZERGLING, 4, include_killed=True), Expand(2)), Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 2)), Step(UnitExists(UnitTypeId.DRONE, 24, include_killed=True), Expand(3)), Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 3)), Step(UnitExists(UnitTypeId.DRONE, 30, include_killed=True), Expand(4)), Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 4)), ] spire_end_game = [ Step(Any([Supply(70), UnitExists(UnitTypeId.LAIR, 1)]), None), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 35), MorphLair(), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 40), StepBuildGas(3, None), ActBuilding(UnitTypeId.SPIRE, 1), ActUnit(UnitTypeId.MUTALISK, UnitTypeId.LARVA, 10, priority=True), ] units = [ Step(None, None, UnitExists(UnitTypeId.HATCHERY, 1)), # 12 Pool followed by overlord Step( UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2), UnitExists(UnitTypeId.OVERLORD, 2), ), # TheMusZero Step( UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14), UnitExists(UnitTypeId.DRONE, 14), ), # Early zerglings Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 4), None), # Queen for more larvae Step( UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 1), UnitExists(UnitTypeId.QUEEN, 1), ), Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 20), None), Step( UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 12), None, ), Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 30), None), # Endless zerglings Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA), None), ] super().__init__( [self.overlords, buildings, spire_end_game, gas_related, units])
def __init__(self): """Research basic unit upgrades with Overlord Speed and Burrow.""" upgrades = BuildOrder([ # ranged upgrades SequentialList( Step( RequiredUnitReady(UnitTypeId.EVOLUTIONCHAMBER), ActTech(UpgradeId.ZERGMISSILEWEAPONSLEVEL1, UnitTypeId.EVOLUTIONCHAMBER), ), Step( RequiredAll([ RequiredUnitReady(UnitTypeId.EVOLUTIONCHAMBER), RequiredTechReady(UpgradeId.ZERGMISSILEWEAPONSLEVEL1), UnitExists(UnitTypeId.LAIR), ]), ActTech(UpgradeId.ZERGMISSILEWEAPONSLEVEL2, UnitTypeId.EVOLUTIONCHAMBER), ), Step( RequiredAll([ RequiredUnitReady(UnitTypeId.EVOLUTIONCHAMBER), RequiredTechReady(UpgradeId.ZERGMISSILEWEAPONSLEVEL2), UnitExists(UnitTypeId.HIVE), ]), ActTech(UpgradeId.ZERGMISSILEWEAPONSLEVEL3, UnitTypeId.EVOLUTIONCHAMBER), ), ), # ground carapace upgrades SequentialList( Step( RequiredUnitReady(UnitTypeId.EVOLUTIONCHAMBER), ActTech(UpgradeId.ZERGGROUNDARMORSLEVEL1, UnitTypeId.EVOLUTIONCHAMBER), ), Step( RequiredAll([ RequiredUnitReady(UnitTypeId.EVOLUTIONCHAMBER), RequiredTechReady(UpgradeId.ZERGGROUNDARMORSLEVEL1), UnitExists(UnitTypeId.LAIR), ]), ActTech(UpgradeId.ZERGGROUNDARMORSLEVEL2, UnitTypeId.EVOLUTIONCHAMBER), ), Step( RequiredAll([ RequiredUnitReady(UnitTypeId.EVOLUTIONCHAMBER), RequiredTechReady(UpgradeId.ZERGGROUNDARMORSLEVEL2), UnitExists(UnitTypeId.HIVE), ]), ActTech(UpgradeId.ZERGGROUNDARMORSLEVEL3, UnitTypeId.EVOLUTIONCHAMBER), ), ), # melee upgrades SequentialList( Step( RequiredUnitReady(UnitTypeId.EVOLUTIONCHAMBER), ActTech(UpgradeId.ZERGMELEEWEAPONSLEVEL1, UnitTypeId.EVOLUTIONCHAMBER), ), Step( RequiredAll([ RequiredUnitReady(UnitTypeId.EVOLUTIONCHAMBER), RequiredTechReady(UpgradeId.ZERGMELEEWEAPONSLEVEL1), UnitExists(UnitTypeId.LAIR), ]), ActTech(UpgradeId.ZERGMELEEWEAPONSLEVEL2, UnitTypeId.EVOLUTIONCHAMBER), ), Step( RequiredAll([ RequiredUnitReady(UnitTypeId.EVOLUTIONCHAMBER), RequiredTechReady(UpgradeId.ZERGMELEEWEAPONSLEVEL2), UnitExists(UnitTypeId.HIVE), ]), ActTech(UpgradeId.ZERGMELEEWEAPONSLEVEL3, UnitTypeId.EVOLUTIONCHAMBER), ), ), # overlord speed then burrow SequentialList( Step(UnitExists(UnitTypeId.QUEEN, 2), ActTech(UpgradeId.OVERLORDSPEED, UnitTypeId.HATCHERY)), Step(UnitExists(UnitTypeId.LAIR), ActTech(UpgradeId.BURROW, UnitTypeId.LAIR)), ), Step( RequiredAll([ UnitExists(UnitTypeId.INFESTATIONPIT), RequiredUnitReady(UnitTypeId.LAIR), RequiredTechReady(UpgradeId.ZERGMISSILEWEAPONSLEVEL2), ]), MorphHive(), ), ]) super().__init__([upgrades])