From 824bdef6d4bd2b7a34224f8bbda5870cdf6ff462 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Fri, 26 Jan 2018 10:58:44 +0800 Subject: [PATCH 01/56] Add inline condition to prevent converting of 'None' to string for non-Windows platforms --- sc2/sc2process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sc2/sc2process.py b/sc2/sc2process.py index 8a04960ad..eb9e9c28b 100644 --- a/sc2/sc2process.py +++ b/sc2/sc2process.py @@ -78,7 +78,7 @@ def _launch(self): "-dataDir", str(Paths.BASE), "-tempDir", self._tmp_dir ], - cwd=str(Paths.CWD), + cwd=str(Paths.CWD) if Paths.CWD else None, #, env=run_config.env ) From cf0483c1f534052e51f2633ee8b3c13ab1b6cec1 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Fri, 26 Jan 2018 18:42:10 +0800 Subject: [PATCH 02/56] Initial implementation of build order support --- examples/terran_build_order.py | 39 +++++++++++++++ sc2/build_order.py | 86 ++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 examples/terran_build_order.py create mode 100644 sc2/build_order.py diff --git a/examples/terran_build_order.py b/examples/terran_build_order.py new file mode 100644 index 000000000..a8a4edc18 --- /dev/null +++ b/examples/terran_build_order.py @@ -0,0 +1,39 @@ +import sc2 +from sc2 import run_game, maps, Race, Difficulty +from sc2.build_order import BuildOrder, supply_is, minerals_at_least, train, build, all_of +from sc2.player import Bot, Computer +from sc2.constants import * + + +def first_barracks(bot, state): + return bot.units(UnitTypeId.BARRACKS).first + + +class TerranBuildOrderBot(sc2.BotAI): + def __init__(self): + build_order = [ + (supply_is(12), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (all_of(supply_is(13), minerals_at_least(100)), build(UnitTypeId.SUPPLYDEPOT)), + (supply_is(13), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (supply_is(14), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (all_of(supply_is(15), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), + (supply_is(15), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (supply_is(16), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (supply_is(17), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (all_of(supply_is(18), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), + (supply_is(18), build(UnitTypeId.SUPPLYDEPOT, around_building=first_barracks)), + (supply_is(18), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + ] + self.build_order = BuildOrder(self, build_order) + + async def on_step(self, state, iteration): + await self.build_order.execute_build(state) + cc = self.units(UnitTypeId.COMMANDCENTER).first + for scv in self.units(UnitTypeId.SCV).idle: + await self.do(scv.gather(self.state.mineral_field.closest_to(cc))) + + +run_game(maps.get("Abyssal Reef LE"), [ + Bot(Race.Terran, TerranBuildOrderBot()), + Computer(Race.Protoss, Difficulty.Medium) +], realtime=True) diff --git a/sc2/build_order.py b/sc2/build_order.py new file mode 100644 index 000000000..704a11db6 --- /dev/null +++ b/sc2/build_order.py @@ -0,0 +1,86 @@ +class BuildOrder(object): + def __init__(self, bot, build): + self.build = build + self.bot = bot + self.next_execution = 0 + + async def execute_build(self, state): + for index, item in enumerate(self.build): + if index > self.next_execution: + return None + + condition, intent = item + action, intended_unit = intent + condition = item[0] if item[0] else always_true + if condition(self.bot, state) and self.bot.can_afford(intended_unit): + self.next_execution = index + 1 + return await action(self.bot, state) + + +def train(unit, on_building): + async def train_spec(bot, state): + buildings = bot.units(on_building).ready.noqueue + if buildings.exists: + selected = buildings.first + print("Training {}".format(unit)) + return await bot.do(selected.train(unit)) + else: + return None + + return train_spec, unit + + +def build(building, around_building=None, placement=None): + async def build_spec(bot, state): + if not around_building: + around = bot.townhalls.first + else: + around = around_building(bot, state) + + if not placement: + location = around.position.towards(bot.game_info.map_center, 5) + else: + location = placement + print("Building {}".format(building)) + return await bot.build(building, near=location) + + return build_spec, building + + +def all_of(*args): + def condition(bot, state): + return all(map(lambda a: a(bot, state), args)) + + return condition + + +def any_of(*args): + def condition(bot, state): + return all(any(lambda a: a(bot, state), args)) + + return condition + + +def always_true(bot, state): + return True + + +def supply_is(s): + def condition(bot, state): + return bot.supply_used == s + condition.__str__() + return condition + + +def gas_at_least(s): + def condition(bot, state): + return bot.vespene >= s + + return condition + + +def minerals_at_least(s): + def condition(bot, state): + return bot.minerals >= s + + return condition \ No newline at end of file From c8c0d5ec080addbab49ff8baecb22e70a293af08 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Fri, 26 Jan 2018 21:10:10 +0800 Subject: [PATCH 03/56] Move build order related files to its own submodule --- examples/terran_build_order.py | 5 +-- sc2/build_orders/__init__.py | 0 sc2/{ => build_orders}/build_order.py | 45 ++------------------------- sc2/build_orders/state_conditions.py | 38 ++++++++++++++++++++++ 4 files changed, 44 insertions(+), 44 deletions(-) create mode 100644 sc2/build_orders/__init__.py rename sc2/{ => build_orders}/build_order.py (63%) create mode 100644 sc2/build_orders/state_conditions.py diff --git a/examples/terran_build_order.py b/examples/terran_build_order.py index a8a4edc18..afae32ac6 100644 --- a/examples/terran_build_order.py +++ b/examples/terran_build_order.py @@ -1,8 +1,9 @@ import sc2 from sc2 import run_game, maps, Race, Difficulty -from sc2.build_order import BuildOrder, supply_is, minerals_at_least, train, build, all_of +from sc2.build_orders.build_order import BuildOrder, train, build, expand from sc2.player import Bot, Computer from sc2.constants import * +from sc2.build_orders.state_conditions import all_of, supply_is, minerals_at_least def first_barracks(bot, state): @@ -21,7 +22,7 @@ def __init__(self): (supply_is(16), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), (supply_is(17), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), (all_of(supply_is(18), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), - (supply_is(18), build(UnitTypeId.SUPPLYDEPOT, around_building=first_barracks)), + (all_of(supply_is(18), minerals_at_least(100)), build(UnitTypeId.SUPPLYDEPOT, around_building=first_barracks)), (supply_is(18), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), ] self.build_order = BuildOrder(self, build_order) diff --git a/sc2/build_orders/__init__.py b/sc2/build_orders/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sc2/build_order.py b/sc2/build_orders/build_order.py similarity index 63% rename from sc2/build_order.py rename to sc2/build_orders/build_order.py index 704a11db6..c1c97cedc 100644 --- a/sc2/build_order.py +++ b/sc2/build_orders/build_order.py @@ -1,3 +1,6 @@ +from sc2.build_orders.state_conditions import always_true + + class BuildOrder(object): def __init__(self, bot, build): self.build = build @@ -41,46 +44,4 @@ async def build_spec(bot, state): location = around.position.towards(bot.game_info.map_center, 5) else: location = placement - print("Building {}".format(building)) - return await bot.build(building, near=location) - - return build_spec, building - - -def all_of(*args): - def condition(bot, state): - return all(map(lambda a: a(bot, state), args)) - - return condition - - -def any_of(*args): - def condition(bot, state): - return all(any(lambda a: a(bot, state), args)) - - return condition - - -def always_true(bot, state): - return True - - -def supply_is(s): - def condition(bot, state): - return bot.supply_used == s - condition.__str__() - return condition - - -def gas_at_least(s): - def condition(bot, state): - return bot.vespene >= s - - return condition - - -def minerals_at_least(s): - def condition(bot, state): - return bot.minerals >= s - return condition \ No newline at end of file diff --git a/sc2/build_orders/state_conditions.py b/sc2/build_orders/state_conditions.py new file mode 100644 index 000000000..77cd18ed6 --- /dev/null +++ b/sc2/build_orders/state_conditions.py @@ -0,0 +1,38 @@ +def all_of(*args): + def condition(bot, state): + return all(map(lambda a: a(bot, state), args)) + + return condition + + +def any_of(*args): + def condition(bot, state): + return all(any(lambda a: a(bot, state), args)) + + return condition + + +def always_true(bot, state): + return True + + +def supply_is(s): + def condition(bot, state): + return bot.supply_used == s + + condition.__str__() + return condition + + +def gas_at_least(s): + def condition(bot, state): + return bot.vespene >= s + + return condition + + +def minerals_at_least(s): + def condition(bot, state): + return bot.minerals >= s + + return condition From 5c80134dd147a9f4e00b4fee3673e453c0f70272 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Fri, 26 Jan 2018 21:20:07 +0800 Subject: [PATCH 04/56] Move can_afford conditions into the actions of the build order To be concise, only the condition must be checked to decide whether the action would be done. Checking `can_afford` is the responsibility of the action. --- sc2/build_orders/build_order.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index c1c97cedc..85299469e 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -12,25 +12,26 @@ async def execute_build(self, state): if index > self.next_execution: return None - condition, intent = item - action, intended_unit = intent + condition, action = item condition = item[0] if item[0] else always_true - if condition(self.bot, state) and self.bot.can_afford(intended_unit): + if condition(self.bot, state): + print("Executing build order index {}".format(index)) self.next_execution = index + 1 + print("Next build order index {}".format(self.next_execution)) return await action(self.bot, state) def train(unit, on_building): async def train_spec(bot, state): buildings = bot.units(on_building).ready.noqueue - if buildings.exists: + if buildings.exists and bot.can_afford(unit): selected = buildings.first print("Training {}".format(unit)) return await bot.do(selected.train(unit)) else: return None - return train_spec, unit + return train_spec def build(building, around_building=None, placement=None): @@ -44,4 +45,10 @@ async def build_spec(bot, state): location = around.position.towards(bot.game_info.map_center, 5) else: location = placement + if bot.can_afford(building): + print("Building {}".format(building)) + return await bot.build(building, near=location) + else: + return None + return build_spec From 96ff76ea8c586e4d654bfcc3bf84d8e226e93e2d Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Fri, 26 Jan 2018 21:20:30 +0800 Subject: [PATCH 05/56] Add `expand` build order action --- examples/terran_build_order.py | 1 + sc2/build_orders/build_order.py | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/examples/terran_build_order.py b/examples/terran_build_order.py index afae32ac6..0904cb09c 100644 --- a/examples/terran_build_order.py +++ b/examples/terran_build_order.py @@ -20,6 +20,7 @@ def __init__(self): (all_of(supply_is(15), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), (supply_is(15), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), (supply_is(16), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (all_of(supply_is(17), minerals_at_least(400)), expand()), (supply_is(17), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), (all_of(supply_is(18), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), (all_of(supply_is(18), minerals_at_least(100)), build(UnitTypeId.SUPPLYDEPOT, around_building=first_barracks)), diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index 85299469e..e7cca69fc 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -21,6 +21,17 @@ async def execute_build(self, state): return await action(self.bot, state) +def expand(): + async def expand_spec(bot, state): + building = bot.townhalls.first.type_id + if bot.can_afford(building): + return await bot.expand_now(building=building) + else: + return None + + return expand_spec + + def train(unit, on_building): async def train_spec(bot, state): buildings = bot.units(on_building).ready.noqueue From 4ba7ac62fc4b70826a44ee4a2aea42983811da9c Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Fri, 26 Jan 2018 23:37:44 +0800 Subject: [PATCH 06/56] Wrap cwd expression in parentheses --- sc2/sc2process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sc2/sc2process.py b/sc2/sc2process.py index eb9e9c28b..6ce238b3f 100644 --- a/sc2/sc2process.py +++ b/sc2/sc2process.py @@ -78,7 +78,7 @@ def _launch(self): "-dataDir", str(Paths.BASE), "-tempDir", self._tmp_dir ], - cwd=str(Paths.CWD) if Paths.CWD else None, + cwd=(str(Paths.CWD) if Paths.CWD else None), #, env=run_config.env ) From f45d6134f821932fdbbf4200692b7f7b8bb15f15 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sat, 27 Jan 2018 02:30:53 +0800 Subject: [PATCH 07/56] Add return resource command to units --- sc2/unit.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sc2/unit.py b/sc2/unit.py index 4af6d11f0..26e9d131c 100644 --- a/sc2/unit.py +++ b/sc2/unit.py @@ -190,6 +190,9 @@ def attack(self, *args, **kwargs): def gather(self, *args, **kwargs): return self(AbilityId.HARVEST_GATHER, *args, **kwargs) + def return_resource(self, *args, **kwargs): + return self(AbilityId.HARVEST_RETURN, *args, **kwargs) + def move(self, *args, **kwargs): return self(AbilityId.MOVE, *args, **kwargs) From cb6ff9522c489c8006362dc110b1fe8531af1656 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sat, 27 Jan 2018 02:31:46 +0800 Subject: [PATCH 08/56] Initialize geysers for each step --- sc2/bot_ai.py | 1 + sc2/data.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index 7ad20792b..a6b4f71ff 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -210,6 +210,7 @@ def _prepare_step(self, state): self.units = state.units.owned self.workers = self.units(race_worker[self.race]) self.townhalls = self.units(race_townhalls[self.race]) + self.geysers = self.units(race_gas[self.race]) self.minerals = state.common.minerals self.vespene = state.common.vespene diff --git a/sc2/data.py b/sc2/data.py index 8940f2819..debe998ef 100644 --- a/sc2/data.py +++ b/sc2/data.py @@ -10,6 +10,7 @@ from .ids.unit_typeid import NEXUS from .ids.unit_typeid import COMMANDCENTER, ORBITALCOMMAND, PLANETARYFORTRESS from .ids.unit_typeid import HATCHERY, LAIR, HIVE +from .ids.unit_typeid import ASSIMILATOR, REFINERY, EXTRACTOR PlayerType = enum.Enum("PlayerType", sc_pb.PlayerType.items()) Difficulty = enum.Enum("Difficulty", sc_pb.Difficulty.items()) @@ -40,3 +41,9 @@ Race.Terran: {COMMANDCENTER, ORBITALCOMMAND, PLANETARYFORTRESS}, Race.Zerg: {HATCHERY, LAIR, HIVE} } + +race_gas = { + Race.Protoss: ASSIMILATOR, + Race.Terran: REFINERY, + Race.Zerg: EXTRACTOR +} \ No newline at end of file From 9096d220f488c2cedb6fed82369b031424b39ed7 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sat, 27 Jan 2018 02:34:42 +0800 Subject: [PATCH 09/56] Conver `expansion_locations` to a dict of Point2D: Mineral Fields This would allow easier analysis of expansion location resource density --- sc2/bot_ai.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index a6b4f71ff..d03ac754b 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -7,7 +7,7 @@ from .constants import EGG from .position import Point2, Point3 -from .data import Race, ActionResult, Attribute, race_worker, race_townhalls +from .data import Race, ActionResult, Attribute, race_worker, race_townhalls, race_gas from .unit import Unit from .cache import property_cache_forever from .game_data import AbilityData, Cost @@ -15,7 +15,11 @@ from .ids.ability_id import AbilityId from .ids.upgrade_id import UpgradeId + class BotAI(object): + + EXPANSION_GAP_THRESHOLD = 15 + def _prepare_start(self, client, player_id, game_info, game_data): self._client = client self._game_info = game_info @@ -43,9 +47,9 @@ def known_enemy_structures(self): @property @property_cache_forever def expansion_locations(self): - DISTANCE_THRESHOLD = 8.0 # Tried with Abyssal Reef LE, this was fine + RESOURCE_SPREAD_THRESHOLD = 8.0 # Tried with Abyssal Reef LE, this was fine resources = [ - r.position.to2 + r for r in self.state.mineral_field | self.state.vespene_geyser ] @@ -53,7 +57,7 @@ def expansion_locations(self): r_groups = [] for mf in resources: for g in r_groups: - if any(mf.distance_to(p) < DISTANCE_THRESHOLD for p in g): + if any(mf.position.to2.distance_to(p) < RESOURCE_SPREAD_THRESHOLD for p in g): g.add(mf) break else: # not found @@ -64,10 +68,10 @@ def expansion_locations(self): # Find centers avg = lambda l: sum(l) / len(l) - centers = [Point2(tuple(map(avg, zip(*g)))) for g in r_groups] + pos = lambda u: u.position.to2 + centers = {Point2(tuple(map(avg, zip(*map(pos,g))))).rounded: g for g in r_groups} - # Not always accurate, but good enought for now. - return [c.rounded for c in centers] + return centers async def expand_now(self, building=None, max_distance=10): if not building: @@ -80,11 +84,10 @@ async def expand_now(self, building=None, max_distance=10): placement_step=1) async def get_next_expansion(self): - DISTANCE_THRESHOLD = 15.0 closest = None distance = float("inf") for el in self.expansion_locations: - def is_near_to_expansion(t): return t.position.distance_to(el) < DISTANCE_THRESHOLD + def is_near_to_expansion(t): return t.position.distance_to(el) < self.EXPANSION_GAP_THRESHOLD if any([t for t in map(is_near_to_expansion, self.townhalls)]): # already taken continue From 2fd008b45bd6d3220908ea511b72f920cee52b16 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sat, 27 Jan 2018 02:35:40 +0800 Subject: [PATCH 10/56] Implement distribution of workers Gas would be prioritized over minerals when allocating excess workers. --- sc2/bot_ai.py | 66 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index d03ac754b..c8d2584bb 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -73,13 +73,15 @@ def expansion_locations(self): return centers - async def expand_now(self, building=None, max_distance=10): + async def expand_now(self, building=None, max_distance=10, location=None): if not building: building = self.townhalls.first.type_id assert isinstance(building, UnitTypeId) - location = await self.get_next_expansion() + if not location: + location = await self.get_next_expansion() + await self.build(building, near=location, max_distance=max_distance, random_alternative=False, placement_step=1) @@ -103,6 +105,66 @@ def is_near_to_expansion(t): return t.position.distance_to(el) < self.EXPANSION_ return closest + async def distribute_workers(self): + expansion_locations = self.expansion_locations + owned_expansions = self.get_owned_expansions() + worker_pool = [] + for location, townhall in owned_expansions.items(): + workers = self.workers.closer_than(20, location) + actual = townhall.assigned_harvesters + ideal = townhall.ideal_harvesters + excess = actual-ideal + if actual > ideal: + worker_pool.extend(workers.random_group_of(min(excess, len(workers)))) + continue + for g in self.geysers: + workers = self.workers.closer_than(5, g) + actual = g.assigned_harvesters + ideal = g.ideal_harvesters + excess = actual - ideal + if actual > ideal: + worker_pool.extend(workers.random_group_of(min(excess, len(workers)))) + continue + + for g in self.geysers: + actual = g.assigned_harvesters + ideal = g.ideal_harvesters + deficit = ideal - actual + + for x in range(0, deficit): + if worker_pool: + w = worker_pool.pop() + if len(w.orders) == 1 and w.orders[0].ability.id in [AbilityId.HARVEST_RETURN]: + await self.do(w.move(g)) + await self.do(w.return_resource(queue=True)) + else: + await self.do(w.gather(g)) + + for location, townhall in owned_expansions.items(): + actual = townhall.assigned_harvesters + ideal = townhall.ideal_harvesters + + deficit = ideal - actual + for x in range(0, deficit): + if worker_pool: + w = worker_pool.pop() + mf = next(iter(filter(lambda r: r.type_id in [UnitTypeId.MINERALFIELD750, UnitTypeId.MINERALFIELD], + expansion_locations[location]))) + if len(w.orders) == 1 and w.orders[0].ability.id in [AbilityId.HARVEST_RETURN]: + await self.do(w.move(mf)) + await self.do(w.return_resource(queue=True)) + else: + await self.do(w.gather(mf)) + + def get_owned_expansions(self): + owned_expansions = {} + for el in self.expansion_locations: + def is_near_to_expansion(t): return t.position.distance_to(el) < self.EXPANSION_GAP_THRESHOLD + th = next((x for x in self.townhalls if is_near_to_expansion(x)), None) + if th: + owned_expansions[el] = th + + return owned_expansions def can_afford(self, item_id): if isinstance(item_id, UnitTypeId): From 79655e09a3afbee0e229d08ea4e2a5fddd90804d Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sat, 27 Jan 2018 02:37:08 +0800 Subject: [PATCH 11/56] Add sample script to showcase worker distribution in action --- examples/distributed_workers.py | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 examples/distributed_workers.py diff --git a/examples/distributed_workers.py b/examples/distributed_workers.py new file mode 100644 index 000000000..db1c6b132 --- /dev/null +++ b/examples/distributed_workers.py @@ -0,0 +1,35 @@ +import sc2 +from sc2 import run_game, maps, Race, Difficulty +from sc2.player import Bot, Computer +from sc2.constants import * + + +class TerranBot(sc2.BotAI): + async def on_step(self, state, iteration): + await self.distribute_workers() + await self.build_supply(state) + await self.build_workers(state) + await self.expand(state) + + async def build_workers(self, state): + for cc in self.units(UnitTypeId.COMMANDCENTER).ready.noqueue: + if self.can_afford(UnitTypeId.SCV): + await self.do(cc.train(UnitTypeId.SCV)) + + async def expand(self, state): + if self.units(UnitTypeId.COMMANDCENTER).amount < 3 and self.can_afford(UnitTypeId.COMMANDCENTER): + await self.expand_now() + + async def build_supply(self, state): + cc = self.units(UnitTypeId.COMMANDCENTER).ready.first + if self.supply_left < 4 and not self.already_pending(UnitTypeId.SUPPLYDEPOT): + if self.can_afford(UnitTypeId.SUPPLYDEPOT): + await self.build(UnitTypeId.SUPPLYDEPOT, near=cc.position.towards(self.game_info.map_center, 5)) + for scv in self.units(UnitTypeId.SCV).idle: + await self.do(scv.gather(self.state.mineral_field.closest_to(cc))) + + +run_game(maps.get("Abyssal Reef LE"), [ + Bot(Race.Terran, TerranBot()), + Computer(Race.Protoss, Difficulty.Medium) +], realtime=True) From 2ecb34bbda3354f6c7eec0fd81885e6a34081701 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sat, 27 Jan 2018 10:33:31 +0800 Subject: [PATCH 12/56] Change `BotAI.already_pending` to return integers to allow counting This relies on Python's falsy/truthy treatment of integers. --- sc2/bot_ai.py | 8 ++++---- sc2/build_orders/state_conditions.py | 9 +++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index 7ad20792b..d14555437 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -165,12 +165,12 @@ async def find_placement(self, building, near, max_distance=20, random_alternati def already_pending(self, unit_type): ability = self._game_data.units[unit_type.value].creation_ability if self.units(unit_type).not_ready.exists: - return True + return len(self.units(unit_type).not_ready) elif any(o.ability == ability for w in self.workers for o in w.orders): - return True + return sum([o.ability == ability for w in self.workers for o in w.orders]) elif any(egg.orders[0].ability == ability for egg in self.units(EGG)): - return True - return False + return sum([egg.orders[0].ability == ability for egg in self.units(EGG)]) + return 0 async def build(self, building, near, max_distance=20, unit=None, random_alternative=True, placement_step=2): if isinstance(near, Unit): diff --git a/sc2/build_orders/state_conditions.py b/sc2/build_orders/state_conditions.py index 77cd18ed6..c016b5f53 100644 --- a/sc2/build_orders/state_conditions.py +++ b/sc2/build_orders/state_conditions.py @@ -36,3 +36,12 @@ def condition(bot, state): return bot.minerals >= s return condition + + +def unit_count(building, n, include_pending=False): + def condition(bot,state): + actual_amount = bot.units(building).amount + if include_pending: + actual_amount += bot.already_pending(building) + return actual_amount == n + return condition \ No newline at end of file From f01042e390ad0948cabb6b55a5f5050a04849bf2 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sat, 27 Jan 2018 10:34:27 +0800 Subject: [PATCH 13/56] Add support for morhping instead of training for Zerg --- sc2/build_orders/build_order.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index e7cca69fc..b496acf1e 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -1,4 +1,5 @@ from sc2.build_orders.state_conditions import always_true +from sc2.ids.unit_typeid import UnitTypeId class BuildOrder(object): @@ -44,6 +45,18 @@ async def train_spec(bot, state): return train_spec +def morph(unit): + async def train_spec(bot, state): + larvae = bot.units(UnitTypeId.LARVA) + if larvae.exists and bot.can_afford(unit): + selected = larvae.first + print("Morph {}".format(unit)) + return await bot.do(selected.train(unit)) + else: + return None + + return train_spec + def build(building, around_building=None, placement=None): async def build_spec(bot, state): From e68e6868e7a111c82b4e3070db6337e07faf1e8e Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sat, 27 Jan 2018 12:37:25 +0800 Subject: [PATCH 14/56] rename unit_count arguments --- sc2/build_orders/state_conditions.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sc2/build_orders/state_conditions.py b/sc2/build_orders/state_conditions.py index c016b5f53..e0bfb082b 100644 --- a/sc2/build_orders/state_conditions.py +++ b/sc2/build_orders/state_conditions.py @@ -38,10 +38,10 @@ def condition(bot, state): return condition -def unit_count(building, n, include_pending=False): +def unit_count(unit, n, include_pending=False): def condition(bot,state): - actual_amount = bot.units(building).amount + actual_amount = bot.units(unit).amount if include_pending: - actual_amount += bot.already_pending(building) + actual_amount += bot.already_pending(unit) return actual_amount == n - return condition \ No newline at end of file + return condition From 63505dfcdf4163109edab2dbd8a85f6ec066c9c7 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sat, 27 Jan 2018 12:42:33 +0800 Subject: [PATCH 15/56] Introduce Intent class and make worker creation a parameter This would simplify the build order declaration by instead declaring how many workers is desired. This works under the assumption that in the early game, the bot needs to keep making workers. --- examples/terran_build_order.py | 26 +++++----- examples/zerg_rush_build_order.py | 78 ++++++++++++++++++++++++++++ sc2/build_orders/build_order.py | 61 +++++++++++++++------- sc2/build_orders/state_conditions.py | 5 +- 4 files changed, 135 insertions(+), 35 deletions(-) create mode 100644 examples/zerg_rush_build_order.py diff --git a/examples/terran_build_order.py b/examples/terran_build_order.py index 0904cb09c..cbc2dc73e 100644 --- a/examples/terran_build_order.py +++ b/examples/terran_build_order.py @@ -3,7 +3,7 @@ from sc2.build_orders.build_order import BuildOrder, train, build, expand from sc2.player import Bot, Computer from sc2.constants import * -from sc2.build_orders.state_conditions import all_of, supply_is, minerals_at_least +from sc2.build_orders.state_conditions import all_of, supply_at_least, minerals_at_least def first_barracks(bot, state): @@ -13,18 +13,18 @@ def first_barracks(bot, state): class TerranBuildOrderBot(sc2.BotAI): def __init__(self): build_order = [ - (supply_is(12), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (all_of(supply_is(13), minerals_at_least(100)), build(UnitTypeId.SUPPLYDEPOT)), - (supply_is(13), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (supply_is(14), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (all_of(supply_is(15), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), - (supply_is(15), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (supply_is(16), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (all_of(supply_is(17), minerals_at_least(400)), expand()), - (supply_is(17), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (all_of(supply_is(18), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), - (all_of(supply_is(18), minerals_at_least(100)), build(UnitTypeId.SUPPLYDEPOT, around_building=first_barracks)), - (supply_is(18), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (supply_at_least(12), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (all_of(supply_at_least(13), minerals_at_least(100)), build(UnitTypeId.SUPPLYDEPOT)), + (supply_at_least(13), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (supply_at_least(14), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (all_of(supply_at_least(15), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), + (supply_at_least(15), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (supply_at_least(16), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (all_of(supply_at_least(17), minerals_at_least(400)), expand()), + (supply_at_least(17), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), + (all_of(supply_at_least(18), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), + (all_of(supply_at_least(18), minerals_at_least(100)), build(UnitTypeId.SUPPLYDEPOT, around_building=first_barracks)), + (supply_at_least(18), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), ] self.build_order = BuildOrder(self, build_order) diff --git a/examples/zerg_rush_build_order.py b/examples/zerg_rush_build_order.py new file mode 100644 index 000000000..3c39adb0d --- /dev/null +++ b/examples/zerg_rush_build_order.py @@ -0,0 +1,78 @@ +import random + +import sc2 +from sc2 import Race, Difficulty +from sc2.build_orders.build_order import train, expand, build, BuildOrder, morph, Intent +from sc2.build_orders.state_conditions import supply_at_least, all_of, minerals_at_least, unit_count +from sc2.constants import * +from sc2.player import Bot, Computer + +def add_gas(): + async def add_gas_spec(bot, state): + for th in bot.townhalls: + for nexus in bot.units(th.type_id).ready: + vgs = state.vespene_geyser.closer_than(20.0, nexus) + for vg in vgs: + if not bot.can_afford(UnitTypeId.EXTRACTOR): + break + + worker = bot.select_build_worker(vg.position) + if worker is None: + break + + if not bot.units(UnitTypeId.EXTRACTOR).closer_than(1.0, vg).exists: + return await bot.do(worker.build(UnitTypeId.EXTRACTOR, vg)) + return sc2.ActionResult.Error + return Intent(add_gas_spec) + +def research(building, upgrade): + async def research_spec(bot,state): + sp = bot.units(building).ready + if sp.exists and bot.can_afford(upgrade) and not bot.already_pending(upgrade): + await bot.do(sp.first(upgrade)) + + return research_spec + +class ZergRushBot(sc2.BotAI): + + def __init__(self): + self.attack = False + build_order = [ + (all_of(supply_at_least(13), unit_count(UnitTypeId.OVERLORD, 1, include_pending=True)), morph(UnitTypeId.OVERLORD)), + (all_of(supply_at_least(17), unit_count(UnitTypeId.EXTRACTOR, 0, include_pending=True)), add_gas()), + (all_of(supply_at_least(17), unit_count(UnitTypeId.SPAWNINGPOOL, 0, include_pending=True)), build(UnitTypeId.SPAWNINGPOOL)), + (all_of(supply_at_least(17), unit_count(UnitTypeId.HATCHERY, 1, include_pending=True)), expand()), + (supply_at_least(18), morph(UnitTypeId.ZERGLING)), + (supply_at_least(19), train(UnitTypeId.QUEEN, on_building=UnitTypeId.HATCHERY)), + (all_of(supply_at_least(21), unit_count(UnitTypeId.OVERLORD, 2, include_pending=True)), morph(UnitTypeId.OVERLORD)), + (all_of(supply_at_least(21), unit_count(UnitTypeId.ROACHWARREN, 0, include_pending=True)), build(UnitTypeId.ROACHWARREN)), + (all_of(supply_at_least(20), unit_count(UnitTypeId.OVERLORD, 3, include_pending=True)), morph(UnitTypeId.OVERLORD)), + (unit_count(UnitTypeId.ROACH, 0, include_pending=True), morph(UnitTypeId.ROACH)), + (unit_count(UnitTypeId.ROACH, 1, include_pending=True), morph(UnitTypeId.ROACH)), + (unit_count(UnitTypeId.ROACH, 2, include_pending=True), morph(UnitTypeId.ROACH)), + (unit_count(UnitTypeId.ROACH, 3, include_pending=True), morph(UnitTypeId.ROACH)), + (unit_count(UnitTypeId.ROACH, 4, include_pending=True), morph(UnitTypeId.ROACH)), + (unit_count(UnitTypeId.ROACH, 5, include_pending=True), morph(UnitTypeId.ROACH)), + (unit_count(UnitTypeId.ROACH, 6, include_pending=True), morph(UnitTypeId.ROACH)), + (None, morph(UnitTypeId.ZERGLING).keep_going()) + ] + + self.build_order = BuildOrder(self, build_order, worker_count=35) + + async def on_step(self, state, iteration): + # await self.distribute_workers() + await self.build_order.execute_build(state) + if self.units(UnitTypeId.ROACH).amount >= 7 or self.attack: + self.attack = True + for unit in self.units(UnitTypeId.ZERGLING) | self.units(UnitTypeId.ROACH): + await self.do(unit.attack(self.enemy_start_locations[0])) + return + +def main(): + sc2.run_game(sc2.maps.get("Abyssal Reef LE"), [ + Bot(Race.Zerg, ZergRushBot()), + Computer(Race.Terran, Difficulty.Medium) + ], realtime=True) + +if __name__ == '__main__': + main() diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index b496acf1e..986e0bbd9 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -1,25 +1,48 @@ +from sc2 import Race, race_worker, ActionResult from sc2.build_orders.state_conditions import always_true from sc2.ids.unit_typeid import UnitTypeId +class Intent(object): + def __init__(self, action): + self.action = action + self.done = False + + async def execute(self, bot, state): + e = await self.action(bot, state) + if not e: #success + self.done = True + + return e + + @property + def is_done(self): + return self.done + class BuildOrder(object): - def __init__(self, bot, build): + def __init__(self, bot, build, worker_count=0): self.build = build self.bot = bot - self.next_execution = 0 + self.worker_count = worker_count async def execute_build(self, state): for index, item in enumerate(self.build): - if index > self.next_execution: - return None - - condition, action = item + condition, intent = item condition = item[0] if item[0] else always_true - if condition(self.bot, state): - print("Executing build order index {}".format(index)) - self.next_execution = index + 1 - print("Next build order index {}".format(self.next_execution)) - return await action(self.bot, state) + if condition(self.bot, state) and not intent.is_done: + e = await intent.execute(self.bot, state) + if intent.is_done: + return e + else: + continue + + if self.bot.workers.amount < self.worker_count: + if self.bot.race == Race.Zerg: + return await morph(race_worker[Race.Zerg]).execute(self.bot, state) + else: + return await train(race_worker[self.bot.race], self.bot.townhalls.ready.random.type_id).execute(self.bot, + state) + return None def expand(): @@ -28,9 +51,9 @@ async def expand_spec(bot, state): if bot.can_afford(building): return await bot.expand_now(building=building) else: - return None + return ActionResult.Error - return expand_spec + return Intent(expand_spec) def train(unit, on_building): @@ -41,9 +64,9 @@ async def train_spec(bot, state): print("Training {}".format(unit)) return await bot.do(selected.train(unit)) else: - return None + return ActionResult.Error - return train_spec + return Intent(train_spec) def morph(unit): async def train_spec(bot, state): @@ -53,9 +76,9 @@ async def train_spec(bot, state): print("Morph {}".format(unit)) return await bot.do(selected.train(unit)) else: - return None + return ActionResult.Error - return train_spec + return Intent(train_spec) def build(building, around_building=None, placement=None): @@ -73,6 +96,6 @@ async def build_spec(bot, state): print("Building {}".format(building)) return await bot.build(building, near=location) else: - return None + return ActionResult.Error - return build_spec + return Intent(build_spec) diff --git a/sc2/build_orders/state_conditions.py b/sc2/build_orders/state_conditions.py index e0bfb082b..760bbd969 100644 --- a/sc2/build_orders/state_conditions.py +++ b/sc2/build_orders/state_conditions.py @@ -16,11 +16,10 @@ def always_true(bot, state): return True -def supply_is(s): +def supply_at_least(s): def condition(bot, state): - return bot.supply_used == s + return bot.supply_used >= s - condition.__str__() return condition From 156fcad5d25e1ea522f5391cc4a23a3e7ee260f8 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sat, 27 Jan 2018 12:52:52 +0800 Subject: [PATCH 16/56] Allow build order actions to be executed indefinitely as long as it's possible --- sc2/build_orders/build_order.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index 986e0bbd9..d860bafb4 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -6,14 +6,19 @@ class Intent(object): def __init__(self, action): self.action = action self.done = False + self.infinite = False async def execute(self, bot, state): e = await self.action(bot, state) - if not e: #success + if not e and not self.infinite: self.done = True return e + def keep_going(self): + self.infinite = True + return self + @property def is_done(self): return self.done From f69a91dfde5b842e2ccd08923ce160effaead104 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 11:24:29 +0800 Subject: [PATCH 17/56] Add supply, geyser, townhall, and worker type properties to BotAI --- sc2/bot_ai.py | 13 ++++++++++--- sc2/data.py | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index d14555437..1baa846e2 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -7,7 +7,8 @@ from .constants import EGG from .position import Point2, Point3 -from .data import Race, ActionResult, Attribute, race_worker, race_townhalls +from .data import Race, ActionResult, Attribute, race_worker, race_townhalls, race_gas, race_supply, \ + race_basic_townhalls from .unit import Unit from .cache import property_cache_forever from .game_data import AbilityData, Cost @@ -24,6 +25,11 @@ def _prepare_start(self, client, player_id, game_info, game_data): self.player_id = player_id self.race = Race(self._game_info.player_races[self.player_id]) + self.worker_type = race_worker[self.race] + self.basic_townhall_type = race_basic_townhalls[self.race] + self.geyser_type = race_gas[self.race] + self.supply_type = race_supply[self.race] + @property def game_info(self): return self._game_info @@ -71,7 +77,7 @@ def expansion_locations(self): async def expand_now(self, building=None, max_distance=10): if not building: - building = self.townhalls.first.type_id + building = self.basic_townhall_type assert isinstance(building, UnitTypeId) @@ -208,8 +214,9 @@ async def chat_send(self, message): def _prepare_step(self, state): self.state = state self.units = state.units.owned - self.workers = self.units(race_worker[self.race]) + self.workers = self.units(self.worker_type) self.townhalls = self.units(race_townhalls[self.race]) + self.geysers = self.units(self.geyser_type) self.minerals = state.common.minerals self.vespene = state.common.vespene diff --git a/sc2/data.py b/sc2/data.py index 8940f2819..5d41cc936 100644 --- a/sc2/data.py +++ b/sc2/data.py @@ -10,6 +10,8 @@ from .ids.unit_typeid import NEXUS from .ids.unit_typeid import COMMANDCENTER, ORBITALCOMMAND, PLANETARYFORTRESS from .ids.unit_typeid import HATCHERY, LAIR, HIVE +from .ids.unit_typeid import ASSIMILATOR, REFINERY, EXTRACTOR +from .ids.unit_typeid import PYLON, SUPPLYDEPOT, OVERLORD PlayerType = enum.Enum("PlayerType", sc_pb.PlayerType.items()) Difficulty = enum.Enum("Difficulty", sc_pb.Difficulty.items()) @@ -28,6 +30,11 @@ ActionResult = enum.Enum("ActionResult", error_pb.ActionResult.items()) +race_supply = { + Race.Protoss: PYLON, + Race.Terran: SUPPLYDEPOT, + Race.Zerg: OVERLORD +} race_worker = { Race.Protoss: PROBE, @@ -35,8 +42,20 @@ Race.Zerg: DRONE } +race_basic_townhalls = { + Race.Protoss: NEXUS, + Race.Terran: COMMANDCENTER, + Race.Zerg: HATCHERY +} + race_townhalls = { Race.Protoss: {NEXUS}, Race.Terran: {COMMANDCENTER, ORBITALCOMMAND, PLANETARYFORTRESS}, Race.Zerg: {HATCHERY, LAIR, HIVE} } + +race_gas = { + Race.Protoss: ASSIMILATOR, + Race.Terran: REFINERY, + Race.Zerg: EXTRACTOR +} \ No newline at end of file From 3c1beec596e4f361977867e7dc3fccb10baaf933 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 11:25:42 +0800 Subject: [PATCH 18/56] Move state conditions into separate submodule --- examples/terran_build_order.py | 4 +-- examples/zerg_rush_build_order.py | 25 +++---------------- sc2/build_orders/build_order.py | 5 ++-- sc2/state_conditions/__init__.py | 0 .../conditions.py} | 0 5 files changed, 8 insertions(+), 26 deletions(-) create mode 100644 sc2/state_conditions/__init__.py rename sc2/{build_orders/state_conditions.py => state_conditions/conditions.py} (100%) diff --git a/examples/terran_build_order.py b/examples/terran_build_order.py index cbc2dc73e..0cfa61faf 100644 --- a/examples/terran_build_order.py +++ b/examples/terran_build_order.py @@ -1,9 +1,9 @@ import sc2 from sc2 import run_game, maps, Race, Difficulty from sc2.build_orders.build_order import BuildOrder, train, build, expand -from sc2.player import Bot, Computer from sc2.constants import * -from sc2.build_orders.state_conditions import all_of, supply_at_least, minerals_at_least +from sc2.player import Bot, Computer +from sc2.state_conditions.conditions import all_of, supply_at_least, minerals_at_least def first_barracks(bot, state): diff --git a/examples/zerg_rush_build_order.py b/examples/zerg_rush_build_order.py index 3c39adb0d..5b13ef1a8 100644 --- a/examples/zerg_rush_build_order.py +++ b/examples/zerg_rush_build_order.py @@ -1,29 +1,10 @@ -import random - import sc2 from sc2 import Race, Difficulty -from sc2.build_orders.build_order import train, expand, build, BuildOrder, morph, Intent -from sc2.build_orders.state_conditions import supply_at_least, all_of, minerals_at_least, unit_count +from sc2.build_orders.build_order import train, expand, build, BuildOrder, morph, add_gas from sc2.constants import * from sc2.player import Bot, Computer +from sc2.state_conditions.conditions import supply_at_least, all_of, unit_count -def add_gas(): - async def add_gas_spec(bot, state): - for th in bot.townhalls: - for nexus in bot.units(th.type_id).ready: - vgs = state.vespene_geyser.closer_than(20.0, nexus) - for vg in vgs: - if not bot.can_afford(UnitTypeId.EXTRACTOR): - break - - worker = bot.select_build_worker(vg.position) - if worker is None: - break - - if not bot.units(UnitTypeId.EXTRACTOR).closer_than(1.0, vg).exists: - return await bot.do(worker.build(UnitTypeId.EXTRACTOR, vg)) - return sc2.ActionResult.Error - return Intent(add_gas_spec) def research(building, upgrade): async def research_spec(bot,state): @@ -54,7 +35,7 @@ def __init__(self): (unit_count(UnitTypeId.ROACH, 4, include_pending=True), morph(UnitTypeId.ROACH)), (unit_count(UnitTypeId.ROACH, 5, include_pending=True), morph(UnitTypeId.ROACH)), (unit_count(UnitTypeId.ROACH, 6, include_pending=True), morph(UnitTypeId.ROACH)), - (None, morph(UnitTypeId.ZERGLING).keep_going()) + (unit_count(UnitTypeId.SPAWNINGPOOL, 1), morph(UnitTypeId.ZERGLING).keep_going()) ] self.build_order = BuildOrder(self, build_order, worker_count=35) diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index d860bafb4..d10232136 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -1,6 +1,7 @@ -from sc2 import Race, race_worker, ActionResult -from sc2.build_orders.state_conditions import always_true +from sc2 import Race, race_worker, ActionResult, race_townhalls from sc2.ids.unit_typeid import UnitTypeId +from sc2.state_conditions.conditions import always_true + class Intent(object): def __init__(self, action): diff --git a/sc2/state_conditions/__init__.py b/sc2/state_conditions/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sc2/build_orders/state_conditions.py b/sc2/state_conditions/conditions.py similarity index 100% rename from sc2/build_orders/state_conditions.py rename to sc2/state_conditions/conditions.py From c05f930e06d10603ce668a4e5b934ed66e67505c Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 11:26:21 +0800 Subject: [PATCH 19/56] Add auto-add-supply feature to build order --- sc2/build_orders/build_order.py | 60 ++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index d10232136..ee891f24a 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -26,34 +26,42 @@ def is_done(self): class BuildOrder(object): - def __init__(self, bot, build, worker_count=0): + def __init__(self, bot, build, worker_count=0, auto_add_supply=True): self.build = build self.bot = bot self.worker_count = worker_count + self.auto_add_supply = auto_add_supply async def execute_build(self, state): + bot = self.bot + if bot.supply_left <= (bot.supply_cap / 50) and not bot.already_pending(bot.supply_type)\ + and self.auto_add_supply: + return await add_supply().execute(bot, state) + for index, item in enumerate(self.build): condition, intent = item condition = item[0] if item[0] else always_true - if condition(self.bot, state) and not intent.is_done: - e = await intent.execute(self.bot, state) + if condition(bot, state) and not intent.is_done: + e = await intent.execute(bot, state) if intent.is_done: return e else: + if e == ActionResult.NotEnoughFood and self.auto_add_supply \ + and not bot.already_pending(bot.supply_type): + return await add_supply().execute(bot, state) continue - if self.bot.workers.amount < self.worker_count: - if self.bot.race == Race.Zerg: - return await morph(race_worker[Race.Zerg]).execute(self.bot, state) + if bot.workers.amount < self.worker_count: + if bot.race == Race.Zerg: + return await morph(race_worker[Race.Zerg]).execute(bot, state) else: - return await train(race_worker[self.bot.race], self.bot.townhalls.ready.random.type_id).execute(self.bot, - state) + return await train(race_worker[bot.race], race_townhalls[self.bot.race]).execute(bot, state) return None def expand(): async def expand_spec(bot, state): - building = bot.townhalls.first.type_id + building = bot.basic_townhall_type if bot.can_afford(building): return await bot.expand_now(building=building) else: @@ -74,6 +82,7 @@ async def train_spec(bot, state): return Intent(train_spec) + def morph(unit): async def train_spec(bot, state): larvae = bot.units(UnitTypeId.LARVA) @@ -105,3 +114,36 @@ async def build_spec(bot, state): return ActionResult.Error return Intent(build_spec) + + +def add_supply(): + async def supply_spec(bot, state): + if bot.can_afford(bot.supply_type): + if bot.race == Race.Zerg: + return await morph(bot.supply_type).execute(bot, state) + else: + return await build(bot.supply_type).execute(bot, state) + else: + return ActionResult.Error + + return Intent(supply_spec) + + +def add_gas(): + async def add_gas_spec(bot, state): + for th in bot.townhalls: + for nexus in bot.units(th.type_id).ready: + vgs = state.vespene_geyser.closer_than(20.0, nexus) + for vg in vgs: + if not bot.can_afford(UnitTypeId.EXTRACTOR): + break + + worker = bot.select_build_worker(vg.position) + if worker is None: + break + + if not bot.units(UnitTypeId.EXTRACTOR).closer_than(1.0, vg).exists: + return await bot.do(worker.build(UnitTypeId.EXTRACTOR, vg)) + return ActionResult.Error + + return Intent(add_gas_spec) From 78cf3890111d8b4739d22aa1c3d5369f3103bc67 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 11:33:27 +0800 Subject: [PATCH 20/56] Partial fix for #8 - already_pending returns count instead of boolean --- sc2/bot_ai.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index 7ad20792b..2383d1e06 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -165,12 +165,12 @@ async def find_placement(self, building, near, max_distance=20, random_alternati def already_pending(self, unit_type): ability = self._game_data.units[unit_type.value].creation_ability if self.units(unit_type).not_ready.exists: - return True + return len(self.units(unit_type).not_ready) elif any(o.ability == ability for w in self.workers for o in w.orders): - return True + return sum([o.ability == ability for w in self.workers for o in w.orders]) elif any(egg.orders[0].ability == ability for egg in self.units(EGG)): - return True - return False + return sum([egg.orders[0].ability == ability for egg in self.units(EGG)]) + return async def build(self, building, near, max_distance=20, unit=None, random_alternative=True, placement_step=2): if isinstance(near, Unit): From a919b05c938a9395ffcf74d323ed541bb8ffd27b Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 12:17:23 +0800 Subject: [PATCH 21/56] Move commands into a different submodule for clear separation. The commands are not coupled with the build order anyway. Fixes #7 --- examples/terran_build_order.py | 3 +- examples/zerg_rush_build_order.py | 3 +- sc2/build_orders/build_order.py | 116 +----------------------------- sc2/build_orders/commands.py | 114 +++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 116 deletions(-) create mode 100644 sc2/build_orders/commands.py diff --git a/examples/terran_build_order.py b/examples/terran_build_order.py index 0cfa61faf..1119d4f36 100644 --- a/examples/terran_build_order.py +++ b/examples/terran_build_order.py @@ -1,6 +1,7 @@ import sc2 from sc2 import run_game, maps, Race, Difficulty -from sc2.build_orders.build_order import BuildOrder, train, build, expand +from sc2.build_orders.build_order import BuildOrder, train +from sc2.build_orders.commands import build, expand from sc2.constants import * from sc2.player import Bot, Computer from sc2.state_conditions.conditions import all_of, supply_at_least, minerals_at_least diff --git a/examples/zerg_rush_build_order.py b/examples/zerg_rush_build_order.py index 5b13ef1a8..d08c816e8 100644 --- a/examples/zerg_rush_build_order.py +++ b/examples/zerg_rush_build_order.py @@ -1,6 +1,7 @@ import sc2 from sc2 import Race, Difficulty -from sc2.build_orders.build_order import train, expand, build, BuildOrder, morph, add_gas +from sc2.build_orders.build_order import train, BuildOrder, morph +from sc2.build_orders.commands import add_gas, build, expand from sc2.constants import * from sc2.player import Bot, Computer from sc2.state_conditions.conditions import supply_at_least, all_of, unit_count diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index ee891f24a..e97ce169d 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -1,30 +1,8 @@ from sc2 import Race, race_worker, ActionResult, race_townhalls -from sc2.ids.unit_typeid import UnitTypeId +from sc2.build_orders.commands import add_supply, morph, train from sc2.state_conditions.conditions import always_true -class Intent(object): - def __init__(self, action): - self.action = action - self.done = False - self.infinite = False - - async def execute(self, bot, state): - e = await self.action(bot, state) - if not e and not self.infinite: - self.done = True - - return e - - def keep_going(self): - self.infinite = True - return self - - @property - def is_done(self): - return self.done - - class BuildOrder(object): def __init__(self, bot, build, worker_count=0, auto_add_supply=True): self.build = build @@ -34,7 +12,7 @@ def __init__(self, bot, build, worker_count=0, auto_add_supply=True): async def execute_build(self, state): bot = self.bot - if bot.supply_left <= (bot.supply_cap / 50) and not bot.already_pending(bot.supply_type)\ + if bot.supply_left <= (bot.supply_cap / 50) and not bot.already_pending(bot.supply_type) \ and self.auto_add_supply: return await add_supply().execute(bot, state) @@ -57,93 +35,3 @@ async def execute_build(self, state): else: return await train(race_worker[bot.race], race_townhalls[self.bot.race]).execute(bot, state) return None - - -def expand(): - async def expand_spec(bot, state): - building = bot.basic_townhall_type - if bot.can_afford(building): - return await bot.expand_now(building=building) - else: - return ActionResult.Error - - return Intent(expand_spec) - - -def train(unit, on_building): - async def train_spec(bot, state): - buildings = bot.units(on_building).ready.noqueue - if buildings.exists and bot.can_afford(unit): - selected = buildings.first - print("Training {}".format(unit)) - return await bot.do(selected.train(unit)) - else: - return ActionResult.Error - - return Intent(train_spec) - - -def morph(unit): - async def train_spec(bot, state): - larvae = bot.units(UnitTypeId.LARVA) - if larvae.exists and bot.can_afford(unit): - selected = larvae.first - print("Morph {}".format(unit)) - return await bot.do(selected.train(unit)) - else: - return ActionResult.Error - - return Intent(train_spec) - - -def build(building, around_building=None, placement=None): - async def build_spec(bot, state): - if not around_building: - around = bot.townhalls.first - else: - around = around_building(bot, state) - - if not placement: - location = around.position.towards(bot.game_info.map_center, 5) - else: - location = placement - if bot.can_afford(building): - print("Building {}".format(building)) - return await bot.build(building, near=location) - else: - return ActionResult.Error - - return Intent(build_spec) - - -def add_supply(): - async def supply_spec(bot, state): - if bot.can_afford(bot.supply_type): - if bot.race == Race.Zerg: - return await morph(bot.supply_type).execute(bot, state) - else: - return await build(bot.supply_type).execute(bot, state) - else: - return ActionResult.Error - - return Intent(supply_spec) - - -def add_gas(): - async def add_gas_spec(bot, state): - for th in bot.townhalls: - for nexus in bot.units(th.type_id).ready: - vgs = state.vespene_geyser.closer_than(20.0, nexus) - for vg in vgs: - if not bot.can_afford(UnitTypeId.EXTRACTOR): - break - - worker = bot.select_build_worker(vg.position) - if worker is None: - break - - if not bot.units(UnitTypeId.EXTRACTOR).closer_than(1.0, vg).exists: - return await bot.do(worker.build(UnitTypeId.EXTRACTOR, vg)) - return ActionResult.Error - - return Intent(add_gas_spec) diff --git a/sc2/build_orders/commands.py b/sc2/build_orders/commands.py new file mode 100644 index 000000000..af1280efc --- /dev/null +++ b/sc2/build_orders/commands.py @@ -0,0 +1,114 @@ +from sc2 import ActionResult, Race +from sc2.constants import * + + +class Command(object): + def __init__(self, action): + self.action = action + self.done = False + self.infinite = False + + async def execute(self, bot, state): + e = await self.action(bot, state) + if not e and not self.infinite: + self.done = True + + return e + + def keep_going(self): + self.infinite = True + return self + + @property + def is_done(self): + return self.done + + +def expand(): + async def expand_spec(bot, state): + building = bot.basic_townhall_type + if bot.can_afford(building): + return await bot.expand_now(building=building) + else: + return ActionResult.Error + + return Command(expand_spec) + + +def train(unit, on_building): + async def train_spec(bot, state): + buildings = bot.units(on_building).ready.noqueue + if buildings.exists and bot.can_afford(unit): + selected = buildings.first + print("Training {}".format(unit)) + return await bot.do(selected.train(unit)) + else: + return ActionResult.Error + + return Command(train_spec) + + +def morph(unit): + async def train_spec(bot, state): + larvae = bot.units(UnitTypeId.LARVA) + if larvae.exists and bot.can_afford(unit): + selected = larvae.first + print("Morph {}".format(unit)) + return await bot.do(selected.train(unit)) + else: + return ActionResult.Error + + return Command(train_spec) + + +def build(building, around_building=None, placement=None): + async def build_spec(bot, state): + if not around_building: + around = bot.townhalls.first + else: + around = around_building(bot, state) + + if not placement: + location = around.position.towards(bot.game_info.map_center, 5) + else: + location = placement + if bot.can_afford(building): + print("Building {}".format(building)) + return await bot.build(building, near=location) + else: + return ActionResult.Error + + return Command(build_spec) + + +def add_supply(): + async def supply_spec(bot, state): + if bot.can_afford(bot.supply_type): + if bot.race == Race.Zerg: + return await morph(bot.supply_type).execute(bot, state) + else: + return await build(bot.supply_type).execute(bot, state) + else: + return ActionResult.Error + + return Command(supply_spec) + + +def add_gas(): + async def add_gas_spec(bot, state): + for th in bot.townhalls: + for nexus in bot.units(th.type_id).ready: + vgs = state.vespene_geyser.closer_than(20.0, nexus) + for vg in vgs: + if not bot.can_afford(UnitTypeId.EXTRACTOR): + break + + worker = bot.select_build_worker(vg.position) + if worker is None: + break + + if not bot.units(UnitTypeId.EXTRACTOR).closer_than(1.0, vg).exists: + return await bot.do(worker.build(UnitTypeId.EXTRACTOR, vg)) + return ActionResult.Error + + return Command(add_gas_spec) From a34faa9143e0535ce553c266d2aabef77b4fda6c Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 19:57:17 +0800 Subject: [PATCH 22/56] Wrap the response of `BotAI.can_afford` to return a wrapper Fixes #22 --- sc2/bot_ai.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index 7ad20792b..56c0bcc82 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -110,7 +110,7 @@ def can_afford(self, item_id): else: cost = self._game_data.calculate_ability_cost(item_id) - return cost.minerals <= self.minerals and cost.vespene <= self.vespene + return CanAffordWrapper(cost.minerals <= self.minerals, cost.vespene <= self.vespene) def select_build_worker(self, pos, force=False): workers = self.workers.closer_than(20, pos) or self.workers @@ -222,3 +222,13 @@ def on_start(self): async def on_step(self, do, state, game_loop): raise NotImplementedError + + +class CanAffordWrapper(object): + + def __init__(self, can_afford_minerals, can_afford_vespene): + self.can_afford_minerals = can_afford_minerals + self.can_afford_vespene = can_afford_vespene + + def __bool__(self): + return self.can_afford_minerals and self.can_afford_vespene \ No newline at end of file From c81dffedd04afb2361f18b1bfa90a4c75d57d5af Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 20:08:42 +0800 Subject: [PATCH 23/56] Add `action_result` property to CanAffordWrapper --- sc2/bot_ai.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index 56c0bcc82..72313dd01 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -231,4 +231,13 @@ def __init__(self, can_afford_minerals, can_afford_vespene): self.can_afford_vespene = can_afford_vespene def __bool__(self): - return self.can_afford_minerals and self.can_afford_vespene \ No newline at end of file + return self.can_afford_minerals and self.can_afford_vespene + + @property + def action_result(self): + if not self.can_afford_vespene: + return ActionResult.NotEnoughVespene + elif not self.can_afford_minerals: + return ActionResult.NotEnoughMinerals + else: + return None From 0aadf2192679bc4fbe5ccfad8a1fc9956be3f3b0 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 20:27:33 +0800 Subject: [PATCH 24/56] Convert get_owned_expansions to owned_expansions property --- sc2/bot_ai.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index c8d2584bb..d6f91a518 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -107,7 +107,7 @@ def is_near_to_expansion(t): return t.position.distance_to(el) < self.EXPANSION_ async def distribute_workers(self): expansion_locations = self.expansion_locations - owned_expansions = self.get_owned_expansions() + owned_expansions = self.owned_expansions worker_pool = [] for location, townhall in owned_expansions.items(): workers = self.workers.closer_than(20, location) @@ -156,15 +156,16 @@ async def distribute_workers(self): else: await self.do(w.gather(mf)) - def get_owned_expansions(self): - owned_expansions = {} + @property + def owned_expansions(self): + owned = {} for el in self.expansion_locations: def is_near_to_expansion(t): return t.position.distance_to(el) < self.EXPANSION_GAP_THRESHOLD th = next((x for x in self.townhalls if is_near_to_expansion(x)), None) if th: - owned_expansions[el] = th + owned[el] = th - return owned_expansions + return owned def can_afford(self, item_id): if isinstance(item_id, UnitTypeId): From 28850b234e88911bd6a9c032edf2c606a3897e1e Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 20:34:47 +0800 Subject: [PATCH 25/56] Add support for rich mineral fields --- sc2/bot_ai.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index d6f91a518..582609524 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -148,7 +148,8 @@ async def distribute_workers(self): for x in range(0, deficit): if worker_pool: w = worker_pool.pop() - mf = next(iter(filter(lambda r: r.type_id in [UnitTypeId.MINERALFIELD750, UnitTypeId.MINERALFIELD], + mf = next(iter(filter(lambda r: r.type_id in [UnitTypeId.MINERALFIELD750, UnitTypeId.MINERALFIELD, + UnitTypeId.RICHMINERALFIELD750, UnitTypeId.RICHMINERALFIELD], expansion_locations[location]))) if len(w.orders) == 1 and w.orders[0].ability.id in [AbilityId.HARVEST_RETURN]: await self.do(w.move(mf)) From e0e89c9d4c344bd239c019e4343d13b67f4008d5 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 20:40:55 +0800 Subject: [PATCH 26/56] Utilize `can_afford` wrapper --- sc2/build_orders/commands.py | 62 ++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/sc2/build_orders/commands.py b/sc2/build_orders/commands.py index af1280efc..45b230a48 100644 --- a/sc2/build_orders/commands.py +++ b/sc2/build_orders/commands.py @@ -27,10 +27,11 @@ def is_done(self): def expand(): async def expand_spec(bot, state): building = bot.basic_townhall_type - if bot.can_afford(building): + can_afford = bot.can_afford(building) + if can_afford: return await bot.expand_now(building=building) else: - return ActionResult.Error + return can_afford.action_result return Command(expand_spec) @@ -38,10 +39,14 @@ async def expand_spec(bot, state): def train(unit, on_building): async def train_spec(bot, state): buildings = bot.units(on_building).ready.noqueue - if buildings.exists and bot.can_afford(unit): + if buildings.exists: selected = buildings.first - print("Training {}".format(unit)) - return await bot.do(selected.train(unit)) + can_afford = bot.can_afford(unit) + if can_afford: + print("Training {}".format(unit)) + return await bot.do(selected.train(unit)) + else: + return can_afford.action_result else: return ActionResult.Error @@ -53,8 +58,12 @@ async def train_spec(bot, state): larvae = bot.units(UnitTypeId.LARVA) if larvae.exists and bot.can_afford(unit): selected = larvae.first - print("Morph {}".format(unit)) - return await bot.do(selected.train(unit)) + can_afford = bot.can_afford(unit) + if can_afford: + print("Morph {}".format(unit)) + return await bot.do(selected.train(unit)) + else: + return can_afford.action_result else: return ActionResult.Error @@ -72,43 +81,48 @@ async def build_spec(bot, state): location = around.position.towards(bot.game_info.map_center, 5) else: location = placement - if bot.can_afford(building): + + can_afford = bot.can_afford(building) + if can_afford: print("Building {}".format(building)) return await bot.build(building, near=location) else: - return ActionResult.Error + return can_afford.action_result return Command(build_spec) def add_supply(): async def supply_spec(bot, state): - if bot.can_afford(bot.supply_type): + can_afford = bot.can_afford(bot.supply_type) + if can_afford: if bot.race == Race.Zerg: return await morph(bot.supply_type).execute(bot, state) else: return await build(bot.supply_type).execute(bot, state) else: - return ActionResult.Error + return can_afford.action_result return Command(supply_spec) def add_gas(): async def add_gas_spec(bot, state): - for th in bot.townhalls: - for nexus in bot.units(th.type_id).ready: - vgs = state.vespene_geyser.closer_than(20.0, nexus) - for vg in vgs: - if not bot.can_afford(UnitTypeId.EXTRACTOR): - break - - worker = bot.select_build_worker(vg.position) - if worker is None: - break - - if not bot.units(UnitTypeId.EXTRACTOR).closer_than(1.0, vg).exists: - return await bot.do(worker.build(UnitTypeId.EXTRACTOR, vg)) + can_afford = bot.can_afford(bot.geyser_type) + if not can_afford: + return can_afford.action_result + + owned_expansions = bot.owned_expansions + for location, th in owned_expansions.items(): + vgs = state.vespene_geyser.closer_than(20.0, th) + for vg in vgs: + worker = bot.select_build_worker(vg.position) + if worker is None: + break + + if not bot.units(bot.geyser_type).closer_than(1.0, vg).exists: + return await bot.do(worker.build(bot.geyser_type, vg)) + return ActionResult.Error return Command(add_gas_spec) From bd5a716fe639c51e3a78387678bd26a35c9faa19 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 20:58:21 +0800 Subject: [PATCH 27/56] Allow prioritization of build order actions --- examples/zerg_rush_build_order.py | 10 +++--- sc2/build_orders/build_order.py | 12 ++++--- sc2/build_orders/commands.py | 52 +++++++++++++++++-------------- 3 files changed, 42 insertions(+), 32 deletions(-) diff --git a/examples/zerg_rush_build_order.py b/examples/zerg_rush_build_order.py index d08c816e8..f6b3c320d 100644 --- a/examples/zerg_rush_build_order.py +++ b/examples/zerg_rush_build_order.py @@ -20,10 +20,10 @@ class ZergRushBot(sc2.BotAI): def __init__(self): self.attack = False build_order = [ - (all_of(supply_at_least(13), unit_count(UnitTypeId.OVERLORD, 1, include_pending=True)), morph(UnitTypeId.OVERLORD)), + (all_of(supply_at_least(13), unit_count(UnitTypeId.OVERLORD, 1, include_pending=True)), morph(UnitTypeId.OVERLORD, prioritize=True)), (all_of(supply_at_least(17), unit_count(UnitTypeId.EXTRACTOR, 0, include_pending=True)), add_gas()), - (all_of(supply_at_least(17), unit_count(UnitTypeId.SPAWNINGPOOL, 0, include_pending=True)), build(UnitTypeId.SPAWNINGPOOL)), - (all_of(supply_at_least(17), unit_count(UnitTypeId.HATCHERY, 1, include_pending=True)), expand()), + (all_of(supply_at_least(17), unit_count(UnitTypeId.SPAWNINGPOOL, 0, include_pending=True)), build(UnitTypeId.SPAWNINGPOOL, prioritize=True)), + (all_of(supply_at_least(17), unit_count(UnitTypeId.HATCHERY, 1, include_pending=True)), expand(prioritize=True)), (supply_at_least(18), morph(UnitTypeId.ZERGLING)), (supply_at_least(19), train(UnitTypeId.QUEEN, on_building=UnitTypeId.HATCHERY)), (all_of(supply_at_least(21), unit_count(UnitTypeId.OVERLORD, 2, include_pending=True)), morph(UnitTypeId.OVERLORD)), @@ -36,13 +36,13 @@ def __init__(self): (unit_count(UnitTypeId.ROACH, 4, include_pending=True), morph(UnitTypeId.ROACH)), (unit_count(UnitTypeId.ROACH, 5, include_pending=True), morph(UnitTypeId.ROACH)), (unit_count(UnitTypeId.ROACH, 6, include_pending=True), morph(UnitTypeId.ROACH)), - (unit_count(UnitTypeId.SPAWNINGPOOL, 1), morph(UnitTypeId.ZERGLING).keep_going()) + (unit_count(UnitTypeId.SPAWNINGPOOL, 1), morph(UnitTypeId.ZERGLING, repeatable=True)) ] self.build_order = BuildOrder(self, build_order, worker_count=35) async def on_step(self, state, iteration): - # await self.distribute_workers() + await self.distribute_workers() await self.build_order.execute_build(state) if self.units(UnitTypeId.ROACH).amount >= 7 or self.attack: self.attack = True diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index e97ce169d..d1bb4b7fc 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -17,13 +17,17 @@ async def execute_build(self, state): return await add_supply().execute(bot, state) for index, item in enumerate(self.build): - condition, intent = item + condition, command = item condition = item[0] if item[0] else always_true - if condition(bot, state) and not intent.is_done: - e = await intent.execute(bot, state) - if intent.is_done: + if condition(bot, state) and not command.is_done: + e = await command.execute(bot, state) + if command.is_done: return e else: + # Save up to be able to do this command and hold worker creation. + if command.is_priority and e == ActionResult.NotEnoughMinerals: + return e + if e == ActionResult.NotEnoughFood and self.auto_add_supply \ and not bot.already_pending(bot.supply_type): return await add_supply().execute(bot, state) diff --git a/sc2/build_orders/commands.py b/sc2/build_orders/commands.py index 45b230a48..86fc055d4 100644 --- a/sc2/build_orders/commands.py +++ b/sc2/build_orders/commands.py @@ -3,29 +3,35 @@ class Command(object): - def __init__(self, action): + def __init__(self, action, repeatable=False, priority=False): self.action = action self.done = False - self.infinite = False + self.repeatable = repeatable + self.priority = priority async def execute(self, bot, state): e = await self.action(bot, state) - if not e and not self.infinite: + if not e and not self.repeatable: self.done = True return e - def keep_going(self): - self.infinite = True + def allow_repeat(self): + self.repeatable = True + self.done = False return self @property def is_done(self): return self.done + @property + def is_priority(self): + return self.priority + -def expand(): - async def expand_spec(bot, state): +def expand(prioritize=False, repeatable=False): + async def do_expand(bot, state): building = bot.basic_townhall_type can_afford = bot.can_afford(building) if can_afford: @@ -33,11 +39,11 @@ async def expand_spec(bot, state): else: return can_afford.action_result - return Command(expand_spec) + return Command(do_expand, priority=prioritize, repeatable=repeatable) -def train(unit, on_building): - async def train_spec(bot, state): +def train(unit, on_building, prioritize=False, repeatable=False): + async def do_train(bot, state): buildings = bot.units(on_building).ready.noqueue if buildings.exists: selected = buildings.first @@ -50,13 +56,13 @@ async def train_spec(bot, state): else: return ActionResult.Error - return Command(train_spec) + return Command(do_train, priority=prioritize, repeatable=repeatable) -def morph(unit): - async def train_spec(bot, state): +def morph(unit, prioritize=False, repeatable=False): + async def do_morph(bot, state): larvae = bot.units(UnitTypeId.LARVA) - if larvae.exists and bot.can_afford(unit): + if larvae.exists: selected = larvae.first can_afford = bot.can_afford(unit) if can_afford: @@ -67,11 +73,11 @@ async def train_spec(bot, state): else: return ActionResult.Error - return Command(train_spec) + return Command(do_morph, priority=prioritize, repeatable=repeatable) -def build(building, around_building=None, placement=None): - async def build_spec(bot, state): +def build(building, around_building=None, placement=None, prioritize=False, repeatable=False): + async def do_build(bot, state): if not around_building: around = bot.townhalls.first else: @@ -89,10 +95,10 @@ async def build_spec(bot, state): else: return can_afford.action_result - return Command(build_spec) + return Command(do_build, priority=prioritize, repeatable=repeatable) -def add_supply(): +def add_supply(prioritize=False, repeatable=False): async def supply_spec(bot, state): can_afford = bot.can_afford(bot.supply_type) if can_afford: @@ -103,11 +109,11 @@ async def supply_spec(bot, state): else: return can_afford.action_result - return Command(supply_spec) + return Command(supply_spec, priority=prioritize, repeatable=repeatable) -def add_gas(): - async def add_gas_spec(bot, state): +def add_gas(prioritize=False, repeatable=False): + async def do_add_gas(bot, state): can_afford = bot.can_afford(bot.geyser_type) if not can_afford: return can_afford.action_result @@ -125,4 +131,4 @@ async def add_gas_spec(bot, state): return ActionResult.Error - return Command(add_gas_spec) + return Command(do_add_gas, priority=prioritize, repeatable=repeatable) From 5a596541a53bff73b0252a7fd30c8b6c317e30e9 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 21:28:58 +0800 Subject: [PATCH 28/56] Adjust priority of build commands in build orders --- examples/zerg_rush_build_order.py | 25 +++++++++++++------------ sc2/build_orders/commands.py | 30 +++++++++++------------------- sc2/state_conditions/conditions.py | 17 ++++++++++++++++- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/examples/zerg_rush_build_order.py b/examples/zerg_rush_build_order.py index f6b3c320d..c5675021c 100644 --- a/examples/zerg_rush_build_order.py +++ b/examples/zerg_rush_build_order.py @@ -4,7 +4,7 @@ from sc2.build_orders.commands import add_gas, build, expand from sc2.constants import * from sc2.player import Bot, Computer -from sc2.state_conditions.conditions import supply_at_least, all_of, unit_count +from sc2.state_conditions.conditions import supply_at_least, all_of, unit_count, gas_less_than def research(building, upgrade): @@ -22,21 +22,16 @@ def __init__(self): build_order = [ (all_of(supply_at_least(13), unit_count(UnitTypeId.OVERLORD, 1, include_pending=True)), morph(UnitTypeId.OVERLORD, prioritize=True)), (all_of(supply_at_least(17), unit_count(UnitTypeId.EXTRACTOR, 0, include_pending=True)), add_gas()), - (all_of(supply_at_least(17), unit_count(UnitTypeId.SPAWNINGPOOL, 0, include_pending=True)), build(UnitTypeId.SPAWNINGPOOL, prioritize=True)), - (all_of(supply_at_least(17), unit_count(UnitTypeId.HATCHERY, 1, include_pending=True)), expand(prioritize=True)), + (all_of(supply_at_least(17), unit_count(UnitTypeId.SPAWNINGPOOL, 0, include_pending=True)), build(UnitTypeId.SPAWNINGPOOL)), + (all_of(supply_at_least(17), unit_count(UnitTypeId.HATCHERY, 1, include_pending=True)), expand()), (supply_at_least(18), morph(UnitTypeId.ZERGLING)), - (supply_at_least(19), train(UnitTypeId.QUEEN, on_building=UnitTypeId.HATCHERY)), + (supply_at_least(19), train(UnitTypeId.QUEEN, on_building=UnitTypeId.HATCHERY, prioritize=True)), (all_of(supply_at_least(21), unit_count(UnitTypeId.OVERLORD, 2, include_pending=True)), morph(UnitTypeId.OVERLORD)), (all_of(supply_at_least(21), unit_count(UnitTypeId.ROACHWARREN, 0, include_pending=True)), build(UnitTypeId.ROACHWARREN)), (all_of(supply_at_least(20), unit_count(UnitTypeId.OVERLORD, 3, include_pending=True)), morph(UnitTypeId.OVERLORD)), - (unit_count(UnitTypeId.ROACH, 0, include_pending=True), morph(UnitTypeId.ROACH)), - (unit_count(UnitTypeId.ROACH, 1, include_pending=True), morph(UnitTypeId.ROACH)), - (unit_count(UnitTypeId.ROACH, 2, include_pending=True), morph(UnitTypeId.ROACH)), - (unit_count(UnitTypeId.ROACH, 3, include_pending=True), morph(UnitTypeId.ROACH)), - (unit_count(UnitTypeId.ROACH, 4, include_pending=True), morph(UnitTypeId.ROACH)), - (unit_count(UnitTypeId.ROACH, 5, include_pending=True), morph(UnitTypeId.ROACH)), - (unit_count(UnitTypeId.ROACH, 6, include_pending=True), morph(UnitTypeId.ROACH)), - (unit_count(UnitTypeId.SPAWNINGPOOL, 1), morph(UnitTypeId.ZERGLING, repeatable=True)) + (all_of(unit_count(UnitTypeId.HATCHERY, 1), unit_count(UnitTypeId.ROACHWARREN, 1)), train(UnitTypeId.QUEEN, on_building=UnitTypeId.HATCHERY)), + (all_of(unit_count(UnitTypeId.ROACHWARREN, 1), gas_less_than(25)), morph(UnitTypeId.ZERGLING, repeatable=True)), + (unit_count(UnitTypeId.ROACHWARREN, 1), morph(UnitTypeId.ROACH, repeatable=True)) ] self.build_order = BuildOrder(self, build_order, worker_count=35) @@ -44,6 +39,12 @@ def __init__(self): async def on_step(self, state, iteration): await self.distribute_workers() await self.build_order.execute_build(state) + + for queen in self.units(UnitTypeId.QUEEN).idle: + if queen.energy >= 25: # Hard coded, since this is not (yet) available + hatchery = self.townhalls.closest_to(queen.position.to2) + await self.do(queen(AbilityId.INJECTLARVA, hatchery)) + if self.units(UnitTypeId.ROACH).amount >= 7 or self.attack: self.attack = True for unit in self.units(UnitTypeId.ZERGLING) | self.units(UnitTypeId.ROACH): diff --git a/sc2/build_orders/commands.py b/sc2/build_orders/commands.py index 86fc055d4..998052f66 100644 --- a/sc2/build_orders/commands.py +++ b/sc2/build_orders/commands.py @@ -5,32 +5,24 @@ class Command(object): def __init__(self, action, repeatable=False, priority=False): self.action = action - self.done = False - self.repeatable = repeatable - self.priority = priority + self.is_done = False + self.is_repeatable = repeatable + self.is_priority = priority async def execute(self, bot, state): e = await self.action(bot, state) - if not e and not self.repeatable: - self.done = True + if not e and not self.is_repeatable: + self.is_done = True return e def allow_repeat(self): - self.repeatable = True - self.done = False + self.is_repeatable = True + self.is_done = False return self - @property - def is_done(self): - return self.done - @property - def is_priority(self): - return self.priority - - -def expand(prioritize=False, repeatable=False): +def expand(prioritize=False, repeatable=True): async def do_expand(bot, state): building = bot.basic_townhall_type can_afford = bot.can_afford(building) @@ -76,7 +68,7 @@ async def do_morph(bot, state): return Command(do_morph, priority=prioritize, repeatable=repeatable) -def build(building, around_building=None, placement=None, prioritize=False, repeatable=False): +def build(building, around_building=None, placement=None, prioritize=True, repeatable=False): async def do_build(bot, state): if not around_building: around = bot.townhalls.first @@ -98,7 +90,7 @@ async def do_build(bot, state): return Command(do_build, priority=prioritize, repeatable=repeatable) -def add_supply(prioritize=False, repeatable=False): +def add_supply(prioritize=True, repeatable=False): async def supply_spec(bot, state): can_afford = bot.can_afford(bot.supply_type) if can_afford: @@ -112,7 +104,7 @@ async def supply_spec(bot, state): return Command(supply_spec, priority=prioritize, repeatable=repeatable) -def add_gas(prioritize=False, repeatable=False): +def add_gas(prioritize=True, repeatable=False): async def do_add_gas(bot, state): can_afford = bot.can_afford(bot.geyser_type) if not can_afford: diff --git a/sc2/state_conditions/conditions.py b/sc2/state_conditions/conditions.py index 760bbd969..7c414959b 100644 --- a/sc2/state_conditions/conditions.py +++ b/sc2/state_conditions/conditions.py @@ -30,6 +30,13 @@ def condition(bot, state): return condition +def gas_less_than(s): + def condition(bot, state): + return bot.vespene < s + + return condition + + def minerals_at_least(s): def condition(bot, state): return bot.minerals >= s @@ -37,10 +44,18 @@ def condition(bot, state): return condition +def minerals_less_than(s): + def condition(bot, state): + return bot.minerals < s + + return condition + + def unit_count(unit, n, include_pending=False): - def condition(bot,state): + def condition(bot, state): actual_amount = bot.units(unit).amount if include_pending: actual_amount += bot.already_pending(unit) return actual_amount == n + return condition From ffb3ea8509f8b4cd6dc4748040f952551b820322 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 21:32:23 +0800 Subject: [PATCH 29/56] Assign idle workers to gather before distribution --- examples/distributed_workers.py | 2 -- sc2/bot_ai.py | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/distributed_workers.py b/examples/distributed_workers.py index db1c6b132..91a667756 100644 --- a/examples/distributed_workers.py +++ b/examples/distributed_workers.py @@ -25,8 +25,6 @@ async def build_supply(self, state): if self.supply_left < 4 and not self.already_pending(UnitTypeId.SUPPLYDEPOT): if self.can_afford(UnitTypeId.SUPPLYDEPOT): await self.build(UnitTypeId.SUPPLYDEPOT, near=cc.position.towards(self.game_info.map_center, 5)) - for scv in self.units(UnitTypeId.SCV).idle: - await self.do(scv.gather(self.state.mineral_field.closest_to(cc))) run_game(maps.get("Abyssal Reef LE"), [ diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index 582609524..911907014 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -109,6 +109,10 @@ async def distribute_workers(self): expansion_locations = self.expansion_locations owned_expansions = self.owned_expansions worker_pool = [] + for idle_worker in self.workers.idle: + mf = self.state.mineral_field.closest_to(idle_worker) + await self.do(idle_worker.gather(mf)) + for location, townhall in owned_expansions.items(): workers = self.workers.closer_than(20, location) actual = townhall.assigned_harvesters From 4da9af8b7a6ce23d7804707c9f4d77052b8d2910 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 22:00:52 +0800 Subject: [PATCH 30/56] Optimize mineral field selection during transfer --- sc2/bot_ai.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index 911907014..12af3c219 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -152,11 +152,9 @@ async def distribute_workers(self): for x in range(0, deficit): if worker_pool: w = worker_pool.pop() - mf = next(iter(filter(lambda r: r.type_id in [UnitTypeId.MINERALFIELD750, UnitTypeId.MINERALFIELD, - UnitTypeId.RICHMINERALFIELD750, UnitTypeId.RICHMINERALFIELD], - expansion_locations[location]))) + mf = self.state.mineral_field.closest_to(townhall) if len(w.orders) == 1 and w.orders[0].ability.id in [AbilityId.HARVEST_RETURN]: - await self.do(w.move(mf)) + await self.do(w.move(townhall)) await self.do(w.return_resource(queue=True)) else: await self.do(w.gather(mf)) From 63cf2af47a157d10249fba9e159cb00c07619e49 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 22:45:04 +0800 Subject: [PATCH 31/56] Add unit count conditions --- sc2/state_conditions/conditions.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sc2/state_conditions/conditions.py b/sc2/state_conditions/conditions.py index 7c414959b..ee042f0d5 100644 --- a/sc2/state_conditions/conditions.py +++ b/sc2/state_conditions/conditions.py @@ -59,3 +59,23 @@ def condition(bot, state): return actual_amount == n return condition + + +def unit_count_at_least(unit, n, include_pending=False): + def condition(bot, state): + actual_amount = bot.units(unit).amount + if include_pending: + actual_amount += bot.already_pending(unit) + return actual_amount >= n + + return condition + + +def unit_count_less_than(unit, n, include_pending=False): + def condition(bot, state): + actual_amount = bot.units(unit).amount + if include_pending: + actual_amount += bot.already_pending(unit) + return actual_amount < n + + return condition From 329ce676ccc029adfcbe2c6e7d8db0658c306770 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 22:45:46 +0800 Subject: [PATCH 32/56] Tweak sample scripts --- examples/distributed_workers.py | 2 +- examples/zerg_rush_build_order.py | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/distributed_workers.py b/examples/distributed_workers.py index 91a667756..3680ab47f 100644 --- a/examples/distributed_workers.py +++ b/examples/distributed_workers.py @@ -30,4 +30,4 @@ async def build_supply(self, state): run_game(maps.get("Abyssal Reef LE"), [ Bot(Race.Terran, TerranBot()), Computer(Race.Protoss, Difficulty.Medium) -], realtime=True) +], realtime=False) diff --git a/examples/zerg_rush_build_order.py b/examples/zerg_rush_build_order.py index c5675021c..689e3e8ee 100644 --- a/examples/zerg_rush_build_order.py +++ b/examples/zerg_rush_build_order.py @@ -4,7 +4,8 @@ from sc2.build_orders.commands import add_gas, build, expand from sc2.constants import * from sc2.player import Bot, Computer -from sc2.state_conditions.conditions import supply_at_least, all_of, unit_count, gas_less_than +from sc2.state_conditions.conditions import supply_at_least, all_of, unit_count, gas_less_than, unit_count_less_than, \ + unit_count_at_least def research(building, upgrade): @@ -29,9 +30,9 @@ def __init__(self): (all_of(supply_at_least(21), unit_count(UnitTypeId.OVERLORD, 2, include_pending=True)), morph(UnitTypeId.OVERLORD)), (all_of(supply_at_least(21), unit_count(UnitTypeId.ROACHWARREN, 0, include_pending=True)), build(UnitTypeId.ROACHWARREN)), (all_of(supply_at_least(20), unit_count(UnitTypeId.OVERLORD, 3, include_pending=True)), morph(UnitTypeId.OVERLORD)), - (all_of(unit_count(UnitTypeId.HATCHERY, 1), unit_count(UnitTypeId.ROACHWARREN, 1)), train(UnitTypeId.QUEEN, on_building=UnitTypeId.HATCHERY)), - (all_of(unit_count(UnitTypeId.ROACHWARREN, 1), gas_less_than(25)), morph(UnitTypeId.ZERGLING, repeatable=True)), + (unit_count_at_least(UnitTypeId.ROACH, 7), morph(UnitTypeId.ZERGLING, repeatable=True)), (unit_count(UnitTypeId.ROACHWARREN, 1), morph(UnitTypeId.ROACH, repeatable=True)) + ] self.build_order = BuildOrder(self, build_order, worker_count=35) @@ -45,7 +46,7 @@ async def on_step(self, state, iteration): hatchery = self.townhalls.closest_to(queen.position.to2) await self.do(queen(AbilityId.INJECTLARVA, hatchery)) - if self.units(UnitTypeId.ROACH).amount >= 7 or self.attack: + if (self.units(UnitTypeId.ROACH).amount >= 7 and self.units(UnitTypeId.ZERGLING).amount >= 10) or self.attack: self.attack = True for unit in self.units(UnitTypeId.ZERGLING) | self.units(UnitTypeId.ROACH): await self.do(unit.attack(self.enemy_start_locations[0])) @@ -55,7 +56,7 @@ def main(): sc2.run_game(sc2.maps.get("Abyssal Reef LE"), [ Bot(Race.Zerg, ZergRushBot()), Computer(Race.Terran, Difficulty.Medium) - ], realtime=True) + ], realtime=False) if __name__ == '__main__': main() From 495ace390ca44f09f398335342b2027256de1496 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Sun, 28 Jan 2018 22:47:33 +0800 Subject: [PATCH 33/56] Queue gather command when transferring workers with resource --- sc2/bot_ai.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index 12af3c219..6c09d2596 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -156,6 +156,7 @@ async def distribute_workers(self): if len(w.orders) == 1 and w.orders[0].ability.id in [AbilityId.HARVEST_RETURN]: await self.do(w.move(townhall)) await self.do(w.return_resource(queue=True)) + await self.do(w.gather(mf, queue=True)) else: await self.do(w.gather(mf)) From a519808253dab3c234d5d830c6d6e395159e1447 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Mon, 29 Jan 2018 09:12:58 +0800 Subject: [PATCH 34/56] Add terran build order sample - marine rush --- examples/terran_build_order.py | 42 ----------------- examples/terran_marine_rush_build_order.py | 55 ++++++++++++++++++++++ examples/zerg_rush_build_order.py | 8 ++-- 3 files changed, 59 insertions(+), 46 deletions(-) delete mode 100644 examples/terran_build_order.py create mode 100644 examples/terran_marine_rush_build_order.py diff --git a/examples/terran_build_order.py b/examples/terran_build_order.py deleted file mode 100644 index 1119d4f36..000000000 --- a/examples/terran_build_order.py +++ /dev/null @@ -1,42 +0,0 @@ -import sc2 -from sc2 import run_game, maps, Race, Difficulty -from sc2.build_orders.build_order import BuildOrder, train -from sc2.build_orders.commands import build, expand -from sc2.constants import * -from sc2.player import Bot, Computer -from sc2.state_conditions.conditions import all_of, supply_at_least, minerals_at_least - - -def first_barracks(bot, state): - return bot.units(UnitTypeId.BARRACKS).first - - -class TerranBuildOrderBot(sc2.BotAI): - def __init__(self): - build_order = [ - (supply_at_least(12), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (all_of(supply_at_least(13), minerals_at_least(100)), build(UnitTypeId.SUPPLYDEPOT)), - (supply_at_least(13), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (supply_at_least(14), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (all_of(supply_at_least(15), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), - (supply_at_least(15), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (supply_at_least(16), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (all_of(supply_at_least(17), minerals_at_least(400)), expand()), - (supply_at_least(17), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - (all_of(supply_at_least(18), minerals_at_least(150)), build(UnitTypeId.BARRACKS)), - (all_of(supply_at_least(18), minerals_at_least(100)), build(UnitTypeId.SUPPLYDEPOT, around_building=first_barracks)), - (supply_at_least(18), train(UnitTypeId.SCV, on_building=UnitTypeId.COMMANDCENTER)), - ] - self.build_order = BuildOrder(self, build_order) - - async def on_step(self, state, iteration): - await self.build_order.execute_build(state) - cc = self.units(UnitTypeId.COMMANDCENTER).first - for scv in self.units(UnitTypeId.SCV).idle: - await self.do(scv.gather(self.state.mineral_field.closest_to(cc))) - - -run_game(maps.get("Abyssal Reef LE"), [ - Bot(Race.Terran, TerranBuildOrderBot()), - Computer(Race.Protoss, Difficulty.Medium) -], realtime=True) diff --git a/examples/terran_marine_rush_build_order.py b/examples/terran_marine_rush_build_order.py new file mode 100644 index 000000000..da54a4051 --- /dev/null +++ b/examples/terran_marine_rush_build_order.py @@ -0,0 +1,55 @@ +import sc2 +from sc2 import run_game, maps, Race, Difficulty +from sc2.build_orders.build_order import BuildOrder, train +from sc2.build_orders.commands import build, expand, add_supply +from sc2.constants import * +from sc2.player import Bot, Computer +from sc2.state_conditions.conditions import all_of, supply_at_least, minerals_at_least, unit_count + + +def first_barracks(bot, state): + return bot.units(UnitTypeId.BARRACKS).first + + +class TerranBuildOrderBot(sc2.BotAI): + def __init__(self): + build_order = [ + (supply_at_least(13), add_supply(prioritize=True)), + (supply_at_least(15), build(UnitTypeId.BARRACKS, prioritize=True)), + (supply_at_least(16), build(UnitTypeId.BARRACKS, prioritize=True)), + (supply_at_least(16), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(17), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(18), build(UnitTypeId.BARRACKS, prioritize=True)), + (supply_at_least(18), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(19), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(20), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(21), add_supply(prioritize=True)), + (supply_at_least(21), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(22), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(23), build(UnitTypeId.BARRACKS, prioritize=True)), + (supply_at_least(23), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(24), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(25), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(26), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(27), build(UnitTypeId.BARRACKS, prioritize=True)), + (all_of(supply_at_least(27), unit_count(UnitTypeId.BARRACKS, 5, include_pending=True)), add_supply(prioritize=True)), + (unit_count(UnitTypeId.BARRACKS, 5), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS, repeatable=True)) + ] + self.attack = False + self.build_order = BuildOrder(self, build_order, worker_count=16) + + async def on_step(self, state, iteration): + await self.distribute_workers() + await self.build_order.execute_build(state) + + if self.units(UnitTypeId.MARINE).amount >= 15 or self.attack: + self.attack = True + for unit in self.units(UnitTypeId.MARINE): + await self.do(unit.attack(self.enemy_start_locations[0])) + return + + +run_game(maps.get("Abyssal Reef LE"), [ + Bot(Race.Terran, TerranBuildOrderBot()), + Computer(Race.Protoss, Difficulty.Medium) +], realtime=False) diff --git a/examples/zerg_rush_build_order.py b/examples/zerg_rush_build_order.py index 689e3e8ee..f241e61bc 100644 --- a/examples/zerg_rush_build_order.py +++ b/examples/zerg_rush_build_order.py @@ -1,7 +1,7 @@ import sc2 from sc2 import Race, Difficulty from sc2.build_orders.build_order import train, BuildOrder, morph -from sc2.build_orders.commands import add_gas, build, expand +from sc2.build_orders.commands import add_gas, build, expand, add_supply from sc2.constants import * from sc2.player import Bot, Computer from sc2.state_conditions.conditions import supply_at_least, all_of, unit_count, gas_less_than, unit_count_less_than, \ @@ -21,15 +21,15 @@ class ZergRushBot(sc2.BotAI): def __init__(self): self.attack = False build_order = [ - (all_of(supply_at_least(13), unit_count(UnitTypeId.OVERLORD, 1, include_pending=True)), morph(UnitTypeId.OVERLORD, prioritize=True)), + (all_of(supply_at_least(13), unit_count(UnitTypeId.OVERLORD, 1, include_pending=True)), add_supply(prioritize=True)), (all_of(supply_at_least(17), unit_count(UnitTypeId.EXTRACTOR, 0, include_pending=True)), add_gas()), (all_of(supply_at_least(17), unit_count(UnitTypeId.SPAWNINGPOOL, 0, include_pending=True)), build(UnitTypeId.SPAWNINGPOOL)), (all_of(supply_at_least(17), unit_count(UnitTypeId.HATCHERY, 1, include_pending=True)), expand()), (supply_at_least(18), morph(UnitTypeId.ZERGLING)), (supply_at_least(19), train(UnitTypeId.QUEEN, on_building=UnitTypeId.HATCHERY, prioritize=True)), - (all_of(supply_at_least(21), unit_count(UnitTypeId.OVERLORD, 2, include_pending=True)), morph(UnitTypeId.OVERLORD)), + (all_of(supply_at_least(21), unit_count(UnitTypeId.OVERLORD, 2, include_pending=True)), add_supply(prioritize=True)), (all_of(supply_at_least(21), unit_count(UnitTypeId.ROACHWARREN, 0, include_pending=True)), build(UnitTypeId.ROACHWARREN)), - (all_of(supply_at_least(20), unit_count(UnitTypeId.OVERLORD, 3, include_pending=True)), morph(UnitTypeId.OVERLORD)), + (all_of(supply_at_least(20), unit_count(UnitTypeId.OVERLORD, 3, include_pending=True)), add_supply(prioritize=True)), (unit_count_at_least(UnitTypeId.ROACH, 7), morph(UnitTypeId.ZERGLING, repeatable=True)), (unit_count(UnitTypeId.ROACHWARREN, 1), morph(UnitTypeId.ROACH, repeatable=True)) From c9e8f014a228c014ebb9bd01d889be419b11b14d Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Tue, 30 Jan 2018 14:36:27 +0800 Subject: [PATCH 35/56] Make auto-adding supply to be done when there's at least 1 supply left initially --- sc2/build_orders/build_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index d1bb4b7fc..16822eeea 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -12,7 +12,7 @@ def __init__(self, bot, build, worker_count=0, auto_add_supply=True): async def execute_build(self, state): bot = self.bot - if bot.supply_left <= (bot.supply_cap / 50) and not bot.already_pending(bot.supply_type) \ + if bot.supply_left <= ((bot.supply_cap+50) / 50) and not bot.already_pending(bot.supply_type) \ and self.auto_add_supply: return await add_supply().execute(bot, state) From e37848c84d2cd5315ca3003fd84942e50e4c57f9 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Tue, 30 Jan 2018 15:55:07 +0800 Subject: [PATCH 36/56] Rename commands to avoid confusion with core SC2 methods --- examples/terran_marine_rush_build_order.py | 57 +++++++++++++--------- examples/zerg_rush_build_order.py | 26 +++++++--- sc2/build_orders/build_order.py | 4 +- sc2/build_orders/commands.py | 12 ++--- 4 files changed, 57 insertions(+), 42 deletions(-) diff --git a/examples/terran_marine_rush_build_order.py b/examples/terran_marine_rush_build_order.py index da54a4051..af64832b7 100644 --- a/examples/terran_marine_rush_build_order.py +++ b/examples/terran_marine_rush_build_order.py @@ -1,7 +1,7 @@ import sc2 from sc2 import run_game, maps, Race, Difficulty -from sc2.build_orders.build_order import BuildOrder, train -from sc2.build_orders.commands import build, expand, add_supply +from sc2.build_orders.build_order import BuildOrder, train_unit +from sc2.build_orders.commands import construct, expand, add_supply from sc2.constants import * from sc2.player import Bot, Computer from sc2.state_conditions.conditions import all_of, supply_at_least, minerals_at_least, unit_count @@ -15,25 +15,25 @@ class TerranBuildOrderBot(sc2.BotAI): def __init__(self): build_order = [ (supply_at_least(13), add_supply(prioritize=True)), - (supply_at_least(15), build(UnitTypeId.BARRACKS, prioritize=True)), - (supply_at_least(16), build(UnitTypeId.BARRACKS, prioritize=True)), - (supply_at_least(16), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), - (supply_at_least(17), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), - (supply_at_least(18), build(UnitTypeId.BARRACKS, prioritize=True)), - (supply_at_least(18), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), - (supply_at_least(19), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), - (supply_at_least(20), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(15), construct(UnitTypeId.BARRACKS, prioritize=True)), + (supply_at_least(16), construct(UnitTypeId.BARRACKS, prioritize=True)), + (supply_at_least(16), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(17), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(18), construct(UnitTypeId.BARRACKS, prioritize=True)), + (supply_at_least(18), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(19), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(20), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), (supply_at_least(21), add_supply(prioritize=True)), - (supply_at_least(21), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), - (supply_at_least(22), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), - (supply_at_least(23), build(UnitTypeId.BARRACKS, prioritize=True)), - (supply_at_least(23), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), - (supply_at_least(24), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), - (supply_at_least(25), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), - (supply_at_least(26), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), - (supply_at_least(27), build(UnitTypeId.BARRACKS, prioritize=True)), + (supply_at_least(21), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(22), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(23), construct(UnitTypeId.BARRACKS, prioritize=True)), + (supply_at_least(23), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(24), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(25), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(26), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS)), + (supply_at_least(27), construct(UnitTypeId.BARRACKS, prioritize=True)), (all_of(supply_at_least(27), unit_count(UnitTypeId.BARRACKS, 5, include_pending=True)), add_supply(prioritize=True)), - (unit_count(UnitTypeId.BARRACKS, 5), train(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS, repeatable=True)) + (unit_count(UnitTypeId.BARRACKS, 5), train_unit(UnitTypeId.MARINE, on_building=UnitTypeId.BARRACKS, repeatable=True)) ] self.attack = False self.build_order = BuildOrder(self, build_order, worker_count=16) @@ -44,12 +44,21 @@ async def on_step(self, state, iteration): if self.units(UnitTypeId.MARINE).amount >= 15 or self.attack: self.attack = True - for unit in self.units(UnitTypeId.MARINE): + for unit in self.units(UnitTypeId.MARINE).idle: await self.do(unit.attack(self.enemy_start_locations[0])) + if self.known_enemy_structures.exists: + enemy = self.known_enemy_structures.first + await self.do(unit.attack(enemy.position.to2, queue=True)) return -run_game(maps.get("Abyssal Reef LE"), [ - Bot(Race.Terran, TerranBuildOrderBot()), - Computer(Race.Protoss, Difficulty.Medium) -], realtime=False) +def main(): + run_game(maps.get("Abyssal Reef LE"), [ + Bot(Race.Terran, TerranBuildOrderBot()), + # Bot(Race.Terran, TerranBuildOrderBot()), + Computer(Race.Random, Difficulty.Harder) + ], realtime=False) + +if __name__ == '__main__': + main() + diff --git a/examples/zerg_rush_build_order.py b/examples/zerg_rush_build_order.py index f241e61bc..4d3739188 100644 --- a/examples/zerg_rush_build_order.py +++ b/examples/zerg_rush_build_order.py @@ -1,7 +1,7 @@ import sc2 from sc2 import Race, Difficulty -from sc2.build_orders.build_order import train, BuildOrder, morph -from sc2.build_orders.commands import add_gas, build, expand, add_supply +from sc2.build_orders.build_order import train_unit, BuildOrder, morph +from sc2.build_orders.commands import add_gas, construct, expand, add_supply from sc2.constants import * from sc2.player import Bot, Computer from sc2.state_conditions.conditions import supply_at_least, all_of, unit_count, gas_less_than, unit_count_less_than, \ @@ -20,25 +20,32 @@ class ZergRushBot(sc2.BotAI): def __init__(self): self.attack = False + self.mboost_started = False build_order = [ (all_of(supply_at_least(13), unit_count(UnitTypeId.OVERLORD, 1, include_pending=True)), add_supply(prioritize=True)), (all_of(supply_at_least(17), unit_count(UnitTypeId.EXTRACTOR, 0, include_pending=True)), add_gas()), - (all_of(supply_at_least(17), unit_count(UnitTypeId.SPAWNINGPOOL, 0, include_pending=True)), build(UnitTypeId.SPAWNINGPOOL)), + (all_of(supply_at_least(17), unit_count(UnitTypeId.SPAWNINGPOOL, 0, include_pending=True)), construct(UnitTypeId.SPAWNINGPOOL)), (all_of(supply_at_least(17), unit_count(UnitTypeId.HATCHERY, 1, include_pending=True)), expand()), (supply_at_least(18), morph(UnitTypeId.ZERGLING)), - (supply_at_least(19), train(UnitTypeId.QUEEN, on_building=UnitTypeId.HATCHERY, prioritize=True)), + (supply_at_least(19), train_unit(UnitTypeId.QUEEN, on_building=UnitTypeId.HATCHERY, prioritize=True)), (all_of(supply_at_least(21), unit_count(UnitTypeId.OVERLORD, 2, include_pending=True)), add_supply(prioritize=True)), - (all_of(supply_at_least(21), unit_count(UnitTypeId.ROACHWARREN, 0, include_pending=True)), build(UnitTypeId.ROACHWARREN)), + (all_of(supply_at_least(21), unit_count(UnitTypeId.ROACHWARREN, 0, include_pending=True)), construct(UnitTypeId.ROACHWARREN)), (all_of(supply_at_least(20), unit_count(UnitTypeId.OVERLORD, 3, include_pending=True)), add_supply(prioritize=True)), (unit_count_at_least(UnitTypeId.ROACH, 7), morph(UnitTypeId.ZERGLING, repeatable=True)), (unit_count(UnitTypeId.ROACHWARREN, 1), morph(UnitTypeId.ROACH, repeatable=True)) - ] self.build_order = BuildOrder(self, build_order, worker_count=35) async def on_step(self, state, iteration): await self.distribute_workers() + + if self.vespene >= 100: + sp = self.units(UnitTypeId.SPAWNINGPOOL).ready + if sp.exists and self.minerals >= 100 and not self.mboost_started: + await self.do(sp.first(AbilityId.RESEARCH_ZERGLINGMETABOLICBOOST)) + self.mboost_started = True + await self.build_order.execute_build(state) for queen in self.units(UnitTypeId.QUEEN).idle: @@ -48,14 +55,17 @@ async def on_step(self, state, iteration): if (self.units(UnitTypeId.ROACH).amount >= 7 and self.units(UnitTypeId.ZERGLING).amount >= 10) or self.attack: self.attack = True - for unit in self.units(UnitTypeId.ZERGLING) | self.units(UnitTypeId.ROACH): + for unit in self.units(UnitTypeId.ZERGLING).ready.idle | self.units(UnitTypeId.ROACH).ready.idle: await self.do(unit.attack(self.enemy_start_locations[0])) + if self.known_enemy_structures.exists: + enemy = self.known_enemy_structures.first + await self.do(unit.attack(enemy.position.to2, queue=True)) return def main(): sc2.run_game(sc2.maps.get("Abyssal Reef LE"), [ Bot(Race.Zerg, ZergRushBot()), - Computer(Race.Terran, Difficulty.Medium) + Computer(Race.Random, Difficulty.Hard) ], realtime=False) if __name__ == '__main__': diff --git a/sc2/build_orders/build_order.py b/sc2/build_orders/build_order.py index 16822eeea..999726954 100644 --- a/sc2/build_orders/build_order.py +++ b/sc2/build_orders/build_order.py @@ -1,5 +1,5 @@ from sc2 import Race, race_worker, ActionResult, race_townhalls -from sc2.build_orders.commands import add_supply, morph, train +from sc2.build_orders.commands import add_supply, morph, train_unit from sc2.state_conditions.conditions import always_true @@ -37,5 +37,5 @@ async def execute_build(self, state): if bot.race == Race.Zerg: return await morph(race_worker[Race.Zerg]).execute(bot, state) else: - return await train(race_worker[bot.race], race_townhalls[self.bot.race]).execute(bot, state) + return await train_unit(race_worker[bot.race], race_townhalls[self.bot.race]).execute(bot, state) return None diff --git a/sc2/build_orders/commands.py b/sc2/build_orders/commands.py index 998052f66..a7699e221 100644 --- a/sc2/build_orders/commands.py +++ b/sc2/build_orders/commands.py @@ -34,7 +34,7 @@ async def do_expand(bot, state): return Command(do_expand, priority=prioritize, repeatable=repeatable) -def train(unit, on_building, prioritize=False, repeatable=False): +def train_unit(unit, on_building, prioritize=False, repeatable=False): async def do_train(bot, state): buildings = bot.units(on_building).ready.noqueue if buildings.exists: @@ -68,15 +68,11 @@ async def do_morph(bot, state): return Command(do_morph, priority=prioritize, repeatable=repeatable) -def build(building, around_building=None, placement=None, prioritize=True, repeatable=False): +def construct(building, placement=None, prioritize=True, repeatable=False): async def do_build(bot, state): - if not around_building: - around = bot.townhalls.first - else: - around = around_building(bot, state) if not placement: - location = around.position.towards(bot.game_info.map_center, 5) + location = bot.townhalls.first.position.towards(bot.game_info.map_center, 5) else: location = placement @@ -97,7 +93,7 @@ async def supply_spec(bot, state): if bot.race == Race.Zerg: return await morph(bot.supply_type).execute(bot, state) else: - return await build(bot.supply_type).execute(bot, state) + return await construct(bot.supply_type).execute(bot, state) else: return can_afford.action_result From e5518ac8d19eb8e10cdab5bb2282f2f24c36bbf8 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Tue, 30 Jan 2018 19:06:39 +0800 Subject: [PATCH 37/56] Use the installed StarCraft 2 stableid.json for ids This would be a much more complete and reliable way of obtaining IDs. --- generate_id_constants.py | 2 +- generate_id_constants_from_stableid.py | 91 ++ sc2/ids/__init__.py | 4 +- sc2/ids/ability_id.py | 1446 +++++++++++------- sc2/ids/buff_id.py | 246 ++- sc2/ids/effect_id.py | 22 + sc2/ids/unit_typeid.py | 1925 +++++++++++++++++++++--- sc2/ids/upgrade_id.py | 214 ++- 8 files changed, 3204 insertions(+), 746 deletions(-) create mode 100644 generate_id_constants_from_stableid.py create mode 100644 sc2/ids/effect_id.py diff --git a/generate_id_constants.py b/generate_id_constants.py index a97061dca..5d3988204 100644 --- a/generate_id_constants.py +++ b/generate_id_constants.py @@ -16,7 +16,7 @@ def clike_enum_parse(code): # parse enum blocks enums = {} - for enum in re.findall(r"enum(?: class)? ([a-zA-Z_][a-zA-Z0-9_]*) \{\s?(.+?)\s?}", code): + for enum in re.findall(r"enum(?: class)? ([a-zA-Z_][a-zA-Z0-9_]*) {\s?(.+?)\s?}", code): name, body = enum body = {key: int(value) for key, value in re.findall(r"([a-zA-Z_][a-zA-Z0-9_]*) = (\d+),?\s?", body)} enums[name] = body diff --git a/generate_id_constants_from_stableid.py b/generate_id_constants_from_stableid.py new file mode 100644 index 000000000..012272ab1 --- /dev/null +++ b/generate_id_constants_from_stableid.py @@ -0,0 +1,91 @@ +import json +from pathlib import Path +import platform + +HEADER = f"# DO NOT EDIT!\n# This file was automatically generated by \"{__file__}\"\n" + + +PF = platform.system() + +HOME_DIR = str(Path.home()) +DATA_JSON = { + "Darwin": HOME_DIR + "/Library/Application Support/Blizzard/StarCraft II/stableid.json", + "Windows": HOME_DIR + "/Documents/StarCraft II/stableid.json" +} + +ENUM_TRANSLATE = { + "Units": "UnitTypeId", + "Abilities": "AbilityId", + "Upgrades": "UpgradeId", + "Buffs": "BuffId", + "Effects": "EffectId" +} + +FILE_TRANSLATE = { + "Units": "unit_typeid", + "Abilities": "ability_id", + "Upgrades": "upgrade_id", + "Buffs": "buff_id", + "Effects": "effect_id" +} + + +def clike_enum_parse(data): + enums = {} + for d in data: # Units, Abilities, Upgrades, Buffs, Effects + body = {} + for v in data[d]: + key = v['name'] + if not key: + continue + if key[0].isdigit(): + key = "_" + key + + key = key.upper().replace(" ", "_") + body[key] = v['id'] + enums[d] = body + return enums + + +def generate_python_code(enums): + assert {"Units", "Abilities", "Upgrades", "Buffs", "Effects"} <= enums.keys() + + sc2dir = Path("sc2/") + idsdir = (sc2dir / "ids") + idsdir.mkdir(exist_ok=True) + + with (idsdir / "__init__.py").open("w") as f: + f.write("\n".join([ + HEADER, + f"__all__ = {[n.lower() for n in enums.keys()] !r}\n" + ])) + + for name, body in enums.items(): + class_name = ENUM_TRANSLATE[name] + + code = [ + HEADER, + "import enum", + "", + f"class {class_name}(enum.Enum):" + ] + + for key, value in sorted(body.items(), key=lambda p: p[1]): + + code.append(f" {key} = {value}") + + code += [ + "", + f"for item in {class_name}:", + f" globals()[item.name] = item", + "" + ] + + with (idsdir / FILE_TRANSLATE[name]).with_suffix(".py").open("w") as f: + f.write("\n".join(code)) + + +if __name__ == '__main__': + with open(DATA_JSON[PF], encoding='utf-8') as data_file: + data = json.loads(data_file.read()) + generate_python_code(clike_enum_parse(data)) diff --git a/sc2/ids/__init__.py b/sc2/ids/__init__.py index 1b0937177..84d2f6e33 100644 --- a/sc2/ids/__init__.py +++ b/sc2/ids/__init__.py @@ -1,4 +1,4 @@ # DO NOT EDIT! -# This file was automatically generated by "generate_id_constants.py" +# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" -__all__ = ['unit_typeid', 'ability_id', 'upgrade_id', 'buff_id'] +__all__ = ['units', 'abilities', 'upgrades', 'buffs', 'effects'] diff --git a/sc2/ids/ability_id.py b/sc2/ids/ability_id.py index d273e7e4d..7c3a0cfb5 100644 --- a/sc2/ids/ability_id.py +++ b/sc2/ids/ability_id.py @@ -1,544 +1,942 @@ # DO NOT EDIT! -# This file was automatically generated by "generate_id_constants.py" +# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" import enum class AbilityId(enum.Enum): - INVALID = 0 - SMART = 1 - STOP_STOP = 4 - STOP_CHEER = 6 - STOP_DANCE = 7 - MOVE = 16 - PATROL = 17 - HOLDPOSITION = 18 - SCAN_MOVE = 19 - ATTACK_ATTACK = 23 - SPRAY_TERRAN = 26 - EFFECT_SPRAY_TERRAN = 26 - SPRAY_ZERG = 28 - EFFECT_SPRAY_ZERG = 28 - SPRAY_PROTOSS = 30 - EFFECT_SPRAY_PROTOSS = 30 - SALVAGE = 32 - EFFECT_SALVAGE = 32 - BEHAVIOR_HOLDFIREON_GHOST = 36 - EXPLODE = 42 - EFFECT_EXPLODE = 42 - RESEARCH_INTERCEPTORGRAVITONCATAPULT = 44 - RESEARCH_PHOENIXANIONPULSECRYSTALS = 46 - FUNGALGROWTH = 74 - EFFECT_FUNGALGROWTH = 74 - GUARDIANSHIELD = 76 - EFFECT_GUARDIANSHIELD = 76 - REPAIR_MULE = 78 - EFFECT_REPAIR_MULE = 78 - TRAIN_BANELING = 80 - TRAIN_MOTHERSHIP = 110 - FEEDBACK = 140 - EFFECT_FEEDBACK = 140 - POINTDEFENSEDRONE = 144 - EFFECT_POINTDEFENSEDRONE = 144 - HALLUCINATION_ARCHON = 146 - HALLUCINATION_COLOSSUS = 148 - HALLUCINATION_HIGHTEMPLAR = 150 - HALLUCINATION_IMMORTAL = 152 - HALLUCINATION_PHOENIX = 154 - HALLUCINATION_PROBE = 156 - HALLUCINATION_STALKER = 158 - HALLUCINATION_VOIDRAY = 160 - HALLUCINATION_WARPPRISM = 162 - HALLUCINATION_ZEALOT = 164 - HARVEST_RETURN_MULE = 167 - HUNTERSEEKERMISSILE = 169 - EFFECT_HUNTERSEEKERMISSILE = 169 - CALLDOWNMULE = 171 - EFFECT_CALLDOWNMULE = 171 - GRAVITONBEAM = 173 - EFFECT_GRAVITONBEAM = 173 - CANCEL_GRAVITONBEAM = 174 - SPAWNCHANGELING = 181 - EFFECT_SPAWNCHANGELING = 181 - RALLY_BUILDING = 195 - RALLY_MORPHING_UNIT = 199 - RALLY_COMMANDCENTER = 203 - RALLY_NEXUS = 207 - RALLY_HATCHERY_WORKERS = 211 - RALLY_HATCHERY_UNITS = 212 - RESEARCH_GLIALREGENERATION = 216 - RESEARCH_TUNNELINGCLAWS = 217 - INFESTEDTERRANS = 247 - EFFECT_INFESTEDTERRANS = 247 - NEURALPARASITE = 249 - EFFECT_NEURALPARASITE = 249 - INJECTLARVA = 251 - EFFECT_INJECTLARVA = 251 - STIM_MARAUDER = 253 - EFFECT_STIM_MARAUDER = 253 - SUPPLYDROP = 255 - EFFECT_SUPPLYDROP = 255 - CHRONOBOOST = 261 - EFFECT_CHRONOBOOST = 261 - RESEARCH_CHITINOUSPLATING = 265 - HARVEST_GATHER_SCV = 295 - HARVEST_RETURN_SCV = 296 - HARVEST_GATHER_PROBE = 298 - HARVEST_RETURN_PROBE = 299 - CANCEL_QUEUE1 = 304 - CANCELSLOT_QUEUE1 = 305 - CANCEL_QUEUE5 = 306 - CANCELSLOT_QUEUE5 = 307 - CANCEL_QUEUECANCELTOSELECTION = 308 - CANCELSLOT_QUEUECANCELTOSELECTION = 309 - CANCEL_QUEUEADDON = 312 - CANCELSLOT_ADDON = 313 - CANCEL_BUILDINPROGRESS = 314 - HALT_BUILDING = 315 - REPAIR_SCV = 316 - EFFECT_REPAIR_SCV = 316 - BUILD_COMMANDCENTER = 318 - BUILD_SUPPLYDEPOT = 319 - BUILD_REFINERY = 320 - BUILD_BARRACKS = 321 - BUILD_ENGINEERINGBAY = 322 - BUILD_MISSILETURRET = 323 - BUILD_BUNKER = 324 - BUILD_SENSORTOWER = 326 - BUILD_GHOSTACADEMY = 327 - BUILD_FACTORY = 328 - BUILD_STARPORT = 329 - BUILD_ARMORY = 331 - BUILD_FUSIONCORE = 333 - HALT_TERRANBUILD = 348 - STIM_MARINE = 380 - EFFECT_STIM_MARINE = 380 - BEHAVIOR_CLOAKON_GHOST = 382 - BEHAVIOR_CLOAKOFF_GHOST = 383 - HEAL = 386 - EFFECT_HEAL = 386 - MORPH_SIEGEMODE = 388 - MORPH_UNSIEGE = 390 - BEHAVIOR_CLOAKON_BANSHEE = 392 - BEHAVIOR_CLOAKOFF_BANSHEE = 393 - LOAD_MEDIVAC = 394 - UNLOADALLAT_MEDIVAC = 396 - UNLOADUNIT_MEDIVAC = 397 - SCAN = 399 - EFFECT_SCAN = 399 - YAMATOGUN = 401 - EFFECT_YAMATOGUN = 401 - MORPH_VIKINGASSAULTMODE = 403 - MORPH_VIKINGFIGHTERMODE = 405 - LOAD_BUNKER = 407 - UNLOADALL_BUNKER = 408 - UNLOADUNIT_BUNKER = 410 - UNLOADALL_COMMANDCENTER = 413 - UNLOADUNIT_COMMANDCENTER = 415 - LOADALL_COMMANDCENTER = 416 - LIFT_COMMANDCENTER = 417 - LAND_COMMANDCENTER = 419 - BUILD_TECHLAB_BARRACKS = 421 - BUILD_REACTOR_BARRACKS = 422 - CANCEL_BARRACKSADDON = 451 - LIFT_BARRACKS = 452 - BUILD_TECHLAB_FACTORY = 454 - BUILD_REACTOR_FACTORY = 455 - CANCEL_FACTORYADDON = 484 - LIFT_FACTORY = 485 - BUILD_TECHLAB_STARPORT = 487 - BUILD_REACTOR_STARPORT = 488 - CANCEL_STARPORTADDON = 517 - LIFT_STARPORT = 518 - LAND_FACTORY = 520 - LAND_STARPORT = 522 - TRAIN_SCV = 524 - LAND_BARRACKS = 554 - MORPH_SUPPLYDEPOT_LOWER = 556 - MORPH_SUPPLYDEPOT_RAISE = 558 - TRAIN_MARINE = 560 - TRAIN_REAPER = 561 - TRAIN_GHOST = 562 - TRAIN_MARAUDER = 563 - TRAIN_SIEGETANK = 591 - TRAIN_THOR = 594 - TRAIN_HELLION = 595 - TRAIN_HELLBAT = 596 - TRAIN_CYCLONE = 597 - TRAIN_WIDOWMINE = 614 - TRAIN_MEDIVAC = 620 - TRAIN_BANSHEE = 621 - TRAIN_RAVEN = 622 - TRAIN_BATTLECRUISER = 623 - TRAIN_VIKINGFIGHTER = 624 - TRAIN_LIBERATOR = 626 - RESEARCH_HISECAUTOTRACKING = 650 - RESEARCH_TERRANSTRUCTUREARMORUPGRADE = 651 - RESEARCH_TERRANINFANTRYWEAPONSLEVEL1 = 652 - RESEARCH_TERRANINFANTRYWEAPONSLEVEL2 = 653 - RESEARCH_TERRANINFANTRYWEAPONSLEVEL3 = 654 - RESEARCH_NEOSTEELFRAME = 655 - RESEARCH_TERRANINFANTRYARMORLEVEL1 = 656 - RESEARCH_TERRANINFANTRYARMORLEVEL2 = 657 - RESEARCH_TERRANINFANTRYARMORLEVEL3 = 658 - BUILD_NUKE = 710 - RESEARCH_STIMPACK = 730 - RESEARCH_COMBATSHIELD = 731 - RESEARCH_CONCUSSIVESHELLS = 732 - RESEARCH_INFERNALPREIGNITER = 761 - RESEARCH_DRILLINGCLAWS = 764 - RESEARCH_MAGFIELDLAUNCHERS = 766 - RESEARCH_SMARTSERVOS = 766 - RESEARCH_RAPIDFIRELAUNCHERS = 768 - RESEARCH_BANSHEECLOAKINGFIELD = 790 - RESEARCH_RAVENCORVIDREACTOR = 793 - RESEARCH_BANSHEEHYPERFLIGHTROTORS = 799 - RESEARCH_RAVENRECALIBRATEDEXPLOSIVES = 803 - RESEARCH_HIGHCAPACITYFUELTANKS = 804 - RESEARCH_ADVANCEDBALLISTICS = 805 - RESEARCH_ENHANCEDMUNITIONS = 806 - RESEARCH_PERSONALCLOAKING = 820 - RESEARCH_TERRANVEHICLEWEAPONSLEVEL1 = 855 - RESEARCH_TERRANVEHICLEWEAPONSLEVEL2 = 856 - RESEARCH_TERRANVEHICLEWEAPONSLEVEL3 = 857 - RESEARCH_TERRANSHIPWEAPONSLEVEL1 = 861 - RESEARCH_TERRANSHIPWEAPONSLEVEL2 = 862 - RESEARCH_TERRANSHIPWEAPONSLEVEL3 = 863 - RESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL1 = 864 - RESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL2 = 865 - RESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL3 = 866 - BUILD_NEXUS = 880 - BUILD_PYLON = 881 - BUILD_ASSIMILATOR = 882 - BUILD_GATEWAY = 883 - BUILD_FORGE = 884 - BUILD_FLEETBEACON = 885 - BUILD_TWILIGHTCOUNCIL = 886 - BUILD_PHOTONCANNON = 887 - BUILD_STARGATE = 889 - BUILD_TEMPLARARCHIVE = 890 - BUILD_DARKSHRINE = 891 - BUILD_ROBOTICSBAY = 892 - BUILD_ROBOTICSFACILITY = 893 - BUILD_CYBERNETICSCORE = 894 - BUILD_SHIELDBATTERY = 895 - UNLOADALLAT_WARPPRISM = 913 - UNLOADUNIT_WARPPRISM = 914 - TRAIN_ZEALOT = 916 - TRAIN_STALKER = 917 - TRAIN_HIGHTEMPLAR = 919 - TRAIN_DARKTEMPLAR = 920 - TRAIN_SENTRY = 921 - TRAIN_ADEPT = 922 - TRAIN_PHOENIX = 946 - TRAIN_CARRIER = 948 - TRAIN_VOIDRAY = 950 - TRAIN_ORACLE = 954 - TRAIN_TEMPEST = 955 - TRAIN_WARPPRISM = 976 - TRAIN_OBSERVER = 977 - TRAIN_COLOSSUS = 978 - TRAIN_IMMORTAL = 979 - TRAIN_DISRUPTOR = 994 - TRAIN_PROBE = 1006 - PSISTORM = 1036 - EFFECT_PSISTORM = 1036 - BUILD_INTERCEPTORS = 1042 - RESEARCH_PROTOSSGROUNDWEAPONSLEVEL1 = 1062 - RESEARCH_PROTOSSGROUNDWEAPONSLEVEL2 = 1063 - RESEARCH_PROTOSSGROUNDWEAPONSLEVEL3 = 1064 - RESEARCH_PROTOSSGROUNDARMORLEVEL1 = 1065 - RESEARCH_PROTOSSGROUNDARMORLEVEL2 = 1066 - RESEARCH_PROTOSSGROUNDARMORLEVEL3 = 1067 - RESEARCH_PROTOSSSHIELDSLEVEL1 = 1068 - RESEARCH_PROTOSSSHIELDSLEVEL2 = 1069 - RESEARCH_PROTOSSSHIELDSLEVEL3 = 1070 - RESEARCH_GRAVITICBOOSTER = 1093 - RESEARCH_GRAVITICDRIVE = 1094 - RESEARCH_EXTENDEDTHERMALLANCE = 1097 - RESEARCH_PSISTORM = 1126 - BUILD_HATCHERY = 1152 - BUILD_EXTRACTOR = 1154 - BUILD_SPAWNINGPOOL = 1155 - BUILD_EVOLUTIONCHAMBER = 1156 - BUILD_HYDRALISKDEN = 1157 - BUILD_SPIRE = 1158 - BUILD_ULTRALISKCAVERN = 1159 - BUILD_INFESTATIONPIT = 1160 - BUILD_NYDUSNETWORK = 1161 - BUILD_BANELINGNEST = 1162 - BUILD_ROACHWARREN = 1165 - BUILD_SPINECRAWLER = 1166 - BUILD_SPORECRAWLER = 1167 - HARVEST_GATHER_DRONE = 1183 - HARVEST_RETURN_DRONE = 1184 - RESEARCH_ZERGMELEEWEAPONSLEVEL1 = 1186 - RESEARCH_ZERGMELEEWEAPONSLEVEL2 = 1187 - RESEARCH_ZERGMELEEWEAPONSLEVEL3 = 1188 - RESEARCH_ZERGGROUNDARMORLEVEL1 = 1189 - RESEARCH_ZERGGROUNDARMORLEVEL2 = 1190 - RESEARCH_ZERGGROUNDARMORLEVEL3 = 1191 - RESEARCH_ZERGMISSILEWEAPONSLEVEL1 = 1192 - RESEARCH_ZERGMISSILEWEAPONSLEVEL2 = 1193 - RESEARCH_ZERGMISSILEWEAPONSLEVEL3 = 1194 - MORPH_LAIR = 1216 - CANCEL_MORPHLAIR = 1217 - MORPH_HIVE = 1218 - MORPH_GREATERSPIRE = 1220 - RESEARCH_PNEUMATIZEDCARAPACE = 1223 - RESEARCH_BURROW = 1225 - RESEARCH_ZERGLINGADRENALGLANDS = 1252 - RESEARCH_ZERGLINGMETABOLICBOOST = 1253 - RESEARCH_GROOVEDSPINES = 1282 - RESEARCH_MUSCULARAUGMENTS = 1283 - RESEARCH_ZERGFLYERATTACKLEVEL1 = 1312 - RESEARCH_ZERGFLYERATTACKLEVEL2 = 1313 - RESEARCH_ZERGFLYERATTACKLEVEL3 = 1314 - RESEARCH_ZERGFLYERARMORLEVEL1 = 1315 - RESEARCH_ZERGFLYERARMORLEVEL2 = 1316 - RESEARCH_ZERGFLYERARMORLEVEL3 = 1317 - TRAIN_DRONE = 1342 - TRAIN_ZERGLING = 1343 - TRAIN_OVERLORD = 1344 - TRAIN_HYDRALISK = 1345 - TRAIN_MUTALISK = 1346 - TRAIN_ULTRALISK = 1348 - TRAIN_ROACH = 1351 - TRAIN_INFESTOR = 1352 - TRAIN_CORRUPTOR = 1353 - TRAIN_VIPER = 1354 - TRAIN_SWARMHOST = 1356 - MORPH_BROODLORD = 1372 - CANCEL_MORPHBROODLORD = 1373 - BURROWDOWN_BANELING = 1374 - BURROWUP_BANELING = 1376 - BURROWDOWN_DRONE = 1378 - BURROWUP_DRONE = 1380 - BURROWDOWN_HYDRALISK = 1382 - BURROWUP_HYDRALISK = 1384 - BURROWDOWN_ROACH = 1386 - BURROWUP_ROACH = 1388 - BURROWDOWN_ZERGLING = 1390 - BURROWUP_ZERGLING = 1392 - UNLOADALLAT_OVERLORD = 1408 - UNLOADUNIT_OVERLORD = 1409 - TRAINWARP_ZEALOT = 1413 - TRAINWARP_STALKER = 1414 - TRAINWARP_HIGHTEMPLAR = 1416 - TRAINWARP_DARKTEMPLAR = 1417 - TRAINWARP_SENTRY = 1418 - TRAINWARP_ADEPT = 1419 - BURROWDOWN_QUEEN = 1433 - BURROWUP_QUEEN = 1435 - UNLOADALL_NYDASNETWORK = 1438 - UNLOADUNIT_NYDASNETWORK = 1440 - BLINK_STALKER = 1442 - EFFECT_BLINK_STALKER = 1442 - BURROWDOWN_INFESTOR = 1444 - BURROWUP_INFESTOR = 1446 - MORPH_OVERSEER = 1448 - CANCEL_MORPHOVERSEER = 1449 - MORPH_PLANETARYFORTRESS = 1450 - CANCEL_MORPHPLANETARYFORTRESS = 1451 - RESEARCH_PATHOGENGLANDS = 1454 - RESEARCH_NEURALPARASITE = 1455 - RESEARCH_CENTRIFUGALHOOKS = 1482 - MORPH_ORBITALCOMMAND = 1516 - CANCEL_MORPHORBITAL = 1517 - MORPH_WARPGATE = 1518 - MORPH_GATEWAY = 1520 - LIFT_ORBITALCOMMAND = 1522 - LAND_ORBITALCOMMAND = 1524 - FORCEFIELD = 1526 - EFFECT_FORCEFIELD = 1526 - MORPH_WARPPRISMPHASINGMODE = 1528 - MORPH_WARPPRISMTRANSPORTMODE = 1530 - RESEARCH_BATTLECRUISERWEAPONREFIT = 1532 - RESEARCH_PROTOSSAIRWEAPONSLEVEL1 = 1562 - RESEARCH_PROTOSSAIRWEAPONSLEVEL2 = 1563 - RESEARCH_PROTOSSAIRWEAPONSLEVEL3 = 1564 - RESEARCH_PROTOSSAIRARMORLEVEL1 = 1565 - RESEARCH_PROTOSSAIRARMORLEVEL2 = 1566 - RESEARCH_PROTOSSAIRARMORLEVEL3 = 1567 - RESEARCH_WARPGATE = 1568 - RESEARCH_CHARGE = 1592 - RESEARCH_BLINK = 1593 - RESEARCH_ADEPTRESONATINGGLAIVES = 1594 - NUKECALLDOWN = 1622 - EFFECT_NUKECALLDOWN = 1622 - EMP = 1628 - EFFECT_EMP = 1628 - TRAIN_QUEEN = 1632 - TRANSFUSION = 1664 - EFFECT_TRANSFUSION = 1664 - ATTACK_REDIRECT = 1682 - STIM_MARINE_REDIRECT = 1683 - EFFECT_STIM_MARINE_REDIRECT = 1683 - STOP_REDIRECT = 1691 - BEHAVIOR_GENERATECREEPON = 1692 - BEHAVIOR_GENERATECREEPOFF = 1693 - BUILD_CREEPTUMOR_QUEEN = 1694 - MORPH_SPINECRAWLERUPROOT = 1725 - MORPH_SPORECRAWLERUPROOT = 1727 - MORPH_SPINECRAWLERROOT = 1729 - CANCEL_SPINECRAWLERROOT = 1730 - MORPH_SPORECRAWLERROOT = 1731 - BUILD_CREEPTUMOR_TUMOR = 1733 - CANCEL_CREEPTUMOR = 1763 - AUTOTURRET = 1764 - EFFECT_AUTOTURRET = 1764 - MORPH_ARCHON = 1766 - BUILD_NYDUSWORM = 1768 + NULL = 0 + TAUNT = 3 + HOLDFIRE = 15 + MOVE = 20 + BEACON = 22 + ATTACK = 25 + SPRAYTERRAN = 27 + SPRAYZERG = 29 + SPRAYPROTOSS = 31 + SALVAGESHARED = 33 + CORRUPTION = 35 + GHOSTHOLDFIRE = 37 + GHOSTWEAPONSFREE = 39 + MORPHTOINFESTEDTERRAN = 41 + EXPLODE = 43 + FLEETBEACONRESEARCH = 73 + FUNGALGROWTH = 75 + GUARDIANSHIELD = 77 + MULEREPAIR = 79 + MORPHZERGLINGTOBANELING = 109 + NEXUSTRAINMOTHERSHIP = 139 + FEEDBACK = 141 + MASSRECALL = 143 + PLACEPOINTDEFENSEDRONE = 145 + HALLUCINATIONARCHON = 147 + HALLUCINATIONCOLOSSUS = 149 + HALLUCINATIONHIGHTEMPLAR = 151 + HALLUCINATIONIMMORTAL = 153 + HALLUCINATIONPHOENIX = 155 + HALLUCINATIONPROBE = 157 + HALLUCINATIONSTALKER = 159 + HALLUCINATIONVOIDRAY = 161 + HALLUCINATIONWARPPRISM = 163 + HALLUCINATIONZEALOT = 165 + MULEGATHER = 168 + SEEKERMISSILE = 170 + CALLDOWNMULE = 172 + GRAVITONBEAM = 174 + BUILDINPROGRESSNYDUSCANAL = 176 + SIPHON = 178 + LEECH = 180 + SPAWNCHANGELING = 182 + DISGUISEASZEALOT = 184 + DISGUISEASMARINEWITHSHIELD = 186 + DISGUISEASMARINEWITHOUTSHIELD = 188 + DISGUISEASZERGLINGWITHWINGS = 190 + DISGUISEASZERGLINGWITHOUTWINGS = 192 + PHASESHIFT = 194 + RALLY = 198 + PROGRESSRALLY = 202 + RALLYCOMMAND = 206 + RALLYNEXUS = 210 + RALLYHATCHERY = 214 + ROACHWARRENRESEARCH = 244 + SAPSTRUCTURE = 246 + INFESTEDTERRANS = 248 + NEURALPARASITE = 250 + SPAWNLARVA = 252 + STIMPACKMARAUDER = 254 + SUPPLYDROP = 256 + _250MMSTRIKECANNONS = 258 + TEMPORALRIFT = 260 + TIMEWARP = 262 + ULTRALISKCAVERNRESEARCH = 292 + WORMHOLETRANSIT = 294 + SCVHARVEST = 297 + PROBEHARVEST = 300 + ATTACKWARPPRISM = 303 + QUE1 = 305 + QUE5 = 307 + QUE5CANCELTOSELECTION = 309 + QUE5LONGBLEND = 311 + QUE5ADDON = 313 + BUILDINPROGRESS = 315 + REPAIR = 317 + TERRANBUILD = 348 + RAVENBUILD = 379 + STIMPACK = 381 + GHOSTCLOAK = 383 + SNIPE = 385 + MEDIVACHEAL = 387 + SIEGEMODE = 389 + UNSIEGE = 391 + BANSHEECLOAK = 393 + MEDIVACTRANSPORT = 398 + SCANNERSWEEP = 400 + YAMATO = 402 + ASSAULTMODE = 404 + FIGHTERMODE = 406 + BUNKERTRANSPORT = 411 + COMMANDCENTERTRANSPORT = 416 + COMMANDCENTERLIFTOFF = 418 + COMMANDCENTERLAND = 420 + BARRACKSADDONS = 451 + BARRACKSLIFTOFF = 453 + FACTORYADDONS = 484 + FACTORYLIFTOFF = 486 + STARPORTADDONS = 517 + STARPORTLIFTOFF = 519 + FACTORYLAND = 521 + STARPORTLAND = 523 + COMMANDCENTERTRAIN = 553 + BARRACKSLAND = 555 + SUPPLYDEPOTLOWER = 557 + SUPPLYDEPOTRAISE = 559 + BARRACKSTRAIN = 589 + FACTORYTRAIN = 619 + STARPORTTRAIN = 649 + ENGINEERINGBAYRESEARCH = 679 + MERCCOMPOUNDRESEARCH = 709 + ARMSILOWITHNUKE = 729 + BARRACKSTECHLABRESEARCH = 759 + FACTORYTECHLABRESEARCH = 789 + STARPORTTECHLABRESEARCH = 819 + GHOSTACADEMYRESEARCH = 849 + ARMORYRESEARCH = 879 + PROTOSSBUILD = 910 + WARPPRISMTRANSPORT = 915 + GATEWAYTRAIN = 945 + STARGATETRAIN = 975 + ROBOTICSFACILITYTRAIN = 1005 + NEXUSTRAIN = 1035 + PSISTORM = 1037 + HANGARQUEUE5 = 1039 + BROODLORDQUEUE2 = 1041 + CARRIERHANGAR = 1061 + FORGERESEARCH = 1091 + ROBOTICSBAYRESEARCH = 1121 + TEMPLARARCHIVESRESEARCH = 1151 + ZERGBUILD = 1182 + DRONEHARVEST = 1185 + EVOLUTIONCHAMBERRESEARCH = 1215 + UPGRADETOLAIR = 1217 + UPGRADETOHIVE = 1219 + UPGRADETOGREATERSPIRE = 1221 + LAIRRESEARCH = 1251 + SPAWNINGPOOLRESEARCH = 1281 + HYDRALISKDENRESEARCH = 1311 + SPIRERESEARCH = 1341 + LARVATRAIN = 1371 + MORPHTOBROODLORD = 1373 + BURROWBANELINGDOWN = 1375 + BURROWBANELINGUP = 1377 + BURROWDRONEDOWN = 1379 + BURROWDRONEUP = 1381 + BURROWHYDRALISKDOWN = 1383 + BURROWHYDRALISKUP = 1385 + BURROWROACHDOWN = 1387 + BURROWROACHUP = 1389 + BURROWZERGLINGDOWN = 1391 + BURROWZERGLINGUP = 1393 + BURROWINFESTORTERRANDOWN = 1395 + BURROWINFESTORTERRANUP = 1397 + REDSTONELAVACRITTERBURROW = 1399 + REDSTONELAVACRITTERINJUREDBURROW = 1401 + REDSTONELAVACRITTERUNBURROW = 1403 + REDSTONELAVACRITTERINJUREDUNBURROW = 1405 + OVERLORDTRANSPORT = 1410 + MERGEABLE = 1411 + WARPABLE = 1412 + WARPGATETRAIN = 1432 + BURROWQUEENDOWN = 1434 + BURROWQUEENUP = 1436 + NYDUSCANALTRANSPORT = 1441 + BLINK = 1443 + BURROWINFESTORDOWN = 1445 + BURROWINFESTORUP = 1447 + MORPHTOOVERSEER = 1449 + UPGRADETOPLANETARYFORTRESS = 1451 + INFESTATIONPITRESEARCH = 1481 + BANELINGNESTRESEARCH = 1511 + BURROWULTRALISKDOWN = 1513 + BURROWULTRALISKUP = 1515 + UPGRADETOORBITAL = 1517 + UPGRADETOWARPGATE = 1519 + MORPHBACKTOGATEWAY = 1521 + ORBITALLIFTOFF = 1523 + ORBITALCOMMANDLAND = 1525 + FORCEFIELD = 1527 + PHASINGMODE = 1529 + TRANSPORTMODE = 1531 + FUSIONCORERESEARCH = 1561 + CYBERNETICSCORERESEARCH = 1591 + TWILIGHTCOUNCILRESEARCH = 1621 + TACNUKESTRIKE = 1623 + SALVAGEBUNKERREFUND = 1625 + SALVAGEBUNKER = 1627 + EMP = 1629 + VORTEX = 1631 + TRAINQUEEN = 1661 + BURROWCREEPTUMORDOWN = 1663 + TRANSFUSION = 1665 + TECHLABMORPH = 1667 + BARRACKSTECHLABMORPH = 1669 + FACTORYTECHLABMORPH = 1671 + STARPORTTECHLABMORPH = 1673 + REACTORMORPH = 1675 + BARRACKSREACTORMORPH = 1677 + FACTORYREACTORMORPH = 1679 + STARPORTREACTORMORPH = 1681 + ATTACKREDIRECT = 1682 + STIMPACKREDIRECT = 1683 + STIMPACKMARAUDERREDIRECT = 1684 + BURROWEDSTOP = 1690 + STOPREDIRECT = 1691 + GENERATECREEP = 1693 + QUEENBUILD = 1724 + SPINECRAWLERUPROOT = 1726 + SPORECRAWLERUPROOT = 1728 + SPINECRAWLERROOT = 1730 + SPORECRAWLERROOT = 1732 + CREEPTUMORBUILD = 1763 + BUILDAUTOTURRET = 1765 + ARCHONWARP = 1767 + BUILDNYDUSCANAL = 1798 + BROODLORDHANGAR = 1818 CHARGE = 1819 - EFFECT_CHARGE = 1819 - CONTAMINATE = 1825 - EFFECT_CONTAMINATE = 1825 - CANCEL_QUEUEPASIVE = 1831 - CANCELSLOT_QUEUEPASSIVE = 1832 - CANCEL_QUEUEPASSIVECANCELTOSELECTION = 1833 - MORPH_MOTHERSHIP = 1847 - CANCEL_MORPHMOTHERSHIP = 1848 - TRAIN_MOTHERSHIPCORE = 1853 - MASSRECALL_MOTHERSHIPCORE = 1974 - EFFECT_MASSRECALL_MOTHERSHIPCORE = 1974 - MORPH_HELLION = 1978 - MORPH_HELLBAT = 1998 - BURROWDOWN_SWARMHOST = 2014 - BURROWUP_SWARMHOST = 2016 - ATTACK_ATTACKBUILDING = 2048 - STOP_BUILDING = 2057 - BLINDINGCLOUD = 2063 - EFFECT_BLINDINGCLOUD = 2063 - ABDUCT = 2067 - EFFECT_ABDUCT = 2067 - VIPERCONSUME = 2073 - EFFECT_VIPERCONSUME = 2073 - BEHAVIOR_BUILDINGATTACKON = 2081 - BEHAVIOR_BUILDINGATTACKOFF = 2082 - BURROWDOWN_WIDOWMINE = 2095 - BURROWUP_WIDOWMINE = 2097 - WIDOWMINEATTACK = 2099 - EFFECT_WIDOWMINEATTACK = 2099 - BURROWDOWN_LURKER = 2108 - BURROWUP_LURKER = 2110 - MORPH_LURKERDEN = 2112 - CANCEL_MORPHLURKERDEN = 2113 - HALLUCINATION_ORACLE = 2114 - MEDIVACIGNITEAFTERBURNERS = 2116 - EFFECT_MEDIVACIGNITEAFTERBURNERS = 2116 - ORACLEREVELATION = 2146 - EFFECT_ORACLEREVELATION = 2146 - PHOTONOVERCHARGE = 2162 - EFFECT_PHOTONOVERCHARGE = 2162 - TIMEWARP = 2244 - EFFECT_TIMEWARP = 2244 - CAUSTICSPRAY = 2324 - EFFECT_CAUSTICSPRAY = 2324 - IMMORTALBARRIER = 2328 - EFFECT_IMMORTALBARRIER = 2328 - MORPH_RAVAGER = 2330 - CANCEL_MORPHRAVAGER = 2331 - MORPH_LURKER = 2332 - CANCEL_MORPHLURKER = 2333 - CORROSIVEBILE = 2338 - EFFECT_CORROSIVEBILE = 2338 - BURROWDOWN_RAVAGER = 2340 - BURROWUP_RAVAGER = 2342 - PURIFICATIONNOVA = 2346 - EFFECT_PURIFICATIONNOVA = 2346 - LOCKON = 2350 - EFFECT_LOCKON = 2350 - TACTICALJUMP = 2358 - EFFECT_TACTICALJUMP = 2358 - MORPH_THORHIGHIMPACTMODE = 2362 - MORPH_THOREXPLOSIVEMODE = 2364 - MASSRECALL_MOTHERSHIP = 2368 - EFFECT_MASSRECALL_MOTHERSHIP = 2368 - UNLOADALL_NYDUSWORM = 2371 - BEHAVIOR_PULSARBEAMON = 2375 - BEHAVIOR_PULSARBEAMOFF = 2376 - LOCUSTSWOOP = 2387 - EFFECT_LOCUSTSWOOP = 2387 - HALLUCINATION_DISRUPTOR = 2389 - HALLUCINATION_ADEPT = 2391 - VOIDRAYPRISMATICALIGNMENT = 2393 - EFFECT_VOIDRAYPRISMATICALIGNMENT = 2393 - BUILD_STASISTRAP = 2505 - PARASITICBOMB = 2542 - EFFECT_PARASITICBOMB = 2542 - ADEPTPHASESHIFT = 2544 - EFFECT_ADEPTPHASESHIFT = 2544 - BEHAVIOR_HOLDFIREON_LURKER = 2550 - BEHAVIOR_HOLDFIREOFF_LURKER = 2552 - MORPH_LIBERATORAGMODE = 2558 - MORPH_LIBERATORAAMODE = 2560 - KD8CHARGE = 2588 - EFFECT_KD8CHARGE = 2588 - CANCEL_ADEPTPHASESHIFT = 2594 - CANCEL_ADEPTSHADEPHASESHIFT = 2596 - TEMPESTDISRUPTIONBLAST = 2698 - EFFECT_TEMPESTDISRUPTIONBLAST = 2698 - SHADOWSTRIDE = 2700 - EFFECT_SHADOWSTRIDE = 2700 - SPAWNLOCUSTS = 2704 - EFFECT_SPAWNLOCUSTS = 2704 - MORPH_OVERLORDTRANSPORT = 2708 - CANCEL_MORPHOVERLORDTRANSPORT = 2709 - GHOSTSNIPE = 2714 - EFFECT_GHOSTSNIPE = 2714 - RESEARCH_SHADOWSTRIKE = 2720 + TOWERCAPTURE = 1820 + HERDINTERACT = 1822 + FRENZY = 1824 + CONTAMINATE = 1826 + SHATTER = 1828 + INFESTEDTERRANSLAYEGG = 1830 + QUE5PASSIVE = 1832 + QUE5PASSIVECANCELTOSELECTION = 1834 + MORPHTOGHOSTALTERNATE = 1836 + MORPHTOGHOSTNOVA = 1838 + DIGESTERCREEPSPRAY = 1840 + MORPHTOCOLLAPSIBLETERRANTOWERDEBRIS = 1842 + MORPHTOCOLLAPSIBLETERRANTOWERDEBRISRAMPLEFT = 1844 + MORPHTOCOLLAPSIBLETERRANTOWERDEBRISRAMPRIGHT = 1846 + MORPHTOMOTHERSHIP = 1848 + MOTHERSHIPSTASIS = 1850 + MOTHERSHIPCOREWEAPON = 1852 + NEXUSTRAINMOTHERSHIPCORE = 1882 + MOTHERSHIPCORETELEPORT = 1884 + SALVAGEDRONEREFUND = 1886 + SALVAGEDRONE = 1888 + SALVAGEZERGLINGREFUND = 1890 + SALVAGEZERGLING = 1892 + SALVAGEQUEENREFUND = 1894 + SALVAGEQUEEN = 1896 + SALVAGEROACHREFUND = 1898 + SALVAGEROACH = 1900 + SALVAGEBANELINGREFUND = 1902 + SALVAGEBANELING = 1904 + SALVAGEHYDRALISKREFUND = 1906 + SALVAGEHYDRALISK = 1908 + SALVAGEINFESTORREFUND = 1910 + SALVAGEINFESTOR = 1912 + SALVAGESWARMHOSTREFUND = 1914 + SALVAGESWARMHOST = 1916 + SALVAGEULTRALISKREFUND = 1918 + SALVAGEULTRALISK = 1920 + DIGESTERTRANSPORT = 1925 + SPECTRESHIELD = 1927 + XELNAGAHEALINGSHRINE = 1929 + NEXUSINVULNERABILITY = 1931 + NEXUSPHASESHIFT = 1933 + SPAWNCHANGELINGTARGET = 1935 + QUEENLAND = 1937 + QUEENFLY = 1939 + ORACLECLOAKFIELD = 1941 + FLYERSHIELD = 1943 + LOCUSTTRAIN = 1973 + MOTHERSHIPCOREMASSRECALL = 1975 + SINGLERECALL = 1977 + MORPHTOHELLION = 1979 + RESTORESHIELDS = 1981 + SCRYER = 1983 + BURROWCHARGETRIAL = 1985 + LEECHRESOURCES = 1987 + SNIPEDOT = 1989 + SWARMHOSTSPAWNLOCUSTS = 1991 + CLONE = 1993 + BUILDINGSHIELD = 1995 + MORPHTOCOLLAPSIBLEROCKTOWERDEBRIS = 1997 + MORPHTOHELLIONTANK = 1999 + BUILDINGSTASIS = 2001 + RESOURCEBLOCKER = 2003 + RESOURCESTUN = 2005 + MAXIUMTHRUST = 2007 + SACRIFICE = 2009 + BURROWCHARGEMP = 2011 + BURROWCHARGEREVD = 2013 + MORPHTOSWARMHOSTBURROWEDMP = 2015 + MORPHTOSWARMHOSTMP = 2017 + SPAWNINFESTEDTERRAN = 2047 + ATTACKPROTOSSBUILDING = 2050 + BURROWEDBANELINGSTOP = 2056 + STOPPROTOSSBUILDING = 2062 + BLINDINGCLOUD = 2064 + EYESTALK = 2066 + YOINK = 2068 + VIPERCONSUME = 2070 + VIPERCONSUMEMINERALS = 2072 + VIPERCONSUMESTRUCTURE = 2074 + PROTOSSBUILDINGQUEUE = 2076 + QUE8 = 2078 + TESTZERG = 2080 + VOLATILEBURSTBUILDING = 2082 + PICKUPSCRAPSMALL = 2084 + PICKUPSCRAPMEDIUM = 2086 + PICKUPSCRAPLARGE = 2088 + PICKUPPALLETGAS = 2090 + PICKUPPALLETMINERALS = 2092 + MASSIVEKNOCKOVER = 2094 + WIDOWMINEBURROW = 2096 + WIDOWMINEUNBURROW = 2098 + WIDOWMINEATTACK = 2100 + TORNADOMISSILE = 2101 + MOTHERSHIPCOREENERGIZE = 2103 + LURKERASPECTMPFROMHYDRALISKBURROWED = 2105 + LURKERASPECTMP = 2107 + BURROWLURKERMPDOWN = 2109 + BURROWLURKERMPUP = 2111 + UPGRADETOLURKERDENMP = 2113 + HALLUCINATIONORACLE = 2115 + MEDIVACSPEEDBOOST = 2117 + EXTENDINGBRIDGENEWIDE8OUT = 2119 + EXTENDINGBRIDGENEWIDE8 = 2121 + EXTENDINGBRIDGENWWIDE8OUT = 2123 + EXTENDINGBRIDGENWWIDE8 = 2125 + EXTENDINGBRIDGENEWIDE10OUT = 2127 + EXTENDINGBRIDGENEWIDE10 = 2129 + EXTENDINGBRIDGENWWIDE10OUT = 2131 + EXTENDINGBRIDGENWWIDE10 = 2133 + EXTENDINGBRIDGENEWIDE12OUT = 2135 + EXTENDINGBRIDGENEWIDE12 = 2137 + EXTENDINGBRIDGENWWIDE12OUT = 2139 + EXTENDINGBRIDGENWWIDE12 = 2141 + INVULNERABILITYSHIELD = 2143 + CRITTERFLEE = 2145 + ORACLEREVELATION = 2147 + ORACLEREVELATIONMODE = 2149 + ORACLENORMALMODE = 2151 + MORPHTOCOLLAPSIBLEROCKTOWERDEBRISRAMPRIGHT = 2153 + MORPHTOCOLLAPSIBLEROCKTOWERDEBRISRAMPLEFT = 2155 + VOIDSIPHON = 2157 + ULTRALISKWEAPONCOOLDOWN = 2159 + MOTHERSHIPCOREPURIFYNEXUSCANCEL = 2161 + MOTHERSHIPCOREPURIFYNEXUS = 2163 + XELNAGA_CAVERNS_DOORE = 2165 + XELNAGA_CAVERNS_DOOREOPENED = 2167 + XELNAGA_CAVERNS_DOORN = 2169 + XELNAGA_CAVERNS_DOORNE = 2171 + XELNAGA_CAVERNS_DOORNEOPENED = 2173 + XELNAGA_CAVERNS_DOORNOPENED = 2175 + XELNAGA_CAVERNS_DOORNW = 2177 + XELNAGA_CAVERNS_DOORNWOPENED = 2179 + XELNAGA_CAVERNS_DOORS = 2181 + XELNAGA_CAVERNS_DOORSE = 2183 + XELNAGA_CAVERNS_DOORSEOPENED = 2185 + XELNAGA_CAVERNS_DOORSOPENED = 2187 + XELNAGA_CAVERNS_DOORSW = 2189 + XELNAGA_CAVERNS_DOORSWOPENED = 2191 + XELNAGA_CAVERNS_DOORW = 2193 + XELNAGA_CAVERNS_DOORWOPENED = 2195 + XELNAGA_CAVERNS_FLOATING_BRIDGENE8OUT = 2197 + XELNAGA_CAVERNS_FLOATING_BRIDGENE8 = 2199 + XELNAGA_CAVERNS_FLOATING_BRIDGENW8OUT = 2201 + XELNAGA_CAVERNS_FLOATING_BRIDGENW8 = 2203 + XELNAGA_CAVERNS_FLOATING_BRIDGENE10OUT = 2205 + XELNAGA_CAVERNS_FLOATING_BRIDGENE10 = 2207 + XELNAGA_CAVERNS_FLOATING_BRIDGENW10OUT = 2209 + XELNAGA_CAVERNS_FLOATING_BRIDGENW10 = 2211 + XELNAGA_CAVERNS_FLOATING_BRIDGENE12OUT = 2213 + XELNAGA_CAVERNS_FLOATING_BRIDGENE12 = 2215 + XELNAGA_CAVERNS_FLOATING_BRIDGENW12OUT = 2217 + XELNAGA_CAVERNS_FLOATING_BRIDGENW12 = 2219 + XELNAGA_CAVERNS_FLOATING_BRIDGEH8OUT = 2221 + XELNAGA_CAVERNS_FLOATING_BRIDGEH8 = 2223 + XELNAGA_CAVERNS_FLOATING_BRIDGEV8OUT = 2225 + XELNAGA_CAVERNS_FLOATING_BRIDGEV8 = 2227 + XELNAGA_CAVERNS_FLOATING_BRIDGEH10OUT = 2229 + XELNAGA_CAVERNS_FLOATING_BRIDGEH10 = 2231 + XELNAGA_CAVERNS_FLOATING_BRIDGEV10OUT = 2233 + XELNAGA_CAVERNS_FLOATING_BRIDGEV10 = 2235 + XELNAGA_CAVERNS_FLOATING_BRIDGEH12OUT = 2237 + XELNAGA_CAVERNS_FLOATING_BRIDGEH12 = 2239 + XELNAGA_CAVERNS_FLOATING_BRIDGEV12OUT = 2241 + XELNAGA_CAVERNS_FLOATING_BRIDGEV12 = 2243 + TEMPORALFIELD = 2245 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8OUT = 2247 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8 = 2249 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8OUT = 2251 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8 = 2253 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT10OUT = 2255 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT10 = 2257 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT10OUT = 2259 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT10 = 2261 + TARSONIS_DOORN = 2263 + TARSONIS_DOORNLOWERED = 2265 + TARSONIS_DOORNE = 2267 + TARSONIS_DOORNELOWERED = 2269 + TARSONIS_DOORE = 2271 + TARSONIS_DOORELOWERED = 2273 + TARSONIS_DOORNW = 2275 + TARSONIS_DOORNWLOWERED = 2277 + COMPOUNDMANSION_DOORN = 2279 + COMPOUNDMANSION_DOORNLOWERED = 2281 + COMPOUNDMANSION_DOORNE = 2283 + COMPOUNDMANSION_DOORNELOWERED = 2285 + COMPOUNDMANSION_DOORE = 2287 + COMPOUNDMANSION_DOORELOWERED = 2289 + COMPOUNDMANSION_DOORNW = 2291 + COMPOUNDMANSION_DOORNWLOWERED = 2293 + ARMORYRESEARCHSWARM = 2323 + CAUSTICSPRAY = 2325 + ORACLECLOAKINGFIELDTARGETED = 2327 + IMMORTALOVERLOAD = 2329 + MORPHTORAVAGER = 2331 + MORPHTOLURKER = 2333 + ORACLEPHASESHIFT = 2335 + RELEASEINTERCEPTORS = 2337 + RAVAGERCORROSIVEBILE = 2339 + BURROWRAVAGERDOWN = 2341 + BURROWRAVAGERUP = 2343 + PURIFICATIONNOVA = 2345 + PURIFICATIONNOVATARGETED = 2347 + IMPALE = 2349 + LOCKON = 2351 + LOCKONAIR = 2353 + LOCKONCANCEL = 2355 + CORRUPTIONBOMB = 2357 + HYPERJUMP = 2359 + OVERCHARGE = 2361 + THORAPMODE = 2363 + THORNORMALMODE = 2365 + LIGHTOFAIUR = 2367 + MOTHERSHIPMASSRECALL = 2369 + NYDUSWORMTRANSPORT = 2374 + ORACLEWEAPON = 2376 + PULSARBEAM = 2378 + PULSARCANNON = 2380 + VOIDSWARMHOSTSPAWNLOCUST = 2382 + LOCUSTMPFLYINGMORPHTOGROUND = 2384 + LOCUSTMPMORPHTOAIR = 2386 + LOCUSTMPFLYINGSWOOP = 2388 + HALLUCINATIONDISRUPTOR = 2390 + HALLUCINATIONADEPT = 2392 + VOIDRAYSWARMDAMAGEBOOST = 2394 + SEEKERDUMMYCHANNEL = 2396 + AIURLIGHTBRIDGENE8OUT = 2398 + AIURLIGHTBRIDGENE8 = 2400 + AIURLIGHTBRIDGENE10OUT = 2402 + AIURLIGHTBRIDGENE10 = 2404 + AIURLIGHTBRIDGENE12OUT = 2406 + AIURLIGHTBRIDGENE12 = 2408 + AIURLIGHTBRIDGENW8OUT = 2410 + AIURLIGHTBRIDGENW8 = 2412 + AIURLIGHTBRIDGENW10OUT = 2414 + AIURLIGHTBRIDGENW10 = 2416 + AIURLIGHTBRIDGENW12OUT = 2418 + AIURLIGHTBRIDGENW12 = 2420 + AIURTEMPLEBRIDGENE8OUT = 2422 + AIURTEMPLEBRIDGENE8 = 2424 + AIURTEMPLEBRIDGENE10OUT = 2426 + AIURTEMPLEBRIDGENE10 = 2428 + AIURTEMPLEBRIDGENE12OUT = 2430 + AIURTEMPLEBRIDGENE12 = 2432 + AIURTEMPLEBRIDGENW8OUT = 2434 + AIURTEMPLEBRIDGENW8 = 2436 + AIURTEMPLEBRIDGENW10OUT = 2438 + AIURTEMPLEBRIDGENW10 = 2440 + AIURTEMPLEBRIDGENW12OUT = 2442 + AIURTEMPLEBRIDGENW12 = 2444 + SHAKURASLIGHTBRIDGENE8OUT = 2446 + SHAKURASLIGHTBRIDGENE8 = 2448 + SHAKURASLIGHTBRIDGENE10OUT = 2450 + SHAKURASLIGHTBRIDGENE10 = 2452 + SHAKURASLIGHTBRIDGENE12OUT = 2454 + SHAKURASLIGHTBRIDGENE12 = 2456 + SHAKURASLIGHTBRIDGENW8OUT = 2458 + SHAKURASLIGHTBRIDGENW8 = 2460 + SHAKURASLIGHTBRIDGENW10OUT = 2462 + SHAKURASLIGHTBRIDGENW10 = 2464 + SHAKURASLIGHTBRIDGENW12OUT = 2466 + SHAKURASLIGHTBRIDGENW12 = 2468 + VOIDMPIMMORTALREVIVEREBUILD = 2470 + VOIDMPIMMORTALREVIVEDEATH = 2472 + ARBITERMPSTASISFIELD = 2474 + ARBITERMPRECALL = 2476 + CORSAIRMPDISRUPTIONWEB = 2478 + MORPHTOGUARDIANMP = 2480 + MORPHTODEVOURERMP = 2482 + DEFILERMPCONSUME = 2484 + DEFILERMPDARKSWARM = 2486 + DEFILERMPPLAGUE = 2488 + DEFILERMPBURROW = 2490 + DEFILERMPUNBURROW = 2492 + QUEENMPENSNARE = 2494 + QUEENMPSPAWNBROODLINGS = 2496 + QUEENMPINFESTCOMMANDCENTER = 2498 + LIGHTNINGBOMB = 2500 + GRAPPLE = 2502 + ORACLESTASISTRAP = 2504 + ORACLESTASISTRAPBUILD = 2535 + ORACLESTASISTRAPACTIVATE = 2537 + SELFREPAIR = 2539 + AGGRESSIVEMUTATION = 2541 + PARASITICBOMB = 2543 + ADEPTPHASESHIFT = 2545 + PURIFICATIONNOVAMORPH = 2547 + PURIFICATIONNOVAMORPHBACK = 2549 + LURKERHOLDFIRE = 2551 + LURKERREMOVEHOLDFIRE = 2553 + LIBERATORMORPHTOAG = 2555 + LIBERATORMORPHTOAA = 2557 + LIBERATORAGTARGET = 2559 + LIBERATORAATARGET = 2561 + TIMESTOP = 2563 + AIURLIGHTBRIDGEABANDONEDNE8OUT = 2565 + AIURLIGHTBRIDGEABANDONEDNE8 = 2567 + AIURLIGHTBRIDGEABANDONEDNE10OUT = 2569 + AIURLIGHTBRIDGEABANDONEDNE10 = 2571 + AIURLIGHTBRIDGEABANDONEDNE12OUT = 2573 + AIURLIGHTBRIDGEABANDONEDNE12 = 2575 + AIURLIGHTBRIDGEABANDONEDNW8OUT = 2577 + AIURLIGHTBRIDGEABANDONEDNW8 = 2579 + AIURLIGHTBRIDGEABANDONEDNW10OUT = 2581 + AIURLIGHTBRIDGEABANDONEDNW10 = 2583 + AIURLIGHTBRIDGEABANDONEDNW12OUT = 2585 + AIURLIGHTBRIDGEABANDONEDNW12 = 2587 + KD8CHARGE = 2589 + PENETRATINGSHOT = 2591 + CLOAKINGDRONE = 2593 + ADEPTPHASESHIFTCANCEL = 2595 + ADEPTSHADEPHASESHIFTCANCEL = 2597 + SLAYNELEMENTALGRAB = 2599 + MORPHTOCOLLAPSIBLEPURIFIERTOWERDEBRIS = 2601 + PORTCITY_BRIDGE_UNITNE8OUT = 2603 + PORTCITY_BRIDGE_UNITNE8 = 2605 + PORTCITY_BRIDGE_UNITSE8OUT = 2607 + PORTCITY_BRIDGE_UNITSE8 = 2609 + PORTCITY_BRIDGE_UNITNW8OUT = 2611 + PORTCITY_BRIDGE_UNITNW8 = 2613 + PORTCITY_BRIDGE_UNITSW8OUT = 2615 + PORTCITY_BRIDGE_UNITSW8 = 2617 + PORTCITY_BRIDGE_UNITNE10OUT = 2619 + PORTCITY_BRIDGE_UNITNE10 = 2621 + PORTCITY_BRIDGE_UNITSE10OUT = 2623 + PORTCITY_BRIDGE_UNITSE10 = 2625 + PORTCITY_BRIDGE_UNITNW10OUT = 2627 + PORTCITY_BRIDGE_UNITNW10 = 2629 + PORTCITY_BRIDGE_UNITSW10OUT = 2631 + PORTCITY_BRIDGE_UNITSW10 = 2633 + PORTCITY_BRIDGE_UNITNE12OUT = 2635 + PORTCITY_BRIDGE_UNITNE12 = 2637 + PORTCITY_BRIDGE_UNITSE12OUT = 2639 + PORTCITY_BRIDGE_UNITSE12 = 2641 + PORTCITY_BRIDGE_UNITNW12OUT = 2643 + PORTCITY_BRIDGE_UNITNW12 = 2645 + PORTCITY_BRIDGE_UNITSW12OUT = 2647 + PORTCITY_BRIDGE_UNITSW12 = 2649 + PORTCITY_BRIDGE_UNITN8OUT = 2651 + PORTCITY_BRIDGE_UNITN8 = 2653 + PORTCITY_BRIDGE_UNITS8OUT = 2655 + PORTCITY_BRIDGE_UNITS8 = 2657 + PORTCITY_BRIDGE_UNITE8OUT = 2659 + PORTCITY_BRIDGE_UNITE8 = 2661 + PORTCITY_BRIDGE_UNITW8OUT = 2663 + PORTCITY_BRIDGE_UNITW8 = 2665 + PORTCITY_BRIDGE_UNITN10OUT = 2667 + PORTCITY_BRIDGE_UNITN10 = 2669 + PORTCITY_BRIDGE_UNITS10OUT = 2671 + PORTCITY_BRIDGE_UNITS10 = 2673 + PORTCITY_BRIDGE_UNITE10OUT = 2675 + PORTCITY_BRIDGE_UNITE10 = 2677 + PORTCITY_BRIDGE_UNITW10OUT = 2679 + PORTCITY_BRIDGE_UNITW10 = 2681 + PORTCITY_BRIDGE_UNITN12OUT = 2683 + PORTCITY_BRIDGE_UNITN12 = 2685 + PORTCITY_BRIDGE_UNITS12OUT = 2687 + PORTCITY_BRIDGE_UNITS12 = 2689 + PORTCITY_BRIDGE_UNITE12OUT = 2691 + PORTCITY_BRIDGE_UNITE12 = 2693 + PORTCITY_BRIDGE_UNITW12OUT = 2695 + PORTCITY_BRIDGE_UNITW12 = 2697 + TEMPESTDISRUPTIONBLAST = 2699 + DARKTEMPLARBLINK = 2701 + LAUNCHINTERCEPTORS = 2703 + SPAWNLOCUSTSTARGETED = 2705 + LOCUSTMPFLYINGSWOOPATTACK = 2707 + MORPHTOTRANSPORTOVERLORD = 2709 + BYPASSARMOR = 2711 + BYPASSARMORDRONECU = 2713 + CHANNELSNIPE = 2715 + PURIFYMORPHPYLON = 2717 + PURIFYMORPHPYLONBACK = 2719 + DARKSHRINERESEARCH = 2749 + HEAL = 2751 + LURKERASPECT = 2753 + BURROWLURKERDOWN = 2755 + BURROWLURKERUP = 2757 + D8CHARGE = 2759 + DEFENSIVEMATRIX = 2761 + MISSILEPODS = 2763 + LOKIMISSILEPODS = 2765 + HUTTRANSPORT = 2770 + MORPHTOTECHREACTOR = 2772 + LEVIATHANSPAWNBROODLORD = 2774 + SS_CARRIERBOSSATTACKLAUNCH = 2776 + SS_CARRIERSPAWNINTERCEPTOR = 2778 + SS_CARRIERBOSSATTACKTARGET = 2780 + SS_FIGHTERBOMB = 2782 + SS_LIGHTNINGPROJECTORTOGGLE = 2784 + SS_PHOENIXSHOOTING = 2786 + SS_POWERUPMORPHTOBOMB = 2788 + SS_BATTLECRUISERMISSILEATTACK = 2790 + SS_LEVIATHANSPAWNBOMBS = 2792 + SS_BATTLECRUISERHUNTERSEEKERATTACK = 2794 + SS_POWERUPMORPHTOHEALTH = 2796 + SS_LEVIATHANTENTACLEATTACKL1NODELAY = 2798 + SS_LEVIATHANTENTACLEATTACKL2NODELAY = 2800 + SS_LEVIATHANTENTACLEATTACKR1NODELAY = 2802 + SS_LEVIATHANTENTACLEATTACKR2NODELAY = 2804 + SS_SCIENCEVESSELTELEPORT = 2806 + SS_TERRATRONBEAMATTACK = 2808 + SS_TERRATRONSAWATTACK = 2810 + SS_WRAITHATTACK = 2812 + SS_SWARMGUARDIANATTACK = 2814 + SS_POWERUPMORPHTOSIDEMISSILES = 2816 + SS_POWERUPMORPHTOSTRONGERMISSILES = 2818 + SS_SCOUTATTACK = 2820 + SS_INTERCEPTORATTACK = 2822 + SS_CORRUPTORATTACK = 2824 + SS_LEVIATHANTENTACLEATTACKL2 = 2826 + SS_LEVIATHANTENTACLEATTACKR1 = 2828 + SS_LEVIATHANTENTACLEATTACKL1 = 2830 + SS_LEVIATHANTENTACLEATTACKR2 = 2832 + SS_SCIENCEVESSELATTACK = 2834 + HEALREDIRECT = 2835 + LURKERASPECTFROMHYDRALISKBURROWED = 2837 + UPGRADETOLURKERDEN = 2839 + ADVANCEDCONSTRUCTION = 2841 + BUILDINPROGRESSNONCANCELLABLE = 2843 + INFESTEDVENTSPAWNCORRUPTOR = 2845 + INFESTEDVENTSPAWNBROODLORD = 2847 + IRRADIATE = 2849 + INFESTEDVENTSPAWNMUTALISK = 2851 + MAKEVULTURESPIDERMINES = 2871 + MEDIVACDOUBLEBEAMHEAL = 2873 + MINDCONTROL = 2875 + OBLITERATE = 2877 + VOODOOSHIELD = 2879 + RELEASEMINION = 2881 + ULTRASONICPULSE = 2883 + ARCHIVESEAL = 2885 + ARTANISVORTEX = 2887 + ARTANISWORMHOLETRANSIT = 2889 + BUNKERATTACK = 2892 + BUNKERSTOP = 2898 + CANCELTERRAZINEHARVEST = 2900 + LEVIATHANSPAWNMUTALISK = 2902 + PARKCOLONISTVEHICLE = 2904 + STARTCOLONISTVEHICLE = 2906 + CONSUMPTION = 2908 + CONSUMEDNA = 2910 + EGGPOP = 2912 + EXPERIMENTALPLASMAGUN = 2914 + GATHERSPECIALOBJECT = 2916 + KERRIGANSEARCH = 2918 + LOKIUNDOCK = 2920 + MINDBLAST = 2922 + MORPHTOINFESTEDCIVILIAN = 2924 + QUEENSHOCKWAVE = 2926 + TAURENOUTHOUSELIFTOFF = 2928 + TAURENOUTHOUSETRANSPORT = 2933 + TYCHUS03OMEGASTORM = 2935 + RAYNORSNIPE = 2937 + BONESHEAL = 2939 + BONESTOSSGRENADE = 2941 + HERCULESTRANSPORT = 2946 + SPECOPSDROPSHIPTRANSPORT = 2951 + DUSKWINGBANSHEECLOAKINGFIELD = 2953 + HYPERIONYAMATOSPECIAL = 2955 + INFESTABLEHUTTRANSPORT = 2960 + DUTCHPLACETURRET = 2962 + BURROWINFESTEDCIVILIANDOWN = 2964 + BURROWINFESTEDCIVILIANUP = 2966 + SELENDISHANGAR = 2986 + FORCEFIELDBEAM = 2988 + SIEGEBREAKERSIEGE = 2990 + SIEGEBREAKERUNSIEGE = 2992 + SOULCHANNEL = 2994 + PERDITIONTURRETBURROW = 2996 + PERDITIONTURRETUNBURROW = 2998 + SENTRYGUNBURROW = 3000 + SENTRYGUNUNBURROW = 3002 + SPIDERMINEUNBURROWRANGEDUMMY = 3004 + GRAVITONPRISON = 3006 + IMPLOSION = 3008 + OMEGASTORM = 3010 + PSIONICSHOCKWAVE = 3012 + HYBRIDFAOESTUN = 3014 + SUMMONMERCENARIES = 3044 + SUMMONMERCENARIESPH = 3074 + ENERGYNOVA = 3076 + THEMOROSDEVICE = 3078 + TOSSGRENADE = 3080 + VOIDSEEKERTRANSPORT = 3085 + TERRANBUILDDROP = 3116 + ODINNUCLEARSTRIKE = 3118 + ODINWRECKAGE = 3120 + RESEARCHLABTRANSPORT = 3125 + COLONYSHIPTRANSPORT = 3130 + COLONYINFESTATION = 3132 + DOMINATION = 3134 + KARASSPLASMASURGE = 3136 + KARASSPSISTORM = 3138 + HYBRIDBLINK = 3140 + HYBRIDCPLASMABLAST = 3142 + HEROARMNUKE = 3162 + HERONUCLEARSTRIKE = 3164 + ODINBARRAGE = 3166 + PURIFIERTOGGLEPOWER = 3168 + PHASEMINEBLAST = 3170 + VOIDSEEKERPHASEMINEBLAST = 3172 + TRANSPORTTRUCKTRANSPORT = 3177 + VAL03QUEENOFBLADESBURROW = 3179 + VAL03QUEENOFBLADESDEEPTUNNEL = 3181 + VAL03QUEENOFBLADESUNBURROW = 3183 + VULTURESPIDERMINEBURROW = 3185 + VULTURESPIDERMINEUNBURROW = 3187 + LOKIYAMATO = 3189 + DUKESREVENGEYAMATO = 3191 + ZERATULBLINK = 3193 + ROGUEGHOSTCLOAK = 3195 + VULTURESPIDERMINES = 3197 + VULTUREQUEUE3 = 3199 + SUPERWARPGATETRAIN = 3219 + BURROWOMEGALISKDOWN = 3221 + BURROWOMEGALISKUP = 3223 + BURROWINFESTEDABOMINATIONDOWN = 3225 + BURROWINFESTEDABOMINATIONUP = 3227 + BURROWHUNTERKILLERDOWN = 3229 + BURROWHUNTERKILLERUP = 3231 + NOVASNIPE = 3233 + VORTEXPURIFIER = 3235 + TALDARIMVORTEX = 3237 + PURIFIERPLANETCRACKER = 3239 + BURROWINFESTEDTERRANCAMPAIGNDOWN = 3241 + BURROWINFESTEDTERRANCAMPAIGNUP = 3243 + INFESTEDMONSTERTRAIN = 3273 + BIODOMETRANSPORT = 3278 + CHECKSTATION = 3280 + CHECKSTATIONDIAGONALBLUR = 3282 + CHECKSTATIONDIAGONALULBR = 3284 + CHECKSTATIONVERTICAL = 3286 + CHECKSTATIONOPENED = 3288 + CHECKSTATIONDIAGONALBLUROPENED = 3290 + CHECKSTATIONDIAGONALULBROPENED = 3292 + CHECKSTATIONVERTICALOPENED = 3294 + ATTACKALLOWSINVULNERABLE = 3297 + ZERATULSTUN = 3299 + WRAITHCLOAK = 3301 + TECHREACTORMORPH = 3303 + BARRACKSTECHREACTORMORPH = 3305 + FACTORYTECHREACTORMORPH = 3307 + STARPORTTECHREACTORMORPH = 3309 + SS_FIGHTERSHOOTING = 3311 + RAYNORC4 = 3313 + DUKESREVENGEDEFENSIVEMATRIX = 3315 + DUKESREVENGEMISSILEPODS = 3317 + THORWRECKAGE = 3319 + _330MMBARRAGECANNONS = 3321 + THORREBORN = 3323 + SPECTRENUKE = 3325 + SPECTRENUKESILOARMMAGAZINE = 3345 + COLONISTSHIPLIFTOFF = 3347 + COLONISTSHIPLAND = 3349 + BIODOMECOMMANDLIFTOFF = 3351 + BIODOMECOMMANDLAND = 3353 + HERCULESLIFTOFF = 3355 + HERCULESLAND = 3357 + LIGHTBRIDGEOFF = 3359 + LIGHTBRIDGEON = 3361 + LIBRARYDOWN = 3363 + LIBRARYUP = 3365 + TEMPLEDOORDOWN = 3367 + TEMPLEDOORUP = 3369 + TEMPLEDOORDOWNURDL = 3371 + TEMPLEDOORUPURDL = 3373 + PSYTROUSOXIDE = 3375 + VOIDSEEKERDOCK = 3377 + BIOPLASMIDDISCHARGE = 3379 + WRECKINGCREWASSAULTMODE = 3381 + WRECKINGCREWFIGHTERMODE = 3383 + BIOSTASIS = 3385 + COLONISTTRANSPORTTRANSPORT = 3390 + DROPTOSUPPLYDEPOT = 3392 + REFINERYTOAUTOMATEDREFINERY = 3394 + HELIOSCRASHMORPH = 3396 + NANOREPAIR = 3398 + PICKUP = 3400 + PICKUPARCADE = 3402 + PICKUPGAS100 = 3404 + PICKUPMINERALS100 = 3406 + PICKUPHEALTH25 = 3408 + PICKUPHEALTH50 = 3410 + PICKUPHEALTH100 = 3412 + PICKUPHEALTHFULL = 3414 + PICKUPENERGY25 = 3416 + PICKUPENERGY50 = 3418 + PICKUPENERGY100 = 3420 + PICKUPENERGYFULL = 3422 + TAURENSTIMPACK = 3424 + TESTINVENTORY = 3433 + TESTPAWN = 3453 + TESTREVIVE = 3483 + TESTSELL = 3513 + TESTINTERACT = 3514 + CLIFFDOOROPEN0 = 3516 + CLIFFDOORCLOSE0 = 3518 + CLIFFDOOROPEN1 = 3520 + CLIFFDOORCLOSE1 = 3522 + DESTRUCTIBLEGATEDIAGONALBLURLOWERED = 3524 + DESTRUCTIBLEGATEDIAGONALULBRLOWERED = 3526 + DESTRUCTIBLEGATESTRAIGHTHORIZONTALBFLOWERED = 3528 + DESTRUCTIBLEGATESTRAIGHTHORIZONTALLOWERED = 3530 + DESTRUCTIBLEGATESTRAIGHTVERTICALLFLOWERED = 3532 + DESTRUCTIBLEGATESTRAIGHTVERTICALLOWERED = 3534 + DESTRUCTIBLEGATEDIAGONALBLUR = 3536 + DESTRUCTIBLEGATEDIAGONALULBR = 3538 + DESTRUCTIBLEGATESTRAIGHTHORIZONTALBF = 3540 + DESTRUCTIBLEGATESTRAIGHTHORIZONTAL = 3542 + DESTRUCTIBLEGATESTRAIGHTVERTICALLF = 3544 + DESTRUCTIBLEGATESTRAIGHTVERTICAL = 3546 + TESTLEARN = 3566 + TESTLEVELEDSPELL = 3568 + METALGATEDIAGONALBLURLOWERED = 3570 + METALGATEDIAGONALULBRLOWERED = 3572 + METALGATESTRAIGHTHORIZONTALBFLOWERED = 3574 + METALGATESTRAIGHTHORIZONTALLOWERED = 3576 + METALGATESTRAIGHTVERTICALLFLOWERED = 3578 + METALGATESTRAIGHTVERTICALLOWERED = 3580 + METALGATEDIAGONALBLUR = 3582 + METALGATEDIAGONALULBR = 3584 + METALGATESTRAIGHTHORIZONTALBF = 3586 + METALGATESTRAIGHTHORIZONTAL = 3588 + METALGATESTRAIGHTVERTICALLF = 3590 + METALGATESTRAIGHTVERTICAL = 3592 + SECURITYGATEDIAGONALBLURLOWERED = 3594 + SECURITYGATEDIAGONALULBRLOWERED = 3596 + SECURITYGATESTRAIGHTHORIZONTALBFLOWERED = 3598 + SECURITYGATESTRAIGHTHORIZONTALLOWERED = 3600 + SECURITYGATESTRAIGHTVERTICALLFLOWERED = 3602 + SECURITYGATESTRAIGHTVERTICALLOWERED = 3604 + SECURITYGATEDIAGONALBLUR = 3606 + SECURITYGATEDIAGONALULBR = 3608 + SECURITYGATESTRAIGHTHORIZONTALBF = 3610 + SECURITYGATESTRAIGHTHORIZONTAL = 3612 + SECURITYGATESTRAIGHTVERTICALLF = 3614 + SECURITYGATESTRAIGHTVERTICAL = 3616 + CHANGESHRINETERRAN = 3618 + CHANGESHRINEPROTOSS = 3620 + SPECTREHOLDFIRE = 3622 + SPECTREWEAPONSFREE = 3624 + GWALEARN = 3644 + REAPERPLACEMENTMORPH = 3646 + LIGHTBRIDGEOFFTOPRIGHT = 3648 + LIGHTBRIDGEONTOPRIGHT = 3650 + TESTHEROGRAB = 3652 + TESTHEROTHROW = 3654 + TESTHERODEBUGMISSILEABILITY = 3656 + TESTHERODEBUGTRACKINGABILITY = 3658 CANCEL = 3659 HALT = 3660 BURROWDOWN = 3661 BURROWUP = 3662 - LOADALL = 3663 - UNLOADALL = 3664 + TRANSPORTLOADALL = 3663 + TRANSPORTUNLOADALL = 3664 STOP = 3665 - HARVEST_GATHER = 3666 - HARVEST_RETURN = 3667 - LOAD = 3668 - UNLOADALLAT = 3669 - CANCEL_LAST = 3671 - RALLY_UNITS = 3673 - ATTACK = 3674 - STIM = 3675 - EFFECT_STIM = 3675 - BEHAVIOR_CLOAKON = 3676 - BEHAVIOR_CLOAKOFF = 3677 + HARVESTGATHER = 3666 + HARVESTRETURN = 3667 + TRANSPORTLOAD = 3668 + TRANSPORTUNLOADAT = 3669 + TRANSPORTUNLOADUNIT = 3670 + CANCELLAST = 3671 + CANCELSLOT = 3672 + GENERALRALLYUNITS = 3673 + GENERALATTACK = 3674 + GENERALSTIMPACK = 3675 + GENERALCLOAKON = 3676 + GENERALCLOAKOFF = 3677 LAND = 3678 LIFT = 3679 - MORPH_ROOT = 3680 - MORPH_UPROOT = 3681 + ROOT = 3680 + UPROOT = 3681 BUILD_TECHLAB = 3682 - BUILD_REACTOR = 3683 + BUILD_TECHREACTOR = 3683 SPRAY = 3684 - EFFECT_SPRAY = 3684 - REPAIR = 3685 - EFFECT_REPAIR = 3685 - MASSRECALL = 3686 + REPAIRGENERAL = 3685 EFFECT_MASSRECALL = 3686 - BLINK = 3687 EFFECT_BLINK = 3687 - BEHAVIOR_HOLDFIREON = 3688 - BEHAVIOR_HOLDFIREOFF = 3689 - RALLY_WORKERS = 3690 - BUILD_CREEPTUMOR = 3691 - RESEARCH_PROTOSSAIRARMOR = 3692 - RESEARCH_PROTOSSAIRWEAPONS = 3693 - RESEARCH_PROTOSSGROUNDARMOR = 3694 - RESEARCH_PROTOSSGROUNDWEAPONS = 3695 - RESEARCH_PROTOSSSHIELDS = 3696 - RESEARCH_TERRANINFANTRYARMOR = 3697 - RESEARCH_TERRANINFANTRYWEAPONS = 3698 - RESEARCH_TERRANSHIPWEAPONS = 3699 - RESEARCH_TERRANVEHICLEANDSHIPPLATING = 3700 - RESEARCH_TERRANVEHICLEWEAPONS = 3701 - RESEARCH_ZERGFLYERARMOR = 3702 - RESEARCH_ZERGFLYERATTACK = 3703 - RESEARCH_ZERGGROUNDARMOR = 3704 - RESEARCH_ZERGMELEEWEAPONS = 3705 - RESEARCH_ZERGMISSILEWEAPONS = 3706 - RESTORE = 3765 - EFFECT_RESTORE = 3765 + GENERAL_HOLDFIRE = 3688 + GENERAL_CANCEL_HOLDFIRE = 3689 + GENERALRALLYWORKERS = 3690 + GENERALBUILDCREEPTUMOR = 3691 + RESEARCHPROTOSSAIRARMOR = 3692 + RESEARCHPROTOSSAIRWEAPONS = 3693 + RESEARCHPROTOSSGROUNDARMOR = 3694 + RESEARCHPROTOSSGROUNDWEAPONS = 3695 + RESEARCHPROTOSSSHIELDS = 3696 + RESEARCHTERRANINFANTRYARMOR = 3697 + RESEARCHTERRANINFANTRYWEAPONS = 3698 + RESEARCHTERRANSHIPWEAPONS = 3699 + RESEARCHTERRANVEHICLEANDSHIPPLATING = 3700 + RESEARCHTERRANVEHICLEWEAPONS = 3701 + RESEARCHZERGFLYERARMOR = 3702 + RESEARCHZERGFLYERATTACK = 3703 + RESEARCHZERGGROUNDARMOR = 3704 + RESEARCHZERGMELEEWEAPONS = 3705 + RESEARCHZERGMISSILEWEAPONS = 3706 + VOIDRAYSWARMDAMAGEBOOSTCANCEL = 3708 + LURKERDENRESEARCH = 3738 + OBSERVERSIEGEMORPHTOOBSERVER = 3740 + OBSERVERMORPHTOOBSERVERSIEGE = 3742 + OVERSEERMORPHTOOVERSEERSIEGEMODE = 3744 + OVERSEERSIEGEMODEMORPHTOOVERSEER = 3746 + RAVENSCRAMBLERMISSILE = 3748 + RAVENREPAIRDRONE = 3750 + RAVENREPAIRDRONEHEAL = 3752 + RAVENSHREDDERMISSILE = 3754 + CHRONOBOOSTENERGYCOST = 3756 + NEXUSMASSRECALL = 3758 + NEXUSSHIELDRECHARGE = 3760 + NEXUSSHIELDRECHARGEONPYLON = 3762 + INFESTORENSNARE = 3764 + SHIELDBATTERYRECHARGECHANNELED = 3766 + NEXUSSHIELDOVERCHARGE = 3768 + NEXUSSHIELDOVERCHARGEOFF = 3770 for item in AbilityId: globals()[item.name] = item diff --git a/sc2/ids/buff_id.py b/sc2/ids/buff_id.py index 0217b6a9b..2893bf816 100644 --- a/sc2/ids/buff_id.py +++ b/sc2/ids/buff_id.py @@ -1,54 +1,296 @@ # DO NOT EDIT! -# This file was automatically generated by "generate_id_constants.py" +# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" import enum class BuffId(enum.Enum): - INVALID = 0 + NULL = 0 + RADAR25 = 1 + TAUNTB = 2 + DISABLEABILS = 3 + TRANSIENTMORPH = 4 GRAVITONBEAM = 5 GHOSTCLOAK = 6 BANSHEECLOAK = 7 POWERUSERWARPABLE = 8 + VORTEXBEHAVIORENEMY = 9 + CORRUPTION = 10 QUEENSPAWNLARVATIMER = 11 GHOSTHOLDFIRE = 12 GHOSTHOLDFIREB = 13 + LEECH = 14 + LEECHDISABLEABILITIES = 15 EMPDECLOAK = 16 FUNGALGROWTH = 17 GUARDIANSHIELD = 18 + SEEKERMISSILETIMEOUT = 19 TIMEWARPPRODUCTION = 20 + ETHEREAL = 21 NEURALPARASITE = 22 + NEURALPARASITEWAIT = 23 STIMPACKMARAUDER = 24 SUPPLYDROP = 25 + _250MMSTRIKECANNONS = 26 STIMPACK = 27 PSISTORM = 28 CLOAKFIELDEFFECT = 29 CHARGING = 30 + AIDANGERBUFF = 31 + VORTEXBEHAVIOR = 32 SLOW = 33 + TEMPORALRIFTUNIT = 34 + SHEEPBUSY = 35 CONTAMINATED = 36 + TIMESCALECONVERSIONBEHAVIOR = 37 BLINDINGCLOUDSTRUCTURE = 38 + COLLAPSIBLEROCKTOWERCONJOINEDSEARCH = 39 + COLLAPSIBLEROCKTOWERRAMPDIAGONALCONJOINEDSEARCH = 40 + COLLAPSIBLETERRANTOWERCONJOINEDSEARCH = 41 + COLLAPSIBLETERRANTOWERRAMPDIAGONALCONJOINEDSEARCH = 42 + DIGESTERCREEPSPRAYVISION = 43 + INVULNERABILITYSHIELD = 44 + MINEDRONECOUNTDOWN = 45 + MOTHERSHIPSTASIS = 46 + MOTHERSHIPSTASISCASTER = 47 + MOTHERSHIPCOREENERGIZEVISUAL = 48 ORACLEREVELATION = 49 + GHOSTSNIPEDOT = 50 + NEXUSPHASESHIFT = 51 + NEXUSINVULNERABILITY = 52 + ROUGHTERRAINSEARCH = 53 + ROUGHTERRAINSLOW = 54 + ORACLECLOAKFIELD = 55 + ORACLECLOAKFIELDEFFECT = 56 + SCRYERFRIENDLY = 57 + SPECTRESHIELD = 58 VIPERCONSUMESTRUCTURE = 59 + RESTORESHIELDS = 60 + MERCENARYCYCLONEMISSILES = 61 + MERCENARYSENSORDISH = 62 + MERCENARYSHIELD = 63 + SCRYER = 64 + STUNROUNDINITIALBEHAVIOR = 65 + BUILDINGSHIELD = 66 + LASERSIGHT = 67 + PROTECTIVEBARRIER = 68 + CORRUPTORGROUNDATTACKDEBUFF = 69 + BATTLECRUISERANTIAIRDISABLE = 70 + BUILDINGSTASIS = 71 + STASIS = 72 + RESOURCESTUN = 73 + MAXIMUMTHRUST = 74 + CHARGEUP = 75 + CLOAKUNIT = 76 + NULLFIELD = 77 + RESCUE = 78 + BENIGN = 79 + LASERTARGETING = 80 + ENGAGE = 81 + CAPRESOURCE = 82 BLINDINGCLOUD = 83 + DOOMDAMAGEDELAY = 84 + EYESTALK = 85 + BURROWCHARGE = 86 + HIDDEN = 87 + MINEDRONEDOT = 88 MEDIVACSPEEDBOOST = 89 + EXTENDBRIDGEEXTENDINGBRIDGENEWIDE8OUT = 90 + EXTENDBRIDGEEXTENDINGBRIDGENWWIDE8OUT = 91 + EXTENDBRIDGEEXTENDINGBRIDGENEWIDE10OUT = 92 + EXTENDBRIDGEEXTENDINGBRIDGENWWIDE10OUT = 93 + EXTENDBRIDGEEXTENDINGBRIDGENEWIDE12OUT = 94 + EXTENDBRIDGEEXTENDINGBRIDGENWWIDE12OUT = 95 + PHASESHIELD = 96 PURIFY = 97 + VOIDSIPHON = 98 ORACLEWEAPON = 99 + ANTIAIRWEAPONSWITCHCOOLDOWN = 100 + ARBITERMPSTASISFIELD = 101 IMMORTALOVERLOAD = 102 + CLOAKINGFIELDTARGETED = 103 + LIGHTNINGBOMB = 104 + ORACLEPHASESHIFT = 105 + RELEASEINTERCEPTORSCOOLDOWN = 106 + RELEASEINTERCEPTORSTIMEDLIFEWARNING = 107 + RELEASEINTERCEPTORSWANDERDELAY = 108 + RELEASEINTERCEPTORSBEACON = 109 + ARBITERMPCLOAKFIELDEFFECT = 110 + PURIFICATIONNOVA = 111 + CORRUPTIONBOMBDAMAGE = 112 + CORSAIRMPDISRUPTIONWEB = 113 + DISRUPTORPUSH = 114 + LIGHTOFAIUR = 115 LOCKON = 116 + OVERCHARGE = 117 + OVERCHARGEDAMAGE = 118 + OVERCHARGESPEEDBOOST = 119 SEEKERMISSILE = 120 TEMPORALFIELD = 121 VOIDRAYSWARMDAMAGEBOOST = 122 + VOIDMPIMMORTALREVIVESUPRESSED = 123 + DEVOURERMPACIDSPORES = 124 + DEFILERMPCONSUME = 125 + DEFILERMPDARKSWARM = 126 + DEFILERMPPLAGUE = 127 + QUEENMPENSNARE = 128 ORACLESTASISTRAPTARGET = 129 + SELFREPAIR = 130 + AGGRESSIVEMUTATION = 131 PARASITICBOMB = 132 PARASITICBOMBUNITKU = 133 PARASITICBOMBSECONDARYUNITSEARCH = 134 + ADEPTDEATHCHECK = 135 + LURKERHOLDFIRE = 136 LURKERHOLDFIREB = 137 + TIMESTOPSTUN = 138 + SLAYNELEMENTALGRABSTUN = 139 + PURIFICATIONNOVAPOST = 140 + DISABLEINTERCEPTORS = 141 + BYPASSARMORDEBUFFONE = 142 + BYPASSARMORDEBUFFTWO = 143 + BYPASSARMORDEBUFFTHREE = 144 CHANNELSNIPECOMBAT = 145 TEMPESTDISRUPTIONBLASTSTUNBEHAVIOR = 146 + GRAVITONPRISON = 147 + INFESTORDISEASE = 148 + SS_LIGHTNINGPROJECTOR = 149 + PURIFIERPLANETCRACKERCHARGE = 150 + SPECTRECLOAKING = 151 + WRAITHCLOAK = 152 + PSYTROUSOXIDE = 153 + BANSHEECLOAKCROSSSPECTRUMDAMPENERS = 154 + SS_BATTLECRUISERHUNTERSEEKERTIMEOUT = 155 + SS_STRONGERENEMYBUFF = 156 + SS_TERRATRONARMMISSILETARGETCHECK = 157 + SS_MISSILETIMEOUT = 158 + SS_LEVIATHANBOMBCOLLISIONCHECK = 159 + SS_LEVIATHANBOMBEXPLODETIMER = 160 + SS_LEVIATHANBOMBMISSILETARGETCHECK = 161 + SS_TERRATRONCOLLISIONCHECK = 162 + SS_CARRIERBOSSCOLLISIONCHECK = 163 + SS_CORRUPTORMISSILETARGETCHECK = 164 + SS_INVULNERABLE = 165 + SS_LEVIATHANTENTACLEMISSILETARGETCHECK = 166 + SS_LEVIATHANTENTACLEMISSILETARGETCHECKINVERTED = 167 + SS_LEVIATHANTENTACLETARGETDEATHDELAY = 168 + SS_LEVIATHANTENTACLEMISSILESCANSWAPDELAY = 169 + SS_POWERUPDIAGONAL2 = 170 + SS_BATTLECRUISERCOLLISIONCHECK = 171 + SS_TERRATRONMISSILESPINNERMISSILELAUNCHER = 172 + SS_TERRATRONMISSILESPINNERCOLLISIONCHECK = 173 + SS_TERRATRONMISSILELAUNCHER = 174 + SS_BATTLECRUISERMISSILELAUNCHER = 175 + SS_TERRATRONSTUN = 176 + SS_VIKINGRESPAWN = 177 + SS_WRAITHCOLLISIONCHECK = 178 + SS_SCOURGEMISSILETARGETCHECK = 179 + SS_SCOURGEDEATH = 180 + SS_SWARMGUARDIANCOLLISIONCHECK = 181 + SS_FIGHTERBOMBMISSILEDEATH = 182 + SS_FIGHTERDRONEDAMAGERESPONSE = 183 + SS_INTERCEPTORCOLLISIONCHECK = 184 + SS_CARRIERCOLLISIONCHECK = 185 + SS_MISSILETARGETCHECKVIKINGDRONE = 186 + SS_MISSILETARGETCHECKVIKINGSTRONG1 = 187 + SS_MISSILETARGETCHECKVIKINGSTRONG2 = 188 + SS_POWERUPHEALTH1 = 189 + SS_POWERUPHEALTH2 = 190 + SS_POWERUPSTRONG = 191 + SS_POWERUPMORPHTOBOMB = 192 + SS_POWERUPMORPHTOHEALTH = 193 + SS_POWERUPMORPHTOSIDEMISSILES = 194 + SS_POWERUPMORPHTOSTRONGERMISSILES = 195 + SS_CORRUPTORCOLLISIONCHECK = 196 + SS_SCOUTCOLLISIONCHECK = 197 + SS_PHOENIXCOLLISIONCHECK = 198 + SS_SCOURGECOLLISIONCHECK = 199 + SS_LEVIATHANCOLLISIONCHECK = 200 + SS_SCIENCEVESSELCOLLISIONCHECK = 201 + SS_TERRATRONSAWCOLLISIONCHECK = 202 + SS_LIGHTNINGPROJECTORCOLLISIONCHECK = 203 + SHIFTDELAY = 204 + BIOSTASIS = 205 + PERSONALCLOAKINGFREE = 206 + EMPDRAIN = 207 + MINDBLASTSTUN = 208 + _330MMBARRAGECANNONS = 209 + VOODOOSHIELD = 210 + SPECTRECLOAKINGFREE = 211 + ULTRASONICPULSESTUN = 212 + IRRADIATE = 213 + NYDUSWORMLAVAINSTANTDEATH = 214 + PREDATORCLOAKING = 215 + PSIDISRUPTION = 216 + MINDCONTROL = 217 + QUEENKNOCKDOWN = 218 + SCIENCEVESSELCLOAKFIELD = 219 + SPORECANNONMISSILE = 220 + ARTANISTEMPORALRIFTUNIT = 221 + ARTANISCLOAKINGFIELDEFFECT = 222 + ARTANISVORTEXBEHAVIOR = 223 + INCAPACITATED = 224 + KARASSPSISTORM = 225 + DUTCHMARAUDERSLOW = 226 + JUMPSTOMPSTUN = 227 + JUMPSTOMPFSTUN = 228 + RAYNORMISSILETIMEDLIFE = 229 + PSIONICSHOCKWAVEHEIGHTANDSTUN = 230 + SHADOWCLONE = 231 + AUTOMATEDREPAIR = 232 + SLIMED = 233 + RAYNORTIMEBOMBMISSILE = 234 + RAYNORTIMEBOMBUNIT = 235 + TYCHUSCOMMANDOSTIMPACK = 236 + VIRALPLASMA = 237 + NAPALM = 238 + BURSTCAPACITORSDAMAGEBUFF = 239 + COLONYINFESTATION = 240 + DOMINATION = 241 + EMPBURST = 242 + HYBRIDCZERGYROOTS = 243 + HYBRIDFZERGYROOTS = 244 + LOCKDOWNB = 245 + SPECTRELOCKDOWNB = 246 + VOODOOLOCKDOWN = 247 + ZERATULSTUN = 248 + BUILDINGSCARAB = 249 + VORTEXBEHAVIORERADICATOR = 250 + GHOSTBLAST = 251 + HEROICBUFF03 = 252 + CANNONRADAR = 253 + SS_MISSILETARGETCHECKVIKING = 254 + SS_MISSILETARGETCHECK = 255 + SS_MAXSPEED = 256 + SS_MAXACCELERATION = 257 + SS_POWERUPDIAGONAL1 = 258 + WATER = 259 + DEFENSIVEMATRIX = 260 + TESTATTRIBUTE = 261 + TESTVETERANCY = 262 + SHREDDERSWARMDAMAGEAPPLY = 263 + CORRUPTORINFESTING = 264 + MERCGROUNDDROPDELAY = 265 + MERCGROUNDDROP = 266 + MERCAIRDROPDELAY = 267 + SPECTREHOLDFIRE = 268 + SPECTREHOLDFIREB = 269 + ITEMGRAVITYBOMBS = 270 CARRYMINERALFIELDMINERALS = 271 CARRYHIGHYIELDMINERALFIELDMINERALS = 272 CARRYHARVESTABLEVESPENEGEYSERGAS = 273 CARRYHARVESTABLEVESPENEGEYSERGASPROTOSS = 274 CARRYHARVESTABLEVESPENEGEYSERGASZERG = 275 + PERMANENTLYCLOAKED = 276 + RAVENSCRAMBLERMISSILE = 277 + RAVENSHREDDERMISSILETIMEOUT = 278 + RAVENSHREDDERMISSILETINT = 279 + RAVENSHREDDERMISSILEARMORREDUCTION = 280 + CHRONOBOOSTENERGYCOST = 281 + NEXUSSHIELDRECHARGEONPYLONBEHAVIOR = 282 + NEXUSSHIELDRECHARGEONPYLONBEHAVIORSECONDARYONTARGET = 283 + INFESTORENSNARE = 284 + INFESTORENSNAREMAKEPRECURSORREHEIGHTSOURCE = 285 + NEXUSSHIELDOVERCHARGE = 286 for item in BuffId: globals()[item.name] = item diff --git a/sc2/ids/effect_id.py b/sc2/ids/effect_id.py new file mode 100644 index 000000000..f27baf99e --- /dev/null +++ b/sc2/ids/effect_id.py @@ -0,0 +1,22 @@ +# DO NOT EDIT! +# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" + +import enum + +class EffectId(enum.Enum): + NULL = 0 + PSISTORMPERSISTENT = 1 + GUARDIANSHIELDPERSISTENT = 2 + TEMPORALFIELDGROWINGBUBBLECREATEPERSISTENT = 3 + TEMPORALFIELDAFTERBUBBLECREATEPERSISTENT = 4 + THERMALLANCESFORWARD = 5 + SCANNERSWEEP = 6 + NUKEPERSISTENT = 7 + LIBERATORTARGETMORPHDELAYPERSISTENT = 8 + LIBERATORTARGETMORPHPERSISTENT = 9 + BLINDINGCLOUDCP = 10 + RAVAGERCORROSIVEBILECP = 11 + LURKERMP = 12 + +for item in EffectId: + globals()[item.name] = item diff --git a/sc2/ids/unit_typeid.py b/sc2/ids/unit_typeid.py index 3a42c4d24..436cf8f81 100644 --- a/sc2/ids/unit_typeid.py +++ b/sc2/ids/unit_typeid.py @@ -1,430 +1,1931 @@ # DO NOT EDIT! -# This file was automatically generated by "generate_id_constants.py" +# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" import enum class UnitTypeId(enum.Enum): - INVALID = 0 + NOTAUNIT = 0 + SYSTEM_SNAPSHOT_DUMMY = 1 + BALL = 2 + STEREOSCOPICOPTIONSUNIT = 3 COLOSSUS = 4 - PROTOSS_COLOSSUS = 4 TECHLAB = 5 - TERRAN_TECHLAB = 5 REACTOR = 6 - TERRAN_REACTOR = 6 INFESTORTERRAN = 7 - ZERG_INFESTORTERRAN = 7 BANELINGCOCOON = 8 - ZERG_BANELINGCOCOON = 8 BANELING = 9 - ZERG_BANELING = 9 MOTHERSHIP = 10 - PROTOSS_MOTHERSHIP = 10 POINTDEFENSEDRONE = 11 - TERRAN_POINTDEFENSEDRONE = 11 CHANGELING = 12 - ZERG_CHANGELING = 12 CHANGELINGZEALOT = 13 - ZERG_CHANGELINGZEALOT = 13 CHANGELINGMARINESHIELD = 14 - ZERG_CHANGELINGMARINESHIELD = 14 CHANGELINGMARINE = 15 - ZERG_CHANGELINGMARINE = 15 CHANGELINGZERGLINGWINGS = 16 - ZERG_CHANGELINGZERGLINGWINGS = 16 CHANGELINGZERGLING = 17 - ZERG_CHANGELINGZERGLING = 17 COMMANDCENTER = 18 - TERRAN_COMMANDCENTER = 18 SUPPLYDEPOT = 19 - TERRAN_SUPPLYDEPOT = 19 REFINERY = 20 - TERRAN_REFINERY = 20 BARRACKS = 21 - TERRAN_BARRACKS = 21 ENGINEERINGBAY = 22 - TERRAN_ENGINEERINGBAY = 22 MISSILETURRET = 23 - TERRAN_MISSILETURRET = 23 BUNKER = 24 - TERRAN_BUNKER = 24 SENSORTOWER = 25 - TERRAN_SENSORTOWER = 25 GHOSTACADEMY = 26 - TERRAN_GHOSTACADEMY = 26 FACTORY = 27 - TERRAN_FACTORY = 27 STARPORT = 28 - TERRAN_STARPORT = 28 ARMORY = 29 - TERRAN_ARMORY = 29 FUSIONCORE = 30 - TERRAN_FUSIONCORE = 30 AUTOTURRET = 31 - TERRAN_AUTOTURRET = 31 SIEGETANKSIEGED = 32 - TERRAN_SIEGETANKSIEGED = 32 SIEGETANK = 33 - TERRAN_SIEGETANK = 33 VIKINGASSAULT = 34 - TERRAN_VIKINGASSAULT = 34 VIKINGFIGHTER = 35 - TERRAN_VIKINGFIGHTER = 35 COMMANDCENTERFLYING = 36 - TERRAN_COMMANDCENTERFLYING = 36 BARRACKSTECHLAB = 37 - TERRAN_BARRACKSTECHLAB = 37 BARRACKSREACTOR = 38 - TERRAN_BARRACKSREACTOR = 38 FACTORYTECHLAB = 39 - TERRAN_FACTORYTECHLAB = 39 FACTORYREACTOR = 40 - TERRAN_FACTORYREACTOR = 40 STARPORTTECHLAB = 41 - TERRAN_STARPORTTECHLAB = 41 STARPORTREACTOR = 42 - TERRAN_STARPORTREACTOR = 42 FACTORYFLYING = 43 - TERRAN_FACTORYFLYING = 43 STARPORTFLYING = 44 - TERRAN_STARPORTFLYING = 44 SCV = 45 - TERRAN_SCV = 45 BARRACKSFLYING = 46 - TERRAN_BARRACKSFLYING = 46 SUPPLYDEPOTLOWERED = 47 - TERRAN_SUPPLYDEPOTLOWERED = 47 MARINE = 48 - TERRAN_MARINE = 48 REAPER = 49 - TERRAN_REAPER = 49 GHOST = 50 - TERRAN_GHOST = 50 MARAUDER = 51 - TERRAN_MARAUDER = 51 THOR = 52 - TERRAN_THOR = 52 HELLION = 53 - TERRAN_HELLION = 53 MEDIVAC = 54 - TERRAN_MEDIVAC = 54 BANSHEE = 55 - TERRAN_BANSHEE = 55 RAVEN = 56 - TERRAN_RAVEN = 56 BATTLECRUISER = 57 - TERRAN_BATTLECRUISER = 57 NUKE = 58 - TERRAN_NUKE = 58 NEXUS = 59 - PROTOSS_NEXUS = 59 PYLON = 60 - PROTOSS_PYLON = 60 ASSIMILATOR = 61 - PROTOSS_ASSIMILATOR = 61 GATEWAY = 62 - PROTOSS_GATEWAY = 62 FORGE = 63 - PROTOSS_FORGE = 63 FLEETBEACON = 64 - PROTOSS_FLEETBEACON = 64 TWILIGHTCOUNCIL = 65 - PROTOSS_TWILIGHTCOUNCIL = 65 PHOTONCANNON = 66 - PROTOSS_PHOTONCANNON = 66 STARGATE = 67 - PROTOSS_STARGATE = 67 TEMPLARARCHIVE = 68 - PROTOSS_TEMPLARARCHIVE = 68 DARKSHRINE = 69 - PROTOSS_DARKSHRINE = 69 ROBOTICSBAY = 70 - PROTOSS_ROBOTICSBAY = 70 ROBOTICSFACILITY = 71 - PROTOSS_ROBOTICSFACILITY = 71 CYBERNETICSCORE = 72 - PROTOSS_CYBERNETICSCORE = 72 ZEALOT = 73 - PROTOSS_ZEALOT = 73 STALKER = 74 - PROTOSS_STALKER = 74 HIGHTEMPLAR = 75 - PROTOSS_HIGHTEMPLAR = 75 DARKTEMPLAR = 76 - PROTOSS_DARKTEMPLAR = 76 SENTRY = 77 - PROTOSS_SENTRY = 77 PHOENIX = 78 - PROTOSS_PHOENIX = 78 CARRIER = 79 - PROTOSS_CARRIER = 79 VOIDRAY = 80 - PROTOSS_VOIDRAY = 80 WARPPRISM = 81 - PROTOSS_WARPPRISM = 81 OBSERVER = 82 - PROTOSS_OBSERVER = 82 IMMORTAL = 83 - PROTOSS_IMMORTAL = 83 PROBE = 84 - PROTOSS_PROBE = 84 INTERCEPTOR = 85 - PROTOSS_INTERCEPTOR = 85 HATCHERY = 86 - ZERG_HATCHERY = 86 CREEPTUMOR = 87 - ZERG_CREEPTUMOR = 87 EXTRACTOR = 88 - ZERG_EXTRACTOR = 88 SPAWNINGPOOL = 89 - ZERG_SPAWNINGPOOL = 89 EVOLUTIONCHAMBER = 90 - ZERG_EVOLUTIONCHAMBER = 90 HYDRALISKDEN = 91 - ZERG_HYDRALISKDEN = 91 SPIRE = 92 - ZERG_SPIRE = 92 ULTRALISKCAVERN = 93 - ZERG_ULTRALISKCAVERN = 93 INFESTATIONPIT = 94 - ZERG_INFESTATIONPIT = 94 NYDUSNETWORK = 95 - ZERG_NYDUSNETWORK = 95 BANELINGNEST = 96 - ZERG_BANELINGNEST = 96 ROACHWARREN = 97 - ZERG_ROACHWARREN = 97 SPINECRAWLER = 98 - ZERG_SPINECRAWLER = 98 SPORECRAWLER = 99 - ZERG_SPORECRAWLER = 99 LAIR = 100 - ZERG_LAIR = 100 HIVE = 101 - ZERG_HIVE = 101 GREATERSPIRE = 102 - ZERG_GREATERSPIRE = 102 EGG = 103 - ZERG_EGG = 103 DRONE = 104 - ZERG_DRONE = 104 ZERGLING = 105 - ZERG_ZERGLING = 105 OVERLORD = 106 - ZERG_OVERLORD = 106 HYDRALISK = 107 - ZERG_HYDRALISK = 107 MUTALISK = 108 - ZERG_MUTALISK = 108 ULTRALISK = 109 - ZERG_ULTRALISK = 109 ROACH = 110 - ZERG_ROACH = 110 INFESTOR = 111 - ZERG_INFESTOR = 111 CORRUPTOR = 112 - ZERG_CORRUPTOR = 112 BROODLORDCOCOON = 113 - ZERG_BROODLORDCOCOON = 113 BROODLORD = 114 - ZERG_BROODLORD = 114 BANELINGBURROWED = 115 - ZERG_BANELINGBURROWED = 115 DRONEBURROWED = 116 - ZERG_DRONEBURROWED = 116 HYDRALISKBURROWED = 117 - ZERG_HYDRALISKBURROWED = 117 ROACHBURROWED = 118 - ZERG_ROACHBURROWED = 118 ZERGLINGBURROWED = 119 - ZERG_ZERGLINGBURROWED = 119 + INFESTORTERRANBURROWED = 120 + REDSTONELAVACRITTERBURROWED = 121 + REDSTONELAVACRITTERINJUREDBURROWED = 122 + REDSTONELAVACRITTER = 123 + REDSTONELAVACRITTERINJURED = 124 QUEENBURROWED = 125 - ZERG_QUEENBURROWED = 125 QUEEN = 126 - ZERG_QUEEN = 126 INFESTORBURROWED = 127 - ZERG_INFESTORBURROWED = 127 OVERLORDCOCOON = 128 - ZERG_OVERLORDCOCOON = 128 OVERSEER = 129 - ZERG_OVERSEER = 129 PLANETARYFORTRESS = 130 - TERRAN_PLANETARYFORTRESS = 130 + ULTRALISKBURROWED = 131 ORBITALCOMMAND = 132 - TERRAN_ORBITALCOMMAND = 132 WARPGATE = 133 - PROTOSS_WARPGATE = 133 ORBITALCOMMANDFLYING = 134 - TERRAN_ORBITALCOMMANDFLYING = 134 FORCEFIELD = 135 - NEUTRAL_FORCEFIELD = 135 WARPPRISMPHASING = 136 - PROTOSS_WARPPRISMPHASING = 136 CREEPTUMORBURROWED = 137 - ZERG_CREEPTUMORBURROWED = 137 CREEPTUMORQUEEN = 138 - ZERG_CREEPTUMORQUEEN = 138 SPINECRAWLERUPROOTED = 139 - ZERG_SPINECRAWLERUPROOTED = 139 SPORECRAWLERUPROOTED = 140 - ZERG_SPORECRAWLERUPROOTED = 140 ARCHON = 141 - PROTOSS_ARCHON = 141 NYDUSCANAL = 142 - ZERG_NYDUSCANAL = 142 + BROODLINGESCORT = 143 + GHOSTALTERNATE = 144 + GHOSTNOVA = 145 RICHMINERALFIELD = 146 - NEUTRAL_RICHMINERALFIELD = 146 RICHMINERALFIELD750 = 147 - NEUTRAL_RICHMINERALFIELD750 = 147 + URSADON = 148 XELNAGATOWER = 149 - NEUTRAL_XELNAGATOWER = 149 INFESTEDTERRANSEGG = 150 - ZERG_INFESTEDTERRANSEGG = 150 LARVA = 151 - ZERG_LARVA = 151 + REAPERPLACEHOLDER = 152 + MARINEACGLUESCREENDUMMY = 153 + FIREBATACGLUESCREENDUMMY = 154 + MEDICACGLUESCREENDUMMY = 155 + MARAUDERACGLUESCREENDUMMY = 156 + VULTUREACGLUESCREENDUMMY = 157 + SIEGETANKACGLUESCREENDUMMY = 158 + VIKINGACGLUESCREENDUMMY = 159 + BANSHEEACGLUESCREENDUMMY = 160 + BATTLECRUISERACGLUESCREENDUMMY = 161 + ORBITALCOMMANDACGLUESCREENDUMMY = 162 + BUNKERACGLUESCREENDUMMY = 163 + BUNKERUPGRADEDACGLUESCREENDUMMY = 164 + MISSILETURRETACGLUESCREENDUMMY = 165 + HELLBATACGLUESCREENDUMMY = 166 + GOLIATHACGLUESCREENDUMMY = 167 + CYCLONEACGLUESCREENDUMMY = 168 + WRAITHACGLUESCREENDUMMY = 169 + SCIENCEVESSELACGLUESCREENDUMMY = 170 + HERCULESACGLUESCREENDUMMY = 171 + THORACGLUESCREENDUMMY = 172 + PERDITIONTURRETACGLUESCREENDUMMY = 173 + FLAMINGBETTYACGLUESCREENDUMMY = 174 + DEVASTATIONTURRETACGLUESCREENDUMMY = 175 + BLASTERBILLYACGLUESCREENDUMMY = 176 + SPINNINGDIZZYACGLUESCREENDUMMY = 177 + ZERGLINGKERRIGANACGLUESCREENDUMMY = 178 + RAPTORACGLUESCREENDUMMY = 179 + QUEENCOOPACGLUESCREENDUMMY = 180 + HYDRALISKACGLUESCREENDUMMY = 181 + HYDRALISKLURKERACGLUESCREENDUMMY = 182 + MUTALISKBROODLORDACGLUESCREENDUMMY = 183 + BROODLORDACGLUESCREENDUMMY = 184 + ULTRALISKACGLUESCREENDUMMY = 185 + TORRASQUEACGLUESCREENDUMMY = 186 + OVERSEERACGLUESCREENDUMMY = 187 + LURKERACGLUESCREENDUMMY = 188 + SPINECRAWLERACGLUESCREENDUMMY = 189 + SPORECRAWLERACGLUESCREENDUMMY = 190 + NYDUSNETWORKACGLUESCREENDUMMY = 191 + OMEGANETWORKACGLUESCREENDUMMY = 192 + ZERGLINGZAGARAACGLUESCREENDUMMY = 193 + SWARMLINGACGLUESCREENDUMMY = 194 + BANELINGACGLUESCREENDUMMY = 195 + SPLITTERLINGACGLUESCREENDUMMY = 196 + ABERRATIONACGLUESCREENDUMMY = 197 + SCOURGEACGLUESCREENDUMMY = 198 + CORRUPTORACGLUESCREENDUMMY = 199 + BILELAUNCHERACGLUESCREENDUMMY = 200 + SWARMQUEENACGLUESCREENDUMMY = 201 + ROACHACGLUESCREENDUMMY = 202 + ROACHVILEACGLUESCREENDUMMY = 203 + RAVAGERACGLUESCREENDUMMY = 204 + SWARMHOSTACGLUESCREENDUMMY = 205 + MUTALISKACGLUESCREENDUMMY = 206 + GUARDIANACGLUESCREENDUMMY = 207 + DEVOURERACGLUESCREENDUMMY = 208 + VIPERACGLUESCREENDUMMY = 209 + BRUTALISKACGLUESCREENDUMMY = 210 + LEVIATHANACGLUESCREENDUMMY = 211 + ZEALOTACGLUESCREENDUMMY = 212 + ZEALOTAIURACGLUESCREENDUMMY = 213 + DRAGOONACGLUESCREENDUMMY = 214 + HIGHTEMPLARACGLUESCREENDUMMY = 215 + ARCHONACGLUESCREENDUMMY = 216 + IMMORTALACGLUESCREENDUMMY = 217 + OBSERVERACGLUESCREENDUMMY = 218 + PHOENIXAIURACGLUESCREENDUMMY = 219 + REAVERACGLUESCREENDUMMY = 220 + TEMPESTACGLUESCREENDUMMY = 221 + PHOTONCANNONACGLUESCREENDUMMY = 222 + ZEALOTVORAZUNACGLUESCREENDUMMY = 223 + ZEALOTSHAKURASACGLUESCREENDUMMY = 224 + STALKERSHAKURASACGLUESCREENDUMMY = 225 + DARKTEMPLARSHAKURASACGLUESCREENDUMMY = 226 + CORSAIRACGLUESCREENDUMMY = 227 + VOIDRAYACGLUESCREENDUMMY = 228 + VOIDRAYSHAKURASACGLUESCREENDUMMY = 229 + ORACLEACGLUESCREENDUMMY = 230 + DARKARCHONACGLUESCREENDUMMY = 231 + DARKPYLONACGLUESCREENDUMMY = 232 + ZEALOTPURIFIERACGLUESCREENDUMMY = 233 + SENTRYPURIFIERACGLUESCREENDUMMY = 234 + IMMORTALKARAXACGLUESCREENDUMMY = 235 + COLOSSUSACGLUESCREENDUMMY = 236 + COLOSSUSPURIFIERACGLUESCREENDUMMY = 237 + PHOENIXPURIFIERACGLUESCREENDUMMY = 238 + CARRIERACGLUESCREENDUMMY = 239 + CARRIERAIURACGLUESCREENDUMMY = 240 + KHAYDARINMONOLITHACGLUESCREENDUMMY = 241 + SHIELDBATTERYACGLUESCREENDUMMY = 242 + ELITEMARINEACGLUESCREENDUMMY = 243 + MARAUDERCOMMANDOACGLUESCREENDUMMY = 244 + SPECOPSGHOSTACGLUESCREENDUMMY = 245 + HELLBATRANGERACGLUESCREENDUMMY = 246 + STRIKEGOLIATHACGLUESCREENDUMMY = 247 + HEAVYSIEGETANKACGLUESCREENDUMMY = 248 + RAIDLIBERATORACGLUESCREENDUMMY = 249 + RAVENTYPEIIACGLUESCREENDUMMY = 250 + COVERTBANSHEEACGLUESCREENDUMMY = 251 + RAILGUNTURRETACGLUESCREENDUMMY = 252 + BLACKOPSMISSILETURRETACGLUESCREENDUMMY = 253 + SUPPLICANTACGLUESCREENDUMMY = 254 + STALKERTALDARIMACGLUESCREENDUMMY = 255 + SENTRYTALDARIMACGLUESCREENDUMMY = 256 + HIGHTEMPLARTALDARIMACGLUESCREENDUMMY = 257 + IMMORTALTALDARIMACGLUESCREENDUMMY = 258 + COLOSSUSTALDARIMACGLUESCREENDUMMY = 259 + WARPPRISMTALDARIMACGLUESCREENDUMMY = 260 + PHOTONCANNONTALDARIMACGLUESCREENDUMMY = 261 + NEEDLESPINESWEAPON = 262 + CORRUPTIONWEAPON = 263 + INFESTEDTERRANSWEAPON = 264 + NEURALPARASITEWEAPON = 265 + POINTDEFENSEDRONERELEASEWEAPON = 266 + HUNTERSEEKERWEAPON = 267 MULE = 268 - TERRAN_MULE = 268 + THORAAWEAPON = 269 + PUNISHERGRENADESLMWEAPON = 270 + VIKINGFIGHTERWEAPON = 271 + ATALASERBATTERYLMWEAPON = 272 + ATSLASERBATTERYLMWEAPON = 273 + LONGBOLTMISSILEWEAPON = 274 + D8CHARGEWEAPON = 275 + YAMATOWEAPON = 276 + IONCANNONSWEAPON = 277 + ACIDSALIVAWEAPON = 278 + SPINECRAWLERWEAPON = 279 + SPORECRAWLERWEAPON = 280 + GLAIVEWURMWEAPON = 281 + GLAIVEWURMM2WEAPON = 282 + GLAIVEWURMM3WEAPON = 283 + STALKERWEAPON = 284 + EMP2WEAPON = 285 + BACKLASHROCKETSLMWEAPON = 286 + PHOTONCANNONWEAPON = 287 + PARASITESPOREWEAPON = 288 BROODLING = 289 - ZERG_BROODLING = 289 + BROODLORDBWEAPON = 290 + AUTOTURRETRELEASEWEAPON = 291 + LARVARELEASEMISSILE = 292 + ACIDSPINESWEAPON = 293 + FRENZYWEAPON = 294 + CONTAMINATEWEAPON = 295 + BEACONRALLY = 296 + BEACONARMY = 297 + BEACONATTACK = 298 + BEACONDEFEND = 299 + BEACONHARASS = 300 + BEACONIDLE = 301 + BEACONAUTO = 302 + BEACONDETECT = 303 + BEACONSCOUT = 304 + BEACONCLAIM = 305 + BEACONEXPAND = 306 + BEACONCUSTOM1 = 307 + BEACONCUSTOM2 = 308 + BEACONCUSTOM3 = 309 + BEACONCUSTOM4 = 310 ADEPT = 311 - PROTOSS_ADEPT = 311 + ROCKS2X2NONCONJOINED = 312 + FUNGALGROWTHMISSILE = 313 + NEURALPARASITETENTACLEMISSILE = 314 + BEACON_PROTOSS = 315 + BEACON_PROTOSSSMALL = 316 + BEACON_TERRAN = 317 + BEACON_TERRANSMALL = 318 + BEACON_ZERG = 319 + BEACON_ZERGSMALL = 320 + LYOTE = 321 + CARRIONBIRD = 322 + KARAKMALE = 323 KARAKFEMALE = 324 - NEUTRAL_KARAKFEMALE = 324 + URSADAKFEMALEEXOTIC = 325 + URSADAKMALE = 326 + URSADAKFEMALE = 327 + URSADAKCALF = 328 + URSADAKMALEEXOTIC = 329 UTILITYBOT = 330 - NEUTRAL_UTILITYBOT = 330 + COMMENTATORBOT1 = 331 + COMMENTATORBOT2 = 332 + COMMENTATORBOT3 = 333 + COMMENTATORBOT4 = 334 SCANTIPEDE = 335 - NEUTRAL_SCANTIPEDE = 335 + DOG = 336 + SHEEP = 337 + COW = 338 + INFESTEDTERRANSEGGPLACEMENT = 339 + INFESTORTERRANSWEAPON = 340 MINERALFIELD = 341 - NEUTRAL_MINERALFIELD = 341 VESPENEGEYSER = 342 - NEUTRAL_VESPENEGEYSER = 342 SPACEPLATFORMGEYSER = 343 - NEUTRAL_SPACEPLATFORMGEYSER = 343 RICHVESPENEGEYSER = 344 - NEUTRAL_RICHVESPENEGEYSER = 344 + DESTRUCTIBLESEARCHLIGHT = 345 + DESTRUCTIBLEBULLHORNLIGHTS = 346 + DESTRUCTIBLESTREETLIGHT = 347 + DESTRUCTIBLESPACEPLATFORMSIGN = 348 + DESTRUCTIBLESTOREFRONTCITYPROPS = 349 + DESTRUCTIBLEBILLBOARDTALL = 350 + DESTRUCTIBLEBILLBOARDSCROLLINGTEXT = 351 + DESTRUCTIBLESPACEPLATFORMBARRIER = 352 + DESTRUCTIBLESIGNSDIRECTIONAL = 353 + DESTRUCTIBLESIGNSCONSTRUCTION = 354 + DESTRUCTIBLESIGNSFUNNY = 355 + DESTRUCTIBLESIGNSICONS = 356 + DESTRUCTIBLESIGNSWARNING = 357 + DESTRUCTIBLEGARAGE = 358 + DESTRUCTIBLEGARAGELARGE = 359 + DESTRUCTIBLETRAFFICSIGNAL = 360 + TRAFFICSIGNAL = 361 + BRAXISALPHADESTRUCTIBLE1X1 = 362 + BRAXISALPHADESTRUCTIBLE2X2 = 363 + DESTRUCTIBLEDEBRIS4X4 = 364 DESTRUCTIBLEDEBRIS6X6 = 365 - NEUTRAL_DESTRUCTIBLEDEBRIS6X6 = 365 + DESTRUCTIBLEROCK2X4VERTICAL = 366 + DESTRUCTIBLEROCK2X4HORIZONTAL = 367 + DESTRUCTIBLEROCK2X6VERTICAL = 368 + DESTRUCTIBLEROCK2X6HORIZONTAL = 369 + DESTRUCTIBLEROCK4X4 = 370 DESTRUCTIBLEROCK6X6 = 371 - NEUTRAL_DESTRUCTIBLEROCK6X6 = 371 + DESTRUCTIBLERAMPDIAGONALHUGEULBR = 372 + DESTRUCTIBLERAMPDIAGONALHUGEBLUR = 373 + DESTRUCTIBLERAMPVERTICALHUGE = 374 + DESTRUCTIBLERAMPHORIZONTALHUGE = 375 DESTRUCTIBLEDEBRISRAMPDIAGONALHUGEULBR = 376 - NEUTRAL_DESTRUCTIBLEDEBRISRAMPDIAGONALHUGEULBR = 376 DESTRUCTIBLEDEBRISRAMPDIAGONALHUGEBLUR = 377 - NEUTRAL_DESTRUCTIBLEDEBRISRAMPDIAGONALHUGEBLUR = 377 + OVERLORDGENERATECREEPKEYBIND = 378 + MENGSKSTATUEALONE = 379 + MENGSKSTATUE = 380 + WOLFSTATUE = 381 + GLOBESTATUE = 382 + WEAPON = 383 + GLAIVEWURMBOUNCEWEAPON = 384 + BROODLORDWEAPON = 385 + BROODLORDAWEAPON = 386 + CREEPBLOCKER1X1 = 387 + PERMANENTCREEPBLOCKER1X1 = 388 + PATHINGBLOCKER1X1 = 389 + PATHINGBLOCKER2X2 = 390 + AUTOTESTATTACKTARGETGROUND = 391 + AUTOTESTATTACKTARGETAIR = 392 + AUTOTESTATTACKER = 393 + HELPEREMITTERSELECTIONARROW = 394 + MULTIKILLOBJECT = 395 + SHAPEGOLFBALL = 396 + SHAPECONE = 397 + SHAPECUBE = 398 + SHAPECYLINDER = 399 + SHAPEDODECAHEDRON = 400 + SHAPEICOSAHEDRON = 401 + SHAPEOCTAHEDRON = 402 + SHAPEPYRAMID = 403 + SHAPEROUNDEDCUBE = 404 + SHAPESPHERE = 405 + SHAPETETRAHEDRON = 406 + SHAPETHICKTORUS = 407 + SHAPETHINTORUS = 408 + SHAPETORUS = 409 + SHAPE4POINTSTAR = 410 + SHAPE5POINTSTAR = 411 + SHAPE6POINTSTAR = 412 + SHAPE8POINTSTAR = 413 + SHAPEARROWPOINTER = 414 + SHAPEBOWL = 415 + SHAPEBOX = 416 + SHAPECAPSULE = 417 + SHAPECRESCENTMOON = 418 + SHAPEDECAHEDRON = 419 + SHAPEDIAMOND = 420 + SHAPEFOOTBALL = 421 + SHAPEGEMSTONE = 422 + SHAPEHEART = 423 + SHAPEJACK = 424 + SHAPEPLUSSIGN = 425 + SHAPESHAMROCK = 426 + SHAPESPADE = 427 + SHAPETUBE = 428 + SHAPEEGG = 429 + SHAPEYENSIGN = 430 + SHAPEX = 431 + SHAPEWATERMELON = 432 + SHAPEWONSIGN = 433 + SHAPETENNISBALL = 434 + SHAPESTRAWBERRY = 435 + SHAPESMILEYFACE = 436 + SHAPESOCCERBALL = 437 + SHAPERAINBOW = 438 + SHAPESADFACE = 439 + SHAPEPOUNDSIGN = 440 + SHAPEPEAR = 441 + SHAPEPINEAPPLE = 442 + SHAPEORANGE = 443 + SHAPEPEANUT = 444 + SHAPEO = 445 + SHAPELEMON = 446 + SHAPEMONEYBAG = 447 + SHAPEHORSESHOE = 448 + SHAPEHOCKEYSTICK = 449 + SHAPEHOCKEYPUCK = 450 + SHAPEHAND = 451 + SHAPEGOLFCLUB = 452 + SHAPEGRAPE = 453 + SHAPEEUROSIGN = 454 + SHAPEDOLLARSIGN = 455 + SHAPEBASKETBALL = 456 + SHAPECARROT = 457 + SHAPECHERRY = 458 + SHAPEBASEBALL = 459 + SHAPEBASEBALLBAT = 460 + SHAPEBANANA = 461 + SHAPEAPPLE = 462 + SHAPECASHLARGE = 463 + SHAPECASHMEDIUM = 464 + SHAPECASHSMALL = 465 + SHAPEFOOTBALLCOLORED = 466 + SHAPELEMONSMALL = 467 + SHAPEORANGESMALL = 468 + SHAPETREASURECHESTOPEN = 469 + SHAPETREASURECHESTCLOSED = 470 + SHAPEWATERMELONSMALL = 471 + UNBUILDABLEROCKSDESTRUCTIBLE = 472 UNBUILDABLEBRICKSDESTRUCTIBLE = 473 - NEUTRAL_UNBUILDABLEBRICKSDESTRUCTIBLE = 473 UNBUILDABLEPLATESDESTRUCTIBLE = 474 - NEUTRAL_UNBUILDABLEPLATESDESTRUCTIBLE = 474 + DEBRIS2X2NONCONJOINED = 475 + ENEMYPATHINGBLOCKER1X1 = 476 + ENEMYPATHINGBLOCKER2X2 = 477 + ENEMYPATHINGBLOCKER4X4 = 478 + ENEMYPATHINGBLOCKER8X8 = 479 + ENEMYPATHINGBLOCKER16X16 = 480 + SCOPETEST = 481 + SENTRYACGLUESCREENDUMMY = 482 MINERALFIELD750 = 483 - NEUTRAL_MINERALFIELD750 = 483 HELLIONTANK = 484 - TERRAN_HELLIONTANK = 484 COLLAPSIBLETERRANTOWERDEBRIS = 485 - NEUTRAL_COLLAPSIBLETERRANTOWERDEBRIS = 485 DEBRISRAMPLEFT = 486 - NEUTRAL_DEBRISRAMPLEFT = 486 DEBRISRAMPRIGHT = 487 - NEUTRAL_DEBRISRAMPRIGHT = 487 MOTHERSHIPCORE = 488 - PROTOSS_MOTHERSHIPCORE = 488 LOCUSTMP = 489 - ZERG_LOCUSTMP = 489 COLLAPSIBLEROCKTOWERDEBRIS = 490 - NEUTRAL_COLLAPSIBLEROCKTOWERDEBRIS = 490 + NYDUSCANALATTACKER = 491 + NYDUSCANALCREEPER = 492 SWARMHOSTBURROWEDMP = 493 - ZERG_SWARMHOSTBURROWEDMP = 493 SWARMHOSTMP = 494 - ZERG_SWARMHOSTMP = 494 ORACLE = 495 - PROTOSS_ORACLE = 495 TEMPEST = 496 - PROTOSS_TEMPEST = 496 + WARHOUND = 497 WIDOWMINE = 498 - TERRAN_WIDOWMINE = 498 VIPER = 499 - ZERG_VIPER = 499 WIDOWMINEBURROWED = 500 - TERRAN_WIDOWMINEBURROWED = 500 LURKERMPEGG = 501 - ZERG_LURKERMPEGG = 501 LURKERMP = 502 - ZERG_LURKERMP = 502 LURKERMPBURROWED = 503 - ZERG_LURKERMPBURROWED = 503 LURKERDENMP = 504 - ZERG_LURKERDENMP = 504 + EXTENDINGBRIDGENEWIDE8OUT = 505 + EXTENDINGBRIDGENEWIDE8 = 506 + EXTENDINGBRIDGENWWIDE8OUT = 507 + EXTENDINGBRIDGENWWIDE8 = 508 + EXTENDINGBRIDGENEWIDE10OUT = 509 + EXTENDINGBRIDGENEWIDE10 = 510 + EXTENDINGBRIDGENWWIDE10OUT = 511 + EXTENDINGBRIDGENWWIDE10 = 512 + EXTENDINGBRIDGENEWIDE12OUT = 513 + EXTENDINGBRIDGENEWIDE12 = 514 + EXTENDINGBRIDGENWWIDE12OUT = 515 + EXTENDINGBRIDGENWWIDE12 = 516 + COLLAPSIBLEROCKTOWERDEBRISRAMPRIGHT = 517 + COLLAPSIBLEROCKTOWERDEBRISRAMPLEFT = 518 + XELNAGA_CAVERNS_DOORE = 519 + XELNAGA_CAVERNS_DOOREOPENED = 520 + XELNAGA_CAVERNS_DOORN = 521 + XELNAGA_CAVERNS_DOORNE = 522 + XELNAGA_CAVERNS_DOORNEOPENED = 523 + XELNAGA_CAVERNS_DOORNOPENED = 524 + XELNAGA_CAVERNS_DOORNW = 525 + XELNAGA_CAVERNS_DOORNWOPENED = 526 + XELNAGA_CAVERNS_DOORS = 527 + XELNAGA_CAVERNS_DOORSE = 528 + XELNAGA_CAVERNS_DOORSEOPENED = 529 + XELNAGA_CAVERNS_DOORSOPENED = 530 + XELNAGA_CAVERNS_DOORSW = 531 + XELNAGA_CAVERNS_DOORSWOPENED = 532 + XELNAGA_CAVERNS_DOORW = 533 + XELNAGA_CAVERNS_DOORWOPENED = 534 + XELNAGA_CAVERNS_FLOATING_BRIDGENE8OUT = 535 + XELNAGA_CAVERNS_FLOATING_BRIDGENE8 = 536 + XELNAGA_CAVERNS_FLOATING_BRIDGENW8OUT = 537 + XELNAGA_CAVERNS_FLOATING_BRIDGENW8 = 538 + XELNAGA_CAVERNS_FLOATING_BRIDGENE10OUT = 539 + XELNAGA_CAVERNS_FLOATING_BRIDGENE10 = 540 + XELNAGA_CAVERNS_FLOATING_BRIDGENW10OUT = 541 + XELNAGA_CAVERNS_FLOATING_BRIDGENW10 = 542 + XELNAGA_CAVERNS_FLOATING_BRIDGENE12OUT = 543 + XELNAGA_CAVERNS_FLOATING_BRIDGENE12 = 544 + XELNAGA_CAVERNS_FLOATING_BRIDGENW12OUT = 545 + XELNAGA_CAVERNS_FLOATING_BRIDGENW12 = 546 + XELNAGA_CAVERNS_FLOATING_BRIDGEH8OUT = 547 + XELNAGA_CAVERNS_FLOATING_BRIDGEH8 = 548 + XELNAGA_CAVERNS_FLOATING_BRIDGEV8OUT = 549 + XELNAGA_CAVERNS_FLOATING_BRIDGEV8 = 550 + XELNAGA_CAVERNS_FLOATING_BRIDGEH10OUT = 551 + XELNAGA_CAVERNS_FLOATING_BRIDGEH10 = 552 + XELNAGA_CAVERNS_FLOATING_BRIDGEV10OUT = 553 + XELNAGA_CAVERNS_FLOATING_BRIDGEV10 = 554 + XELNAGA_CAVERNS_FLOATING_BRIDGEH12OUT = 555 + XELNAGA_CAVERNS_FLOATING_BRIDGEH12 = 556 + XELNAGA_CAVERNS_FLOATING_BRIDGEV12OUT = 557 + XELNAGA_CAVERNS_FLOATING_BRIDGEV12 = 558 COLLAPSIBLETERRANTOWERPUSHUNITRAMPLEFT = 559 - NEUTRAL_COLLAPSIBLETERRANTOWERPUSHUNITRAMPLEFT = 559 COLLAPSIBLETERRANTOWERPUSHUNITRAMPRIGHT = 560 - NEUTRAL_COLLAPSIBLETERRANTOWERPUSHUNITRAMPRIGHT = 560 COLLAPSIBLEROCKTOWERPUSHUNIT = 561 - NEUTRAL_COLLAPSIBLEROCKTOWERPUSHUNIT = 561 COLLAPSIBLETERRANTOWERPUSHUNIT = 562 - NEUTRAL_COLLAPSIBLETERRANTOWERPUSHUNIT = 562 + COLLAPSIBLEROCKTOWERPUSHUNITRAMPRIGHT = 563 + COLLAPSIBLEROCKTOWERPUSHUNITRAMPLEFT = 564 + DIGESTERCREEPSPRAYTARGETUNIT = 565 + DIGESTERCREEPSPRAYUNIT = 566 + NYDUSCANALATTACKERWEAPON = 567 + VIPERCONSUMESTRUCTUREWEAPON = 568 + RESOURCEBLOCKER = 569 + TEMPESTWEAPON = 570 + YOINKMISSILE = 571 + YOINKVIKINGAIRMISSILE = 572 + YOINKVIKINGGROUNDMISSILE = 573 + YOINKSIEGETANKMISSILE = 574 + WARHOUNDWEAPON = 575 + EYESTALKWEAPON = 576 + WIDOWMINEWEAPON = 577 + WIDOWMINEAIRWEAPON = 578 + MOTHERSHIPCOREWEAPONWEAPON = 579 + TORNADOMISSILEWEAPON = 580 + TORNADOMISSILEDUMMYWEAPON = 581 + TALONSMISSILEWEAPON = 582 + CREEPTUMORMISSILE = 583 + LOCUSTMPEGGAMISSILEWEAPON = 584 + LOCUSTMPEGGBMISSILEWEAPON = 585 + LOCUSTMPWEAPON = 586 + REPULSORCANNONWEAPON = 587 COLLAPSIBLEROCKTOWERDIAGONAL = 588 - NEUTRAL_COLLAPSIBLEROCKTOWERDIAGONAL = 588 COLLAPSIBLETERRANTOWERDIAGONAL = 589 - NEUTRAL_COLLAPSIBLETERRANTOWERDIAGONAL = 589 COLLAPSIBLETERRANTOWERRAMPLEFT = 590 - NEUTRAL_COLLAPSIBLETERRANTOWERRAMPLEFT = 590 COLLAPSIBLETERRANTOWERRAMPRIGHT = 591 - NEUTRAL_COLLAPSIBLETERRANTOWERRAMPRIGHT = 591 + ICE2X2NONCONJOINED = 592 + ICEPROTOSSCRATES = 593 + PROTOSSCRATES = 594 + TOWERMINE = 595 + PICKUPPALLETGAS = 596 + PICKUPPALLETMINERALS = 597 + PICKUPSCRAPSALVAGE1X1 = 598 + PICKUPSCRAPSALVAGE2X2 = 599 + PICKUPSCRAPSALVAGE3X3 = 600 + ROUGHTERRAIN = 601 + UNBUILDABLEBRICKSSMALLUNIT = 602 + UNBUILDABLEPLATESSMALLUNIT = 603 + UNBUILDABLEPLATESUNIT = 604 + UNBUILDABLEROCKSSMALLUNIT = 605 + XELNAGAHEALINGSHRINE = 606 + INVISIBLETARGETDUMMY = 607 PROTOSSVESPENEGEYSER = 608 - NEUTRAL_PROTOSSVESPENEGEYSER = 608 + COLLAPSIBLEROCKTOWER = 609 + COLLAPSIBLETERRANTOWER = 610 + THORNLIZARD = 611 + CLEANINGBOT = 612 + DESTRUCTIBLEROCK6X6WEAK = 613 + PROTOSSSNAKESEGMENTDEMO = 614 + PHYSICSCAPSULE = 615 + PHYSICSCUBE = 616 + PHYSICSCYLINDER = 617 + PHYSICSKNOT = 618 + PHYSICSL = 619 + PHYSICSPRIMITIVES = 620 + PHYSICSSPHERE = 621 + PHYSICSSTAR = 622 + CREEPBLOCKER4X4 = 623 + DESTRUCTIBLECITYDEBRIS2X4VERTICAL = 624 + DESTRUCTIBLECITYDEBRIS2X4HORIZONTAL = 625 + DESTRUCTIBLECITYDEBRIS2X6VERTICAL = 626 + DESTRUCTIBLECITYDEBRIS2X6HORIZONTAL = 627 + DESTRUCTIBLECITYDEBRIS4X4 = 628 + DESTRUCTIBLECITYDEBRIS6X6 = 629 + DESTRUCTIBLECITYDEBRISHUGEDIAGONALBLUR = 630 + DESTRUCTIBLECITYDEBRISHUGEDIAGONALULBR = 631 + TESTZERG = 632 + PATHINGBLOCKERRADIUS1 = 633 + DESTRUCTIBLEROCKEX12X4VERTICAL = 634 + DESTRUCTIBLEROCKEX12X4HORIZONTAL = 635 + DESTRUCTIBLEROCKEX12X6VERTICAL = 636 + DESTRUCTIBLEROCKEX12X6HORIZONTAL = 637 + DESTRUCTIBLEROCKEX14X4 = 638 + DESTRUCTIBLEROCKEX16X6 = 639 + DESTRUCTIBLEROCKEX1DIAGONALHUGEULBR = 640 DESTRUCTIBLEROCKEX1DIAGONALHUGEBLUR = 641 - NEUTRAL_DESTRUCTIBLEROCKEX1DIAGONALHUGEBLUR = 641 + DESTRUCTIBLEROCKEX1VERTICALHUGE = 642 + DESTRUCTIBLEROCKEX1HORIZONTALHUGE = 643 + DESTRUCTIBLEICE2X4VERTICAL = 644 + DESTRUCTIBLEICE2X4HORIZONTAL = 645 + DESTRUCTIBLEICE2X6VERTICAL = 646 + DESTRUCTIBLEICE2X6HORIZONTAL = 647 + DESTRUCTIBLEICE4X4 = 648 + DESTRUCTIBLEICE6X6 = 649 + DESTRUCTIBLEICEDIAGONALHUGEULBR = 650 + DESTRUCTIBLEICEDIAGONALHUGEBLUR = 651 + DESTRUCTIBLEICEVERTICALHUGE = 652 + DESTRUCTIBLEICEHORIZONTALHUGE = 653 + DESERTPLANETSEARCHLIGHT = 654 + DESERTPLANETSTREETLIGHT = 655 + UNBUILDABLEBRICKSUNIT = 656 + UNBUILDABLEROCKSUNIT = 657 + ZERUSDESTRUCTIBLEARCH = 658 + ARTOSILOPE = 659 + ANTEPLOTT = 660 + LABBOT = 661 + CRABEETLE = 662 + COLLAPSIBLEROCKTOWERRAMPRIGHT = 663 + COLLAPSIBLEROCKTOWERRAMPLEFT = 664 LABMINERALFIELD = 665 - NEUTRAL_LABMINERALFIELD = 665 LABMINERALFIELD750 = 666 - NEUTRAL_LABMINERALFIELD750 = 666 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8OUT = 667 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8 = 668 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8OUT = 669 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8 = 670 + TARSONIS_DOORN = 671 + TARSONIS_DOORNLOWERED = 672 + TARSONIS_DOORNE = 673 + TARSONIS_DOORNELOWERED = 674 + TARSONIS_DOORE = 675 + TARSONIS_DOORELOWERED = 676 + TARSONIS_DOORNW = 677 + TARSONIS_DOORNWLOWERED = 678 + COMPOUNDMANSION_DOORN = 679 + COMPOUNDMANSION_DOORNLOWERED = 680 + COMPOUNDMANSION_DOORNE = 681 + COMPOUNDMANSION_DOORNELOWERED = 682 + COMPOUNDMANSION_DOORE = 683 + COMPOUNDMANSION_DOORELOWERED = 684 + COMPOUNDMANSION_DOORNW = 685 + COMPOUNDMANSION_DOORNWLOWERED = 686 RAVAGERCOCOON = 687 - ZERG_RAVAGERCOCOON = 687 RAVAGER = 688 - ZERG_RAVAGER = 688 LIBERATOR = 689 - TERRAN_LIBERATOR = 689 + RAVAGERBURROWED = 690 THORAP = 691 - TERRAN_THORAP = 691 CYCLONE = 692 - TERRAN_CYCLONE = 692 LOCUSTMPFLYING = 693 - ZERG_LOCUSTMPFLYING = 693 DISRUPTOR = 694 - PROTOSS_DISRUPTOR = 694 + AIURLIGHTBRIDGENE8OUT = 695 + AIURLIGHTBRIDGENE8 = 696 + AIURLIGHTBRIDGENE10OUT = 697 + AIURLIGHTBRIDGENE10 = 698 + AIURLIGHTBRIDGENE12OUT = 699 + AIURLIGHTBRIDGENE12 = 700 + AIURLIGHTBRIDGENW8OUT = 701 + AIURLIGHTBRIDGENW8 = 702 + AIURLIGHTBRIDGENW10OUT = 703 + AIURLIGHTBRIDGENW10 = 704 + AIURLIGHTBRIDGENW12OUT = 705 + AIURLIGHTBRIDGENW12 = 706 + AIURTEMPLEBRIDGENE8OUT = 707 + AIURTEMPLEBRIDGENE10OUT = 708 + AIURTEMPLEBRIDGENE12OUT = 709 + AIURTEMPLEBRIDGENW8OUT = 710 + AIURTEMPLEBRIDGENW10OUT = 711 + AIURTEMPLEBRIDGENW12OUT = 712 + SHAKURASLIGHTBRIDGENE8OUT = 713 + SHAKURASLIGHTBRIDGENE8 = 714 + SHAKURASLIGHTBRIDGENE10OUT = 715 + SHAKURASLIGHTBRIDGENE10 = 716 + SHAKURASLIGHTBRIDGENE12OUT = 717 + SHAKURASLIGHTBRIDGENE12 = 718 + SHAKURASLIGHTBRIDGENW8OUT = 719 + SHAKURASLIGHTBRIDGENW8 = 720 + SHAKURASLIGHTBRIDGENW10OUT = 721 + SHAKURASLIGHTBRIDGENW10 = 722 + SHAKURASLIGHTBRIDGENW12OUT = 723 + SHAKURASLIGHTBRIDGENW12 = 724 + VOIDMPIMMORTALREVIVECORPSE = 725 + GUARDIANCOCOONMP = 726 + GUARDIANMP = 727 + DEVOURERCOCOONMP = 728 + DEVOURERMP = 729 + DEFILERMPBURROWED = 730 + DEFILERMP = 731 ORACLESTASISTRAP = 732 - PROTOSS_ORACLESTASISTRAP = 732 DISRUPTORPHASED = 733 - PROTOSS_DISRUPTORPHASED = 733 LIBERATORAG = 734 - TERRAN_LIBERATORAG = 734 + AIURLIGHTBRIDGEABANDONEDNE8OUT = 735 + AIURLIGHTBRIDGEABANDONEDNE8 = 736 + AIURLIGHTBRIDGEABANDONEDNE10OUT = 737 + AIURLIGHTBRIDGEABANDONEDNE10 = 738 + AIURLIGHTBRIDGEABANDONEDNE12OUT = 739 + AIURLIGHTBRIDGEABANDONEDNE12 = 740 + AIURLIGHTBRIDGEABANDONEDNW8OUT = 741 + AIURLIGHTBRIDGEABANDONEDNW8 = 742 + AIURLIGHTBRIDGEABANDONEDNW10OUT = 743 + AIURLIGHTBRIDGEABANDONEDNW10 = 744 + AIURLIGHTBRIDGEABANDONEDNW12OUT = 745 + AIURLIGHTBRIDGEABANDONEDNW12 = 746 + COLLAPSIBLEPURIFIERTOWERDEBRIS = 747 + PORTCITY_BRIDGE_UNITNE8OUT = 748 + PORTCITY_BRIDGE_UNITNE8 = 749 + PORTCITY_BRIDGE_UNITSE8OUT = 750 + PORTCITY_BRIDGE_UNITSE8 = 751 + PORTCITY_BRIDGE_UNITNW8OUT = 752 + PORTCITY_BRIDGE_UNITNW8 = 753 + PORTCITY_BRIDGE_UNITSW8OUT = 754 + PORTCITY_BRIDGE_UNITSW8 = 755 + PORTCITY_BRIDGE_UNITNE10OUT = 756 + PORTCITY_BRIDGE_UNITNE10 = 757 + PORTCITY_BRIDGE_UNITSE10OUT = 758 + PORTCITY_BRIDGE_UNITSE10 = 759 + PORTCITY_BRIDGE_UNITNW10OUT = 760 + PORTCITY_BRIDGE_UNITNW10 = 761 + PORTCITY_BRIDGE_UNITSW10OUT = 762 + PORTCITY_BRIDGE_UNITSW10 = 763 + PORTCITY_BRIDGE_UNITNE12OUT = 764 + PORTCITY_BRIDGE_UNITNE12 = 765 + PORTCITY_BRIDGE_UNITSE12OUT = 766 + PORTCITY_BRIDGE_UNITSE12 = 767 + PORTCITY_BRIDGE_UNITNW12OUT = 768 + PORTCITY_BRIDGE_UNITNW12 = 769 + PORTCITY_BRIDGE_UNITSW12OUT = 770 + PORTCITY_BRIDGE_UNITSW12 = 771 + PORTCITY_BRIDGE_UNITN8OUT = 772 + PORTCITY_BRIDGE_UNITN8 = 773 + PORTCITY_BRIDGE_UNITS8OUT = 774 + PORTCITY_BRIDGE_UNITS8 = 775 + PORTCITY_BRIDGE_UNITE8OUT = 776 + PORTCITY_BRIDGE_UNITE8 = 777 + PORTCITY_BRIDGE_UNITW8OUT = 778 + PORTCITY_BRIDGE_UNITW8 = 779 + PORTCITY_BRIDGE_UNITN10OUT = 780 + PORTCITY_BRIDGE_UNITN10 = 781 + PORTCITY_BRIDGE_UNITS10OUT = 782 + PORTCITY_BRIDGE_UNITS10 = 783 + PORTCITY_BRIDGE_UNITE10OUT = 784 + PORTCITY_BRIDGE_UNITE10 = 785 + PORTCITY_BRIDGE_UNITW10OUT = 786 + PORTCITY_BRIDGE_UNITW10 = 787 + PORTCITY_BRIDGE_UNITN12OUT = 788 + PORTCITY_BRIDGE_UNITN12 = 789 + PORTCITY_BRIDGE_UNITS12OUT = 790 + PORTCITY_BRIDGE_UNITS12 = 791 + PORTCITY_BRIDGE_UNITE12OUT = 792 + PORTCITY_BRIDGE_UNITE12 = 793 + PORTCITY_BRIDGE_UNITW12OUT = 794 + PORTCITY_BRIDGE_UNITW12 = 795 PURIFIERRICHMINERALFIELD = 796 - NEUTRAL_PURIFIERRICHMINERALFIELD = 796 PURIFIERRICHMINERALFIELD750 = 797 - NEUTRAL_PURIFIERRICHMINERALFIELD750 = 797 + COLLAPSIBLEPURIFIERTOWERPUSHUNIT = 798 + LOCUSTMPPRECURSOR = 799 + RELEASEINTERCEPTORSBEACON = 800 ADEPTPHASESHIFT = 801 - PROTOSS_ADEPTPHASESHIFT = 801 + RAVAGERCORROSIVEBILEMISSILE = 802 + HYDRALISKIMPALEMISSILE = 803 + CYCLONEMISSILELARGEAIR = 804 + CYCLONEMISSILE = 805 + CYCLONEMISSILELARGE = 806 + THORAALANCE = 807 + ORACLEWEAPON = 808 + TEMPESTWEAPONGROUND = 809 + RAVAGERWEAPONMISSILE = 810 + SCOUTMPAIRWEAPONLEFT = 811 + SCOUTMPAIRWEAPONRIGHT = 812 + ARBITERMPWEAPONMISSILE = 813 + GUARDIANMPWEAPON = 814 + DEVOURERMPWEAPONMISSILE = 815 + DEFILERMPDARKSWARMWEAPON = 816 + QUEENMPENSNAREMISSILE = 817 + QUEENMPSPAWNBROODLINGSMISSILE = 818 + LIGHTNINGBOMBWEAPON = 819 + HERCPLACEMENT = 820 + GRAPPLEWEAPON = 821 + CAUSTICSPRAYMISSILE = 822 + PARASITICBOMBMISSILE = 823 PARASITICBOMBDUMMY = 824 - ZERG_PARASITICBOMBDUMMY = 824 + ADEPTWEAPON = 825 + ADEPTUPGRADEWEAPON = 826 + LIBERATORMISSILE = 827 + LIBERATORDAMAGEMISSILE = 828 + LIBERATORAGMISSILE = 829 KD8CHARGE = 830 - TERRAN_KD8CHARGE = 830 + KD8CHARGEWEAPON = 831 + SLAYNELEMENTALGRABWEAPON = 832 + SLAYNELEMENTALGRABAIRUNIT = 833 + SLAYNELEMENTALGRABGROUNDUNIT = 834 + SLAYNELEMENTALWEAPON = 835 + DESTRUCTIBLEEXPEDITIONGATE6X6 = 836 + DESTRUCTIBLEZERGINFESTATION3X3 = 837 + HERC = 838 + MOOPY = 839 + REPLICANT = 840 + SEEKERMISSILE = 841 + AIURTEMPLEBRIDGEDESTRUCTIBLENE8OUT = 842 + AIURTEMPLEBRIDGEDESTRUCTIBLENE10OUT = 843 + AIURTEMPLEBRIDGEDESTRUCTIBLENE12OUT = 844 + AIURTEMPLEBRIDGEDESTRUCTIBLENW8OUT = 845 + AIURTEMPLEBRIDGEDESTRUCTIBLENW10OUT = 846 + AIURTEMPLEBRIDGEDESTRUCTIBLENW12OUT = 847 + AIURTEMPLEBRIDGEDESTRUCTIBLESW8OUT = 848 + AIURTEMPLEBRIDGEDESTRUCTIBLESW10OUT = 849 + AIURTEMPLEBRIDGEDESTRUCTIBLESW12OUT = 850 + AIURTEMPLEBRIDGEDESTRUCTIBLESE8OUT = 851 + AIURTEMPLEBRIDGEDESTRUCTIBLESE10OUT = 852 + AIURTEMPLEBRIDGEDESTRUCTIBLESE12OUT = 853 + FLYOVERUNIT = 854 + CORSAIRMP = 855 + SCOUTMP = 856 + ARBITERMP = 857 + SCOURGEMP = 858 + DEFILERMPPLAGUEWEAPON = 859 + QUEENMP = 860 + XELNAGADESTRUCTIBLERAMPBLOCKER6S = 861 + XELNAGADESTRUCTIBLERAMPBLOCKER6SE = 862 + XELNAGADESTRUCTIBLERAMPBLOCKER6E = 863 + XELNAGADESTRUCTIBLERAMPBLOCKER6NE = 864 + XELNAGADESTRUCTIBLERAMPBLOCKER6N = 865 + XELNAGADESTRUCTIBLERAMPBLOCKER6NW = 866 + XELNAGADESTRUCTIBLERAMPBLOCKER6W = 867 + XELNAGADESTRUCTIBLERAMPBLOCKER6SW = 868 + XELNAGADESTRUCTIBLERAMPBLOCKER8S = 869 + XELNAGADESTRUCTIBLERAMPBLOCKER8SE = 870 + XELNAGADESTRUCTIBLERAMPBLOCKER8E = 871 + XELNAGADESTRUCTIBLERAMPBLOCKER8NE = 872 + XELNAGADESTRUCTIBLERAMPBLOCKER8N = 873 + XELNAGADESTRUCTIBLERAMPBLOCKER8NW = 874 + XELNAGADESTRUCTIBLERAMPBLOCKER8W = 875 + XELNAGADESTRUCTIBLERAMPBLOCKER8SW = 876 + REPTILECRATE = 877 + SLAYNSWARMHOSTSPAWNFLYER = 878 + SLAYNELEMENTAL = 879 PURIFIERVESPENEGEYSER = 880 - NEUTRAL_PURIFIERVESPENEGEYSER = 880 SHAKURASVESPENEGEYSER = 881 - NEUTRAL_SHAKURASVESPENEGEYSER = 881 + COLLAPSIBLEPURIFIERTOWERDIAGONAL = 882 + CREEPONLYBLOCKER4X4 = 883 PURIFIERMINERALFIELD = 884 - NEUTRAL_PURIFIERMINERALFIELD = 884 PURIFIERMINERALFIELD750 = 885 - NEUTRAL_PURIFIERMINERALFIELD750 = 885 BATTLESTATIONMINERALFIELD = 886 - NEUTRAL_BATTLESTATIONMINERALFIELD = 886 BATTLESTATIONMINERALFIELD750 = 887 - NEUTRAL_BATTLESTATIONMINERALFIELD750 = 887 + BEACON_NOVA = 888 + BEACON_NOVASMALL = 889 + URSULA = 890 + ELSECARO_COLONIST_HUT = 891 TRANSPORTOVERLORDCOCOON = 892 - ZERG_TRANSPORTOVERLORDCOCOON = 892 OVERLORDTRANSPORT = 893 - ZERG_OVERLORDTRANSPORT = 893 PYLONOVERCHARGED = 894 - PROTOSS_PYLONOVERCHARGED = 894 + BYPASSARMORDRONE = 895 + ADEPTPIERCINGWEAPON = 896 + CORROSIVEPARASITEWEAPON = 897 + INFESTEDTERRAN = 898 + MERCCOMPOUND = 899 + SUPPLYDEPOTDROP = 900 + LURKERDEN = 901 + D8CHARGE = 902 + THORWRECKAGE = 903 + GOLIATH = 904 + TECHREACTOR = 905 + SS_POWERUPBOMB = 906 + SS_POWERUPHEALTH = 907 + SS_POWERUPSIDEMISSILES = 908 + SS_POWERUPSTRONGERMISSILES = 909 + LURKEREGG = 910 + LURKER = 911 + LURKERBURROWED = 912 + ARCHIVESEALED = 913 + INFESTEDCIVILIAN = 914 + FLAMINGBETTY = 915 + INFESTEDCIVILIANBURROWED = 916 + SELENDISINTERCEPTOR = 917 + SIEGEBREAKERSIEGED = 918 + SIEGEBREAKER = 919 + PERDITIONTURRETUNDERGROUND = 920 + PERDITIONTURRET = 921 + SENTRYGUNUNDERGROUND = 922 + SENTRYGUN = 923 + WARPIG = 924 + DEVILDOG = 925 + SPARTANCOMPANY = 926 + HAMMERSECURITY = 927 + HELSANGELFIGHTER = 928 + DUSKWING = 929 + DUKESREVENGE = 930 + ODINWRECKAGE = 931 + HERONUKE = 932 + KERRIGANCHARBURROWED = 933 + KERRIGANCHAR = 934 + SPIDERMINEBURROWED = 935 + SPIDERMINE = 936 + ZERATUL = 937 + URUN = 938 + MOHANDAR = 939 + SELENDIS = 940 + SCOUT = 941 + OMEGALISKBURROWED = 942 + OMEGALISK = 943 + INFESTEDABOMINATIONBURROWED = 944 + INFESTEDABOMINATION = 945 + HUNTERKILLERBURROWED = 946 + HUNTERKILLER = 947 + INFESTEDTERRANCAMPAIGNBURROWED = 948 + INFESTEDTERRANCAMPAIGN = 949 + CHECKSTATION = 950 + CHECKSTATIONDIAGONALBLUR = 951 + CHECKSTATIONDIAGONALULBR = 952 + CHECKSTATIONVERTICAL = 953 + CHECKSTATIONOPENED = 954 + CHECKSTATIONDIAGONALBLUROPENED = 955 + CHECKSTATIONDIAGONALULBROPENED = 956 + CHECKSTATIONVERTICALOPENED = 957 + BARRACKSTECHREACTOR = 958 + FACTORYTECHREACTOR = 959 + STARPORTTECHREACTOR = 960 + SPECTRENUKE = 961 + COLONISTSHIPFLYING = 962 + COLONISTSHIP = 963 + BIODOMECOMMANDFLYING = 964 + BIODOMECOMMAND = 965 + HERCULESLANDERFLYING = 966 + HERCULESLANDER = 967 + ZHAKULDASLIGHTBRIDGEOFF = 968 + ZHAKULDASLIGHTBRIDGE = 969 + ZHAKULDASLIBRARYUNITBURROWED = 970 + ZHAKULDASLIBRARYUNIT = 971 + XELNAGATEMPLEDOORBURROWED = 972 + XELNAGATEMPLEDOOR = 973 + XELNAGATEMPLEDOORURDLBURROWED = 974 + XELNAGATEMPLEDOORURDL = 975 + HELSANGELASSAULT = 976 + AUTOMATEDREFINERY = 977 + BATTLECRUISERHELIOSMORPH = 978 + HEALINGPOTIONTESTINSTANT = 979 + SPACEPLATFORMCLIFFDOOROPEN0 = 980 + SPACEPLATFORMCLIFFDOOR0 = 981 + SPACEPLATFORMCLIFFDOOROPEN1 = 982 + SPACEPLATFORMCLIFFDOOR1 = 983 + DESTRUCTIBLEGATEDIAGONALBLURLOWERED = 984 + DESTRUCTIBLEGATEDIAGONALULBRLOWERED = 985 + DESTRUCTIBLEGATESTRAIGHTHORIZONTALBFLOWERED = 986 + DESTRUCTIBLEGATESTRAIGHTHORIZONTALLOWERED = 987 + DESTRUCTIBLEGATESTRAIGHTVERTICALLFLOWERED = 988 + DESTRUCTIBLEGATESTRAIGHTVERTICALLOWERED = 989 + DESTRUCTIBLEGATEDIAGONALBLUR = 990 + DESTRUCTIBLEGATEDIAGONALULBR = 991 + DESTRUCTIBLEGATESTRAIGHTHORIZONTALBF = 992 + DESTRUCTIBLEGATESTRAIGHTHORIZONTAL = 993 + DESTRUCTIBLEGATESTRAIGHTVERTICALLF = 994 + DESTRUCTIBLEGATESTRAIGHTVERTICAL = 995 + METALGATEDIAGONALBLURLOWERED = 996 + METALGATEDIAGONALULBRLOWERED = 997 + METALGATESTRAIGHTHORIZONTALBFLOWERED = 998 + METALGATESTRAIGHTHORIZONTALLOWERED = 999 + METALGATESTRAIGHTVERTICALLFLOWERED = 1000 + METALGATESTRAIGHTVERTICALLOWERED = 1001 + METALGATEDIAGONALBLUR = 1002 + METALGATEDIAGONALULBR = 1003 + METALGATESTRAIGHTHORIZONTALBF = 1004 + METALGATESTRAIGHTHORIZONTAL = 1005 + METALGATESTRAIGHTVERTICALLF = 1006 + METALGATESTRAIGHTVERTICAL = 1007 + SECURITYGATEDIAGONALBLURLOWERED = 1008 + SECURITYGATEDIAGONALULBRLOWERED = 1009 + SECURITYGATESTRAIGHTHORIZONTALBFLOWERED = 1010 + SECURITYGATESTRAIGHTHORIZONTALLOWERED = 1011 + SECURITYGATESTRAIGHTVERTICALLFLOWERED = 1012 + SECURITYGATESTRAIGHTVERTICALLOWERED = 1013 + SECURITYGATEDIAGONALBLUR = 1014 + SECURITYGATEDIAGONALULBR = 1015 + SECURITYGATESTRAIGHTHORIZONTALBF = 1016 + SECURITYGATESTRAIGHTHORIZONTAL = 1017 + SECURITYGATESTRAIGHTVERTICALLF = 1018 + SECURITYGATESTRAIGHTVERTICAL = 1019 + TERRAZINENODEDEADTERRAN = 1020 + TERRAZINENODEHAPPYPROTOSS = 1021 + ZHAKULDASLIGHTBRIDGEOFFTOPRIGHT = 1022 + ZHAKULDASLIGHTBRIDGETOPRIGHT = 1023 + BATTLECRUISERHELIOS = 1024 + NUKESILONOVA = 1025 + ODIN = 1026 + PYGALISKCOCOON = 1027 + DEVOURERTISSUEDOODAD = 1028 + SS_BATTLECRUISERMISSILELAUNCHER = 1029 + SS_TERRATRONMISSILESPINNERMISSILE = 1030 + SS_TERRATRONSAW = 1031 + SS_BATTLECRUISERHUNTERSEEKERMISSILE = 1032 + SS_LEVIATHANBOMB = 1033 + DEVOURERTISSUEMISSILE = 1034 + SS_INTERCEPTOR = 1035 + SS_LEVIATHANBOMBMISSILE = 1036 + SS_LEVIATHANSPAWNBOMBMISSILE = 1037 + SS_FIGHTERMISSILELEFT = 1038 + SS_FIGHTERMISSILERIGHT = 1039 + SS_INTERCEPTORSPAWNMISSILE = 1040 + SS_CARRIERBOSSMISSILE = 1041 + SS_LEVIATHANTENTACLETARGET = 1042 + SS_LEVIATHANTENTACLEL2MISSILE = 1043 + SS_LEVIATHANTENTACLER1MISSILE = 1044 + SS_LEVIATHANTENTACLER2MISSILE = 1045 + SS_LEVIATHANTENTACLEL1MISSILE = 1046 + SS_TERRATRONMISSILE = 1047 + SS_WRAITHMISSILE = 1048 + SS_SCOURGEMISSILE = 1049 + SS_CORRUPTORMISSILE = 1050 + SS_SWARMGUARDIANMISSILE = 1051 + SS_STRONGMISSILE1 = 1052 + SS_STRONGMISSILE2 = 1053 + SS_FIGHTERDRONEMISSILE = 1054 + SS_PHOENIXMISSILE = 1055 + SS_SCOUTMISSILE = 1056 + SS_INTERCEPTORMISSILE = 1057 + SS_SCIENCEVESSELMISSILE = 1058 + SS_BATTLECRUISERMISSILE = 1059 + D8CLUSTERBOMBWEAPON = 1060 + D8CLUSTERBOMB = 1061 + BROODLORDEGG = 1062 + BROODLORDEGGMISSILE = 1063 + CIVILIANWEAPON = 1064 + BATTLECRUISERHELIOSALMWEAPON = 1065 + BATTLECRUISERLOKILMWEAPON = 1066 + BATTLECRUISERHELIOSGLMWEAPON = 1067 + BIOSTASISMISSILE = 1068 + INFESTEDVENTBROODLORDEGG = 1069 + INFESTEDVENTCORRUPTOREGG = 1070 + TENTACLEAMISSILE = 1071 + TENTACLEBMISSILE = 1072 + TENTACLECMISSILE = 1073 + TENTACLEDMISSILE = 1074 + MUTALISKEGG = 1075 + INFESTEDVENTMUTALISKEGG = 1076 + MUTALISKEGGMISSILE = 1077 + INFESTEDVENTEGGMISSILE = 1078 + SPORECANNONFIREMISSILE = 1079 + EXPERIMENTALPLASMAGUNWEAPON = 1080 + BRUTALISKWEAPON = 1081 + LOKIHURRICANEMISSILELEFT = 1082 + LOKIHURRICANEMISSILERIGHT = 1083 + ODINAAWEAPON = 1084 + DUSKWINGWEAPON = 1085 + KERRIGANWEAPON = 1086 + ULTRASONICPULSEWEAPON = 1087 + KERRIGANCHARWEAPON = 1088 + DEVASTATORMISSILEWEAPON = 1089 + SWANNWEAPON = 1090 + HAMMERSECURITYLMWEAPON = 1091 + CONSUMEDNAFEEDBACKWEAPON = 1092 + URUNWEAPONLEFT = 1093 + URUNWEAPONRIGHT = 1094 + HAILSTORMMISSILESWEAPON = 1095 + COLONYINFESTATIONWEAPON = 1096 + VOIDSEEKERPHASEMINEBLASTWEAPON = 1097 + VOIDSEEKERPHASEMINEBLASTSECONDARYWEAPON = 1098 + TOSSGRENADEWEAPON = 1099 + TYCHUSGRENADEWEAPON = 1100 + VILESTREAMWEAPON = 1101 + WRAITHAIRWEAPONRIGHT = 1102 + WRAITHAIRWEAPONLEFT = 1103 + WRAITHGROUNDWEAPON = 1104 + WEAPONHYBRIDD = 1105 + KARASSWEAPON = 1106 + HYBRIDCPLASMAWEAPON = 1107 + WARBOTBMISSILE = 1108 + LOKIYAMATOWEAPON = 1109 + HYPERIONYAMATOSPECIALWEAPON = 1110 + HYPERIONLMWEAPON = 1111 + HYPERIONALMWEAPON = 1112 + VULTUREWEAPON = 1113 + SCOUTAIRWEAPONLEFT = 1114 + SCOUTAIRWEAPONRIGHT = 1115 + HUNTERKILLERWEAPON = 1116 + GOLIATHAWEAPON = 1117 + SPARTANCOMPANYAWEAPON = 1118 + LEVIATHANSCOURGEMISSILE = 1119 + BIOPLASMIDDISCHARGEWEAPON = 1120 + VOIDSEEKERWEAPON = 1121 + HELSANGELFIGHTERWEAPON = 1122 + DRBATTLECRUISERALMWEAPON = 1123 + DRBATTLECRUISERGLMWEAPON = 1124 + HURRICANEMISSILERIGHT = 1125 + HURRICANEMISSILELEFT = 1126 + HYBRIDSINGULARITYFEEDBACKWEAPON = 1127 + DOMINIONKILLTEAMLMWEAPON = 1128 + ITEMGRENADESWEAPON = 1129 + ITEMGRAVITYBOMBSWEAPON = 1130 + TESTHEROTHROWMISSILE = 1131 + TESTHERODEBUGMISSILEABILITY1WEAPON = 1132 + TESTHERODEBUGMISSILEABILITY2WEAPON = 1133 + SPECTRE = 1134 + VULTURE = 1135 + LOKI = 1136 + WRAITH = 1137 + DOMINIONKILLTEAM = 1138 + FIREBAT = 1139 + DIAMONDBACK = 1140 + G4CHARGEWEAPON = 1141 + SS_BLACKEDGEBORDER = 1142 + DEVOURERTISSUESAMPLETUBE = 1143 + MONOLITH = 1144 + OBELISK = 1145 + ARCHIVE = 1146 + ARTIFACTVAULT = 1147 + AVERNUSGATECONTROL = 1148 + GATECONTROLUNIT = 1149 + BLIMPADS = 1150 + BLOCKER6X6 = 1151 + BLOCKER8X8 = 1152 + BLOCKER16X16 = 1153 + CARGOTRUCKUNITFLATBED = 1154 + CARGOTRUCKUNITTRAILER = 1155 + BLIMP = 1156 + CASTANARWINDOWLARGEDIAGONALULBRUNIT = 1157 + BLOCKER4X4 = 1158 + HOMELARGE = 1159 + HOMESMALL = 1160 + ELEVATORBLOCKER = 1161 + QUESTIONMARK = 1162 + NYDUSWORMLAVADEATH = 1163 + SS_BACKGROUNDSPACELARGE = 1164 + SS_BACKGROUNDSPACETERRAN00 = 1165 + SS_BACKGROUNDSPACETERRAN02 = 1166 + SS_BACKGROUNDSPACEZERG00 = 1167 + SS_BACKGROUNDSPACEZERG02 = 1168 + SS_CARRIERBOSS = 1169 + SS_BATTLECRUISER = 1170 + SS_TERRATRONMISSILESPINNERLAUNCHER = 1171 + SS_TERRATRONMISSILESPINNER = 1172 + SS_TERRATRONBEAMTARGET = 1173 + SS_LIGHTNINGPROJECTORFACERIGHT = 1174 + SS_SCOURGE = 1175 + SS_CORRUPTOR = 1176 + SS_TERRATRONMISSILELAUNCHER = 1177 + SS_LIGHTNINGPROJECTORFACELEFT = 1178 + SS_WRAITH = 1179 + SS_SWARMGUARDIAN = 1180 + SS_SCOUT = 1181 + SS_LEVIATHAN = 1182 + SS_SCIENCEVESSEL = 1183 + SS_TERRATRON = 1184 + SECRETDOCUMENTS = 1185 + PREDATOR = 1186 + DEFILERBONESAMPLE = 1187 + DEVOURERTISSUESAMPLE = 1188 + PROTOSSPSIELEMENTS = 1189 + TASSADAR = 1190 + SCIENCEFACILITY = 1191 + INFESTEDCOCOON = 1192 + FUSIONREACTOR = 1193 + BUBBACOMMERCIAL = 1194 + XELNAGAPRISONHEIGHT2 = 1195 + XELNAGAPRISON = 1196 + XELNAGAPRISONNORTH = 1197 + XELNAGAPRISONNORTHHEIGHT2 = 1198 + ZERGDROPPODCREEP = 1199 + IPISTOLAD = 1200 + L800ETC_AD = 1201 + NUKENOODLESCOMMERCIAL = 1202 + PSIOPSCOMMERCIAL = 1203 + SHIPALARM = 1204 + SPACEPLATFORMDESTRUCTIBLEJUMBOBLOCKER = 1205 + SPACEPLATFORMDESTRUCTIBLELARGEBLOCKER = 1206 + SPACEPLATFORMDESTRUCTIBLEMEDIUMBLOCKER = 1207 + SPACEPLATFORMDESTRUCTIBLESMALLBLOCKER = 1208 + TALDARIMMOTHERSHIP = 1209 + PLASMATORPEDOESWEAPON = 1210 + PSIDISRUPTOR = 1211 + HIVEMINDEMULATOR = 1212 + RAYNOR01 = 1213 + SCIENCEVESSEL = 1214 + SCOURGE = 1215 + SPACEPLATFORMREACTORPATHINGBLOCKER = 1216 + TAURENOUTHOUSE = 1217 + TYCHUSEJECTMISSILE = 1218 + FEEDERLING = 1219 + ULAANSMOKEBRIDGE = 1220 + TALDARIMPRISONCRYSTAL = 1221 + SPACEDIABLO = 1222 + MURLOCMARINE = 1223 + XELNAGAPRISONCONSOLE = 1224 + TALDARIMPRISON = 1225 + ADJUTANTCAPSULE = 1226 + XELNAGAVAULT = 1227 + HOLDINGPEN = 1228 + SCRAPHUGE = 1229 + PRISONERCIVILIAN = 1230 + BIODOMEHALFBUILT = 1231 + BIODOME = 1232 + DESTRUCTIBLEKORHALFLAG = 1233 + DESTRUCTIBLEKORHALPODIUM = 1234 + DESTRUCTIBLEKORHALTREE = 1235 + DESTRUCTIBLEKORHALFOLIAGE = 1236 + DESTRUCTIBLESANDBAGS = 1237 + CASTANARWINDOWLARGEDIAGONALBLURUNIT = 1238 + CARGOTRUCKUNITBARRELS = 1239 + SPORECANNON = 1240 + STETMANN = 1241 + BRIDGEBLOCKER4X12 = 1242 + CIVILIANSHIPWRECKED = 1243 + SWANN = 1244 + DRAKKENLASERDRILL = 1245 + MINDSIPHONRETURNWEAPON = 1246 + KERRIGANEGG = 1247 + CHRYSALISEGG = 1248 + PRISONERSPECTRE = 1249 + PRISONZEALOT = 1250 + SCRAPSALVAGE1X1 = 1251 + SCRAPSALVAGE2X2 = 1252 + SCRAPSALVAGE3X3 = 1253 + RAYNORCOMMANDO = 1254 + OVERMIND = 1255 + OVERMINDREMAINS = 1256 + INFESTEDMERCHAVEN = 1257 + MONLYTHARTIFACTFORCEFIELD = 1258 + MONLYTHFORCEFIELDSTATUE = 1259 + VIROPHAGE = 1260 + PSISHOCKWEAPON = 1261 + TYCHUSCOMMANDO = 1262 + BRUTALISK = 1263 + PYGALISK = 1264 + VALHALLABASEDESTRUCTIBLEDOORDEAD = 1265 + VALHALLABASEDESTRUCTIBLEDOOR = 1266 + VOIDSEEKER = 1267 + MINDSIPHONWEAPON = 1268 + WARBOT = 1269 + PLATFORMCONNECTOR = 1270 + ARTANIS = 1271 + TERRAZINECANISTER = 1272 + HERCULES = 1273 + MERCENARYFORTRESS = 1274 + RAYNOR = 1275 + ARTIFACTPIECE1 = 1276 + ARTIFACTPIECE2 = 1277 + ARTIFACTPIECE4 = 1278 + ARTIFACTPIECE3 = 1279 + ARTIFACTPIECE5 = 1280 + RIPFIELDGENERATOR = 1281 + RIPFIELDGENERATORSMALL = 1282 + XELNAGAWORLDSHIPVAULT = 1283 + TYCHUSCHAINGUN = 1284 + ARTIFACT = 1285 + CELLBLOCKB = 1286 + GHOSTLASERLINES = 1287 + MAINCELLBLOCK = 1288 + KERRIGAN = 1289 + DATACORE = 1290 + SPECIALOPSDROPSHIP = 1291 + TOSH = 1292 + CASTANARULTRALISKSHACKLEDUNIT = 1293 + KARASS = 1294 + INVISIBLEPYLON = 1295 + MAAR = 1296 + HYBRIDDESTROYER = 1297 + HYBRIDREAVER = 1298 + HYBRID = 1299 + TERRAZINENODE = 1300 + TRANSPORTTRUCK = 1301 + WALLOFFIRE = 1302 + WEAPONHYBRIDC = 1303 + XELNAGATEMPLE = 1304 + EXPLODINGBARRELLARGE = 1305 + SUPERWARPGATE = 1306 + TERRAZINETANK = 1307 + XELNAGASHRINE = 1308 + SMCAMERABRIDGE = 1309 + SMMARSARABARTYCHUSCAMERAS = 1310 + SMHYPERIONBRIDGESTAGE1HANSONCAMERAS = 1311 + SMHYPERIONBRIDGESTAGE1HORNERCAMERAS = 1312 + SMHYPERIONBRIDGESTAGE1TYCHUSCAMERAS = 1313 + SMHYPERIONBRIDGESTAGE1TOSHCAMERAS = 1314 + SMHYPERIONARMORYSTAGE1SWANNCAMERAS = 1315 + SMHYPERIONCANTINATOSHCAMERAS = 1316 + SMHYPERIONCANTINATYCHUSCAMERAS = 1317 + SMHYPERIONCANTINAYBARRACAMERAS = 1318 + SMHYPERIONLABADJUTANTCAMERAS = 1319 + SMHYPERIONLABCOWINCAMERAS = 1320 + SMHYPERIONLABHANSONCAMERAS = 1321 + SMHYPERIONBRIDGETRAYNOR03BRIEFINGCAMERA = 1322 + SMTESTCAMERA = 1323 + SMCAMERATERRAN01 = 1324 + SMCAMERATERRAN02A = 1325 + SMCAMERATERRAN02B = 1326 + SMCAMERATERRAN03 = 1327 + SMCAMERATERRAN04 = 1328 + SMCAMERATERRAN04A = 1329 + SMCAMERATERRAN04B = 1330 + SMCAMERATERRAN05 = 1331 + SMCAMERATERRAN06A = 1332 + SMCAMERATERRAN06B = 1333 + SMCAMERATERRAN06C = 1334 + SMCAMERATERRAN07 = 1335 + SMCAMERATERRAN08 = 1336 + SMCAMERATERRAN09 = 1337 + SMCAMERATERRAN10 = 1338 + SMCAMERATERRAN11 = 1339 + SMCAMERATERRAN12 = 1340 + SMCAMERATERRAN13 = 1341 + SMCAMERATERRAN14 = 1342 + SMCAMERATERRAN15 = 1343 + SMCAMERATERRAN16 = 1344 + SMCAMERATERRAN17 = 1345 + SMCAMERATERRAN20 = 1346 + SMFIRSTOFFICER = 1347 + SMHYPERIONBRIDGEBRIEFINGLEFT = 1348 + SMHYPERIONBRIDGEBRIEFINGRIGHT = 1349 + SMHYPERIONMEDLABBRIEFING = 1350 + SMHYPERIONMEDLABBRIEFINGCENTER = 1351 + SMHYPERIONMEDLABBRIEFINGLEFT = 1352 + SMHYPERIONMEDLABBRIEFINGRIGHT = 1353 + SMTOSHSHUTTLESET = 1354 + SMKERRIGANPHOTO = 1355 + SMTOSHSHUTTLESET2 = 1356 + SMMARSARABARJUKEBOXHS = 1357 + SMMARSARABARKERRIGANPHOTOHS = 1358 + SMVALERIANFLAGSHIPCORRIDORSSET = 1359 + SMVALERIANFLAGSHIPCORRIDORSSET2 = 1360 + SMVALERIANFLAGSHIPCORRIDORSSET3 = 1361 + SMVALERIANFLAGSHIPCORRIDORSSET4 = 1362 + SMVALERIANOBSERVATORYSET = 1363 + SMVALERIANOBSERVATORYSET2 = 1364 + SMVALERIANOBSERVATORYSET3 = 1365 + SMVALERIANOBSERVATORYPAINTINGHS = 1366 + SMCHARBATTLEZONEFLAG = 1367 + SMUNNSET = 1368 + SMTERRANREADYROOMSET = 1369 + SMCHARBATTLEZONESET = 1370 + SMCHARBATTLEZONESET2 = 1371 + SMCHARBATTLEZONESET3 = 1372 + SMCHARBATTLEZONESET4 = 1373 + SMCHARBATTLEZONESET5 = 1374 + SMCHARBATTLEZONEARTIFACTHS = 1375 + SMCHARBATTLEZONERADIOHS = 1376 + SMCHARBATTLEZONEDROPSHIPHS = 1377 + SMCHARBATTLEZONEBRIEFCASEHS = 1378 + SMCHARBATTLEZONEBRIEFINGSET = 1379 + SMCHARBATTLEZONEBRIEFINGSET2 = 1380 + SMCHARBATTLEZONEBRIEFINGSETLEFT = 1381 + SMCHARBATTLEZONEBRIEFINGSETRIGHT = 1382 + SMMARSARABARBADGEHS = 1383 + SMHYPERIONCANTINABADGEHS = 1384 + SMHYPERIONCANTINAPOSTER1HS = 1385 + SMHYPERIONCANTINAPOSTER2HS = 1386 + SMHYPERIONCANTINAPOSTER3HS = 1387 + SMHYPERIONCANTINAPOSTER4HS = 1388 + SMHYPERIONCANTINAPOSTER5HS = 1389 + SMFLY = 1390 + SMBRIDGEWINDOWSPACE = 1391 + SMBRIDGEPLANETSPACE = 1392 + SMBRIDGEPLANETSPACEASTEROIDS = 1393 + SMBRIDGEPLANETAGRIA = 1394 + SMBRIDGEPLANETAIUR = 1395 + SMBRIDGEPLANETAVERNUS = 1396 + SMBRIDGEPLANETBELSHIR = 1397 + SMBRIDGEPLANETCASTANAR = 1398 + SMBRIDGEPLANETCHAR = 1399 + SMBRIDGEPLANETHAVEN = 1400 + SMBRIDGEPLANETKORHAL = 1401 + SMBRIDGEPLANETMEINHOFF = 1402 + SMBRIDGEPLANETMONLYTH = 1403 + SMBRIDGEPLANETNEWFOLSOM = 1404 + SMBRIDGEPLANETPORTZION = 1405 + SMBRIDGEPLANETREDSTONE = 1406 + SMBRIDGEPLANETSHAKURAS = 1407 + SMBRIDGEPLANETTARSONIS = 1408 + SMBRIDGEPLANETTYPHON = 1409 + SMBRIDGEPLANETTYRADOR = 1410 + SMBRIDGEPLANETULAAN = 1411 + SMBRIDGEPLANETULNAR = 1412 + SMBRIDGEPLANETVALHALLA = 1413 + SMBRIDGEPLANETXIL = 1414 + SMBRIDGEPLANETZHAKULDAS = 1415 + SMMARSARAPLANET = 1416 + SMNOVA = 1417 + SMHAVENPLANET = 1418 + SMHYPERIONBRIDGEBRIEFING = 1419 + SMHYPERIONBRIDGEBRIEFINGCENTER = 1420 + SMCHARBATTLEFIELDENDPROPS = 1421 + SMCHARBATTLEZONETURRET = 1422 + SMTERRAN01FX = 1423 + SMTERRAN03FX = 1424 + SMTERRAN05FX = 1425 + SMTERRAN05FXMUTALISKS = 1426 + SMTERRAN05PROPS = 1427 + SMTERRAN06AFX = 1428 + SMTERRAN06BFX = 1429 + SMTERRAN06CFX = 1430 + SMTERRAN12FX = 1431 + SMTERRAN14FX = 1432 + SMTERRAN15FX = 1433 + SMTERRAN06APROPS = 1434 + SMTERRAN06BPROPS = 1435 + SMTERRAN07PROPS = 1436 + SMTERRAN07FX = 1437 + SMTERRAN08PROPS = 1438 + SMTERRAN09FX = 1439 + SMTERRAN09PROPS = 1440 + SMTERRAN11FX = 1441 + SMTERRAN11FXMISSILES = 1442 + SMTERRAN11FXEXPLOSIONS = 1443 + SMTERRAN11FXBLOOD = 1444 + SMTERRAN11FXDEBRIS = 1445 + SMTERRAN11FXDEBRIS1 = 1446 + SMTERRAN11FXDEBRIS2 = 1447 + SMTERRAN11PROPS = 1448 + SMTERRAN11PROPSBURROWROCKS = 1449 + SMTERRAN11PROPSRIFLESHELLS = 1450 + SMTERRAN12PROPS = 1451 + SMTERRAN13PROPS = 1452 + SMTERRAN14PROPS = 1453 + SMTERRAN15PROPS = 1454 + SMTERRAN16FX = 1455 + SMTERRAN16FXFLAK = 1456 + SMTERRAN17PROPS = 1457 + SMTERRAN17FX = 1458 + SMMARSARABARPROPS = 1459 + SMHYPERIONCORRIDORPROPS = 1460 + ZERATULCRYSTALCHARGE = 1461 + SMRAYNORHANDS = 1462 + SMPRESSROOMPROPS = 1463 + SMRAYNORGUN = 1464 + SMMARINERIFLE = 1465 + SMTOSHKNIFE = 1466 + SMTOSHSHUTTLEPROPS = 1467 + SMHYPERIONEXTERIOR = 1468 + SMHYPERIONEXTERIORLOW = 1469 + SMHYPERIONEXTERIORHOLOGRAM = 1470 + SMCHARCUTSCENES00 = 1471 + SMCHARCUTSCENES01 = 1472 + SMCHARCUTSCENES02 = 1473 + SMCHARCUTSCENES03 = 1474 + SMMARSARABARBRIEFINGSET = 1475 + SMMARSARABARBRIEFINGSET2 = 1476 + SMMARSARABARBRIEFINGSETLEFT = 1477 + SMMARSARABARBRIEFINGSETRIGHT = 1478 + SMMARSARABARBRIEFINGTVMAIN = 1479 + SMMARSARABARBRIEFINGTVMAIN2 = 1480 + SMMARSARABARBRIEFINGTVMAIN3 = 1481 + SMMARSARABARBRIEFINGTVPORTRAIT1 = 1482 + SMMARSARABARBRIEFINGTVPORTRAIT2 = 1483 + SMMARSARABARBRIEFINGTVPORTRAIT3 = 1484 + SMMARSARABARBRIEFINGTVPORTRAIT4 = 1485 + SMMARSARABARBRIEFINGTVPORTRAIT5 = 1486 + SMMARSARABARSET = 1487 + SMMARSARABARSET2 = 1488 + SMMARSARABARSTARMAPHS = 1489 + SMMARSARABARTVHS = 1490 + SMMARSARABARHYDRALISKSKULLHS = 1491 + SMMARSARABARCORKBOARDHS = 1492 + SMMARSARABARCORKBOARDBACKGROUND = 1493 + SMMARSARABARCORKBOARDITEM1HS = 1494 + SMMARSARABARCORKBOARDITEM2HS = 1495 + SMMARSARABARCORKBOARDITEM3HS = 1496 + SMMARSARABARCORKBOARDITEM4HS = 1497 + SMMARSARABARCORKBOARDITEM5HS = 1498 + SMMARSARABARCORKBOARDITEM6HS = 1499 + SMMARSARABARCORKBOARDITEM7HS = 1500 + SMMARSARABARCORKBOARDITEM8HS = 1501 + SMMARSARABARCORKBOARDITEM9HS = 1502 + SMMARSARABARBOTTLESHS = 1503 + SMVALERIANOBSERVATORYPROPS = 1504 + SMVALERIANOBSERVATORYSTARMAP = 1505 + SMBANSHEE = 1506 + SMVIKING = 1507 + SMARMORYBANSHEE = 1508 + SMARMORYDROPSHIP = 1509 + SMARMORYTANK = 1510 + SMARMORYVIKING = 1511 + SMARMORYSPIDERMINE = 1512 + SMARMORYGHOSTCRATE = 1513 + SMARMORYSPECTRECRATE = 1514 + SMARMORYBANSHEEPHCRATE = 1515 + SMARMORYDROPSHIPPHCRATE = 1516 + SMARMORYTANKPHCRATE = 1517 + SMARMORYVIKINGPHCRATE = 1518 + SMARMORYSPIDERMINEPHCRATE = 1519 + SMARMORYGHOSTCRATEPHCRATE = 1520 + SMARMORYSPECTRECRATEPHCRATE = 1521 + SMARMORYRIFLE = 1522 + SMDROPSHIP = 1523 + SMDROPSHIPBLUE = 1524 + SMHYPERIONARMORYVIKING = 1525 + SMCHARGATLINGGUN = 1526 + SMBOUNTYHUNTER = 1527 + SMCIVILIAN = 1528 + SMZERGEDHANSON = 1529 + SMLABASSISTANT = 1530 + SMHYPERIONARMORER = 1531 + SMUNNSCREEN = 1532 + NEWSARCTURUSINTERVIEWSET = 1533 + NEWSARCTURUSPRESSROOM = 1534 + SMDONNYVERMILLIONSET = 1535 + NEWSMEINHOFFREFUGEECENTER = 1536 + NEWSRAYNORLOGO = 1537 + NEWSTVEFFECT = 1538 + SMUNNCAMERA = 1539 + SMLEEKENOSET = 1540 + SMTVSTATIC = 1541 + SMDONNYVERMILLION = 1542 + SMDONNYVERMILLIONDEATH = 1543 + SMLEEKENO = 1544 + SMKATELOCKWELL = 1545 + SMMIKELIBERTY = 1546 + SMTERRANREADYROOMLEFTTV = 1547 + SMTERRANREADYROOMMAINTV = 1548 + SMTERRANREADYROOMRIGHTTV = 1549 + SMHYPERIONARMORYSTAGE1SET = 1550 + SMHYPERIONARMORYSTAGE1SET01 = 1551 + SMHYPERIONARMORYSTAGE1SET02 = 1552 + SMHYPERIONARMORYSTAGE1SET03 = 1553 + SMHYPERIONARMORYSPACELIGHTING = 1554 + SMHYPERIONARMORYSTAGE1TECHNOLOGYCONSOLEHS = 1555 + SMHYPERIONBRIDGESTAGE1BOW = 1556 + SMHYPERIONBRIDGESTAGE1SET = 1557 + SMHYPERIONBRIDGESTAGE1SET2 = 1558 + SMHYPERIONBRIDGESTAGE1SET3 = 1559 + SMHYPERIONBRIDGEHOLOMAP = 1560 + SMHYPERIONCANTINASTAGE1SET = 1561 + SMHYPERIONCANTINASTAGE1SET2 = 1562 + SMHYPERIONCANTINASTAGE1WALLPIECE = 1563 + SMHYPERIONBRIDGEPROPS = 1564 + SMHYPERIONCANTINAPROPS = 1565 + SMHYPERIONMEDLABPROPS = 1566 + SMHYPERIONMEDLABPROTOSSCRYOTUBE0HS = 1567 + SMHYPERIONMEDLABPROTOSSCRYOTUBE1HS = 1568 + SMHYPERIONMEDLABPROTOSSCRYOTUBE2HS = 1569 + SMHYPERIONMEDLABPROTOSSCRYOTUBE3HS = 1570 + SMHYPERIONMEDLABPROTOSSCRYOTUBE4HS = 1571 + SMHYPERIONMEDLABPROTOSSCRYOTUBE5HS = 1572 + SMHYPERIONMEDLABZERGCRYOTUBE0HS = 1573 + SMHYPERIONMEDLABZERGCRYOTUBE1HS = 1574 + SMHYPERIONMEDLABZERGCRYOTUBE2HS = 1575 + SMHYPERIONMEDLABZERGCRYOTUBE3HS = 1576 + SMHYPERIONMEDLABZERGCRYOTUBE4HS = 1577 + SMHYPERIONMEDLABZERGCRYOTUBE5HS = 1578 + SMHYPERIONMEDLABCRYOTUBEA = 1579 + SMHYPERIONMEDLABCRYOTUBEB = 1580 + SMHYPERIONCANTINASTAGE1EXITHS = 1581 + SMHYPERIONCANTINASTAGE1STAIRCASEHS = 1582 + SMHYPERIONCANTINASTAGE1TVHS = 1583 + SMHYPERIONCANTINASTAGE1ARCADEGAMEHS = 1584 + SMHYPERIONCANTINASTAGE1JUKEBOXHS = 1585 + SMHYPERIONCANTINASTAGE1CORKBOARDHS = 1586 + SMHYPERIONCANTINAPROGRESSFRAME = 1587 + SMHYPERIONCANTINAHYDRACLAWSHS = 1588 + SMHYPERIONCANTINAMERCCOMPUTERHS = 1589 + SMHYPERIONCANTINASTAGE1PROGRESS1HS = 1590 + SMHYPERIONCANTINASTAGE1PROGRESS2HS = 1591 + SMHYPERIONCANTINASTAGE1PROGRESS3HS = 1592 + SMHYPERIONCANTINASTAGE1PROGRESS4HS = 1593 + SMHYPERIONCANTINASTAGE1PROGRESS5HS = 1594 + SMHYPERIONCANTINASTAGE1PROGRESS6HS = 1595 + SMHYPERIONCORRIDORSET = 1596 + SMHYPERIONBRIDGESTAGE1BATTLEREPORTSHS = 1597 + SMHYPERIONBRIDGESTAGE1CENTERCONSOLEHS = 1598 + SMHYPERIONBRIDGESTAGE1BATTLECOMMANDHS = 1599 + SMHYPERIONBRIDGESTAGE1CANTINAHS = 1600 + SMHYPERIONBRIDGESTAGE1WINDOWHS = 1601 + SMHYPERIONMEDLABSTAGE1SET = 1602 + SMHYPERIONMEDLABSTAGE1SET2 = 1603 + SMHYPERIONMEDLABSTAGE1SETLIGHTS = 1604 + SMHYPERIONMEDLABSTAGE1CONSOLEHS = 1605 + SMHYPERIONMEDLABSTAGE1DOORHS = 1606 + SMHYPERIONMEDLABSTAGE1CRYSTALHS = 1607 + SMHYPERIONMEDLABSTAGE1ARTIFACTHS = 1608 + SMHYPERIONLABARTIFACTPART1HS = 1609 + SMHYPERIONLABARTIFACTPART2HS = 1610 + SMHYPERIONLABARTIFACTPART3HS = 1611 + SMHYPERIONLABARTIFACTPART4HS = 1612 + SMHYPERIONLABARTIFACTBASEHS = 1613 + SMSHADOWBOX = 1614 + SMCHARBATTLEZONESHADOWBOX = 1615 + SMCHARINTERACTIVESKYPARALLAX = 1616 + SMCHARINTERACTIVE02SKYPARALLAX = 1617 + SMRAYNORCOMMANDER = 1618 + SMADJUTANT = 1619 + SMADJUTANTHOLOGRAM = 1620 + SMMARAUDER = 1621 + SMFIREBAT = 1622 + SMMARAUDERPHCRATE = 1623 + SMFIREBATPHCRATE = 1624 + SMRAYNORMARINE = 1625 + SMMARINE01 = 1626 + SMMARINE02 = 1627 + SMMARINE02AOD = 1628 + SMMARINE03 = 1629 + SMMARINE04 = 1630 + SMCADE = 1631 + SMHALL = 1632 + SMBRALIK = 1633 + SMANNABELLE = 1634 + SMEARL = 1635 + SMKACHINSKY = 1636 + SMGENERICMALEGREASEMONKEY01 = 1637 + SMGENERICMALEGREASEMONKEY02 = 1638 + SMGENERICMALEOFFICER01 = 1639 + SMGENERICMALEOFFICER02 = 1640 + SMSTETMANN = 1641 + SMCOOPER = 1642 + SMHILL = 1643 + SMYBARRA = 1644 + SMVALERIANMENGSK = 1645 + SMARCTURUSMENGSK = 1646 + SMARCTURUSHOLOGRAM = 1647 + SMZERATUL = 1648 + SMHYDRALISK = 1649 + SMHYDRALISKDEAD = 1650 + SMMUTALISK = 1651 + SMZERGLING = 1652 + SCIENTIST = 1653 + MINERMALE = 1654 + CIVILIAN = 1655 + COLONIST = 1656 + CIVILIANFEMALE = 1657 + COLONISTFEMALE = 1658 + HUT = 1659 + COLONISTHUT = 1660 + INFESTABLEHUT = 1661 + INFESTABLECOLONISTHUT = 1662 + XELNAGASHRINEXIL = 1663 + PROTOSSRELIC = 1664 + PICKUPGRENADES = 1665 + PICKUPPLASMAGUN = 1666 + PICKUPPLASMAROUNDS = 1667 + PICKUPMEDICRECHARGE = 1668 + PICKUPMANARECHARGE = 1669 + PICKUPRESTORATIONCHARGE = 1670 + PICKUPCHRONORIFTDEVICE = 1671 + PICKUPCHRONORIFTCHARGE = 1672 + GASCANISTER = 1673 + GASCANISTERPROTOSS = 1674 + GASCANISTERZERG = 1675 + MINERALCRYSTAL = 1676 + PALLETGAS = 1677 + PALLETMINERALS = 1678 + NATURALGAS = 1679 + NATURALMINERALS = 1680 + NATURALMINERALSRED = 1681 + PICKUPHEALTH25 = 1682 + PICKUPHEALTH50 = 1683 + PICKUPHEALTH100 = 1684 + PICKUPHEALTHFULL = 1685 + PICKUPENERGY25 = 1686 + PICKUPENERGY50 = 1687 + PICKUPENERGY100 = 1688 + PICKUPENERGYFULL = 1689 + PICKUPMINES = 1690 + PICKUPPSISTORM = 1691 + CIVILIANCARSUNIT = 1692 + CRUISERBIKE = 1693 + TERRANBUGGY = 1694 + COLONISTVEHICLEUNIT = 1695 + COLONISTVEHICLEUNIT01 = 1696 + DUMPTRUCK = 1697 + TANKERTRUCK = 1698 + FLATBEDTRUCK = 1699 + COLONISTSHIPTHANSON02A = 1700 + PURIFIER = 1701 + INFESTEDARMORY = 1702 + INFESTEDBARRACKS = 1703 + INFESTEDBUNKER = 1704 + INFESTEDCC = 1705 + INFESTEDENGBAY = 1706 + INFESTEDFACTORY = 1707 + INFESTEDREFINERY = 1708 + INFESTEDSTARPORT = 1709 + INFESTEDMISSILETURRET = 1710 + LOGISTICSHEADQUARTERS = 1711 + INFESTEDSUPPLY = 1712 + TARSONISENGINE = 1713 + TARSONISENGINEFAST = 1714 + FREIGHTCAR = 1715 + CABOOSE = 1716 + HYPERION = 1717 + MENGSKHOLOGRAMBILLBOARD = 1718 + TRAYNOR01SIGNSDESTRUCTIBLE1 = 1719 + ABANDONEDBUILDING = 1720 + NOVA = 1721 + FOOD1000 = 1722 + PSIINDOCTRINATOR = 1723 + JORIUMSTOCKPILE = 1724 + ZERGDROPPOD = 1725 + TERRANDROPPOD = 1726 + COLONISTBIODOME = 1727 + COLONISTBIODOMEHALFBUILT = 1728 + INFESTABLEBIODOME = 1729 + INFESTABLECOLONISTBIODOME = 1730 + MEDIC = 1731 + VIKINGSKY_UNIT = 1732 + SS_FIGHTER = 1733 + SS_PHOENIX = 1734 + SS_CARRIER = 1735 + SS_BACKGROUNDZERG01 = 1736 + SS_BACKGROUNDSPACE00 = 1737 + SS_BACKGROUNDSPACE01 = 1738 + SS_BACKGROUNDSPACE02 = 1739 + SS_BACKGROUNDSPACEPROT00 = 1740 + SS_BACKGROUNDSPACEPROT01 = 1741 + SS_BACKGROUNDSPACEPROT02 = 1742 + SS_BACKGROUNDSPACEPROT03 = 1743 + SS_BACKGROUNDSPACEPROT04 = 1744 + SS_BACKGROUNDSPACEPROTOSSLARGE = 1745 + SS_BACKGROUNDSPACEZERGLARGE = 1746 + SS_BACKGROUNDSPACETERRANLARGE = 1747 + SS_BACKGROUNDSPACEZERG01 = 1748 + SS_BACKGROUNDSPACETERRAN01 = 1749 + BREACHINGCHARGE = 1750 + INFESTATIONSPIRE = 1751 + SPACEPLATFORMVENTSUNIT = 1752 + STONEZEALOT = 1753 + PRESERVERPRISON = 1754 + PORTJUNKER = 1755 + LEVIATHAN = 1756 + SWARMLING = 1757 + VALHALLADESTRUCTIBLEWALL = 1758 + NEWFOLSOMPRISONENTRANCE = 1759 + ODINBUILD = 1760 + NUKEPACK = 1761 + CHARDESTRUCTIBLEROCKCOVER = 1762 + CHARDESTRUCTIBLEROCKCOVERV = 1763 + CHARDESTRUCTIBLEROCKCOVERULDR = 1764 + CHARDESTRUCTIBLEROCKCOVERURDL = 1765 + MAARWARPINUNIT = 1766 + EGGPURPLE = 1767 + TRUCKFLATBEDUNIT = 1768 + TRUCKSEMIUNIT = 1769 + TRUCKUTILITYUNIT = 1770 + INFESTEDCOLONISTSHIP = 1771 + CASTANARDESTRUCTIBLEDEBRIS = 1772 + COLONISTTRANSPORT = 1773 + PRESERVERBASE = 1774 + PRESERVERA = 1775 + PRESERVERB = 1776 + PRESERVERC = 1777 + TAURENSPACEMARINE = 1778 + MARSARABRIDGEBLUR = 1779 + MARSARABRIDGEBRUL = 1780 + SHORTBRIDGEVERTICAL = 1781 + SHORTBRIDGEHORIZONTAL = 1782 + TESTHERO = 1783 + TESTSHOP = 1784 + HEALINGPOTIONTESTTARGET = 1785 + _4SLOTBAG = 1786 + _6SLOTBAG = 1787 + _8SLOTBAG = 1788 + _10SLOTBAG = 1789 + _12SLOTBAG = 1790 + _14SLOTBAG = 1791 + _16SLOTBAG = 1792 + _18SLOTBAG = 1793 + _20SLOTBAG = 1794 + _22SLOTBAG = 1795 + _24SLOTBAG = 1796 + REPULSERFIELD6 = 1797 + REPULSERFIELD8 = 1798 + REPULSERFIELD10 = 1799 + REPULSERFIELD12 = 1800 + DESTRUCTIBLEWALLCORNER45ULBL = 1801 + DESTRUCTIBLEWALLCORNER45ULUR = 1802 + DESTRUCTIBLEWALLCORNER45URBR = 1803 + DESTRUCTIBLEWALLCORNER45 = 1804 + DESTRUCTIBLEWALLCORNER45UR90L = 1805 + DESTRUCTIBLEWALLCORNER45UL90B = 1806 + DESTRUCTIBLEWALLCORNER45BL90R = 1807 + DESTRUCTIBLEWALLCORNER45BR90T = 1808 + DESTRUCTIBLEWALLCORNER90L45BR = 1809 + DESTRUCTIBLEWALLCORNER90T45BL = 1810 + DESTRUCTIBLEWALLCORNER90R45UL = 1811 + DESTRUCTIBLEWALLCORNER90B45UR = 1812 + DESTRUCTIBLEWALLCORNER90TR = 1813 + DESTRUCTIBLEWALLCORNER90BR = 1814 + DESTRUCTIBLEWALLCORNER90LB = 1815 + DESTRUCTIBLEWALLCORNER90LT = 1816 + DESTRUCTIBLEWALLDIAGONALBLUR = 1817 + DESTRUCTIBLEWALLDIAGONALBLURLF = 1818 + DESTRUCTIBLEWALLDIAGONALULBRLF = 1819 + DESTRUCTIBLEWALLDIAGONALULBR = 1820 + DESTRUCTIBLEWALLSTRAIGHTVERTICAL = 1821 + DESTRUCTIBLEWALLVERTICALLF = 1822 + DESTRUCTIBLEWALLSTRAIGHTHORIZONTAL = 1823 + DESTRUCTIBLEWALLSTRAIGHTHORIZONTALBF = 1824 + DEFENSEWALLE = 1825 + DEFENSEWALLS = 1826 + DEFENSEWALLW = 1827 + DEFENSEWALLN = 1828 + DEFENSEWALLNE = 1829 + DEFENSEWALLSW = 1830 + DEFENSEWALLNW = 1831 + DEFENSEWALLSE = 1832 + WRECKEDBATTLECRUISERHELIOSFINAL = 1833 + FIREWORKSBLUE = 1834 + FIREWORKSRED = 1835 + FIREWORKSYELLOW = 1836 + PURIFIERBLASTMARKUNIT = 1837 + ITEMGRAVITYBOMBS = 1838 + ITEMGRENADES = 1839 + ITEMMEDKIT = 1840 + ITEMMINES = 1841 + REAPERPLACEMENT = 1842 + QUEENZAGARAACGLUESCREENDUMMY = 1843 + OVERSEERZAGARAACGLUESCREENDUMMY = 1844 + STUKOVINFESTEDCIVILIANACGLUESCREENDUMMY = 1845 + STUKOVINFESTEDMARINEACGLUESCREENDUMMY = 1846 + STUKOVINFESTEDSIEGETANKACGLUESCREENDUMMY = 1847 + STUKOVINFESTEDDIAMONDBACKACGLUESCREENDUMMY = 1848 + STUKOVINFESTEDBANSHEEACGLUESCREENDUMMY = 1849 + SILIBERATORACGLUESCREENDUMMY = 1850 + STUKOVINFESTEDBUNKERACGLUESCREENDUMMY = 1851 + STUKOVINFESTEDMISSILETURRETACGLUESCREENDUMMY = 1852 + STUKOVBROODQUEENACGLUESCREENDUMMY = 1853 + ZEALOTFENIXACGLUESCREENDUMMY = 1854 + SENTRYFENIXACGLUESCREENDUMMY = 1855 + ADEPTFENIXACGLUESCREENDUMMY = 1856 + IMMORTALFENIXACGLUESCREENDUMMY = 1857 + COLOSSUSFENIXACGLUESCREENDUMMY = 1858 + DISRUPTORACGLUESCREENDUMMY = 1859 + OBSERVERFENIXACGLUESCREENDUMMY = 1860 + SCOUTACGLUESCREENDUMMY = 1861 + CARRIERFENIXACGLUESCREENDUMMY = 1862 + PHOTONCANNONFENIXACGLUESCREENDUMMY = 1863 + PRIMALZERGLINGACGLUESCREENDUMMY = 1864 + RAVASAURACGLUESCREENDUMMY = 1865 + PRIMALROACHACGLUESCREENDUMMY = 1866 + FIREROACHACGLUESCREENDUMMY = 1867 + PRIMALGUARDIANACGLUESCREENDUMMY = 1868 + PRIMALHYDRALISKACGLUESCREENDUMMY = 1869 + PRIMALMUTALISKACGLUESCREENDUMMY = 1870 + PRIMALIMPALERACGLUESCREENDUMMY = 1871 + PRIMALSWARMHOSTACGLUESCREENDUMMY = 1872 + CREEPERHOSTACGLUESCREENDUMMY = 1873 + PRIMALULTRALISKACGLUESCREENDUMMY = 1874 + TYRANNOZORACGLUESCREENDUMMY = 1875 + PRIMALWURMACGLUESCREENDUMMY = 1876 + HHREAPERACGLUESCREENDUMMY = 1877 + HHWIDOWMINEACGLUESCREENDUMMY = 1878 + HHHELLIONTANKACGLUESCREENDUMMY = 1879 + HHWRAITHACGLUESCREENDUMMY = 1880 + HHVIKINGACGLUESCREENDUMMY = 1881 + HHBATTLECRUISERACGLUESCREENDUMMY = 1882 + HHRAVENACGLUESCREENDUMMY = 1883 + HHBOMBERPLATFORMACGLUESCREENDUMMY = 1884 + HHMERCSTARPORTACGLUESCREENDUMMY = 1885 + HHMISSILETURRETACGLUESCREENDUMMY = 1886 + HIGHTEMPLARSKINPREVIEW = 1887 + WARPPRISMSKINPREVIEW = 1888 + SIEGETANKSKINPREVIEW = 1889 + LIBERATORSKINPREVIEW = 1890 + VIKINGSKINPREVIEW = 1891 + STUKOVINFESTEDTROOPERACGLUESCREENDUMMY = 1892 + XELNAGADESTRUCTIBLEBLOCKER6S = 1893 + XELNAGADESTRUCTIBLEBLOCKER6SE = 1894 + XELNAGADESTRUCTIBLEBLOCKER6E = 1895 + XELNAGADESTRUCTIBLEBLOCKER6NE = 1896 + XELNAGADESTRUCTIBLEBLOCKER6N = 1897 + XELNAGADESTRUCTIBLEBLOCKER6NW = 1898 + XELNAGADESTRUCTIBLEBLOCKER6W = 1899 + XELNAGADESTRUCTIBLEBLOCKER6SW = 1900 + XELNAGADESTRUCTIBLEBLOCKER8S = 1901 + XELNAGADESTRUCTIBLEBLOCKER8SE = 1902 + XELNAGADESTRUCTIBLEBLOCKER8E = 1903 + XELNAGADESTRUCTIBLEBLOCKER8NE = 1904 + XELNAGADESTRUCTIBLEBLOCKER8N = 1905 + XELNAGADESTRUCTIBLEBLOCKER8NW = 1906 + XELNAGADESTRUCTIBLEBLOCKER8W = 1907 + XELNAGADESTRUCTIBLEBLOCKER8SW = 1908 + SNOWGLAZESTARTERMP = 1909 SHIELDBATTERY = 1910 - PROTOSS_SHIELDBATTERY = 1910 + OBSERVERSIEGEMODE = 1911 + OVERSEERSIEGEMODE = 1912 + RAVENREPAIRDRONE = 1913 + HIGHTEMPLARWEAPONMISSILE = 1914 + CYCLONEMISSILELARGEAIRALTERNATIVE = 1915 + RAVENSCRAMBLERMISSILE = 1916 + RAVENREPAIRDRONERELEASEWEAPON = 1917 + RAVENSHREDDERMISSILEWEAPON = 1918 + INFESTEDACIDSPINESWEAPON = 1919 + INFESTORENSNAREATTACKMISSILE = 1920 + SNARE_PLACEHOLDER = 1921 for item in UnitTypeId: globals()[item.name] = item diff --git a/sc2/ids/upgrade_id.py b/sc2/ids/upgrade_id.py index 8b696985f..bf1887683 100644 --- a/sc2/ids/upgrade_id.py +++ b/sc2/ids/upgrade_id.py @@ -1,10 +1,10 @@ # DO NOT EDIT! -# This file was automatically generated by "generate_id_constants.py" +# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" import enum class UpgradeId(enum.Enum): - INVALID = 0 + NULL = 0 CARRIERLAUNCHSPEEDUPGRADE = 1 GLIALRECONSTITUTION = 2 TUNNELINGCLAWS = 3 @@ -14,20 +14,31 @@ class UpgradeId(enum.Enum): TERRANINFANTRYWEAPONSLEVEL1 = 7 TERRANINFANTRYWEAPONSLEVEL2 = 8 TERRANINFANTRYWEAPONSLEVEL3 = 9 - NEOSTEELFRAME = 10 TERRANINFANTRYARMORSLEVEL1 = 11 TERRANINFANTRYARMORSLEVEL2 = 12 TERRANINFANTRYARMORSLEVEL3 = 13 + REAPERSPEED = 14 STIMPACK = 15 SHIELDWALL = 16 PUNISHERGRENADES = 17 + SIEGETECH = 18 HIGHCAPACITYBARRELS = 19 BANSHEECLOAK = 20 + MEDIVACCADUCEUSREACTOR = 21 RAVENCORVIDREACTOR = 22 + HUNTERSEEKER = 23 + DURABLEMATERIALS = 24 PERSONALCLOAKING = 25 + GHOSTMOEBIUSREACTOR = 26 + TERRANVEHICLEARMORSLEVEL1 = 27 + TERRANVEHICLEARMORSLEVEL2 = 28 + TERRANVEHICLEARMORSLEVEL3 = 29 TERRANVEHICLEWEAPONSLEVEL1 = 30 TERRANVEHICLEWEAPONSLEVEL2 = 31 TERRANVEHICLEWEAPONSLEVEL3 = 32 + TERRANSHIPARMORSLEVEL1 = 33 + TERRANSHIPARMORSLEVEL2 = 34 + TERRANSHIPARMORSLEVEL3 = 35 TERRANSHIPWEAPONSLEVEL1 = 36 TERRANSHIPWEAPONSLEVEL2 = 37 TERRANSHIPWEAPONSLEVEL3 = 38 @@ -43,6 +54,7 @@ class UpgradeId(enum.Enum): OBSERVERGRAVITICBOOSTER = 48 GRAVITICDRIVE = 49 EXTENDEDTHERMALLANCE = 50 + HIGHTEMPLARKHAYDARINAMULET = 51 PSISTORMTECH = 52 ZERGMELEEWEAPONSLEVEL1 = 53 ZERGMELEEWEAPONSLEVEL2 = 54 @@ -54,9 +66,11 @@ class UpgradeId(enum.Enum): ZERGMISSILEWEAPONSLEVEL2 = 60 ZERGMISSILEWEAPONSLEVEL3 = 61 OVERLORDSPEED = 62 + OVERLORDTRANSPORT = 63 BURROW = 64 ZERGLINGATTACKSPEED = 65 ZERGLINGMOVEMENTSPEED = 66 + HYDRALISKSPEED = 67 ZERGFLYERWEAPONSLEVEL1 = 68 ZERGFLYERWEAPONSLEVEL2 = 69 ZERGFLYERWEAPONSLEVEL3 = 70 @@ -66,6 +80,7 @@ class UpgradeId(enum.Enum): INFESTORENERGYUPGRADE = 74 CENTRIFICALHOOKS = 75 BATTLECRUISERENABLESPECIALIZATIONS = 76 + BATTLECRUISERBEHEMOTHREACTOR = 77 PROTOSSAIRWEAPONSLEVEL1 = 78 PROTOSSAIRWEAPONSLEVEL2 = 79 PROTOSSAIRWEAPONSLEVEL3 = 80 @@ -73,26 +88,215 @@ class UpgradeId(enum.Enum): PROTOSSAIRARMORSLEVEL2 = 82 PROTOSSAIRARMORSLEVEL3 = 83 WARPGATERESEARCH = 84 + HALTECH = 85 CHARGE = 86 BLINKTECH = 87 + ANABOLICSYNTHESIS = 88 + OBVERSEINCUBATION = 89 + VIKINGJOTUNBOOSTERS = 90 + ORGANICCARAPACE = 91 + INFESTORPERISTALSIS = 92 + ABDOMINALFORTITUDE = 93 + HYDRALISKSPEEDUPGRADE = 94 + BANELINGBURROWMOVE = 95 + COMBATDRUGS = 96 + STRIKECANNONS = 97 + TRANSFORMATIONSERVOS = 98 PHOENIXRANGEUPGRADE = 99 + TEMPESTRANGEUPGRADE = 100 NEURALPARASITE = 101 + LOCUSTLIFETIMEINCREASE = 102 + ULTRALISKBURROWCHARGEUPGRADE = 103 + ORACLEENERGYUPGRADE = 104 + RESTORESHIELDS = 105 + PROTOSSHEROSHIPWEAPON = 106 + PROTOSSHEROSHIPDETECTOR = 107 + PROTOSSHEROSHIPSPELL = 108 + REAPERJUMP = 109 + INCREASEDRANGE = 110 + ZERGBURROWMOVE = 111 + ANIONPULSECRYSTALS = 112 + TERRANVEHICLEANDSHIPWEAPONSLEVEL1 = 113 + TERRANVEHICLEANDSHIPWEAPONSLEVEL2 = 114 + TERRANVEHICLEANDSHIPWEAPONSLEVEL3 = 115 TERRANVEHICLEANDSHIPARMORSLEVEL1 = 116 TERRANVEHICLEANDSHIPARMORSLEVEL2 = 117 TERRANVEHICLEANDSHIPARMORSLEVEL3 = 118 + FLYINGLOCUSTS = 119 + ROACHSUPPLY = 120 + IMMORTALREVIVE = 121 DRILLCLAWS = 122 + CYCLONELOCKONRANGEUPGRADE = 123 + CYCLONEAIRUPGRADE = 124 + LIBERATORMORPH = 125 + ADEPTSHIELDUPGRADE = 126 + LURKERRANGE = 127 + IMMORTALBARRIER = 128 + ADEPTKILLBOUNCE = 129 ADEPTPIERCINGATTACK = 130 + CINEMATICMODE = 131 + CURSORDEBUG = 132 MAGFIELDLAUNCHERS = 133 EVOLVEGROOVEDSPINES = 134 EVOLVEMUSCULARAUGMENTS = 135 BANSHEESPEED = 136 + MEDIVACRAPIDDEPLOYMENT = 137 RAVENRECALIBRATEDEXPLOSIVES = 138 MEDIVACINCREASESPEEDBOOST = 139 LIBERATORAGRANGEUPGRADE = 140 DARKTEMPLARBLINKUPGRADE = 141 + RAVAGERRANGE = 142 + RAVENDAMAGEUPGRADE = 143 + CYCLONELOCKONDAMAGEUPGRADE = 144 + ARESCLASSWEAPONSSYSTEMVIKING = 145 + AUTOHARVESTER = 146 + HYBRIDCPLASMAUPGRADEHARD = 147 + HYBRIDCPLASMAUPGRADEINSANE = 148 + INTERCEPTORLIMIT4 = 149 + INTERCEPTORLIMIT6 = 150 + _330MMBARRAGECANNONS = 151 + NOTPOSSIBLESIEGEMODE = 152 + NEOSTEELFRAME = 153 + NEOSTEELANDSHRIKETURRETICONUPGRADE = 154 + OCULARIMPLANTS = 155 + CROSSSPECTRUMDAMPENERS = 156 + ORBITALSTRIKE = 157 + CLUSTERBOMB = 158 + SHAPEDHULL = 159 + SPECTRETOOLTIPUPGRADE = 160 + ULTRACAPACITORS = 161 + VANADIUMPLATING = 162 + COMMANDCENTERREACTOR = 163 + REGENERATIVEBIOSTEEL = 164 + CELLULARREACTORS = 165 + BANSHEECLOAKEDDAMAGE = 166 + DISTORTIONBLASTERS = 167 + EMPTOWER = 168 + SUPPLYDEPOTDROP = 169 + HIVEMINDEMULATOR = 170 + FORTIFIEDBUNKERCARAPACE = 171 + PREDATOR = 172 + SCIENCEVESSEL = 173 + DUALFUSIONWELDERS = 174 + ADVANCEDCONSTRUCTION = 175 + ADVANCEDMEDICTRAINING = 176 + PROJECTILEACCELERATORS = 177 + REINFORCEDSUPERSTRUCTURE = 178 + MULE = 179 + ORBITALRELAY = 180 + RAZORWIRE = 181 + ADVANCEDHEALINGAI = 182 + TWINLINKEDFLAMETHROWERS = 183 + NANOCONSTRUCTOR = 184 + CERBERUSMINES = 185 + HYPERFLUXOR = 186 + TRILITHIUMPOWERCELLS = 187 + PERMANENTCLOAKGHOST = 188 + PERMANENTCLOAKSPECTRE = 189 + ULTRASONICPULSE = 190 + SURVIVALPODS = 191 + ENERGYSTORAGE = 192 + FULLBORECANISTERAMMO = 193 + CAMPAIGNJOTUNBOOSTERS = 194 + MICROFILTERING = 195 + PARTICLECANNONAIR = 196 + VULTUREAUTOREPAIR = 197 + PSIDISRUPTOR = 198 + SCIENCEVESSELENERGYMANIPULATION = 199 + SCIENCEVESSELPLASMAWEAPONRY = 200 + SHOWGATLINGGUN = 201 + TECHREACTOR = 202 + TECHREACTORAI = 203 + TERRANDEFENSERANGEBONUS = 204 + X88TNAPALMUPGRADE = 205 + HURRICANEMISSILES = 206 + MECHANICALREBIRTH = 207 + MARINESTIMPACK = 208 + DARKTEMPLARTACTICS = 209 + CLUSTERWARHEADS = 210 + CLOAKDISTORTIONFIELD = 211 + DEVASTATORMISSILES = 212 + DISTORTIONTHRUSTERS = 213 + DYNAMICPOWERROUTING = 214 + IMPALERROUNDS = 215 + KINETICFIELDS = 216 + BURSTCAPACITORS = 217 + HAILSTORMMISSILEPODS = 218 + RAPIDDEPLOYMENT = 219 + REAPERSTIMPACK = 220 + REAPERD8CHARGE = 221 + TYCHUS05BATTLECRUISERPENETRATION = 222 + VIRALPLASMA = 223 + FIREBATJUGGERNAUTPLATING = 224 + MULTILOCKTARGETINGSYSTEMS = 225 + TURBOCHARGEDENGINES = 226 + DISTORTIONSENSORS = 227 + INFERNALPREIGNITERS = 228 + HELLIONCAMPAIGNINFERNALPREIGNITER = 229 + NAPALMFUELTANKS = 230 + AUXILIARYMEDBOTS = 231 + JUGGERNAUTPLATING = 232 + MARAUDERLIFEBOOST = 233 + COMBATSHIELD = 234 + REAPERU238ROUNDS = 235 + MAELSTROMROUNDS = 236 + SIEGETANKSHAPEDBLAST = 237 + TUNGSTENSPIKES = 238 + BEARCLAWNOZZLES = 239 + NANOBOTINJECTORS = 240 + STABILIZERMEDPACKS = 241 + HALOROCKETS = 242 + SCAVENGINGSYSTEMS = 243 + EXTRAMINES = 244 + ARESCLASSWEAPONSSYSTEM = 245 + WHITENAPALM = 246 + VIRALMUNITIONS = 247 + JACKHAMMERCONCUSSIONGRENADES = 248 + FIRESUPPRESSIONSYSTEMS = 249 + FLARERESEARCH = 250 + MODULARCONSTRUCTION = 251 + EXPANDEDHULL = 252 + SHRIKETURRET = 253 + MICROFUSIONREACTORS = 254 + WRAITHCLOAK = 255 + SINGULARITYCHARGE = 256 + GRAVITICTHRUSTERS = 257 + YAMATOCANNON = 258 + DEFENSIVEMATRIX = 259 + DARKPROTOSS = 260 + TERRANINFANTRYWEAPONSULTRACAPACITORSLEVEL1 = 261 + TERRANINFANTRYWEAPONSULTRACAPACITORSLEVEL2 = 262 + TERRANINFANTRYWEAPONSULTRACAPACITORSLEVEL3 = 263 + TERRANINFANTRYARMORSVANADIUMPLATINGLEVEL1 = 264 + TERRANINFANTRYARMORSVANADIUMPLATINGLEVEL2 = 265 + TERRANINFANTRYARMORSVANADIUMPLATINGLEVEL3 = 266 + TERRANVEHICLEWEAPONSULTRACAPACITORSLEVEL1 = 267 + TERRANVEHICLEWEAPONSULTRACAPACITORSLEVEL2 = 268 + TERRANVEHICLEWEAPONSULTRACAPACITORSLEVEL3 = 269 + TERRANVEHICLEARMORSVANADIUMPLATINGLEVEL1 = 270 + TERRANVEHICLEARMORSVANADIUMPLATINGLEVEL2 = 271 + TERRANVEHICLEARMORSVANADIUMPLATINGLEVEL3 = 272 + TERRANSHIPWEAPONSULTRACAPACITORSLEVEL1 = 273 + TERRANSHIPWEAPONSULTRACAPACITORSLEVEL2 = 274 + TERRANSHIPWEAPONSULTRACAPACITORSLEVEL3 = 275 + TERRANSHIPARMORSVANADIUMPLATINGLEVEL1 = 276 + TERRANSHIPARMORSVANADIUMPLATINGLEVEL2 = 277 + TERRANSHIPARMORSVANADIUMPLATINGLEVEL3 = 278 + HIREKELMORIANMINERSPH = 279 + HIREDEVILDOGSPH = 280 + HIRESPARTANCOMPANYPH = 281 + HIREHAMMERSECURITIESPH = 282 + HIRESIEGEBREAKERSPH = 283 + HIREHELSANGELSPH = 284 + HIREDUSKWINGPH = 285 + HIREDUKESREVENGE = 286 + TOSHEASYMODE = 287 + VOIDRAYSPEEDUPGRADE = 288 SMARTSERVOS = 289 - RAPIDFIRELAUNCHERS = 291 - ENHANCEDMUNITIONS = 292 + ARMORPIERCINGROCKETS = 290 + CYCLONERAPIDFIRELAUNCHERS = 291 + RAVENENHANCEDMUNITIONS = 292 + DIGGINGCLAWS = 293 for item in UpgradeId: globals()[item.name] = item From 8f705ab01eba966953641c247e118536a37cdaba Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Tue, 30 Jan 2018 19:11:05 +0800 Subject: [PATCH 38/56] Update header in id files --- sc2/ids/__init__.py | 2 +- sc2/ids/ability_id.py | 2 +- sc2/ids/buff_id.py | 2 +- sc2/ids/effect_id.py | 2 +- sc2/ids/unit_typeid.py | 2 +- sc2/ids/upgrade_id.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sc2/ids/__init__.py b/sc2/ids/__init__.py index 84d2f6e33..a714faeb3 100644 --- a/sc2/ids/__init__.py +++ b/sc2/ids/__init__.py @@ -1,4 +1,4 @@ # DO NOT EDIT! -# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" +# This file was automatically generated by "generate_id_constants_from_stableid.py" __all__ = ['units', 'abilities', 'upgrades', 'buffs', 'effects'] diff --git a/sc2/ids/ability_id.py b/sc2/ids/ability_id.py index 7c3a0cfb5..a72b2105a 100644 --- a/sc2/ids/ability_id.py +++ b/sc2/ids/ability_id.py @@ -1,5 +1,5 @@ # DO NOT EDIT! -# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" +# This file was automatically generated by "generate_id_constants_from_stableid.py" import enum diff --git a/sc2/ids/buff_id.py b/sc2/ids/buff_id.py index 2893bf816..17cb40d84 100644 --- a/sc2/ids/buff_id.py +++ b/sc2/ids/buff_id.py @@ -1,5 +1,5 @@ # DO NOT EDIT! -# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" +# This file was automatically generated by "generate_id_constants_from_stableid.py" import enum diff --git a/sc2/ids/effect_id.py b/sc2/ids/effect_id.py index f27baf99e..966d05a63 100644 --- a/sc2/ids/effect_id.py +++ b/sc2/ids/effect_id.py @@ -1,5 +1,5 @@ # DO NOT EDIT! -# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" +# This file was automatically generated by "generate_id_constants_from_stableid.py" import enum diff --git a/sc2/ids/unit_typeid.py b/sc2/ids/unit_typeid.py index 436cf8f81..1cb688951 100644 --- a/sc2/ids/unit_typeid.py +++ b/sc2/ids/unit_typeid.py @@ -1,5 +1,5 @@ # DO NOT EDIT! -# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" +# This file was automatically generated by "generate_id_constants_from_stableid.py" import enum diff --git a/sc2/ids/upgrade_id.py b/sc2/ids/upgrade_id.py index bf1887683..7090a41e5 100644 --- a/sc2/ids/upgrade_id.py +++ b/sc2/ids/upgrade_id.py @@ -1,5 +1,5 @@ # DO NOT EDIT! -# This file was automatically generated by "/Users/Reynald/PycharmProjects/python-sc2/generate_id_constants_from_stableid.py" +# This file was automatically generated by "generate_id_constants_from_stableid.py" import enum From b2778d1d6bbbb43a22e4ab58f81c0c79d0d97670 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Tue, 30 Jan 2018 19:28:44 +0800 Subject: [PATCH 39/56] Use abilities with index 0 --- generate_id_constants_from_stableid.py | 5 + sc2/ids/ability_id.py | 1747 ++++++++++++------------ 2 files changed, 878 insertions(+), 874 deletions(-) diff --git a/generate_id_constants_from_stableid.py b/generate_id_constants_from_stableid.py index 012272ab1..62da9aaf1 100644 --- a/generate_id_constants_from_stableid.py +++ b/generate_id_constants_from_stableid.py @@ -42,6 +42,11 @@ def clike_enum_parse(data): key = "_" + key key = key.upper().replace(" ", "_") + + if 'index' in v and v['index'] > 0: + continue + + # it looks like SC2 is only using abilities with index 0. Needs further verification. body[key] = v['id'] enums[d] = body return enums diff --git a/sc2/ids/ability_id.py b/sc2/ids/ability_id.py index a72b2105a..61ce9b29a 100644 --- a/sc2/ids/ability_id.py +++ b/sc2/ids/ability_id.py @@ -4,873 +4,872 @@ import enum class AbilityId(enum.Enum): - NULL = 0 - TAUNT = 3 - HOLDFIRE = 15 - MOVE = 20 - BEACON = 22 - ATTACK = 25 - SPRAYTERRAN = 27 - SPRAYZERG = 29 - SPRAYPROTOSS = 31 - SALVAGESHARED = 33 - CORRUPTION = 35 - GHOSTHOLDFIRE = 37 - GHOSTWEAPONSFREE = 39 - MORPHTOINFESTEDTERRAN = 41 - EXPLODE = 43 - FLEETBEACONRESEARCH = 73 - FUNGALGROWTH = 75 - GUARDIANSHIELD = 77 - MULEREPAIR = 79 - MORPHZERGLINGTOBANELING = 109 - NEXUSTRAINMOTHERSHIP = 139 - FEEDBACK = 141 - MASSRECALL = 143 - PLACEPOINTDEFENSEDRONE = 145 - HALLUCINATIONARCHON = 147 - HALLUCINATIONCOLOSSUS = 149 - HALLUCINATIONHIGHTEMPLAR = 151 - HALLUCINATIONIMMORTAL = 153 - HALLUCINATIONPHOENIX = 155 - HALLUCINATIONPROBE = 157 - HALLUCINATIONSTALKER = 159 - HALLUCINATIONVOIDRAY = 161 - HALLUCINATIONWARPPRISM = 163 - HALLUCINATIONZEALOT = 165 - MULEGATHER = 168 - SEEKERMISSILE = 170 - CALLDOWNMULE = 172 - GRAVITONBEAM = 174 - BUILDINPROGRESSNYDUSCANAL = 176 - SIPHON = 178 - LEECH = 180 - SPAWNCHANGELING = 182 - DISGUISEASZEALOT = 184 - DISGUISEASMARINEWITHSHIELD = 186 - DISGUISEASMARINEWITHOUTSHIELD = 188 - DISGUISEASZERGLINGWITHWINGS = 190 - DISGUISEASZERGLINGWITHOUTWINGS = 192 - PHASESHIFT = 194 - RALLY = 198 - PROGRESSRALLY = 202 - RALLYCOMMAND = 206 - RALLYNEXUS = 210 - RALLYHATCHERY = 214 - ROACHWARRENRESEARCH = 244 - SAPSTRUCTURE = 246 - INFESTEDTERRANS = 248 - NEURALPARASITE = 250 - SPAWNLARVA = 252 - STIMPACKMARAUDER = 254 - SUPPLYDROP = 256 - _250MMSTRIKECANNONS = 258 - TEMPORALRIFT = 260 - TIMEWARP = 262 - ULTRALISKCAVERNRESEARCH = 292 - WORMHOLETRANSIT = 294 - SCVHARVEST = 297 - PROBEHARVEST = 300 - ATTACKWARPPRISM = 303 - QUE1 = 305 - QUE5 = 307 - QUE5CANCELTOSELECTION = 309 - QUE5LONGBLEND = 311 - QUE5ADDON = 313 - BUILDINPROGRESS = 315 - REPAIR = 317 - TERRANBUILD = 348 - RAVENBUILD = 379 - STIMPACK = 381 - GHOSTCLOAK = 383 - SNIPE = 385 - MEDIVACHEAL = 387 - SIEGEMODE = 389 - UNSIEGE = 391 - BANSHEECLOAK = 393 - MEDIVACTRANSPORT = 398 - SCANNERSWEEP = 400 - YAMATO = 402 - ASSAULTMODE = 404 - FIGHTERMODE = 406 - BUNKERTRANSPORT = 411 - COMMANDCENTERTRANSPORT = 416 - COMMANDCENTERLIFTOFF = 418 - COMMANDCENTERLAND = 420 - BARRACKSADDONS = 451 - BARRACKSLIFTOFF = 453 - FACTORYADDONS = 484 - FACTORYLIFTOFF = 486 - STARPORTADDONS = 517 - STARPORTLIFTOFF = 519 - FACTORYLAND = 521 - STARPORTLAND = 523 - COMMANDCENTERTRAIN = 553 - BARRACKSLAND = 555 - SUPPLYDEPOTLOWER = 557 - SUPPLYDEPOTRAISE = 559 - BARRACKSTRAIN = 589 - FACTORYTRAIN = 619 - STARPORTTRAIN = 649 - ENGINEERINGBAYRESEARCH = 679 - MERCCOMPOUNDRESEARCH = 709 - ARMSILOWITHNUKE = 729 - BARRACKSTECHLABRESEARCH = 759 - FACTORYTECHLABRESEARCH = 789 - STARPORTTECHLABRESEARCH = 819 - GHOSTACADEMYRESEARCH = 849 - ARMORYRESEARCH = 879 - PROTOSSBUILD = 910 - WARPPRISMTRANSPORT = 915 - GATEWAYTRAIN = 945 - STARGATETRAIN = 975 - ROBOTICSFACILITYTRAIN = 1005 - NEXUSTRAIN = 1035 - PSISTORM = 1037 - HANGARQUEUE5 = 1039 - BROODLORDQUEUE2 = 1041 - CARRIERHANGAR = 1061 - FORGERESEARCH = 1091 - ROBOTICSBAYRESEARCH = 1121 - TEMPLARARCHIVESRESEARCH = 1151 - ZERGBUILD = 1182 - DRONEHARVEST = 1185 - EVOLUTIONCHAMBERRESEARCH = 1215 - UPGRADETOLAIR = 1217 - UPGRADETOHIVE = 1219 - UPGRADETOGREATERSPIRE = 1221 - LAIRRESEARCH = 1251 - SPAWNINGPOOLRESEARCH = 1281 - HYDRALISKDENRESEARCH = 1311 - SPIRERESEARCH = 1341 - LARVATRAIN = 1371 - MORPHTOBROODLORD = 1373 - BURROWBANELINGDOWN = 1375 - BURROWBANELINGUP = 1377 - BURROWDRONEDOWN = 1379 - BURROWDRONEUP = 1381 - BURROWHYDRALISKDOWN = 1383 - BURROWHYDRALISKUP = 1385 - BURROWROACHDOWN = 1387 - BURROWROACHUP = 1389 - BURROWZERGLINGDOWN = 1391 - BURROWZERGLINGUP = 1393 - BURROWINFESTORTERRANDOWN = 1395 - BURROWINFESTORTERRANUP = 1397 - REDSTONELAVACRITTERBURROW = 1399 - REDSTONELAVACRITTERINJUREDBURROW = 1401 - REDSTONELAVACRITTERUNBURROW = 1403 - REDSTONELAVACRITTERINJUREDUNBURROW = 1405 - OVERLORDTRANSPORT = 1410 + TAUNT = 2 + HOLDFIRE = 10 + MOVE = 16 + BEACON = 21 + ATTACK = 23 + SPRAYTERRAN = 26 + SPRAYZERG = 28 + SPRAYPROTOSS = 30 + SALVAGESHARED = 32 + CORRUPTION = 34 + GHOSTHOLDFIRE = 36 + GHOSTWEAPONSFREE = 38 + MORPHTOINFESTEDTERRAN = 40 + EXPLODE = 42 + FLEETBEACONRESEARCH = 44 + FUNGALGROWTH = 74 + GUARDIANSHIELD = 76 + MULEREPAIR = 78 + MORPHZERGLINGTOBANELING = 80 + NEXUSTRAINMOTHERSHIP = 110 + FEEDBACK = 140 + MASSRECALL = 142 + PLACEPOINTDEFENSEDRONE = 144 + HALLUCINATIONARCHON = 146 + HALLUCINATIONCOLOSSUS = 148 + HALLUCINATIONHIGHTEMPLAR = 150 + HALLUCINATIONIMMORTAL = 152 + HALLUCINATIONPHOENIX = 154 + HALLUCINATIONPROBE = 156 + HALLUCINATIONSTALKER = 158 + HALLUCINATIONVOIDRAY = 160 + HALLUCINATIONWARPPRISM = 162 + HALLUCINATIONZEALOT = 164 + MULEGATHER = 166 + SEEKERMISSILE = 169 + CALLDOWNMULE = 171 + GRAVITONBEAM = 173 + BUILDINPROGRESSNYDUSCANAL = 175 + SIPHON = 177 + LEECH = 179 + SPAWNCHANGELING = 181 + DISGUISEASZEALOT = 183 + DISGUISEASMARINEWITHSHIELD = 185 + DISGUISEASMARINEWITHOUTSHIELD = 187 + DISGUISEASZERGLINGWITHWINGS = 189 + DISGUISEASZERGLINGWITHOUTWINGS = 191 + PHASESHIFT = 193 + RALLY = 195 + PROGRESSRALLY = 199 + RALLYCOMMAND = 203 + RALLYNEXUS = 207 + RALLYHATCHERY = 211 + ROACHWARRENRESEARCH = 215 + SAPSTRUCTURE = 245 + INFESTEDTERRANS = 247 + NEURALPARASITE = 249 + SPAWNLARVA = 251 + STIMPACKMARAUDER = 253 + SUPPLYDROP = 255 + _250MMSTRIKECANNONS = 257 + TEMPORALRIFT = 259 + TIMEWARP = 261 + ULTRALISKCAVERNRESEARCH = 263 + WORMHOLETRANSIT = 293 + SCVHARVEST = 295 + PROBEHARVEST = 298 + ATTACKWARPPRISM = 301 + QUE1 = 304 + QUE5 = 306 + QUE5CANCELTOSELECTION = 308 + QUE5LONGBLEND = 310 + QUE5ADDON = 312 + BUILDINPROGRESS = 314 + REPAIR = 316 + TERRANBUILD = 318 + RAVENBUILD = 349 + STIMPACK = 380 + GHOSTCLOAK = 382 + SNIPE = 384 + MEDIVACHEAL = 386 + SIEGEMODE = 388 + UNSIEGE = 390 + BANSHEECLOAK = 392 + MEDIVACTRANSPORT = 394 + SCANNERSWEEP = 399 + YAMATO = 401 + ASSAULTMODE = 403 + FIGHTERMODE = 405 + BUNKERTRANSPORT = 407 + COMMANDCENTERTRANSPORT = 412 + COMMANDCENTERLIFTOFF = 417 + COMMANDCENTERLAND = 419 + BARRACKSADDONS = 421 + BARRACKSLIFTOFF = 452 + FACTORYADDONS = 454 + FACTORYLIFTOFF = 485 + STARPORTADDONS = 487 + STARPORTLIFTOFF = 518 + FACTORYLAND = 520 + STARPORTLAND = 522 + COMMANDCENTERTRAIN = 524 + BARRACKSLAND = 554 + SUPPLYDEPOTLOWER = 556 + SUPPLYDEPOTRAISE = 558 + BARRACKSTRAIN = 560 + FACTORYTRAIN = 590 + STARPORTTRAIN = 620 + ENGINEERINGBAYRESEARCH = 650 + MERCCOMPOUNDRESEARCH = 680 + ARMSILOWITHNUKE = 710 + BARRACKSTECHLABRESEARCH = 730 + FACTORYTECHLABRESEARCH = 760 + STARPORTTECHLABRESEARCH = 790 + GHOSTACADEMYRESEARCH = 820 + ARMORYRESEARCH = 850 + PROTOSSBUILD = 880 + WARPPRISMTRANSPORT = 911 + GATEWAYTRAIN = 916 + STARGATETRAIN = 946 + ROBOTICSFACILITYTRAIN = 976 + NEXUSTRAIN = 1006 + PSISTORM = 1036 + HANGARQUEUE5 = 1038 + BROODLORDQUEUE2 = 1040 + CARRIERHANGAR = 1042 + FORGERESEARCH = 1062 + ROBOTICSBAYRESEARCH = 1092 + TEMPLARARCHIVESRESEARCH = 1122 + ZERGBUILD = 1152 + DRONEHARVEST = 1183 + EVOLUTIONCHAMBERRESEARCH = 1186 + UPGRADETOLAIR = 1216 + UPGRADETOHIVE = 1218 + UPGRADETOGREATERSPIRE = 1220 + LAIRRESEARCH = 1222 + SPAWNINGPOOLRESEARCH = 1252 + HYDRALISKDENRESEARCH = 1282 + SPIRERESEARCH = 1312 + LARVATRAIN = 1342 + MORPHTOBROODLORD = 1372 + BURROWBANELINGDOWN = 1374 + BURROWBANELINGUP = 1376 + BURROWDRONEDOWN = 1378 + BURROWDRONEUP = 1380 + BURROWHYDRALISKDOWN = 1382 + BURROWHYDRALISKUP = 1384 + BURROWROACHDOWN = 1386 + BURROWROACHUP = 1388 + BURROWZERGLINGDOWN = 1390 + BURROWZERGLINGUP = 1392 + BURROWINFESTORTERRANDOWN = 1394 + BURROWINFESTORTERRANUP = 1396 + REDSTONELAVACRITTERBURROW = 1398 + REDSTONELAVACRITTERINJUREDBURROW = 1400 + REDSTONELAVACRITTERUNBURROW = 1402 + REDSTONELAVACRITTERINJUREDUNBURROW = 1404 + OVERLORDTRANSPORT = 1406 MERGEABLE = 1411 WARPABLE = 1412 - WARPGATETRAIN = 1432 - BURROWQUEENDOWN = 1434 - BURROWQUEENUP = 1436 - NYDUSCANALTRANSPORT = 1441 - BLINK = 1443 - BURROWINFESTORDOWN = 1445 - BURROWINFESTORUP = 1447 - MORPHTOOVERSEER = 1449 - UPGRADETOPLANETARYFORTRESS = 1451 - INFESTATIONPITRESEARCH = 1481 - BANELINGNESTRESEARCH = 1511 - BURROWULTRALISKDOWN = 1513 - BURROWULTRALISKUP = 1515 - UPGRADETOORBITAL = 1517 - UPGRADETOWARPGATE = 1519 - MORPHBACKTOGATEWAY = 1521 - ORBITALLIFTOFF = 1523 - ORBITALCOMMANDLAND = 1525 - FORCEFIELD = 1527 - PHASINGMODE = 1529 - TRANSPORTMODE = 1531 - FUSIONCORERESEARCH = 1561 - CYBERNETICSCORERESEARCH = 1591 - TWILIGHTCOUNCILRESEARCH = 1621 - TACNUKESTRIKE = 1623 - SALVAGEBUNKERREFUND = 1625 - SALVAGEBUNKER = 1627 - EMP = 1629 - VORTEX = 1631 - TRAINQUEEN = 1661 - BURROWCREEPTUMORDOWN = 1663 - TRANSFUSION = 1665 - TECHLABMORPH = 1667 - BARRACKSTECHLABMORPH = 1669 - FACTORYTECHLABMORPH = 1671 - STARPORTTECHLABMORPH = 1673 - REACTORMORPH = 1675 - BARRACKSREACTORMORPH = 1677 - FACTORYREACTORMORPH = 1679 - STARPORTREACTORMORPH = 1681 + WARPGATETRAIN = 1413 + BURROWQUEENDOWN = 1433 + BURROWQUEENUP = 1435 + NYDUSCANALTRANSPORT = 1437 + BLINK = 1442 + BURROWINFESTORDOWN = 1444 + BURROWINFESTORUP = 1446 + MORPHTOOVERSEER = 1448 + UPGRADETOPLANETARYFORTRESS = 1450 + INFESTATIONPITRESEARCH = 1452 + BANELINGNESTRESEARCH = 1482 + BURROWULTRALISKDOWN = 1512 + BURROWULTRALISKUP = 1514 + UPGRADETOORBITAL = 1516 + UPGRADETOWARPGATE = 1518 + MORPHBACKTOGATEWAY = 1520 + ORBITALLIFTOFF = 1522 + ORBITALCOMMANDLAND = 1524 + FORCEFIELD = 1526 + PHASINGMODE = 1528 + TRANSPORTMODE = 1530 + FUSIONCORERESEARCH = 1532 + CYBERNETICSCORERESEARCH = 1562 + TWILIGHTCOUNCILRESEARCH = 1592 + TACNUKESTRIKE = 1622 + SALVAGEBUNKERREFUND = 1624 + SALVAGEBUNKER = 1626 + EMP = 1628 + VORTEX = 1630 + TRAINQUEEN = 1632 + BURROWCREEPTUMORDOWN = 1662 + TRANSFUSION = 1664 + TECHLABMORPH = 1666 + BARRACKSTECHLABMORPH = 1668 + FACTORYTECHLABMORPH = 1670 + STARPORTTECHLABMORPH = 1672 + REACTORMORPH = 1674 + BARRACKSREACTORMORPH = 1676 + FACTORYREACTORMORPH = 1678 + STARPORTREACTORMORPH = 1680 ATTACKREDIRECT = 1682 STIMPACKREDIRECT = 1683 STIMPACKMARAUDERREDIRECT = 1684 - BURROWEDSTOP = 1690 + BURROWEDSTOP = 1685 STOPREDIRECT = 1691 - GENERATECREEP = 1693 - QUEENBUILD = 1724 - SPINECRAWLERUPROOT = 1726 - SPORECRAWLERUPROOT = 1728 - SPINECRAWLERROOT = 1730 - SPORECRAWLERROOT = 1732 - CREEPTUMORBUILD = 1763 - BUILDAUTOTURRET = 1765 - ARCHONWARP = 1767 - BUILDNYDUSCANAL = 1798 - BROODLORDHANGAR = 1818 + GENERATECREEP = 1692 + QUEENBUILD = 1694 + SPINECRAWLERUPROOT = 1725 + SPORECRAWLERUPROOT = 1727 + SPINECRAWLERROOT = 1729 + SPORECRAWLERROOT = 1731 + CREEPTUMORBUILD = 1733 + BUILDAUTOTURRET = 1764 + ARCHONWARP = 1766 + BUILDNYDUSCANAL = 1768 + BROODLORDHANGAR = 1799 CHARGE = 1819 TOWERCAPTURE = 1820 - HERDINTERACT = 1822 - FRENZY = 1824 - CONTAMINATE = 1826 - SHATTER = 1828 - INFESTEDTERRANSLAYEGG = 1830 - QUE5PASSIVE = 1832 - QUE5PASSIVECANCELTOSELECTION = 1834 - MORPHTOGHOSTALTERNATE = 1836 - MORPHTOGHOSTNOVA = 1838 - DIGESTERCREEPSPRAY = 1840 - MORPHTOCOLLAPSIBLETERRANTOWERDEBRIS = 1842 - MORPHTOCOLLAPSIBLETERRANTOWERDEBRISRAMPLEFT = 1844 - MORPHTOCOLLAPSIBLETERRANTOWERDEBRISRAMPRIGHT = 1846 - MORPHTOMOTHERSHIP = 1848 - MOTHERSHIPSTASIS = 1850 - MOTHERSHIPCOREWEAPON = 1852 - NEXUSTRAINMOTHERSHIPCORE = 1882 - MOTHERSHIPCORETELEPORT = 1884 - SALVAGEDRONEREFUND = 1886 - SALVAGEDRONE = 1888 - SALVAGEZERGLINGREFUND = 1890 - SALVAGEZERGLING = 1892 - SALVAGEQUEENREFUND = 1894 - SALVAGEQUEEN = 1896 - SALVAGEROACHREFUND = 1898 - SALVAGEROACH = 1900 - SALVAGEBANELINGREFUND = 1902 - SALVAGEBANELING = 1904 - SALVAGEHYDRALISKREFUND = 1906 - SALVAGEHYDRALISK = 1908 - SALVAGEINFESTORREFUND = 1910 - SALVAGEINFESTOR = 1912 - SALVAGESWARMHOSTREFUND = 1914 - SALVAGESWARMHOST = 1916 - SALVAGEULTRALISKREFUND = 1918 - SALVAGEULTRALISK = 1920 - DIGESTERTRANSPORT = 1925 - SPECTRESHIELD = 1927 - XELNAGAHEALINGSHRINE = 1929 - NEXUSINVULNERABILITY = 1931 - NEXUSPHASESHIFT = 1933 - SPAWNCHANGELINGTARGET = 1935 - QUEENLAND = 1937 - QUEENFLY = 1939 - ORACLECLOAKFIELD = 1941 - FLYERSHIELD = 1943 - LOCUSTTRAIN = 1973 - MOTHERSHIPCOREMASSRECALL = 1975 - SINGLERECALL = 1977 - MORPHTOHELLION = 1979 - RESTORESHIELDS = 1981 - SCRYER = 1983 - BURROWCHARGETRIAL = 1985 - LEECHRESOURCES = 1987 - SNIPEDOT = 1989 - SWARMHOSTSPAWNLOCUSTS = 1991 - CLONE = 1993 - BUILDINGSHIELD = 1995 - MORPHTOCOLLAPSIBLEROCKTOWERDEBRIS = 1997 - MORPHTOHELLIONTANK = 1999 - BUILDINGSTASIS = 2001 - RESOURCEBLOCKER = 2003 - RESOURCESTUN = 2005 - MAXIUMTHRUST = 2007 - SACRIFICE = 2009 - BURROWCHARGEMP = 2011 - BURROWCHARGEREVD = 2013 - MORPHTOSWARMHOSTBURROWEDMP = 2015 - MORPHTOSWARMHOSTMP = 2017 - SPAWNINFESTEDTERRAN = 2047 - ATTACKPROTOSSBUILDING = 2050 - BURROWEDBANELINGSTOP = 2056 - STOPPROTOSSBUILDING = 2062 - BLINDINGCLOUD = 2064 - EYESTALK = 2066 - YOINK = 2068 - VIPERCONSUME = 2070 - VIPERCONSUMEMINERALS = 2072 - VIPERCONSUMESTRUCTURE = 2074 - PROTOSSBUILDINGQUEUE = 2076 - QUE8 = 2078 - TESTZERG = 2080 - VOLATILEBURSTBUILDING = 2082 - PICKUPSCRAPSMALL = 2084 - PICKUPSCRAPMEDIUM = 2086 - PICKUPSCRAPLARGE = 2088 - PICKUPPALLETGAS = 2090 - PICKUPPALLETMINERALS = 2092 - MASSIVEKNOCKOVER = 2094 - WIDOWMINEBURROW = 2096 - WIDOWMINEUNBURROW = 2098 - WIDOWMINEATTACK = 2100 + HERDINTERACT = 1821 + FRENZY = 1823 + CONTAMINATE = 1825 + SHATTER = 1827 + INFESTEDTERRANSLAYEGG = 1829 + QUE5PASSIVE = 1831 + QUE5PASSIVECANCELTOSELECTION = 1833 + MORPHTOGHOSTALTERNATE = 1835 + MORPHTOGHOSTNOVA = 1837 + DIGESTERCREEPSPRAY = 1839 + MORPHTOCOLLAPSIBLETERRANTOWERDEBRIS = 1841 + MORPHTOCOLLAPSIBLETERRANTOWERDEBRISRAMPLEFT = 1843 + MORPHTOCOLLAPSIBLETERRANTOWERDEBRISRAMPRIGHT = 1845 + MORPHTOMOTHERSHIP = 1847 + MOTHERSHIPSTASIS = 1849 + MOTHERSHIPCOREWEAPON = 1851 + NEXUSTRAINMOTHERSHIPCORE = 1853 + MOTHERSHIPCORETELEPORT = 1883 + SALVAGEDRONEREFUND = 1885 + SALVAGEDRONE = 1887 + SALVAGEZERGLINGREFUND = 1889 + SALVAGEZERGLING = 1891 + SALVAGEQUEENREFUND = 1893 + SALVAGEQUEEN = 1895 + SALVAGEROACHREFUND = 1897 + SALVAGEROACH = 1899 + SALVAGEBANELINGREFUND = 1901 + SALVAGEBANELING = 1903 + SALVAGEHYDRALISKREFUND = 1905 + SALVAGEHYDRALISK = 1907 + SALVAGEINFESTORREFUND = 1909 + SALVAGEINFESTOR = 1911 + SALVAGESWARMHOSTREFUND = 1913 + SALVAGESWARMHOST = 1915 + SALVAGEULTRALISKREFUND = 1917 + SALVAGEULTRALISK = 1919 + DIGESTERTRANSPORT = 1921 + SPECTRESHIELD = 1926 + XELNAGAHEALINGSHRINE = 1928 + NEXUSINVULNERABILITY = 1930 + NEXUSPHASESHIFT = 1932 + SPAWNCHANGELINGTARGET = 1934 + QUEENLAND = 1936 + QUEENFLY = 1938 + ORACLECLOAKFIELD = 1940 + FLYERSHIELD = 1942 + LOCUSTTRAIN = 1944 + MOTHERSHIPCOREMASSRECALL = 1974 + SINGLERECALL = 1976 + MORPHTOHELLION = 1978 + RESTORESHIELDS = 1980 + SCRYER = 1982 + BURROWCHARGETRIAL = 1984 + LEECHRESOURCES = 1986 + SNIPEDOT = 1988 + SWARMHOSTSPAWNLOCUSTS = 1990 + CLONE = 1992 + BUILDINGSHIELD = 1994 + MORPHTOCOLLAPSIBLEROCKTOWERDEBRIS = 1996 + MORPHTOHELLIONTANK = 1998 + BUILDINGSTASIS = 2000 + RESOURCEBLOCKER = 2002 + RESOURCESTUN = 2004 + MAXIUMTHRUST = 2006 + SACRIFICE = 2008 + BURROWCHARGEMP = 2010 + BURROWCHARGEREVD = 2012 + MORPHTOSWARMHOSTBURROWEDMP = 2014 + MORPHTOSWARMHOSTMP = 2016 + SPAWNINFESTEDTERRAN = 2018 + ATTACKPROTOSSBUILDING = 2048 + BURROWEDBANELINGSTOP = 2051 + STOPPROTOSSBUILDING = 2057 + BLINDINGCLOUD = 2063 + EYESTALK = 2065 + YOINK = 2067 + VIPERCONSUME = 2069 + VIPERCONSUMEMINERALS = 2071 + VIPERCONSUMESTRUCTURE = 2073 + PROTOSSBUILDINGQUEUE = 2075 + QUE8 = 2077 + TESTZERG = 2079 + VOLATILEBURSTBUILDING = 2081 + PICKUPSCRAPSMALL = 2083 + PICKUPSCRAPMEDIUM = 2085 + PICKUPSCRAPLARGE = 2087 + PICKUPPALLETGAS = 2089 + PICKUPPALLETMINERALS = 2091 + MASSIVEKNOCKOVER = 2093 + WIDOWMINEBURROW = 2095 + WIDOWMINEUNBURROW = 2097 + WIDOWMINEATTACK = 2099 TORNADOMISSILE = 2101 - MOTHERSHIPCOREENERGIZE = 2103 - LURKERASPECTMPFROMHYDRALISKBURROWED = 2105 - LURKERASPECTMP = 2107 - BURROWLURKERMPDOWN = 2109 - BURROWLURKERMPUP = 2111 - UPGRADETOLURKERDENMP = 2113 - HALLUCINATIONORACLE = 2115 - MEDIVACSPEEDBOOST = 2117 - EXTENDINGBRIDGENEWIDE8OUT = 2119 - EXTENDINGBRIDGENEWIDE8 = 2121 - EXTENDINGBRIDGENWWIDE8OUT = 2123 - EXTENDINGBRIDGENWWIDE8 = 2125 - EXTENDINGBRIDGENEWIDE10OUT = 2127 - EXTENDINGBRIDGENEWIDE10 = 2129 - EXTENDINGBRIDGENWWIDE10OUT = 2131 - EXTENDINGBRIDGENWWIDE10 = 2133 - EXTENDINGBRIDGENEWIDE12OUT = 2135 - EXTENDINGBRIDGENEWIDE12 = 2137 - EXTENDINGBRIDGENWWIDE12OUT = 2139 - EXTENDINGBRIDGENWWIDE12 = 2141 - INVULNERABILITYSHIELD = 2143 - CRITTERFLEE = 2145 - ORACLEREVELATION = 2147 - ORACLEREVELATIONMODE = 2149 - ORACLENORMALMODE = 2151 - MORPHTOCOLLAPSIBLEROCKTOWERDEBRISRAMPRIGHT = 2153 - MORPHTOCOLLAPSIBLEROCKTOWERDEBRISRAMPLEFT = 2155 - VOIDSIPHON = 2157 - ULTRALISKWEAPONCOOLDOWN = 2159 - MOTHERSHIPCOREPURIFYNEXUSCANCEL = 2161 - MOTHERSHIPCOREPURIFYNEXUS = 2163 - XELNAGA_CAVERNS_DOORE = 2165 - XELNAGA_CAVERNS_DOOREOPENED = 2167 - XELNAGA_CAVERNS_DOORN = 2169 - XELNAGA_CAVERNS_DOORNE = 2171 - XELNAGA_CAVERNS_DOORNEOPENED = 2173 - XELNAGA_CAVERNS_DOORNOPENED = 2175 - XELNAGA_CAVERNS_DOORNW = 2177 - XELNAGA_CAVERNS_DOORNWOPENED = 2179 - XELNAGA_CAVERNS_DOORS = 2181 - XELNAGA_CAVERNS_DOORSE = 2183 - XELNAGA_CAVERNS_DOORSEOPENED = 2185 - XELNAGA_CAVERNS_DOORSOPENED = 2187 - XELNAGA_CAVERNS_DOORSW = 2189 - XELNAGA_CAVERNS_DOORSWOPENED = 2191 - XELNAGA_CAVERNS_DOORW = 2193 - XELNAGA_CAVERNS_DOORWOPENED = 2195 - XELNAGA_CAVERNS_FLOATING_BRIDGENE8OUT = 2197 - XELNAGA_CAVERNS_FLOATING_BRIDGENE8 = 2199 - XELNAGA_CAVERNS_FLOATING_BRIDGENW8OUT = 2201 - XELNAGA_CAVERNS_FLOATING_BRIDGENW8 = 2203 - XELNAGA_CAVERNS_FLOATING_BRIDGENE10OUT = 2205 - XELNAGA_CAVERNS_FLOATING_BRIDGENE10 = 2207 - XELNAGA_CAVERNS_FLOATING_BRIDGENW10OUT = 2209 - XELNAGA_CAVERNS_FLOATING_BRIDGENW10 = 2211 - XELNAGA_CAVERNS_FLOATING_BRIDGENE12OUT = 2213 - XELNAGA_CAVERNS_FLOATING_BRIDGENE12 = 2215 - XELNAGA_CAVERNS_FLOATING_BRIDGENW12OUT = 2217 - XELNAGA_CAVERNS_FLOATING_BRIDGENW12 = 2219 - XELNAGA_CAVERNS_FLOATING_BRIDGEH8OUT = 2221 - XELNAGA_CAVERNS_FLOATING_BRIDGEH8 = 2223 - XELNAGA_CAVERNS_FLOATING_BRIDGEV8OUT = 2225 - XELNAGA_CAVERNS_FLOATING_BRIDGEV8 = 2227 - XELNAGA_CAVERNS_FLOATING_BRIDGEH10OUT = 2229 - XELNAGA_CAVERNS_FLOATING_BRIDGEH10 = 2231 - XELNAGA_CAVERNS_FLOATING_BRIDGEV10OUT = 2233 - XELNAGA_CAVERNS_FLOATING_BRIDGEV10 = 2235 - XELNAGA_CAVERNS_FLOATING_BRIDGEH12OUT = 2237 - XELNAGA_CAVERNS_FLOATING_BRIDGEH12 = 2239 - XELNAGA_CAVERNS_FLOATING_BRIDGEV12OUT = 2241 - XELNAGA_CAVERNS_FLOATING_BRIDGEV12 = 2243 - TEMPORALFIELD = 2245 - SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8OUT = 2247 - SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8 = 2249 - SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8OUT = 2251 - SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8 = 2253 - SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT10OUT = 2255 - SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT10 = 2257 - SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT10OUT = 2259 - SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT10 = 2261 - TARSONIS_DOORN = 2263 - TARSONIS_DOORNLOWERED = 2265 - TARSONIS_DOORNE = 2267 - TARSONIS_DOORNELOWERED = 2269 - TARSONIS_DOORE = 2271 - TARSONIS_DOORELOWERED = 2273 - TARSONIS_DOORNW = 2275 - TARSONIS_DOORNWLOWERED = 2277 - COMPOUNDMANSION_DOORN = 2279 - COMPOUNDMANSION_DOORNLOWERED = 2281 - COMPOUNDMANSION_DOORNE = 2283 - COMPOUNDMANSION_DOORNELOWERED = 2285 - COMPOUNDMANSION_DOORE = 2287 - COMPOUNDMANSION_DOORELOWERED = 2289 - COMPOUNDMANSION_DOORNW = 2291 - COMPOUNDMANSION_DOORNWLOWERED = 2293 - ARMORYRESEARCHSWARM = 2323 - CAUSTICSPRAY = 2325 - ORACLECLOAKINGFIELDTARGETED = 2327 - IMMORTALOVERLOAD = 2329 - MORPHTORAVAGER = 2331 - MORPHTOLURKER = 2333 - ORACLEPHASESHIFT = 2335 - RELEASEINTERCEPTORS = 2337 - RAVAGERCORROSIVEBILE = 2339 - BURROWRAVAGERDOWN = 2341 - BURROWRAVAGERUP = 2343 - PURIFICATIONNOVA = 2345 - PURIFICATIONNOVATARGETED = 2347 - IMPALE = 2349 - LOCKON = 2351 - LOCKONAIR = 2353 - LOCKONCANCEL = 2355 - CORRUPTIONBOMB = 2357 - HYPERJUMP = 2359 - OVERCHARGE = 2361 - THORAPMODE = 2363 - THORNORMALMODE = 2365 - LIGHTOFAIUR = 2367 - MOTHERSHIPMASSRECALL = 2369 - NYDUSWORMTRANSPORT = 2374 - ORACLEWEAPON = 2376 - PULSARBEAM = 2378 - PULSARCANNON = 2380 - VOIDSWARMHOSTSPAWNLOCUST = 2382 - LOCUSTMPFLYINGMORPHTOGROUND = 2384 - LOCUSTMPMORPHTOAIR = 2386 - LOCUSTMPFLYINGSWOOP = 2388 - HALLUCINATIONDISRUPTOR = 2390 - HALLUCINATIONADEPT = 2392 - VOIDRAYSWARMDAMAGEBOOST = 2394 - SEEKERDUMMYCHANNEL = 2396 - AIURLIGHTBRIDGENE8OUT = 2398 - AIURLIGHTBRIDGENE8 = 2400 - AIURLIGHTBRIDGENE10OUT = 2402 - AIURLIGHTBRIDGENE10 = 2404 - AIURLIGHTBRIDGENE12OUT = 2406 - AIURLIGHTBRIDGENE12 = 2408 - AIURLIGHTBRIDGENW8OUT = 2410 - AIURLIGHTBRIDGENW8 = 2412 - AIURLIGHTBRIDGENW10OUT = 2414 - AIURLIGHTBRIDGENW10 = 2416 - AIURLIGHTBRIDGENW12OUT = 2418 - AIURLIGHTBRIDGENW12 = 2420 - AIURTEMPLEBRIDGENE8OUT = 2422 - AIURTEMPLEBRIDGENE8 = 2424 - AIURTEMPLEBRIDGENE10OUT = 2426 - AIURTEMPLEBRIDGENE10 = 2428 - AIURTEMPLEBRIDGENE12OUT = 2430 - AIURTEMPLEBRIDGENE12 = 2432 - AIURTEMPLEBRIDGENW8OUT = 2434 - AIURTEMPLEBRIDGENW8 = 2436 - AIURTEMPLEBRIDGENW10OUT = 2438 - AIURTEMPLEBRIDGENW10 = 2440 - AIURTEMPLEBRIDGENW12OUT = 2442 - AIURTEMPLEBRIDGENW12 = 2444 - SHAKURASLIGHTBRIDGENE8OUT = 2446 - SHAKURASLIGHTBRIDGENE8 = 2448 - SHAKURASLIGHTBRIDGENE10OUT = 2450 - SHAKURASLIGHTBRIDGENE10 = 2452 - SHAKURASLIGHTBRIDGENE12OUT = 2454 - SHAKURASLIGHTBRIDGENE12 = 2456 - SHAKURASLIGHTBRIDGENW8OUT = 2458 - SHAKURASLIGHTBRIDGENW8 = 2460 - SHAKURASLIGHTBRIDGENW10OUT = 2462 - SHAKURASLIGHTBRIDGENW10 = 2464 - SHAKURASLIGHTBRIDGENW12OUT = 2466 - SHAKURASLIGHTBRIDGENW12 = 2468 - VOIDMPIMMORTALREVIVEREBUILD = 2470 - VOIDMPIMMORTALREVIVEDEATH = 2472 - ARBITERMPSTASISFIELD = 2474 - ARBITERMPRECALL = 2476 - CORSAIRMPDISRUPTIONWEB = 2478 - MORPHTOGUARDIANMP = 2480 - MORPHTODEVOURERMP = 2482 - DEFILERMPCONSUME = 2484 - DEFILERMPDARKSWARM = 2486 - DEFILERMPPLAGUE = 2488 - DEFILERMPBURROW = 2490 - DEFILERMPUNBURROW = 2492 - QUEENMPENSNARE = 2494 - QUEENMPSPAWNBROODLINGS = 2496 - QUEENMPINFESTCOMMANDCENTER = 2498 - LIGHTNINGBOMB = 2500 - GRAPPLE = 2502 - ORACLESTASISTRAP = 2504 - ORACLESTASISTRAPBUILD = 2535 - ORACLESTASISTRAPACTIVATE = 2537 - SELFREPAIR = 2539 - AGGRESSIVEMUTATION = 2541 - PARASITICBOMB = 2543 - ADEPTPHASESHIFT = 2545 - PURIFICATIONNOVAMORPH = 2547 - PURIFICATIONNOVAMORPHBACK = 2549 - LURKERHOLDFIRE = 2551 - LURKERREMOVEHOLDFIRE = 2553 - LIBERATORMORPHTOAG = 2555 - LIBERATORMORPHTOAA = 2557 - LIBERATORAGTARGET = 2559 - LIBERATORAATARGET = 2561 - TIMESTOP = 2563 - AIURLIGHTBRIDGEABANDONEDNE8OUT = 2565 - AIURLIGHTBRIDGEABANDONEDNE8 = 2567 - AIURLIGHTBRIDGEABANDONEDNE10OUT = 2569 - AIURLIGHTBRIDGEABANDONEDNE10 = 2571 - AIURLIGHTBRIDGEABANDONEDNE12OUT = 2573 - AIURLIGHTBRIDGEABANDONEDNE12 = 2575 - AIURLIGHTBRIDGEABANDONEDNW8OUT = 2577 - AIURLIGHTBRIDGEABANDONEDNW8 = 2579 - AIURLIGHTBRIDGEABANDONEDNW10OUT = 2581 - AIURLIGHTBRIDGEABANDONEDNW10 = 2583 - AIURLIGHTBRIDGEABANDONEDNW12OUT = 2585 - AIURLIGHTBRIDGEABANDONEDNW12 = 2587 - KD8CHARGE = 2589 - PENETRATINGSHOT = 2591 - CLOAKINGDRONE = 2593 - ADEPTPHASESHIFTCANCEL = 2595 - ADEPTSHADEPHASESHIFTCANCEL = 2597 - SLAYNELEMENTALGRAB = 2599 - MORPHTOCOLLAPSIBLEPURIFIERTOWERDEBRIS = 2601 - PORTCITY_BRIDGE_UNITNE8OUT = 2603 - PORTCITY_BRIDGE_UNITNE8 = 2605 - PORTCITY_BRIDGE_UNITSE8OUT = 2607 - PORTCITY_BRIDGE_UNITSE8 = 2609 - PORTCITY_BRIDGE_UNITNW8OUT = 2611 - PORTCITY_BRIDGE_UNITNW8 = 2613 - PORTCITY_BRIDGE_UNITSW8OUT = 2615 - PORTCITY_BRIDGE_UNITSW8 = 2617 - PORTCITY_BRIDGE_UNITNE10OUT = 2619 - PORTCITY_BRIDGE_UNITNE10 = 2621 - PORTCITY_BRIDGE_UNITSE10OUT = 2623 - PORTCITY_BRIDGE_UNITSE10 = 2625 - PORTCITY_BRIDGE_UNITNW10OUT = 2627 - PORTCITY_BRIDGE_UNITNW10 = 2629 - PORTCITY_BRIDGE_UNITSW10OUT = 2631 - PORTCITY_BRIDGE_UNITSW10 = 2633 - PORTCITY_BRIDGE_UNITNE12OUT = 2635 - PORTCITY_BRIDGE_UNITNE12 = 2637 - PORTCITY_BRIDGE_UNITSE12OUT = 2639 - PORTCITY_BRIDGE_UNITSE12 = 2641 - PORTCITY_BRIDGE_UNITNW12OUT = 2643 - PORTCITY_BRIDGE_UNITNW12 = 2645 - PORTCITY_BRIDGE_UNITSW12OUT = 2647 - PORTCITY_BRIDGE_UNITSW12 = 2649 - PORTCITY_BRIDGE_UNITN8OUT = 2651 - PORTCITY_BRIDGE_UNITN8 = 2653 - PORTCITY_BRIDGE_UNITS8OUT = 2655 - PORTCITY_BRIDGE_UNITS8 = 2657 - PORTCITY_BRIDGE_UNITE8OUT = 2659 - PORTCITY_BRIDGE_UNITE8 = 2661 - PORTCITY_BRIDGE_UNITW8OUT = 2663 - PORTCITY_BRIDGE_UNITW8 = 2665 - PORTCITY_BRIDGE_UNITN10OUT = 2667 - PORTCITY_BRIDGE_UNITN10 = 2669 - PORTCITY_BRIDGE_UNITS10OUT = 2671 - PORTCITY_BRIDGE_UNITS10 = 2673 - PORTCITY_BRIDGE_UNITE10OUT = 2675 - PORTCITY_BRIDGE_UNITE10 = 2677 - PORTCITY_BRIDGE_UNITW10OUT = 2679 - PORTCITY_BRIDGE_UNITW10 = 2681 - PORTCITY_BRIDGE_UNITN12OUT = 2683 - PORTCITY_BRIDGE_UNITN12 = 2685 - PORTCITY_BRIDGE_UNITS12OUT = 2687 - PORTCITY_BRIDGE_UNITS12 = 2689 - PORTCITY_BRIDGE_UNITE12OUT = 2691 - PORTCITY_BRIDGE_UNITE12 = 2693 - PORTCITY_BRIDGE_UNITW12OUT = 2695 - PORTCITY_BRIDGE_UNITW12 = 2697 - TEMPESTDISRUPTIONBLAST = 2699 - DARKTEMPLARBLINK = 2701 - LAUNCHINTERCEPTORS = 2703 - SPAWNLOCUSTSTARGETED = 2705 - LOCUSTMPFLYINGSWOOPATTACK = 2707 - MORPHTOTRANSPORTOVERLORD = 2709 - BYPASSARMOR = 2711 - BYPASSARMORDRONECU = 2713 - CHANNELSNIPE = 2715 - PURIFYMORPHPYLON = 2717 - PURIFYMORPHPYLONBACK = 2719 - DARKSHRINERESEARCH = 2749 - HEAL = 2751 - LURKERASPECT = 2753 - BURROWLURKERDOWN = 2755 - BURROWLURKERUP = 2757 - D8CHARGE = 2759 - DEFENSIVEMATRIX = 2761 - MISSILEPODS = 2763 - LOKIMISSILEPODS = 2765 - HUTTRANSPORT = 2770 - MORPHTOTECHREACTOR = 2772 - LEVIATHANSPAWNBROODLORD = 2774 - SS_CARRIERBOSSATTACKLAUNCH = 2776 - SS_CARRIERSPAWNINTERCEPTOR = 2778 - SS_CARRIERBOSSATTACKTARGET = 2780 - SS_FIGHTERBOMB = 2782 - SS_LIGHTNINGPROJECTORTOGGLE = 2784 - SS_PHOENIXSHOOTING = 2786 - SS_POWERUPMORPHTOBOMB = 2788 - SS_BATTLECRUISERMISSILEATTACK = 2790 - SS_LEVIATHANSPAWNBOMBS = 2792 - SS_BATTLECRUISERHUNTERSEEKERATTACK = 2794 - SS_POWERUPMORPHTOHEALTH = 2796 - SS_LEVIATHANTENTACLEATTACKL1NODELAY = 2798 - SS_LEVIATHANTENTACLEATTACKL2NODELAY = 2800 - SS_LEVIATHANTENTACLEATTACKR1NODELAY = 2802 - SS_LEVIATHANTENTACLEATTACKR2NODELAY = 2804 - SS_SCIENCEVESSELTELEPORT = 2806 - SS_TERRATRONBEAMATTACK = 2808 - SS_TERRATRONSAWATTACK = 2810 - SS_WRAITHATTACK = 2812 - SS_SWARMGUARDIANATTACK = 2814 - SS_POWERUPMORPHTOSIDEMISSILES = 2816 - SS_POWERUPMORPHTOSTRONGERMISSILES = 2818 - SS_SCOUTATTACK = 2820 - SS_INTERCEPTORATTACK = 2822 - SS_CORRUPTORATTACK = 2824 - SS_LEVIATHANTENTACLEATTACKL2 = 2826 - SS_LEVIATHANTENTACLEATTACKR1 = 2828 - SS_LEVIATHANTENTACLEATTACKL1 = 2830 - SS_LEVIATHANTENTACLEATTACKR2 = 2832 - SS_SCIENCEVESSELATTACK = 2834 + MOTHERSHIPCOREENERGIZE = 2102 + LURKERASPECTMPFROMHYDRALISKBURROWED = 2104 + LURKERASPECTMP = 2106 + BURROWLURKERMPDOWN = 2108 + BURROWLURKERMPUP = 2110 + UPGRADETOLURKERDENMP = 2112 + HALLUCINATIONORACLE = 2114 + MEDIVACSPEEDBOOST = 2116 + EXTENDINGBRIDGENEWIDE8OUT = 2118 + EXTENDINGBRIDGENEWIDE8 = 2120 + EXTENDINGBRIDGENWWIDE8OUT = 2122 + EXTENDINGBRIDGENWWIDE8 = 2124 + EXTENDINGBRIDGENEWIDE10OUT = 2126 + EXTENDINGBRIDGENEWIDE10 = 2128 + EXTENDINGBRIDGENWWIDE10OUT = 2130 + EXTENDINGBRIDGENWWIDE10 = 2132 + EXTENDINGBRIDGENEWIDE12OUT = 2134 + EXTENDINGBRIDGENEWIDE12 = 2136 + EXTENDINGBRIDGENWWIDE12OUT = 2138 + EXTENDINGBRIDGENWWIDE12 = 2140 + INVULNERABILITYSHIELD = 2142 + CRITTERFLEE = 2144 + ORACLEREVELATION = 2146 + ORACLEREVELATIONMODE = 2148 + ORACLENORMALMODE = 2150 + MORPHTOCOLLAPSIBLEROCKTOWERDEBRISRAMPRIGHT = 2152 + MORPHTOCOLLAPSIBLEROCKTOWERDEBRISRAMPLEFT = 2154 + VOIDSIPHON = 2156 + ULTRALISKWEAPONCOOLDOWN = 2158 + MOTHERSHIPCOREPURIFYNEXUSCANCEL = 2160 + MOTHERSHIPCOREPURIFYNEXUS = 2162 + XELNAGA_CAVERNS_DOORE = 2164 + XELNAGA_CAVERNS_DOOREOPENED = 2166 + XELNAGA_CAVERNS_DOORN = 2168 + XELNAGA_CAVERNS_DOORNE = 2170 + XELNAGA_CAVERNS_DOORNEOPENED = 2172 + XELNAGA_CAVERNS_DOORNOPENED = 2174 + XELNAGA_CAVERNS_DOORNW = 2176 + XELNAGA_CAVERNS_DOORNWOPENED = 2178 + XELNAGA_CAVERNS_DOORS = 2180 + XELNAGA_CAVERNS_DOORSE = 2182 + XELNAGA_CAVERNS_DOORSEOPENED = 2184 + XELNAGA_CAVERNS_DOORSOPENED = 2186 + XELNAGA_CAVERNS_DOORSW = 2188 + XELNAGA_CAVERNS_DOORSWOPENED = 2190 + XELNAGA_CAVERNS_DOORW = 2192 + XELNAGA_CAVERNS_DOORWOPENED = 2194 + XELNAGA_CAVERNS_FLOATING_BRIDGENE8OUT = 2196 + XELNAGA_CAVERNS_FLOATING_BRIDGENE8 = 2198 + XELNAGA_CAVERNS_FLOATING_BRIDGENW8OUT = 2200 + XELNAGA_CAVERNS_FLOATING_BRIDGENW8 = 2202 + XELNAGA_CAVERNS_FLOATING_BRIDGENE10OUT = 2204 + XELNAGA_CAVERNS_FLOATING_BRIDGENE10 = 2206 + XELNAGA_CAVERNS_FLOATING_BRIDGENW10OUT = 2208 + XELNAGA_CAVERNS_FLOATING_BRIDGENW10 = 2210 + XELNAGA_CAVERNS_FLOATING_BRIDGENE12OUT = 2212 + XELNAGA_CAVERNS_FLOATING_BRIDGENE12 = 2214 + XELNAGA_CAVERNS_FLOATING_BRIDGENW12OUT = 2216 + XELNAGA_CAVERNS_FLOATING_BRIDGENW12 = 2218 + XELNAGA_CAVERNS_FLOATING_BRIDGEH8OUT = 2220 + XELNAGA_CAVERNS_FLOATING_BRIDGEH8 = 2222 + XELNAGA_CAVERNS_FLOATING_BRIDGEV8OUT = 2224 + XELNAGA_CAVERNS_FLOATING_BRIDGEV8 = 2226 + XELNAGA_CAVERNS_FLOATING_BRIDGEH10OUT = 2228 + XELNAGA_CAVERNS_FLOATING_BRIDGEH10 = 2230 + XELNAGA_CAVERNS_FLOATING_BRIDGEV10OUT = 2232 + XELNAGA_CAVERNS_FLOATING_BRIDGEV10 = 2234 + XELNAGA_CAVERNS_FLOATING_BRIDGEH12OUT = 2236 + XELNAGA_CAVERNS_FLOATING_BRIDGEH12 = 2238 + XELNAGA_CAVERNS_FLOATING_BRIDGEV12OUT = 2240 + XELNAGA_CAVERNS_FLOATING_BRIDGEV12 = 2242 + TEMPORALFIELD = 2244 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8OUT = 2246 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8 = 2248 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8OUT = 2250 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8 = 2252 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT10OUT = 2254 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT10 = 2256 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT10OUT = 2258 + SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT10 = 2260 + TARSONIS_DOORN = 2262 + TARSONIS_DOORNLOWERED = 2264 + TARSONIS_DOORNE = 2266 + TARSONIS_DOORNELOWERED = 2268 + TARSONIS_DOORE = 2270 + TARSONIS_DOORELOWERED = 2272 + TARSONIS_DOORNW = 2274 + TARSONIS_DOORNWLOWERED = 2276 + COMPOUNDMANSION_DOORN = 2278 + COMPOUNDMANSION_DOORNLOWERED = 2280 + COMPOUNDMANSION_DOORNE = 2282 + COMPOUNDMANSION_DOORNELOWERED = 2284 + COMPOUNDMANSION_DOORE = 2286 + COMPOUNDMANSION_DOORELOWERED = 2288 + COMPOUNDMANSION_DOORNW = 2290 + COMPOUNDMANSION_DOORNWLOWERED = 2292 + ARMORYRESEARCHSWARM = 2294 + CAUSTICSPRAY = 2324 + ORACLECLOAKINGFIELDTARGETED = 2326 + IMMORTALOVERLOAD = 2328 + MORPHTORAVAGER = 2330 + MORPHTOLURKER = 2332 + ORACLEPHASESHIFT = 2334 + RELEASEINTERCEPTORS = 2336 + RAVAGERCORROSIVEBILE = 2338 + BURROWRAVAGERDOWN = 2340 + BURROWRAVAGERUP = 2342 + PURIFICATIONNOVA = 2344 + PURIFICATIONNOVATARGETED = 2346 + IMPALE = 2348 + LOCKON = 2350 + LOCKONAIR = 2352 + LOCKONCANCEL = 2354 + CORRUPTIONBOMB = 2356 + HYPERJUMP = 2358 + OVERCHARGE = 2360 + THORAPMODE = 2362 + THORNORMALMODE = 2364 + LIGHTOFAIUR = 2366 + MOTHERSHIPMASSRECALL = 2368 + NYDUSWORMTRANSPORT = 2370 + ORACLEWEAPON = 2375 + PULSARBEAM = 2377 + PULSARCANNON = 2379 + VOIDSWARMHOSTSPAWNLOCUST = 2381 + LOCUSTMPFLYINGMORPHTOGROUND = 2383 + LOCUSTMPMORPHTOAIR = 2385 + LOCUSTMPFLYINGSWOOP = 2387 + HALLUCINATIONDISRUPTOR = 2389 + HALLUCINATIONADEPT = 2391 + VOIDRAYSWARMDAMAGEBOOST = 2393 + SEEKERDUMMYCHANNEL = 2395 + AIURLIGHTBRIDGENE8OUT = 2397 + AIURLIGHTBRIDGENE8 = 2399 + AIURLIGHTBRIDGENE10OUT = 2401 + AIURLIGHTBRIDGENE10 = 2403 + AIURLIGHTBRIDGENE12OUT = 2405 + AIURLIGHTBRIDGENE12 = 2407 + AIURLIGHTBRIDGENW8OUT = 2409 + AIURLIGHTBRIDGENW8 = 2411 + AIURLIGHTBRIDGENW10OUT = 2413 + AIURLIGHTBRIDGENW10 = 2415 + AIURLIGHTBRIDGENW12OUT = 2417 + AIURLIGHTBRIDGENW12 = 2419 + AIURTEMPLEBRIDGENE8OUT = 2421 + AIURTEMPLEBRIDGENE8 = 2423 + AIURTEMPLEBRIDGENE10OUT = 2425 + AIURTEMPLEBRIDGENE10 = 2427 + AIURTEMPLEBRIDGENE12OUT = 2429 + AIURTEMPLEBRIDGENE12 = 2431 + AIURTEMPLEBRIDGENW8OUT = 2433 + AIURTEMPLEBRIDGENW8 = 2435 + AIURTEMPLEBRIDGENW10OUT = 2437 + AIURTEMPLEBRIDGENW10 = 2439 + AIURTEMPLEBRIDGENW12OUT = 2441 + AIURTEMPLEBRIDGENW12 = 2443 + SHAKURASLIGHTBRIDGENE8OUT = 2445 + SHAKURASLIGHTBRIDGENE8 = 2447 + SHAKURASLIGHTBRIDGENE10OUT = 2449 + SHAKURASLIGHTBRIDGENE10 = 2451 + SHAKURASLIGHTBRIDGENE12OUT = 2453 + SHAKURASLIGHTBRIDGENE12 = 2455 + SHAKURASLIGHTBRIDGENW8OUT = 2457 + SHAKURASLIGHTBRIDGENW8 = 2459 + SHAKURASLIGHTBRIDGENW10OUT = 2461 + SHAKURASLIGHTBRIDGENW10 = 2463 + SHAKURASLIGHTBRIDGENW12OUT = 2465 + SHAKURASLIGHTBRIDGENW12 = 2467 + VOIDMPIMMORTALREVIVEREBUILD = 2469 + VOIDMPIMMORTALREVIVEDEATH = 2471 + ARBITERMPSTASISFIELD = 2473 + ARBITERMPRECALL = 2475 + CORSAIRMPDISRUPTIONWEB = 2477 + MORPHTOGUARDIANMP = 2479 + MORPHTODEVOURERMP = 2481 + DEFILERMPCONSUME = 2483 + DEFILERMPDARKSWARM = 2485 + DEFILERMPPLAGUE = 2487 + DEFILERMPBURROW = 2489 + DEFILERMPUNBURROW = 2491 + QUEENMPENSNARE = 2493 + QUEENMPSPAWNBROODLINGS = 2495 + QUEENMPINFESTCOMMANDCENTER = 2497 + LIGHTNINGBOMB = 2499 + GRAPPLE = 2501 + ORACLESTASISTRAP = 2503 + ORACLESTASISTRAPBUILD = 2505 + ORACLESTASISTRAPACTIVATE = 2536 + SELFREPAIR = 2538 + AGGRESSIVEMUTATION = 2540 + PARASITICBOMB = 2542 + ADEPTPHASESHIFT = 2544 + PURIFICATIONNOVAMORPH = 2546 + PURIFICATIONNOVAMORPHBACK = 2548 + LURKERHOLDFIRE = 2550 + LURKERREMOVEHOLDFIRE = 2552 + LIBERATORMORPHTOAG = 2554 + LIBERATORMORPHTOAA = 2556 + LIBERATORAGTARGET = 2558 + LIBERATORAATARGET = 2560 + TIMESTOP = 2562 + AIURLIGHTBRIDGEABANDONEDNE8OUT = 2564 + AIURLIGHTBRIDGEABANDONEDNE8 = 2566 + AIURLIGHTBRIDGEABANDONEDNE10OUT = 2568 + AIURLIGHTBRIDGEABANDONEDNE10 = 2570 + AIURLIGHTBRIDGEABANDONEDNE12OUT = 2572 + AIURLIGHTBRIDGEABANDONEDNE12 = 2574 + AIURLIGHTBRIDGEABANDONEDNW8OUT = 2576 + AIURLIGHTBRIDGEABANDONEDNW8 = 2578 + AIURLIGHTBRIDGEABANDONEDNW10OUT = 2580 + AIURLIGHTBRIDGEABANDONEDNW10 = 2582 + AIURLIGHTBRIDGEABANDONEDNW12OUT = 2584 + AIURLIGHTBRIDGEABANDONEDNW12 = 2586 + KD8CHARGE = 2588 + PENETRATINGSHOT = 2590 + CLOAKINGDRONE = 2592 + ADEPTPHASESHIFTCANCEL = 2594 + ADEPTSHADEPHASESHIFTCANCEL = 2596 + SLAYNELEMENTALGRAB = 2598 + MORPHTOCOLLAPSIBLEPURIFIERTOWERDEBRIS = 2600 + PORTCITY_BRIDGE_UNITNE8OUT = 2602 + PORTCITY_BRIDGE_UNITNE8 = 2604 + PORTCITY_BRIDGE_UNITSE8OUT = 2606 + PORTCITY_BRIDGE_UNITSE8 = 2608 + PORTCITY_BRIDGE_UNITNW8OUT = 2610 + PORTCITY_BRIDGE_UNITNW8 = 2612 + PORTCITY_BRIDGE_UNITSW8OUT = 2614 + PORTCITY_BRIDGE_UNITSW8 = 2616 + PORTCITY_BRIDGE_UNITNE10OUT = 2618 + PORTCITY_BRIDGE_UNITNE10 = 2620 + PORTCITY_BRIDGE_UNITSE10OUT = 2622 + PORTCITY_BRIDGE_UNITSE10 = 2624 + PORTCITY_BRIDGE_UNITNW10OUT = 2626 + PORTCITY_BRIDGE_UNITNW10 = 2628 + PORTCITY_BRIDGE_UNITSW10OUT = 2630 + PORTCITY_BRIDGE_UNITSW10 = 2632 + PORTCITY_BRIDGE_UNITNE12OUT = 2634 + PORTCITY_BRIDGE_UNITNE12 = 2636 + PORTCITY_BRIDGE_UNITSE12OUT = 2638 + PORTCITY_BRIDGE_UNITSE12 = 2640 + PORTCITY_BRIDGE_UNITNW12OUT = 2642 + PORTCITY_BRIDGE_UNITNW12 = 2644 + PORTCITY_BRIDGE_UNITSW12OUT = 2646 + PORTCITY_BRIDGE_UNITSW12 = 2648 + PORTCITY_BRIDGE_UNITN8OUT = 2650 + PORTCITY_BRIDGE_UNITN8 = 2652 + PORTCITY_BRIDGE_UNITS8OUT = 2654 + PORTCITY_BRIDGE_UNITS8 = 2656 + PORTCITY_BRIDGE_UNITE8OUT = 2658 + PORTCITY_BRIDGE_UNITE8 = 2660 + PORTCITY_BRIDGE_UNITW8OUT = 2662 + PORTCITY_BRIDGE_UNITW8 = 2664 + PORTCITY_BRIDGE_UNITN10OUT = 2666 + PORTCITY_BRIDGE_UNITN10 = 2668 + PORTCITY_BRIDGE_UNITS10OUT = 2670 + PORTCITY_BRIDGE_UNITS10 = 2672 + PORTCITY_BRIDGE_UNITE10OUT = 2674 + PORTCITY_BRIDGE_UNITE10 = 2676 + PORTCITY_BRIDGE_UNITW10OUT = 2678 + PORTCITY_BRIDGE_UNITW10 = 2680 + PORTCITY_BRIDGE_UNITN12OUT = 2682 + PORTCITY_BRIDGE_UNITN12 = 2684 + PORTCITY_BRIDGE_UNITS12OUT = 2686 + PORTCITY_BRIDGE_UNITS12 = 2688 + PORTCITY_BRIDGE_UNITE12OUT = 2690 + PORTCITY_BRIDGE_UNITE12 = 2692 + PORTCITY_BRIDGE_UNITW12OUT = 2694 + PORTCITY_BRIDGE_UNITW12 = 2696 + TEMPESTDISRUPTIONBLAST = 2698 + DARKTEMPLARBLINK = 2700 + LAUNCHINTERCEPTORS = 2702 + SPAWNLOCUSTSTARGETED = 2704 + LOCUSTMPFLYINGSWOOPATTACK = 2706 + MORPHTOTRANSPORTOVERLORD = 2708 + BYPASSARMOR = 2710 + BYPASSARMORDRONECU = 2712 + CHANNELSNIPE = 2714 + PURIFYMORPHPYLON = 2716 + PURIFYMORPHPYLONBACK = 2718 + DARKSHRINERESEARCH = 2720 + HEAL = 2750 + LURKERASPECT = 2752 + BURROWLURKERDOWN = 2754 + BURROWLURKERUP = 2756 + D8CHARGE = 2758 + DEFENSIVEMATRIX = 2760 + MISSILEPODS = 2762 + LOKIMISSILEPODS = 2764 + HUTTRANSPORT = 2766 + MORPHTOTECHREACTOR = 2771 + LEVIATHANSPAWNBROODLORD = 2773 + SS_CARRIERBOSSATTACKLAUNCH = 2775 + SS_CARRIERSPAWNINTERCEPTOR = 2777 + SS_CARRIERBOSSATTACKTARGET = 2779 + SS_FIGHTERBOMB = 2781 + SS_LIGHTNINGPROJECTORTOGGLE = 2783 + SS_PHOENIXSHOOTING = 2785 + SS_POWERUPMORPHTOBOMB = 2787 + SS_BATTLECRUISERMISSILEATTACK = 2789 + SS_LEVIATHANSPAWNBOMBS = 2791 + SS_BATTLECRUISERHUNTERSEEKERATTACK = 2793 + SS_POWERUPMORPHTOHEALTH = 2795 + SS_LEVIATHANTENTACLEATTACKL1NODELAY = 2797 + SS_LEVIATHANTENTACLEATTACKL2NODELAY = 2799 + SS_LEVIATHANTENTACLEATTACKR1NODELAY = 2801 + SS_LEVIATHANTENTACLEATTACKR2NODELAY = 2803 + SS_SCIENCEVESSELTELEPORT = 2805 + SS_TERRATRONBEAMATTACK = 2807 + SS_TERRATRONSAWATTACK = 2809 + SS_WRAITHATTACK = 2811 + SS_SWARMGUARDIANATTACK = 2813 + SS_POWERUPMORPHTOSIDEMISSILES = 2815 + SS_POWERUPMORPHTOSTRONGERMISSILES = 2817 + SS_SCOUTATTACK = 2819 + SS_INTERCEPTORATTACK = 2821 + SS_CORRUPTORATTACK = 2823 + SS_LEVIATHANTENTACLEATTACKL2 = 2825 + SS_LEVIATHANTENTACLEATTACKR1 = 2827 + SS_LEVIATHANTENTACLEATTACKL1 = 2829 + SS_LEVIATHANTENTACLEATTACKR2 = 2831 + SS_SCIENCEVESSELATTACK = 2833 HEALREDIRECT = 2835 - LURKERASPECTFROMHYDRALISKBURROWED = 2837 - UPGRADETOLURKERDEN = 2839 - ADVANCEDCONSTRUCTION = 2841 - BUILDINPROGRESSNONCANCELLABLE = 2843 - INFESTEDVENTSPAWNCORRUPTOR = 2845 - INFESTEDVENTSPAWNBROODLORD = 2847 - IRRADIATE = 2849 - INFESTEDVENTSPAWNMUTALISK = 2851 - MAKEVULTURESPIDERMINES = 2871 - MEDIVACDOUBLEBEAMHEAL = 2873 - MINDCONTROL = 2875 - OBLITERATE = 2877 - VOODOOSHIELD = 2879 - RELEASEMINION = 2881 - ULTRASONICPULSE = 2883 - ARCHIVESEAL = 2885 - ARTANISVORTEX = 2887 - ARTANISWORMHOLETRANSIT = 2889 - BUNKERATTACK = 2892 - BUNKERSTOP = 2898 - CANCELTERRAZINEHARVEST = 2900 - LEVIATHANSPAWNMUTALISK = 2902 - PARKCOLONISTVEHICLE = 2904 - STARTCOLONISTVEHICLE = 2906 - CONSUMPTION = 2908 - CONSUMEDNA = 2910 - EGGPOP = 2912 - EXPERIMENTALPLASMAGUN = 2914 - GATHERSPECIALOBJECT = 2916 - KERRIGANSEARCH = 2918 - LOKIUNDOCK = 2920 - MINDBLAST = 2922 - MORPHTOINFESTEDCIVILIAN = 2924 - QUEENSHOCKWAVE = 2926 - TAURENOUTHOUSELIFTOFF = 2928 - TAURENOUTHOUSETRANSPORT = 2933 - TYCHUS03OMEGASTORM = 2935 - RAYNORSNIPE = 2937 - BONESHEAL = 2939 - BONESTOSSGRENADE = 2941 - HERCULESTRANSPORT = 2946 - SPECOPSDROPSHIPTRANSPORT = 2951 - DUSKWINGBANSHEECLOAKINGFIELD = 2953 - HYPERIONYAMATOSPECIAL = 2955 - INFESTABLEHUTTRANSPORT = 2960 - DUTCHPLACETURRET = 2962 - BURROWINFESTEDCIVILIANDOWN = 2964 - BURROWINFESTEDCIVILIANUP = 2966 - SELENDISHANGAR = 2986 - FORCEFIELDBEAM = 2988 - SIEGEBREAKERSIEGE = 2990 - SIEGEBREAKERUNSIEGE = 2992 - SOULCHANNEL = 2994 - PERDITIONTURRETBURROW = 2996 - PERDITIONTURRETUNBURROW = 2998 - SENTRYGUNBURROW = 3000 - SENTRYGUNUNBURROW = 3002 - SPIDERMINEUNBURROWRANGEDUMMY = 3004 - GRAVITONPRISON = 3006 - IMPLOSION = 3008 - OMEGASTORM = 3010 - PSIONICSHOCKWAVE = 3012 - HYBRIDFAOESTUN = 3014 - SUMMONMERCENARIES = 3044 - SUMMONMERCENARIESPH = 3074 - ENERGYNOVA = 3076 - THEMOROSDEVICE = 3078 - TOSSGRENADE = 3080 - VOIDSEEKERTRANSPORT = 3085 - TERRANBUILDDROP = 3116 - ODINNUCLEARSTRIKE = 3118 - ODINWRECKAGE = 3120 - RESEARCHLABTRANSPORT = 3125 - COLONYSHIPTRANSPORT = 3130 - COLONYINFESTATION = 3132 - DOMINATION = 3134 - KARASSPLASMASURGE = 3136 - KARASSPSISTORM = 3138 - HYBRIDBLINK = 3140 - HYBRIDCPLASMABLAST = 3142 - HEROARMNUKE = 3162 - HERONUCLEARSTRIKE = 3164 - ODINBARRAGE = 3166 - PURIFIERTOGGLEPOWER = 3168 - PHASEMINEBLAST = 3170 - VOIDSEEKERPHASEMINEBLAST = 3172 - TRANSPORTTRUCKTRANSPORT = 3177 - VAL03QUEENOFBLADESBURROW = 3179 - VAL03QUEENOFBLADESDEEPTUNNEL = 3181 - VAL03QUEENOFBLADESUNBURROW = 3183 - VULTURESPIDERMINEBURROW = 3185 - VULTURESPIDERMINEUNBURROW = 3187 - LOKIYAMATO = 3189 - DUKESREVENGEYAMATO = 3191 - ZERATULBLINK = 3193 - ROGUEGHOSTCLOAK = 3195 - VULTURESPIDERMINES = 3197 - VULTUREQUEUE3 = 3199 - SUPERWARPGATETRAIN = 3219 - BURROWOMEGALISKDOWN = 3221 - BURROWOMEGALISKUP = 3223 - BURROWINFESTEDABOMINATIONDOWN = 3225 - BURROWINFESTEDABOMINATIONUP = 3227 - BURROWHUNTERKILLERDOWN = 3229 - BURROWHUNTERKILLERUP = 3231 - NOVASNIPE = 3233 - VORTEXPURIFIER = 3235 - TALDARIMVORTEX = 3237 - PURIFIERPLANETCRACKER = 3239 - BURROWINFESTEDTERRANCAMPAIGNDOWN = 3241 - BURROWINFESTEDTERRANCAMPAIGNUP = 3243 - INFESTEDMONSTERTRAIN = 3273 - BIODOMETRANSPORT = 3278 - CHECKSTATION = 3280 - CHECKSTATIONDIAGONALBLUR = 3282 - CHECKSTATIONDIAGONALULBR = 3284 - CHECKSTATIONVERTICAL = 3286 - CHECKSTATIONOPENED = 3288 - CHECKSTATIONDIAGONALBLUROPENED = 3290 - CHECKSTATIONDIAGONALULBROPENED = 3292 - CHECKSTATIONVERTICALOPENED = 3294 - ATTACKALLOWSINVULNERABLE = 3297 - ZERATULSTUN = 3299 - WRAITHCLOAK = 3301 - TECHREACTORMORPH = 3303 - BARRACKSTECHREACTORMORPH = 3305 - FACTORYTECHREACTORMORPH = 3307 - STARPORTTECHREACTORMORPH = 3309 - SS_FIGHTERSHOOTING = 3311 - RAYNORC4 = 3313 - DUKESREVENGEDEFENSIVEMATRIX = 3315 - DUKESREVENGEMISSILEPODS = 3317 - THORWRECKAGE = 3319 - _330MMBARRAGECANNONS = 3321 - THORREBORN = 3323 - SPECTRENUKE = 3325 - SPECTRENUKESILOARMMAGAZINE = 3345 - COLONISTSHIPLIFTOFF = 3347 - COLONISTSHIPLAND = 3349 - BIODOMECOMMANDLIFTOFF = 3351 - BIODOMECOMMANDLAND = 3353 - HERCULESLIFTOFF = 3355 - HERCULESLAND = 3357 - LIGHTBRIDGEOFF = 3359 - LIGHTBRIDGEON = 3361 - LIBRARYDOWN = 3363 - LIBRARYUP = 3365 - TEMPLEDOORDOWN = 3367 - TEMPLEDOORUP = 3369 - TEMPLEDOORDOWNURDL = 3371 - TEMPLEDOORUPURDL = 3373 - PSYTROUSOXIDE = 3375 - VOIDSEEKERDOCK = 3377 - BIOPLASMIDDISCHARGE = 3379 - WRECKINGCREWASSAULTMODE = 3381 - WRECKINGCREWFIGHTERMODE = 3383 - BIOSTASIS = 3385 - COLONISTTRANSPORTTRANSPORT = 3390 - DROPTOSUPPLYDEPOT = 3392 - REFINERYTOAUTOMATEDREFINERY = 3394 - HELIOSCRASHMORPH = 3396 - NANOREPAIR = 3398 - PICKUP = 3400 - PICKUPARCADE = 3402 - PICKUPGAS100 = 3404 - PICKUPMINERALS100 = 3406 - PICKUPHEALTH25 = 3408 - PICKUPHEALTH50 = 3410 - PICKUPHEALTH100 = 3412 - PICKUPHEALTHFULL = 3414 - PICKUPENERGY25 = 3416 - PICKUPENERGY50 = 3418 - PICKUPENERGY100 = 3420 - PICKUPENERGYFULL = 3422 - TAURENSTIMPACK = 3424 - TESTINVENTORY = 3433 - TESTPAWN = 3453 - TESTREVIVE = 3483 - TESTSELL = 3513 + LURKERASPECTFROMHYDRALISKBURROWED = 2836 + UPGRADETOLURKERDEN = 2838 + ADVANCEDCONSTRUCTION = 2840 + BUILDINPROGRESSNONCANCELLABLE = 2842 + INFESTEDVENTSPAWNCORRUPTOR = 2844 + INFESTEDVENTSPAWNBROODLORD = 2846 + IRRADIATE = 2848 + INFESTEDVENTSPAWNMUTALISK = 2850 + MAKEVULTURESPIDERMINES = 2852 + MEDIVACDOUBLEBEAMHEAL = 2872 + MINDCONTROL = 2874 + OBLITERATE = 2876 + VOODOOSHIELD = 2878 + RELEASEMINION = 2880 + ULTRASONICPULSE = 2882 + ARCHIVESEAL = 2884 + ARTANISVORTEX = 2886 + ARTANISWORMHOLETRANSIT = 2888 + BUNKERATTACK = 2890 + BUNKERSTOP = 2893 + CANCELTERRAZINEHARVEST = 2899 + LEVIATHANSPAWNMUTALISK = 2901 + PARKCOLONISTVEHICLE = 2903 + STARTCOLONISTVEHICLE = 2905 + CONSUMPTION = 2907 + CONSUMEDNA = 2909 + EGGPOP = 2911 + EXPERIMENTALPLASMAGUN = 2913 + GATHERSPECIALOBJECT = 2915 + KERRIGANSEARCH = 2917 + LOKIUNDOCK = 2919 + MINDBLAST = 2921 + MORPHTOINFESTEDCIVILIAN = 2923 + QUEENSHOCKWAVE = 2925 + TAURENOUTHOUSELIFTOFF = 2927 + TAURENOUTHOUSETRANSPORT = 2929 + TYCHUS03OMEGASTORM = 2934 + RAYNORSNIPE = 2936 + BONESHEAL = 2938 + BONESTOSSGRENADE = 2940 + HERCULESTRANSPORT = 2942 + SPECOPSDROPSHIPTRANSPORT = 2947 + DUSKWINGBANSHEECLOAKINGFIELD = 2952 + HYPERIONYAMATOSPECIAL = 2954 + INFESTABLEHUTTRANSPORT = 2956 + DUTCHPLACETURRET = 2961 + BURROWINFESTEDCIVILIANDOWN = 2963 + BURROWINFESTEDCIVILIANUP = 2965 + SELENDISHANGAR = 2967 + FORCEFIELDBEAM = 2987 + SIEGEBREAKERSIEGE = 2989 + SIEGEBREAKERUNSIEGE = 2991 + SOULCHANNEL = 2993 + PERDITIONTURRETBURROW = 2995 + PERDITIONTURRETUNBURROW = 2997 + SENTRYGUNBURROW = 2999 + SENTRYGUNUNBURROW = 3001 + SPIDERMINEUNBURROWRANGEDUMMY = 3003 + GRAVITONPRISON = 3005 + IMPLOSION = 3007 + OMEGASTORM = 3009 + PSIONICSHOCKWAVE = 3011 + HYBRIDFAOESTUN = 3013 + SUMMONMERCENARIES = 3015 + SUMMONMERCENARIESPH = 3045 + ENERGYNOVA = 3075 + THEMOROSDEVICE = 3077 + TOSSGRENADE = 3079 + VOIDSEEKERTRANSPORT = 3081 + TERRANBUILDDROP = 3086 + ODINNUCLEARSTRIKE = 3117 + ODINWRECKAGE = 3119 + RESEARCHLABTRANSPORT = 3121 + COLONYSHIPTRANSPORT = 3126 + COLONYINFESTATION = 3131 + DOMINATION = 3133 + KARASSPLASMASURGE = 3135 + KARASSPSISTORM = 3137 + HYBRIDBLINK = 3139 + HYBRIDCPLASMABLAST = 3141 + HEROARMNUKE = 3143 + HERONUCLEARSTRIKE = 3163 + ODINBARRAGE = 3165 + PURIFIERTOGGLEPOWER = 3167 + PHASEMINEBLAST = 3169 + VOIDSEEKERPHASEMINEBLAST = 3171 + TRANSPORTTRUCKTRANSPORT = 3173 + VAL03QUEENOFBLADESBURROW = 3178 + VAL03QUEENOFBLADESDEEPTUNNEL = 3180 + VAL03QUEENOFBLADESUNBURROW = 3182 + VULTURESPIDERMINEBURROW = 3184 + VULTURESPIDERMINEUNBURROW = 3186 + LOKIYAMATO = 3188 + DUKESREVENGEYAMATO = 3190 + ZERATULBLINK = 3192 + ROGUEGHOSTCLOAK = 3194 + VULTURESPIDERMINES = 3196 + VULTUREQUEUE3 = 3198 + SUPERWARPGATETRAIN = 3200 + BURROWOMEGALISKDOWN = 3220 + BURROWOMEGALISKUP = 3222 + BURROWINFESTEDABOMINATIONDOWN = 3224 + BURROWINFESTEDABOMINATIONUP = 3226 + BURROWHUNTERKILLERDOWN = 3228 + BURROWHUNTERKILLERUP = 3230 + NOVASNIPE = 3232 + VORTEXPURIFIER = 3234 + TALDARIMVORTEX = 3236 + PURIFIERPLANETCRACKER = 3238 + BURROWINFESTEDTERRANCAMPAIGNDOWN = 3240 + BURROWINFESTEDTERRANCAMPAIGNUP = 3242 + INFESTEDMONSTERTRAIN = 3244 + BIODOMETRANSPORT = 3274 + CHECKSTATION = 3279 + CHECKSTATIONDIAGONALBLUR = 3281 + CHECKSTATIONDIAGONALULBR = 3283 + CHECKSTATIONVERTICAL = 3285 + CHECKSTATIONOPENED = 3287 + CHECKSTATIONDIAGONALBLUROPENED = 3289 + CHECKSTATIONDIAGONALULBROPENED = 3291 + CHECKSTATIONVERTICALOPENED = 3293 + ATTACKALLOWSINVULNERABLE = 3295 + ZERATULSTUN = 3298 + WRAITHCLOAK = 3300 + TECHREACTORMORPH = 3302 + BARRACKSTECHREACTORMORPH = 3304 + FACTORYTECHREACTORMORPH = 3306 + STARPORTTECHREACTORMORPH = 3308 + SS_FIGHTERSHOOTING = 3310 + RAYNORC4 = 3312 + DUKESREVENGEDEFENSIVEMATRIX = 3314 + DUKESREVENGEMISSILEPODS = 3316 + THORWRECKAGE = 3318 + _330MMBARRAGECANNONS = 3320 + THORREBORN = 3322 + SPECTRENUKE = 3324 + SPECTRENUKESILOARMMAGAZINE = 3326 + COLONISTSHIPLIFTOFF = 3346 + COLONISTSHIPLAND = 3348 + BIODOMECOMMANDLIFTOFF = 3350 + BIODOMECOMMANDLAND = 3352 + HERCULESLIFTOFF = 3354 + HERCULESLAND = 3356 + LIGHTBRIDGEOFF = 3358 + LIGHTBRIDGEON = 3360 + LIBRARYDOWN = 3362 + LIBRARYUP = 3364 + TEMPLEDOORDOWN = 3366 + TEMPLEDOORUP = 3368 + TEMPLEDOORDOWNURDL = 3370 + TEMPLEDOORUPURDL = 3372 + PSYTROUSOXIDE = 3374 + VOIDSEEKERDOCK = 3376 + BIOPLASMIDDISCHARGE = 3378 + WRECKINGCREWASSAULTMODE = 3380 + WRECKINGCREWFIGHTERMODE = 3382 + BIOSTASIS = 3384 + COLONISTTRANSPORTTRANSPORT = 3386 + DROPTOSUPPLYDEPOT = 3391 + REFINERYTOAUTOMATEDREFINERY = 3393 + HELIOSCRASHMORPH = 3395 + NANOREPAIR = 3397 + PICKUP = 3399 + PICKUPARCADE = 3401 + PICKUPGAS100 = 3403 + PICKUPMINERALS100 = 3405 + PICKUPHEALTH25 = 3407 + PICKUPHEALTH50 = 3409 + PICKUPHEALTH100 = 3411 + PICKUPHEALTHFULL = 3413 + PICKUPENERGY25 = 3415 + PICKUPENERGY50 = 3417 + PICKUPENERGY100 = 3419 + PICKUPENERGYFULL = 3421 + TAURENSTIMPACK = 3423 + TESTINVENTORY = 3425 + TESTPAWN = 3434 + TESTREVIVE = 3454 + TESTSELL = 3484 TESTINTERACT = 3514 - CLIFFDOOROPEN0 = 3516 - CLIFFDOORCLOSE0 = 3518 - CLIFFDOOROPEN1 = 3520 - CLIFFDOORCLOSE1 = 3522 - DESTRUCTIBLEGATEDIAGONALBLURLOWERED = 3524 - DESTRUCTIBLEGATEDIAGONALULBRLOWERED = 3526 - DESTRUCTIBLEGATESTRAIGHTHORIZONTALBFLOWERED = 3528 - DESTRUCTIBLEGATESTRAIGHTHORIZONTALLOWERED = 3530 - DESTRUCTIBLEGATESTRAIGHTVERTICALLFLOWERED = 3532 - DESTRUCTIBLEGATESTRAIGHTVERTICALLOWERED = 3534 - DESTRUCTIBLEGATEDIAGONALBLUR = 3536 - DESTRUCTIBLEGATEDIAGONALULBR = 3538 - DESTRUCTIBLEGATESTRAIGHTHORIZONTALBF = 3540 - DESTRUCTIBLEGATESTRAIGHTHORIZONTAL = 3542 - DESTRUCTIBLEGATESTRAIGHTVERTICALLF = 3544 - DESTRUCTIBLEGATESTRAIGHTVERTICAL = 3546 - TESTLEARN = 3566 - TESTLEVELEDSPELL = 3568 - METALGATEDIAGONALBLURLOWERED = 3570 - METALGATEDIAGONALULBRLOWERED = 3572 - METALGATESTRAIGHTHORIZONTALBFLOWERED = 3574 - METALGATESTRAIGHTHORIZONTALLOWERED = 3576 - METALGATESTRAIGHTVERTICALLFLOWERED = 3578 - METALGATESTRAIGHTVERTICALLOWERED = 3580 - METALGATEDIAGONALBLUR = 3582 - METALGATEDIAGONALULBR = 3584 - METALGATESTRAIGHTHORIZONTALBF = 3586 - METALGATESTRAIGHTHORIZONTAL = 3588 - METALGATESTRAIGHTVERTICALLF = 3590 - METALGATESTRAIGHTVERTICAL = 3592 - SECURITYGATEDIAGONALBLURLOWERED = 3594 - SECURITYGATEDIAGONALULBRLOWERED = 3596 - SECURITYGATESTRAIGHTHORIZONTALBFLOWERED = 3598 - SECURITYGATESTRAIGHTHORIZONTALLOWERED = 3600 - SECURITYGATESTRAIGHTVERTICALLFLOWERED = 3602 - SECURITYGATESTRAIGHTVERTICALLOWERED = 3604 - SECURITYGATEDIAGONALBLUR = 3606 - SECURITYGATEDIAGONALULBR = 3608 - SECURITYGATESTRAIGHTHORIZONTALBF = 3610 - SECURITYGATESTRAIGHTHORIZONTAL = 3612 - SECURITYGATESTRAIGHTVERTICALLF = 3614 - SECURITYGATESTRAIGHTVERTICAL = 3616 - CHANGESHRINETERRAN = 3618 - CHANGESHRINEPROTOSS = 3620 - SPECTREHOLDFIRE = 3622 - SPECTREWEAPONSFREE = 3624 - GWALEARN = 3644 - REAPERPLACEMENTMORPH = 3646 - LIGHTBRIDGEOFFTOPRIGHT = 3648 - LIGHTBRIDGEONTOPRIGHT = 3650 - TESTHEROGRAB = 3652 - TESTHEROTHROW = 3654 - TESTHERODEBUGMISSILEABILITY = 3656 - TESTHERODEBUGTRACKINGABILITY = 3658 + CLIFFDOOROPEN0 = 3515 + CLIFFDOORCLOSE0 = 3517 + CLIFFDOOROPEN1 = 3519 + CLIFFDOORCLOSE1 = 3521 + DESTRUCTIBLEGATEDIAGONALBLURLOWERED = 3523 + DESTRUCTIBLEGATEDIAGONALULBRLOWERED = 3525 + DESTRUCTIBLEGATESTRAIGHTHORIZONTALBFLOWERED = 3527 + DESTRUCTIBLEGATESTRAIGHTHORIZONTALLOWERED = 3529 + DESTRUCTIBLEGATESTRAIGHTVERTICALLFLOWERED = 3531 + DESTRUCTIBLEGATESTRAIGHTVERTICALLOWERED = 3533 + DESTRUCTIBLEGATEDIAGONALBLUR = 3535 + DESTRUCTIBLEGATEDIAGONALULBR = 3537 + DESTRUCTIBLEGATESTRAIGHTHORIZONTALBF = 3539 + DESTRUCTIBLEGATESTRAIGHTHORIZONTAL = 3541 + DESTRUCTIBLEGATESTRAIGHTVERTICALLF = 3543 + DESTRUCTIBLEGATESTRAIGHTVERTICAL = 3545 + TESTLEARN = 3547 + TESTLEVELEDSPELL = 3567 + METALGATEDIAGONALBLURLOWERED = 3569 + METALGATEDIAGONALULBRLOWERED = 3571 + METALGATESTRAIGHTHORIZONTALBFLOWERED = 3573 + METALGATESTRAIGHTHORIZONTALLOWERED = 3575 + METALGATESTRAIGHTVERTICALLFLOWERED = 3577 + METALGATESTRAIGHTVERTICALLOWERED = 3579 + METALGATEDIAGONALBLUR = 3581 + METALGATEDIAGONALULBR = 3583 + METALGATESTRAIGHTHORIZONTALBF = 3585 + METALGATESTRAIGHTHORIZONTAL = 3587 + METALGATESTRAIGHTVERTICALLF = 3589 + METALGATESTRAIGHTVERTICAL = 3591 + SECURITYGATEDIAGONALBLURLOWERED = 3593 + SECURITYGATEDIAGONALULBRLOWERED = 3595 + SECURITYGATESTRAIGHTHORIZONTALBFLOWERED = 3597 + SECURITYGATESTRAIGHTHORIZONTALLOWERED = 3599 + SECURITYGATESTRAIGHTVERTICALLFLOWERED = 3601 + SECURITYGATESTRAIGHTVERTICALLOWERED = 3603 + SECURITYGATEDIAGONALBLUR = 3605 + SECURITYGATEDIAGONALULBR = 3607 + SECURITYGATESTRAIGHTHORIZONTALBF = 3609 + SECURITYGATESTRAIGHTHORIZONTAL = 3611 + SECURITYGATESTRAIGHTVERTICALLF = 3613 + SECURITYGATESTRAIGHTVERTICAL = 3615 + CHANGESHRINETERRAN = 3617 + CHANGESHRINEPROTOSS = 3619 + SPECTREHOLDFIRE = 3621 + SPECTREWEAPONSFREE = 3623 + GWALEARN = 3625 + REAPERPLACEMENTMORPH = 3645 + LIGHTBRIDGEOFFTOPRIGHT = 3647 + LIGHTBRIDGEONTOPRIGHT = 3649 + TESTHEROGRAB = 3651 + TESTHEROTHROW = 3653 + TESTHERODEBUGMISSILEABILITY = 3655 + TESTHERODEBUGTRACKINGABILITY = 3657 CANCEL = 3659 HALT = 3660 BURROWDOWN = 3661 @@ -919,24 +918,24 @@ class AbilityId(enum.Enum): RESEARCHZERGGROUNDARMOR = 3704 RESEARCHZERGMELEEWEAPONS = 3705 RESEARCHZERGMISSILEWEAPONS = 3706 - VOIDRAYSWARMDAMAGEBOOSTCANCEL = 3708 - LURKERDENRESEARCH = 3738 - OBSERVERSIEGEMORPHTOOBSERVER = 3740 - OBSERVERMORPHTOOBSERVERSIEGE = 3742 - OVERSEERMORPHTOOVERSEERSIEGEMODE = 3744 - OVERSEERSIEGEMODEMORPHTOOVERSEER = 3746 - RAVENSCRAMBLERMISSILE = 3748 - RAVENREPAIRDRONE = 3750 - RAVENREPAIRDRONEHEAL = 3752 - RAVENSHREDDERMISSILE = 3754 - CHRONOBOOSTENERGYCOST = 3756 - NEXUSMASSRECALL = 3758 - NEXUSSHIELDRECHARGE = 3760 - NEXUSSHIELDRECHARGEONPYLON = 3762 - INFESTORENSNARE = 3764 - SHIELDBATTERYRECHARGECHANNELED = 3766 - NEXUSSHIELDOVERCHARGE = 3768 - NEXUSSHIELDOVERCHARGEOFF = 3770 + VOIDRAYSWARMDAMAGEBOOSTCANCEL = 3707 + LURKERDENRESEARCH = 3709 + OBSERVERSIEGEMORPHTOOBSERVER = 3739 + OBSERVERMORPHTOOBSERVERSIEGE = 3741 + OVERSEERMORPHTOOVERSEERSIEGEMODE = 3743 + OVERSEERSIEGEMODEMORPHTOOVERSEER = 3745 + RAVENSCRAMBLERMISSILE = 3747 + RAVENREPAIRDRONE = 3749 + RAVENREPAIRDRONEHEAL = 3751 + RAVENSHREDDERMISSILE = 3753 + CHRONOBOOSTENERGYCOST = 3755 + NEXUSMASSRECALL = 3757 + NEXUSSHIELDRECHARGE = 3759 + NEXUSSHIELDRECHARGEONPYLON = 3761 + INFESTORENSNARE = 3763 + SHIELDBATTERYRECHARGECHANNELED = 3765 + NEXUSSHIELDOVERCHARGE = 3767 + NEXUSSHIELDOVERCHARGEOFF = 3769 for item in AbilityId: globals()[item.name] = item From 8be993cc3cc6a08d738fce149e70fd62f6158703 Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Tue, 30 Jan 2018 19:38:27 +0800 Subject: [PATCH 40/56] Add support for getting the available abilities of a unit This includes checks to cooldown, energy, and research --- examples/threebase_voidray.py | 14 ++++++++++++++ examples/zerg_rush.py | 3 ++- sc2/bot_ai.py | 4 ++++ sc2/client.py | 13 +++++++++++++ sc2/ids/ability_id.py | 2 ++ sc2/ids/buff_id.py | 1 + sc2/unit.py | 6 ++++++ 7 files changed, 42 insertions(+), 1 deletion(-) diff --git a/examples/threebase_voidray.py b/examples/threebase_voidray.py index b6612aaa5..cc2497ba0 100644 --- a/examples/threebase_voidray.py +++ b/examples/threebase_voidray.py @@ -3,6 +3,7 @@ import sc2 from sc2 import Race, Difficulty from sc2.constants import * +from sc2.ids.buff_id import BuffId from sc2.player import Bot, Computer class ThreebaseVoidrayBot(sc2.BotAI): @@ -23,6 +24,19 @@ async def on_step(self, state, iteration): else: nexus = self.units(NEXUS).ready.random + if not nexus.has_buff(BuffId.CHRONOBOOSTENERGYCOST): + abilities = await self.get_available_abilities(nexus) + if AbilityId.CHRONOBOOSTENERGYCOST in abilities: + if nexus.energy > 25: + await self.do(nexus(AbilityId.CHRONOBOOSTENERGYCOST, nexus)) + else: + await self.chat_send("Not enough energy") + else: + await self.chat_send("Can't cast") + print(abilities) + else: + await self.chat_send("Nexus is boosted") + for idle_worker in self.workers.idle: mf = state.mineral_field.closest_to(idle_worker) await self.do(idle_worker.gather(mf)) diff --git a/examples/zerg_rush.py b/examples/zerg_rush.py index 58e9a6348..2afa55b47 100644 --- a/examples/zerg_rush.py +++ b/examples/zerg_rush.py @@ -32,7 +32,8 @@ async def on_step(self, state, iteration): await self.do(zl.attack(target)) for queen in self.units(QUEEN).idle: - if queen.energy >= 25: # Hard coded, since this is not (yet) available + abilities = await self.get_available_abilities(queen) + if AbilityId.INJECTLARVA in abilities: await self.do(queen(INJECTLARVA, hatchery)) if self.vespene >= 100: diff --git a/sc2/bot_ai.py b/sc2/bot_ai.py index 7ad20792b..ae57f2975 100644 --- a/sc2/bot_ai.py +++ b/sc2/bot_ai.py @@ -69,6 +69,10 @@ def expansion_locations(self): # Not always accurate, but good enought for now. return [c.rounded for c in centers] + async def get_available_abilities(self, unit): + # right know only checks cooldown, energy cost, and whether the ability has been researched + return await self._client.query_available_abilities(unit) + async def expand_now(self, building=None, max_distance=10): if not building: building = self.townhalls.first.type_id diff --git a/sc2/client.py b/sc2/client.py index 74a02cab2..e05622420 100644 --- a/sc2/client.py +++ b/sc2/client.py @@ -6,6 +6,9 @@ ) import logging + +from sc2.ids.ability_id import AbilityId + logger = logging.getLogger(__name__) from .cache import method_cache_forever @@ -160,6 +163,16 @@ async def query_building_placement(self, ability, positions, ignore_resources=Tr )) return [ActionResult(p.result) for p in result.query.placements] + async def query_available_abilities(self, unit): + assert isinstance(unit, Unit) + result = await self._execute(query=query_pb.RequestQuery( + abilities=[query_pb.RequestQueryAvailableAbilities( + unit_tag=unit.tag + )] + )) + return [AbilityId(a.ability_id) for a in result.query.abilities[0].abilities] + + async def chat_send(self, message, team_only): ch = ChatChannel.Team if team_only else ChatChannel.Broadcast r = await self._execute(action=sc_pb.RequestAction( diff --git a/sc2/ids/ability_id.py b/sc2/ids/ability_id.py index d273e7e4d..7d01b69d7 100644 --- a/sc2/ids/ability_id.py +++ b/sc2/ids/ability_id.py @@ -4,6 +4,8 @@ import enum class AbilityId(enum.Enum): + CHRONOBOOSTENERGYCOST = 3755 # temporary > please see PR#24 + NEXUSMASSRECALL = 3757 # temporary > please see PR#24 INVALID = 0 SMART = 1 STOP_STOP = 4 diff --git a/sc2/ids/buff_id.py b/sc2/ids/buff_id.py index 0217b6a9b..7b9be8be7 100644 --- a/sc2/ids/buff_id.py +++ b/sc2/ids/buff_id.py @@ -4,6 +4,7 @@ import enum class BuffId(enum.Enum): + CHRONOBOOSTENERGYCOST = 281 # temporary > please see PR#24 INVALID = 0 GRAVITONBEAM = 5 GHOSTCLOAK = 6 diff --git a/sc2/unit.py b/sc2/unit.py index 4af6d11f0..061ed7cec 100644 --- a/sc2/unit.py +++ b/sc2/unit.py @@ -1,4 +1,5 @@ from s2clientprotocol import sc2api_pb2 as sc_pb, raw_pb2 as raw_pb +from sc2.ids.buff_id import BuffId from .position import Point3 from .data import Alliance, Attribute, DisplayType @@ -184,6 +185,11 @@ def train(self, unit, *args, **kwargs): def build(self, unit, *args, **kwargs): return self(self._game_data.units[unit.value].creation_ability.id, *args, **kwargs) + def has_buff(self, buff): + assert isinstance(buff, BuffId) + + return buff.value in self._proto.buff_ids + def attack(self, *args, **kwargs): return self(AbilityId.ATTACK, *args, **kwargs) From 983e52cfcf4a7ac290f67f2b298b0afffbb6a89e Mon Sep 17 00:00:00 2001 From: Reynald Pader Date: Tue, 30 Jan 2018 20:28:39 +0800 Subject: [PATCH 41/56] remove PyCharm files --- .gitignore | 3 + .idea/misc.xml | 4 - .idea/modules.xml | 8 - .idea/python-sc2.iml | 11 - .idea/vcs.xml | 6 - .idea/workspace.xml | 1074 ------------------------------------------ 6 files changed, 3 insertions(+), 1103 deletions(-) delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/python-sc2.iml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml diff --git a/.gitignore b/.gitignore index 7d221b642..fe20f393a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ maps/ mini_games/ *.SC2Replay + +.idea +*.iml \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index b0cc96c98..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 268d4c28f..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/python-sc2.iml b/.idea/python-sc2.iml deleted file mode 100644 index 935f136f4..000000000 --- a/.idea/python-sc2.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index eb6001c86..000000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,1074 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ._game - query - quer - from - Unit( - client - can_ca - can - can_ - chrono - buff - buff_ids - toss - injec - EFFEC - energ - async - BASEDIR - Effects - effect - effe - 261 - 250 - clike_enum_parse - _ - PREFIXES - NEXUS - $PROJECT_DIR$/ - === - == - - - - bot - - - $USER_HOME$/.virtualenvs/py3gg/lib/python3.6/site-packages/s2clientprotocol - $PROJECT_DIR$/examples - $PROJECT_DIR$ - $PROJECT_DIR$/sc2 - $PROJECT_DIR$/sc2/ids - - - - - - - - - - - - true - DEFINITION_ORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -