Esempio n. 1
0
    async def create_plan(self) -> BuildOrder:
        rnd = random.randint(0, 2)
        if rnd == 2:
            cannon_rush = self.cannon_expand()
        elif rnd == 1:
            cannon_rush = self.cannon_rush()
        else:
            cannon_rush = self.cannon_contain()

        return BuildOrder([
            Step(None,
                 ChronoUnitProduction(UnitTypeId.PROBE, UnitTypeId.NEXUS),
                 skip=RequiredUnitExists(UnitTypeId.PROBE, 16),
                 skip_until=RequiredUnitReady(UnitTypeId.PYLON, 1)),
            ChronoAnyTech(0),
            SequentialList([
                ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 13),
                GridBuilding(UnitTypeId.PYLON, 1), cannon_rush,
                BuildOrder(
                    [[
                        ActExpand(2),
                        ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 30),
                        Step(RequiredUnitExists(UnitTypeId.NEXUS, 2),
                             ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 44)),
                    ],
                     GridBuilding(UnitTypeId.GATEWAY, 2),
                     GridBuilding(UnitTypeId.CYBERNETICSCORE, 1),
                     StepBuildGas(2),
                     AutoPylon(),
                     StepBuildGas(3, skip=RequiredGas(300)),
                     ActTech(UpgradeId.WARPGATERESEARCH,
                             UnitTypeId.CYBERNETICSCORE),
                     BuildOrder([]).forge_upgrades_all,
                     Step(
                         RequiredUnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1),
                         ActTech(UpgradeId.BLINKTECH,
                                 UnitTypeId.TWILIGHTCOUNCIL)),
                     [
                         ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22),
                         Step(RequiredUnitExists(UnitTypeId.NEXUS, 2),
                              ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 44)),
                         StepBuildGas(3, skip=RequiredGas(300))
                     ], [GateUnit(UnitTypeId.STALKER, 100)],
                     [
                         Step(RequiredUnitReady(UnitTypeId.CYBERNETICSCORE, 1),
                              GridBuilding(UnitTypeId.TWILIGHTCOUNCIL, 1)),
                         Step(RequiredUnitReady(UnitTypeId.CYBERNETICSCORE, 1),
                              GridBuilding(UnitTypeId.GATEWAY, 7)),
                         StepBuildGas(4, skip=RequiredGas(200)),
                     ]])
            ]),
            SequentialList([
                PlanCancelBuilding(),
                PlanZoneDefense(),
                PlanDistributeWorkers(),
                PlanZoneGather(),
                PlanZoneAttack(6),
                PlanFinishEnemy(),
            ])
        ])
Esempio n. 2
0
    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, UnitTypeId.SPAWNINGPOOL)),
            Step(RequiredGas(120), ActBuilding(UnitTypeId.EVOLUTIONCHAMBER, 2)),

            Step(RequiredUnitExists(UnitTypeId.EVOLUTIONCHAMBER, 1),
                 ActTech(UpgradeId.ZERGMELEEWEAPONSLEVEL1, UnitTypeId.EVOLUTIONCHAMBER)),
            Step(None, ActTech(UpgradeId.ZERGGROUNDARMORSLEVEL1, UnitTypeId.EVOLUTIONCHAMBER)),
            Step(None, MorphLair(), skip=RequiredUnitExists(UnitTypeId.HIVE, 1)),
            StepBuildGas(4, None),
            Step(None, ActTech(UpgradeId.ZERGMELEEWEAPONSLEVEL2, UnitTypeId.EVOLUTIONCHAMBER)),
            Step(None, ActTech(UpgradeId.ZERGGROUNDARMORSLEVEL2, UnitTypeId.EVOLUTIONCHAMBER)),
            # Infestation pit required
            Step(None, ActBuilding(UnitTypeId.INFESTATIONPIT, 1)),
            Step(RequiredUnitReady(UnitTypeId.INFESTATIONPIT, 1), MorphHive()),

            Step(RequiredUnitReady(UnitTypeId.HIVE, 1), ActTech(UpgradeId.ZERGLINGATTACKSPEED, UnitTypeId.SPAWNINGPOOL)),
            StepBuildGas(6, None),
            Step(None, ActBuilding(UnitTypeId.ULTRALISKCAVERN, 1)),
            Step(None, ActTech(UpgradeId.ZERGMELEEWEAPONSLEVEL3, UnitTypeId.EVOLUTIONCHAMBER)),
            Step(None, ActTech(UpgradeId.ZERGGROUNDARMORSLEVEL3, UnitTypeId.EVOLUTIONCHAMBER)),
            Step(None, ActTech(UpgradeId.CHITINOUSPLATING, UnitTypeId.ULTRALISKCAVERN)),
            # TODO: Ultra lisk speed?
            Step(None, ActTech(UpgradeId.ANABOLICSYNTHESIS, UnitTypeId.ULTRALISKCAVERN)),
            # ULTRALISKCAVERNRESEARCH_EVOLVEANABOLICSYNTHESIS2
        ]

        super().__init__([
            self.overlords,
            ultras,
            units,
            build_step_expansions,
            queens,
            pool_and_tech
        ])
Esempio n. 3
0
    async def create_plan(self) -> BuildOrder:
        build_step_buildings = [
            # 12 Pool
            Step(None, ActBuilding(UnitTypeId.SPAWNINGPOOL, 1), RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1)),
        ]

        finish = [
            Step(RequireCustom(lambda k: self.enemy_structures.flying.exists and self.supply_used > 30),
                 StepBuildGas(2)),
            ActExpand(2),
            RequiredUnitExists(UnitTypeId.DRONE, 20),
            MorphLair(),
            RequiredUnitExists(UnitTypeId.DRONE, 30),
            StepBuildGas(4),
            ActBuilding(UnitTypeId.SPIRE),
            ZergUnit(UnitTypeId.MUTALISK, 10, priority=True)
        ]

        build_step_units = [

            # 12 Pool followed by overlord
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2),
                 RequiredUnitExists(UnitTypeId.OVERLORD, 2)),

            # TheMusZero
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14),
                 RequiredUnitExists(UnitTypeId.DRONE, 14)),
            # Queen for more larvae
            # BuildStep(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 1), RequiredUnitExists(UnitTypeId.QUEEN, 1)),

            # Endless zerglings
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA),
                 None),

        ]

        return BuildOrder([
            build_step_buildings,
            finish,
            build_step_units,
            AutoOverLord(),
            InjectLarva(),
            PlanWorkerOnlyDefense(),
            PlanZoneDefense(),
            PlanZoneGather(),
            PlanZoneAttack2(2),
            PlanFinishEnemy(),
        ])
Esempio n. 4
0
 async def create_plan(self) -> BuildOrder:
     attack = TheAttack(4)
     return BuildOrder([
         Step(None, ChronoUnitProduction(UnitTypeId.PROBE, UnitTypeId.NEXUS),
              skip=RequiredUnitExists(UnitTypeId.PROBE, 40, include_pending=True), skip_until=RequiredUnitExists(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, UnitTypeId.CYBERNETICSCORE),
                     [
                         ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22),
                         Step(RequiredUnitExists(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), attack),
                 PlanFinishEnemy(),
             ])
     ])
Esempio n. 5
0
    def __init__(self):

        gas_related = [
            StepBuildGas(1, RequiredUnitExists(UnitTypeId.HATCHERY, 2)),
            Step(None,
                 ActTech(UpgradeId.ZERGLINGMOVEMENTSPEED,
                         UnitTypeId.SPAWNINGPOOL),
                 skip_until=RequiredGas(100)),
            Step(None,
                 ActBuilding(UnitTypeId.ROACHWARREN, 1),
                 skip_until=RequiredGas(100)),
        ]
        buildings = [
            Step(RequiredUnitExists(UnitTypeId.DRONE, 14),
                 ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2)),
            Step(None, ActExpand(2)),
            Step(RequiredUnitExists(UnitTypeId.EXTRACTOR, 1),
                 ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)),
            Step(None,
                 ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 2),
                 skip_until=RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1)),
            Step(RequiredUnitExists(UnitTypeId.DRONE, 24, include_killed=True),
                 ActExpand(3)),
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 3)),
            Step(RequiredUnitExists(UnitTypeId.DRONE, 30, include_killed=True),
                 ActExpand(4)),
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 4)),
            Step(RequiredMinerals(500),
                 ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY,
                         10)),  # anti air defense!
        ]

        units = [
            Step(RequiredUnitExists(UnitTypeId.HATCHERY, 1), None),
            Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 20)),

            # Early zerglings
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1),
                 ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 12), None),
            # Queen for more larvae
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 1)),
            Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 30), None),
            Step(None, ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 16),
                 None),
            Step(None,
                 ActUnitOnce(UnitTypeId.ROACH, UnitTypeId.LARVA, 4),
                 skip_until=RequiredGas(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=RequiredGas(25)),

            # Endless zerglings
            Step(None, ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA), None)
        ]
        super().__init__([self.overlords, buildings, gas_related, units])
