Commit 9d840f15 authored by m1ndgames's avatar m1ndgames

update

parent 93e20488
......@@ -22,6 +22,7 @@ class GameManager():
# Locations
self.bot.hq_location = None # 1st townhall
self.bot.ramp_location = None # ramp to natural
self.bot.next_expansion = None # Next expansion position
self.bot.rushwait_location = None # position at natural
self.bot.proxy_location = None # proxy position near enemy start position
self.bot.startpoint = None
......@@ -38,6 +39,8 @@ class GameManager():
self.attacktime = None
self.bot.data_attacktime = None
self.bot.data_attackunits = None
self.bot.not_squadunit = []
self.bot.not_commanderunit = []
def clearscreen(self):
if os.name == 'nt':
......@@ -91,6 +94,9 @@ class GameManager():
await self.set_positions()
await self.mapbounds()
async def setExpansion(self):
self.bot.next_expansion = await self.bot.get_next_expansion()
async def manageRaces(self):
# Detect Player and Enemy Race
if not self.bot.race_self:
......
......@@ -19,14 +19,15 @@ class m1ndb0t(sc2.BotAI):
self.ressources = Ressources(self)
self.gamemanager = GameManager(self)
self.unitmanager = UnitManager(self)
self.warmanager = WarManager(self)
self.protossmanager = ProtossManager(self)
self.terranmanager = TerranManager(self)
self.zergmanager = ZergManager(self)
self.warmanager = WarManager(self)
self.iteration = None
# STDOUT
self.showstatus = False
self.printdebug = True
async def on_start(self):
await self.gamemanager.startGame()
......@@ -37,6 +38,9 @@ class m1ndb0t(sc2.BotAI):
# Manage own and enemy Race
await self.gamemanager.manageRaces()
await self.gamemanager.setExpansion()
await self.ressources.manageSupply()
# Persistent data: Attack Time
......@@ -69,5 +73,8 @@ class m1ndb0t(sc2.BotAI):
self.do(unit.attack(target))
return
if self.printdebug:
await self.client._send_debug()
async def on_end(self, game_result):
await self.warmanager.savewinningstrategy()
......@@ -4,6 +4,7 @@ from strategies.protoss.ZealotRush import *
from strategies.protoss.SkyToss import *
from strategies.protoss.DarkTemplar import *
class ProtossManager():
"""Protoss Race Manager"""
def __init__(self, bot=None):
......@@ -11,6 +12,10 @@ class ProtossManager():
self.strategy = None
async def Run(self):
if self.bot.iteration == 1:
self.bot.not_squadunit.append(race_worker[self.bot.race])
self.bot.not_commanderunit.append(race_worker[self.bot.race])
if not self.strategy:
self.pickStrategy()
else:
......@@ -26,7 +31,7 @@ class ProtossManager():
self.strategy = random.choice(strategies)
# DEBUG Overrides
#self.strategy = StalkerRush(self.bot)
#self.strategy = ZealotRush(self.bot)
#self.strategy = SkyToss(self.bot)
#self.strategy = DarkTemplar(self.bot)
# self.strategy = StalkerRush(self.bot)
# self.strategy = ZealotRush(self.bot)
# self.strategy = SkyToss(self.bot)
# self.strategy = DarkTemplar(self.bot)
......@@ -15,13 +15,14 @@ class Ressources():
self.bot.neededworkers = 0
self.assigned_harvesters = 0
async def manageSupply(self):
# Supply
if self.bot.supply_left < 7 and self.bot.supply_cap != 200:
supplyposition = self.bot.hq_location.random_on_distance(random.randrange(1, 12))
await self.bot.unitmanager.createSupply(supplyposition)
hq = random.choice(self.bot.townhalls).position
if hq:
supplyposition = hq.random_on_distance(random.randrange(1, 12))
if supplyposition:
await self.bot.unitmanager.createSupply(supplyposition)
async def createGas(self):
# Gas
......@@ -42,6 +43,8 @@ class Ressources():
worker = self.bot.select_build_worker(vg.position)
if worker is None:
break
if worker.tag == self.bot.scout_tag:
break
if not self.bot.already_pending(race_gas[self.bot.race]):
self.bot.do(worker.build(race_gas[self.bot.race], vg))
......
......@@ -9,10 +9,14 @@ class SkyToss:
self.ramp_supply_built = False
self.workerscout = None
self.bot.strategy = 'SkyToss'
self.bot.squadsize = 10
self.bot.squadsize = 6
async def Run(self):
"""Runs on every GameStep"""
if self.bot.iteration == 1:
self.bot.not_squadunit.extend([UnitTypeId.ADEPT, UnitTypeId.INTERCEPTOR])
self.bot.not_commanderunit.extend([UnitTypeId.ADEPT, UnitTypeId.MOTHERSHIP, UnitTypeId.INTERCEPTOR])
if int(self.bot.time) <= 360:
self.bot.attack_count = 5
self.bot.retreat_count = 1
......@@ -78,13 +82,115 @@ class SkyToss:
if distance2enemy < 20:
self.bot.do(adept.attack(next_enemy))
nx = self.bot.townhalls.ready.closest_to(adept)
if not nx:
break
nxdistance = adept.position.distance_to(nx.position)
if nxdistance < 10:
break
# Voidray
voidrays = self.bot.units(UnitTypeId.VOIDRAY).ready
if voidrays:
for voidray in voidrays:
if self.bot.commandertarget and voidray.tag != self.bot.commander:
if voidray.position.distance_to(self.bot.commandertarget.position) <= (self.bot.techtree.get_unit_weaponrange(voidray.type_id) + 10):
self.bot.do(voidray.attack(self.bot.commandertarget))
else:
if self.bot.enemy_units:
enemies = self.bot.enemy_units
if enemies:
closeenemies = enemies.closer_than(30, voidray)
if closeenemies:
for e in closeenemies:
if not self.bot.techtree.can_attack(voidray, e) or not e.can_be_attacked:
closeenemies.remove(e)
if not closeenemies:
break
next_enemy = closeenemies.closest_to(voidray)
if not next_enemy:
break
distance2enemy = voidray.position.distance_to(next_enemy.position)
if distance2enemy < self.bot.techtree.get_unit_weaponrange(voidray.type_id):
if (next_enemy.name != 'Probe') or (next_enemy.name != 'SCV') or (next_enemy.name != 'Drone'):
moveposition = voidray.position.towards(next_enemy.position, -1)
if not moveposition or not self.bot.in_pathing_grid(moveposition):
break
self.bot.do(voidray.move(moveposition))
# Carrier
carriers = self.bot.units(UnitTypeId.CARRIER).ready
if carriers:
for carrier in carriers:
if self.bot.commandertarget and carrier.tag != self.bot.commander:
if carrier.position.distance_to(self.bot.commandertarget.position) <= 8:
self.bot.do(carrier.attack(self.bot.commandertarget))
else:
if self.bot.enemy_units:
enemies = self.bot.enemy_units
if enemies:
closeenemies = enemies.closer_than(30, carrier)
if closeenemies:
for e in closeenemies:
if not self.bot.techtree.can_attack(carrier, e) or not e.can_be_attacked:
closeenemies.remove(e)
if not closeenemies:
break
next_enemy = closeenemies.closest_to(carrier)
if not next_enemy:
break
distance2enemy = carrier.position.distance_to(next_enemy.position)
if distance2enemy <= 10:
if (next_enemy.name != 'Probe') or (next_enemy.name != 'SCV') or (next_enemy.name != 'Drone'):
moveposition = carrier.position.towards(next_enemy.position, -1)
if not moveposition or not self.bot.in_pathing_grid(moveposition):
break
self.bot.do(carrier.move(moveposition))
# Tempest
tempests = self.bot.units(UnitTypeId.TEMPEST).ready
if tempests:
for tempest in tempests:
if self.bot.commandertarget and tempest.tag != self.bot.commander:
if tempest.position.distance_to(self.bot.commandertarget.position) <= (self.bot.techtree.get_unit_weaponrange(tempest.type_id) + 10):
self.bot.do(tempest.attack(self.bot.commandertarget))
else:
if self.bot.enemy_units:
enemies = self.bot.enemy_units
if enemies:
closeenemies = enemies.closer_than(30, tempest)
if closeenemies:
for e in closeenemies:
if not self.bot.techtree.can_attack(tempest, e) or not e.can_be_attacked:
closeenemies.remove(e)
if not closeenemies:
break
next_enemy = closeenemies.closest_to(tempest)
if not next_enemy:
break
distance2enemy = tempest.position.distance_to(next_enemy.position)
if distance2enemy < self.bot.techtree.get_unit_weaponrange(tempest.type_id):
if (next_enemy.name != 'Probe') or (next_enemy.name != 'SCV') or (next_enemy.name != 'Drone'):
moveposition = tempest.position.towards(next_enemy.position, -1)
if not moveposition or not self.bot.in_pathing_grid(moveposition):
break
self.bot.do(tempest.move(moveposition))
# Mothership
motherships = self.bot.units(UnitTypeId.MOTHERSHIP).ready
if motherships:
for mothership in motherships:
if self.bot.commander:
if mothership.position.distance_to(self.bot.commanderposition) <= 3:
self.bot.do(mothership.move(self.bot.commanderposition))
async def createWall(self):
"""Wall-in Routine"""
......
from sc2.position import Point3
from sc2.constants import *
from sc2 import race_worker
......@@ -14,6 +16,9 @@ class StalkerRush:
async def Run(self):
"""Runs on every GameStep"""
if self.bot.iteration == 1:
self.bot.not_commanderunit.append(UnitTypeId.SENTRY)
if int(self.bot.time) <= 360:
self.bot.attack_count = 5
self.bot.retreat_count = 1
......@@ -30,7 +35,7 @@ class StalkerRush:
async def Macro(self):
"""Macro Routine"""
await self.bot.unitmanager.createBuilding("Gateway", 1, self.bot.hq_location, 15)
await self.bot.unitmanager.createBuilding("Gateway", 1)
# Build a wall if enemy is attacking early
if self.bot.data_attacktime:
......@@ -44,10 +49,12 @@ class StalkerRush:
await self.bot.unitmanager.trainSkill("RESEARCH_WARPGATE")
if self.bot.structures(UnitTypeId.CYBERNETICSCORE):
await self.bot.unitmanager.createBuilding("Gateway", 3, self.bot.hq_location, 15)
await self.bot.unitmanager.createBuilding("Gateway", 3)
if self.bot.units(UnitTypeId.STALKER):
await self.bot.unitmanager.trainSkill("RESEARCH_BLINK")
if self.bot.units(UnitTypeId.STALKER).amount >= 5:
await self.bot.unitmanager.createUnit("Sentry", 3)
# Send a worker scout
if self.bot.units(race_worker[self.bot.race]).ready and not self.workerscout:
......@@ -67,50 +74,100 @@ class StalkerRush:
async def Micro(self):
"""Micro Routine"""
# Stalker Micro
# Stalker
stalkers = self.bot.units(UnitTypeId.STALKER).ready
if stalkers:
for stalker in stalkers:
if self.bot.enemy_units:
enemies = self.bot.enemy_units.closer_than(30, stalker)
if enemies:
next_enemy = enemies.closest_to(stalker)
if not next_enemy:
break
if self.bot.commandertarget and stalker.tag != self.bot.commander:
if stalker.position.distance_to(self.bot.commandertarget.position) <= (self.bot.techtree.get_unit_weaponrange(stalker.type_id) + 3):
self.bot.do(stalker.attack(self.bot.commandertarget))
else:
if self.bot.enemy_units:
enemies = self.bot.enemy_units
if enemies:
closeenemies = enemies.closer_than(15, stalker)
if closeenemies:
for e in closeenemies:
if not self.bot.techtree.can_attack(stalker, e) or not e.can_be_attacked:
closeenemies.remove(e)
if not closeenemies:
break
distance2enemy = stalker.position.distance_to(next_enemy.position)
if distance2enemy < 20:
self.bot.do(stalker.attack(next_enemy))
next_enemy = closeenemies.closest_to(stalker)
if not next_enemy:
break
nx = self.bot.townhalls.ready.closest_to(stalker)
if not nx:
distance2enemy = stalker.position.distance_to(next_enemy.position)
if distance2enemy < self.bot.techtree.get_unit_weaponrange(stalker.type_id):
if (next_enemy.name != 'Probe') or (next_enemy.name != 'SCV') or (
next_enemy.name != 'Drone'):
abilities = await self.bot.get_available_abilities(stalker)
if (AbilityId.EFFECT_BLINK_STALKER in abilities) and (stalker.health_percentage < 25):
if not next_enemy.position:
break
blinkposition = stalker.position.towards(next_enemy.position, -8)
if not blinkposition:
break
if stalker.position != next_enemy.position:
if self.bot.in_pathing_grid(blinkposition) or (blinkposition == stalker.position):
self.bot.do(stalker(AbilityId.EFFECT_BLINK_STALKER, blinkposition))
else:
moveposition = stalker.position.towards(next_enemy.position, -1)
if not moveposition or not self.bot.in_pathing_grid(moveposition):
break
self.bot.do(stalker.move(moveposition))
# Sentry
sentries = self.bot.units(UnitTypeId.SENTRY).ready
if sentries:
for sentry in sentries:
enemies = self.bot.enemy_units
if enemies:
closeenemies = enemies.closer_than(30, sentry)
if closeenemies:
for e in closeenemies:
if not self.bot.techtree.can_attack(sentry, e) or not e.can_be_attacked:
closeenemies.remove(e)
if not closeenemies:
break
next_enemy = closeenemies.closest_to(sentry)
if not next_enemy:
break
distance2enemy = sentry.position.distance_to(next_enemy.position)
blockpos = self.bot.ramp_location.towards(self.bot.next_expansion, 1)
enemydistance2ramp = next_enemy.position.distance_to(self.bot.ramp_location)
sentrydistance2ramp = sentry.position.distance_to(self.bot.ramp_location)
# Block Ramp
if (next_enemy.type_id == UnitTypeId.ZEALOT or next_enemy.type_id == UnitTypeId.MARINE or next_enemy.type_id == UnitTypeId.ZERGLING) and enemydistance2ramp <= 10 and sentry.energy >= 50:
self.bot.do(sentry(AbilityId.FORCEFIELD_FORCEFIELD, blockpos))
break
# Shield
if not sentry.has_buff(BuffId.GUARDIANSHIELD) and (sentry.energy >= 75) and (distance2enemy < 8):
if (not next_enemy.name == 'Probe') or (not next_enemy.name == 'SCV') or (
not next_enemy.name == 'Drone'):
self.bot.do(sentry(AbilityId.GUARDIANSHIELD_GUARDIANSHIELD))
break
nxdistance = stalker.position.distance_to(nx.position)
if nxdistance < 10:
else:
hqdistance = sentry.position.distance_to(self.bot.hq_location)
if (hqdistance < 10) or (distance2enemy < 2):
break
if distance2enemy < self.bot.techtree.get_unit_weaponrange(UnitTypeId.STALKER):
if (next_enemy.name != 'Probe') or (next_enemy.name != 'SCV') or (
next_enemy.name != 'Drone'):
abilities = await self.bot.get_available_abilities(stalker)
if (AbilityId.EFFECT_BLINK_STALKER in abilities) and (stalker.health_percentage < 25):
if not next_enemy.position:
break
blinkposition = stalker.position.towards(next_enemy.position, -8)
if not blinkposition:
break
if stalker.position != next_enemy.position:
if self.bot.in_pathing_grid(blinkposition) or (blinkposition == stalker.position):
self.bot.do(stalker(AbilityId.EFFECT_BLINK_STALKER, blinkposition))
elif distance2enemy < 2:
if distance2enemy < 6:
if (next_enemy.name != 'Probe') or (next_enemy.name != 'SCV') or (next_enemy.name != 'Drone'):
moveposition = sentry.position.towards(next_enemy.position, -1)
if not moveposition or not self.bot.in_pathing_grid(moveposition):
break
else:
moveposition = stalker.position.towards(next_enemy.position, -1)
if not moveposition or not self.bot.in_pathing_grid(moveposition):
break
self.bot.do(stalker.move(moveposition))
self.bot.do(sentry.move(moveposition))
async def Buffs(self):
"""Buff Routine"""
......
......@@ -50,7 +50,7 @@ class ZealotRush:
# Zealot Micro
zealots = self.bot.units(UnitTypeId.ZEALOT).ready
if zealots:
ground_enemies = self.bot.enemy_units.not_flying
ground_enemies = self.bot.all_enemies.not_flying
if ground_enemies:
for zealot in zealots:
near_enemies = ground_enemies.closer_than(30, zealot)
......
......@@ -14,6 +14,10 @@ class BanelingSpam:
async def Run(self):
"""Runs on every GameStep"""
if self.bot.iteration == 1:
self.bot.not_squadunit.append(UnitTypeId.QUEEN)
self.bot.not_commanderunit.append(UnitTypeId.QUEEN)
await self.Macro()
await self.Micro()
......
......@@ -14,6 +14,10 @@ class MutaliskRush:
async def Run(self):
"""Runs on every GameStep"""
if self.bot.iteration == 1:
self.bot.not_squadunit.append(UnitTypeId.QUEEN)
self.bot.not_commanderunit.append(UnitTypeId.QUEEN)
await self.Macro()
await self.Micro()
......
......@@ -14,6 +14,10 @@ class ZerglingRush:
async def Run(self):
"""Runs on every GameStep"""
if self.bot.iteration == 1:
self.bot.not_squadunit.append(UnitTypeId.QUEEN)
self.bot.not_commanderunit.append(UnitTypeId.QUEEN)
await self.Macro()
await self.Micro()
......
......@@ -60,6 +60,18 @@ class TechTree():
else:
return 0
def get_unit_weaponcooldown(self, unittype):
unitname = self.get_name_from_id(unittype.value)
for unit in self.unit:
if unit['name'] == unitname:
if 'weapons' in unit:
for weapon in unit['weapons']:
if 'cooldown' in weapon:
cooldown = weapon['cooldown']
return cooldown
else:
return 0
def can_attack(self, unit, enemyunit):
unittype = unit.type_id
unitname = self.get_name_from_id(unittype.value)
......
......@@ -8,6 +8,10 @@ class TerranManager():
self.strategy = None
async def Run(self):
if self.bot.iteration == 1:
self.bot.not_squadunit.append(race_worker[self.bot.race])
self.bot.not_commanderunit.append(race_worker[self.bot.race])
if not self.strategy:
self.pickStrategy()
else:
......
......@@ -194,8 +194,14 @@ class UnitManager():
print("Building supply: " + str(buildingname))
self.bot.do(worker.build(building, supplyposition))
async def createBuilding(self, buildingname, count, position, maxrange=30, force=False):
async def createBuilding(self, buildingname, count, position=None, maxrange=15, force=False):
"""Builds everything required for a Building / Builds a Building"""
if not position:
if self.bot.townhalls:
position = random.choice(self.bot.townhalls).position
else:
position = random.choice(self.bot.hq_location)
buildingid = self.bot.techtree.get_id_from_name(buildingname)
buildingcount = self.bot.all_units(buildingid).amount
buildrequirement = self.bot.techtree.get_building_buildRequirement(buildingid)
......@@ -247,7 +253,7 @@ class UnitManager():
if requirementbuildingname == 'Lair':
spawningpools = self.bot.structures(UnitTypeId.SPAWNINGPOOL).ready
if not spawningpools:
await self.createBuilding("SpawningPool", 1, self.bot.hq_location)
await self.createBuilding("SpawningPool", 1)
return
hqs = self.bot.structures(UnitTypeId.HATCHERY).ready
......@@ -272,8 +278,12 @@ class UnitManager():
self.bot.do(hq(AbilityId.UPGRADETOHIVE_HIVE))
else:
await self.createBuilding(requirementbuildingname, 1, self.bot.hq_location, 15)
return
if self.bot.townhalls:
await self.createBuilding(requirementbuildingname, 1, random.choice(self.bot.townhalls).position, 15)
return
else:
await self.createBuilding(requirementbuildingname, 1, random.choice(self.bot.hq_location).position, 15)
return
morphinfo = self.bot.techtree.get_building_morphbuilding(buildingid)
if morphinfo:
......@@ -293,6 +303,9 @@ class UnitManager():
if worker is None:
return
if worker.tag == self.bot.scout_tag:
return
if maxrange != 0:
randomposition = position.random_on_distance(random.randrange(1, maxrange))
else:
......
......@@ -6,6 +6,7 @@ import sc2
from sc2.constants import *
import random
class WarManager():
def __init__(self, bot=None):
self.bot = bot
......@@ -47,6 +48,10 @@ class WarManager():
await self.counterworkerrush()
await self.defendroutine()
self.bot.all_enemies = []
self.bot.all_enemies = self.bot.all_enemies + self.bot.enemy_units
self.bot.all_enemies = self.bot.all_enemies + self.bot.enemy_structures
if self.bot.showstatus:
if int(self.bot.time) & 2 == 0:
self.bot.gamemanager.clearscreen()
......@@ -163,10 +168,7 @@ class WarManager():
async def commanderroutine(self):
"""Defines a Commander"""
fighters = self.bot.units.ready.filter(
lambda w: w.type_id not in [race_worker[self.bot.race]] and w.type_id not in [
UnitTypeId.OBSERVER] and w.type_id not in [UnitTypeId.WARPPRISM] and w.type_id not in [
UnitTypeId.WARPPRISMPHASING] and w.type_id not in [UnitTypeId.SENTRY] and w.type_id not in [UnitTypeId.OBSERVERSIEGEMODE] and w.type_id not in [UnitTypeId.OVERLORD] and w.type_id not in [UnitTypeId.QUEEN] and w.type_id not in [UnitTypeId.MEDIVAC])
fighters = self.bot.units.ready.filter(lambda w: w.type_id not in self.bot.not_commanderunit)
if (fighters.amount >= self.bot.attack_count) or self.startcounter:
self.fightstarted = True
......@@ -180,9 +182,10 @@ class WarManager():
else:
for fighter in fighters:
if fighter.tag == self.bot.commander:
#await self.bot._client.debug_text("C", fighter.position) # DEBUG
self.bot.commanderunit = fighter
self.bot.commanderposition = fighter.position
#self.bot._client.debug_text_world("C", self.bot.hq_location) # DEBUG
await self.bot._client._send_debug()
return
self.bot.commanderunit = None
self.bot.commander = False
......@@ -229,14 +232,13 @@ class WarManager():
if not self.bot.commander or not self.bot.commanderunit or not self.bot.commanderposition:
return
fighters = self.bot.units.ready.filter(
lambda w: w.type_id not in [race_worker[self.bot.race]] and w.type_id not in [
UnitTypeId.OBSERVER] and w.type_id not in [UnitTypeId.WARPPRISM] and w.type_id not in [
UnitTypeId.WARPPRISMPHASING] and w.type_id not in [UnitTypeId.OVERLORD] and w.type_id not in [UnitTypeId.QUEEN] and w.type_id not in [UnitTypeId.LARVA] and w.type_id not in [UnitTypeId.MEDIVAC])
fighters = self.bot.units.ready.filter(lambda w: w.type_id not in self.bot.not_squadunit)
if fighters:
for fighter in fighters:
if fighter.tag == self.bot.scout_tag:
break
# Commander Action
if fighter.tag == self.bot.commander:
......@@ -264,26 +266,24 @@ class WarManager():
elif self.fightstarted:
# Target
if self.bot.enemy_structures:
target = random.choice(self.bot.enemy_structures).position
target = random.choice(self.bot.enemy_structures)
elif self.bot.enemy_units:
target = random.choice(self.bot.enemy_units).position
target = random.choice(self.bot.enemy_units)
else:
target = None
await self.scout()
squad = self.bot.units.ready.filter(
lambda w: w.type_id not in [race_worker[self.bot.race]] and w.type_id not in [
UnitTypeId.OBSERVER] and w.type_id not in [UnitTypeId.WARPPRISM] and w.type_id not in [
UnitTypeId.WARPPRISMPHASING] and w.type_id not in [UnitTypeId.QUEEN] and w.type_id not in [UnitTypeId.LARVA] and w.type_id not in [UnitTypeId.MEDIVAC]).closer_than(10, fighter)
lambda w: w.type_id not in self.bot.not_squadunit).closer_than(10, fighter)
if squad.amount < self.bot.squadsize:
self.bot.do(fighter.move(fighter.position))
if squad.amount <= self.bot.squadsize:
self.bot.do(fighter.attack(fighter.position))
break
if target:
self.bot.do(fighter.attack(target.position))
self.bot.commanderposition = target.position
self.bot.commanderposition = fighter.position
self.bot.commandertarget = target
self.bot.do(fighter.attack(target))
break
else:
self.bot.commandertarget = None
......
......@@ -10,6 +10,10 @@ class ZergManager():
self.strategy = None
async def Run(self):
if self.bot.iteration == 1:
self.bot.not_squadunit.extend([race_worker[self.bot.race], UnitTypeId.OVERLORD, UnitTypeId.LARVA])
self.bot.not_commanderunit.extend([race_worker[self.bot.race], UnitTypeId.OVERLORD, UnitTypeId.LARVA])
if not self.strategy:
self.pickStrategy()
else:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment