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), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2), ActBuilding(UnitTypeId.ROACHWARREN, 1), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 1), ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA, 100), ]), in_case_of_air, SequentialList([ DistributeWorkers(), Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), PlanZoneDefense(), AutoOverLord(), InjectLarva(), PlanZoneGather(), Step(UnitExists(UnitTypeId.ROACH, 7), PlanZoneAttackAllIn(1)), PlanFinishEnemy(), ]) ])
async def create_plan(self) -> BuildOrder: attack = TheAttack(4) return BuildOrder([ Step(None, ChronoUnit(UnitTypeId.STALKER, UnitTypeId.GATEWAY)), SequentialList([ GridBuilding(UnitTypeId.PYLON, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 15), GridBuilding(UnitTypeId.GATEWAY, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 16), StepBuildGas(1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 19), StepBuildGas(2), GridBuilding(UnitTypeId.CYBERNETICSCORE, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 21), GridBuilding(UnitTypeId.PYLON, 2), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22), ProtossUnit(UnitTypeId.STALKER, 1), Tech(UpgradeId.WARPGATERESEARCH, UnitTypeId.CYBERNETICSCORE), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 23), GridBuilding(UnitTypeId.GATEWAY, 4), GridBuilding(UnitTypeId.PYLON, 3), BuildOrder([AutoPylon(), ProtossUnit(UnitTypeId.STALKER, 100)]) ]), SequentialList([ PlanZoneDefense(), RestorePower(), DistributeWorkers(), Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), PlanZoneGather(), Step(UnitReady(UnitTypeId.GATEWAY, 4), attack), PlanFinishEnemy(), ]) ])
def __init__(self): ultras = [ Step(RequiredUnitExists(UnitTypeId.ULTRALISKCAVERN, 1), None), Step( RequiredGas(500), ActUnit(UnitTypeId.ULTRALISK, UnitTypeId.LARVA, priority=True)), ] units = [ Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 100), skip=RequiredUnitExists(UnitTypeId.HIVE, 1)), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 50)), Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA), None) ] build_step_expansions = [ Step(None, ActExpand(999)), ] queens = [ Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1), None), Step(RequiredMinerals(500), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 5)), ] pool_and_tech = [ Step(None, ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)), StepBuildGas(2, None), Step(None, ActTech(UpgradeId.ZERGLINGMOVEMENTSPEED)), Step(RequiredGas(120), ActBuilding(UnitTypeId.EVOLUTIONCHAMBER, 2)), Step(RequiredUnitExists(UnitTypeId.EVOLUTIONCHAMBER, 1), ActTech(UpgradeId.ZERGMELEEWEAPONSLEVEL1)), Step(None, ActTech(UpgradeId.ZERGGROUNDARMORSLEVEL1)), Step(None, MorphLair(), skip=RequiredUnitExists(UnitTypeId.HIVE, 1)), StepBuildGas(4, None), Step(None, ActTech(UpgradeId.ZERGMELEEWEAPONSLEVEL2)), Step(None, ActTech(UpgradeId.ZERGGROUNDARMORSLEVEL2)), # Infestation pit required Step(None, ActBuilding(UnitTypeId.INFESTATIONPIT, 1)), Step(RequiredUnitReady(UnitTypeId.INFESTATIONPIT, 1), MorphHive()), Step(RequiredUnitReady(UnitTypeId.HIVE, 1), ActTech(UpgradeId.ZERGLINGATTACKSPEED)), StepBuildGas(6, None), Step(None, ActBuilding(UnitTypeId.ULTRALISKCAVERN, 1)), Step(None, ActTech(UpgradeId.ZERGMELEEWEAPONSLEVEL3)), Step(None, ActTech(UpgradeId.ZERGGROUNDARMORSLEVEL3)), Step(None, ActTech(UpgradeId.CHITINOUSPLATING)), Step(None, ActTech(UpgradeId.ANABOLICSYNTHESIS)), ] super().__init__([ self.overlords, ultras, units, build_step_expansions, queens, pool_and_tech ])
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(90), 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])
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) ] limit_gas = Any( [Gas(100), TechReady(UpgradeId.ZERGLINGMOVEMENTSPEED, 0.001)]) return BuildOrder([ SequentialList([ ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14), Expand(2), StepBuildGas(1), ActBuilding(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2), Step(None, Tech(UpgradeId.ZERGLINGMOVEMENTSPEED, UnitTypeId.SPAWNINGPOOL), skip_until=Gas(100)), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 30), ActBuilding(UnitTypeId.BANELINGNEST, 1), BuildOrder([ Step(None, ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 200), skip=RequireCustom(lambda k: self._bot.vespene > 25 or flying_buildings)), Step(None, ActUnit(UnitTypeId.BANELING, UnitTypeId.ZERGLING, 200), skip=RequireCustom(flying_buildings)), ]) ]), SequentialList([ Step(None, DistributeWorkers(), skip=limit_gas), Step(limit_gas, DistributeWorkers(1, 1), skip=RequireCustom(flying_buildings)), Step(RequireCustom(flying_buildings), DistributeWorkers()), ]), in_case_of_air, SequentialList([ Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), PlanZoneDefense(), AutoOverLord(), InjectLarva(), PlanZoneGather(), Step(TechReady(UpgradeId.ZERGLINGMOVEMENTSPEED), PlanZoneAttackAllIn(10)), PlanFinishEnemy(), ]) ])
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.enemy_structures.flying.exists and self.supply_used > 30), StepBuildGas(2)), ActExpand(2), UnitExists(UnitTypeId.DRONE, 20), MorphLair(), UnitExists(UnitTypeId.DRONE, 30), StepBuildGas(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, finish, build_step_units, AutoOverLord(), PlanDistributeWorkers(), InjectLarva(), PlanWorkerOnlyDefense(), PlanZoneDefense(), PlanZoneGather(), PlanZoneAttack2(2), PlanFinishEnemy(), )
def __init__(self, orders: List[Union[ActBase, List[ActBase]]]): """ Build order package that replaces normal build order for Zerg with one that builds mutalisks to destroy terran flying buildings. Add any PlanDistributeWorkers acts with orders """ cover_list = SequentialList([ PlanDistributeWorkers(), AutoOverLord(), Step(None, ZergUnit(UnitTypeId.DRONE, 20), skip=Supply(198)), StepBuildGas(4, None), MorphLair(), ActBuilding(UnitTypeId.SPIRE, 1), Step( None, DefensiveBuilding(UnitTypeId.SPORECRAWLER, DefensePosition.BehindMineralLineCenter), skip_until=Supply(199), ), Step( None, DefensiveBuilding(UnitTypeId.SPINECRAWLER, DefensePosition.Entrance), skip_until=Supply(199), ), ZergUnit(UnitTypeId.MUTALISK, 10), ]) new_build_order = [ Step(None, cover_list, skip_until=self.should_build_mutalisks), Step(None, BuildOrder(orders), skip=self.should_build_mutalisks), ] super().__init__(new_build_order)
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(), ), )
def __init__(self): gas_related = [ StepBuildGas(1, UnitExists(UnitTypeId.HATCHERY, 2)), Step(None, Tech(UpgradeId.ZERGLINGMOVEMENTSPEED), skip_until=Gas(100)), Step(None, ActBuilding(UnitTypeId.ROACHWARREN, 1), skip_until=Gas(100)), ] buildings = [ Step(UnitExists(UnitTypeId.DRONE, 14), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2)), Step(None, Expand(2)), Step(UnitExists(UnitTypeId.EXTRACTOR, 1), ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)), Step( None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 2), skip_until=UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ), 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)), Step(Minerals(500), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 10)), # anti air defense! ] units = [ Step(UnitExists(UnitTypeId.HATCHERY, 1), None), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 20)), # Early zerglings Step(UnitExists(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, 30), None), Step(None, ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 16), None), Step(None, ActUnitOnce(UnitTypeId.ROACH, UnitTypeId.LARVA, 4), skip_until=Gas(25)), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 40), None), Step(None, ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 16), None), Step(None, ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA, 10), skip_until=Gas(25)), # Endless zerglings Step(None, ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA), None), ] super().__init__([self.overlords, buildings, gas_related, units])
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 __init__(self): """Set everything up.""" self.enemy_rushes = { EnemyBuild.GeneralRush, EnemyBuild.Pool12, EnemyBuild.RoachRush, EnemyBuild.LingRush, EnemyBuild.CannonRush, EnemyBuild.EarlyMarines, } self.distribute = PlanDistributeWorkers() # basic build (17, 18, 17) base_build = SequentialList([ Step(None, ZergUnit(UnitTypeId.DRONE, to_count=13)), Step(None, ZergUnit(UnitTypeId.OVERLORD, to_count=2)), Step(None, ZergUnit(UnitTypeId.DRONE, to_count=17)), Step( None, ActExpand(to_count=2, priority=True, consider_worker_production=False)), Step(None, ZergUnit(UnitTypeId.DRONE, to_count=18)), Step(RequiredMinerals(120), StepBuildGas(to_count=1)), Step(None, ActBuilding(UnitTypeId.SPAWNINGPOOL)), Step(None, ZergUnit(UnitTypeId.DRONE, to_count=20)), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), ZergUnit(UnitTypeId.ZERGLING, to_count=6)), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), ZergUnit(UnitTypeId.QUEEN, to_count=2)), Step( RequiredAll( [UnitExists(UnitTypeId.SPAWNINGPOOL), RequiredGas(100)]), ActTech(UpgradeId.ZERGLINGMOVEMENTSPEED), ), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), ZergUnit(UnitTypeId.ZERGLING, to_count=100)), ]) build_together = BuildOrder([ Step(None, base_build, skip=lambda k: k.ai.scout_manager.enemy_build in self. enemy_rushes), Step(None, RoachRushResponse(), skip=lambda k: k.ai.scout_manager.enemy_build != EnemyBuild. RoachRush), ]) super().__init__(build_together, self.distribute, AutoOverLord(), InjectLarva(), SpreadCreep())
def __init__(self): """Build order steps to be combined.""" opening = SequentialList([ Step(None, ZergUnit(UnitTypeId.DRONE, to_count=13, only_once=True)), Step(None, ZergUnit(UnitTypeId.OVERLORD, to_count=2, only_once=True)), Step(None, ZergUnit(UnitTypeId.DRONE, to_count=17)), Step(None, ActExpand(2)), Step(None, ZergUnit(UnitTypeId.DRONE, to_count=18, only_once=True)), Step(None, StepBuildGas(to_count=1)), Step( RequiredUnitExists( UnitTypeId.EXTRACTOR, count=1, include_pending=True, include_not_ready=True, ), ActBuilding(UnitTypeId.SPAWNINGPOOL), ), Step( RequiredUnitExists( UnitTypeId.SPAWNINGPOOL, count=1, include_not_ready=True, include_pending=True, ), ZergUnit(UnitTypeId.DRONE, to_count=21), ), Step( RequiredUnitExists(UnitTypeId.SPAWNINGPOOL), ZergUnit(UnitTypeId.ZERGLING, to_count=6), ), Step( RequiredUnitExists(UnitTypeId.SPAWNINGPOOL), ZergUnit(UnitTypeId.QUEEN, to_count=2), ), Step(None, ActExpand(3)), ]) ling_speed = BuildOrder([ Step( RequiredAll([ RequiredUnitExists(UnitTypeId.SPAWNINGPOOL), RequiredGas(100) ]), ActTech(UpgradeId.ZERGLINGMOVEMENTSPEED, UnitTypeId.SPAWNINGPOOL), ) ]) super().__init__([opening, ling_speed])
async def create_plan(self) -> BuildOrder: finish_rush = Any([Gas(150), UnitExists(UnitTypeId.PLANETARYFORTRESS)]) return BuildOrder([ SequentialList([ BuildPosition(UnitTypeId.COMMANDCENTER, self._bot.knowledge.zone_manager.enemy_natural. center_location, exact=True, only_once=True), StepBuildGas(2), ActBuilding(UnitTypeId.ENGINEERINGBAY), ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 17), MorphProxyPlanetary(), GridBuilding(UnitTypeId.SUPPLYDEPOT, 1), BuildOrder([ ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 38), ActUnit(UnitTypeId.SCV, UnitTypeId.PLANETARYFORTRESS, 38), GridBuilding(UnitTypeId.BARRACKS, 4), BuildAddon(UnitTypeId.BARRACKSTECHLAB, UnitTypeId.BARRACKS, 2), BuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS, 2), Tech(UpgradeId.STIMPACK, UnitTypeId.BARRACKSTECHLAB), Tech(UpgradeId.TERRANINFANTRYWEAPONSLEVEL1, UnitTypeId.ENGINEERINGBAY), AutoDepot(), ActUnit(UnitTypeId.MARAUDER, UnitTypeId.BARRACKS, 50), ActUnit(UnitTypeId.MARINE, UnitTypeId.BARRACKS, 100), GridBuilding(UnitTypeId.BARRACKS, 6), BuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS, 4), ]), ]), SequentialList([ Step(None, DistributeWorkers(min_gas=6), skip=finish_rush), Step(finish_rush, DistributeWorkers(max_gas=4)), ]), SequentialList([ Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), PlanCancelBuilding(), LowerDepots(), PlanZoneDefense(), ManTheBunkers(), Repair(), ContinueBuilding(), PlanZoneGatherTerran(), Step(TechReady(UpgradeId.TERRANINFANTRYWEAPONSLEVEL1), PlanZoneAttack(20)), PlanFinishEnemy(), ]) ])
def __init__(self): gas_related = [ Step(UnitExists(UnitTypeId.HATCHERY, 2), Tech(UpgradeId.ZERGLINGMOVEMENTSPEED), skip_until=Gas(100), ), Step(None, ActBuilding(UnitTypeId.ROACHWARREN, 1), skip_until=Gas(100)), StepBuildGas(2, Time(4 * 60), Gas(100)), StepBuildGas(3, UnitExists(UnitTypeId.HYDRALISKDEN, 1), Gas(50)), StepBuildGas(4, Supply(60, SupplyType.Workers), Gas(25)), StepBuildGas(6, Minerals(749), Gas(25)), StepBuildGas(8, Minerals(1000), Gas(25)), ] buildings = [ Step(UnitExists(UnitTypeId.DRONE, 14), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2)), Step(Supply(16), Expand(2)), Step(Supply(18), ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)), StepBuildGas(1, Supply(20)), Step( None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 2), skip_until=UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ), Step(UnitExists(UnitTypeId.DRONE, 24, include_killed=True, include_pending=True), Expand(3)), Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 3)), Step(None, MorphLair(), skip=UnitExists(UnitTypeId.HIVE, 1)), Step(UnitExists(UnitTypeId.DRONE, 30, include_killed=True), Expand(4)), Step(UnitReady(UnitTypeId.LAIR, 1), ActBuilding(UnitTypeId.HYDRALISKDEN, 1)), MorphOverseer(1), Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 4)), Step(Supply(100), Expand(5)), Step( None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 10), skip_until=Minerals(500) ), # anti air defense! ] units = [ Step(UnitExists(UnitTypeId.HATCHERY, 1), None), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 23)), # Early zerglings Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 4), None), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 28)), Step(UnitExists(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=Gas(25)), Step(None, ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 100), skip_until=Minerals(750)), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 45), None), Step(None, ActUnit(UnitTypeId.HYDRALISK, UnitTypeId.LARVA, 7), skip=UnitReady(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=Gas(25)), Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 70), None), Step(None, ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA), skip=UnitReady(UnitTypeId.HYDRALISKDEN, 1)), # Endless hydralisk Step(None, ActUnit(UnitTypeId.HYDRALISK, UnitTypeId.LARVA), None), ] super().__init__([self.overlords, buildings, gas_related, units])
def __init__(self): """Create plan for build order.""" self.drones = ZergUnit(UnitTypeId.DRONE, to_count=0) self.lings = ZergUnit(UnitTypeId.ZERGLING, to_count=999) self.queens = ZergUnit(UnitTypeId.QUEEN, to_count=3) self.roaches = ZergUnit(UnitTypeId.ROACH, to_count=100, priority=True) self.ravagers = ZergUnit(UnitTypeId.RAVAGER, to_count=0) self.defense_spines = DefensiveBuilding( unit_type=UnitTypeId.SPINECRAWLER, position_type=DefensePosition.Entrance, to_base_index=1, to_count=3 ) self.gas = StepBuildGas(to_count=3) unit_building = BuildOrder( [ Step(None, self.drones, skip_until=self.should_build_drones), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), self.defense_spines), Step( RequiredAll([UnitExists(UnitTypeId.ROACHWARREN), UnitExists(UnitTypeId.ROACH)]), self.ravagers, skip_until=self.should_build_ravagers, ), Step(UnitExists(UnitTypeId.ROACHWARREN), self.roaches), Step( RequiredAll( [ UnitExists(UnitTypeId.SPAWNINGPOOL), UnitExists( UnitTypeId.ROACHWARREN, include_pending=True, include_not_ready=True, include_killed=True, ), ] ), self.lings, ), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), self.queens), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), self.lings), ] ) buildings: BuildOrder = BuildOrder( [ Step(None, ActBuilding(UnitTypeId.SPAWNINGPOOL, to_count=1)), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), ActBuilding(UnitTypeId.ROACHWARREN, to_count=1)), Step(None, self.gas, skip_until=self.should_build_gas), ] ) super().__init__(buildings, unit_building)
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 __init__(self): """Create the build order.""" opener = SequentialList( Step( RequiredUnitReady(UnitTypeId.SPAWNINGPOOL), NatSpines(4), skip=RequiredUnitReady(UnitTypeId.SPINECRAWLER, count=4), skip_until=lambda k: k.build_detector.rush_detected, ), Step(None, ZergUnit(UnitTypeId.DRONE, to_count=13)), Step(None, ZergUnit(UnitTypeId.OVERLORD, to_count=2)), Step(None, ZergUnit(UnitTypeId.DRONE, to_count=17)), Step(None, ActExpand(2, priority=True, consider_worker_production=False)), Step( UnitExists(UnitTypeId.HATCHERY, count=2, include_pending=True, include_not_ready=True), ZergUnit(UnitTypeId.DRONE, to_count=18), ), Step(None, ActBuilding(UnitTypeId.SPAWNINGPOOL)), Step(None, ZergUnit(UnitTypeId.DRONE, to_count=20)), StepBuildGas(1), Step(RequiredUnitReady(UnitTypeId.SPAWNINGPOOL), ZergUnit(UnitTypeId.QUEEN, 2)), Step(RequiredUnitReady(UnitTypeId.SPAWNINGPOOL), ZergUnit(UnitTypeId.ZERGLING, 6)), Step(None, ZergUnit(UnitTypeId.OVERLORD, to_count=3)), BuildOrder([ Step(RequiredGas(100), MorphLair()), Step( None, ZergUnit(UnitTypeId.DRONE), skip=UnitExists(UnitTypeId.LAIR, include_pending=True, include_not_ready=True), ), ]) # end of build hard order, switch to reactive play ) super().__init__([opener, AutoOverLord()])
async def create_plan(self) -> BuildOrder: self.knowledge.building_solver.wall_type = WallType.ProtossMainZerg attack = PlanZoneAttack(4) return BuildOrder( [ ChronoUnitProduction(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), StepBuildGas(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(RequiredUnitReady(UnitTypeId.STARGATE, 1), GridBuilding(UnitTypeId.FLEETBEACON, 1)), ), [ProtossUnit(UnitTypeId.TEMPEST, 100, priority=True)], [Step(UnitExists(UnitTypeId.FLEETBEACON, 1), GridBuilding(UnitTypeId.STARGATE, 2))], ), ), ActDefensiveCannons(4, 2, 0), SequentialList( PlanZoneDefense(), RestorePower(), PlanDistributeWorkers(), PlanZoneGather(), Step(UnitExists(UnitTypeId.TEMPEST, 1, include_killed=True), attack), PlanFinishEnemy(), ), ] )
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), )
async def create_plan(self) -> BuildOrder: attack = TheAttack(4) return BuildOrder( Step( None, ChronoUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS), skip=UnitExists(UnitTypeId.PROBE, 30, include_pending=True), skip_until=UnitExists(UnitTypeId.ASSIMILATOR, 1), ), ChronoUnit(UnitTypeId.IMMORTAL, UnitTypeId.ROBOTICSFACILITY), SequentialList( ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 14), GridBuilding(UnitTypeId.PYLON, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 16), BuildGas(1), GridBuilding(UnitTypeId.GATEWAY, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 20), Expand(2), GridBuilding(UnitTypeId.CYBERNETICSCORE, 1), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 21), BuildGas(2), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22), GridBuilding(UnitTypeId.PYLON, 1), BuildOrder( AutoPylon(), ProtossUnit(UnitTypeId.STALKER, 2, priority=True), Tech(UpgradeId.WARPGATERESEARCH), [ ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22), Step(UnitExists(UnitTypeId.NEXUS, 2), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 44)), StepBuildGas(3, skip=Gas(300)), Step(UnitExists(UnitTypeId.NEXUS, 3), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 56)), StepBuildGas(5, skip=Gas(200)), ], SequentialList( [ Step( UnitReady(UnitTypeId.CYBERNETICSCORE, 1), GridBuilding(UnitTypeId.TWILIGHTCOUNCIL, 1), ), GridBuilding(UnitTypeId.ROBOTICSFACILITY, 1), Step(UnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), Tech(UpgradeId.CHARGE)), ] ), [ ActUnit(UnitTypeId.IMMORTAL, UnitTypeId.ROBOTICSFACILITY, 1, priority=True), ActUnit(UnitTypeId.OBSERVER, UnitTypeId.ROBOTICSFACILITY, 1, priority=True), ActUnit(UnitTypeId.IMMORTAL, UnitTypeId.ROBOTICSFACILITY, 20, priority=True), ], Step(Time(60 * 5), Expand(3)), [ProtossUnit(UnitTypeId.ZEALOT, 100)], [ GridBuilding(UnitTypeId.GATEWAY, 4), StepBuildGas(4, skip=Gas(200)), GridBuilding(UnitTypeId.ROBOTICSFACILITY, 2), ], ), ), SequentialList( PlanCancelBuilding(), PlanHeatObserver(), PlanZoneDefense(), RestorePower(), DistributeWorkers(), PlanZoneGather(), Step(UnitReady(UnitTypeId.IMMORTAL, 3), attack), PlanFinishEnemy(), ), )
async def create_plan(self) -> BuildOrder: attack = TheAttack(4) return BuildOrder([ Step(None, ChronoUnitProduction(UnitTypeId.PROBE, UnitTypeId.NEXUS), skip=RequiredUnitExists(UnitTypeId.PROBE, 30, include_pending=True), skip_until=RequiredUnitExists(UnitTypeId.ASSIMILATOR, 1)), ChronoUnitProduction(UnitTypeId.VOIDRAY, UnitTypeId.STARGATE), SequentialList([ ProtossUnit(UnitTypeId.PROBE, 14), GridBuilding(UnitTypeId.PYLON, 1), ProtossUnit(UnitTypeId.PROBE, 16), StepBuildGas(1), GridBuilding(UnitTypeId.GATEWAY, 1), ProtossUnit(UnitTypeId.PROBE, 20), GridBuilding(UnitTypeId.CYBERNETICSCORE, 1), ProtossUnit(UnitTypeId.PROBE, 21), ActExpand(2), ProtossUnit(UnitTypeId.PROBE, 22), StepBuildGas(2), GridBuilding(UnitTypeId.PYLON, 1), BuildOrder([ AutoPylon(), GateUnit(UnitTypeId.STALKER, 2, priority=True), ActTech(UpgradeId.WARPGATERESEARCH), [ ProtossUnit(UnitTypeId.PROBE, 22), Step(RequiredUnitExists(UnitTypeId.NEXUS, 2), ProtossUnit(UnitTypeId.PROBE, 44)), StepBuildGas(3, skip=RequiredGas(300)), Step(RequiredUnitExists(UnitTypeId.NEXUS, 3), ProtossUnit(UnitTypeId.PROBE, 56)), StepBuildGas(5, skip=RequiredGas(200)), ], SequentialList([ Step(RequiredUnitReady(UnitTypeId.CYBERNETICSCORE, 1), GridBuilding(UnitTypeId.TWILIGHTCOUNCIL, 1)), GridBuilding(UnitTypeId.STARGATE, 1), Step(RequiredUnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), ActTech(UpgradeId.CHARGE)), Step(RequiredUnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), ActTech(UpgradeId.ADEPTPIERCINGATTACK)), ]), [ProtossUnit(UnitTypeId.VOIDRAY, 20, priority=True)], Step(RequiredTime(60 * 5), ActExpand(3)), [ GateUnit(UnitTypeId.ZEALOT, 6), GateUnit(UnitTypeId.ADEPT, 10), GateUnit(UnitTypeId.ZEALOT, 15), GateUnit(UnitTypeId.ADEPT, 20), GateUnit(UnitTypeId.ZEALOT, 23), GateUnit(UnitTypeId.ADEPT, 30) ], [ GridBuilding(UnitTypeId.GATEWAY, 4), StepBuildGas(4, skip=RequiredGas(200)), GridBuilding(UnitTypeId.STARGATE, 2), ] ]) ]), SequentialList([ PlanZoneDefense(), RestorePower(), PlanDistributeWorkers(), PlanZoneGather(), Step(RequiredUnitReady(UnitTypeId.VOIDRAY, 3), attack), PlanFinishEnemy(), ]) ])
def __init__(self): """Build order steps to be combined.""" extractor_trick = SequentialList([ Step( RequiredSupply(14), StepBuildGas(1), skip=RequiredUnitExists(UnitTypeId.EXTRACTOR, include_killed=True, include_pending=True), ), Step( RequiredUnitExists( UnitTypeId.EXTRACTOR, 1, include_pending=True, include_not_ready=True, ), ZergUnit(UnitTypeId.DRONE, to_count=14), ), # SequentialList will take care of making sure the drone was made Step( RequiredUnitExists(UnitTypeId.EXTRACTOR), CancelBuilding(UnitTypeId.EXTRACTOR, to_count=0), skip=RequiredUnitExists( UnitTypeId.EXTRACTOR, 1, include_killed=True, include_not_ready=False, ), ), ]) opening = SequentialList([ Step(None, ZergUnit(UnitTypeId.DRONE, to_count=14)), Step( RequiredSupply(14), extractor_trick, skip=RequiredUnitExists( UnitTypeId.EXTRACTOR, 1, include_killed=True, include_not_ready=False, ), ), ActExpand(2, priority=True, consider_worker_production=False), Step( RequiredAll([RequiredSupply(14), RequiredMinerals(130)]), StepBuildGas(1), ), Step(None, ZergUnit(UnitTypeId.DRONE, to_count=14)), Step(RequiredSupply(14), ActBuilding(UnitTypeId.SPAWNINGPOOL)), Step( RequiredAll([ RequiredUnitExists(UnitTypeId.HATCHERY), RequiredUnitExists(UnitTypeId.SPAWNINGPOOL) ]), ZergUnit(UnitTypeId.QUEEN, 2), ), # spam lings Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL), ZergUnit(UnitTypeId.ZERGLING, 999)), ]) ling_speed = BuildOrder([ Step( RequiredAll([ RequiredUnitExists(UnitTypeId.SPAWNINGPOOL), RequiredGas(100) ]), ActTech(UpgradeId.ZERGLINGMOVEMENTSPEED, UnitTypeId.SPAWNINGPOOL), ) ]) worker_distribution = SequentialList([ Step( RequiredSupply(15), PlanDistributeWorkers(), skip=RequiredUnitExists( UnitTypeId.HATCHERY, 2, include_killed=True, ), ), Step( RequiredUnitExists(UnitTypeId.EXTRACTOR), PlanDistributeWorkers(min_gas=3), skip=RequiredAny([ RequiredTechReady(UpgradeId.ZERGLINGMOVEMENTSPEED, percentage=0.01), RequiredGas(96) ]), ), Step( RequiredAny([ RequiredTechReady(UpgradeId.ZERGLINGMOVEMENTSPEED, percentage=0.01), RequiredGas(96) ]), PlanDistributeWorkers(max_gas=0), ), ]) overlords = BuildOrder([ Step( None, AutoOverLord(), skip_until=RequiredUnitExists(UnitTypeId.SPAWNINGPOOL), ) ]) super().__init__([opening, ling_speed, worker_distribution, overlords])
async def create_plan(self) -> BuildOrder: self.knowledge.building_solver.wall_type = 3 # WallType.ProtossMainZerg build_steps_buildings2 = [ Step(RequiredUnitReady(UnitTypeId.GATEWAY, 1), GridBuilding(UnitTypeId.CYBERNETICSCORE, 1)), Step(RequiredUnitReady(UnitTypeId.CYBERNETICSCORE, 1), GridBuilding(UnitTypeId.TWILIGHTCOUNCIL, 1)), Step(RequiredUnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), GridBuilding(UnitTypeId.DARKSHRINE, 1)), ActTech(UpgradeId.BLINKTECH), ActTech(UpgradeId.CHARGE) ] build_steps_workers = [ Step(None, ActBuilding(UnitTypeId.NEXUS, 1), RequiredUnitExists(UnitTypeId.NEXUS, 1)), # Build to 14 probes and stop until pylon is building Step(None, ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS), RequiredUnitExists(UnitTypeId.PROBE, 14)), Step(None, None, RequiredUnitExists(UnitTypeId.PYLON, 1)), Step(None, ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS), RequiredUnitExists(UnitTypeId.PROBE, 16 + 3 + 3)), Step( RequireCustom(lambda k: self.knowledge.own_main_zone. minerals_running_low), ActExpand(2)), Step(None, ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS), RequiredUnitExists(UnitTypeId.PROBE, 30)), GridBuilding(UnitTypeId.GATEWAY, 5), StepBuildGas(3), GridBuilding(UnitTypeId.GATEWAY, 6), ] build_steps_buildings = [ Step(RequiredSupply(14), GridBuilding(UnitTypeId.PYLON, 1), RequiredUnitExists(UnitTypeId.PYLON, 1)), StepBuildGas(1, RequiredSupply(16)), Step( RequiredSupply(16), GridBuilding(UnitTypeId.GATEWAY, 1), RequiredTotalUnitExists( [UnitTypeId.GATEWAY, UnitTypeId.WARPGATE], 1)), StepBuildGas(2), Step(RequiredSupply(21), GridBuilding(UnitTypeId.PYLON, 2), RequiredUnitExists(UnitTypeId.PYLON, 2)), GridBuilding(UnitTypeId.GATEWAY, 2), Step(RequiredUnitReady(UnitTypeId.CYBERNETICSCORE, 1), ActTech(UpgradeId.WARPGATERESEARCH)), GridBuilding(UnitTypeId.GATEWAY, 3), AutoPylon() ] build_steps_units = [ Step(None, ProtossUnit(UnitTypeId.DARKTEMPLAR, 4, priority=True), skip_until=RequiredUnitReady(UnitTypeId.DARKSHRINE, 1)), Step(RequiredUnitReady(UnitTypeId.GATEWAY, 1), ProtossUnit(UnitTypeId.ZEALOT, 1), RequiredTechReady(UpgradeId.WARPGATERESEARCH, 1)), Step(None, ProtossUnit(UnitTypeId.STALKER), None), ] build_steps_units2 = [ Step(RequiredUnitExists(UnitTypeId.TWILIGHTCOUNCIL, 1), ProtossUnit(UnitTypeId.STALKER, 3), RequiredTechReady(UpgradeId.WARPGATERESEARCH, 1)), Step(RequiredMinerals(400), ProtossUnit(UnitTypeId.ZEALOT)) ] build_steps_chrono = [ Step(None, ChronoUnitProduction(UnitTypeId.PROBE, UnitTypeId.NEXUS), skip=RequiredUnitExists(UnitTypeId.PROBE, 20, include_killed=True), skip_until=RequiredUnitReady(UnitTypeId.PYLON)), ChronoAnyTech(0) ] build_order = BuildOrder([ build_steps_buildings, build_steps_buildings2, build_steps_workers, build_steps_units, build_steps_units2, build_steps_chrono ]) attack = PlanZoneAttack(20) attack.retreat_multiplier = 0.5 # All in tactics = [ PlanCancelBuilding(), PlanZoneDefense(), RestorePower(), PlanDistributeWorkers(), DtPush(), PlanZoneGather(), attack, PlanFinishEnemy(), ] return BuildOrder([build_order, tactics])
async def create_plan(self) -> BuildOrder: build_steps_exps = [ Step(None, Expand(2)), Step(UnitReady(UnitTypeId.SPAWNINGPOOL, 1), Expand(3)), Step(Supply(80), MorphLair()), Expand(4), Step(Supply(100), ActBuilding(UnitTypeId.EVOLUTIONCHAMBER, 2)), ] bsus = [ Step(UnitReady(UnitTypeId.LAIR, 1), None), Step(UnitExists(UnitTypeId.ROACHWARREN, 1), Tech(UpgradeId.GLIALRECONSTITUTION)), ] bsu = [ Step(UnitExists(UnitTypeId.EVOLUTIONCHAMBER, 1), Tech(UpgradeId.ZERGMISSILEWEAPONSLEVEL1)), Step(None, Tech(UpgradeId.ZERGGROUNDARMORSLEVEL1)), Step(None, Tech(UpgradeId.ZERGMISSILEWEAPONSLEVEL2)), Step(None, Tech(UpgradeId.ZERGGROUNDARMORSLEVEL2)), ] buildings = [ Step( UnitExists(UnitTypeId.HATCHERY, 2, include_pending=True), ActBuilding(UnitTypeId.SPAWNINGPOOL, 1), ), Step(UnitExists(UnitTypeId.QUEEN, 2), ActBuilding(UnitTypeId.ROACHWARREN, 1)), ] extractors = [ StepBuildGas(1, UnitReady(UnitTypeId.SPAWNINGPOOL, 0.5)), StepBuildGas(2, UnitReady(UnitTypeId.ROACHWARREN, 1)), StepBuildGas(3, UnitExists(UnitTypeId.HATCHERY, 3)), StepBuildGas(4, UnitReady(UnitTypeId.HATCHERY, 3)), StepBuildGas(5, UnitExists(UnitTypeId.OVERLORD, 10)), StepBuildGas(6, UnitExists(UnitTypeId.OVERLORD, 20)), ] # 6 zerglings for early defence... needs fiery micro build_steps_units_early_defense = [ Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 2)), Step(UnitExists(UnitTypeId.HATCHERY, 2), ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 6)), Step( UnitExists(UnitTypeId.HATCHERY, 2, include_pending=True), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 3), ), Step( UnitExists(UnitTypeId.HATCHERY, 3, include_pending=True), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 4), ), ] # Add the roaches to here build_steps_units = [ Step(UnitExists(UnitTypeId.HATCHERY, 2), ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA, 4)), Step(None, ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 4)), Step( UnitExists(UnitTypeId.HATCHERY, 3, include_pending=True), ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA), ), ] ravagers = [ Step(UnitReady(UnitTypeId.ROACH, 4), None), Step(UnitReady(UnitTypeId.ROACHWARREN, 1), MorphRavager(5), skip_until=Gas(200)), Step(UnitReady(UnitTypeId.ROACH, 10), MorphRavager(50), skip_until=Gas(300)), ] build = BuildOrder( ZergUnit(UnitTypeId.DRONE, 70), AutoOverLord(), build_steps_exps, buildings, extractors, build_steps_units_early_defense, bsu, bsus, ravagers, build_steps_units, ) attack = PlanZoneAttack(120) tactics = [ PlanCancelBuilding(), SpreadCreep(), InjectLarva(), DistributeWorkers(), Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), PlanZoneDefense(), PlanZoneGather(), attack, PlanFinishEnemy(), ] return BuildOrder(build, tactics)
def __init__(self): self.worker_rushed = False self.rush_bunker = BuildPosition(UnitTypeId.BUNKER, Point2((0, 0)), exact=True) viking_counters = [ UnitTypeId.COLOSSUS, UnitTypeId.MEDIVAC, UnitTypeId.RAVEN, UnitTypeId.VOIDRAY, UnitTypeId.CARRIER, UnitTypeId.TEMPEST, UnitTypeId.BROODLORD, ] warn = WarnBuildMacro( [ (UnitTypeId.SUPPLYDEPOT, 1, 18), (UnitTypeId.BARRACKS, 1, 42), (UnitTypeId.REFINERY, 1, 44), (UnitTypeId.COMMANDCENTER, 2, 60 + 44), (UnitTypeId.BARRACKSREACTOR, 1, 120), (UnitTypeId.FACTORY, 1, 120 + 21), ], [], ) scv = [ Step(None, TerranUnit(UnitTypeId.MARINE, 2, priority=True), skip_until=lambda k: self.worker_rushed), Step(None, MorphOrbitals(), skip_until=RequiredUnitReady(UnitTypeId.BARRACKS, 1)), Step( None, ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 16 + 6), skip=UnitExists(UnitTypeId.COMMANDCENTER, 2), ), Step(None, ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 32 + 12)), ] dt_counter = [ Step( RequiredAny([ RequiredEnemyBuildingExists(UnitTypeId.DARKSHRINE), RequiredEnemyUnitExistsAfter(UnitTypeId.DARKTEMPLAR), RequiredEnemyUnitExistsAfter(UnitTypeId.BANSHEE), ]), None, ), Step(None, GridBuilding(UnitTypeId.ENGINEERINGBAY, 1)), Step( None, DefensiveBuilding(UnitTypeId.MISSILETURRET, DefensePosition.Entrance, 2)), Step( None, DefensiveBuilding(UnitTypeId.MISSILETURRET, DefensePosition.CenterMineralLine, None)), ] dt_counter2 = [ Step( RequiredAny([ RequiredEnemyBuildingExists(UnitTypeId.DARKSHRINE), RequiredEnemyUnitExistsAfter(UnitTypeId.DARKTEMPLAR), RequiredEnemyUnitExistsAfter(UnitTypeId.BANSHEE), ]), None, ), Step(None, GridBuilding(UnitTypeId.STARPORT, 2)), Step( None, ActBuildAddon(UnitTypeId.STARPORTTECHLAB, UnitTypeId.STARPORT, 1)), Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), ActUnit(UnitTypeId.RAVEN, UnitTypeId.STARPORT, 2)), ] opener = [ Step(RequiredSupply(13), GridBuilding(UnitTypeId.SUPPLYDEPOT, 1, priority=True)), GridBuilding(UnitTypeId.BARRACKS, 1, priority=True), StepBuildGas(1, RequiredSupply(15)), TerranUnit(UnitTypeId.REAPER, 1, only_once=True, priority=True), Step( None, ActExpand(2), skip_until=RequiredAny([ RequireCustom(lambda k: not k.possible_rush_detected), UnitExists(UnitTypeId.SIEGETANK, 2, include_killed=True), ]), ), Step( None, CancelBuilding(UnitTypeId.COMMANDCENTER, 1), skip=RequiredAny([ RequireCustom(lambda k: not k.possible_rush_detected), UnitExists(UnitTypeId.SIEGETANK, 2, include_killed=True), ]), ), Step(None, self.rush_bunker, skip_until=lambda k: k.possible_rush_detected), Step(None, GridBuilding(UnitTypeId.BARRACKS, 2), skip_until=lambda k: k.possible_rush_detected), GridBuilding(UnitTypeId.SUPPLYDEPOT, 2, priority=True), ActBuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS, 1), GridBuilding(UnitTypeId.FACTORY, 1), ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 1), AutoDepot(), ] buildings = [ Step(None, GridBuilding(UnitTypeId.BARRACKS, 2)), Step(RequiredUnitReady(UnitTypeId.FACTORYTECHLAB), TerranUnit(UnitTypeId.SIEGETANK, 1)), StepBuildGas(2), # BuildStep(None, GridBuilding(UnitTypeId.ARMORY, 1)), Step( None, ActBuildAddon(UnitTypeId.BARRACKSTECHLAB, UnitTypeId.BARRACKS, 1)), Step(None, GridBuilding(UnitTypeId.STARPORT, 1)), Step(None, GridBuilding(UnitTypeId.BARRACKS, 3)), Step( None, ActBuildAddon(UnitTypeId.BARRACKSTECHLAB, UnitTypeId.BARRACKS, 2)), Step(RequiredSupply(40, SupplyType.Workers), ActExpand(3)), Step(None, GridBuilding(UnitTypeId.BARRACKS, 5)), Step( None, ActBuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS, 3)), Step( None, ActBuildAddon(UnitTypeId.STARPORTREACTOR, UnitTypeId.STARPORT, 1)), StepBuildGas(4), ] tech = [ Step(None, ActTech(UpgradeId.PUNISHERGRENADES)), Step(None, ActTech(UpgradeId.STIMPACK)), Step(None, ActTech(UpgradeId.SHIELDWALL)), ] mech = [TerranUnit(UnitTypeId.SIEGETANK, 2, priority=True)] air = [ Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), TerranUnit(UnitTypeId.MEDIVAC, 2, priority=True)), Step(None, TerranUnit(UnitTypeId.VIKINGFIGHTER, 1, priority=True)), Step( None, TerranUnit(UnitTypeId.VIKINGFIGHTER, 3, priority=True), skip_until=self.RequireAnyEnemyUnits(viking_counters, 1), ), Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), TerranUnit(UnitTypeId.MEDIVAC, 4, priority=True)), Step( None, TerranUnit(UnitTypeId.VIKINGFIGHTER, 10, priority=True), skip_until=self.RequireAnyEnemyUnits(viking_counters, 4), ), Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), TerranUnit(UnitTypeId.MEDIVAC, 6, priority=True)), ] marines = [ Step(UnitExists(UnitTypeId.REAPER, 1, include_killed=True), TerranUnit(UnitTypeId.MARINE, 2)), BuildOrder([ TerranUnit(UnitTypeId.MARAUDER, 20, priority=True), TerranUnit(UnitTypeId.MARINE, 20), Step(RequiredMinerals(250), TerranUnit(UnitTypeId.MARINE, 100)), ]), ] use_money = BuildOrder([ Step(RequiredMinerals(400), GridBuilding(UnitTypeId.BARRACKS, 8)), Step( RequiredMinerals(500), ActBuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS, 6)), ]) super().__init__([ warn, scv, opener, buildings, dt_counter, dt_counter2, tech, mech, air, marines, use_money ])
def __init__(self): gas_related = [ StepBuildGas(1, UnitExists(UnitTypeId.HATCHERY, 2)), Step(None, Tech(UpgradeId.ZERGLINGMOVEMENTSPEED), skip_until=Gas(100)), Step(None, ActBuilding(UnitTypeId.ROACHWARREN, 1), skip_until=Gas(100)), StepBuildGas(2, Time(4 * 60)), StepBuildGas(3, UnitExists(UnitTypeId.LAIR, 1)), StepBuildGas(5, None, Gas(100)), StepBuildGas(8, Supply(50, supply_type=SupplyType.Workers)), ] buildings = [ Step(UnitExists(UnitTypeId.DRONE, 14), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2)), Step(Supply(16), Expand(2)), Step(UnitExists(UnitTypeId.EXTRACTOR, 1), ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)), Step( None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 2), skip_until=UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ), Step( UnitReady(UnitTypeId.SPAWNINGPOOL), DefensiveBuilding(UnitTypeId.SPINECRAWLER, DefensePosition.Entrance, 1), ), # Step(UnitExists(UnitTypeId.DRONE, 24, include_killed=True, include_pending=True), ActExpand(3)), Step(None, MorphLair(), skip=UnitExists(UnitTypeId.HIVE, 1)), Step(UnitExists(UnitTypeId.DRONE, 30, include_killed=True), Expand(3)), Step(None, ZergUnit(UnitTypeId.QUEEN, 3)), Step(UnitExists(UnitTypeId.LAIR, 1), ActBuilding(UnitTypeId.SPIRE, 1)), MorphOverseer(1), Step(None, ZergUnit(UnitTypeId.QUEEN, 5)), Step(UnitExists(UnitTypeId.SPIRE), Expand(4)), Tech(UpgradeId.ZERGFLYERWEAPONSLEVEL1), Step(UnitExists(UnitTypeId.MUTALISK, 10, include_killed=True), ActBuilding(UnitTypeId.INFESTATIONPIT)), Step(UnitReady(UnitTypeId.INFESTATIONPIT), MorphHive()), MorphGreaterSpire(), Tech(UpgradeId.ZERGFLYERWEAPONSLEVEL2), Tech(UpgradeId.ZERGFLYERWEAPONSLEVEL3), ] high_tier = [ # Step(RequiredUnitReady(UnitTypeId.GREATERSPIRE), ZergUnit(UnitTypeId.DRONE, 70)), Step( None, ZergUnit(UnitTypeId.CORRUPTOR, 3, priority=True), skip_until=UnitReady(UnitTypeId.GREATERSPIRE), ), Step(None, MorphBroodLord(5)), # Step(RequiredGas(200), ZergUnit(UnitTypeId.MUTALISK, 20, priority=True)) ] units = [ Step(UnitExists(UnitTypeId.HATCHERY, 1), None), Step(None, ZergUnit(UnitTypeId.DRONE, 20)), # Early zerglings Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ZergUnit(UnitTypeId.ZERGLING, 4), None), Step(None, ZergUnit(UnitTypeId.DRONE, 25)), Step(UnitExists(UnitTypeId.SPAWNINGPOOL, 1), ZergUnit(UnitTypeId.ZERGLING, 12), None), # Queen for more larvae Step(None, ZergUnit(UnitTypeId.QUEEN, 1)), Step(None, ZergUnit(UnitTypeId.DRONE, 30), None), Step(None, ZergUnit(UnitTypeId.ZERGLING, 16, only_once=True), None), Step(None, ZergUnit(UnitTypeId.ROACH, 4, only_once=True), skip_until=Gas(25)), Step(None, ZergUnit(UnitTypeId.MUTALISK, 4), skip_until=UnitReady(UnitTypeId.SPIRE, 1)), Step(None, ZergUnit(UnitTypeId.DRONE, 45), None), Step(None, ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 16), None), Step(None, ZergUnit(UnitTypeId.ROACH, 10), skip=UnitReady(UnitTypeId.SPIRE, 1), skip_until=Gas(25),), Step(None, ZergUnit(UnitTypeId.DRONE, 65), None), Step( None, ZergUnit(UnitTypeId.ZERGLING, 40), skip_until=All([UnitReady(UnitTypeId.SPIRE, 1), Minerals(300)]), ), Step(None, ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA), skip=UnitReady(UnitTypeId.SPIRE, 1)), Step( None, ZergUnit(UnitTypeId.ZERGLING, 100), skip_until=All([UnitReady(UnitTypeId.SPIRE, 1), Minerals(500)]), ), # Endless mutalisks Step(None, ActUnit(UnitTypeId.MUTALISK, UnitTypeId.LARVA), None), ] super().__init__([self.overlords, buildings, gas_related, high_tier, units])
async def create_plan(self) -> BuildOrder: attack_value = random.randint(4, 7) * 10 self.attack = Step(None, PlanZoneAttack(attack_value)) self.jump = random.randint(0, 2) self.knowledge.print(f"Att at {attack_value}", "Build") worker_scout = Step(None, WorkerScout(), skip_until=UnitExists(UnitTypeId.SUPPLYDEPOT, 1)) self.distribute_workers = DistributeWorkers(4) 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)), self.distribute_workers, ManTheBunkers(), Repair(), ContinueBuilding(), PlanZoneGatherTerran(), self.attack, PlanFinishEnemy(), ] return BuildOrder( AutoDepot(), Step(None, MorphOrbitals(), skip_until=UnitReady(UnitTypeId.BARRACKS, 1)), [ Step( None, ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 34 + 12)) ], [ Step(Supply(13), GridBuilding(UnitTypeId.SUPPLYDEPOT, 1)), Step(UnitReady(UnitTypeId.SUPPLYDEPOT, 0.95), GridBuilding(UnitTypeId.BARRACKS, 1)), BuildGas(1), Expand(2), Step(Supply(20), GridBuilding(UnitTypeId.SUPPLYDEPOT, 2)), BuildGas(2), Step(None, GridBuilding(UnitTypeId.FACTORY, 1), skip_until=UnitReady(UnitTypeId.BARRACKS, 1)), Step(UnitReady(UnitTypeId.FACTORY, 1), GridBuilding(UnitTypeId.STARPORT, 1)), DefensiveBuilding(UnitTypeId.BUNKER, DefensePosition.Entrance, 1), Step(None, GridBuilding(UnitTypeId.BARRACKS, 2)), StepBuildGas(3, None, Gas(150)), Step( None, BuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 1)), # Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), GridBuilding(UnitTypeId.FUSIONCORE, 1)), Step( None, BuildAddon(UnitTypeId.STARPORTTECHLAB, UnitTypeId.STARPORT, 1)), StepBuildGas(4, None, Gas(100)), Step(UnitExists(UnitTypeId.BANSHEE, 1, include_killed=True), GridBuilding(UnitTypeId.BARRACKS, 3)), Step( None, BuildAddon(UnitTypeId.BARRACKSTECHLAB, UnitTypeId.BARRACKS, 1)), Step( None, BuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS, 1)), Step(None, GridBuilding(UnitTypeId.STARPORT, 2)), Step( UnitReady(UnitTypeId.STARPORT, 2), BuildAddon(UnitTypeId.STARPORTTECHLAB, UnitTypeId.STARPORT, 2), ), Step(None, Tech(UpgradeId.SHIELDWALL)), Step(Minerals(600), GridBuilding(UnitTypeId.BARRACKS, 5)), Expand(3), ], [ Step( Any([ EnemyBuildingExists(UnitTypeId.DARKSHRINE), EnemyUnitExistsAfter(UnitTypeId.DARKTEMPLAR), EnemyUnitExistsAfter(UnitTypeId.BANSHEE), ]), None, ), Step( UnitReady(UnitTypeId.STARPORT, 1), ActUnit(UnitTypeId.RAVEN, UnitTypeId.STARPORT, 2, priority=True), ), ], ActUnit(UnitTypeId.BANSHEE, UnitTypeId.STARPORT, 20, priority=True), ActUnit(UnitTypeId.SIEGETANK, UnitTypeId.FACTORY, 10), ActUnit(UnitTypeId.MARINE, UnitTypeId.BARRACKS, 50), SequentialList(tactics), )
async def create_plan(self) -> BuildOrder: rnd = select_build_index(self.knowledge, "build.cannon_rush", 0, 2) self.knowledge.building_solver.wall_type = WallType.NoWall rush_killed = RequireCustom( lambda k: self.knowledge.lost_units_manager.own_lost_type(UnitTypeId.PROBE) >= 3 or self.time > 4 * 60 ) if rnd == 2: cannon_rush = self.cannon_expand() elif rnd == 1: cannon_rush = self.cannon_contain() else: cannon_rush = self.cannon_rush() return BuildOrder( Step( None, ChronoUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS), skip=UnitExists(UnitTypeId.PROBE, 16), skip_until=UnitReady(UnitTypeId.PYLON, 1), ), ChronoAnyTech(0), SequentialList( ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 13), GridBuilding(UnitTypeId.PYLON, 1), Step(None, cannon_rush, skip=rush_killed), BuildOrder( [ Expand(2), ProtossUnit(UnitTypeId.PROBE, 30), Step(UnitExists(UnitTypeId.NEXUS, 2), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 44)), ], GridBuilding(UnitTypeId.GATEWAY, 2), GridBuilding(UnitTypeId.CYBERNETICSCORE, 1), BuildGas(2), AutoPylon(), ProtossUnit(UnitTypeId.STALKER, 4, priority=True), StepBuildGas(3, skip=Gas(300)), Tech(UpgradeId.WARPGATERESEARCH), BuildOrder([]).forge_upgrades_all, Step(UnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), Tech(UpgradeId.BLINKTECH)), [ ProtossUnit(UnitTypeId.PROBE, 22), Step(UnitExists(UnitTypeId.NEXUS, 2), ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 44)), StepBuildGas(3, skip=Gas(300)), ], [ProtossUnit(UnitTypeId.STALKER, 100)], [ Step(UnitReady(UnitTypeId.CYBERNETICSCORE, 1), GridBuilding(UnitTypeId.TWILIGHTCOUNCIL, 1),), Step(UnitReady(UnitTypeId.CYBERNETICSCORE, 1), GridBuilding(UnitTypeId.GATEWAY, 7)), StepBuildGas(4, skip=Gas(200)), ], ), ), SequentialList( PlanCancelBuilding(), PlanZoneDefense(), PlanDistributeWorkers(), PlanZoneGather(), PlanZoneAttack(6), PlanFinishEnemy(), ), )
def __init__(self): viking_counters = [ UnitTypeId.COLOSSUS, UnitTypeId.MEDIVAC, UnitTypeId.RAVEN, UnitTypeId.VOIDRAY, UnitTypeId.CARRIER, UnitTypeId.TEMPEST, UnitTypeId.BROODLORD ] scv = [ Step(None, MorphOrbitals(), skip_until=RequiredUnitReady(UnitTypeId.BARRACKS, 1)), Step(None, ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 16 + 6), skip=RequiredUnitExists(UnitTypeId.COMMANDCENTER, 2)), Step(None, ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 32 + 12)) ] dt_counter = [ Step( RequiredAny([ RequiredEnemyBuildingExists(UnitTypeId.DARKSHRINE), RequiredEnemyUnitExistsAfter(UnitTypeId.DARKTEMPLAR), RequiredEnemyUnitExistsAfter(UnitTypeId.BANSHEE) ]), None), Step(None, GridBuilding(UnitTypeId.ENGINEERINGBAY, 1)), Step( None, DefensiveBuilding(UnitTypeId.MISSILETURRET, DefensePosition.Entrance, 2)), Step( None, DefensiveBuilding(UnitTypeId.MISSILETURRET, DefensePosition.CenterMineralLine, None)) ] dt_counter2 = [ Step( RequiredAny([ RequiredEnemyBuildingExists(UnitTypeId.DARKSHRINE), RequiredEnemyUnitExistsAfter(UnitTypeId.DARKTEMPLAR), RequiredEnemyUnitExistsAfter(UnitTypeId.BANSHEE) ]), None), GridBuilding(UnitTypeId.STARPORT, 2), Step( None, ActBuildAddon(UnitTypeId.STARPORTTECHLAB, UnitTypeId.STARPORT, 1)), Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), ActUnit(UnitTypeId.RAVEN, UnitTypeId.STARPORT, 2)), ] buildings = [ Step( RequiredSupply(13), GridBuilding(UnitTypeId.SUPPLYDEPOT, 1), RequiredTotalUnitExists([ UnitTypeId.SUPPLYDEPOT, UnitTypeId.SUPPLYDEPOTDROP, UnitTypeId.SUPPLYDEPOTLOWERED ], 1)), StepBuildGas(1, RequiredSupply(16)), Step( RequiredTotalUnitExists([ UnitTypeId.SUPPLYDEPOT, UnitTypeId.SUPPLYDEPOTDROP, UnitTypeId.SUPPLYDEPOTLOWERED ], 1), GridBuilding(UnitTypeId.BARRACKS, 1)), Step( RequiredUnitReady(UnitTypeId.BARRACKS, 0.25), GridBuilding(UnitTypeId.SUPPLYDEPOT, 2), RequiredTotalUnitExists([ UnitTypeId.SUPPLYDEPOT, UnitTypeId.SUPPLYDEPOTDROP, UnitTypeId.SUPPLYDEPOTLOWERED ], 2)), StepBuildGas(1, RequiredSupply(18)), Step(RequiredUnitExists(UnitTypeId.MARINE, 1), ActExpand(2)), StepBuildGas(2, RequiredSupply(20)), Step(None, GridBuilding(UnitTypeId.FACTORY, 1), skip_until=RequiredUnitReady(UnitTypeId.BARRACKS, 1)), Step(None, GridBuilding(UnitTypeId.FACTORY, 1)), Step( None, ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 1)), # BuildStep(None, GridBuilding(UnitTypeId.FACTORY, 3)), Step( RequiredUnitExists(UnitTypeId.SIEGETANK, 1, include_killed=True), GridBuilding(UnitTypeId.FACTORY, 2)), StepBuildGas(4), Step( None, ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 2)), Step(None, GridBuilding(UnitTypeId.BARRACKS, 2)), # BuildStep(None, GridBuilding(UnitTypeId.ARMORY, 1)), Step(None, GridBuilding(UnitTypeId.STARPORT, 1)), Step(None, GridBuilding(UnitTypeId.BARRACKS, 5)), Step( None, ActBuildAddon(UnitTypeId.BARRACKSTECHLAB, UnitTypeId.BARRACKS, 1)), Step(None, ActTech(UpgradeId.SHIELDWALL)), Step( None, ActBuildAddon(UnitTypeId.STARPORTREACTOR, UnitTypeId.STARPORT, 1)), Step( None, ActBuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS, 3)), Step(None, ActExpand(3)), ] mech = [ Step(RequiredUnitExists(UnitTypeId.FACTORY, 1), ActUnit(UnitTypeId.HELLION, UnitTypeId.FACTORY, 2), skip=RequiredUnitReady(UnitTypeId.FACTORYTECHLAB, 1)), Step(RequiredUnitReady(UnitTypeId.FACTORYTECHLAB, 1), ActUnit(UnitTypeId.SIEGETANK, UnitTypeId.FACTORY, 20)) ] air = [ Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), ActUnit(UnitTypeId.MEDIVAC, UnitTypeId.STARPORT, 2)), Step(None, ActUnit(UnitTypeId.VIKINGFIGHTER, UnitTypeId.STARPORT, 1)), Step(None, ActUnit(UnitTypeId.VIKINGFIGHTER, UnitTypeId.STARPORT, 3), skip_until=self.RequireAnyEnemyUnits(viking_counters, 1)), Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), ActUnit(UnitTypeId.MEDIVAC, UnitTypeId.STARPORT, 4)), Step(None, ActUnit(UnitTypeId.VIKINGFIGHTER, UnitTypeId.STARPORT, 10), skip_until=self.RequireAnyEnemyUnits(viking_counters, 4)), Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), ActUnit(UnitTypeId.MEDIVAC, UnitTypeId.STARPORT, 6)), ] marines = [ Step(RequiredUnitReady(UnitTypeId.BARRACKS, 1), ActUnit(UnitTypeId.MARINE, UnitTypeId.BARRACKS, 2)), Step(RequiredMinerals(250), ActUnit(UnitTypeId.MARINE, UnitTypeId.BARRACKS, 100)) ] super().__init__([ scv, dt_counter, dt_counter2, self.depots, buildings, mech, air, marines ])
async def create_plan(self) -> BuildOrder: scv = [ Step(None, TerranUnit(UnitTypeId.SCV, 14), skip=UnitExists(UnitTypeId.SUPPLYDEPOT)), Step(None, TerranUnit(UnitTypeId.SCV, 15), skip=UnitReady(UnitTypeId.SUPPLYDEPOT)), Step(None, TerranUnit(UnitTypeId.SCV, 19), skip=UnitReady(UnitTypeId.BARRACKS)), BuildOrder( Step(UnitReady(UnitTypeId.BARRACKS, 1), MorphOrbitals()), Step( None, ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 16 + 6), skip=UnitExists(UnitTypeId.COMMANDCENTER, 2), ), Step(None, ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 3 * 22)), ), ] gas_management = [ # Mine with 6 workers until first barracks is complete Step(None, DistributeWorkers(6), skip=UnitReady(UnitTypeId.BARRACKS)), # Mine with 4 workers until the natural CC is started Step( None, DistributeWorkers(4, 4), skip_until=UnitReady(UnitTypeId.BARRACKS), skip=UnitExists(UnitTypeId.COMMANDCENTER, 2), ), # Mine with at least 9 workers afterwards Step(None, DistributeWorkers(min_gas=9), skip_until=UnitExists(UnitTypeId.COMMANDCENTER, 2)), ] units = [ Step( UnitExists(UnitTypeId.FACTORY, include_pending=True), BuildOrder( TerranUnit(UnitTypeId.REAPER, 3, only_once=True), TerranUnit(UnitTypeId.HELLION, 2, only_once=True), ), ), BuildOrder( TerranUnit(UnitTypeId.CYCLONE, 1, only_once=True), TerranUnit(UnitTypeId.RAVEN, 2, only_once=True), Step( UnitExists(UnitTypeId.CYCLONE, include_killed=True), TerranUnit(UnitTypeId.SIEGETANK, 5, only_once=True), ), Step( UnitExists(UnitTypeId.RAVEN, 2, include_killed=True), TerranUnit(UnitTypeId.VIKINGFIGHTER, 6, only_once=True), ), ), # Late game units BuildOrder( TerranUnit(UnitTypeId.MARINE, 100), TerranUnit(UnitTypeId.SIEGETANK, 10), [ TerranUnit(UnitTypeId.MEDIVAC, 4), TerranUnit(UnitTypeId.VIKINGFIGHTER, 6), TerranUnit(UnitTypeId.LIBERATOR, 2), TerranUnit(UnitTypeId.VIKINGFIGHTER, 20), ], ), ] research = [ Tech(UpgradeId.STIMPACK), Tech(UpgradeId.TERRANINFANTRYWEAPONSLEVEL1), Tech(UpgradeId.TERRANINFANTRYARMORSLEVEL1), Tech(UpgradeId.SHIELDWALL), Tech(UpgradeId.TERRANVEHICLEWEAPONSLEVEL1), Tech(UpgradeId.TERRANINFANTRYWEAPONSLEVEL2), Tech(UpgradeId.TERRANINFANTRYARMORSLEVEL2), Tech(UpgradeId.TERRANVEHICLEWEAPONSLEVEL2), Tech(UpgradeId.TERRANINFANTRYWEAPONSLEVEL3), Tech(UpgradeId.TERRANINFANTRYARMORSLEVEL3), Tech(UpgradeId.TERRANVEHICLEWEAPONSLEVEL3), Tech(UpgradeId.TERRANSHIPWEAPONSLEVEL1), Tech(UpgradeId.TERRANSHIPWEAPONSLEVEL2), Tech(UpgradeId.TERRANSHIPWEAPONSLEVEL3), # TODO Fix me, doesn't work in python-sc2 and neither does here: # Tech(UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL1), # Tech(UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL2), # Tech(UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL3), ] mid_game_addons = Step( None, BuildOrder( # Rebuild addons BuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS, 5), BuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 2), BuildAddon(UnitTypeId.STARPORTREACTOR, UnitTypeId.STARPORT, 1), ), skip_until=UnitExists(UnitTypeId.BARRACKS, 2, include_not_ready=False), ) addon_swap = [ # Addon count before 3rd cc is placed Step( None, PlanAddonSwap(barracks_reactor_count=1, factory_techlab_count=1, starport_techlab_count=1), skip=UnitExists(UnitTypeId.COMMANDCENTER, 3, include_killed=True, include_pending=True), ), # Once the 2 ravens are out, swap addons to allow reactored viking production and stim research Step( None, PlanAddonSwap(barracks_techlab_count=1, factory_techlab_count=1, starport_reactor_count=1), skip_until=UnitExists(UnitTypeId.RAVEN, 2, include_killed=True), skip=UnitExists(UnitTypeId.BARRACKS, 5, include_killed=True), ), Step( None, PlanAddonSwap( barracks_techlab_count=1, barracks_reactor_count=4, factory_techlab_count=1, starport_reactor_count=1, ), skip_until=UnitExists(UnitTypeId.BARRACKS, 5, include_killed=True), skip=TechReady(UpgradeId.SHIELDWALL), ), # Once stim and combatshield is researched, have a 5-2-1 setup Step( None, PlanAddonSwap( barracks_reactor_count=5, factory_techlab_count=2, starport_reactor_count=1, only_once=False ), skip_until=TechReady(UpgradeId.SHIELDWALL), ), ] return BuildOrder( # Handle all scv production scv, # Handle gas saturation gas_management, # Handle addon swapping addon_swap, ExecuteAddonSwap(), # Addon (re-)building mid_game_addons, # Handle all unit production units, # Build structures [ Step(Supply(14), GridBuilding(UnitTypeId.SUPPLYDEPOT, 1),), BuildGas(1), GridBuilding(UnitTypeId.BARRACKS, 1), StepBuildGas(2, requirement=Supply(17)), GridBuilding(UnitTypeId.FACTORY, 1), GridBuilding(UnitTypeId.SUPPLYDEPOT, 2), # Expand should start at around 2:28 Expand(2, priority=True), GridBuilding(UnitTypeId.SUPPLYDEPOT, 3), GridBuilding(UnitTypeId.STARPORT, 1), BuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 1), # TODO Unsure how to handle only building this addon once? Need a 'only_once' for BuildAddon Step( None, BuildAddon(UnitTypeId.BARRACKSTECHLAB, UnitTypeId.BARRACKS, 1), skip=UnitReady(UnitTypeId.FACTORYTECHLAB), ), # Third gas at natural should be started at 3:20 before the CC finishes BuildGas(3), # At around 4:20, this command center should be placed in-base and flown out later # TODO Build 3rd CC inbase if possible Step(Time(4 * 60 + 20), Expand(3),), AutoDepot(), Step( UnitExists(UnitTypeId.RAVEN, 2, include_pending=True), BuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS, 1), skip=UnitExists(UnitTypeId.RAVEN, 2), ), Step( UnitExists(UnitTypeId.VIKINGFIGHTER, 2, include_pending=True), GridBuilding(UnitTypeId.BARRACKS, 3), ), Step( UnitExists(UnitTypeId.VIKINGFIGHTER, 4, include_pending=True), GridBuilding(UnitTypeId.ENGINEERINGBAY, 2), ), BuildOrder( StepBuildGas(6, skip=All(Gas(200), UnitExists(UnitTypeId.BARRACKS, 5))), Step( UnitExists(UnitTypeId.VIKINGFIGHTER, 6, include_pending=True), GridBuilding(UnitTypeId.BARRACKS, 5), ), # Add 2nd factory when combatshield is nearly done Step(TechReady(UpgradeId.SHIELDWALL, 0.6), GridBuilding(UnitTypeId.FACTORY, 2),), # Add armory when +1 attack is nearly done Step( TechReady(UpgradeId.TERRANINFANTRYWEAPONSLEVEL1, 0.6), GridBuilding(UnitTypeId.ARMORY, 1, priority=True,), ), # Research upgrades research, ), ], CallMule(50), LowerDepots(), [ PlanZoneGather(), PlanZoneDefense(), Step(TechReady(UpgradeId.STIMPACK), PlanZoneAttack(4)), PlanFinishEnemy(), ], )