Esempio n. 6
0
 async def create_plan(self) -> BuildOrder:
     attack = PlanZoneAttack(6)
     return BuildOrder([
         Step(None,
              ChronoUnitProduction(UnitTypeId.PROBE, UnitTypeId.NEXUS),
              skip=RequiredUnitExists(UnitTypeId.PROBE,
                                      20,
                                      include_pending=True),
              skip_until=RequiredUnitExists(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,
                                 UnitTypeId.TWILIGHTCOUNCIL)),
                 ]),
                 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,
                             UnitTypeId.CYBERNETICSCORE),
                     GateUnit(UnitTypeId.STALKER, 100)
                 ]),
                 Step(RequiredUnitExists(UnitTypeId.CYBERNETICSCORE, 1),
                      GridBuilding(UnitTypeId.GATEWAY, 4))
             ]),
         ]),
         SequentialList([
             PlanZoneDefense(),
             RestorePower(),
             PlanDistributeWorkers(),
             PlanZoneGather(),
             Step(RequiredTechReady(UpgradeId.BLINKTECH, 0.9), attack),
             PlanFinishEnemy(),
         ])
     ])
Esempio n. 7
0
    async def create_plan(self) -> BuildOrder:
        self.knowledge.building_solver.wall_type = WallType.ProtossMainProtoss
        attack = PlanZoneAttack(7)
        attack.retreat_multiplier = 0.3
        # attack.attack_started = True
        backup = 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),
            ActDefensiveCannons(0, 1),
            SequentialList([
                ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 14),
                GridBuilding(UnitTypeId.PYLON, 1),
                StepBuildGas(1),
                GridBuilding(UnitTypeId.GATEWAY, 1),
                ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 20),
                GridBuilding(UnitTypeId.CYBERNETICSCORE, 1),
                ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 21),
                ActExpand(2),
                ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22),
                StepBuildGas(2),
                GridBuilding(UnitTypeId.PYLON, 1),
                BuildOrder([
                    AutoPylon(),
                    GateUnit(UnitTypeId.STALKER, 2, priority=True),
                    ActTech(UpgradeId.WARPGATERESEARCH,
                            UnitTypeId.CYBERNETICSCORE),
                    [
                        ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22),
                        Step(RequiredUnitExists(UnitTypeId.NEXUS, 2),
                             ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 44)),
                        StepBuildGas(3, skip=RequiredGas(300)),
                        Step(RequiredUnitExists(UnitTypeId.NEXUS, 3),
                             ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 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,
                                    UnitTypeId.TWILIGHTCOUNCIL)),
                        Step(
                            RequiredUnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1),
                            ActTech(UpgradeId.ADEPTPIERCINGATTACK,
                                    UnitTypeId.TWILIGHTCOUNCIL)),
                    ]),
                    [
                        ActUnit(UnitTypeId.VOIDRAY,
                                UnitTypeId.STARGATE,
                                20,
                                priority=True)
                    ],
                    Step(RequiredTime(60 * 5), ActExpand(3)),
                    [GateUnit(UnitTypeId.STALKER, 30)],
                    [
                        GridBuilding(UnitTypeId.GATEWAY, 4),
                        StepBuildGas(4, skip=RequiredGas(200)),
                        GridBuilding(UnitTypeId.STARGATE, 2),
                    ]
                ])
            ]),
        ])
        proxy_zealots = ProxyZealots()

        return BuildOrder([
            SequentialList([
                Step(None,
                     proxy_zealots,
                     skip=RequireCustom(
                         lambda k: self.knowledge.lost_units_manager.
                         own_lost_type(UnitTypeId.GATEWAY))), backup
            ]),
            [
                PlanDistributeWorkers(),
                PlanZoneDefense(),
                PlanZoneGather(),
                attack,
                PlanFinishEnemy(),
            ],
            ChronoUnitProduction(UnitTypeId.ZEALOT, UnitTypeId.GATEWAY)
        ])
    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, UnitTypeId.TWILIGHTCOUNCIL),
            ActTech(UpgradeId.CHARGE, UnitTypeId.TWILIGHTCOUNCIL)
        ]

        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, UnitTypeId.CYBERNETICSCORE)),

            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
        ])
Esempio n. 9
0
    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=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),
            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),
                RequiredUnitExists(UnitTypeId.SIEGETANK, 2, include_killed=True)
            ])),
            Step(None, CancelBuilding(UnitTypeId.COMMANDCENTER, 1), skip=RequiredAny([
                RequireCustom(lambda k: not k.possible_rush_detected),
                RequiredUnitExists(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, UnitTypeId.BARRACKSTECHLAB)),
            Step(None, ActTech(UpgradeId.STIMPACK, UnitTypeId.BARRACKSTECHLAB)),
            Step(None, ActTech(UpgradeId.SHIELDWALL, UnitTypeId.BARRACKSTECHLAB)),
        ]

        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(RequiredUnitExists(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])
Esempio n. 10
0
    def __init__(self):

        gas_related = [
            Step(RequiredUnitExists(UnitTypeId.HATCHERY, 2), ActTech(UpgradeId.ZERGLINGMOVEMENTSPEED, UnitTypeId.SPAWNINGPOOL), skip_until=RequiredGas(100)),
            Step(None, ActBuilding(UnitTypeId.ROACHWARREN, 1), skip_until=RequiredGas(100)),
            StepBuildGas(2, RequiredTime(4 * 60), RequiredGas(100)),
            StepBuildGas(3, RequiredUnitExists(UnitTypeId.HYDRALISKDEN, 1), RequiredGas(50)),
            StepBuildGas(4, RequiredSupply(60, SupplyType.Workers), RequiredGas(25)),
            StepBuildGas(6, RequiredMinerals(749), RequiredGas(25)),
            StepBuildGas(8, RequiredMinerals(1000), RequiredGas(25)),
        ]
        buildings = [
            Step(RequiredUnitExists(UnitTypeId.DRONE, 14), ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2)),
            Step(RequiredSupply(16), ActExpand(2)),
            Step(RequiredSupply(18), ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)),
            StepBuildGas(1, RequiredSupply(20)),
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 2), skip_until=RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1)),

            Step(RequiredUnitExists(UnitTypeId.DRONE, 24, include_killed=True, include_pending=True), ActExpand(3)),
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 3)),
            Step(None, MorphLair(), skip=RequiredUnitExists(UnitTypeId.HIVE, 1)),
            Step(RequiredUnitExists(UnitTypeId.DRONE, 30, include_killed=True), ActExpand(4)),
            Step(RequiredUnitReady(UnitTypeId.LAIR, 1), ActBuilding(UnitTypeId.HYDRALISKDEN, 1)),
            MorphOverseer(1),
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 4)),
            Step(RequiredSupply(100), ActExpand(5)),
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 10), skip_until=RequiredMinerals(500)), # anti air defense!
        ]

        units = [
            Step(RequiredUnitExists(UnitTypeId.HATCHERY, 1), None),

            Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 23)),

            # Early zerglings
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 4),
                 None),
            Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 28)),
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1), ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 12),
                 None),

            # Queen for more larvae
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 1)),
            Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 35), None),
            Step(None, ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 16), None),
            Step(None, ActUnitOnce(UnitTypeId.ROACH, UnitTypeId.LARVA, 4), skip_until=RequiredGas(25)),

            Step(None, ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 100), skip_until=RequiredMinerals(750)),

            Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 45), None),
            Step(None, ActUnit(UnitTypeId.HYDRALISK, UnitTypeId.LARVA, 7), skip=RequiredUnitReady(UnitTypeId.HYDRALISKDEN, 1)),
            Step(None, ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 24), None),
            Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 50), None),
            Step(None, ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA, 10), skip_until=RequiredGas(25)),
            Step(None, ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 70), None),

            Step(None, ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA), skip=RequiredUnitReady(UnitTypeId.HYDRALISKDEN, 1)),

            # Endless hydralisk
            Step(None, ActUnit(UnitTypeId.HYDRALISK, UnitTypeId.LARVA), None)
        ]
        super().__init__([self.overlords, buildings, gas_related, units])
Esempio n. 11
0
    async def create_plan(self) -> BuildOrder:
        build_steps_scv = [
            Step(None,
                 ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 16 + 6),
                 skip=RequiredUnitExists(UnitTypeId.COMMANDCENTER, 2)),
            Step(None,
                 ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 32 + 12))
        ]

        build_steps_buildings = [
            Step(RequiredSupply(13), GridBuilding(UnitTypeId.SUPPLYDEPOT, 1)),
            Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 0.95),
                 GridBuilding(UnitTypeId.BARRACKS, 1)),
            StepBuildGas(1, RequiredSupply(16)),
            ActExpand(2),
            Step(RequiredSupply(16), GridBuilding(UnitTypeId.SUPPLYDEPOT, 2)),
            StepBuildGas(
                2,
                RequiredUnitExists(UnitTypeId.MARINE, 1,
                                   include_pending=True)),
            Step(None,
                 GridBuilding(UnitTypeId.FACTORY, 1),
                 skip_until=RequiredUnitReady(UnitTypeId.BARRACKS, 1)),
            Step(None,
                 ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY,
                               1),
                 skip_until=RequiredUnitReady(UnitTypeId.FACTORY, 1)),
            Step(RequiredSupply(28), GridBuilding(UnitTypeId.SUPPLYDEPOT, 4)),
            Step(None, GridBuilding(UnitTypeId.FACTORY, 2)),
            Step(
                None,
                ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY,
                              2)),
            Step(RequiredSupply(38), GridBuilding(UnitTypeId.SUPPLYDEPOT, 5)),
            Step(None,
                 ActExpand(3),
                 skip_until=RequireCustom(self.should_expand)),
            Step(None,
                 ActExpand(4),
                 skip_until=RequiredAll([
                     RequireCustom(self.should_expand),
                     RequiredUnitReady(UnitTypeId.COMMANDCENTER, 3)
                 ])),
            # BuildStep(None, GridBuilding(UnitTypeId.FACTORY, 3)),
            StepBuildGas(3),
            Step(RequiredSupply(45), GridBuilding(UnitTypeId.SUPPLYDEPOT, 8)),
            Step(None, GridBuilding(UnitTypeId.BARRACKS, 2)),
            Step(
                None,
                ActBuildAddon(UnitTypeId.BARRACKSTECHLAB, UnitTypeId.BARRACKS,
                              1)),
            Step(None, ActTech(UpgradeId.SHIELDWALL,
                               UnitTypeId.BARRACKSTECHLAB)),
            StepBuildGas(4),
            # BuildStep(None, GridBuilding(UnitTypeId.ARMORY, 1)),
            Step(RequiredSupply(75), GridBuilding(UnitTypeId.SUPPLYDEPOT, 10)),
            Step(None, GridBuilding(UnitTypeId.BARRACKS, 5)),
            Step(
                None,
                ActBuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS,
                              3)),
            Step(None, GridBuilding(UnitTypeId.FACTORY, 3)),
            Step(
                None,
                ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY,
                              3)),
            Step(RequiredSupply(85), GridBuilding(UnitTypeId.SUPPLYDEPOT, 14)),
        ]

        build_steps_mech = [
            # Step(RequiredUnitExists(UnitTypeId.FACTORY, 1), ActUnit(UnitTypeId.HELLION, UnitTypeId.FACTORY, 2)),
            Step(RequiredUnitReady(UnitTypeId.FACTORYTECHLAB, 1),
                 ActUnit(UnitTypeId.SIEGETANK, UnitTypeId.FACTORY, 20))
        ]

        build_steps_marines = [
            Step(RequiredUnitReady(UnitTypeId.BARRACKS, 1),
                 ActUnit(UnitTypeId.MARINE, UnitTypeId.BARRACKS, 2)),
            Step(RequiredMinerals(250),
                 ActUnit(UnitTypeId.MARINE, UnitTypeId.BARRACKS, 100))
        ]

        build_order = BuildOrder([
            build_steps_scv, build_steps_buildings, build_steps_mech,
            Step(None,
                 MorphOrbitals(),
                 skip_until=RequiredUnitReady(UnitTypeId.BARRACKS, 1)),
            build_steps_marines,
            ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 99)
        ])

        scout = Step(None,
                     WorkerScout(),
                     skip_until=RequiredUnitExists(UnitTypeId.BARRACKS, 1))

        self.attack = PlanZoneAttack(60)
        tactics = [
            PlanCancelBuilding(),
            LowerDepots(),
            PlanZoneDefense(),
            scout,
            ScanEnemy(120),
            CallMule(),
            PlanDistributeWorkers(),
            Repair(),
            ContinueBuilding(),
            PlanZoneGatherTerran(),
            self.attack,
            PlanFinishEnemy(),
        ]
        return BuildOrder([build_order, tactics])
Esempio n. 12
0
 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.IMMORTAL,
                              UnitTypeId.ROBOTICSFACILITY),
         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(),
                 GateUnit(UnitTypeId.STALKER, 2, priority=True),
                 ActTech(UpgradeId.WARPGATERESEARCH,
                         UnitTypeId.CYBERNETICSCORE),
                 [
                     ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 22),
                     Step(RequiredUnitExists(UnitTypeId.NEXUS, 2),
                          ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 44)),
                     StepBuildGas(3, skip=RequiredGas(300)),
                     Step(RequiredUnitExists(UnitTypeId.NEXUS, 3),
                          ActUnit(UnitTypeId.PROBE, UnitTypeId.NEXUS, 56)),
                     StepBuildGas(5, skip=RequiredGas(200)),
                 ],
                 SequentialList([
                     Step(RequiredUnitReady(UnitTypeId.CYBERNETICSCORE, 1),
                          GridBuilding(UnitTypeId.TWILIGHTCOUNCIL, 1)),
                     GridBuilding(UnitTypeId.ROBOTICSFACILITY, 1),
                     Step(
                         RequiredUnitReady(UnitTypeId.TWILIGHTCOUNCIL, 1),
                         ActTech(UpgradeId.CHARGE,
                                 UnitTypeId.TWILIGHTCOUNCIL)),
                 ]),
                 [
                     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(RequiredTime(60 * 5), ActExpand(3)),
                 [GateUnit(UnitTypeId.ZEALOT, 100)],
                 [
                     GridBuilding(UnitTypeId.GATEWAY, 4),
                     StepBuildGas(4, skip=RequiredGas(200)),
                     GridBuilding(UnitTypeId.ROBOTICSFACILITY, 2),
                 ]
             ])
         ]),
         SequentialList([
             PlanCancelBuilding(),
             PlanHeatObserver(),
             PlanZoneDefense(),
             RestorePower(),
             PlanDistributeWorkers(),
             PlanZoneGather(),
             Step(RequiredUnitReady(UnitTypeId.IMMORTAL, 3), attack),
             PlanFinishEnemy(),
         ])
     ])
