SC2: Content update (#5312)

Feature highlights:
- Adds many content to the SC2 game
- Allows custom mission order
- Adds race-swapped missions for build missions (except Epilogue and NCO)
- Allows War Council Nerfs (Protoss units can get pre - War Council State, alternative units get another custom nerf to match the power level of base units)
- Revamps Predator's upgrade tree (never was considered strategically important)
- Adds some units and upgrades
- Locked and excluded items can specify quantity
- Key mode (if opt-in, missions require keys to be unlocked on top of their regular regular requirements
- Victory caches - Victory locations can grant multiple items to the multiworld instead of one 
- The generator is more resilient for generator failures as it validates logic for item excludes
- Fixes the following issues:
  - https://github.com/ArchipelagoMW/Archipelago/issues/3531 
  - https://github.com/ArchipelagoMW/Archipelago/issues/3548
This commit is contained in:
Ziktofel
2025-09-02 17:40:58 +02:00
committed by GitHub
parent 2359cceb64
commit 5f1835c546
73 changed files with 46368 additions and 13655 deletions

173
worlds/sc2/item/__init__.py Normal file
View File

@@ -0,0 +1,173 @@
import enum
import typing
from dataclasses import dataclass
from typing import Optional, Union, Dict, Type
from BaseClasses import Item, ItemClassification
from ..mission_tables import SC2Race
class ItemFilterFlags(enum.IntFlag):
"""Removed > Start Inventory > Locked > Excluded > Requested > Culled"""
Available = 0
StartInventory = enum.auto()
Locked = enum.auto()
"""Used to flag items that are never allowed to be culled."""
LogicLocked = enum.auto()
"""Locked by item cull logic checks; logic-locked w/a upgrades may be removed if all parents are removed"""
Requested = enum.auto()
"""Soft-locked items by item count checks during item culling; may be re-added"""
Removed = enum.auto()
"""Marked for immediate removal"""
UserExcluded = enum.auto()
"""Excluded by the user; display an error message if failing to exclude"""
FilterExcluded = enum.auto()
"""Excluded by item filtering"""
Culled = enum.auto()
"""Soft-removed by the item culling"""
NonLocal = enum.auto()
Plando = enum.auto()
AllowedOrphan = enum.auto()
"""Used to flag items that shouldn't be filtered out with their parents"""
ForceProgression = enum.auto()
"""Used to flag items that aren't classified as progression by default"""
Unexcludable = StartInventory|Plando|Locked|LogicLocked
UnexcludableUpgrade = StartInventory|Plando|Locked
Uncullable = StartInventory|Plando|Locked|LogicLocked|Requested
Excluded = UserExcluded|FilterExcluded
RequestedOrBetter = StartInventory|Locked|LogicLocked|Requested
CulledOrBetter = Removed|Excluded|Culled
class StarcraftItem(Item):
game: str = "Starcraft 2"
filter_flags: ItemFilterFlags = ItemFilterFlags.Available
def __init__(self, name: str, classification: ItemClassification, code: Optional[int], player: int, filter_flags: ItemFilterFlags = ItemFilterFlags.Available):
super().__init__(name, classification, code, player)
self.filter_flags = filter_flags
class ItemTypeEnum(enum.Enum):
def __new__(cls, *args, **kwargs):
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value
return obj
def __init__(self, name: str, flag_word: int):
self.display_name = name
self.flag_word = flag_word
class TerranItemType(ItemTypeEnum):
Armory_1 = "Armory", 0
"""General Terran unit upgrades"""
Armory_2 = "Armory", 1
Armory_3 = "Armory", 2
Armory_4 = "Armory", 3
Armory_5 = "Armory", 4
Armory_6 = "Armory", 5
Armory_7 = "Armory", 6
Progressive = "Progressive Upgrade", 7
Laboratory = "Laboratory", 8
Upgrade = "Upgrade", 9
Unit = "Unit", 10
Building = "Building", 11
Mercenary = "Mercenary", 12
Nova_Gear = "Nova Gear", 13
Progressive_2 = "Progressive Upgrade", 14
Unit_2 = "Unit", 15
class ZergItemType(ItemTypeEnum):
Ability = "Ability", 0
"""Kerrigan abilities"""
Mutation_1 = "Mutation", 1
Strain = "Strain", 2
Morph = "Morph", 3
Upgrade = "Upgrade", 4
Mercenary = "Mercenary", 5
Unit = "Unit", 6
Level = "Level", 7
"""Kerrigan level packs"""
Primal_Form = "Primal Form", 8
Evolution_Pit = "Evolution Pit", 9
"""Zerg global economy upgrades, like automated extractors"""
Mutation_2 = "Mutation", 10
Mutation_3 = "Mutation", 11
Mutation_4 = "Mutation", 12
Progressive = "Progressive Upgrade", 13
Mutation_5 = "Mutation", 14
class ProtossItemType(ItemTypeEnum):
Unit = "Unit", 0
Unit_2 = "Unit", 1
Upgrade = "Upgrade", 2
Building = "Building", 3
Progressive = "Progressive Upgrade", 4
Spear_Of_Adun = "Spear of Adun", 5
Solarite_Core = "Solarite Core", 6
"""Protoss global effects, such as reconstruction beam or automated assimilators"""
Forge_1 = "Forge", 7
"""General Protoss unit upgrades"""
Forge_2 = "Forge", 8
"""General Protoss unit upgrades"""
Forge_3 = "Forge", 9
"""General Protoss unit upgrades"""
Forge_4 = "Forge", 10
"""General Protoss unit upgrades"""
Forge_5 = "Forge", 11
"""General Protoss unit upgrades"""
War_Council = "War Council", 12
War_Council_2 = "War Council", 13
ShieldRegeneration = "Shield Regeneration Group", 14
class FactionlessItemType(ItemTypeEnum):
Minerals = "Minerals", 0
Vespene = "Vespene", 1
Supply = "Supply", 2
MaxSupply = "Max Supply", 3
BuildingSpeed = "Building Speed", 4
Nothing = "Nothing Group", 5
Deprecated = "Deprecated", 6
MaxSupplyTrap = "Max Supply Trap", 7
ResearchSpeed = "Research Speed", 8
ResearchCost = "Research Cost", 9
Keys = "Keys", -1
ItemType = Union[TerranItemType, ZergItemType, ProtossItemType, FactionlessItemType]
race_to_item_type: Dict[SC2Race, Type[ItemTypeEnum]] = {
SC2Race.ANY: FactionlessItemType,
SC2Race.TERRAN: TerranItemType,
SC2Race.ZERG: ZergItemType,
SC2Race.PROTOSS: ProtossItemType,
}
class ItemData(typing.NamedTuple):
code: int
type: ItemType
number: int # Important for bot commands to send the item into the game
race: SC2Race
classification: ItemClassification = ItemClassification.useful
quantity: int = 1
parent: typing.Optional[str] = None
important_for_filtering: bool = False
def is_important_for_filtering(self):
return (
self.important_for_filtering
or self.classification == ItemClassification.progression
or self.classification == ItemClassification.progression_skip_balancing
)
@dataclass
class FilterItem:
name: str
data: ItemData
index: int = 0
flags: ItemFilterFlags = ItemFilterFlags.Available

View File

@@ -0,0 +1,178 @@
"""
Annotations to add to item names sent to the in-game message panel
"""
from . import item_names
ITEM_NAME_ANNOTATIONS = {
item_names.MARINE: "(Barracks)",
item_names.MEDIC: "(Barracks)",
item_names.FIREBAT: "(Barracks)",
item_names.MARAUDER: "(Barracks)",
item_names.REAPER: "(Barracks)",
item_names.HELLION: "(Factory)",
item_names.VULTURE: "(Factory)",
item_names.GOLIATH: "(Factory)",
item_names.DIAMONDBACK: "(Factory)",
item_names.SIEGE_TANK: "(Factory)",
item_names.MEDIVAC: "(Starport)",
item_names.WRAITH: "(Starport)",
item_names.VIKING: "(Starport)",
item_names.BANSHEE: "(Starport)",
item_names.BATTLECRUISER: "(Starport)",
item_names.GHOST: "(Barracks)",
item_names.SPECTRE: "(Barracks)",
item_names.THOR: "(Factory)",
item_names.RAVEN: "(Starport)",
item_names.SCIENCE_VESSEL: "(Starport)",
item_names.PREDATOR: "(Factory)",
item_names.HERCULES: "(Starport)",
item_names.HERC: "(Barracks)",
item_names.DOMINION_TROOPER: "(Barracks)",
item_names.WIDOW_MINE: "(Factory)",
item_names.CYCLONE: "(Factory)",
item_names.WARHOUND: "(Factory)",
item_names.LIBERATOR: "(Starport)",
item_names.VALKYRIE: "(Starport)",
item_names.SON_OF_KORHAL: "(Elite Barracks)",
item_names.AEGIS_GUARD: "(Elite Barracks)",
item_names.FIELD_RESPONSE_THETA: "(Elite Barracks)",
item_names.EMPERORS_SHADOW: "(Elite Barracks)",
item_names.BULWARK_COMPANY: "(Elite Factory)",
item_names.SHOCK_DIVISION: "(Elite Factory)",
item_names.BLACKHAMMER: "(Elite Factory)",
item_names.SKY_FURY: "(Elite Starport)",
item_names.NIGHT_HAWK: "(Elite Starport)",
item_names.NIGHT_WOLF: "(Elite Starport)",
item_names.EMPERORS_GUARDIAN: "(Elite Starport)",
item_names.PRIDE_OF_AUGUSTRGRAD: "(Elite Starport)",
item_names.WAR_PIGS: "(Terran Mercenary)",
item_names.DEVIL_DOGS: "(Terran Mercenary)",
item_names.HAMMER_SECURITIES: "(Terran Mercenary)",
item_names.SPARTAN_COMPANY: "(Terran Mercenary)",
item_names.SIEGE_BREAKERS: "(Terran Mercenary)",
item_names.HELS_ANGELS: "(Terran Mercenary)",
item_names.DUSK_WINGS: "(Terran Mercenary)",
item_names.JACKSONS_REVENGE: "(Terran Mercenary)",
item_names.SKIBIS_ANGELS: "(Terran Mercenary)",
item_names.DEATH_HEADS: "(Terran Mercenary)",
item_names.WINGED_NIGHTMARES: "(Terran Mercenary)",
item_names.MIDNIGHT_RIDERS: "(Terran Mercenary)",
item_names.BRYNHILDS: "(Terran Mercenary)",
item_names.JOTUN: "(Terran Mercenary)",
item_names.BUNKER: "(Terran Building)",
item_names.MISSILE_TURRET: "(Terran Building)",
item_names.SENSOR_TOWER: "(Terran Building)",
item_names.PLANETARY_FORTRESS: "(Terran Building)",
item_names.PERDITION_TURRET: "(Terran Building)",
item_names.DEVASTATOR_TURRET: "(Terran Building)",
item_names.PSI_DISRUPTER: "(Terran Building)",
item_names.HIVE_MIND_EMULATOR: "(Terran Building)",
item_names.ZERGLING: "(Larva)",
item_names.SWARM_QUEEN: "(Hatchery)",
item_names.ROACH: "(Larva)",
item_names.HYDRALISK: "(Larva)",
item_names.ABERRATION: "(Larva)",
item_names.MUTALISK: "(Larva)",
item_names.SWARM_HOST: "(Larva)",
item_names.INFESTOR: "(Larva)",
item_names.ULTRALISK: "(Larva)",
item_names.PYGALISK: "(Larva)",
item_names.CORRUPTOR: "(Larva)",
item_names.SCOURGE: "(Larva)",
item_names.BROOD_QUEEN: "(Larva)",
item_names.DEFILER: "(Larva)",
item_names.INFESTED_MARINE: "(Infested Barracks)",
item_names.INFESTED_SIEGE_TANK: "(Infested Factory)",
item_names.INFESTED_DIAMONDBACK: "(Infested Factory)",
item_names.BULLFROG: "(Infested Factory)",
item_names.INFESTED_BANSHEE: "(Infested Starport)",
item_names.INFESTED_LIBERATOR: "(Infested Starport)",
item_names.ZERGLING_BANELING_ASPECT: "(Zergling Morph)",
item_names.HYDRALISK_IMPALER_ASPECT: "(Hydralisk Morph)",
item_names.HYDRALISK_LURKER_ASPECT: "(Hydralisk Morph)",
item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: "(Mutalisk/Corruptor Morph)",
item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT: "(Mutalisk/Corruptor Morph)",
item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: "(Mutalisk/Corruptor Morph)",
item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: "(Mutalisk/Corruptor Morph)",
item_names.ROACH_RAVAGER_ASPECT: "(Roach Morph)",
item_names.OVERLORD_OVERSEER_ASPECT: "(Overlord Morph)",
item_names.ROACH_PRIMAL_IGNITER_ASPECT: "(Roach Morph)",
item_names.ULTRALISK_TYRANNOZOR_ASPECT: "(Ultralisk Morph)",
item_names.INFESTED_MEDICS: "(Zerg Mercenary)",
item_names.INFESTED_SIEGE_BREAKERS: "(Zerg Mercenary)",
item_names.INFESTED_DUSK_WINGS: "(Zerg Mercenary)",
item_names.DEVOURING_ONES: "(Zerg Mercenary)",
item_names.HUNTER_KILLERS: "(Zerg Mercenary)",
item_names.TORRASQUE_MERC: "(Zerg Mercenary)",
item_names.HUNTERLING: "(Zerg Mercenary)",
item_names.YGGDRASIL: "(Zerg Mercenary)",
item_names.CAUSTIC_HORRORS: "(Zerg Mercenary)",
item_names.SPORE_CRAWLER: "(Zerg Building)",
item_names.SPINE_CRAWLER: "(Zerg Building)",
item_names.BILE_LAUNCHER: "(Zerg Building)",
item_names.INFESTED_BUNKER: "(Zerg Building)",
item_names.INFESTED_MISSILE_TURRET: "(Zerg Building)",
item_names.NYDUS_WORM: "(Nydus Network)",
item_names.ECHIDNA_WORM: "(Nydus Network)",
item_names.ZEALOT: "(Gateway, Aiur)",
item_names.CENTURION: "(Gateway, Nerazim)",
item_names.SENTINEL: "(Gateway, Purifier)",
item_names.SUPPLICANT: "(Gateway, Tal'darim)",
item_names.STALKER: "(Gateway, Nerazim)",
item_names.INSTIGATOR: "(Gateway, Purifier)",
item_names.SLAYER: "(Gateway, Tal'darim)",
item_names.SENTRY: "(Gateway, Aiur)",
item_names.ENERGIZER: "(Gateway, Purifier)",
item_names.HAVOC: "(Gateway, Tal'darim)",
item_names.HIGH_TEMPLAR: "(Gateway, Aiur)",
item_names.SIGNIFIER: "(Gateway, Nerazim)",
item_names.ASCENDANT: "(Gateway, Tal'darim)",
item_names.DARK_TEMPLAR: "(Gateway, Nerazim)",
item_names.AVENGER: "(Gateway, Aiur)",
item_names.BLOOD_HUNTER: "(Gateway, Tal'darim)",
item_names.DRAGOON: "(Gateway, Aiur)",
item_names.DARK_ARCHON: "(Gateway, Nerazim)",
item_names.ADEPT: "(Gateway, Purifier)",
item_names.OBSERVER: "(Robotics Facility)",
item_names.WARP_PRISM: "(Robotics Facility)",
item_names.IMMORTAL: "(Robotics Facility, Aiur)",
item_names.ANNIHILATOR: "(Robotics Facility, Nerazim)",
item_names.VANGUARD: "(Robotics Facility, Tal'darim)",
item_names.STALWART: "(Robotics Facility, Purifier)",
item_names.COLOSSUS: "(Robotics Facility, Purifier)",
item_names.WRATHWALKER: "(Robotics Facility, Tal'darim)",
item_names.REAVER: "(Robotics Facility, Aiur)",
item_names.DISRUPTOR: "(Robotics Facility, Purifier)",
item_names.PHOENIX: "(Stargate, Aiur)",
item_names.MIRAGE: "(Stargate, Purifier)",
item_names.SKIRMISHER: "(Stargate, Tal'darim)",
item_names.CORSAIR: "(Stargate, Nerazim)",
item_names.VOID_RAY: "(Stargate, Nerazim)",
item_names.DESTROYER: "(Stargate, Tal'darim)",
item_names.PULSAR: "(Stargate, Aiur)",
item_names.DAWNBRINGER: "(Stargate, Purifier)",
item_names.SCOUT: "(Stargate, Aiur)",
item_names.OPPRESSOR: "(Stargate, Tal'darim)",
item_names.CALADRIUS: "(Stargate, Purifier)",
item_names.MISTWING: "(Stargate, Nerazim)",
item_names.CARRIER: "(Stargate, Aiur)",
item_names.SKYLORD: "(Stargate, Tal'darim)",
item_names.TRIREME: "(Stargate, Purifier)",
item_names.TEMPEST: "(Stargate, Purifier)",
item_names.MOTHERSHIP: "(Stargate, Tal'darim)",
item_names.ARBITER: "(Stargate, Aiur)",
item_names.ORACLE: "(Stargate, Nerazim)",
item_names.PHOTON_CANNON: "(Protoss Building)",
item_names.KHAYDARIN_MONOLITH: "(Protoss Building)",
item_names.SHIELD_BATTERY: "(Protoss Building)",
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,902 @@
import typing
from . import item_tables, item_names
from .item_tables import key_item_table
from ..mission_tables import campaign_mission_table, SC2Campaign, SC2Mission, SC2Race
"""
Item name groups, given to Archipelago and used in YAMLs and /received filtering.
For non-developers the following will be useful:
* Items with a bracket get groups named after the unbracketed part
* eg. "Advanced Healing AI (Medivac)" is accessible as "Advanced Healing AI"
* The exception to this are item names that would be ambiguous (eg. "Resource Efficiency")
* Item flaggroups get unique groups as well as combined groups for numbered flaggroups
* eg. "Unit" contains all units, "Armory" contains "Armory 1" through "Armory 6"
* The best place to look these up is at the bottom of Items.py
* Items that have a parent are grouped together
* eg. "Zergling Items" contains all items that have "Zergling" as a parent
* These groups do NOT contain the parent item
* This currently does not include items with multiple potential parents, like some LotV unit upgrades
* All items are grouped by their race ("Terran", "Protoss", "Zerg", "Any")
* Hand-crafted item groups can be found at the bottom of this file
"""
item_name_groups: typing.Dict[str, typing.List[str]] = {}
# Groups for use in world logic
item_name_groups["Missions"] = ["Beat " + mission.mission_name for mission in SC2Mission]
item_name_groups["WoL Missions"] = ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.WOL]] + \
["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.PROPHECY]]
# These item name groups should not show up in documentation
unlisted_item_name_groups = {
"Missions", "WoL Missions",
item_tables.TerranItemType.Progressive.display_name,
item_tables.TerranItemType.Nova_Gear.display_name,
item_tables.TerranItemType.Mercenary.display_name,
item_tables.ZergItemType.Ability.display_name,
item_tables.ZergItemType.Morph.display_name,
item_tables.ZergItemType.Strain.display_name,
}
# Some item names only differ in bracketed parts
# These items are ambiguous for short-hand name groups
bracketless_duplicates: typing.Set[str]
# This is a list of names in ItemNames with bracketed parts removed, for internal use
_shortened_names = [(name[:name.find(' (')] if '(' in name else name)
for name in [item_names.__dict__[name] for name in item_names.__dir__() if not name.startswith('_')]]
# Remove the first instance of every short-name from the full item list
bracketless_duplicates = set(_shortened_names)
for name in bracketless_duplicates:
_shortened_names.remove(name)
# The remaining short-names are the duplicates
bracketless_duplicates = set(_shortened_names)
del _shortened_names
# All items get sorted into their data type
for item, data in item_tables.get_full_item_list().items():
# Items get assigned to their flaggroup's display type
item_name_groups.setdefault(data.type.display_name, []).append(item)
# Items with a bracket get a short-hand name group for ease of use in YAMLs
if '(' in item:
short_name = item[:item.find(' (')]
# Ambiguous short-names are dropped
if short_name not in bracketless_duplicates:
item_name_groups[short_name] = [item]
# Short-name groups are unlisted
unlisted_item_name_groups.add(short_name)
# Items with a parent get assigned to their parent's group
if data.parent:
# The parent groups need a special name, otherwise they are ambiguous with the parent
parent_group = f"{data.parent} Items"
item_name_groups.setdefault(parent_group, []).append(item)
# Parent groups are unlisted
unlisted_item_name_groups.add(parent_group)
# All items get assigned to their race's group
race_group = data.race.name.capitalize()
item_name_groups.setdefault(race_group, []).append(item)
# Hand-made groups
class ItemGroupNames:
TERRAN_ITEMS = "Terran Items"
"""All Terran items"""
TERRAN_UNITS = "Terran Units"
TERRAN_GENERIC_UPGRADES = "Terran Generic Upgrades"
"""+attack/armour upgrades"""
BARRACKS_UNITS = "Barracks Units"
FACTORY_UNITS = "Factory Units"
STARPORT_UNITS = "Starport Units"
WOL_UNITS = "WoL Units"
WOL_MERCS = "WoL Mercenaries"
WOL_BUILDINGS = "WoL Buildings"
WOL_UPGRADES = "WoL Upgrades"
WOL_ITEMS = "WoL Items"
"""All items from vanilla WoL. Note some items are progressive where level 2 is not vanilla."""
NCO_UNITS = "NCO Units"
NCO_BUILDINGS = "NCO Buildings"
NCO_UNIT_TECHNOLOGY = "NCO Unit Technology"
NCO_BASELINE_UPGRADES = "NCO Baseline Upgrades"
NCO_UPGRADES = "NCO Upgrades"
NOVA_EQUIPMENT = "Nova Equipment"
NOVA_WEAPONS = "Nova Weapons"
NOVA_GADGETS = "Nova Gadgets"
NCO_MAX_PROGRESSIVE_ITEMS = "NCO +Items"
"""NCO item groups that should be set to maximum progressive amounts"""
NCO_MIN_PROGRESSIVE_ITEMS = "NCO -Items"
"""NCO item groups that should be set to minimum progressive amounts (1)"""
TERRAN_BUILDINGS = "Terran Buildings"
TERRAN_MERCENARIES = "Terran Mercenaries"
TERRAN_STIMPACKS = "Terran Stimpacks"
TERRAN_PROGRESSIVE_UPGRADES = "Terran Progressive Upgrades"
TERRAN_ORIGINAL_PROGRESSIVE_UPGRADES = "Terran Original Progressive Upgrades"
"""Progressive items where level 1 appeared in WoL"""
MENGSK_UNITS = "Mengsk Units"
TERRAN_VETERANCY_UNITS = "Terran Veterancy Units"
ORBITAL_COMMAND_ABILITIES = "Orbital Command Abilities"
WOL_ORBITAL_COMMAND_ABILITIES = "WoL Command Center Abilities"
ZERG_ITEMS = "Zerg Items"
ZERG_UNITS = "Zerg Units"
ZERG_NONMORPH_UNITS = "Zerg Non-morph Units"
ZERG_GENERIC_UPGRADES = "Zerg Generic Upgrades"
"""+attack/armour upgrades"""
HOTS_UNITS = "HotS Units"
HOTS_BUILDINGS = "HotS Buildings"
HOTS_STRAINS = "HotS Strains"
"""Vanilla HotS strains (the upgrades you play a mini-mission for)"""
HOTS_MUTATIONS = "HotS Mutations"
"""Vanilla HotS Mutations (basic toggleable unit upgrades)"""
HOTS_GLOBAL_UPGRADES = "HotS Global Upgrades"
HOTS_MORPHS = "HotS Morphs"
KERRIGAN_ABILITIES = "Kerrigan Abilities"
KERRIGAN_HOTS_ABILITIES = "Kerrigan HotS Abilities"
KERRIGAN_ACTIVE_ABILITIES = "Kerrigan Active Abilities"
KERRIGAN_LOGIC_ACTIVE_ABILITIES = "Kerrigan Logic Active Abilities"
KERRIGAN_PASSIVES = "Kerrigan Passives"
KERRIGAN_TIER_1 = "Kerrigan Tier 1"
KERRIGAN_TIER_2 = "Kerrigan Tier 2"
KERRIGAN_TIER_3 = "Kerrigan Tier 3"
KERRIGAN_TIER_4 = "Kerrigan Tier 4"
KERRIGAN_TIER_5 = "Kerrigan Tier 5"
KERRIGAN_TIER_6 = "Kerrigan Tier 6"
KERRIGAN_TIER_7 = "Kerrigan Tier 7"
KERRIGAN_ULTIMATES = "Kerrigan Ultimates"
KERRIGAN_LOGIC_ULTIMATES = "Kerrigan Logic Ultimates"
KERRIGAN_NON_ULTIMATES = "Kerrigan Non-Ultimates"
KERRIGAN_NON_ULTIMATE_ACTIVE_ABILITIES = "Kerrigan Non-Ultimate Active Abilities"
HOTS_ITEMS = "HotS Items"
"""All items from vanilla HotS"""
OVERLORD_UPGRADES = "Overlord Upgrades"
ZERG_MORPHS = "Zerg Morphs"
ZERG_MERCENARIES = "Zerg Mercenaries"
ZERG_BUILDINGS = "Zerg Buildings"
INF_TERRAN_ITEMS = "Infested Terran Items"
"""All items from Stukov co-op subfaction"""
INF_TERRAN_UNITS = "Infested Terran Units"
INF_TERRAN_UPGRADES = "Infested Terran Upgrades"
PROTOSS_ITEMS = "Protoss Items"
PROTOSS_UNITS = "Protoss Units"
PROTOSS_GENERIC_UPGRADES = "Protoss Generic Upgrades"
"""+attack/armour upgrades"""
GATEWAY_UNITS = "Gateway Units"
ROBO_UNITS = "Robo Units"
STARGATE_UNITS = "Stargate Units"
PROPHECY_UNITS = "Prophecy Units"
PROPHECY_BUILDINGS = "Prophecy Buildings"
LOTV_UNITS = "LotV Units"
LOTV_ITEMS = "LotV Items"
LOTV_GLOBAL_UPGRADES = "LotV Global Upgrades"
SOA_ITEMS = "SOA"
PROTOSS_GLOBAL_UPGRADES = "Protoss Global Upgrades"
PROTOSS_BUILDINGS = "Protoss Buildings"
WAR_COUNCIL = "Protoss War Council Upgrades"
AIUR_UNITS = "Aiur"
NERAZIM_UNITS = "Nerazim"
TAL_DARIM_UNITS = "Tal'Darim"
PURIFIER_UNITS = "Purifier"
VANILLA_ITEMS = "Vanilla Items"
OVERPOWERED_ITEMS = "Overpowered Items"
UNRELEASED_ITEMS = "Unreleased Items"
LEGACY_ITEMS = "Legacy Items"
KEYS = "Keys"
@classmethod
def get_all_group_names(cls) -> typing.Set[str]:
return {
name for identifier, name in cls.__dict__.items()
if not identifier.startswith('_')
and not identifier.startswith('get_')
}
# Terran
item_name_groups[ItemGroupNames.TERRAN_ITEMS] = terran_items = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.race == SC2Race.TERRAN
]
item_name_groups[ItemGroupNames.TERRAN_UNITS] = terran_units = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type in (
item_tables.TerranItemType.Unit, item_tables.TerranItemType.Unit_2, item_tables.TerranItemType.Mercenary)
]
item_name_groups[ItemGroupNames.TERRAN_GENERIC_UPGRADES] = terran_generic_upgrades = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type == item_tables.TerranItemType.Upgrade
]
barracks_wa_group = [
item_names.MARINE, item_names.FIREBAT, item_names.MARAUDER,
item_names.REAPER, item_names.GHOST, item_names.SPECTRE, item_names.HERC, item_names.AEGIS_GUARD,
item_names.EMPERORS_SHADOW, item_names.DOMINION_TROOPER, item_names.SON_OF_KORHAL,
]
item_name_groups[ItemGroupNames.BARRACKS_UNITS] = barracks_units = (barracks_wa_group + [
item_names.MEDIC,
item_names.FIELD_RESPONSE_THETA,
])
factory_wa_group = [
item_names.HELLION, item_names.VULTURE, item_names.GOLIATH, item_names.DIAMONDBACK,
item_names.SIEGE_TANK, item_names.THOR, item_names.PREDATOR,
item_names.CYCLONE, item_names.WARHOUND, item_names.SHOCK_DIVISION, item_names.BLACKHAMMER,
item_names.BULWARK_COMPANY,
]
item_name_groups[ItemGroupNames.FACTORY_UNITS] = factory_units = (factory_wa_group + [
item_names.WIDOW_MINE,
])
starport_wa_group = [
item_names.WRAITH, item_names.VIKING, item_names.BANSHEE,
item_names.BATTLECRUISER, item_names.RAVEN_HUNTER_SEEKER_WEAPON,
item_names.LIBERATOR, item_names.VALKYRIE, item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY,
item_names.EMPERORS_GUARDIAN, item_names.NIGHT_HAWK, item_names.NIGHT_WOLF,
]
item_name_groups[ItemGroupNames.STARPORT_UNITS] = starport_units = [
item_names.MEDIVAC, item_names.WRAITH, item_names.VIKING, item_names.BANSHEE,
item_names.BATTLECRUISER, item_names.HERCULES, item_names.SCIENCE_VESSEL, item_names.RAVEN,
item_names.LIBERATOR, item_names.VALKYRIE, item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY,
item_names.EMPERORS_GUARDIAN, item_names.NIGHT_HAWK, item_names.NIGHT_WOLF,
]
item_name_groups[ItemGroupNames.TERRAN_MERCENARIES] = terran_mercenaries = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type == item_tables.TerranItemType.Mercenary
]
item_name_groups[ItemGroupNames.NCO_UNITS] = nco_units = [
item_names.MARINE, item_names.MARAUDER, item_names.REAPER,
item_names.HELLION, item_names.GOLIATH, item_names.SIEGE_TANK,
item_names.RAVEN, item_names.LIBERATOR, item_names.BANSHEE, item_names.BATTLECRUISER,
item_names.HERC, # From that one bonus objective in mission 5
]
item_name_groups[ItemGroupNames.NCO_BUILDINGS] = nco_buildings = [
item_names.BUNKER, item_names.MISSILE_TURRET, item_names.PLANETARY_FORTRESS,
]
item_name_groups[ItemGroupNames.NOVA_EQUIPMENT] = nova_equipment = [
*[item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type == item_tables.TerranItemType.Nova_Gear],
item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE,
]
item_name_groups[ItemGroupNames.NOVA_WEAPONS] = nova_weapons = [
item_names.NOVA_C20A_CANISTER_RIFLE,
item_names.NOVA_HELLFIRE_SHOTGUN,
item_names.NOVA_PLASMA_RIFLE,
item_names.NOVA_MONOMOLECULAR_BLADE,
item_names.NOVA_BLAZEFIRE_GUNBLADE,
]
item_name_groups[ItemGroupNames.NOVA_GADGETS] = nova_gadgets = [
item_names.NOVA_STIM_INFUSION,
item_names.NOVA_PULSE_GRENADES,
item_names.NOVA_FLASHBANG_GRENADES,
item_names.NOVA_IONIC_FORCE_FIELD,
item_names.NOVA_HOLO_DECOY,
]
item_name_groups[ItemGroupNames.WOL_UNITS] = wol_units = [
item_names.MARINE, item_names.MEDIC, item_names.FIREBAT, item_names.MARAUDER, item_names.REAPER,
item_names.HELLION, item_names.VULTURE, item_names.GOLIATH, item_names.DIAMONDBACK, item_names.SIEGE_TANK,
item_names.MEDIVAC, item_names.WRAITH, item_names.VIKING, item_names.BANSHEE, item_names.BATTLECRUISER,
item_names.GHOST, item_names.SPECTRE, item_names.THOR,
item_names.PREDATOR, item_names.HERCULES,
item_names.SCIENCE_VESSEL, item_names.RAVEN,
]
item_name_groups[ItemGroupNames.WOL_MERCS] = wol_mercs = [
item_names.WAR_PIGS, item_names.DEVIL_DOGS, item_names.HAMMER_SECURITIES,
item_names.SPARTAN_COMPANY, item_names.SIEGE_BREAKERS,
item_names.HELS_ANGELS, item_names.DUSK_WINGS, item_names.JACKSONS_REVENGE,
]
item_name_groups[ItemGroupNames.WOL_BUILDINGS] = wol_buildings = [
item_names.BUNKER, item_names.MISSILE_TURRET, item_names.SENSOR_TOWER,
item_names.PERDITION_TURRET, item_names.PLANETARY_FORTRESS,
item_names.HIVE_MIND_EMULATOR, item_names.PSI_DISRUPTER,
]
item_name_groups[ItemGroupNames.TERRAN_BUILDINGS] = terran_buildings = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type == item_tables.TerranItemType.Building or item_name in wol_buildings
]
item_name_groups[ItemGroupNames.MENGSK_UNITS] = [
item_names.AEGIS_GUARD, item_names.EMPERORS_SHADOW,
item_names.SHOCK_DIVISION, item_names.BLACKHAMMER,
item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY,
item_names.DOMINION_TROOPER,
]
item_name_groups[ItemGroupNames.TERRAN_VETERANCY_UNITS] = [
item_names.AEGIS_GUARD, item_names.EMPERORS_SHADOW, item_names.SHOCK_DIVISION, item_names.BLACKHAMMER,
item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY, item_names.SON_OF_KORHAL, item_names.FIELD_RESPONSE_THETA,
item_names.BULWARK_COMPANY, item_names.NIGHT_HAWK, item_names.EMPERORS_GUARDIAN, item_names.NIGHT_WOLF,
]
item_name_groups[ItemGroupNames.ORBITAL_COMMAND_ABILITIES] = orbital_command_abilities = [
item_names.COMMAND_CENTER_SCANNER_SWEEP,
item_names.COMMAND_CENTER_MULE,
item_names.COMMAND_CENTER_EXTRA_SUPPLIES,
]
item_name_groups[ItemGroupNames.WOL_ORBITAL_COMMAND_ABILITIES] = wol_orbital_command_abilities = [
item_names.COMMAND_CENTER_SCANNER_SWEEP,
item_names.COMMAND_CENTER_MULE,
]
spider_mine_sources = [
item_names.VULTURE,
item_names.REAPER_SPIDER_MINES,
item_names.SIEGE_TANK_SPIDER_MINES,
item_names.RAVEN_SPIDER_MINES,
]
# Terran Upgrades
item_name_groups[ItemGroupNames.WOL_UPGRADES] = wol_upgrades = [
# Armory Base
item_names.BUNKER_PROJECTILE_ACCELERATOR, item_names.BUNKER_NEOSTEEL_BUNKER,
item_names.MISSILE_TURRET_TITANIUM_HOUSING, item_names.MISSILE_TURRET_HELLSTORM_BATTERIES,
item_names.SCV_ADVANCED_CONSTRUCTION, item_names.SCV_DUAL_FUSION_WELDERS,
item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, item_names.COMMAND_CENTER_MULE, item_names.COMMAND_CENTER_SCANNER_SWEEP,
# Armory Infantry
item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MARINE_COMBAT_SHIELD,
item_names.MEDIC_ADVANCED_MEDIC_FACILITIES, item_names.MEDIC_STABILIZER_MEDPACKS,
item_names.FIREBAT_INCINERATOR_GAUNTLETS, item_names.FIREBAT_JUGGERNAUT_PLATING,
item_names.MARAUDER_CONCUSSIVE_SHELLS, item_names.MARAUDER_KINETIC_FOAM,
item_names.REAPER_U238_ROUNDS, item_names.REAPER_G4_CLUSTERBOMB,
# Armory Vehicles
item_names.HELLION_TWIN_LINKED_FLAMETHROWER, item_names.HELLION_THERMITE_FILAMENTS,
item_names.SPIDER_MINE_CERBERUS_MINE, item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE,
item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM, item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM,
item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL, item_names.DIAMONDBACK_SHAPED_HULL,
item_names.SIEGE_TANK_MAELSTROM_ROUNDS, item_names.SIEGE_TANK_SHAPED_BLAST,
# Armory Starships
item_names.MEDIVAC_RAPID_DEPLOYMENT_TUBE, item_names.MEDIVAC_ADVANCED_HEALING_AI,
item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS, item_names.WRAITH_DISPLACEMENT_FIELD,
item_names.VIKING_RIPWAVE_MISSILES, item_names.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM,
item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS, item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY,
item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS, item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX,
# Armory Dominion
item_names.GHOST_OCULAR_IMPLANTS, item_names.GHOST_CRIUS_SUIT,
item_names.SPECTRE_PSIONIC_LASH, item_names.SPECTRE_NYX_CLASS_CLOAKING_MODULE,
item_names.THOR_330MM_BARRAGE_CANNON, item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL,
# Lab Zerg
item_names.BUNKER_FORTIFIED_BUNKER, item_names.BUNKER_SHRIKE_TURRET,
item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, item_names.CELLULAR_REACTOR,
# Other 3 levels are units/buildings (Perdition, PF, Hercules, Predator, HME, Psi Disrupter)
# Lab Protoss
item_names.VANADIUM_PLATING, item_names.ULTRA_CAPACITORS,
item_names.AUTOMATED_REFINERY, item_names.MICRO_FILTERING,
item_names.ORBITAL_DEPOTS, item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR,
item_names.ORBITAL_STRIKE, item_names.TECH_REACTOR,
# Other level is units (Raven, Science Vessel)
]
item_name_groups[ItemGroupNames.TERRAN_STIMPACKS] = terran_stimpacks = [
item_names.MARINE_PROGRESSIVE_STIMPACK,
item_names.MARAUDER_PROGRESSIVE_STIMPACK,
item_names.REAPER_PROGRESSIVE_STIMPACK,
item_names.FIREBAT_PROGRESSIVE_STIMPACK,
item_names.HELLION_PROGRESSIVE_STIMPACK,
]
item_name_groups[ItemGroupNames.TERRAN_ORIGINAL_PROGRESSIVE_UPGRADES] = terran_original_progressive_upgrades = [
item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM,
item_names.MARINE_PROGRESSIVE_STIMPACK,
item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE,
item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL,
item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS,
item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS,
item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS,
item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX,
item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL,
item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL,
]
item_name_groups[ItemGroupNames.NCO_BASELINE_UPGRADES] = nco_baseline_upgrades = [
item_names.BUNKER_NEOSTEEL_BUNKER, # Baseline from mission 2
item_names.BUNKER_FORTIFIED_BUNKER, # Baseline from mission 2
item_names.MARINE_COMBAT_SHIELD, # Baseline from mission 2
item_names.MARAUDER_KINETIC_FOAM, # Baseline outside WOL
item_names.MARAUDER_CONCUSSIVE_SHELLS, # Baseline from mission 2
item_names.REAPER_BALLISTIC_FLIGHTSUIT, # Baseline from mission 2
item_names.HELLION_HELLBAT, # Baseline from mission 3
item_names.GOLIATH_INTERNAL_TECH_MODULE, # Baseline from mission 4
item_names.GOLIATH_SHAPED_HULL,
# ItemNames.GOLIATH_RESOURCE_EFFICIENCY, # Supply savings baseline in NCO, mineral savings is non-NCO
item_names.SIEGE_TANK_SHAPED_HULL, # Baseline NCO gives +10; this upgrade gives +25
item_names.SIEGE_TANK_SHAPED_BLAST, # Baseline from mission 3
item_names.LIBERATOR_RAID_ARTILLERY, # Baseline in mission 5
item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE, # Baseline in mission 5
item_names.BATTLECRUISER_TACTICAL_JUMP,
item_names.BATTLECRUISER_MOIRAI_IMPULSE_DRIVE,
item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, # Baseline from mission 2
item_names.ORBITAL_DEPOTS, # Baseline from mission 2
item_names.COMMAND_CENTER_SCANNER_SWEEP, # In NCO you must actually morph Command Center into Orbital Command
item_names.COMMAND_CENTER_EXTRA_SUPPLIES, # But in AP this works WoL-style
] + nco_buildings
item_name_groups[ItemGroupNames.NCO_UNIT_TECHNOLOGY] = nco_unit_technology = [
item_names.MARINE_LASER_TARGETING_SYSTEM,
item_names.MARINE_PROGRESSIVE_STIMPACK,
item_names.MARINE_MAGRAIL_MUNITIONS,
item_names.MARINE_OPTIMIZED_LOGISTICS,
item_names.MARAUDER_LASER_TARGETING_SYSTEM,
item_names.MARAUDER_INTERNAL_TECH_MODULE,
item_names.MARAUDER_PROGRESSIVE_STIMPACK,
item_names.MARAUDER_MAGRAIL_MUNITIONS,
item_names.REAPER_SPIDER_MINES,
item_names.REAPER_LASER_TARGETING_SYSTEM,
item_names.REAPER_PROGRESSIVE_STIMPACK,
item_names.REAPER_ADVANCED_CLOAKING_FIELD,
# Reaper special ordnance gives anti-building attack, which is baseline in AP
item_names.HELLION_JUMP_JETS,
item_names.HELLION_PROGRESSIVE_STIMPACK,
item_names.HELLION_SMART_SERVOS,
item_names.HELLION_OPTIMIZED_LOGISTICS,
item_names.HELLION_THERMITE_FILAMENTS, # Called Infernal Pre-Igniter in NCO
item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM, # Called Laser Targeting System in NCO
item_names.GOLIATH_JUMP_JETS,
item_names.GOLIATH_OPTIMIZED_LOGISTICS,
item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM,
item_names.SIEGE_TANK_SPIDER_MINES,
item_names.SIEGE_TANK_JUMP_JETS,
item_names.SIEGE_TANK_INTERNAL_TECH_MODULE,
item_names.SIEGE_TANK_SMART_SERVOS,
# Tanks can't get Laser targeting system in NCO
item_names.BANSHEE_INTERNAL_TECH_MODULE,
item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS,
item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY, # Banshee Special Ordnance
# Banshees can't get laser targeting systems in NCO
item_names.LIBERATOR_CLOAK,
item_names.LIBERATOR_SMART_SERVOS,
item_names.LIBERATOR_OPTIMIZED_LOGISTICS,
# Liberators can't get laser targeting system in NCO
item_names.RAVEN_SPIDER_MINES,
item_names.RAVEN_INTERNAL_TECH_MODULE,
item_names.RAVEN_RAILGUN_TURRET, # Raven Magrail Munitions
item_names.RAVEN_HUNTER_SEEKER_WEAPON, # Raven Special Ordnance
item_names.BATTLECRUISER_INTERNAL_TECH_MODULE,
item_names.BATTLECRUISER_CLOAK,
item_names.BATTLECRUISER_ATX_LASER_BATTERY, # Battlecruiser Special Ordnance
item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL,
]
item_name_groups[ItemGroupNames.NCO_UPGRADES] = nco_upgrades = nco_baseline_upgrades + nco_unit_technology
item_name_groups[ItemGroupNames.NCO_MAX_PROGRESSIVE_ITEMS] = nco_unit_technology + nova_equipment + terran_generic_upgrades
item_name_groups[ItemGroupNames.NCO_MIN_PROGRESSIVE_ITEMS] = nco_units + nco_baseline_upgrades
item_name_groups[ItemGroupNames.TERRAN_PROGRESSIVE_UPGRADES] = terran_progressive_items = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type in (item_tables.TerranItemType.Progressive, item_tables.TerranItemType.Progressive_2)
]
item_name_groups[ItemGroupNames.WOL_ITEMS] = vanilla_wol_items = (
wol_units
+ wol_buildings
+ wol_mercs
+ wol_upgrades
+ orbital_command_abilities
+ terran_generic_upgrades
)
# Zerg
item_name_groups[ItemGroupNames.ZERG_ITEMS] = zerg_items = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.race == SC2Race.ZERG
]
item_name_groups[ItemGroupNames.ZERG_BUILDINGS] = zerg_buildings = [
item_names.SPINE_CRAWLER,
item_names.SPORE_CRAWLER,
item_names.BILE_LAUNCHER,
item_names.INFESTED_BUNKER,
item_names.INFESTED_MISSILE_TURRET,
item_names.NYDUS_WORM,
item_names.ECHIDNA_WORM]
item_name_groups[ItemGroupNames.ZERG_NONMORPH_UNITS] = zerg_nonmorph_units = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type in (
item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary
)
and item_name not in zerg_buildings
]
item_name_groups[ItemGroupNames.ZERG_MORPHS] = zerg_morphs = [
item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Morph
]
item_name_groups[ItemGroupNames.ZERG_UNITS] = zerg_units = zerg_nonmorph_units + zerg_morphs
# For W/A upgrades
zerg_ground_units = [
item_names.ZERGLING, item_names.SWARM_QUEEN, item_names.ROACH, item_names.HYDRALISK, item_names.ABERRATION,
item_names.SWARM_HOST, item_names.INFESTOR, item_names.ULTRALISK, item_names.ZERGLING_BANELING_ASPECT,
item_names.HYDRALISK_LURKER_ASPECT, item_names.HYDRALISK_IMPALER_ASPECT, item_names.ULTRALISK_TYRANNOZOR_ASPECT,
item_names.ROACH_RAVAGER_ASPECT, item_names.DEFILER, item_names.ROACH_PRIMAL_IGNITER_ASPECT,
item_names.PYGALISK,
item_names.INFESTED_MARINE, item_names.INFESTED_BUNKER, item_names.INFESTED_DIAMONDBACK,
item_names.INFESTED_SIEGE_TANK,
]
zerg_melee_wa = [
item_names.ZERGLING, item_names.ABERRATION, item_names.ULTRALISK, item_names.ZERGLING_BANELING_ASPECT,
item_names.ULTRALISK_TYRANNOZOR_ASPECT, item_names.INFESTED_BUNKER, item_names.PYGALISK,
]
zerg_ranged_wa = [
item_names.SWARM_QUEEN, item_names.ROACH, item_names.HYDRALISK, item_names.SWARM_HOST,
item_names.HYDRALISK_LURKER_ASPECT, item_names.HYDRALISK_IMPALER_ASPECT, item_names.ULTRALISK_TYRANNOZOR_ASPECT,
item_names.ROACH_RAVAGER_ASPECT, item_names.ROACH_PRIMAL_IGNITER_ASPECT, item_names.INFESTED_MARINE,
item_names.INFESTED_BUNKER, item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_SIEGE_TANK,
]
zerg_air_units = [
item_names.MUTALISK, item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT,
item_names.CORRUPTOR, item_names.BROOD_QUEEN, item_names.SCOURGE, item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT,
item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, item_names.INFESTED_BANSHEE, item_names.INFESTED_LIBERATOR,
]
item_name_groups[ItemGroupNames.ZERG_GENERIC_UPGRADES] = zerg_generic_upgrades = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type == item_tables.ZergItemType.Upgrade
]
item_name_groups[ItemGroupNames.HOTS_UNITS] = hots_units = [
item_names.ZERGLING, item_names.SWARM_QUEEN, item_names.ROACH, item_names.HYDRALISK,
item_names.ABERRATION, item_names.SWARM_HOST, item_names.MUTALISK,
item_names.INFESTOR, item_names.ULTRALISK,
item_names.ZERGLING_BANELING_ASPECT,
item_names.HYDRALISK_LURKER_ASPECT,
item_names.HYDRALISK_IMPALER_ASPECT,
item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT,
item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT,
]
item_name_groups[ItemGroupNames.HOTS_BUILDINGS] = hots_buildings = [
item_names.SPINE_CRAWLER,
item_names.SPORE_CRAWLER,
]
item_name_groups[ItemGroupNames.HOTS_MORPHS] = hots_morphs = [
item_names.ZERGLING_BANELING_ASPECT,
item_names.HYDRALISK_IMPALER_ASPECT,
item_names.HYDRALISK_LURKER_ASPECT,
item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT,
item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT,
]
item_name_groups[ItemGroupNames.ZERG_MERCENARIES] = zerg_mercenaries = [
item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Mercenary
]
item_name_groups[ItemGroupNames.KERRIGAN_ABILITIES] = kerrigan_abilities = [
item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Ability
]
item_name_groups[ItemGroupNames.KERRIGAN_PASSIVES] = kerrigan_passives = [
item_names.KERRIGAN_HEROIC_FORTITUDE, item_names.KERRIGAN_CHAIN_REACTION,
item_names.KERRIGAN_INFEST_BROODLINGS, item_names.KERRIGAN_FURY, item_names.KERRIGAN_ABILITY_EFFICIENCY,
]
item_name_groups[ItemGroupNames.KERRIGAN_ACTIVE_ABILITIES] = kerrigan_active_abilities = [
item_name for item_name in kerrigan_abilities if item_name not in kerrigan_passives
]
item_name_groups[ItemGroupNames.KERRIGAN_LOGIC_ACTIVE_ABILITIES] = kerrigan_logic_active_abilities = [
item_name for item_name in kerrigan_active_abilities if item_name != item_names.KERRIGAN_ASSIMILATION_AURA
]
item_name_groups[ItemGroupNames.KERRIGAN_TIER_1] = kerrigan_tier_1 = [
item_names.KERRIGAN_CRUSHING_GRIP, item_names.KERRIGAN_HEROIC_FORTITUDE, item_names.KERRIGAN_LEAPING_STRIKE
]
item_name_groups[ItemGroupNames.KERRIGAN_TIER_2] = kerrigan_tier_2= [
item_names.KERRIGAN_CRUSHING_GRIP, item_names.KERRIGAN_CHAIN_REACTION, item_names.KERRIGAN_PSIONIC_SHIFT
]
item_name_groups[ItemGroupNames.KERRIGAN_TIER_3] = kerrigan_tier_3 = [
item_names.TWIN_DRONES, item_names.AUTOMATED_EXTRACTORS, item_names.ZERGLING_RECONSTITUTION
]
item_name_groups[ItemGroupNames.KERRIGAN_TIER_4] = kerrigan_tier_4 = [
item_names.KERRIGAN_MEND, item_names.KERRIGAN_SPAWN_BANELINGS, item_names.KERRIGAN_WILD_MUTATION
]
item_name_groups[ItemGroupNames.KERRIGAN_TIER_5] = kerrigan_tier_5 = [
item_names.MALIGNANT_CREEP, item_names.VESPENE_EFFICIENCY, item_names.OVERLORD_IMPROVED_OVERLORDS
]
item_name_groups[ItemGroupNames.KERRIGAN_TIER_6] = kerrigan_tier_6 = [
item_names.KERRIGAN_INFEST_BROODLINGS, item_names.KERRIGAN_FURY, item_names.KERRIGAN_ABILITY_EFFICIENCY
]
item_name_groups[ItemGroupNames.KERRIGAN_TIER_7] = kerrigan_tier_7 = [
item_names.KERRIGAN_APOCALYPSE, item_names.KERRIGAN_SPAWN_LEVIATHAN, item_names.KERRIGAN_DROP_PODS
]
item_name_groups[ItemGroupNames.KERRIGAN_ULTIMATES] = kerrigan_ultimates = [
*kerrigan_tier_7, item_names.KERRIGAN_ASSIMILATION_AURA, item_names.KERRIGAN_IMMOBILIZATION_WAVE
]
item_name_groups[ItemGroupNames.KERRIGAN_NON_ULTIMATES] = kerrigan_non_ulimates = [
item for item in kerrigan_abilities if item not in kerrigan_ultimates
]
item_name_groups[ItemGroupNames.KERRIGAN_LOGIC_ULTIMATES] = kerrigan_logic_ultimates = [
item for item in kerrigan_ultimates if item != item_names.KERRIGAN_ASSIMILATION_AURA
]
item_name_groups[ItemGroupNames.KERRIGAN_NON_ULTIMATE_ACTIVE_ABILITIES] = kerrigan_non_ulimate_active_abilities = [
item for item in kerrigan_non_ulimates if item in kerrigan_active_abilities
]
item_name_groups[ItemGroupNames.KERRIGAN_HOTS_ABILITIES] = kerrigan_hots_abilities = [
ability for tiers in [
kerrigan_tier_1, kerrigan_tier_2, kerrigan_tier_4, kerrigan_tier_6, kerrigan_tier_7
] for ability in tiers
]
item_name_groups[ItemGroupNames.OVERLORD_UPGRADES] = [
item_names.OVERLORD_ANTENNAE,
item_names.OVERLORD_VENTRAL_SACS,
item_names.OVERLORD_GENERATE_CREEP,
item_names.OVERLORD_PNEUMATIZED_CARAPACE,
item_names.OVERLORD_IMPROVED_OVERLORDS,
item_names.OVERLORD_OVERSEER_ASPECT,
]
# Zerg Upgrades
item_name_groups[ItemGroupNames.HOTS_STRAINS] = hots_strains = [
item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Strain
]
item_name_groups[ItemGroupNames.HOTS_MUTATIONS] = hots_mutations = [
item_names.ZERGLING_HARDENED_CARAPACE, item_names.ZERGLING_ADRENAL_OVERLOAD, item_names.ZERGLING_METABOLIC_BOOST,
item_names.BANELING_CORROSIVE_ACID, item_names.BANELING_RUPTURE, item_names.BANELING_REGENERATIVE_ACID,
item_names.ROACH_HYDRIODIC_BILE, item_names.ROACH_ADAPTIVE_PLATING, item_names.ROACH_TUNNELING_CLAWS,
item_names.HYDRALISK_FRENZY, item_names.HYDRALISK_ANCILLARY_CARAPACE, item_names.HYDRALISK_GROOVED_SPINES,
item_names.SWARM_HOST_BURROW, item_names.SWARM_HOST_RAPID_INCUBATION, item_names.SWARM_HOST_PRESSURIZED_GLANDS,
item_names.MUTALISK_VICIOUS_GLAIVE, item_names.MUTALISK_RAPID_REGENERATION, item_names.MUTALISK_SUNDERING_GLAIVE,
item_names.ULTRALISK_BURROW_CHARGE, item_names.ULTRALISK_TISSUE_ASSIMILATION, item_names.ULTRALISK_MONARCH_BLADES,
]
item_name_groups[ItemGroupNames.HOTS_GLOBAL_UPGRADES] = hots_global_upgrades = [
item_names.ZERGLING_RECONSTITUTION,
item_names.OVERLORD_IMPROVED_OVERLORDS,
item_names.AUTOMATED_EXTRACTORS,
item_names.TWIN_DRONES,
item_names.MALIGNANT_CREEP,
item_names.VESPENE_EFFICIENCY,
]
item_name_groups[ItemGroupNames.HOTS_ITEMS] = vanilla_hots_items = (
hots_units
+ hots_buildings
+ kerrigan_hots_abilities
+ hots_mutations
+ hots_strains
+ hots_global_upgrades
+ zerg_generic_upgrades
)
# Zerg - Infested Terran (Stukov Co-op)
item_name_groups[ItemGroupNames.INF_TERRAN_UNITS] = infterr_units = [
item_names.INFESTED_MARINE,
item_names.INFESTED_BUNKER,
item_names.BULLFROG,
item_names.INFESTED_DIAMONDBACK,
item_names.INFESTED_SIEGE_TANK,
item_names.INFESTED_LIBERATOR,
item_names.INFESTED_BANSHEE,
]
item_name_groups[ItemGroupNames.INF_TERRAN_UPGRADES] = infterr_upgrades = [
item_names.INFESTED_SCV_BUILD_CHARGES,
item_names.INFESTED_MARINE_PLAGUED_MUNITIONS,
item_names.INFESTED_MARINE_RETINAL_AUGMENTATION,
item_names.INFESTED_BUNKER_CALCIFIED_ARMOR,
item_names.INFESTED_BUNKER_REGENERATIVE_PLATING,
item_names.INFESTED_BUNKER_ENGORGED_BUNKERS,
item_names.BULLFROG_WILD_MUTATION,
item_names.BULLFROG_BROODLINGS,
item_names.BULLFROG_HARD_IMPACT,
item_names.BULLFROG_RANGE,
item_names.INFESTED_DIAMONDBACK_CAUSTIC_MUCUS,
item_names.INFESTED_DIAMONDBACK_CONCENTRATED_SPEW,
item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE,
item_names.INFESTED_DIAMONDBACK_VIOLENT_ENZYMES,
item_names.INFESTED_SIEGE_TANK_ACIDIC_ENZYMES,
item_names.INFESTED_SIEGE_TANK_BALANCED_ROOTS,
item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL,
item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS,
item_names.INFESTED_SIEGE_TANK_SEISMIC_SONAR,
item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL,
item_names.INFESTED_LIBERATOR_DEFENDER_MODE,
item_names.INFESTED_LIBERATOR_VIRAL_CONTAMINATION,
item_names.INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS,
item_names.INFESTED_BANSHEE_BRACED_EXOSKELETON,
item_names.INFESTED_BANSHEE_RAPID_HIBERNATION,
item_names.INFESTED_DIAMONDBACK_FRIGHTFUL_FLESHWELDER,
item_names.INFESTED_SIEGE_TANK_FRIGHTFUL_FLESHWELDER,
item_names.INFESTED_LIBERATOR_FRIGHTFUL_FLESHWELDER,
item_names.INFESTED_BANSHEE_FRIGHTFUL_FLESHWELDER,
item_names.INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD,
item_names.INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS,
]
item_name_groups[ItemGroupNames.INF_TERRAN_ITEMS] = (
infterr_units
+ infterr_upgrades
+ [item_names.INFESTED_MISSILE_TURRET]
)
# Protoss
item_name_groups[ItemGroupNames.PROTOSS_ITEMS] = protoss_items = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.race == SC2Race.PROTOSS
]
item_name_groups[ItemGroupNames.PROTOSS_UNITS] = protoss_units = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type in (item_tables.ProtossItemType.Unit, item_tables.ProtossItemType.Unit_2)
]
protoss_ground_wa = [
item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.SUPPLICANT,
item_names.SENTRY, item_names.ENERGIZER,
item_names.STALKER, item_names.INSTIGATOR, item_names.SLAYER, item_names.DRAGOON, item_names.ADEPT,
item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT,
item_names.DARK_TEMPLAR, item_names.BLOOD_HUNTER, item_names.AVENGER,
item_names.DARK_ARCHON,
item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD, item_names.STALWART,
item_names.COLOSSUS, item_names.WRATHWALKER,
item_names.REAVER,
]
protoss_air_wa = [
item_names.WARP_PRISM_PHASE_BLASTER,
item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR, item_names.SKIRMISHER,
item_names.VOID_RAY, item_names.DESTROYER, item_names.PULSAR, item_names.DAWNBRINGER,
item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME,
item_names.SCOUT, item_names.TEMPEST, item_names.MOTHERSHIP,
item_names.ARBITER, item_names.ORACLE, item_names.OPPRESSOR,
item_names.CALADRIUS, item_names.MISTWING,
]
item_name_groups[ItemGroupNames.PROTOSS_GENERIC_UPGRADES] = protoss_generic_upgrades = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type == item_tables.ProtossItemType.Upgrade
]
item_name_groups[ItemGroupNames.LOTV_UNITS] = lotv_units = [
item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL,
item_names.STALKER, item_names.DRAGOON, item_names.ADEPT,
item_names.SENTRY, item_names.HAVOC, item_names.ENERGIZER,
item_names.HIGH_TEMPLAR, item_names.DARK_ARCHON, item_names.ASCENDANT,
item_names.DARK_TEMPLAR, item_names.AVENGER, item_names.BLOOD_HUNTER,
item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD,
item_names.COLOSSUS, item_names.WRATHWALKER, item_names.REAVER,
item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR,
item_names.VOID_RAY, item_names.DESTROYER, item_names.ARBITER,
item_names.CARRIER, item_names.TEMPEST, item_names.MOTHERSHIP,
]
item_name_groups[ItemGroupNames.PROPHECY_UNITS] = prophecy_units = [
item_names.ZEALOT, item_names.STALKER, item_names.HIGH_TEMPLAR, item_names.DARK_TEMPLAR,
item_names.OBSERVER, item_names.COLOSSUS,
item_names.PHOENIX, item_names.VOID_RAY, item_names.CARRIER,
]
item_name_groups[ItemGroupNames.PROPHECY_BUILDINGS] = prophecy_buildings = [
item_names.PHOTON_CANNON,
]
item_name_groups[ItemGroupNames.GATEWAY_UNITS] = gateway_units = [
item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.SUPPLICANT,
item_names.STALKER, item_names.INSTIGATOR, item_names.SLAYER,
item_names.SENTRY, item_names.HAVOC, item_names.ENERGIZER,
item_names.DRAGOON, item_names.ADEPT, item_names.DARK_ARCHON,
item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT,
item_names.DARK_TEMPLAR, item_names.AVENGER, item_names.BLOOD_HUNTER,
]
item_name_groups[ItemGroupNames.ROBO_UNITS] = robo_units = [
item_names.WARP_PRISM, item_names.OBSERVER,
item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD, item_names.STALWART,
item_names.COLOSSUS, item_names.WRATHWALKER,
item_names.REAVER, item_names.DISRUPTOR,
]
item_name_groups[ItemGroupNames.STARGATE_UNITS] = stargate_units = [
item_names.PHOENIX, item_names.SKIRMISHER, item_names.MIRAGE, item_names.CORSAIR,
item_names.VOID_RAY, item_names.DESTROYER, item_names.PULSAR, item_names.DAWNBRINGER,
item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME,
item_names.TEMPEST, item_names.SCOUT, item_names.MOTHERSHIP,
item_names.ARBITER, item_names.ORACLE, item_names.OPPRESSOR,
item_names.CALADRIUS, item_names.MISTWING,
]
item_name_groups[ItemGroupNames.PROTOSS_BUILDINGS] = protoss_buildings = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type == item_tables.ProtossItemType.Building
]
item_name_groups[ItemGroupNames.AIUR_UNITS] = [
item_names.ZEALOT, item_names.DRAGOON, item_names.SENTRY, item_names.AVENGER, item_names.HIGH_TEMPLAR,
item_names.IMMORTAL, item_names.REAVER,
item_names.PHOENIX, item_names.SCOUT, item_names.ARBITER, item_names.CARRIER,
]
item_name_groups[ItemGroupNames.NERAZIM_UNITS] = [
item_names.CENTURION, item_names.STALKER, item_names.DARK_TEMPLAR, item_names.SIGNIFIER, item_names.DARK_ARCHON,
item_names.ANNIHILATOR,
item_names.CORSAIR, item_names.ORACLE, item_names.VOID_RAY, item_names.MISTWING,
]
item_name_groups[ItemGroupNames.TAL_DARIM_UNITS] = [
item_names.SUPPLICANT, item_names.SLAYER, item_names.HAVOC, item_names.BLOOD_HUNTER, item_names.ASCENDANT,
item_names.VANGUARD, item_names.WRATHWALKER,
item_names.SKIRMISHER, item_names.DESTROYER, item_names.SKYLORD, item_names.MOTHERSHIP, item_names.OPPRESSOR,
]
item_name_groups[ItemGroupNames.PURIFIER_UNITS] = [
item_names.SENTINEL, item_names.ADEPT, item_names.INSTIGATOR, item_names.ENERGIZER,
item_names.STALWART, item_names.COLOSSUS, item_names.DISRUPTOR,
item_names.MIRAGE, item_names.DAWNBRINGER, item_names.TRIREME, item_names.TEMPEST,
item_names.CALADRIUS,
]
item_name_groups[ItemGroupNames.SOA_ITEMS] = soa_items = [
*[item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ProtossItemType.Spear_Of_Adun],
item_names.SOA_PROGRESSIVE_PROXY_PYLON,
]
lotv_soa_items = [item_name for item_name in soa_items if item_name != item_names.SOA_PYLON_OVERCHARGE]
item_name_groups[ItemGroupNames.PROTOSS_GLOBAL_UPGRADES] = [
item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ProtossItemType.Solarite_Core
]
item_name_groups[ItemGroupNames.LOTV_GLOBAL_UPGRADES] = lotv_global_upgrades = [
item_names.NEXUS_OVERCHARGE,
item_names.ORBITAL_ASSIMILATORS,
item_names.WARP_HARMONIZATION,
item_names.MATRIX_OVERLOAD,
item_names.GUARDIAN_SHELL,
item_names.RECONSTRUCTION_BEAM,
]
item_name_groups[ItemGroupNames.WAR_COUNCIL] = war_council_upgrades = [
item_name for item_name, item_data in item_tables.item_table.items()
if item_data.type in (item_tables.ProtossItemType.War_Council, item_tables.ProtossItemType.War_Council_2)
]
lotv_war_council_upgrades = [
item_name for item_name, item_data in item_tables.item_table.items()
if (
item_name in war_council_upgrades
and item_data.parent in item_name_groups[ItemGroupNames.LOTV_UNITS]
# Destroyers get a custom (non-vanilla) buff, not a nerf over their vanilla council state
and item_name != item_names.DESTROYER_REFORGED_BLOODSHARD_CORE
)
]
item_name_groups[ItemGroupNames.LOTV_ITEMS] = vanilla_lotv_items = (
lotv_units
+ protoss_buildings
+ lotv_soa_items
+ lotv_global_upgrades
+ protoss_generic_upgrades
+ lotv_war_council_upgrades
)
item_name_groups[ItemGroupNames.VANILLA_ITEMS] = vanilla_items = (
vanilla_wol_items + vanilla_hots_items + vanilla_lotv_items
)
item_name_groups[ItemGroupNames.OVERPOWERED_ITEMS] = overpowered_items = [
# Terran general
item_names.SIEGE_TANK_GRADUATING_RANGE,
item_names.RAVEN_HUNTER_SEEKER_WEAPON,
item_names.BATTLECRUISER_ATX_LASER_BATTERY,
item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL,
item_names.MECHANICAL_KNOW_HOW,
item_names.MERCENARY_MUNITIONS,
# Terran Mind Control
item_names.HIVE_MIND_EMULATOR,
item_names.PSI_INDOCTRINATOR,
item_names.ARGUS_AMPLIFIER,
# Zerg Mind Control
item_names.INFESTOR,
# Protoss Mind Control
item_names.DARK_ARCHON_INDOMITABLE_WILL,
# Nova
item_names.NOVA_PLASMA_RIFLE,
# Kerrigan
item_names.KERRIGAN_APOCALYPSE,
item_names.KERRIGAN_DROP_PODS,
item_names.KERRIGAN_SPAWN_LEVIATHAN,
item_names.KERRIGAN_IMMOBILIZATION_WAVE,
# SOA
item_names.SOA_TIME_STOP,
item_names.SOA_SOLAR_LANCE,
item_names.SOA_DEPLOY_FENIX,
# Note: This is more an issue of having multiple ults at the same time, rather than solar bombardment in particular.
# Can be removed from the list if we get an SOA ult combined cooldown or energy cost on it.
item_names.SOA_SOLAR_BOMBARDMENT,
# Protoss general
item_names.QUATRO,
item_names.MOTHERSHIP_INTEGRATED_POWER,
item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING,
# Mindless Broodwar garbage
item_names.GHOST_BARGAIN_BIN_PRICES,
item_names.SPECTRE_BARGAIN_BIN_PRICES,
item_names.REAVER_BARGAIN_BIN_PRICES,
item_names.SCOUT_SUPPLY_EFFICIENCY,
]
# Items not aimed to be officially released
# These need further balancing, and they shouldn't generate normally unless explicitly locked
# Added here to not confuse the client
item_name_groups[ItemGroupNames.UNRELEASED_ITEMS] = unreleased_items = [
item_names.PRIDE_OF_AUGUSTRGRAD,
item_names.SKY_FURY,
item_names.SHOCK_DIVISION,
item_names.BLACKHAMMER,
item_names.AEGIS_GUARD,
item_names.EMPERORS_SHADOW,
item_names.SON_OF_KORHAL,
item_names.BULWARK_COMPANY,
item_names.FIELD_RESPONSE_THETA,
item_names.EMPERORS_GUARDIAN,
item_names.NIGHT_HAWK,
item_names.NIGHT_WOLF,
item_names.EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES,
]
# A place for traits that were released before but are to be taken down by default.
# If an item gets split to multiple ones, the original one should be set deprecated instead (see Orbital Command for an example).
# This is a place if you want to nerf or disable by default a previously released trait.
# Currently, it disables only the topmost level of the progressives.
# Don't place here anything that's present in the vanilla campaigns (if it's overpowered, use overpowered items instead)
item_name_groups[ItemGroupNames.LEGACY_ITEMS] = legacy_items = [
item_names.ASCENDANT_ARCHON_MERGE,
]
item_name_groups[ItemGroupNames.KEYS] = keys = [
item_name for item_name in key_item_table.keys()
]

View File

@@ -0,0 +1,957 @@
"""
A complete collection of Starcraft 2 item names as strings.
Users of this data may make some assumptions about the structure of a name:
* The upgrade for a unit will end with the unit's name in parentheses
* Weapon / armor upgrades may be grouped by a common prefix specified within this file
"""
# Terran Units
MARINE = "Marine"
MEDIC = "Medic"
FIREBAT = "Firebat"
MARAUDER = "Marauder"
REAPER = "Reaper"
HELLION = "Hellion"
VULTURE = "Vulture"
GOLIATH = "Goliath"
DIAMONDBACK = "Diamondback"
SIEGE_TANK = "Siege Tank"
MEDIVAC = "Medivac"
WRAITH = "Wraith"
VIKING = "Viking"
BANSHEE = "Banshee"
BATTLECRUISER = "Battlecruiser"
GHOST = "Ghost"
SPECTRE = "Spectre"
THOR = "Thor"
RAVEN = "Raven"
SCIENCE_VESSEL = "Science Vessel"
PREDATOR = "Predator"
HERCULES = "Hercules"
# Extended units
LIBERATOR = "Liberator"
VALKYRIE = "Valkyrie"
WIDOW_MINE = "Widow Mine"
CYCLONE = "Cyclone"
HERC = "HERC"
WARHOUND = "Warhound"
DOMINION_TROOPER = "Dominion Trooper"
# Elites
PRIDE_OF_AUGUSTRGRAD = "Pride of Augustgrad"
SKY_FURY = "Sky Fury"
SHOCK_DIVISION = "Shock Division"
BLACKHAMMER = "Blackhammer"
AEGIS_GUARD = "Aegis Guard"
EMPERORS_SHADOW = "Emperor's Shadow"
SON_OF_KORHAL = "Son of Korhal"
BULWARK_COMPANY = "Bulwark Company"
FIELD_RESPONSE_THETA = "Field Response Theta"
EMPERORS_GUARDIAN = "Emperor's Guardian"
NIGHT_HAWK = "Night Hawk"
NIGHT_WOLF = "Night Wolf"
# Terran Buildings
BUNKER = "Bunker"
MISSILE_TURRET = "Missile Turret"
SENSOR_TOWER = "Sensor Tower"
PLANETARY_FORTRESS = "Planetary Fortress"
PERDITION_TURRET = "Perdition Turret"
# HIVE_MIND_EMULATOR = "Hive Mind Emulator"# moved to Lab / Global upgrades
# PSI_DISRUPTER = "Psi Disrupter" # moved to Lab / Global upgrades
DEVASTATOR_TURRET = "Devastator Turret"
# Terran Weapon / Armor Upgrades
TERRAN_UPGRADE_PREFIX = "Progressive Terran"
TERRAN_INFANTRY_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Infantry"
TERRAN_VEHICLE_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Vehicle"
TERRAN_SHIP_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Ship"
PROGRESSIVE_TERRAN_INFANTRY_WEAPON = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Weapon"
PROGRESSIVE_TERRAN_INFANTRY_ARMOR = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Armor"
PROGRESSIVE_TERRAN_VEHICLE_WEAPON = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Weapon"
PROGRESSIVE_TERRAN_VEHICLE_ARMOR = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Armor"
PROGRESSIVE_TERRAN_SHIP_WEAPON = f"{TERRAN_SHIP_UPGRADE_PREFIX} Weapon"
PROGRESSIVE_TERRAN_SHIP_ARMOR = f"{TERRAN_SHIP_UPGRADE_PREFIX} Armor"
PROGRESSIVE_TERRAN_WEAPON_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon Upgrade"
PROGRESSIVE_TERRAN_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Armor Upgrade"
PROGRESSIVE_TERRAN_INFANTRY_UPGRADE = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Upgrade"
PROGRESSIVE_TERRAN_VEHICLE_UPGRADE = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Upgrade"
PROGRESSIVE_TERRAN_SHIP_UPGRADE = f"{TERRAN_SHIP_UPGRADE_PREFIX} Upgrade"
PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon/Armor Upgrade"
# Mercenaries
WAR_PIGS = "War Pigs"
DEVIL_DOGS = "Devil Dogs"
HAMMER_SECURITIES = "Hammer Securities"
SPARTAN_COMPANY = "Spartan Company"
SIEGE_BREAKERS = "Siege Breakers"
HELS_ANGELS = "Hel's Angels"
DUSK_WINGS = "Dusk Wings"
JACKSONS_REVENGE = "Jackson's Revenge"
SKIBIS_ANGELS = "Skibi's Angels"
DEATH_HEADS = "Death Heads"
WINGED_NIGHTMARES = "Winged Nightmares"
MIDNIGHT_RIDERS = "Midnight Riders"
BRYNHILDS = "Brynhilds"
JOTUN = "Jotun"
# Lab / Global
ULTRA_CAPACITORS = "Ultra-Capacitors (Terran)"
VANADIUM_PLATING = "Vanadium Plating (Terran)"
ORBITAL_DEPOTS = "Orbital Depots (Terran)"
MICRO_FILTERING = "Micro-Filtering (Terran)"
AUTOMATED_REFINERY = "Automated Refinery (Terran)"
COMMAND_CENTER_COMMAND_CENTER_REACTOR = "Command Center Reactor (Command Center)"
COMMAND_CENTER_SCANNER_SWEEP = "Scanner Sweep (Command Center)"
COMMAND_CENTER_MULE = "MULE (Command Center)"
COMMAND_CENTER_EXTRA_SUPPLIES = "Extra Supplies (Command Center)"
TECH_REACTOR = "Tech Reactor (Terran)"
ORBITAL_STRIKE = "Orbital Strike (Barracks)"
CELLULAR_REACTOR = "Cellular Reactor (Terran)"
PROGRESSIVE_REGENERATIVE_BIO_STEEL = "Progressive Regenerative Bio-Steel (Terran)"
PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM = "Progressive Fire-Suppression System (Terran)"
STRUCTURE_ARMOR = "Structure Armor (Terran)"
HI_SEC_AUTO_TRACKING = "Hi-Sec Auto Tracking (Terran)"
ADVANCED_OPTICS = "Advanced Optics (Terran)"
ROGUE_FORCES = "Rogue Forces (Terran)"
MECHANICAL_KNOW_HOW = "Mechanical Know-how (Terran)"
MERCENARY_MUNITIONS = "Mercenary Munitions (Terran)"
PROGRESSIVE_FAST_DELIVERY = "Progressive Fast Delivery (Terran)"
RAPID_REINFORCEMENT = "Rapid Reinforcement (Terran)"
FUSION_CORE_FUSION_REACTOR = "Fusion Reactor (Fusion Core)"
PSI_DISRUPTER = "Psi Disrupter"
PSI_SCREEN = "Psi Screen (Psi Disrupter)"
SONIC_DISRUPTER = "Sonic Disrupter (Psi Disrupter)"
HIVE_MIND_EMULATOR = "Hive Mind Emulator"
PSI_INDOCTRINATOR = "Psi Indoctrinator (Hive Mind Emulator)"
ARGUS_AMPLIFIER = "Argus Amplifier (Hive Mind Emulator)"
SIGNAL_BEACON = "Signal Beacon (Terran)"
# Terran Unit Upgrades
BANSHEE_HYPERFLIGHT_ROTORS = "Hyperflight Rotors (Banshee)"
BANSHEE_INTERNAL_TECH_MODULE = "Internal Tech Module (Banshee)"
BANSHEE_LASER_TARGETING_SYSTEM = "Laser Targeting System (Banshee)"
BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS = "Progressive Cross-Spectrum Dampeners (Banshee)"
BANSHEE_SHOCKWAVE_MISSILE_BATTERY = "Shockwave Missile Battery (Banshee)"
BANSHEE_SHAPED_HULL = "Shaped Hull (Banshee)"
BANSHEE_ADVANCED_TARGETING_OPTICS = "Advanced Targeting Optics (Banshee)"
BANSHEE_DISTORTION_BLASTERS = "Distortion Blasters (Banshee)"
BANSHEE_ROCKET_BARRAGE = "Rocket Barrage (Banshee)"
BATTLECRUISER_ATX_LASER_BATTERY = "ATX Laser Battery (Battlecruiser)"
BATTLECRUISER_CLOAK = "Cloak (Battlecruiser)"
BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX = "Progressive Defensive Matrix (Battlecruiser)"
BATTLECRUISER_INTERNAL_TECH_MODULE = "Internal Tech Module (Battlecruiser)"
BATTLECRUISER_PROGRESSIVE_MISSILE_PODS = "Progressive Missile Pods (Battlecruiser)"
BATTLECRUISER_OPTIMIZED_LOGISTICS = "Optimized Logistics (Battlecruiser)"
BATTLECRUISER_TACTICAL_JUMP = "Tactical Jump (Battlecruiser)"
BATTLECRUISER_BEHEMOTH_PLATING = "Behemoth Plating (Battlecruiser)"
BATTLECRUISER_MOIRAI_IMPULSE_DRIVE = "Moirai Impulse Drive (Battlecruiser)"
BATTLECRUISER_BEHEMOTH_REACTOR = "Behemoth Reactor (Battlecruiser)"
BATTLECRUISER_FIELD_ASSIST_TARGETING_SYSTEM = "Field-Assist Target System (Battlecruiser)"
CYCLONE_MAG_FIELD_ACCELERATORS = "Mag-Field Accelerators (Cyclone)"
CYCLONE_MAG_FIELD_LAUNCHERS = "Mag-Field Launchers (Cyclone)"
CYCLONE_RAPID_FIRE_LAUNCHERS = "Rapid Fire Launchers (Cyclone)"
CYCLONE_TARGETING_OPTICS = "Targeting Optics (Cyclone)"
CYCLONE_RESOURCE_EFFICIENCY = "Resource Efficiency (Cyclone)"
CYCLONE_INTERNAL_TECH_MODULE = "Internal Tech Module (Cyclone)"
DIAMONDBACK_BURST_CAPACITORS = "Burst Capacitors (Diamondback)"
DIAMONDBACK_HYPERFLUXOR = "Hyperfluxor (Diamondback)"
DIAMONDBACK_RESOURCE_EFFICIENCY = "Resource Efficiency (Diamondback)"
DIAMONDBACK_SHAPED_HULL = "Shaped Hull (Diamondback)"
DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL = "Progressive Tri-Lithium Power Cell (Diamondback)"
DIAMONDBACK_MAGLEV_PROPULSION = "Maglev Propulsion (Diamondback)"
DOMINION_TROOPER_B2_HIGH_CAL_LMG = "B-2 High-Cal LMG (Dominion Trooper)"
DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER = "CPO-7 Salamander Flamethrower (Dominion Trooper)"
DOMINION_TROOPER_HAILSTORM_LAUNCHER = "Hailstorm Launcher (Dominion Trooper)"
DOMINION_TROOPER_ADVANCED_ALLOYS = "Advanced Alloys (Dominion Trooper)"
DOMINION_TROOPER_OPTIMIZED_LOGISTICS = "Optimized Logistics (Dominion Trooper)"
EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES = "Sovereign Tactical Missiles (Emperor's Shadow)"
FIREBAT_INCINERATOR_GAUNTLETS = "Incinerator Gauntlets (Firebat)"
FIREBAT_JUGGERNAUT_PLATING = "Juggernaut Plating (Firebat)"
FIREBAT_RESOURCE_EFFICIENCY = "Resource Efficiency (Firebat)"
FIREBAT_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Firebat)"
FIREBAT_INFERNAL_PRE_IGNITER = "Infernal Pre-Igniter (Firebat)"
FIREBAT_KINETIC_FOAM = "Kinetic Foam (Firebat)"
FIREBAT_NANO_PROJECTORS = "Nano Projectors (Firebat)"
GHOST_CRIUS_SUIT = "Crius Suit (Ghost)"
GHOST_EMP_ROUNDS = "EMP Rounds (Ghost)"
GHOST_LOCKDOWN = "Lockdown (Ghost)"
GHOST_OCULAR_IMPLANTS = "Ocular Implants (Ghost)"
GHOST_RESOURCE_EFFICIENCY = "Resource Efficiency (Ghost)"
GHOST_BARGAIN_BIN_PRICES = "Bargain Bin Prices (Ghost)"
GOLIATH_ARES_CLASS_TARGETING_SYSTEM = "Ares-Class Targeting System (Goliath)"
GOLIATH_JUMP_JETS = "Jump Jets (Goliath)"
GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM = "Multi-Lock Weapons System (Goliath)"
GOLIATH_OPTIMIZED_LOGISTICS = "Optimized Logistics (Goliath)"
GOLIATH_SHAPED_HULL = "Shaped Hull (Goliath)"
GOLIATH_RESOURCE_EFFICIENCY = "Resource Efficiency (Goliath)"
GOLIATH_INTERNAL_TECH_MODULE = "Internal Tech Module (Goliath)"
HELLION_HELLBAT = "Hellbat (Hellion Morph)"
HELLION_JUMP_JETS = "Jump Jets (Hellion)"
HELLION_OPTIMIZED_LOGISTICS = "Optimized Logistics (Hellion)"
HELLION_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Hellion)"
HELLION_SMART_SERVOS = "Smart Servos (Hellion)"
HELLION_THERMITE_FILAMENTS = "Thermite Filaments (Hellion)"
HELLION_TWIN_LINKED_FLAMETHROWER = "Twin-Linked Flamethrower (Hellion)"
HELLION_INFERNAL_PLATING = "Infernal Plating (Hellion)"
HERC_JUGGERNAUT_PLATING = "Juggernaut Plating (HERC)"
HERC_KINETIC_FOAM = "Kinetic Foam (HERC)"
HERC_RESOURCE_EFFICIENCY = "Resource Efficiency (HERC)"
HERC_GRAPPLE_PULL = "Grapple Pull (HERC)"
HERCULES_INTERNAL_FUSION_MODULE = "Internal Fusion Module (Hercules)"
HERCULES_TACTICAL_JUMP = "Tactical Jump (Hercules)"
LIBERATOR_ADVANCED_BALLISTICS = "Advanced Ballistics (Liberator)"
LIBERATOR_CLOAK = "Cloak (Liberator)"
LIBERATOR_LASER_TARGETING_SYSTEM = "Laser Targeting System (Liberator)"
LIBERATOR_OPTIMIZED_LOGISTICS = "Optimized Logistics (Liberator)"
LIBERATOR_RAID_ARTILLERY = "Raid Artillery (Liberator)"
LIBERATOR_SMART_SERVOS = "Smart Servos (Liberator)"
LIBERATOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Liberator)"
LIBERATOR_GUERILLA_MISSILES = "Guerilla Missiles (Liberator)"
LIBERATOR_UED_MISSILE_TECHNOLOGY = "UED Missile Technology (Liberator)"
MARAUDER_CONCUSSIVE_SHELLS = "Concussive Shells (Marauder)"
MARAUDER_INTERNAL_TECH_MODULE = "Internal Tech Module (Marauder)"
MARAUDER_KINETIC_FOAM = "Kinetic Foam (Marauder)"
MARAUDER_LASER_TARGETING_SYSTEM = "Laser Targeting System (Marauder)"
MARAUDER_MAGRAIL_MUNITIONS = "Magrail Munitions (Marauder)"
MARAUDER_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Marauder)"
MARAUDER_JUGGERNAUT_PLATING = "Juggernaut Plating (Marauder)"
MARINE_COMBAT_SHIELD = "Combat Shield (Marine)"
MARINE_LASER_TARGETING_SYSTEM = "Laser Targeting System (Marine)"
MARINE_MAGRAIL_MUNITIONS = "Magrail Munitions (Marine)"
MARINE_OPTIMIZED_LOGISTICS = "Optimized Logistics (Marine)"
MARINE_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Marine)"
MEDIC_ADVANCED_MEDIC_FACILITIES = "Advanced Medic Facilities (Medic)"
MEDIC_OPTICAL_FLARE = "Optical Flare (Medic)"
MEDIC_RESOURCE_EFFICIENCY = "Resource Efficiency (Medic)"
MEDIC_RESTORATION = "Restoration (Medic)"
MEDIC_STABILIZER_MEDPACKS = "Stabilizer Medpacks (Medic)"
MEDIC_ADAPTIVE_MEDPACKS = "Adaptive Medpacks (Medic)"
MEDIC_NANO_PROJECTOR = "Nano Projector (Medic)"
MEDIVAC_ADVANCED_HEALING_AI = "Advanced Healing AI (Medivac)"
MEDIVAC_AFTERBURNERS = "Afterburners (Medivac)"
MEDIVAC_EXPANDED_HULL = "Expanded Hull (Medivac)"
MEDIVAC_RAPID_DEPLOYMENT_TUBE = "Rapid Deployment Tube (Medivac)"
MEDIVAC_SCATTER_VEIL = "Scatter Veil (Medivac)"
MEDIVAC_ADVANCED_CLOAKING_FIELD = "Advanced Cloaking Field (Medivac)"
MEDIVAC_RAPID_REIGNITION_SYSTEMS = "Rapid Reignition Systems (Medivac)"
MEDIVAC_RESOURCE_EFFICIENCY = "Resource Efficiency (Medivac)"
PREDATOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Predator)"
PREDATOR_CLOAK = "Phase Cloak (Predator)"
PREDATOR_CHARGE = "Concussive Charge (Predator)"
PREDATOR_VESPENE_SYNTHESIS = "Vespene Synthesis (Predator)"
PREDATOR_ADAPTIVE_DEFENSES = "Adaptive Defenses (Predator)"
RAVEN_ANTI_ARMOR_MISSILE = "Anti-Armor Missile (Raven)"
RAVEN_BIO_MECHANICAL_REPAIR_DRONE = "Bio Mechanical Repair Drone (Raven)"
RAVEN_HUNTER_SEEKER_WEAPON = "Hunter-Seeker Weapon (Raven)"
RAVEN_INTERFERENCE_MATRIX = "Interference Matrix (Raven)"
RAVEN_INTERNAL_TECH_MODULE = "Internal Tech Module (Raven)"
RAVEN_RAILGUN_TURRET = "Railgun Turret (Raven)"
RAVEN_SPIDER_MINES = "Spider Mines (Raven)"
RAVEN_RESOURCE_EFFICIENCY = "Resource Efficiency (Raven)"
RAVEN_DURABLE_MATERIALS = "Durable Materials (Raven)"
REAPER_ADVANCED_CLOAKING_FIELD = "Advanced Cloaking Field (Reaper)"
REAPER_COMBAT_DRUGS = "Combat Drugs (Reaper)"
REAPER_G4_CLUSTERBOMB = "G-4 Clusterbomb (Reaper)"
REAPER_LASER_TARGETING_SYSTEM = "Laser Targeting System (Reaper)"
REAPER_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Reaper)"
REAPER_SPIDER_MINES = "Spider Mines (Reaper)"
REAPER_U238_ROUNDS = "U-238 Rounds (Reaper)"
REAPER_JET_PACK_OVERDRIVE = "Jet Pack Overdrive (Reaper)"
REAPER_RESOURCE_EFFICIENCY = "Resource Efficiency (Reaper)"
REAPER_BALLISTIC_FLIGHTSUIT = "Ballistic Flightsuit (Reaper)"
SCIENCE_VESSEL_DEFENSIVE_MATRIX = "Defensive Matrix (Science Vessel)"
SCIENCE_VESSEL_EMP_SHOCKWAVE = "EMP Shockwave (Science Vessel)"
SCIENCE_VESSEL_IMPROVED_NANO_REPAIR = "Improved Nano-Repair (Science Vessel)"
SCIENCE_VESSEL_MAGELLAN_COMPUTATION_SYSTEMS = "Magellan Computation Systems (Science Vessel)"
SCIENCE_VESSEL_TACTICAL_JUMP = "Tactical Jump (Science Vessel)"
SCV_ADVANCED_CONSTRUCTION = "Advanced Construction (SCV)"
SCV_DUAL_FUSION_WELDERS = "Dual-Fusion Welders (SCV)"
SCV_HOSTILE_ENVIRONMENT_ADAPTATION = "Hostile Environment Adaptation (SCV)"
SCV_CONSTRUCTION_JUMP_JETS = "Construction Jump Jets (SCV)"
SIEGE_TANK_ADVANCED_SIEGE_TECH = "Advanced Siege Tech (Siege Tank)"
SIEGE_TANK_GRADUATING_RANGE = "Graduating Range (Siege Tank)"
SIEGE_TANK_INTERNAL_TECH_MODULE = "Internal Tech Module (Siege Tank)"
SIEGE_TANK_JUMP_JETS = "Jump Jets (Siege Tank)"
SIEGE_TANK_LASER_TARGETING_SYSTEM = "Laser Targeting System (Siege Tank)"
SIEGE_TANK_MAELSTROM_ROUNDS = "Maelstrom Rounds (Siege Tank)"
SIEGE_TANK_SHAPED_BLAST = "Shaped Blast (Siege Tank)"
SIEGE_TANK_SMART_SERVOS = "Smart Servos (Siege Tank)"
SIEGE_TANK_SPIDER_MINES = "Spider Mines (Siege Tank)"
SIEGE_TANK_SHAPED_HULL = "Shaped Hull (Siege Tank)"
SIEGE_TANK_RESOURCE_EFFICIENCY = "Resource Efficiency (Siege Tank)"
SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK = "Progressive Transport Hook (Siege Tank)"
SIEGE_TANK_ALLTERRAIN_TREADS = "All-Terrain Treads (Siege Tank)"
SPECTRE_IMPALER_ROUNDS = "Impaler Rounds (Spectre)"
SPECTRE_NYX_CLASS_CLOAKING_MODULE = "Nyx-Class Cloaking Module (Spectre)"
SPECTRE_PSIONIC_LASH = "Psionic Lash (Spectre)"
SPECTRE_RESOURCE_EFFICIENCY = "Resource Efficiency (Spectre)"
SPECTRE_BARGAIN_BIN_PRICES = "Bargain Bin Prices (Spectre)"
SPIDER_MINE_CERBERUS_MINE = "Cerberus Mine (Spider Mine)"
SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION = "High Explosive Munition (Spider Mine)"
THOR_330MM_BARRAGE_CANNON = "330mm Barrage Cannon (Thor)"
THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL = "Progressive Immortality Protocol (Thor)"
THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD = "Progressive High Impact Payload (Thor)"
THOR_BUTTON_WITH_A_SKULL_ON_IT = "Button With a Skull on It (Thor)"
THOR_LASER_TARGETING_SYSTEM = "Laser Targeting System (Thor)"
THOR_LARGE_SCALE_FIELD_CONSTRUCTION = "Large Scale Field Construction (Thor)"
THOR_RAPID_RELOAD = "Rapid Reload (Thor)"
VALKYRIE_AFTERBURNERS = "Afterburners (Valkyrie)"
VALKYRIE_FLECHETTE_MISSILES = "Flechette Missiles (Valkyrie)"
VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS = "Enhanced Cluster Launchers (Valkyrie)"
VALKYRIE_SHAPED_HULL = "Shaped Hull (Valkyrie)"
VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR = "Launching Vector Compensator (Valkyrie)"
VALKYRIE_RESOURCE_EFFICIENCY = "Resource Efficiency (Valkyrie)"
VIKING_ANTI_MECHANICAL_MUNITION = "Anti-Mechanical Munition (Viking)"
VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM = "Phobos-Class Weapons System (Viking)"
VIKING_RIPWAVE_MISSILES = "Ripwave Missiles (Viking)"
VIKING_SMART_SERVOS = "Smart Servos (Viking)"
VIKING_SHREDDER_ROUNDS = "Shredder Rounds (Viking)"
VIKING_WILD_MISSILES = "W.I.L.D. Missiles (Viking)"
VIKING_AESIR_TURBINES = "Aesir Turbines (Viking)"
VULTURE_AUTO_LAUNCHERS = "Auto Launchers (Vulture)"
VULTURE_ION_THRUSTERS = "Ion Thrusters (Vulture)"
VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE = "Progressive Replenishable Magazine (Vulture)"
VULTURE_JERRYRIGGED_PATCHUP = "Jerry-Rigged Patchup (Vulture)"
WARHOUND_RESOURCE_EFFICIENCY = "Resource Efficiency (Warhound)"
WARHOUND_AXIOM_PLATING = "Axiom Plating (Warhound)"
WARHOUND_DEPLOY_TURRET = "Deploy Turret (Warhound)"
WIDOW_MINE_BLACK_MARKET_LAUNCHERS = "Black Market Launchers (Widow Mine)"
WIDOW_MINE_CONCEALMENT = "Concealment (Widow Mine)"
WIDOW_MINE_DEMOLITION_PAYLOAD = "Demolition Payload (Widow Mine)"
WIDOW_MINE_DRILLING_CLAWS = "Drilling Claws (Widow Mine)"
WIDOW_MINE_EXECUTIONER_MISSILES = "Executioner Missiles (Widow Mine)"
WIDOW_MINE_RESOURCE_EFFICIENCY = "Resource Efficiency (Widow Mine)"
WRAITH_ADVANCED_LASER_TECHNOLOGY = "Advanced Laser Technology (Wraith)"
WRAITH_DISPLACEMENT_FIELD = "Displacement Field (Wraith)"
WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS = "Progressive Tomahawk Power Cells (Wraith)"
WRAITH_TRIGGER_OVERRIDE = "Trigger Override (Wraith)"
WRAITH_INTERNAL_TECH_MODULE = "Internal Tech Module (Wraith)"
WRAITH_RESOURCE_EFFICIENCY = "Resource Efficiency (Wraith)"
# Terran Building upgrades
BUNKER_NEOSTEEL_BUNKER = "Neosteel Bunker (Bunker)"
BUNKER_PROJECTILE_ACCELERATOR = "Projectile Accelerator (Bunker)"
BUNKER_SHRIKE_TURRET = "Shrike Turret (Bunker)"
BUNKER_FORTIFIED_BUNKER = "Fortified Bunker (Bunker)"
DEVASTATOR_TURRET_ANTI_ARMOR_MUNITIONS = "Anti-Armor Munitions (Devastator Turret)"
DEVASTATOR_TURRET_CONCUSSIVE_GRENADES = "Concussive Grenades (Devastator Turret)"
DEVASTATOR_TURRET_RESOURCE_EFFICIENCY = "Resource Efficiency (Devastator Turret)"
MISSILE_TURRET_HELLSTORM_BATTERIES = "Hellstorm Batteries (Missile Turret)"
MISSILE_TURRET_TITANIUM_HOUSING = "Titanium Housing (Missile Turret)"
MISSILE_TURRET_RESOURCE_EFFICENCY = "Resource Efficiency (Missile Turret)"
PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS = "Progressive Augmented Thrusters (Planetary Fortress)"
PLANETARY_FORTRESS_IBIKS_TRACKING_SCANNERS = "Ibiks Tracking Scanners (Planetary Fortress)"
PLANETARY_FORTRESS_ORBITAL_MODULE = "Orbital Module (Planetary Fortress)"
SENSOR_TOWER_ASSISTIVE_TARGETING = "Assistive Targeting (Sensor Tower)"
SENSOR_TOWER_MUILTISPECTRUM_DOPPLER = "Multispectrum Doppler (Sensor Tower)"
# Nova
NOVA_GHOST_VISOR = "Ghost Visor (Nova Equipment)"
NOVA_RANGEFINDER_OCULUS = "Rangefinder Oculus (Nova Equipment)"
NOVA_DOMINATION = "Domination (Nova Ability)"
NOVA_BLINK = "Blink (Nova Ability)"
NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE = "Progressive Stealth Suit Module (Nova Suit Module)"
NOVA_ENERGY_SUIT_MODULE = "Energy Suit Module (Nova Suit Module)"
NOVA_ARMORED_SUIT_MODULE = "Armored Suit Module (Nova Suit Module)"
NOVA_JUMP_SUIT_MODULE = "Jump Suit Module (Nova Suit Module)"
NOVA_C20A_CANISTER_RIFLE = "C20A Canister Rifle (Nova Weapon)"
NOVA_HELLFIRE_SHOTGUN = "Hellfire Shotgun (Nova Weapon)"
NOVA_PLASMA_RIFLE = "Plasma Rifle (Nova Weapon)"
NOVA_MONOMOLECULAR_BLADE = "Monomolecular Blade (Nova Weapon)"
NOVA_BLAZEFIRE_GUNBLADE = "Blazefire Gunblade (Nova Weapon)"
NOVA_STIM_INFUSION = "Stim Infusion (Nova Gadget)"
NOVA_PULSE_GRENADES = "Pulse Grenades (Nova Gadget)"
NOVA_FLASHBANG_GRENADES = "Flashbang Grenades (Nova Gadget)"
NOVA_IONIC_FORCE_FIELD = "Ionic Force Field (Nova Gadget)"
NOVA_HOLO_DECOY = "Holo Decoy (Nova Gadget)"
NOVA_NUKE = "Tac Nuke Strike (Nova Ability)"
# Zerg Units
ZERGLING = "Zergling"
SWARM_QUEEN = "Swarm Queen"
ROACH = "Roach"
HYDRALISK = "Hydralisk"
ABERRATION = "Aberration"
MUTALISK = "Mutalisk"
SWARM_HOST = "Swarm Host"
INFESTOR = "Infestor"
ULTRALISK = "Ultralisk"
PYGALISK = "Pygalisk"
CORRUPTOR = "Corruptor"
SCOURGE = "Scourge"
BROOD_QUEEN = "Brood Queen"
DEFILER = "Defiler"
INFESTED_MARINE = "Infested Marine"
INFESTED_SIEGE_TANK = "Infested Siege Tank"
INFESTED_DIAMONDBACK = "Infested Diamondback"
BULLFROG = "Bullfrog"
INFESTED_BANSHEE = "Infested Banshee"
INFESTED_LIBERATOR = "Infested Liberator"
# Zerg Buildings
SPORE_CRAWLER = "Spore Crawler"
SPINE_CRAWLER = "Spine Crawler"
BILE_LAUNCHER = "Bile Launcher"
INFESTED_BUNKER = "Infested Bunker"
INFESTED_MISSILE_TURRET = "Infested Missile Turret"
NYDUS_WORM = "Nydus Worm"
ECHIDNA_WORM = "Echidna Worm"
# Zerg Weapon / Armor Upgrades
ZERG_UPGRADE_PREFIX = "Progressive Zerg"
ZERG_FLYER_UPGRADE_PREFIX = f"{ZERG_UPGRADE_PREFIX} Flyer"
PROGRESSIVE_ZERG_MELEE_ATTACK = f"{ZERG_UPGRADE_PREFIX} Melee Attack"
PROGRESSIVE_ZERG_MISSILE_ATTACK = f"{ZERG_UPGRADE_PREFIX} Missile Attack"
PROGRESSIVE_ZERG_GROUND_CARAPACE = f"{ZERG_UPGRADE_PREFIX} Ground Carapace"
PROGRESSIVE_ZERG_FLYER_ATTACK = f"{ZERG_FLYER_UPGRADE_PREFIX} Attack"
PROGRESSIVE_ZERG_FLYER_CARAPACE = f"{ZERG_FLYER_UPGRADE_PREFIX} Carapace"
PROGRESSIVE_ZERG_WEAPON_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon Upgrade"
PROGRESSIVE_ZERG_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Armor Upgrade"
PROGRESSIVE_ZERG_GROUND_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Ground Upgrade"
PROGRESSIVE_ZERG_FLYER_UPGRADE = f"{ZERG_FLYER_UPGRADE_PREFIX} Upgrade"
PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon/Armor Upgrade"
# Zerg Unit Upgrades
ZERGLING_HARDENED_CARAPACE = "Hardened Carapace (Zergling)"
ZERGLING_ADRENAL_OVERLOAD = "Adrenal Overload (Zergling)"
ZERGLING_METABOLIC_BOOST = "Metabolic Boost (Zergling)"
ZERGLING_SHREDDING_CLAWS = "Shredding Claws (Zergling)"
ROACH_HYDRIODIC_BILE = "Hydriodic Bile (Roach)"
ROACH_ADAPTIVE_PLATING = "Adaptive Plating (Roach)"
ROACH_TUNNELING_CLAWS = "Tunneling Claws (Roach)"
ROACH_GLIAL_RECONSTITUTION = "Glial Reconstitution (Roach)"
ROACH_ORGANIC_CARAPACE = "Organic Carapace (Roach)"
HYDRALISK_FRENZY = "Frenzy (Hydralisk)"
HYDRALISK_ANCILLARY_CARAPACE = "Ancillary Carapace (Hydralisk)"
HYDRALISK_GROOVED_SPINES = "Grooved Spines (Hydralisk)"
HYDRALISK_MUSCULAR_AUGMENTS = "Muscular Augments (Hydralisk)"
HYDRALISK_RESOURCE_EFFICIENCY = "Resource Efficiency (Hydralisk)"
BANELING_CORROSIVE_ACID = "Corrosive Acid (Baneling)"
BANELING_RUPTURE = "Rupture (Baneling)"
BANELING_REGENERATIVE_ACID = "Regenerative Acid (Baneling)"
BANELING_CENTRIFUGAL_HOOKS = "Centrifugal Hooks (Baneling)"
BANELING_TUNNELING_JAWS = "Tunneling Jaws (Baneling)"
BANELING_RAPID_METAMORPH = "Rapid Metamorph (Baneling)"
MUTALISK_VICIOUS_GLAIVE = "Vicious Glaive (Mutalisk)"
MUTALISK_RAPID_REGENERATION = "Rapid Regeneration (Mutalisk)"
MUTALISK_SUNDERING_GLAIVE = "Sundering Glaive (Mutalisk)"
MUTALISK_SEVERING_GLAIVE = "Severing Glaive (Mutalisk)"
MUTALISK_AERODYNAMIC_GLAIVE_SHAPE = "Aerodynamic Glaive Shape (Mutalisk)"
SPORE_CRAWLER_BIO_BONUS = "Caustic Enzymes (Spore Crawler)"
SWARM_HOST_BURROW = "Burrow (Swarm Host)"
SWARM_HOST_RAPID_INCUBATION = "Rapid Incubation (Swarm Host)"
SWARM_HOST_PRESSURIZED_GLANDS = "Pressurized Glands (Swarm Host)"
SWARM_HOST_LOCUST_METABOLIC_BOOST = "Locust Metabolic Boost (Swarm Host)"
SWARM_HOST_ENDURING_LOCUSTS = "Enduring Locusts (Swarm Host)"
SWARM_HOST_ORGANIC_CARAPACE = "Organic Carapace (Swarm Host)"
SWARM_HOST_RESOURCE_EFFICIENCY = "Resource Efficiency (Swarm Host)"
ULTRALISK_BURROW_CHARGE = "Burrow Charge (Ultralisk)"
ULTRALISK_TISSUE_ASSIMILATION = "Tissue Assimilation (Ultralisk)"
ULTRALISK_MONARCH_BLADES = "Monarch Blades (Ultralisk)"
ULTRALISK_ANABOLIC_SYNTHESIS = "Anabolic Synthesis (Ultralisk)"
ULTRALISK_CHITINOUS_PLATING = "Chitinous Plating (Ultralisk)"
ULTRALISK_ORGANIC_CARAPACE = "Organic Carapace (Ultralisk)"
ULTRALISK_RESOURCE_EFFICIENCY = "Resource Efficiency (Ultralisk)"
PYGALISK_STIM = "Stimpack (Pygalisk)"
PYGALISK_DUCAL_BLADES = "Ducal Blades (Pygalisk)"
PYGALISK_COMBAT_CARAPACE = "Combat Carapace (Pygalisk)"
CORRUPTOR_CORRUPTION = "Corruption (Corruptor)"
CORRUPTOR_CAUSTIC_SPRAY = "Caustic Spray (Corruptor)"
SCOURGE_VIRULENT_SPORES = "Virulent Spores (Scourge)"
SCOURGE_RESOURCE_EFFICIENCY = "Resource Efficiency (Scourge)"
SCOURGE_SWARM_SCOURGE = "Swarm Scourge (Scourge)"
DEVOURER_CORROSIVE_SPRAY = "Corrosive Spray (Devourer)"
DEVOURER_GAPING_MAW = "Gaping Maw (Devourer)"
DEVOURER_IMPROVED_OSMOSIS = "Improved Osmosis (Devourer)"
DEVOURER_PRESCIENT_SPORES = "Prescient Spores (Devourer)"
GUARDIAN_PROLONGED_DISPERSION = "Prolonged Dispersion (Guardian)"
GUARDIAN_PRIMAL_ADAPTATION = "Primal Adaptation (Guardian)"
GUARDIAN_SORONAN_ACID = "Soronan Acid (Guardian)"
GUARDIAN_PROPELLANT_SACS = "Propellant Sacs (Guardian)"
GUARDIAN_EXPLOSIVE_SPORES = "Explosive Spores (Guardian)"
GUARDIAN_PRIMORDIAL_FURY = "Primordial Fury (Guardian)"
IMPALER_ADAPTIVE_TALONS = "Adaptive Talons (Impaler)"
IMPALER_SECRETION_GLANDS = "Secretion Glands (Impaler)"
IMPALER_SUNKEN_SPINES = "Sunken Spines (Impaler)"
LURKER_SEISMIC_SPINES = "Seismic Spines (Lurker)"
LURKER_ADAPTED_SPINES = "Adapted Spines (Lurker)"
RAVAGER_POTENT_BILE = "Potent Bile (Ravager)"
RAVAGER_BLOATED_BILE_DUCTS = "Bloated Bile Ducts (Ravager)"
RAVAGER_DEEP_TUNNEL = "Deep Tunnel (Ravager)"
VIPER_PARASITIC_BOMB = "Parasitic Bomb (Viper)"
VIPER_PARALYTIC_BARBS = "Paralytic Barbs (Viper)"
VIPER_VIRULENT_MICROBES = "Virulent Microbes (Viper)"
BROOD_LORD_POROUS_CARTILAGE = "Porous Cartilage (Brood Lord)"
BROOD_LORD_BEHEMOTH_STELLARSKIN = "Behemoth Stellarskin (Brood Lord)"
BROOD_LORD_SPLITTER_MITOSIS = "Splitter Mitosis (Brood Lord)"
BROOD_LORD_RESOURCE_EFFICIENCY = "Resource Efficiency (Brood Lord)"
INFESTOR_INFESTED_TERRAN = "Infested Terran (Infestor)"
INFESTOR_MICROBIAL_SHROUD = "Microbial Shroud (Infestor)"
SWARM_QUEEN_SPAWN_LARVAE = "Spawn Larvae (Swarm Queen)"
SWARM_QUEEN_DEEP_TUNNEL = "Deep Tunnel (Swarm Queen)"
SWARM_QUEEN_ORGANIC_CARAPACE = "Organic Carapace (Swarm Queen)"
SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION = "Bio-Mechanical Transfusion (Swarm Queen)"
SWARM_QUEEN_RESOURCE_EFFICIENCY = "Resource Efficiency (Swarm Queen)"
SWARM_QUEEN_INCUBATOR_CHAMBER = "Incubator Chamber (Swarm Queen)"
BROOD_QUEEN_FUNGAL_GROWTH = "Fungal Growth (Brood Queen)"
BROOD_QUEEN_ENSNARE = "Ensnare (Brood Queen)"
BROOD_QUEEN_ENHANCED_MITOCHONDRIA = "Enhanced Mitochondria (Brood Queen)"
DEFILER_PATHOGEN_PROJECTORS = "Pathogen Projectors (Defiler)"
DEFILER_TRAPDOOR_ADAPTATION = "Trapdoor Adaptation (Defiler)"
DEFILER_PREDATORY_CONSUMPTION = "Predatory Consumption (Defiler)"
DEFILER_COMORBIDITY = "Comorbidity (Defiler)"
ABERRATION_MONSTROUS_RESILIENCE = "Monstrous Resilience (Aberration)"
ABERRATION_CONSTRUCT_REGENERATION = "Construct Regeneration (Aberration)"
ABERRATION_BANELING_INCUBATION = "Baneling Incubation (Aberration)"
ABERRATION_PROTECTIVE_COVER = "Protective Cover (Aberration)"
ABERRATION_RESOURCE_EFFICIENCY = "Resource Efficiency (Aberration)"
ABERRATION_PROGRESSIVE_BANELING_LAUNCH = "Progressive Baneling Launch (Aberration)"
CORRUPTOR_MONSTROUS_RESILIENCE = "Monstrous Resilience (Corruptor)"
CORRUPTOR_CONSTRUCT_REGENERATION = "Construct Regeneration (Corruptor)"
CORRUPTOR_SCOURGE_INCUBATION = "Scourge Incubation (Corruptor)"
CORRUPTOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Corruptor)"
PRIMAL_IGNITER_CONCENTRATED_FIRE = "Concentrated Fire (Primal Igniter)"
PRIMAL_IGNITER_PRIMAL_TENACITY = "Primal Tenacity (Primal Igniter)"
OVERLORD_IMPROVED_OVERLORDS = "Improved Overlords (Overlord)"
OVERLORD_VENTRAL_SACS = "Ventral Sacs (Overlord)"
OVERLORD_GENERATE_CREEP = "Generate Creep (Overlord)"
OVERLORD_PNEUMATIZED_CARAPACE = "Pneumatized Carapace (Overlord)"
OVERLORD_ANTENNAE = "Antennae (Overlord)"
INFESTED_SCV_BUILD_CHARGES = "Sustained Cultivation Ventricles (Infested SCV)"
INFESTED_MARINE_PLAGUED_MUNITIONS = "Plagued Munitions (Infested Marine)"
INFESTED_MARINE_RETINAL_AUGMENTATION = "Retinal Augmentation (Infested Marine)"
INFESTED_BUNKER_CALCIFIED_ARMOR = "Calcified Armor (Infested Bunker)"
INFESTED_BUNKER_REGENERATIVE_PLATING = "Regenerative Plating (Infested Bunker)"
INFESTED_BUNKER_ENGORGED_BUNKERS = "Engorged Bunkers (Infested Bunker)"
TYRANNOZOR_BARRAGE_OF_SPIKES = "Barrage of Spikes (Tyrannozor)"
TYRANNOZOR_TYRANTS_PROTECTION = "Tyrant's Protection (Tyrannozor)"
TYRANNOZOR_HEALING_ADAPTATION = "Healing Adaptation (Tyrannozor)"
TYRANNOZOR_IMPALING_STRIKE = "Impaling Strike (Tyrannozor)"
BILE_LAUNCHER_ARTILLERY_DUCTS = "Artillery Ducts (Bile Launcher)"
BILE_LAUNCHER_RAPID_BOMBARMENT = "Rapid Bombardment (Bile Launcher)"
NYDUS_WORM_ECHIDNA_WORM_SUBTERRANEAN_SCALES = "Subterranean Scales (Nydus Worm/Echidna Worm)"
NYDUS_WORM_ECHIDNA_WORM_JORMUNGANDR_STRAIN = "Jormungandr Strain (Nydus Worm/Echidna Worm)"
NYDUS_WORM_ECHIDNA_WORM_RESOURCE_EFFICIENCY = "Resource Efficiency (Nydus Worm/Echidna Worm)"
NYDUS_WORM_RAVENOUS_APPETITE = "Ravenous Appetite (Nydus Worm)"
ECHIDNA_WORM_OUROBOROS_STRAIN = "Ouroboros Strain (Echidna Worm)"
INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS = "Progressive Automated Mitosis (Infested Siege Tank)"
INFESTED_SIEGE_TANK_ACIDIC_ENZYMES = "Acidic Enzymes (Infested Siege Tank)"
INFESTED_SIEGE_TANK_DEEP_TUNNEL = "Deep Tunnel (Infested Siege Tank)"
INFESTED_SIEGE_TANK_SEISMIC_SONAR = "Seismic Sonar (Infested Siege Tank)"
INFESTED_SIEGE_TANK_BALANCED_ROOTS = "Balanced Roots (Infested Siege Tank)"
INFESTED_DIAMONDBACK_CAUSTIC_MUCUS = "Caustic Mucus (Infested Diamondback)"
INFESTED_DIAMONDBACK_VIOLENT_ENZYMES = "Violent Enzymes (Infested Diamondback)"
INFESTED_DIAMONDBACK_CONCENTRATED_SPEW = "Concentrated Spew (Infested Diamondback)"
INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE = "Progressive Fungal Snare (Infested Diamondback)"
INFESTED_BANSHEE_BRACED_EXOSKELETON = "Braced Exoskeleton (Infested Banshee)"
INFESTED_BANSHEE_RAPID_HIBERNATION = "Rapid Hibernation (Infested Banshee)"
INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS = "Fleshfused Targeting Optics (Infested Banshee)"
INFESTED_LIBERATOR_CLOUD_DISPERSAL = "Cloud Dispersal (Infested Liberator)"
INFESTED_LIBERATOR_VIRAL_CONTAMINATION = "Viral Contamination (Infested Liberator)"
INFESTED_LIBERATOR_DEFENDER_MODE = "Defender Mode (Infested Liberator)"
INFESTED_SIEGE_TANK_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Siege Tank)"
INFESTED_DIAMONDBACK_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Diamondback)"
INFESTED_BANSHEE_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Banshee)"
INFESTED_LIBERATOR_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Liberator)"
INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD = "Bioelectric Payload (Infested Missile Turret)"
INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS = "Acid Spore Vents (Infested Missile Turret)"
BULLFROG_WILD_MUTATION = "Mutagen Vents (Bullfrog)"
BULLFROG_BROODLINGS = "Suffused With Vermin (Bullfrog)"
BULLFROG_HARD_IMPACT = "Lethal Impact (Bullfrog)"
BULLFROG_RANGE = "Catalytic Boosters (Bullfrog)"
# Zerg Strains
ZERGLING_RAPTOR_STRAIN = "Raptor Strain (Zergling)"
ZERGLING_SWARMLING_STRAIN = "Swarmling Strain (Zergling)"
ROACH_VILE_STRAIN = "Vile Strain (Roach)"
ROACH_CORPSER_STRAIN = "Corpser Strain (Roach)"
BANELING_SPLITTER_STRAIN = "Splitter Strain (Baneling)"
BANELING_HUNTER_STRAIN = "Hunter Strain (Baneling)"
SWARM_HOST_CARRION_STRAIN = "Carrion Strain (Swarm Host)"
SWARM_HOST_CREEPER_STRAIN = "Creeper Strain (Swarm Host)"
ULTRALISK_NOXIOUS_STRAIN = "Noxious Strain (Ultralisk)"
ULTRALISK_TORRASQUE_STRAIN = "Torrasque Strain (Ultralisk)"
# Morphs
ZERGLING_BANELING_ASPECT = "Baneling"
HYDRALISK_IMPALER_ASPECT = "Impaler"
HYDRALISK_LURKER_ASPECT = "Lurker"
MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT = "Brood Lord"
MUTALISK_CORRUPTOR_VIPER_ASPECT = "Viper"
MUTALISK_CORRUPTOR_GUARDIAN_ASPECT = "Guardian"
MUTALISK_CORRUPTOR_DEVOURER_ASPECT = "Devourer"
ROACH_RAVAGER_ASPECT = "Ravager"
OVERLORD_OVERSEER_ASPECT = "Overseer"
ROACH_PRIMAL_IGNITER_ASPECT = "Primal Igniter"
ULTRALISK_TYRANNOZOR_ASPECT = "Tyrannozor"
# Zerg Mercs
INFESTED_MEDICS = "Infested Medics"
INFESTED_SIEGE_BREAKERS = "Infested Siege Breakers"
INFESTED_DUSK_WINGS = "Infested Dusk Wings"
DEVOURING_ONES = "Devouring Ones"
HUNTER_KILLERS = "Hunter Killers"
TORRASQUE_MERC = "Wise Old Torrasque"
HUNTERLING = "Hunterling"
YGGDRASIL = "Yggdrasil"
CAUSTIC_HORRORS = "Caustic Horrors"
# Kerrigan Upgrades
KERRIGAN_KINETIC_BLAST = "Kinetic Blast (Kerrigan Ability)"
KERRIGAN_HEROIC_FORTITUDE = "Heroic Fortitude (Kerrigan Passive)"
KERRIGAN_LEAPING_STRIKE = "Leaping Strike (Kerrigan Ability)"
KERRIGAN_CRUSHING_GRIP = "Crushing Grip (Kerrigan Ability)"
KERRIGAN_CHAIN_REACTION = "Chain Reaction (Kerrigan Passive)"
KERRIGAN_PSIONIC_SHIFT = "Psionic Shift (Kerrigan Ability)"
KERRIGAN_WILD_MUTATION = "Wild Mutation (Kerrigan Ability)"
KERRIGAN_SPAWN_BANELINGS = "Spawn Banelings (Kerrigan Ability)"
KERRIGAN_MEND = "Mend (Kerrigan Ability)"
KERRIGAN_INFEST_BROODLINGS = "Infest Broodlings (Kerrigan Passive)"
KERRIGAN_FURY = "Fury (Kerrigan Passive)"
KERRIGAN_ABILITY_EFFICIENCY = "Ability Efficiency (Kerrigan Passive)"
KERRIGAN_APOCALYPSE = "Apocalypse (Kerrigan Ability)"
KERRIGAN_SPAWN_LEVIATHAN = "Spawn Leviathan (Kerrigan Ability)"
KERRIGAN_DROP_PODS = "Drop-Pods (Kerrigan Ability)"
KERRIGAN_ASSIMILATION_AURA = "Assimilation Aura (Kerrigan Ability)"
KERRIGAN_IMMOBILIZATION_WAVE = "Immobilization Wave (Kerrigan Ability)"
KERRIGAN_PRIMAL_FORM = "Primal Form (Kerrigan)"
# Misc Upgrades
ZERGLING_RECONSTITUTION = "Zergling Reconstitution (Zerg)"
AUTOMATED_EXTRACTORS = "Automated Extractors (Zerg)"
TWIN_DRONES = "Twin Drones (Zerg)"
MALIGNANT_CREEP = "Malignant Creep (Zerg)"
VESPENE_EFFICIENCY = "Vespene Efficiency (Zerg)"
ZERG_CREEP_STOMACH = "Creep Stomach (Zerg)"
ZERG_EXCAVATING_CLAWS = "Excavating Claws (Zerg)"
HIVE_CLUSTER_MATURATION = "Hive Cluster Maturation (Zerg)"
MACROSCOPIC_RECUPERATION = "Macroscopic Recuperation (Zerg)"
BIOMECHANICAL_STOCKPILING = "Bio-Mechanical Stockpiling (Zerg)"
BROODLING_SPORE_SATURATION = "Broodling Spore Saturation (Zerg)"
UNRESTRICTED_MUTATION = "Unrestricted Mutation (Zerg)"
CELL_DIVISION = "Cell Division (Zerg)"
EVOLUTIONARY_LEAP = "Evolutionary Leap (Zerg)"
SELF_SUFFICIENT = "Self-Sufficient (Zerg)"
# Kerrigan Levels
KERRIGAN_LEVELS_1 = "1 Kerrigan Level"
KERRIGAN_LEVELS_2 = "2 Kerrigan Levels"
KERRIGAN_LEVELS_3 = "3 Kerrigan Levels"
KERRIGAN_LEVELS_4 = "4 Kerrigan Levels"
KERRIGAN_LEVELS_5 = "5 Kerrigan Levels"
KERRIGAN_LEVELS_6 = "6 Kerrigan Levels"
KERRIGAN_LEVELS_7 = "7 Kerrigan Levels"
KERRIGAN_LEVELS_8 = "8 Kerrigan Levels"
KERRIGAN_LEVELS_9 = "9 Kerrigan Levels"
KERRIGAN_LEVELS_10 = "10 Kerrigan Levels"
KERRIGAN_LEVELS_14 = "14 Kerrigan Levels"
KERRIGAN_LEVELS_35 = "35 Kerrigan Levels"
KERRIGAN_LEVELS_70 = "70 Kerrigan Levels"
# Protoss Units
ZEALOT = "Zealot"
STALKER = "Stalker"
HIGH_TEMPLAR = "High Templar"
DARK_TEMPLAR = "Dark Templar"
IMMORTAL = "Immortal"
COLOSSUS = "Colossus"
PHOENIX = "Phoenix"
VOID_RAY = "Void Ray"
CARRIER = "Carrier"
SKYLORD = "Skylord"
TRIREME = "Trireme"
OBSERVER = "Observer"
CENTURION = "Centurion"
SENTINEL = "Sentinel"
SUPPLICANT = "Supplicant"
INSTIGATOR = "Instigator"
SLAYER = "Slayer"
SENTRY = "Sentry"
ENERGIZER = "Energizer"
HAVOC = "Havoc"
SIGNIFIER = "Signifier"
ASCENDANT = "Ascendant"
AVENGER = "Avenger"
BLOOD_HUNTER = "Blood Hunter"
DRAGOON = "Dragoon"
DARK_ARCHON = "Dark Archon"
ADEPT = "Adept"
WARP_PRISM = "Warp Prism"
ANNIHILATOR = "Annihilator"
VANGUARD = "Vanguard"
STALWART = "Stalwart"
WRATHWALKER = "Wrathwalker"
REAVER = "Reaver"
DISRUPTOR = "Disruptor"
MIRAGE = "Mirage"
SKIRMISHER = "Skirmisher"
CORSAIR = "Corsair"
DESTROYER = "Destroyer"
PULSAR = "Pulsar"
DAWNBRINGER = "Dawnbringer"
SCOUT = "Scout"
OPPRESSOR = "Oppressor"
CALADRIUS = "Caladrius"
MISTWING = "Mist Wing"
TEMPEST = "Tempest"
MOTHERSHIP = "Mothership"
ARBITER = "Arbiter"
ORACLE = "Oracle"
# Upgrades
PROTOSS_UPGRADE_PREFIX = "Progressive Protoss"
PROTOSS_GROUND_UPGRADE_PREFIX = f"{PROTOSS_UPGRADE_PREFIX} Ground"
PROTOSS_AIR_UPGRADE_PREFIX = f"{PROTOSS_UPGRADE_PREFIX} Air"
PROGRESSIVE_PROTOSS_GROUND_WEAPON = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Weapon"
PROGRESSIVE_PROTOSS_GROUND_ARMOR = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Armor"
PROGRESSIVE_PROTOSS_SHIELDS = f"{PROTOSS_UPGRADE_PREFIX} Shields"
PROGRESSIVE_PROTOSS_AIR_WEAPON = f"{PROTOSS_AIR_UPGRADE_PREFIX} Weapon"
PROGRESSIVE_PROTOSS_AIR_ARMOR = f"{PROTOSS_AIR_UPGRADE_PREFIX} Armor"
PROGRESSIVE_PROTOSS_WEAPON_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon Upgrade"
PROGRESSIVE_PROTOSS_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Armor Upgrade"
PROGRESSIVE_PROTOSS_GROUND_UPGRADE = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Upgrade"
PROGRESSIVE_PROTOSS_AIR_UPGRADE = f"{PROTOSS_AIR_UPGRADE_PREFIX} Upgrade"
PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon/Armor Upgrade"
# Buildings
PHOTON_CANNON = "Photon Cannon"
KHAYDARIN_MONOLITH = "Khaydarin Monolith"
SHIELD_BATTERY = "Shield Battery"
# Unit Upgrades
SUPPLICANT_BLOOD_SHIELD = "Blood Shield (Supplicant)"
SUPPLICANT_SOUL_AUGMENTATION = "Soul Augmentation (Supplicant)"
SUPPLICANT_ENDLESS_SERVITUDE = "Endless Servitude (Supplicant)"
SUPPLICANT_ZENITH_PITCH = "Zenith Pitch (Supplicant)"
SUPPLICANT_SACRIFICE = "Sacrifice (Supplicant)"
ADEPT_SHOCKWAVE = "Shockwave (Adept)"
ADEPT_RESONATING_GLAIVES = "Resonating Glaives (Adept)"
ADEPT_PHASE_BULWARK = "Phase Bulwark (Adept)"
STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES = "Disintegrating Particles (Stalker/Instigator/Slayer)"
STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION = "Particle Reflection (Stalker/Instigator/Slayer)"
INSTIGATOR_BLINK_OVERDRIVE = "Blink Overdrive (Instigator)"
INSTIGATOR_RECONSTRUCTION = "Reconstruction (Instigator)"
DRAGOON_CONCENTRATED_ANTIMATTER = "Concentrated Antimatter (Dragoon)"
DRAGOON_TRILLIC_COMPRESSION_SYSTEM = "Trillic Compression System (Dragoon)"
DRAGOON_SINGULARITY_CHARGE = "Singularity Charge (Dragoon)"
DRAGOON_ENHANCED_STRIDER_SERVOS = "Enhanced Strider Servos (Dragoon)"
SCOUT_COMBAT_SENSOR_ARRAY = "Combat Sensor Array (Scout/Oppressor/Caladrius/Mist Wing)"
SCOUT_APIAL_SENSORS = "Apial Sensors (Scout)"
SCOUT_GRAVITIC_THRUSTERS = "Gravitic Thrusters (Scout/Oppressor/Caladrius/Mist Wing)"
SCOUT_ADVANCED_PHOTON_BLASTERS = "Advanced Photon Blasters (Scout/Oppressor/Mist Wing)"
SCOUT_RESOURCE_EFFICIENCY = "Resource Efficiency (Scout)"
SCOUT_SUPPLY_EFFICIENCY = "Supply Efficiency (Scout)"
TEMPEST_TECTONIC_DESTABILIZERS = "Tectonic Destabilizers (Tempest)"
TEMPEST_QUANTIC_REACTOR = "Quantic Reactor (Tempest)"
TEMPEST_GRAVITY_SLING = "Gravity Sling (Tempest)"
TEMPEST_INTERPLANETARY_RANGE = "Interplanetary Range (Tempest)"
PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX = "Ionic Wavelength Flux (Phoenix/Mirage/Skirmisher)"
PHOENIX_CLASS_ANION_PULSE_CRYSTALS = "Anion Pulse-Crystals (Phoenix/Mirage/Skirmisher)"
CORSAIR_STEALTH_DRIVE = "Stealth Drive (Corsair)"
CORSAIR_ARGUS_JEWEL = "Argus Jewel (Corsair)"
CORSAIR_SUSTAINING_DISRUPTION = "Sustaining Disruption (Corsair)"
CORSAIR_NEUTRON_SHIELDS = "Neutron Shields (Corsair)"
ORACLE_STEALTH_DRIVE = "Stealth Drive (Oracle)"
ORACLE_SKYWARD_CHRONOANOMALY = "Skyward Chronoanomaly (Oracle)"
ORACLE_TEMPORAL_ACCELERATION_BEAM = "Temporal Acceleration Beam (Oracle)"
ORACLE_BOSONIC_CORE = "Bosonic Core (Oracle)"
ARBITER_CHRONOSTATIC_REINFORCEMENT = "Chronostatic Reinforcement (Arbiter)"
ARBITER_KHAYDARIN_CORE = "Khaydarin Core (Arbiter)"
ARBITER_SPACETIME_ANCHOR = "Spacetime Anchor (Arbiter)"
ARBITER_RESOURCE_EFFICIENCY = "Resource Efficiency (Arbiter)"
ARBITER_JUDICATORS_VEIL = "Judicator's Veil (Arbiter)"
CARRIER_TRIREME_GRAVITON_CATAPULT = "Graviton Catapult (Carrier/Trireme)"
CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES = "Hull of Past Glories (Carrier/Skylord/Trireme)"
VOID_RAY_DESTROYER_PULSAR_DAWNBRINGER_FLUX_VANES = "Flux Vanes (Void Ray/Destroyer/Pulsar/Dawnbringer)"
DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES = "Anti-Surface Countermeasures (Dawnbringer)"
DAWNBRINGER_ENHANCED_SHIELD_GENERATOR = "Enhanced Shield Generator (Dawnbringer)"
PULSAR_CHRONOCLYSM = "Chronoclysm (Pulsar)"
PULSAR_ENTROPIC_REVERSAL = "Entropic Reversal (Pulsar)"
DESTROYER_RESOURCE_EFFICIENCY = "Resource Efficiency (Destroyer)"
WARP_PRISM_GRAVITIC_DRIVE = "Gravitic Drive (Warp Prism)"
WARP_PRISM_PHASE_BLASTER = "Phase Blaster (Warp Prism)"
WARP_PRISM_WAR_CONFIGURATION = "War Configuration (Warp Prism)"
OBSERVER_GRAVITIC_BOOSTERS = "Gravitic Boosters (Observer)"
OBSERVER_SENSOR_ARRAY = "Sensor Array (Observer)"
REAVER_SCARAB_DAMAGE = "Scarab Damage (Reaver)"
REAVER_SOLARITE_PAYLOAD = "Solarite Payload (Reaver)"
REAVER_REAVER_CAPACITY = "Reaver Capacity (Reaver)"
REAVER_RESOURCE_EFFICIENCY = "Resource Efficiency (Reaver)"
REAVER_BARGAIN_BIN_PRICES = "Bargain Bin Prices (Reaver)"
VANGUARD_AGONY_LAUNCHERS = "Agony Launchers (Vanguard)"
VANGUARD_MATTER_DISPERSION = "Matter Dispersion (Vanguard)"
IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE = "Singularity Charge (Immortal/Annihilator)"
IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING = "Advanced Targeting (Immortal/Annihilator)"
IMMORTAL_ANNIHILATOR_DISRUPTOR_DISPERSION = "Disruptor Dispersion (Immortal/Annihilator)"
STALWART_HIGH_VOLTAGE_CAPACITORS = "High Voltage Capacitors (Stalwart)"
STALWART_REINTEGRATED_FRAMEWORK = "Reintegrated Framework (Stalwart)"
STALWART_STABILIZED_ELECTRODES = "Stabilized Electrodes (Stalwart)"
STALWART_LATTICED_SHIELDING = "Latticed Shielding (Stalwart)"
DISRUPTOR_CLOAKING_MODULE = "Cloaking Module (Disruptor)"
DISRUPTOR_PERFECTED_POWER = "Perfected Power (Disruptor)"
DISRUPTOR_RESTRAINED_DESTRUCTION = "Restrained Destruction (Disruptor)"
COLOSSUS_PACIFICATION_PROTOCOL = "Pacification Protocol (Colossus)"
WRATHWALKER_RAPID_POWER_CYCLING = "Rapid Power Cycling (Wrathwalker)"
WRATHWALKER_EYE_OF_WRATH = "Eye of Wrath (Wrathwalker)"
DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN = "Shroud of Adun (Dark Templar/Avenger/Blood Hunter)"
DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING = "Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)"
DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK = "Blink (Dark Templar/Avenger/Blood Hunter)"
DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY = "Resource Efficiency (Dark Templar/Avenger/Blood Hunter)"
DARK_TEMPLAR_DARK_ARCHON_MELD = "Dark Archon Meld (Dark Templar)"
DARK_TEMPLAR_ARCHON_MERGE = "Archon Merge (Dark Templar)"
HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM = "Unshackled Psionic Storm (High Templar/Signifier)"
HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION = "Hallucination (High Templar/Signifier)"
HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET = "Khaydarin Amulet (High Templar/Signifier)"
ARCHON_HIGH_ARCHON = "High Archon (Archon)"
ARCHON_TRANSCENDENCE = "Transcendence (Archon)"
ARCHON_POWER_SIPHON = "Power Siphon (Archon)"
ARCHON_ERADICATE = "Eradicate (Archon)"
ARCHON_OBLITERATE = "Obliterate (Archon)"
DARK_ARCHON_FEEDBACK = "Feedback (Dark Archon)"
DARK_ARCHON_MAELSTROM = "Maelstrom (Dark Archon)"
DARK_ARCHON_ARGUS_TALISMAN = "Argus Talisman (Dark Archon)"
ASCENDANT_POWER_OVERWHELMING = "Power Overwhelming (Ascendant)"
ASCENDANT_CHAOTIC_ATTUNEMENT = "Chaotic Attunement (Ascendant)"
ASCENDANT_BLOOD_AMULET = "Blood Amulet (Ascendant)"
ASCENDANT_ARCHON_MERGE = "Archon Merge (Ascendant)"
SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE = "Cloaking Module (Sentry/Energizer/Havoc)"
SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING = "Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)"
SENTRY_FORCE_FIELD = "Force Field (Sentry)"
SENTRY_HALLUCINATION = "Hallucination (Sentry)"
ENERGIZER_RECLAMATION = "Reclamation (Energizer)"
ENERGIZER_FORGED_CHASSIS = "Forged Chassis (Energizer)"
HAVOC_DETECT_WEAKNESS = "Detect Weakness (Havoc)"
HAVOC_BLOODSHARD_RESONANCE = "Bloodshard Resonance (Havoc)"
ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS = "Leg Enhancements (Zealot/Sentinel/Centurion)"
ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY = "Shield Capacity (Zealot/Sentinel/Centurion)"
OPPRESSOR_ACCELERATED_WARP = "Accelerated Warp (Oppressor)"
OPPRESSOR_ARMOR_MELTING_BLASTERS = "Armor Melting Blasters (Oppressor)"
CALADRIUS_SIDE_MISSILES = "Side Missiles (Caladrius)"
CALADRIUS_STRUCTURE_TARGETING = "Structure Targeting (Caladrius)"
CALADRIUS_SOLARITE_REACTOR = "Solarite Reactor (Caladrius)"
MISTWING_NULL_SHROUD = "Null Shroud (Mist Wing)"
MISTWING_PILOT = "Pilot (Mist Wing)"
# War Council
ZEALOT_WHIRLWIND = "Whirlwind (Zealot)"
CENTURION_RESOURCE_EFFICIENCY = "Resource Efficiency (Centurion)"
SENTINEL_RESOURCE_EFFICIENCY = "Resource Efficiency (Sentinel)"
STALKER_PHASE_REACTOR = "Phase Reactor (Stalker)"
DRAGOON_PHALANX_SUIT = "Phalanx Suit (Dragoon)"
INSTIGATOR_MODERNIZED_SERVOS = "Modernized Servos (Instigator)"
ADEPT_DISRUPTIVE_TRANSFER = "Disruptive Transfer (Adept)"
SLAYER_PHASE_BLINK = "Phase Blink (Slayer)"
AVENGER_KRYHAS_CLOAK = "Kryhas Cloak (Avenger)"
DARK_TEMPLAR_LESSER_SHADOW_FURY = "Lesser Shadow Fury (Dark Templar)"
DARK_TEMPLAR_GREATER_SHADOW_FURY = "Greater Shadow Fury (Dark Templar)"
BLOOD_HUNTER_BRUTAL_EFFICIENCY = "Brutal Efficiency (Blood Hunter)"
SENTRY_DOUBLE_SHIELD_RECHARGE = "Double Shield Recharge (Sentry)"
ENERGIZER_MOBILE_CHRONO_BEAM = "Mobile Chrono Beam (Energizer)"
HAVOC_ENDURING_SIGHT = "Enduring Sight (Havoc)"
HIGH_TEMPLAR_PLASMA_SURGE = "Plasma Surge (High Templar)"
SIGNIFIER_FEEDBACK = "Feedback (Signifier)"
ASCENDANT_BREATH_OF_CREATION = "Breath of Creation (Ascendant)"
DARK_ARCHON_INDOMITABLE_WILL = "Indomitable Will (Dark Archon)"
IMMORTAL_IMPROVED_BARRIER = "Improved Barrier (Immortal)"
VANGUARD_RAPIDFIRE_CANNON = "Rapid-Fire Cannon (Vanguard)"
VANGUARD_FUSION_MORTARS = "Fusion Mortars (Vanguard)"
ANNIHILATOR_TWILIGHT_CHASSIS = "Twilight Chassis (Annihilator)"
STALWART_ARC_INDUCERS = "Arc Inducers (Stalwart)"
COLOSSUS_FIRE_LANCE = "Fire Lance (Colossus)"
WRATHWALKER_AERIAL_TRACKING = "Aerial Tracking (Wrathwalker)"
REAVER_KHALAI_REPLICATORS = "Khalai Replicators (Reaver)"
DISRUPTOR_MOBILITY_PROTOCOLS = "Mobility Protocols (Disruptor)"
WARP_PRISM_WARP_REFRACTION = "Warp Refraction (Warp Prism)"
OBSERVER_INDUCE_SCOPOPHOBIA = "Induce Scopophobia (Observer)"
PHOENIX_DOUBLE_GRAVITON_BEAM = "Double Graviton Beam (Phoenix)"
CORSAIR_NETWORK_DISRUPTION = "Network Disruption (Corsair)"
MIRAGE_GRAVITON_BEAM = "Graviton Beam (Mirage)"
SKIRMISHER_PEER_CONTEMPT = "Peer Contempt (Skirmisher)"
VOID_RAY_PRISMATIC_RANGE = "Prismatic Range (Void Ray)"
DESTROYER_REFORGED_BLOODSHARD_CORE = "Reforged Bloodshard Core (Destroyer)"
PULSAR_CHRONO_SHEAR = "Chrono Shear (Pulsar)"
DAWNBRINGER_SOLARITE_LENS = "Solarite Lens (Dawnbringer)"
CARRIER_REPAIR_DRONES = "Repair Drones (Carrier)"
SKYLORD_JUMP = "Jump (Skylord)"
TRIREME_SOLAR_BEAM = "Solar Beam (Trireme)"
TEMPEST_DISINTEGRATION = "Disintegration (Tempest)"
SCOUT_EXPEDITIONARY_HULL = "Expeditionary Hull (Scout)"
ARBITER_VESSEL_OF_THE_CONCLAVE = "Vessel of the Conclave (Arbiter)"
ORACLE_STASIS_CALIBRATION = "Stasis Calibration (Oracle)"
MOTHERSHIP_INTEGRATED_POWER = "Integrated Power (Mothership)"
OPPRESSOR_VULCAN_BLASTER = "Vulcan Blaster (Oppressor)"
CALADRIUS_CORONA_BEAM = "Corona Beam (Caladrius)"
MISTWING_PHANTOM_DASH = "Phantom Dash (Mist Wing)"
# Spear Of Adun
SOA_CHRONO_SURGE = "Chrono Surge (Spear of Adun)"
SOA_PROGRESSIVE_PROXY_PYLON = "Progressive Proxy Pylon (Spear of Adun)"
SOA_PYLON_OVERCHARGE = "Pylon Overcharge (Spear of Adun)"
SOA_ORBITAL_STRIKE = "Orbital Strike (Spear of Adun)"
SOA_TEMPORAL_FIELD = "Temporal Field (Spear of Adun)"
SOA_SOLAR_LANCE = "Solar Lance (Spear of Adun)"
SOA_MASS_RECALL = "Mass Recall (Spear of Adun)"
SOA_SHIELD_OVERCHARGE = "Shield Overcharge (Spear of Adun)"
SOA_DEPLOY_FENIX = "Deploy Fenix (Spear of Adun)"
SOA_PURIFIER_BEAM = "Purifier Beam (Spear of Adun)"
SOA_TIME_STOP = "Time Stop (Spear of Adun)"
SOA_SOLAR_BOMBARDMENT = "Solar Bombardment (Spear of Adun)"
# Generic upgrades
MATRIX_OVERLOAD = "Matrix Overload (Protoss)"
QUATRO = "Quatro (Protoss)"
NEXUS_OVERCHARGE = "Nexus Overcharge (Protoss)"
ORBITAL_ASSIMILATORS = "Orbital Assimilators (Protoss)"
WARP_HARMONIZATION = "Warp Harmonization (Protoss)"
GUARDIAN_SHELL = "Guardian Shell (Spear of Adun)"
RECONSTRUCTION_BEAM = "Reconstruction Beam (Spear of Adun)"
OVERWATCH = "Overwatch (Spear of Adun)"
SUPERIOR_WARP_GATES = "Superior Warp Gates (Protoss)"
ENHANCED_TARGETING = "Enhanced Targeting (Protoss)"
OPTIMIZED_ORDNANCE = "Optimized Ordnance (Protoss)"
KHALAI_INGENUITY = "Khalai Ingenuity (Protoss)"
AMPLIFIED_ASSIMILATORS = "Amplified Assimilators (Protoss)"
PROGRESSIVE_WARP_RELOCATE = "Progressive Warp Relocate (Protoss)"
PROBE_WARPIN = "Probe Warp-In (Protoss)"
ELDER_PROBES = "Elder Probes (Protoss)"
# Filler items
STARTING_MINERALS = "Additional Starting Minerals"
STARTING_VESPENE = "Additional Starting Vespene"
STARTING_SUPPLY = "Additional Starting Supply"
MAX_SUPPLY = "Additional Maximum Supply"
SHIELD_REGENERATION = "Increased Shield Regeneration"
BUILDING_CONSTRUCTION_SPEED = "Increased Building Construction Speed"
UPGRADE_RESEARCH_SPEED = "Increased Upgrade Research Speed"
UPGRADE_RESEARCH_COST = "Reduced Upgrade Research Cost"
# Trap
REDUCED_MAX_SUPPLY = "Decreased Maximum Supply"
NOTHING = "Nothing"
# Deprecated
PROGRESSIVE_ORBITAL_COMMAND = "Progressive Orbital Command (Deprecated)"
# Keys
_TEMPLATE_MISSION_KEY = "{} Mission Key"
_TEMPLATE_NAMED_LAYOUT_KEY = "{} ({}) Questline Key"
_TEMPLATE_NUMBERED_LAYOUT_KEY = "Questline Key #{}"
_TEMPLATE_NAMED_CAMPAIGN_KEY = "{} Campaign Key"
_TEMPLATE_NUMBERED_CAMPAIGN_KEY = "Campaign Key #{}"
_TEMPLATE_FLAVOR_KEY = "{} Key"
PROGRESSIVE_MISSION_KEY = "Progressive Mission Key"
PROGRESSIVE_QUESTLINE_KEY = "Progressive Questline Key"
_TEMPLATE_PROGRESSIVE_KEY = "Progressive Key #{}"
# Names for flavor keys, feel free to add more, but add them to the Custom Mission Order docs too
# These will never be randomly created by the generator
_flavor_key_names = [
"Terran", "Zerg", "Protoss",
"Raynor", "Tychus", "Swann", "Stetmann", "Hanson", "Nova", "Tosh", "Valerian", "Warfield", "Mengsk", "Han", "Horner",
"Kerrigan", "Zagara", "Abathur", "Yagdra", "Kraith", "Slivan", "Zurvan", "Brakk", "Stukov", "Dehaka", "Niadra", "Izsha",
"Artanis", "Zeratul", "Tassadar", "Karax", "Vorazun", "Alarak", "Fenix", "Urun", "Mohandar", "Selendis", "Rohana",
"Reigel", "Davis", "Ji'nara"
]

View File

@@ -0,0 +1,266 @@
"""
Utilities for telling item parentage hierarchy.
ItemData in item_tables.py will point from child item -> parent rule.
Rules have a `parent_items()` method which links rule -> parent items.
Rules may be more complex than all or any items being present. Call them to determine if they are satisfied.
"""
from typing import Dict, List, Iterable, Sequence, Optional, TYPE_CHECKING
import abc
from . import item_names, parent_names, item_tables, item_groups
if TYPE_CHECKING:
from ..options import Starcraft2Options
class PresenceRule(abc.ABC):
"""Contract for a parent presence rule. This should be a protocol in Python 3.10+"""
constraint_group: Optional[str]
"""Identifies the group this item rule is a part of, subject to min/max upgrades per unit"""
display_string: str
"""Main item to count as the parent for min/max upgrades per unit purposes"""
@abc.abstractmethod
def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: ...
@abc.abstractmethod
def parent_items(self) -> Sequence[str]: ...
class ItemPresent(PresenceRule):
def __init__(self, item_name: str) -> None:
self.item_name = item_name
self.constraint_group = item_name
self.display_string = item_name
def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool:
return self.item_name in inventory
def parent_items(self) -> List[str]:
return [self.item_name]
class AnyOf(PresenceRule):
def __init__(self, group: Iterable[str], main_item: Optional[str] = None, display_string: Optional[str] = None) -> None:
self.group = set(group)
self.constraint_group = main_item
self.display_string = display_string or main_item or ' | '.join(group)
def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool:
return len(self.group.intersection(inventory)) > 0
def parent_items(self) -> List[str]:
return sorted(self.group)
class AllOf(PresenceRule):
def __init__(self, group: Iterable[str], main_item: Optional[str] = None) -> None:
self.group = set(group)
self.constraint_group = main_item
self.display_string = main_item or ' & '.join(group)
def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool:
return len(self.group.intersection(inventory)) == len(self.group)
def parent_items(self) -> List[str]:
return sorted(self.group)
class AnyOfGroupAndOneOtherItem(PresenceRule):
def __init__(self, group: Iterable[str], item_name: str) -> None:
self.group = set(group)
self.item_name = item_name
self.constraint_group = item_name
self.display_string = item_name
def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool:
return (len(self.group.intersection(inventory)) > 0) and self.item_name in inventory
def parent_items(self) -> List[str]:
return sorted(self.group) + [self.item_name]
class MorphlingOrItem(PresenceRule):
def __init__(self, item_name: str, has_parent: bool = True) -> None:
self.item_name = item_name
self.constraint_group = None # Keep morphs from counting towards the parent unit's upgrade count
self.display_string = f'{item_name} Morphs'
def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool:
return (options.enable_morphling.value != 0) or self.item_name in inventory
def parent_items(self) -> List[str]:
return [self.item_name]
class MorphlingOrAnyOf(PresenceRule):
def __init__(self, group: Iterable[str], display_string: str, main_item: Optional[str] = None) -> None:
self.group = set(group)
self.constraint_group = main_item
self.display_string = display_string
def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool:
return (options.enable_morphling.value != 0) or (len(self.group.intersection(inventory)) > 0)
def parent_items(self) -> List[str]:
return sorted(self.group)
parent_present: Dict[str, PresenceRule] = {
item_name: ItemPresent(item_name)
for item_name in item_tables.item_table
}
# Terran
parent_present[parent_names.DOMINION_TROOPER_WEAPONS] = AnyOf([
item_names.DOMINION_TROOPER_B2_HIGH_CAL_LMG,
item_names.DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER,
item_names.DOMINION_TROOPER_HAILSTORM_LAUNCHER,
], main_item=item_names.DOMINION_TROOPER)
parent_present[parent_names.INFANTRY_UNITS] = AnyOf(item_groups.barracks_units, display_string='Terran Infantry')
parent_present[parent_names.INFANTRY_WEAPON_UNITS] = AnyOf(item_groups.barracks_wa_group, display_string='Terran Infantry')
parent_present[parent_names.ORBITAL_COMMAND_AND_PLANETARY] = AnyOfGroupAndOneOtherItem(
item_groups.orbital_command_abilities,
item_names.PLANETARY_FORTRESS,
)
parent_present[parent_names.SIEGE_TANK_AND_TRANSPORT] = AnyOfGroupAndOneOtherItem(
(item_names.MEDIVAC, item_names.HERCULES),
item_names.SIEGE_TANK,
)
parent_present[parent_names.SIEGE_TANK_AND_MEDIVAC] = AllOf((item_names.SIEGE_TANK, item_names.MEDIVAC), item_names.SIEGE_TANK)
parent_present[parent_names.SPIDER_MINE_SOURCE] = AnyOf(item_groups.spider_mine_sources, display_string='Spider Mines')
parent_present[parent_names.STARSHIP_UNITS] = AnyOf(item_groups.starport_units, display_string='Terran Starships')
parent_present[parent_names.STARSHIP_WEAPON_UNITS] = AnyOf(item_groups.starport_wa_group, display_string='Terran Starships')
parent_present[parent_names.VEHICLE_UNITS] = AnyOf(item_groups.factory_units, display_string='Terran Vehicles')
parent_present[parent_names.VEHICLE_WEAPON_UNITS] = AnyOf(item_groups.factory_wa_group, display_string='Terran Vehicles')
parent_present[parent_names.TERRAN_MERCENARIES] = AnyOf(item_groups.terran_mercenaries, display_string='Terran Mercenaries')
# Zerg
parent_present[parent_names.ANY_NYDUS_WORM] = AnyOf((item_names.NYDUS_WORM, item_names.ECHIDNA_WORM), item_names.NYDUS_WORM)
parent_present[parent_names.BANELING_SOURCE] = AnyOf(
(item_names.ZERGLING_BANELING_ASPECT, item_names.KERRIGAN_SPAWN_BANELINGS),
item_names.ZERGLING_BANELING_ASPECT,
)
parent_present[parent_names.INFESTED_UNITS] = AnyOf(item_groups.infterr_units, display_string='Infested')
parent_present[parent_names.INFESTED_FACTORY_OR_STARPORT] = AnyOf(
(item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_SIEGE_TANK, item_names.INFESTED_LIBERATOR, item_names.INFESTED_BANSHEE, item_names.BULLFROG)
)
parent_present[parent_names.MORPH_SOURCE_AIR] = MorphlingOrAnyOf((item_names.MUTALISK, item_names.CORRUPTOR), "Mutalisk/Corruptor Morphs")
parent_present[parent_names.MORPH_SOURCE_ROACH] = MorphlingOrItem(item_names.ROACH)
parent_present[parent_names.MORPH_SOURCE_ZERGLING] = MorphlingOrItem(item_names.ZERGLING)
parent_present[parent_names.MORPH_SOURCE_HYDRALISK] = MorphlingOrItem(item_names.HYDRALISK)
parent_present[parent_names.MORPH_SOURCE_ULTRALISK] = MorphlingOrItem(item_names.ULTRALISK)
parent_present[parent_names.ZERG_UPROOTABLE_BUILDINGS] = AnyOf(
(item_names.SPINE_CRAWLER, item_names.SPORE_CRAWLER, item_names.INFESTED_MISSILE_TURRET, item_names.INFESTED_BUNKER),
)
parent_present[parent_names.ZERG_MELEE_ATTACKER] = AnyOf(item_groups.zerg_melee_wa, display_string='Zerg Ground')
parent_present[parent_names.ZERG_MISSILE_ATTACKER] = AnyOf(item_groups.zerg_ranged_wa, display_string='Zerg Ground')
parent_present[parent_names.ZERG_CARAPACE_UNIT] = AnyOf(item_groups.zerg_ground_units, display_string='Zerg Flyers')
parent_present[parent_names.ZERG_FLYING_UNIT] = AnyOf(item_groups.zerg_air_units, display_string='Zerg Flyers')
parent_present[parent_names.ZERG_MERCENARIES] = AnyOf(item_groups.zerg_mercenaries, display_string='Zerg Mercenaries')
parent_present[parent_names.ZERG_OUROBOUROS_CONDITION] = AnyOfGroupAndOneOtherItem(
(item_names.ZERGLING, item_names.ROACH, item_names.HYDRALISK, item_names.ABERRATION),
item_names.ECHIDNA_WORM
)
# Protoss
parent_present[parent_names.ARCHON_SOURCE] = AnyOf(
(item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT_ARCHON_MERGE, item_names.DARK_TEMPLAR_ARCHON_MERGE),
main_item="Archon",
)
parent_present[parent_names.CARRIER_CLASS] = AnyOf(
(item_names.CARRIER, item_names.TRIREME, item_names.SKYLORD),
main_item=item_names.CARRIER,
)
parent_present[parent_names.CARRIER_OR_TRIREME] = AnyOf(
(item_names.CARRIER, item_names.TRIREME),
main_item=item_names.CARRIER,
)
parent_present[parent_names.DARK_ARCHON_SOURCE] = AnyOf(
(item_names.DARK_ARCHON, item_names.DARK_TEMPLAR_DARK_ARCHON_MELD),
main_item=item_names.DARK_ARCHON,
)
parent_present[parent_names.DARK_TEMPLAR_CLASS] = AnyOf(
(item_names.DARK_TEMPLAR, item_names.AVENGER, item_names.BLOOD_HUNTER),
main_item=item_names.DARK_TEMPLAR,
)
parent_present[parent_names.STORM_CASTER] = AnyOf(
(item_names.HIGH_TEMPLAR, item_names.SIGNIFIER),
main_item=item_names.HIGH_TEMPLAR,
)
parent_present[parent_names.IMMORTAL_OR_ANNIHILATOR] = AnyOf(
(item_names.IMMORTAL, item_names.ANNIHILATOR),
main_item=item_names.IMMORTAL,
)
parent_present[parent_names.PHOENIX_CLASS] = AnyOf(
(item_names.PHOENIX, item_names.MIRAGE, item_names.SKIRMISHER),
main_item=item_names.PHOENIX,
)
parent_present[parent_names.SENTRY_CLASS] = AnyOf(
(item_names.SENTRY, item_names.ENERGIZER, item_names.HAVOC),
main_item=item_names.SENTRY,
)
parent_present[parent_names.SENTRY_CLASS_OR_SHIELD_BATTERY] = AnyOf(
(item_names.SENTRY, item_names.ENERGIZER, item_names.HAVOC, item_names.SHIELD_BATTERY),
main_item=item_names.SENTRY,
)
parent_present[parent_names.STALKER_CLASS] = AnyOf(
(item_names.STALKER, item_names.SLAYER, item_names.INSTIGATOR),
main_item=item_names.STALKER,
)
parent_present[parent_names.SUPPLICANT_AND_ASCENDANT] = AllOf(
(item_names.SUPPLICANT, item_names.ASCENDANT),
main_item=item_names.ASCENDANT,
)
parent_present[parent_names.VOID_RAY_CLASS] = AnyOf(
(item_names.VOID_RAY, item_names.DESTROYER, item_names.PULSAR, item_names.DAWNBRINGER),
main_item=item_names.VOID_RAY,
)
parent_present[parent_names.ZEALOT_OR_SENTINEL_OR_CENTURION] = AnyOf(
(item_names.ZEALOT, item_names.SENTINEL, item_names.CENTURION),
main_item=item_names.ZEALOT,
)
parent_present[parent_names.SCOUT_CLASS] = AnyOf(
(item_names.SCOUT, item_names.OPPRESSOR, item_names.CALADRIUS, item_names.MISTWING),
main_item=item_names.SCOUT,
)
parent_present[parent_names.SCOUT_OR_OPPRESSOR_OR_MISTWING] = AnyOf(
(item_names.SCOUT, item_names.OPPRESSOR, item_names.MISTWING),
main_item=item_names.SCOUT,
)
parent_present[parent_names.PROTOSS_STATIC_DEFENSE] = AnyOf(
(item_names.NEXUS_OVERCHARGE, item_names.PHOTON_CANNON, item_names.KHAYDARIN_MONOLITH, item_names.SHIELD_BATTERY),
main_item=item_names.PHOTON_CANNON,
)
parent_present[parent_names.PROTOSS_ATTACKING_BUILDING] = AnyOf(
(item_names.NEXUS_OVERCHARGE, item_names.PHOTON_CANNON, item_names.KHAYDARIN_MONOLITH),
main_item=item_names.PHOTON_CANNON,
)
parent_id_to_children: Dict[str, Sequence[str]] = {}
"""Parent identifier to child items. Only contains parent rules with children."""
child_item_to_parent_items: Dict[str, Sequence[str]] = {}
"""Child item name to all parent items that can possibly affect its presence rule. Populated for all item names."""
parent_item_to_ids: Dict[str, Sequence[str]] = {}
"""Parent item to parent identifiers it affects. Populated for all items and parent IDs."""
parent_item_to_children: Dict[str, Sequence[str]] = {}
"""Parent item to child item names. Populated for all items and parent IDs."""
item_upgrade_groups: Dict[str, Sequence[str]] = {}
"""Mapping of upgradable item group -> child items. Only populated for groups with child items."""
# Note(mm): "All items" promise satisfied by the basic ItemPresent auto-generated rules
def _init() -> None:
for item_name, item_data in item_tables.item_table.items():
if item_data.parent is None:
continue
parent_id_to_children.setdefault(item_data.parent, []).append(item_name) # type: ignore
child_item_to_parent_items[item_name] = parent_present[item_data.parent].parent_items()
for parent_id, presence_func in parent_present.items():
for parent_item in presence_func.parent_items():
parent_item_to_ids.setdefault(parent_item, []).append(parent_id) # type: ignore
parent_item_to_children.setdefault(parent_item, []).extend(parent_id_to_children.get(parent_id, [])) # type: ignore
if presence_func.constraint_group is not None and parent_id_to_children.get(parent_id):
item_upgrade_groups.setdefault(presence_func.constraint_group, []).extend(parent_id_to_children[parent_id]) # type: ignore
_init()

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,57 @@
"""
Identifiers for complex item parent structures.
Defined separately from item_parents to avoid a circular import
item_names -> item_parent_names -> item_tables -> item_parents
"""
# Terran
DOMINION_TROOPER_WEAPONS = "Dominion Trooper Weapons"
INFANTRY_UNITS = "Infantry Units"
INFANTRY_WEAPON_UNITS = "Infantry Weapon Units"
ORBITAL_COMMAND_AND_PLANETARY = "Orbital Command Abilities + Planetary Fortress" # MULE | Scan | Supply Drop
SIEGE_TANK_AND_TRANSPORT = "Siege Tank + Transport"
SIEGE_TANK_AND_MEDIVAC = "Siege Tank + Medivac"
SPIDER_MINE_SOURCE = "Spider Mine Source"
STARSHIP_UNITS = "Starship Units"
STARSHIP_WEAPON_UNITS = "Starship Weapon Units"
VEHICLE_UNITS = "Vehicle Units"
VEHICLE_WEAPON_UNITS = "Vehicle Weapon Units"
TERRAN_MERCENARIES = "Terran Mercenaries"
# Zerg
ANY_NYDUS_WORM = "Any Nydus Worm"
BANELING_SOURCE = "Any Baneling Source" # Baneling aspect | Kerrigan Spawn Banelings
INFESTED_UNITS = "Infested Units"
INFESTED_FACTORY_OR_STARPORT = "Infested Factory or Starport"
MORPH_SOURCE_AIR = "Air Morph Source" # Morphling | Mutalisk | Corruptor
MORPH_SOURCE_ROACH = "Roach Morph Source" # Morphling | Roach
MORPH_SOURCE_ZERGLING = "Zergling Morph Source" # Morphling | Zergling
MORPH_SOURCE_HYDRALISK = "Hydralisk Morph Source" # Morphling | Hydralisk
MORPH_SOURCE_ULTRALISK = "Ultralisk Morph Source" # Morphling | Ultralisk
ZERG_UPROOTABLE_BUILDINGS = "Zerg Uprootable Buildings"
ZERG_MELEE_ATTACKER = "Zerg Melee Attacker"
ZERG_MISSILE_ATTACKER = "Zerg Missile Attacker"
ZERG_CARAPACE_UNIT = "Zerg Carapace Unit"
ZERG_FLYING_UNIT = "Zerg Flying Unit"
ZERG_MERCENARIES = "Zerg Mercenaries"
ZERG_OUROBOUROS_CONDITION = "Zerg Ourobouros Condition"
# Protoss
ARCHON_SOURCE = "Any Archon Source"
CARRIER_CLASS = "Carrier Class"
CARRIER_OR_TRIREME = "Carrier | Trireme"
DARK_ARCHON_SOURCE = "Dark Archon Source"
DARK_TEMPLAR_CLASS = "Dark Templar Class"
STORM_CASTER = "Storm Caster"
IMMORTAL_OR_ANNIHILATOR = "Immortal | Annihilator"
PHOENIX_CLASS = "Phoenix Class"
SENTRY_CLASS = "Sentry Class"
SENTRY_CLASS_OR_SHIELD_BATTERY = "Sentry Class | Shield Battery"
STALKER_CLASS = "Stalker Class"
SUPPLICANT_AND_ASCENDANT = "Supplicant + Ascendant"
VOID_RAY_CLASS = "Void Ray Class"
ZEALOT_OR_SENTINEL_OR_CENTURION = "Zealot | Sentinel | Centurion"
PROTOSS_STATIC_DEFENSE = "Protoss Static Defense"
PROTOSS_ATTACKING_BUILDING = "Protoss Attacking Structure"
SCOUT_CLASS = "Scout Class"
SCOUT_OR_OPPRESSOR_OR_MISTWING = "Scout | Oppressor | Mist Wing"