Пример #1
0
 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)]),
         ),
     ]
Пример #2
0
 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(),
         ])
     ])
Пример #3
0
 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)),
     ]
Пример #4
0
 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(),
         ])
     ])
Пример #5
0
 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)),
     ]
Пример #6
0
    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()])
Пример #7
0
    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),
                )
            ),
        )