Esempio n. 13
0
    async def create_plan(self) -> BuildOrder:
        attack_value = random.randint(50, 80)
        self.attack = Step(None, PlanZoneAttack(attack_value))
        empty = BuildOrder([])
        self.jump = random.randint(0,2)

        if self.jump == 0:
            self.knowledge.print(f"Att at {attack_value}", "Build")
        else:
            self.knowledge.print(f"Jump, att at {attack_value }", "Build")
        worker_scout = Step(None, WorkerScout(), skip_until=RequiredUnitExists(UnitTypeId.SUPPLYDEPOT, 1))
        self.distribute_workers = PlanDistributeWorkers(4)
        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(None, JumpIn(), RequireCustom(lambda k: self.jump == 0)),
            self.attack,
            PlanFinishEnemy(),
        ]

        return BuildOrder([
            empty.depots,
            Step(None, MorphOrbitals(), skip_until=RequiredUnitReady(UnitTypeId.BARRACKS, 1)),
            [
                Step(None, ActUnit(UnitTypeId.SCV, UnitTypeId.COMMANDCENTER, 34 + 12))
            ],
            [
                Step(RequiredSupply(13), GridBuilding(UnitTypeId.SUPPLYDEPOT, 1)),

                Step(RequiredUnitReady(UnitTypeId.SUPPLYDEPOT, 0.95), GridBuilding(UnitTypeId.BARRACKS, 1)),
                StepBuildGas(1),
                ActExpand(2),
                Step(RequiredSupply(20), GridBuilding(UnitTypeId.SUPPLYDEPOT, 2)),
                StepBuildGas(2),
                Step(None, GridBuilding(UnitTypeId.FACTORY, 1),
                     skip_until=RequiredUnitReady(UnitTypeId.BARRACKS, 1)),
                Step(RequiredUnitReady(UnitTypeId.FACTORY, 1), GridBuilding(UnitTypeId.STARPORT, 1)),
                DefensiveBuilding(UnitTypeId.BUNKER, DefensePosition.Entrance, 1),
                Step(None, GridBuilding(UnitTypeId.BARRACKS, 2)),
                StepBuildGas(3),

                Step(None, ActBuildAddon(UnitTypeId.FACTORYTECHLAB, UnitTypeId.FACTORY, 1)),
                Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), GridBuilding(UnitTypeId.FUSIONCORE, 1)),
                Step(None, ActBuildAddon(UnitTypeId.STARPORTTECHLAB, UnitTypeId.STARPORT, 1)),
                StepBuildGas(4, None, RequiredUnitExists(UnitTypeId.BATTLECRUISER,1,include_killed=True, include_pending=True)),
                Step(RequiredUnitExists(UnitTypeId.BATTLECRUISER,1,include_killed=True), GridBuilding(UnitTypeId.BARRACKS, 3)),
                Step(None, ActBuildAddon(UnitTypeId.BARRACKSTECHLAB, UnitTypeId.BARRACKS, 1)),
                Step(None, ActBuildAddon(UnitTypeId.BARRACKSREACTOR, UnitTypeId.BARRACKS, 1)),

                Step(None, GridBuilding(UnitTypeId.STARPORT, 2)),

                Step(RequiredUnitReady(UnitTypeId.STARPORT, 2), ActBuildAddon(UnitTypeId.STARPORTTECHLAB, UnitTypeId.STARPORT, 2)),
                Step(None, ActTech(UpgradeId.SHIELDWALL, UnitTypeId.BARRACKSTECHLAB)),

                Step(RequiredMinerals(600), GridBuilding(UnitTypeId.BARRACKS, 5)),
                ActExpand(3),
            ],
            [
                Step(RequiredAny([RequiredEnemyBuildingExists(UnitTypeId.DARKSHRINE),
                                  RequiredEnemyUnitExistsAfter(UnitTypeId.DARKTEMPLAR),
                                  RequiredEnemyUnitExistsAfter(UnitTypeId.BANSHEE)]), None),
                Step(RequiredUnitReady(UnitTypeId.STARPORT, 1), ActUnit(UnitTypeId.RAVEN, UnitTypeId.STARPORT, 2, priority=True)),
            ],
            Step(None, SequentialList([
                ActUnit(UnitTypeId.BATTLECRUISER, UnitTypeId.STARPORT, 20, priority=True)
            ]), skip_until=RequiredUnitReady(UnitTypeId.FUSIONCORE, 1)),
            ActUnit(UnitTypeId.SIEGETANK, UnitTypeId.FACTORY, 10),
            ActUnit(UnitTypeId.MARINE, UnitTypeId.BARRACKS, 50),
            SequentialList(tactics)
        ])
