def Infantry_upgrades_all(self) -> List[Step]: return [ # Weapons Step(None, Tech(UpgradeId.TERRANINFANTRYWEAPONSLEVEL1)), Step( None, Tech(UpgradeId.TERRANINFANTRYWEAPONSLEVEL2), skip_until=All([UnitReady(UnitTypeId.ARMORY, 1), TechReady(UpgradeId.TERRANINFANTRYWEAPONSLEVEL1, 1)]), ), Step( None, Tech(UpgradeId.TERRANINFANTRYWEAPONSLEVEL3), skip_until=All([UnitReady(UnitTypeId.ARMORY, 1), TechReady(UpgradeId.TERRANINFANTRYARMORSLEVEL2, 1)]), ), # Armor Step(UnitReady(UnitTypeId.FORGE, 1), Tech(UpgradeId.TERRANINFANTRYARMORSLEVEL1)), Step( None, Tech(UpgradeId.TERRANINFANTRYARMORSLEVEL2), skip_until=All([UnitReady(UnitTypeId.ARMORY, 1), TechReady(UpgradeId.TERRANINFANTRYARMORSLEVEL1, 1)]), ), Step( None, Tech(UpgradeId.TERRANINFANTRYARMORSLEVEL3), skip_until=All([UnitReady(UnitTypeId.ARMORY, 1), TechReady(UpgradeId.TERRANINFANTRYARMORSLEVEL2, 1)]), ), ]
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(), ]) ])
def air_upgrades_all(self) -> List[Step]: return [ Step(UnitReady(UnitTypeId.CYBERNETICSCORE, 1), Tech(UpgradeId.PROTOSSAIRWEAPONSLEVEL1)), Step(None, Tech(UpgradeId.PROTOSSAIRARMORSLEVEL1)), Step(UnitReady(UnitTypeId.FLEETBEACON, 1), None), Step(TechReady(UpgradeId.PROTOSSAIRWEAPONSLEVEL1), Tech(UpgradeId.PROTOSSAIRWEAPONSLEVEL2)), Step(TechReady(UpgradeId.PROTOSSAIRARMORSLEVEL1), Tech(UpgradeId.PROTOSSAIRARMORSLEVEL2)), Step(TechReady(UpgradeId.PROTOSSAIRWEAPONSLEVEL2), Tech(UpgradeId.PROTOSSAIRWEAPONSLEVEL3)), Step(TechReady(UpgradeId.PROTOSSAIRARMORSLEVEL2), Tech(UpgradeId.PROTOSSAIRARMORSLEVEL3)), ]
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 forge_upgrades_all(self) -> List[Step]: return [ # Weapons Step(None, Tech(UpgradeId.PROTOSSGROUNDWEAPONSLEVEL1)), Step( None, Tech(UpgradeId.PROTOSSGROUNDWEAPONSLEVEL2), skip_until=All( [UnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), TechReady(UpgradeId.PROTOSSGROUNDWEAPONSLEVEL1, 1)] ), ), Step( None, Tech(UpgradeId.PROTOSSGROUNDWEAPONSLEVEL3), skip_until=All( [UnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), TechReady(UpgradeId.PROTOSSGROUNDWEAPONSLEVEL2, 1)] ), ), # Armor Step(UnitReady(UnitTypeId.FORGE, 1), Tech(UpgradeId.PROTOSSGROUNDARMORSLEVEL1)), Step( None, Tech(UpgradeId.PROTOSSGROUNDARMORSLEVEL2), skip_until=All( [UnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), TechReady(UpgradeId.PROTOSSGROUNDARMORSLEVEL1, 1)] ), ), Step( None, Tech(UpgradeId.PROTOSSGROUNDARMORSLEVEL3), skip_until=All( [UnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), TechReady(UpgradeId.PROTOSSGROUNDARMORSLEVEL2, 1)] ), ), # Shields Step(None, Tech(UpgradeId.PROTOSSSHIELDSLEVEL1)), Step(UnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1), None), Step(TechReady(UpgradeId.PROTOSSSHIELDSLEVEL1, 1), Tech(UpgradeId.PROTOSSSHIELDSLEVEL2)), Step(TechReady(UpgradeId.PROTOSSSHIELDSLEVEL2, 1), Tech(UpgradeId.PROTOSSSHIELDSLEVEL3)), ]
def __init__(self): self.drone = ZergUnit(UnitTypeId.DRONE) self.queen = ZergUnit(UnitTypeId.QUEEN, to_count=3) self.zergling = ZergUnit(UnitTypeId.ZERGLING) self.baneling = ZergUnit(UnitTypeId.BANELING) self.ultra = ZergUnit(UnitTypeId.ULTRALISK, to_count=15) self.corruptor = ZergUnit(UnitTypeId.CORRUPTOR, to_count=40) self.mutalisk = ZergUnit(UnitTypeId.MUTALISK) self.overseer = ZergUnit(UnitTypeId.OVERSEER, to_count=3) build_units = BuildOrder( [ Step(None, self.drone), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), self.queen), Step(UnitExists(UnitTypeId.ULTRALISKCAVERN), self.ultra, skip_until=self.should_build_ultras), Step(UnitExists(UnitTypeId.SPIRE), self.corruptor, skip_until=self.should_build_air), Step(UnitExists(UnitTypeId.SPIRE), self.mutalisk, skip_until=self.should_build_air), Step(UnitExists(UnitTypeId.BANELINGNEST), self.baneling), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), self.zergling), Step( UnitExists(UnitTypeId.LAIR), self.overseer, skip_until=lambda k: k.enemy_units_manager.enemy_cloak_trigger, ), ] ) tech_buildings = BuildOrder( Step(None, Expand(3, priority=True, consider_worker_production=False), skip_until=self.take_third), Step(None, StepBuildGas(to_count=2)), Step(UnitExists(UnitTypeId.LAIR), StepBuildGas(4)), Step(None, ActBuilding(UnitTypeId.SPAWNINGPOOL)), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), ActBuilding(UnitTypeId.BANELINGNEST)), Step(UnitExists(UnitTypeId.BANELINGNEST), MorphLair()), Step( All([UnitExists(UnitTypeId.DRONE, 60), UnitExists(UnitTypeId.LAIR)]), ActBuilding(UnitTypeId.INFESTATIONPIT), ), Step(UnitExists(UnitTypeId.INFESTATIONPIT), StepBuildGas(6)), Step(UnitExists(UnitTypeId.LAIR), ActBuilding(UnitTypeId.EVOLUTIONCHAMBER, to_count=2)), Step(All([UnitExists(UnitTypeId.LAIR), UnitExists(UnitTypeId.INFESTATIONPIT)]), MorphHive()), Step(UnitExists(UnitTypeId.HIVE), ActBuilding(UnitTypeId.ULTRALISKCAVERN)), Step(UnitExists(UnitTypeId.LAIR), ActBuilding(UnitTypeId.SPIRE), skip_until=self.should_build_air), Step(UnitExists(UnitTypeId.HIVE), StepBuildGas(8)) ) upgrades = BuildOrder( Step( All([UnitExists(UnitTypeId.BANELINGNEST), UnitExists(UnitTypeId.LAIR)]), Tech(UpgradeId.CENTRIFICALHOOKS), ), SequentialList( Step(None, Tech(UpgradeId.ZERGMELEEWEAPONSLEVEL1)), Step(UnitExists(UnitTypeId.LAIR), Tech(UpgradeId.ZERGMELEEWEAPONSLEVEL2)), Step(UnitExists(UnitTypeId.HIVE), Tech(UpgradeId.ZERGMELEEWEAPONSLEVEL3)), ), SequentialList( Step( UnitExists(UnitTypeId.EVOLUTIONCHAMBER, 2, include_not_ready=False, include_pending=False), Tech(UpgradeId.ZERGGROUNDARMORSLEVEL1), ), Step(UnitExists(UnitTypeId.LAIR), Tech(UpgradeId.ZERGGROUNDARMORSLEVEL2)), Step(UnitExists(UnitTypeId.HIVE), Tech(UpgradeId.ZERGGROUNDARMORSLEVEL3)), ), Step(UnitExists(UnitTypeId.SPAWNINGPOOL), Tech(UpgradeId.ZERGLINGMOVEMENTSPEED)), Step( All([UnitExists(UnitTypeId.SPAWNINGPOOL), UnitExists(UnitTypeId.HIVE)]), Tech(UpgradeId.ZERGLINGATTACKSPEED), ), SequentialList( Step(UnitExists(UnitTypeId.ULTRALISKCAVERN), Tech(UpgradeId.CHITINOUSPLATING)), Step(UnitExists(UnitTypeId.ULTRALISKCAVERN), Tech(UpgradeId.ANABOLICSYNTHESIS)), ), SequentialList( Step(UnitExists(UnitTypeId.SPIRE), Tech(UpgradeId.ZERGFLYERWEAPONSLEVEL1)), Step(UnitExists(UnitTypeId.SPIRE), Tech(UpgradeId.ZERGFLYERWEAPONSLEVEL2)), Step( All( [ UnitExists(UnitTypeId.SPIRE), UnitExists(UnitTypeId.HIVE), ] ), Tech(UpgradeId.ZERGFLYERWEAPONSLEVEL3), ), Step(UnitExists(UnitTypeId.SPIRE), Tech(UpgradeId.ZERGFLYERARMORSLEVEL1)), Step(UnitExists(UnitTypeId.SPIRE), Tech(UpgradeId.ZERGFLYERARMORSLEVEL2)), Step( All( [ UnitExists(UnitTypeId.SPIRE), UnitExists(UnitTypeId.HIVE), ] ), Tech(UpgradeId.ZERGFLYERARMORSLEVEL3), ), ), Step(TechReady(UpgradeId.CENTRIFICALHOOKS), Tech(UpgradeId.OVERLORDSPEED)), ) super().__init__([PaulAutoOverLord(), upgrades, tech_buildings, build_units, MassExpand()])
async def create_plan(self) -> BuildOrder: queens_manager = self._bot.knowledge.get_manager(QueensSc2Manager) # Policies originally from QueenBot: https://aiarena.net/bots/201/ early_game_queen_policy = { "creep_queens": { "active": True, "distance_between_queen_tumors": 3, "first_tumor_position": self._bot.zone_manager.own_natural.center_location.towards( self._bot.game_info.map_center, 9 ), "priority": True, "prioritize_creep": lambda: True, "max": 2, "defend_against_ground": True, "rally_point": self._bot.zone_manager.own_natural.center_location, "priority_defence_list": { UnitTypeId.ZERGLING, UnitTypeId.MARINE, UnitTypeId.ZEALOT }, }, "creep_dropperlord_queens": { "active": True, "priority": True, "max": 1, "pass_own_threats": True, "target_expansions": [ el[0] for el in self._bot.expansion_locations_list[-6:-3] ], }, "defence_queens": { "attack_condition": lambda: self._bot.enemy_units.filter( lambda u: u.type_id == UnitTypeId.WIDOWMINEBURROWED and u.distance_to(self._bot.enemy_start_locations[0]) > 50 and not queens_manager.queens.defence.enemy_air_threats and not queens_manager.queens.defence.enemy_ground_threats ) or ( self._bot.structures(UnitTypeId.NYDUSCANAL) and self._bot.units(UnitTypeId.QUEEN).amount > 25 ), "rally_point": self._bot.zone_manager.own_natural.center_location, }, "inject_queens": { "active": True, "priority": False, "max": 2, "priority_defence_list": { UnitTypeId.BATTLECRUISER, UnitTypeId.LIBERATOR, UnitTypeId.LIBERATORAG, UnitTypeId.VOIDRAY, }, }, "nydus_queens": { "active": True, "max": 12, "steal_from": {QueenRoles.Defence}, }, } mid_game_queen_policy = { "creep_queens": { "max": 2, "priority": True, "defend_against_ground": True, "distance_between_queen_tumors": 3, "priority_defence_list": { UnitTypeId.BATTLECRUISER, UnitTypeId.LIBERATOR, UnitTypeId.LIBERATORAG, UnitTypeId.VOIDRAY, }, }, "creep_dropperlord_queens": { "active": True, "priority": True, "max": 1, "pass_own_threats": True, "priority_defence_list": set(), "target_expansions": [ el for el in self._bot.expansion_locations_list ], }, "defence_queens": { "attack_condition": lambda: ( sum([unit.energy for unit in self._bot.units(UnitTypeId.QUEEN)]) / self._bot.units(UnitTypeId.QUEEN).amount >= 75 and self._bot.units(UnitTypeId.QUEEN).amount > 40 ) or self._bot.enemy_units.filter( lambda u: u.type_id == UnitTypeId.WIDOWMINEBURROWED and u.distance_to(self._bot.enemy_start_locations[0]) > 50 and not queens_manager.queens.defence.enemy_air_threats and not queens_manager.queens.defence.enemy_ground_threats ) or self._bot.structures(UnitTypeId.NYDUSCANAL), "rally_point": self._bot.zone_manager.own_natural.center_location, }, "inject_queens": {"active": False}, "nydus_queens": { "active": True, "max": 12, "steal_from": {QueenRoles.Defence}, }, } gas_workers = 4 build_drones = lambda ai: self._bot.workers.amount >= self._bot.townhalls.amount * 16 + gas_workers \ or self._bot.workers.amount >= 16 * 3 + gas_workers # max 3 base saturation upgrades = [ Step(UnitReady(UnitTypeId.EVOLUTIONCHAMBER, 1), Tech(UpgradeId.ZERGMISSILEWEAPONSLEVEL1, UnitTypeId.EVOLUTIONCHAMBER)), Tech(UpgradeId.ZERGGROUNDARMORSLEVEL1, UnitTypeId.EVOLUTIONCHAMBER), Tech(UpgradeId.ZERGMISSILEWEAPONSLEVEL2, UnitTypeId.EVOLUTIONCHAMBER), Tech(UpgradeId.ZERGGROUNDARMORSLEVEL2, UnitTypeId.EVOLUTIONCHAMBER), Tech(UpgradeId.ZERGMISSILEWEAPONSLEVEL3, UnitTypeId.EVOLUTIONCHAMBER), Tech(UpgradeId.ZERGGROUNDARMORSLEVEL3, UnitTypeId.EVOLUTIONCHAMBER), ] return BuildOrder( SetQueensSc2Policy(early_game_queen_policy, policy_name="early_game_queen_policy"), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 13), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 1), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14), Expand(2), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 16), ActBuilding(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2), SequentialList( Step(None, SetQueensSc2Policy(mid_game_queen_policy, policy_name="mid_game_queen_policy"), skip_until=lambda ai: ai.time > 480), BuildOrder( Step(None, DistributeWorkers(max_gas=4), skip=TechReady(UpgradeId.ZERGGROUNDARMORSLEVEL3, 0.01)), Step(None, DistributeWorkers(max_gas=0), skip_until=TechReady(UpgradeId.ZERGGROUNDARMORSLEVEL3, 0.01)), ), Step(None, SpeedMining(), lambda ai: ai.client.game_step > 5), AutoOverLord(), BuildOrder( Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA), skip=build_drones), Step(None, MorphLair(), skip_until=TechReady(UpgradeId.ZERGGROUNDARMORSLEVEL1, 0.5)), Step(None, ActBuilding(UnitTypeId.INFESTATIONPIT), skip_until=TechReady(UpgradeId.ZERGGROUNDARMORSLEVEL2, 0.01)), Step(None, MorphHive(), skip_until=TechReady(UpgradeId.ZERGGROUNDARMORSLEVEL2, 0.5)), Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY)), Expand(4), # 4 mining bases BuildGas(2), ActBuilding(UnitTypeId.EVOLUTIONCHAMBER, 2), upgrades, ActBuilding(UnitTypeId.HATCHERY, 20), ) ), )