Esempio n. 14
0
    def __init__(self):

        gas_related = [
            StepBuildGas(1, RequiredUnitExists(UnitTypeId.HATCHERY, 2)),
            Step(None,
                 ActTech(UpgradeId.ZERGLINGMOVEMENTSPEED,
                         UnitTypeId.SPAWNINGPOOL),
                 skip_until=RequiredGas(100)),
            Step(None,
                 ActBuilding(UnitTypeId.ROACHWARREN, 1),
                 skip_until=RequiredGas(100)),
            StepBuildGas(2, RequiredTime(4 * 60)),
            StepBuildGas(3, RequiredUnitExists(UnitTypeId.LAIR, 1)),
            StepBuildGas(5, None, RequiredGas(100)),
            StepBuildGas(8, RequiredSupply(50,
                                           supply_type=SupplyType.Workers)),
        ]
        buildings = [
            Step(RequiredUnitExists(UnitTypeId.DRONE, 14),
                 ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2)),
            Step(RequiredSupply(16), ActExpand(2)),
            Step(RequiredUnitExists(UnitTypeId.EXTRACTOR, 1),
                 ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)),
            Step(None,
                 ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 2),
                 skip_until=RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1)),
            Step(
                RequiredUnitReady(UnitTypeId.SPAWNINGPOOL),
                DefensiveBuilding(UnitTypeId.SPINECRAWLER,
                                  DefensePosition.Entrance, 1)),

            # Step(RequiredUnitExists(UnitTypeId.DRONE, 24, include_killed=True, include_pending=True), ActExpand(3)),
            Step(None,
                 MorphLair(),
                 skip=RequiredUnitExists(UnitTypeId.HIVE, 1)),
            Step(RequiredUnitExists(UnitTypeId.DRONE, 30, include_killed=True),
                 ActExpand(3)),
            Step(None, ZergUnit(UnitTypeId.QUEEN, 3)),
            Step(RequiredUnitExists(UnitTypeId.LAIR, 1),
                 ActBuilding(UnitTypeId.SPIRE, 1)),
            MorphOverseer(1),
            Step(None, ZergUnit(UnitTypeId.QUEEN, 5)),
            Step(RequiredUnitExists(UnitTypeId.SPIRE), ActExpand(4)),
            ActTech(UpgradeId.ZERGFLYERWEAPONSLEVEL1, UnitTypeId.SPIRE),
            Step(
                RequiredUnitExists(UnitTypeId.MUTALISK,
                                   10,
                                   include_killed=True),
                ActBuilding(UnitTypeId.INFESTATIONPIT)),
            Step(RequiredUnitReady(UnitTypeId.INFESTATIONPIT), MorphHive()),
            MorphGreaterSpire(),
            ActTech(UpgradeId.ZERGFLYERWEAPONSLEVEL2, UnitTypeId.GREATERSPIRE),
            ActTech(UpgradeId.ZERGFLYERWEAPONSLEVEL3, UnitTypeId.GREATERSPIRE),
        ]

        high_tier = [
            # Step(RequiredUnitReady(UnitTypeId.GREATERSPIRE), ZergUnit(UnitTypeId.DRONE, 70)),
            Step(None,
                 ZergUnit(UnitTypeId.CORRUPTOR, 3, priority=True),
                 skip_until=RequiredUnitReady(UnitTypeId.GREATERSPIRE)),
            Step(None, MorphBroodLord(5)),
            # Step(RequiredGas(200), ZergUnit(UnitTypeId.MUTALISK, 20, priority=True))
        ]

        units = [
            Step(RequiredUnitExists(UnitTypeId.HATCHERY, 1), None),
            Step(None, ZergUnit(UnitTypeId.DRONE, 20)),

            # Early zerglings
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1),
                 ZergUnit(UnitTypeId.ZERGLING, 4), None),
            Step(None, ZergUnit(UnitTypeId.DRONE, 25)),
            Step(RequiredUnitExists(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=RequiredGas(25)),
            Step(None,
                 ZergUnit(UnitTypeId.MUTALISK, 4),
                 skip_until=RequiredUnitReady(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=RequiredUnitReady(UnitTypeId.SPIRE, 1),
                 skip_until=RequiredGas(25)),
            Step(None, ZergUnit(UnitTypeId.DRONE, 65), None),
            Step(None,
                 ZergUnit(UnitTypeId.ZERGLING, 40),
                 skip_until=RequiredAll([
                     RequiredUnitReady(UnitTypeId.SPIRE, 1),
                     RequiredMinerals(300)
                 ])),
            Step(None,
                 ActUnit(UnitTypeId.ROACH, UnitTypeId.LARVA),
                 skip=RequiredUnitReady(UnitTypeId.SPIRE, 1)),
            Step(None,
                 ZergUnit(UnitTypeId.ZERGLING, 100),
                 skip_until=RequiredAll([
                     RequiredUnitReady(UnitTypeId.SPIRE, 1),
                     RequiredMinerals(500)
                 ])),

            # Endless mutalisks
            Step(None, ActUnit(UnitTypeId.MUTALISK, UnitTypeId.LARVA), None)
        ]
        super().__init__(
            [self.overlords, buildings, gas_related, high_tier, units])
Esempio n. 15
0
    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=RequiredUnitExists(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,
                         UnitTypeId.FACTORYTECHLAB),
                 skip_until=RequiredUnitReady(UnitTypeId.FACTORYTECHLAB, 1)),
            StepBuildGas(5),
            Step(None,
                 ActTech(UpgradeId.HIGHCAPACITYBARRELS,
                         UnitTypeId.FACTORYTECHLAB),
                 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,
                        UnitTypeId.ARMORY)),
            ActTech(UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL1,
                    UnitTypeId.ARMORY),
            ActTech(UpgradeId.TERRANVEHICLEWEAPONSLEVEL2, UnitTypeId.ARMORY),
            ActTech(UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL2,
                    UnitTypeId.ARMORY),
            ActTech(UpgradeId.TERRANVEHICLEWEAPONSLEVEL3, UnitTypeId.ARMORY),
            ActTech(UpgradeId.TERRANVEHICLEANDSHIPARMORSLEVEL3,
                    UnitTypeId.ARMORY),
        ]

        self.attack = PlanZoneAttack(40)

        worker_scout = Step(None,
                            WorkerScout(),
                            skip_until=RequiredUnitExists(
                                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(RequiredUnitExists(UnitTypeId.BARRACKS, 1),
                 SequentialList(self.depots)),
            [
                Step(RequiredUnitExists(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(RequiredUnitExists(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)
        ])
Esempio n. 16
0
    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,
                               UnitTypeId.BARRACKSTECHLAB)),
            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
        ])
Esempio n. 17
0
    def __init__(self):

        gas_related = [
            StepBuildGas(1, RequiredUnitExists(UnitTypeId.HATCHERY, 2)),
            Step(None,
                 ActTech(UpgradeId.ZERGLINGMOVEMENTSPEED,
                         UnitTypeId.SPAWNINGPOOL),
                 skip_until=RequiredGas(100)),
        ]
        buildings = [
            # 12 Pool
            Step(None, ActBuilding(UnitTypeId.SPAWNINGPOOL, 1)),
            Step(
                RequiredUnitExists(UnitTypeId.ZERGLING, 4,
                                   include_killed=True), ActExpand(2)),
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 2)),
            Step(RequiredUnitExists(UnitTypeId.DRONE, 24, include_killed=True),
                 ActExpand(3)),
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 3)),
            Step(RequiredUnitExists(UnitTypeId.DRONE, 30, include_killed=True),
                 ActExpand(4)),
            Step(None, ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 4)),
        ]

        spire_end_game = [
            Step(
                RequiredAny([
                    RequiredSupply(90),
                    RequiredUnitExists(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, RequiredUnitExists(UnitTypeId.HATCHERY, 1)),

            # 12 Pool followed by overlord
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1),
                 ActUnit(UnitTypeId.OVERLORD, UnitTypeId.LARVA, 2),
                 RequiredUnitExists(UnitTypeId.OVERLORD, 2)),

            # TheMusZero
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1),
                 ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 14),
                 RequiredUnitExists(UnitTypeId.DRONE, 14)),

            # Early zerglings
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1),
                 ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 4), None),
            # Queen for more larvae
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1),
                 ActUnit(UnitTypeId.QUEEN, UnitTypeId.HATCHERY, 1),
                 RequiredUnitExists(UnitTypeId.QUEEN, 1)),
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1),
                 ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 20), None),
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1),
                 ActUnitOnce(UnitTypeId.ZERGLING, UnitTypeId.LARVA, 12), None),
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1),
                 ActUnit(UnitTypeId.DRONE, UnitTypeId.LARVA, 30), None),
            # Endless zerglings
            Step(RequiredUnitExists(UnitTypeId.SPAWNINGPOOL, 1),
                 ActUnit(UnitTypeId.ZERGLING, UnitTypeId.LARVA), None)
        ]

        super().__init__(
            [self.overlords, buildings, spire_end_game, gas_related, units])