From 4a0a38ae1858bd65acf423f06dd5e402ac9787fb Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 15:15:23 +0100 Subject: [PATCH 01/13] Add item processing stability to not remove excluded items that are required --- worlds/sc2/__init__.py | 135 +- worlds/sc2/client.py | 2 +- worlds/sc2/item_groups.py | 82 +- worlds/sc2/item_tables.py | 2423 ++++++++++++++++++++++ worlds/sc2/items.py | 2445 +---------------------- worlds/sc2/mission_order/entry_rules.py | 2 +- worlds/sc2/mission_order/options.py | 2 +- worlds/sc2/mission_order/structs.py | 2 +- worlds/sc2/pool_filter.py | 113 +- worlds/sc2/rules.py | 2 +- worlds/sc2/test/test_generation.py | 50 +- 11 files changed, 2643 insertions(+), 2615 deletions(-) create mode 100644 worlds/sc2/item_tables.py diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index c6c73431d67d..340b732a6773 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -6,18 +6,18 @@ from math import floor, ceil from dataclasses import dataclass from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification, CollectionState, Region -from Fill import fill_restrictive, FillError from Options import Accessibility from worlds.AutoWorld import WebWorld, World from . import item_names -from .items import ( - StarcraftItem, filler_items, get_full_item_list, ProtossItemType, +from .item_tables import ( + filler_items, get_full_item_list, ProtossItemType, ItemData, kerrigan_actives, kerrigan_passives, - not_balanced_starting_units, WEAPON_ARMOR_UPGRADE_MAX_LEVEL, + not_balanced_starting_units, WEAPON_ARMOR_UPGRADE_MAX_LEVEL, ItemType, ZergItemType, ) from . import items from . import item_groups from . import location_groups +from .items import FilterItem, ItemFilterFlags, StarcraftItem from .locations import get_locations, DEFAULT_LOCATION_LIST, get_location_types, get_location_flags, get_plando_locations from .mission_order.layout_types import LayoutType, Gauntlet from .options import ( @@ -35,39 +35,9 @@ ) from .regions import create_mission_order from .mission_order.structs import SC2MissionOrder -from ..stardew_valley import true_ -from ..v6 import location_table logger = logging.getLogger("Starcraft 2") - -class ItemFilterFlags(enum.IntFlag): - Available = 0 - Locked = enum.auto() - StartInventory = enum.auto() - NonLocal = enum.auto() - Removed = enum.auto() - Plando = enum.auto() - Excluded = 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""" - Necessary = enum.auto() - """Used to flag items that are never allowed to be culled. - This differs from `Locked` in that locked items may still be culled if there's space issues or in some circumstances when a parent item is culled.""" - - Unremovable = Locked|StartInventory|Plando|Necessary - - -@dataclass -class FilterItem: - name: str - data: ItemData - index: int = 0 - flags: ItemFilterFlags = ItemFilterFlags.Available - - class Starcraft2WebWorld(WebWorld): setup_en = Tutorial( "Multiworld Setup Guide", @@ -330,7 +300,7 @@ def resolve_count(count: Optional[int], max_count: int) -> int: return min(count, max_count) result: List[FilterItem] = [] - for item_name, item_data in items.item_table.items(): + for item_name, item_data in item_tables.item_table.items(): max_count = item_data.quantity excluded_count = excluded_items.get(item_name) unexcluded_count = unexcluded_items.get(item_name) @@ -401,35 +371,38 @@ def flag_excludes_by_faction_presence(world: SC2World, item_list: List[FilterIte for item in item_list: # Catch-all for all of a faction's items - if (not terran_missions and item.data.race == SC2Race.TERRAN): - item.flags |= ItemFilterFlags.Excluded - continue - if (not zerg_missions and item.data.race == SC2Race.ZERG): - item.flags |= ItemFilterFlags.Excluded - continue - if (not protoss_missions and item.data.race == SC2Race.PROTOSS): + if not terran_missions and item.data.race == SC2Race.TERRAN: + if item.name not in item_groups.nova_equipment: + item.flags |= ItemFilterFlags.Removed + continue + if not zerg_missions and item.data.race == SC2Race.ZERG: + if item.data.type != item_tables.ZergItemType.Ability \ + and item.data.type != ZergItemType.Level: + item.flags |= ItemFilterFlags.Removed + continue + if not protoss_missions and item.data.race == SC2Race.PROTOSS: if item.name not in item_groups.soa_items: - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed continue # Faction units if (not terran_build_missions - and item.data.type in (items.TerranItemType.Unit, items.TerranItemType.Building, items.TerranItemType.Mercenary) + and item.data.type in (item_tables.TerranItemType.Unit, item_tables.TerranItemType.Building, item_tables.TerranItemType.Mercenary) ): - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed if (not zerg_build_missions - and item.data.type in (items.ZergItemType.Unit, items.ZergItemType.Mercenary, items.ZergItemType.Evolution_Pit) + and item.data.type in (item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary, item_tables.ZergItemType.Evolution_Pit) ): if (SC2Mission.ENEMY_WITHIN not in missions or world.options.grant_story_tech.value == GrantStoryTech.option_true or item.name not in (item_names.ZERGLING, item_names.ROACH, item_names.HYDRALISK, item_names.INFESTOR) ): - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed if (not protoss_build_missions and item.data.type in ( - items.ProtossItemType.Unit, - items.ProtossItemType.Unit_2, - items.ProtossItemType.Building, + item_tables.ProtossItemType.Unit, + item_tables.ProtossItemType.Unit_2, + item_tables.ProtossItemType.Building, ) ): # Note(mm): This doesn't exclude things like automated assimilators or warp gate improvements @@ -442,24 +415,24 @@ def flag_excludes_by_faction_presence(world: SC2World, item_list: List[FilterIte item_names.SENTRY, item_names.HIGH_TEMPLAR, ) ): - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed # Faction +attack/armour upgrades - if (item.data.type == items.TerranItemType.Upgrade + if (item.data.type == item_tables.TerranItemType.Upgrade and not terran_build_missions and not auto_upgrades_in_nobuilds ): - item.flags |= ItemFilterFlags.Excluded - if (item.data.type == items.ZergItemType.Upgrade + item.flags |= ItemFilterFlags.Removed + if (item.data.type == item_tables.ZergItemType.Upgrade and not zerg_build_missions and not auto_upgrades_in_nobuilds ): - item.flags |= ItemFilterFlags.Excluded - if (item.data.type == items.ProtossItemType.Upgrade + item.flags |= ItemFilterFlags.Removed + if (item.data.type == item_tables.ProtossItemType.Upgrade and not protoss_build_missions and not auto_upgrades_in_nobuilds ): - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed def flag_mission_based_item_excludes(world: SC2World, item_list: List[FilterItem]) -> None: @@ -513,35 +486,35 @@ def flag_mission_based_item_excludes(world: SC2World, item_list: List[FilterItem for item in item_list: # Filter Nova equipment if you never get Nova if not nova_missions and (item.name in item_groups.nova_equipment): - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed # Todo(mm): How should no-build only / grant_story_tech affect excluding Kerrigan items? # Exclude Primal form based on Kerrigan presence or primal form option - if (item.data.type == items.ZergItemType.Primal_Form + if (item.data.type == item_tables.ZergItemType.Primal_Form and ((not kerrigan_is_present) or world.options.kerrigan_primal_status != KerriganPrimalStatus.option_item) ): - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed # Remove Kerrigan abilities if there's no kerrigan - if item.data.type == items.ZergItemType.Ability: + if item.data.type == item_tables.ZergItemType.Ability: if not kerrigan_is_present: - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed elif world.options.grant_story_tech and not kerrigan_build_missions: - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed # Remove Spear of Adun if it's off - if item.name in items.spear_of_adun_calldowns and not soa_presence: - item.flags |= ItemFilterFlags.Excluded + if item.name in item_tables.spear_of_adun_calldowns and not soa_presence: + item.flags |= ItemFilterFlags.Removed # Remove Spear of Adun passives - if item.name in items.spear_of_adun_castable_passives and not soa_passive_presence: - item.flags |= ItemFilterFlags.Excluded + if item.name in item_tables.spear_of_adun_castable_passives and not soa_passive_presence: + item.flags |= ItemFilterFlags.Removed # Remove Psi Disrupter and Hive Mind Emulator if you never play a build TvZ if (item.name in (item_names.HIVE_MIND_EMULATOR, item_names.PSI_DISRUPTER) and not tvz_build_missions ): - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed return @@ -594,7 +567,7 @@ def flag_start_unit(world: SC2World, item_list: List[FilterItem], starter_unit: if first_race != SC2Race.ANY: possible_starter_items = { - item.name: item for item in item_list if (ItemFilterFlags.Plando|ItemFilterFlags.Excluded) & item.flags == 0 + item.name: item for item in item_list if (ItemFilterFlags.Plando|ItemFilterFlags.Excluded|ItemFilterFlags.Removed) & item.flags == 0 } # The race of the early unit has been chosen @@ -627,7 +600,7 @@ def flag_start_unit(world: SC2World, item_list: List[FilterItem], starter_unit: item for item in basic_unit_options if item.name not in nco_support_items or nco_support_items[item.name] in possible_starter_items - and ((ItemFilterFlags.Plando|ItemFilterFlags.Excluded) & possible_starter_items[nco_support_items[item.name]].flags) == 0 + and ((ItemFilterFlags.Plando|ItemFilterFlags.Excluded|ItemFilterFlags.Removed) & possible_starter_items[nco_support_items[item.name]].flags) == 0 ] if not basic_unit_options: raise Exception("Early Unit: At least one basic unit must be included") @@ -693,9 +666,9 @@ def flag_unused_upgrade_types(world: SC2World, item_list: List[FilterItem]) -> N include_upgrades = world.options.generic_upgrade_missions == 0 upgrade_items: GenericUpgradeItems = world.options.generic_upgrade_items for item in item_list: - if item.data.type in items.upgrade_item_types: + if item.data.type in item_tables.upgrade_item_types: if not include_upgrades or (item.name not in upgrade_included_names[upgrade_items]): - item.flags |= ItemFilterFlags.Excluded + item.flags |= ItemFilterFlags.Removed def flag_user_excluded_item_sets(world: SC2World, item_list: List[FilterItem]) -> None: @@ -766,7 +739,7 @@ def flag_mission_order_required_items(world: SC2World, item_list: List[FilterIte def prune_item_pool(world: SC2World, item_list: List[FilterItem]) -> List[Item]: """Prunes the item pool size to be less than the number of available locations""" - item_list = [item for item in item_list if ItemFilterFlags.Unremovable & item.flags or ItemFilterFlags.Excluded not in item.flags] + item_list = [item for item in item_list if ItemFilterFlags.Unremovable & item.flags or ItemFilterFlags.Removed not in item.flags] num_items = len(item_list) last_num_items = -1 while num_items != last_num_items: @@ -777,12 +750,12 @@ def prune_item_pool(world: SC2World, item_list: List[FilterItem]) -> List[Item]: last_num_items = num_items num_items = len(item_list) - pool: List[Item] = [] - locked_items: List[Item] = [] - existing_items: List[Item] = [] - necessary_items: List[Item] = [] + pool: List[StarcraftItem] = [] + locked_items: List[StarcraftItem] = [] + existing_items: List[StarcraftItem] = [] + necessary_items: List[StarcraftItem] = [] for item in item_list: - ap_item = create_item_with_correct_settings(world.player, item.name) + ap_item = create_item_with_correct_settings(world.player, item.name, item.flags) if ItemFilterFlags.ForceProgression in item.flags: ap_item.classification = ItemClassification.progression if ItemFilterFlags.StartInventory in item.flags: @@ -827,10 +800,10 @@ def get_all_missions(mission_order: SC2MissionOrder) -> List[SC2Mission]: return mission_order.get_used_missions() -def create_item_with_correct_settings(player: int, name: str) -> Item: - data = items.item_table[name] +def create_item_with_correct_settings(player: int, name: str, filter_flags: ItemFilterFlags = ItemFilterFlags.Available) -> StarcraftItem: + data = item_tables.item_table[name] - item = Item(name, data.classification, data.code, player) + item = StarcraftItem(name, data.classification, data.code, player, filter_flags) return item diff --git a/worlds/sc2/client.py b/worlds/sc2/client.py index 378a9c6fad2e..4915e955b55b 100644 --- a/worlds/sc2/client.py +++ b/worlds/sc2/client.py @@ -52,7 +52,7 @@ from worlds._sc2common.bot.data import Race from worlds._sc2common.bot.main import run_game from worlds._sc2common.bot.player import Bot -from .items import ( +from .item_tables import ( lookup_id_to_name, get_full_item_list, ItemData, race_to_item_type, ZergItemType, ProtossItemType, upgrade_bundles, WEAPON_ARMOR_UPGRADE_MAX_LEVEL, diff --git a/worlds/sc2/item_groups.py b/worlds/sc2/item_groups.py index d34adbbb7ab3..7bfd49459631 100644 --- a/worlds/sc2/item_groups.py +++ b/worlds/sc2/item_groups.py @@ -1,5 +1,5 @@ import typing -from . import item_names, items +from . import item_names, items, item_tables from .mission_tables import campaign_mission_table, SC2Campaign, SC2Mission, SC2Race """ @@ -29,12 +29,12 @@ # These item name groups should not show up in documentation unlisted_item_name_groups = { "Missions", "WoL Missions", - items.TerranItemType.Progressive.display_name, - items.TerranItemType.Nova_Gear.display_name, - items.TerranItemType.Mercenary.display_name, - items.ZergItemType.Ability.display_name, - items.ZergItemType.Morph.display_name, - items.ZergItemType.Strain.display_name, + 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 @@ -52,7 +52,7 @@ del _shortened_names # All items get sorted into their data type -for item, data in items.get_full_item_list().items(): +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 @@ -178,16 +178,16 @@ def get_all_group_names(cls) -> typing.Set[str]: # Terran item_name_groups[ItemGroupNames.TERRAN_ITEMS] = terran_items = [ - item_name for item_name, item_data in items.item_table.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 items.item_table.items() - if item_data.type in (items.TerranItemType.Unit, items.TerranItemType.Unit_2, items.TerranItemType.Mercenary) + 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 items.item_table.items() - if item_data.type == items.TerranItemType.Upgrade + 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, @@ -220,12 +220,12 @@ def get_all_group_names(cls) -> typing.Set[str]: item_names.EMPERORS_GUARDIAN, item_names.NIGHT_HAWK, item_names.NIGHT_WOLF, ] item_name_groups[ItemGroupNames.TERRAN_BUILDINGS] = terran_buildings = [ - item_name for item_name, item_data in items.item_table.items() - if item_data.type == items.TerranItemType.Building + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.TerranItemType.Building ] item_name_groups[ItemGroupNames.TERRAN_MERCENARIES] = terran_mercenaries = [ - item_name for item_name, item_data in items.item_table.items() - if item_data.type == items.TerranItemType.Mercenary + 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, @@ -237,8 +237,8 @@ def get_all_group_names(cls) -> typing.Set[str]: 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 items.item_table.items() - if item_data.type == items.TerranItemType.Nova_Gear], + *[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.WOL_UNITS] = wol_units = [ @@ -401,8 +401,8 @@ def get_all_group_names(cls) -> typing.Set[str]: 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 items.item_table.items() - if item_data.type in (items.TerranItemType.Progressive, items.TerranItemType.Progressive_2) + 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 @@ -414,7 +414,7 @@ def get_all_group_names(cls) -> typing.Set[str]: # Zerg item_name_groups[ItemGroupNames.ZERG_ITEMS] = zerg_items = [ - item_name for item_name, item_data in items.item_table.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 = [ @@ -424,8 +424,8 @@ def get_all_group_names(cls) -> typing.Set[str]: item_names.NYDUS_WORM, item_names.OMEGA_WORM] item_name_groups[ItemGroupNames.ZERG_UNITS] = zerg_units = [ - item_name for item_name, item_data in items.item_table.items() - if item_data.type in (items.ZergItemType.Unit, items.ZergItemType.Mercenary, items.ZergItemType.Morph) + 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, item_tables.ZergItemType.Morph) and item_name not in zerg_buildings ] # For W/A upgrades @@ -453,8 +453,8 @@ def get_all_group_names(cls) -> typing.Set[str]: 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 items.item_table.items() - if item_data.type == items.ZergItemType.Upgrade + 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, @@ -478,13 +478,13 @@ def get_all_group_names(cls) -> typing.Set[str]: item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, ] item_name_groups[ItemGroupNames.ZERG_MORPHS] = zerg_morphs = [ - item_name for item_name, item_data in items.item_table.items() if item_data.type == items.ZergItemType.Morph + 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_MERCS] = zerg_mercs = [ - item_name for item_name, item_data in items.item_table.items() if item_data.type == items.ZergItemType.Mercenary + 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 items.item_table.items() if item_data.type == items.ZergItemType.Ability + 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, @@ -528,7 +528,7 @@ def get_all_group_names(cls) -> typing.Set[str]: # Zerg Upgrades item_name_groups[ItemGroupNames.HOTS_STRAINS] = hots_strains = [ - item_name for item_name, item_data in items.item_table.items() if item_data.type == items.ZergItemType.Strain + 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, @@ -576,12 +576,12 @@ def get_all_group_names(cls) -> typing.Set[str]: # Protoss item_name_groups[ItemGroupNames.PROTOSS_ITEMS] = protoss_items = [ - item_name for item_name, item_data in items.item_table.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 items.item_table.items() - if item_data.type in (items.ProtossItemType.Unit, items.ProtossItemType.Unit_2) + 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, @@ -603,8 +603,8 @@ def get_all_group_names(cls) -> typing.Set[str]: item_names.ARBITER, item_names.ORACLE, ] item_name_groups[ItemGroupNames.PROTOSS_GENERIC_UPGRADES] = protoss_generic_upgrades = [ - item_name for item_name, item_data in items.item_table.items() - if item_data.type == items.ProtossItemType.Upgrade + 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, @@ -648,8 +648,8 @@ def get_all_group_names(cls) -> typing.Set[str]: item_names.ARBITER, item_names.ORACLE, ] item_name_groups[ItemGroupNames.PROTOSS_BUILDINGS] = protoss_buildings = [ - item_name for item_name, item_data in items.item_table.items() - if item_data.type == items.ProtossItemType.Building + 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, @@ -672,12 +672,12 @@ def get_all_group_names(cls) -> typing.Set[str]: item_names.MIRAGE, item_names.DAWNBRINGER, item_names.TRIREME, item_names.TEMPEST, ] item_name_groups[ItemGroupNames.SOA_ITEMS] = soa_items = [ - *[item_name for item_name, item_data in items.item_table.items() if item_data.type == items.ProtossItemType.Spear_Of_Adun], + *[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 items.item_table.items() if item_data.type == items.ProtossItemType.Solarite_Core + 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, @@ -700,8 +700,8 @@ def get_all_group_names(cls) -> typing.Set[str]: ) item_name_groups[ItemGroupNames.WAR_COUNCIL] = [ - item_name for item_name, item_data in items.item_table.items() - if item_data.type in (items.ProtossItemType.War_Council, items.ProtossItemType.War_Council_2) + 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) ] item_name_groups[ItemGroupNames.OVERPOWERED_ITEMS] = [ diff --git a/worlds/sc2/item_tables.py b/worlds/sc2/item_tables.py new file mode 100644 index 000000000000..4be9239bd4a3 --- /dev/null +++ b/worlds/sc2/item_tables.py @@ -0,0 +1,2423 @@ +from typing import * + +from BaseClasses import Item, ItemClassification +import typing +import enum + +from .mission_tables import SC2Mission, SC2Race, SC2Campaign +from . import item_names +from .mission_order.presets_static import get_used_layout_names + + +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""" + War_Council = "War Council", 11 + War_Council_2 = "War Council", 12 + + +class FactionlessItemType(ItemTypeEnum): + Minerals = "Minerals", 0 + Vespene = "Vespene", 1 + Supply = "Supply", 2 + Nothing = "Nothing Group", 4 + Deprecated = "Deprecated", 5 + 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_item: 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 + + +def get_full_item_list(): + return item_table + + +SC2WOL_ITEM_ID_OFFSET = 1000 +SC2HOTS_ITEM_ID_OFFSET = SC2WOL_ITEM_ID_OFFSET + 1000 +SC2LOTV_ITEM_ID_OFFSET = SC2HOTS_ITEM_ID_OFFSET + 1000 +SC2_KEY_ITEM_ID_OFFSET = SC2LOTV_ITEM_ID_OFFSET + 1000 +# Reserve this many IDs for missions, layouts, campaigns, and generic keys each +SC2_KEY_ITEM_SECTION_SIZE = 1000 + +WEAPON_ARMOR_UPGRADE_MAX_LEVEL = 5 + + +# The items are sorted by their IDs. The IDs shall be kept for compatibility with older games. +item_table = { + # WoL + item_names.MARINE: + ItemData(0 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 0, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MEDIC: + ItemData(1 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 1, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.FIREBAT: + ItemData(2 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 2, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MARAUDER: + ItemData(3 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.REAPER: + ItemData(4 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.HELLION: + ItemData(5 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.VULTURE: + ItemData(6 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 6, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.GOLIATH: + ItemData(7 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.DIAMONDBACK: + ItemData(8 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 8, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SIEGE_TANK: + ItemData(9 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 9, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MEDIVAC: + ItemData(10 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 10, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.WRAITH: + ItemData(11 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 11, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.VIKING: + ItemData(12 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 12, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BANSHEE: + ItemData(13 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 13, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BATTLECRUISER: + ItemData(14 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 14, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.GHOST: + ItemData(15 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 15, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SPECTRE: + ItemData(16 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 16, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.THOR: + ItemData(17 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 17, SC2Race.TERRAN, + classification=ItemClassification.progression), + # EE units + item_names.LIBERATOR: + ItemData(18 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 18, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.VALKYRIE: + ItemData(19 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 19, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.WIDOW_MINE: + ItemData(20 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 20, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.CYCLONE: + ItemData(21 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 21, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.HERC: + ItemData(22 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 26, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.WARHOUND: + ItemData(23 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 27, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.DOMINION_TROOPER: + ItemData(24 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + # Elites + item_names.PRIDE_OF_AUGUSTRGRAD: + ItemData(50 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 28, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SKY_FURY: + ItemData(51 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 29, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SHOCK_DIVISION: + ItemData(52 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 0, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BLACKHAMMER: + ItemData(53 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 1, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.AEGIS_GUARD: + ItemData(54 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 2, SC2Race.TERRAN), + item_names.EMPERORS_SHADOW: + ItemData(55 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SON_OF_KORHAL: + ItemData(56 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BULWARK_COMPANY: + ItemData(57 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 6, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.FIELD_RESPONSE_THETA: + ItemData(58 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.EMPERORS_GUARDIAN: + ItemData(59 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 8, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NIGHT_HAWK: + ItemData(60 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 9, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NIGHT_WOLF: + ItemData(61 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 10, SC2Race.TERRAN), + + # Some other items are moved to Upgrade group because of the way how the bot message is parsed + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON: ItemData(100 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 0, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR: ItemData(102 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 4, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON: ItemData(103 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 8, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR: ItemData(104 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 12, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON: ItemData(105 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 16, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR: ItemData(106 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 20, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + # Bundles + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: ItemData(107 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: ItemData(108 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: ItemData(109 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: ItemData(110 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: ItemData(111 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: ItemData(112 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + + # Unit and structure upgrades + item_names.BUNKER_PROJECTILE_ACCELERATOR: + ItemData(200 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 0, SC2Race.TERRAN, + parent_item=item_names.BUNKER), + item_names.BUNKER_NEOSTEEL_BUNKER: + ItemData(201 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 1, SC2Race.TERRAN, + parent_item=item_names.BUNKER), + item_names.MISSILE_TURRET_TITANIUM_HOUSING: + ItemData(202 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 2, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MISSILE_TURRET), + item_names.MISSILE_TURRET_HELLSTORM_BATTERIES: + ItemData(203 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 3, SC2Race.TERRAN, + parent_item=item_names.MISSILE_TURRET), + item_names.SCV_ADVANCED_CONSTRUCTION: + ItemData(204 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 4, SC2Race.TERRAN), + item_names.SCV_DUAL_FUSION_WELDERS: + ItemData(205 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 5, SC2Race.TERRAN), + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM: + ItemData(206 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 24, SC2Race.TERRAN, + quantity=2), + item_names.PROGRESSIVE_ORBITAL_COMMAND: + ItemData(207 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Deprecated, -1, SC2Race.TERRAN, + quantity=0, classification=ItemClassification.progression), + item_names.MARINE_PROGRESSIVE_STIMPACK: + ItemData(208 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.MARINE, quantity=2), + item_names.MARINE_COMBAT_SHIELD: + ItemData(209 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 9, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.MARINE), + item_names.MEDIC_ADVANCED_MEDIC_FACILITIES: + ItemData(210 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 10, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MEDIC), + item_names.MEDIC_STABILIZER_MEDPACKS: + ItemData(211 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 11, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.MEDIC), + item_names.FIREBAT_INCINERATOR_GAUNTLETS: + ItemData(212 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 12, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.FIREBAT), + item_names.FIREBAT_JUGGERNAUT_PLATING: + ItemData(213 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 13, SC2Race.TERRAN, + parent_item=item_names.FIREBAT), + item_names.MARAUDER_CONCUSSIVE_SHELLS: + ItemData(214 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 14, SC2Race.TERRAN, + parent_item=item_names.MARAUDER), + item_names.MARAUDER_KINETIC_FOAM: + ItemData(215 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 15, SC2Race.TERRAN, + parent_item=item_names.MARAUDER), + item_names.REAPER_U238_ROUNDS: + ItemData(216 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 16, SC2Race.TERRAN, + parent_item=item_names.REAPER), + item_names.REAPER_G4_CLUSTERBOMB: + ItemData(217 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 17, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.REAPER), + item_names.CYCLONE_MAG_FIELD_ACCELERATORS: + ItemData(218 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 18, SC2Race.TERRAN, + parent_item=item_names.CYCLONE), + item_names.CYCLONE_MAG_FIELD_LAUNCHERS: + ItemData(219 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 19, SC2Race.TERRAN, + parent_item=item_names.CYCLONE), + item_names.MARINE_LASER_TARGETING_SYSTEM: + ItemData(220 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 8, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MARINE), + item_names.MARINE_MAGRAIL_MUNITIONS: + ItemData(221 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 20, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.MARINE), + item_names.MARINE_OPTIMIZED_LOGISTICS: + ItemData(222 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 21, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MARINE), + item_names.MEDIC_RESTORATION: + ItemData(223 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 22, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MEDIC), + item_names.MEDIC_OPTICAL_FLARE: + ItemData(224 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 23, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MEDIC), + item_names.MEDIC_RESOURCE_EFFICIENCY: + ItemData(225 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 24, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MEDIC), + item_names.FIREBAT_PROGRESSIVE_STIMPACK: + ItemData(226 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 6, SC2Race.TERRAN, + parent_item=item_names.FIREBAT, quantity=2), + item_names.FIREBAT_RESOURCE_EFFICIENCY: + ItemData(227 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 25, SC2Race.TERRAN, + parent_item=item_names.FIREBAT), + item_names.MARAUDER_PROGRESSIVE_STIMPACK: + ItemData(228 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 8, SC2Race.TERRAN, + parent_item=item_names.MARAUDER, quantity=2), + item_names.MARAUDER_LASER_TARGETING_SYSTEM: + ItemData(229 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 26, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MARAUDER), + item_names.MARAUDER_MAGRAIL_MUNITIONS: + ItemData(230 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 27, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MARAUDER), + item_names.MARAUDER_INTERNAL_TECH_MODULE: + ItemData(231 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 28, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MARAUDER), + item_names.SCV_HOSTILE_ENVIRONMENT_ADAPTATION: + ItemData(232 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 29, SC2Race.TERRAN, + classification=ItemClassification.filler), + item_names.MEDIC_ADAPTIVE_MEDPACKS: + ItemData(233 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.MEDIC), + item_names.MEDIC_NANO_PROJECTOR: + ItemData(234 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 1, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MEDIC), + item_names.FIREBAT_INFERNAL_PRE_IGNITER: + ItemData(235 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 2, SC2Race.TERRAN, + parent_item=item_names.FIREBAT), + item_names.FIREBAT_KINETIC_FOAM: + ItemData(236 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 3, SC2Race.TERRAN, + parent_item=item_names.FIREBAT), + item_names.FIREBAT_NANO_PROJECTORS: + ItemData(237 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 4, SC2Race.TERRAN, + parent_item=item_names.FIREBAT), + item_names.MARAUDER_JUGGERNAUT_PLATING: + ItemData(238 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 5, SC2Race.TERRAN, + parent_item=item_names.MARAUDER), + item_names.REAPER_JET_PACK_OVERDRIVE: + ItemData(239 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 6, SC2Race.TERRAN, + parent_item=item_names.REAPER), + item_names.HELLION_INFERNAL_PLATING: + ItemData(240 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 7, SC2Race.TERRAN, + parent_item=item_names.HELLION), + item_names.VULTURE_AUTO_REPAIR: + ItemData(241 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 8, SC2Race.TERRAN, + parent_item=item_names.VULTURE), + item_names.GOLIATH_SHAPED_HULL: + ItemData(242 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 9, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.GOLIATH), + item_names.GOLIATH_RESOURCE_EFFICIENCY: + ItemData(243 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 10, SC2Race.TERRAN, + parent_item=item_names.GOLIATH), + item_names.GOLIATH_INTERNAL_TECH_MODULE: + ItemData(244 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 11, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.GOLIATH), + item_names.SIEGE_TANK_SHAPED_HULL: + ItemData(245 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 12, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_RESOURCE_EFFICIENCY: + ItemData(246 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 13, SC2Race.TERRAN, + parent_item=item_names.SIEGE_TANK), + item_names.PREDATOR_CLOAK: + ItemData(247 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 14, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.PREDATOR), + item_names.PREDATOR_CHARGE: + ItemData(248 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 15, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.PREDATOR), + item_names.MEDIVAC_SCATTER_VEIL: + ItemData(249 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 16, SC2Race.TERRAN, + parent_item=item_names.MEDIVAC), + item_names.REAPER_PROGRESSIVE_STIMPACK: + ItemData(250 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 10, SC2Race.TERRAN, + parent_item=item_names.REAPER, quantity=2), + item_names.REAPER_LASER_TARGETING_SYSTEM: + ItemData(251 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 17, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.REAPER), + item_names.REAPER_ADVANCED_CLOAKING_FIELD: + ItemData(252 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 18, SC2Race.TERRAN, + parent_item=item_names.REAPER), + item_names.REAPER_SPIDER_MINES: + ItemData(253 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 19, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.REAPER, + important_for_filtering=True), + item_names.REAPER_COMBAT_DRUGS: + ItemData(254 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 20, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.REAPER), + item_names.HELLION_HELLBAT_ASPECT: + ItemData(255 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 21, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.HELLION), + item_names.HELLION_SMART_SERVOS: + ItemData(256 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 22, SC2Race.TERRAN, + parent_item=item_names.HELLION), + item_names.HELLION_OPTIMIZED_LOGISTICS: + ItemData(257 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 23, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.HELLION), + item_names.HELLION_JUMP_JETS: + ItemData(258 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 24, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.HELLION), + item_names.HELLION_PROGRESSIVE_STIMPACK: + ItemData(259 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 12, SC2Race.TERRAN, + parent_item=item_names.HELLION, quantity=2), + item_names.VULTURE_ION_THRUSTERS: + ItemData(260 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 25, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.VULTURE), + item_names.VULTURE_AUTO_LAUNCHERS: + ItemData(261 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 26, SC2Race.TERRAN, + parent_item=item_names.VULTURE), + item_names.SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION: + ItemData(262 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 27, SC2Race.TERRAN), + item_names.GOLIATH_JUMP_JETS: + ItemData(263 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 28, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.GOLIATH), + item_names.GOLIATH_OPTIMIZED_LOGISTICS: + ItemData(264 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 29, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.GOLIATH), + item_names.DIAMONDBACK_HYPERFLUXOR: + ItemData(265 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 0, SC2Race.TERRAN, + parent_item=item_names.DIAMONDBACK), + item_names.DIAMONDBACK_BURST_CAPACITORS: + ItemData(266 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 1, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.DIAMONDBACK), + item_names.DIAMONDBACK_RESOURCE_EFFICIENCY: + ItemData(267 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 2, SC2Race.TERRAN, + parent_item=item_names.DIAMONDBACK), + item_names.SIEGE_TANK_JUMP_JETS: + ItemData(268 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 3, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_SPIDER_MINES: + ItemData(269 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 4, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.SIEGE_TANK, + important_for_filtering=True), + item_names.SIEGE_TANK_SMART_SERVOS: + ItemData(270 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 5, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_GRADUATING_RANGE: + ItemData(271 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_LASER_TARGETING_SYSTEM: + ItemData(272 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 7, SC2Race.TERRAN, + parent_item=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_ADVANCED_SIEGE_TECH: + ItemData(273 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 8, SC2Race.TERRAN, + parent_item=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_INTERNAL_TECH_MODULE: + ItemData(274 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 9, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.SIEGE_TANK), + item_names.PREDATOR_RESOURCE_EFFICIENCY: + ItemData(275 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 10, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.PREDATOR), + item_names.MEDIVAC_EXPANDED_HULL: + ItemData(276 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 11, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MEDIVAC), + item_names.MEDIVAC_AFTERBURNERS: + ItemData(277 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 12, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MEDIVAC), + item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY: + ItemData(278 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 13, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.WRAITH), + item_names.VIKING_SMART_SERVOS: + ItemData(279 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 14, SC2Race.TERRAN, + parent_item=item_names.VIKING), + item_names.VIKING_ANTI_MECHANICAL_MUNITION: + ItemData(280 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 15, SC2Race.TERRAN, + parent_item=item_names.VIKING), + item_names.DIAMONDBACK_ION_THRUSTERS: + ItemData(281 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 21, SC2Race.TERRAN, + parent_item=item_names.DIAMONDBACK), + item_names.WARHOUND_RESOURCE_EFFICIENCY: + ItemData(282 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 13, SC2Race.TERRAN, + parent_item=item_names.WARHOUND), + item_names.WARHOUND_REINFORCED_PLATING: + ItemData(283 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 14, SC2Race.TERRAN, + parent_item=item_names.WARHOUND), + item_names.HERC_RESOURCE_EFFICIENCY: + ItemData(284 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 15, SC2Race.TERRAN, + parent_item=item_names.HERC), + item_names.HERC_JUGGERNAUT_PLATING: + ItemData(285 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 16, SC2Race.TERRAN, + parent_item=item_names.HERC), + item_names.HERC_KINETIC_FOAM: + ItemData(286 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 17, SC2Race.TERRAN, + parent_item=item_names.HERC), + item_names.REAPER_RESOURCE_EFFICIENCY: + ItemData(287 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 18, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.REAPER,), + item_names.REAPER_KINETIC_FOAM: + ItemData(288 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 19, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.REAPER), + item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK: + ItemData(289 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.SIEGE_TANK, quantity=2), + item_names.SIEGE_TANK_ENHANCED_COMBUSTION_ENGINES: + ItemData(290 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 20, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.SIEGE_TANK), + item_names.MEDIVAC_RAPID_REIGNITION_SYSTEMS: + ItemData(291 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 21, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MEDIVAC), + item_names.BATTLECRUISER_BEHEMOTH_REACTOR: + ItemData(292 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 22, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.BATTLECRUISER), + item_names.THOR_RAPID_RELOAD: + ItemData(293 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 23, SC2Race.TERRAN, + parent_item=item_names.THOR), + item_names.LIBERATOR_GUERILLA_MISSILES: + ItemData(294 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 24, SC2Race.TERRAN, + parent_item=item_names.LIBERATOR), + item_names.WIDOW_MINE_RESOURCE_EFFICIENCY: + ItemData(295 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 25, SC2Race.TERRAN, + parent_item=item_names.WIDOW_MINE), + item_names.HERC_GRAPPLE_PULL: + ItemData(296 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 26, SC2Race.TERRAN, + parent_item=item_names.HERC), + item_names.COMMAND_CENTER_SCANNER_SWEEP: + ItemData(297 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 27, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.COMMAND_CENTER_MULE: + ItemData(298 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 28, SC2Race.TERRAN, + important_for_filtering=True), + item_names.COMMAND_CENTER_EXTRA_SUPPLIES: + ItemData(299 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 29, SC2Race.TERRAN, + important_for_filtering=True), + item_names.HELLION_TWIN_LINKED_FLAMETHROWER: + ItemData(300 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 16, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.HELLION), + item_names.HELLION_THERMITE_FILAMENTS: + ItemData(301 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 17, SC2Race.TERRAN, + parent_item=item_names.HELLION), + item_names.SPIDER_MINE_CERBERUS_MINE: + ItemData(302 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 18, SC2Race.TERRAN, + classification=ItemClassification.filler), + item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE: + ItemData(303 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 16, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.VULTURE, quantity=2), + item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM: + ItemData(304 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 19, SC2Race.TERRAN, + parent_item=item_names.GOLIATH), + item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM: + ItemData(305 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 20, SC2Race.TERRAN, + parent_item=item_names.GOLIATH), + item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL: + ItemData(306 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 4, SC2Race.TERRAN, + parent_item=item_names.DIAMONDBACK, quantity=2), + item_names.DIAMONDBACK_SHAPED_HULL: + ItemData(307 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 22, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.DIAMONDBACK), + item_names.SIEGE_TANK_MAELSTROM_ROUNDS: + ItemData(308 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 23, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_SHAPED_BLAST: + ItemData(309 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 24, SC2Race.TERRAN, + parent_item=item_names.SIEGE_TANK), + item_names.MEDIVAC_RAPID_DEPLOYMENT_TUBE: + ItemData(310 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 25, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MEDIVAC), + item_names.MEDIVAC_ADVANCED_HEALING_AI: + ItemData(311 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 26, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MEDIVAC), + item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS: + ItemData(312 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 18, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.WRAITH, quantity=2), + item_names.WRAITH_DISPLACEMENT_FIELD: + ItemData(313 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 27, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.WRAITH), + item_names.VIKING_RIPWAVE_MISSILES: + ItemData(314 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 28, SC2Race.TERRAN, + parent_item=item_names.VIKING), + item_names.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM: + ItemData(315 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 29, SC2Race.TERRAN, + parent_item=item_names.VIKING), + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS: + ItemData(316 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 2, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.BANSHEE, quantity=2), + item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY: + ItemData(317 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.BANSHEE), + item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS: + ItemData(318 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 2, SC2Race.TERRAN, + parent_item=item_names.BATTLECRUISER, quantity=2), + item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX: + ItemData(319 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 20, SC2Race.TERRAN, + parent_item=item_names.BATTLECRUISER, quantity=2), + item_names.GHOST_OCULAR_IMPLANTS: + ItemData(320 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 2, SC2Race.TERRAN, + parent_item=item_names.GHOST), + item_names.GHOST_CRIUS_SUIT: + ItemData(321 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 3, SC2Race.TERRAN, + parent_item=item_names.GHOST), + item_names.SPECTRE_PSIONIC_LASH: + ItemData(322 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 4, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.SPECTRE), + item_names.SPECTRE_NYX_CLASS_CLOAKING_MODULE: + ItemData(323 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 5, SC2Race.TERRAN, + parent_item=item_names.SPECTRE), + item_names.THOR_330MM_BARRAGE_CANNON: + ItemData(324 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 6, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.THOR), + item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL: + ItemData(325 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 22, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.THOR, quantity=2), + item_names.LIBERATOR_ADVANCED_BALLISTICS: + ItemData(326 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 7, SC2Race.TERRAN, + parent_item=item_names.LIBERATOR), + item_names.LIBERATOR_RAID_ARTILLERY: + ItemData(327 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 8, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.LIBERATOR), + item_names.WIDOW_MINE_DRILLING_CLAWS: + ItemData(328 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 9, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.WIDOW_MINE), + item_names.WIDOW_MINE_CONCEALMENT: + ItemData(329 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 10, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.WIDOW_MINE), + item_names.MEDIVAC_ADVANCED_CLOAKING_FIELD: + ItemData(330 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 11, SC2Race.TERRAN, + parent_item=item_names.MEDIVAC), + item_names.WRAITH_TRIGGER_OVERRIDE: + ItemData(331 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 12, SC2Race.TERRAN, + parent_item=item_names.WRAITH), + item_names.WRAITH_INTERNAL_TECH_MODULE: + ItemData(332 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 13, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.WRAITH), + item_names.WRAITH_RESOURCE_EFFICIENCY: + ItemData(333 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 14, SC2Race.TERRAN, + parent_item=item_names.WRAITH), + item_names.VIKING_SHREDDER_ROUNDS: + ItemData(334 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 15, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.VIKING), + item_names.VIKING_WILD_MISSILES: + ItemData(335 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 16, SC2Race.TERRAN, + parent_item=item_names.VIKING), + item_names.BANSHEE_SHAPED_HULL: + ItemData(336 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 17, SC2Race.TERRAN, + parent_item=item_names.BANSHEE), + item_names.BANSHEE_ADVANCED_TARGETING_OPTICS: + ItemData(337 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 18, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.BANSHEE), + item_names.BANSHEE_DISTORTION_BLASTERS: + ItemData(338 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 19, SC2Race.TERRAN, + parent_item=item_names.BANSHEE), + item_names.BANSHEE_ROCKET_BARRAGE: + ItemData(339 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 20, SC2Race.TERRAN, + parent_item=item_names.BANSHEE), + item_names.GHOST_RESOURCE_EFFICIENCY: + ItemData(340 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 21, SC2Race.TERRAN, + parent_item=item_names.GHOST), + item_names.SPECTRE_RESOURCE_EFFICIENCY: + ItemData(341 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 22, SC2Race.TERRAN, + parent_item=item_names.SPECTRE), + item_names.THOR_BUTTON_WITH_A_SKULL_ON_IT: + ItemData(342 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 23, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.THOR), + item_names.THOR_LASER_TARGETING_SYSTEM: + ItemData(343 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 24, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.THOR), + item_names.THOR_LARGE_SCALE_FIELD_CONSTRUCTION: + ItemData(344 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 25, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.THOR), + item_names.RAVEN_RESOURCE_EFFICIENCY: + ItemData(345 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 26, SC2Race.TERRAN, + parent_item=item_names.RAVEN), + item_names.RAVEN_DURABLE_MATERIALS: + ItemData(346 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 27, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.RAVEN), + item_names.SCIENCE_VESSEL_IMPROVED_NANO_REPAIR: + ItemData(347 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 28, SC2Race.TERRAN, + parent_item=item_names.SCIENCE_VESSEL), + item_names.SCIENCE_VESSEL_ADVANCED_AI_SYSTEMS: + ItemData(348 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 29, SC2Race.TERRAN, + parent_item=item_names.SCIENCE_VESSEL), + item_names.CYCLONE_RESOURCE_EFFICIENCY: + ItemData(349 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 0, SC2Race.TERRAN, + parent_item=item_names.CYCLONE), + item_names.BANSHEE_HYPERFLIGHT_ROTORS: + ItemData(350 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 1, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.BANSHEE), + item_names.BANSHEE_LASER_TARGETING_SYSTEM: + ItemData(351 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 2, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.BANSHEE), + item_names.BANSHEE_INTERNAL_TECH_MODULE: + ItemData(352 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 3, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.BANSHEE), + item_names.BATTLECRUISER_TACTICAL_JUMP: + ItemData(353 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 4, SC2Race.TERRAN, + parent_item=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_CLOAK: + ItemData(354 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 5, SC2Race.TERRAN, + parent_item=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_ATX_LASER_BATTERY: + ItemData(355 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_OPTIMIZED_LOGISTICS: + ItemData(356 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 7, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_INTERNAL_TECH_MODULE: + ItemData(357 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 8, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.BATTLECRUISER), + item_names.GHOST_EMP_ROUNDS: + ItemData(358 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 9, SC2Race.TERRAN, + parent_item=item_names.GHOST), + item_names.GHOST_LOCKDOWN: + ItemData(359 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 10, SC2Race.TERRAN, + parent_item=item_names.GHOST), + item_names.SPECTRE_IMPALER_ROUNDS: + ItemData(360 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 11, SC2Race.TERRAN, + parent_item=item_names.SPECTRE), + item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD: + ItemData(361 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 14, SC2Race.TERRAN, + parent_item=item_names.THOR, quantity=2), + item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE: + ItemData(363 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 12, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.RAVEN), + item_names.RAVEN_SPIDER_MINES: + ItemData(364 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 13, SC2Race.TERRAN, + parent_item=item_names.RAVEN, important_for_filtering=True), + item_names.RAVEN_RAILGUN_TURRET: + ItemData(365 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 14, SC2Race.TERRAN, + parent_item=item_names.RAVEN), + item_names.RAVEN_HUNTER_SEEKER_WEAPON: + ItemData(366 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 15, SC2Race.TERRAN, + classification=ItemClassification.progression, parent_item=item_names.RAVEN), + item_names.RAVEN_INTERFERENCE_MATRIX: + ItemData(367 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 16, SC2Race.TERRAN, + parent_item=item_names.RAVEN), + item_names.RAVEN_ANTI_ARMOR_MISSILE: + ItemData(368 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 17, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.RAVEN), + item_names.RAVEN_INTERNAL_TECH_MODULE: + ItemData(369 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 18, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.RAVEN), + item_names.SCIENCE_VESSEL_EMP_SHOCKWAVE: + ItemData(370 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 19, SC2Race.TERRAN, + parent_item=item_names.SCIENCE_VESSEL), + item_names.SCIENCE_VESSEL_DEFENSIVE_MATRIX: + ItemData(371 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 20, SC2Race.TERRAN, + parent_item=item_names.SCIENCE_VESSEL), + item_names.CYCLONE_TARGETING_OPTICS: + ItemData(372 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 21, SC2Race.TERRAN, + parent_item=item_names.CYCLONE), + item_names.CYCLONE_RAPID_FIRE_LAUNCHERS: + ItemData(373 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 22, SC2Race.TERRAN, + parent_item=item_names.CYCLONE), + item_names.LIBERATOR_CLOAK: + ItemData(374 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 23, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.LIBERATOR), + item_names.LIBERATOR_LASER_TARGETING_SYSTEM: + ItemData(375 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 24, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.LIBERATOR), + item_names.LIBERATOR_OPTIMIZED_LOGISTICS: + ItemData(376 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 25, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.LIBERATOR), + item_names.WIDOW_MINE_BLACK_MARKET_LAUNCHERS: + ItemData(377 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 26, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.WIDOW_MINE), + item_names.WIDOW_MINE_EXECUTIONER_MISSILES: + ItemData(378 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 27, SC2Race.TERRAN, + parent_item=item_names.WIDOW_MINE), + item_names.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS: + ItemData(379 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 28, + SC2Race.TERRAN, parent_item=item_names.VALKYRIE), + item_names.VALKYRIE_SHAPED_HULL: + ItemData(380 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 29, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.VALKYRIE), + item_names.VALKYRIE_FLECHETTE_MISSILES: + ItemData(381 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 0, SC2Race.TERRAN, + parent_item=item_names.VALKYRIE), + item_names.VALKYRIE_AFTERBURNERS: + ItemData(382 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 1, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.VALKYRIE), + item_names.CYCLONE_INTERNAL_TECH_MODULE: + ItemData(383 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 2, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.CYCLONE), + item_names.LIBERATOR_SMART_SERVOS: + ItemData(384 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 3, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.LIBERATOR), + item_names.LIBERATOR_RESOURCE_EFFICIENCY: + ItemData(385 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 4, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.LIBERATOR), + item_names.HERCULES_INTERNAL_FUSION_MODULE: + ItemData(386 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 5, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.HERCULES), + item_names.HERCULES_TACTICAL_JUMP: + ItemData(387 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 6, SC2Race.TERRAN, + parent_item=item_names.HERCULES), + item_names.PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS: + ItemData(388 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 28, SC2Race.TERRAN, + parent_item=item_names.PLANETARY_FORTRESS, quantity=2), + item_names.PLANETARY_FORTRESS_ADVANCED_TARGETING: + ItemData(389 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 7, SC2Race.TERRAN, + parent_item=item_names.PLANETARY_FORTRESS), + item_names.VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR: + ItemData(390 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 8, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.VALKYRIE), + item_names.VALKYRIE_RESOURCE_EFFICIENCY: + ItemData(391 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 9, SC2Race.TERRAN, + parent_item=item_names.VALKYRIE), + item_names.PREDATOR_VESPENE_SYNTHESIS: + ItemData(392 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 10, SC2Race.TERRAN, + parent_item=item_names.PREDATOR), + item_names.BATTLECRUISER_BEHEMOTH_PLATING: + ItemData(393 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 11, SC2Race.TERRAN, + parent_item=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_COVERT_OPS_ENGINES: + ItemData(394 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 12, SC2Race.TERRAN, + parent_item=item_names.BATTLECRUISER), + item_names.PLANETARY_FORTRESS_ORBITAL_MODULE: + ItemData(395 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 1, SC2Race.TERRAN, + parent_item=item_names.PLANETARY_FORTRESS), + item_names.DEVASTATOR_TURRET_CONCUSSIVE_GRENADES: + ItemData(396 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 0, SC2Race.TERRAN, + parent_item=item_names.DEVASTATOR_TURRET), + item_names.DEVASTATOR_TURRET_ANTI_ARMOR_MUNITIONS: + ItemData(397 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 1, SC2Race.TERRAN, + parent_item=item_names.DEVASTATOR_TURRET), + item_names.DEVASTATOR_TURRET_RESOURCE_EFFICIENCY: + ItemData(398 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 2, SC2Race.TERRAN, + parent_item=item_names.DEVASTATOR_TURRET), + item_names.MISSILE_TURRET_RESOURCE_EFFICENCY: + ItemData(399 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 3, SC2Race.TERRAN, + classification=ItemClassification.filler, parent_item=item_names.MISSILE_TURRET), + + #Buildings + item_names.BUNKER: + ItemData(400 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 0, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MISSILE_TURRET: + ItemData(401 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 1, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SENSOR_TOWER: + ItemData(402 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 2, SC2Race.TERRAN), + item_names.DEVASTATOR_TURRET: + ItemData(403 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + + item_names.WAR_PIGS: + ItemData(500 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 0, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.DEVIL_DOGS: + ItemData(501 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 1, SC2Race.TERRAN, + classification=ItemClassification.filler), + item_names.HAMMER_SECURITIES: + ItemData(502 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 2, SC2Race.TERRAN), + item_names.SPARTAN_COMPANY: + ItemData(503 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SIEGE_BREAKERS: + ItemData(504 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 4, SC2Race.TERRAN), + item_names.HELS_ANGELS: + ItemData(505 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.DUSK_WINGS: + ItemData(506 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 6, SC2Race.TERRAN), + item_names.JACKSONS_REVENGE: + ItemData(507 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 7, SC2Race.TERRAN), + item_names.SKIBIS_ANGELS: + ItemData(508 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 8, SC2Race.TERRAN), + item_names.DEATH_HEADS: + ItemData(509 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 9, SC2Race.TERRAN), + item_names.WINGED_NIGHTMARES: + ItemData(510 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 10, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MIDNIGHT_RIDERS: + ItemData(511 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 11, SC2Race.TERRAN), + item_names.BRYNHILDS: + ItemData(512 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 12, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.JOTUN: + ItemData(513 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 13, SC2Race.TERRAN), + + item_names.ULTRA_CAPACITORS: + ItemData(600 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 0, SC2Race.TERRAN), + item_names.VANADIUM_PLATING: + ItemData(601 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 1, SC2Race.TERRAN), + item_names.ORBITAL_DEPOTS: + ItemData(602 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 2, SC2Race.TERRAN), + item_names.MICRO_FILTERING: + ItemData(603 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 3, SC2Race.TERRAN), + item_names.AUTOMATED_REFINERY: + ItemData(604 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 4, SC2Race.TERRAN), + item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR: + ItemData(605 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 5, SC2Race.TERRAN), + item_names.RAVEN: + ItemData(606 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 22, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SCIENCE_VESSEL: + ItemData(607 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 23, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.TECH_REACTOR: + ItemData(608 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 6, SC2Race.TERRAN), + item_names.ORBITAL_STRIKE: + ItemData(609 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 7, SC2Race.TERRAN), + item_names.BUNKER_SHRIKE_TURRET: + ItemData(610 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 6, SC2Race.TERRAN, + parent_item=item_names.BUNKER), + item_names.BUNKER_FORTIFIED_BUNKER: + ItemData(611 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 7, SC2Race.TERRAN, + parent_item=item_names.BUNKER), + item_names.PLANETARY_FORTRESS: + ItemData(612 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PERDITION_TURRET: + ItemData(613 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PREDATOR: + ItemData(614 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 24, SC2Race.TERRAN, + classification=ItemClassification.filler), + item_names.HERCULES: + ItemData(615 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 25, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.CELLULAR_REACTOR: + ItemData(616 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 8, SC2Race.TERRAN), + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: + ItemData(617 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 4, SC2Race.TERRAN, quantity=3, + classification= ItemClassification.progression), + item_names.HIVE_MIND_EMULATOR: + ItemData(618 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PSI_DISRUPTER: + ItemData(619 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 6, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.STRUCTURE_ARMOR: + ItemData(620 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 9, SC2Race.TERRAN), + item_names.HI_SEC_AUTO_TRACKING: + ItemData(621 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 10, SC2Race.TERRAN), + item_names.ADVANCED_OPTICS: + ItemData(622 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 11, SC2Race.TERRAN), + item_names.ROGUE_FORCES: + ItemData(623 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 12, SC2Race.TERRAN), + item_names.MECHANICAL_KNOW_HOW: + ItemData(624 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 13, SC2Race.TERRAN), + item_names.MERCENARY_MUNITIONS: + ItemData(625 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 14, SC2Race.TERRAN), + item_names.FAST_DELIVERY: + ItemData(626 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 15, SC2Race.TERRAN), + item_names.RAPID_REINFORCEMENT: + ItemData(627 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 16, SC2Race.TERRAN), + item_names.FUSION_CORE_FUSION_REACTOR: + ItemData(628 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 17, SC2Race.TERRAN), + + # WoL Protoss + item_names.ZEALOT: + ItemData(700 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 0, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.STALKER: + ItemData(701 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 1, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.HIGH_TEMPLAR: + ItemData(702 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 2, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DARK_TEMPLAR: + ItemData(703 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 3, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.IMMORTAL: + ItemData(704 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 4, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.COLOSSUS: + ItemData(705 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 5, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.PHOENIX: + ItemData(706 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 6, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.VOID_RAY: + ItemData(707 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 7, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.CARRIER: + ItemData(708 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 8, SC2Race.PROTOSS, + classification=ItemClassification.progression), + + item_names.SCIENCE_VESSEL_TACTICAL_JUMP: + ItemData(750 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 4, SC2Race.TERRAN, + parent_item=item_names.SCIENCE_VESSEL), + item_names.LIBERATOR_COMPRESSED_ROCKET_FUEL: + ItemData(751 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 5, SC2Race.TERRAN, + parent_item=item_names.LIBERATOR), + item_names.BATTLECRUISER_FIELD_ASSIST_TARGETING_SYSTEM: + ItemData(752 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 6, SC2Race.TERRAN, + parent_item=item_names.BATTLECRUISER), + item_names.PREDATOR_ADAPTIVE_DEFENSES: + ItemData(753 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 7, SC2Race.TERRAN, + parent_item=item_names.PREDATOR), + item_names.VIKING_AESIR_TURBINES: + ItemData(754 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 8, SC2Race.TERRAN, + parent_item=item_names.VIKING), + item_names.MEDIVAC_RESOURCE_EFFICIENCY: + ItemData(755 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 9, SC2Race.TERRAN, + parent_item=item_names.MEDIVAC), + item_names.EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES: + ItemData(756 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 10, SC2Race.TERRAN, + parent_item=item_names.EMPERORS_SHADOW), + item_names.DOMINION_TROOPER_B2_HIGH_CAL_LMG: + ItemData(757 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 11, SC2Race.TERRAN, + parent_item=item_names.DOMINION_TROOPER, important_for_filtering=True), + item_names.DOMINION_TROOPER_HAILSTORM_LAUNCHER: + ItemData(758 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 12, SC2Race.TERRAN, + parent_item=item_names.DOMINION_TROOPER, important_for_filtering=True), + item_names.DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER: + ItemData(759 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 13, SC2Race.TERRAN, + parent_item=item_names.DOMINION_TROOPER, important_for_filtering=True), + item_names.DOMINION_TROOPER_ADVANCED_ALLOYS: + ItemData(760 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 14, SC2Race.TERRAN, + parent_item=item_names.DOMINION_TROOPER), + item_names.DOMINION_TROOPER_OPTIMIZED_LOGISTICS: + ItemData(761 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 15, SC2Race.TERRAN, + parent_item=item_names.DOMINION_TROOPER, classification=ItemClassification.filler), + item_names.SCV_CONSTRUCTION_JUMP_JETS: + ItemData(762 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 16, SC2Race.TERRAN), + item_names.WIDOW_MINE_DEMOLITION_ARMAMENTS: + ItemData(763 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 17, SC2Race.TERRAN, + parent_item=item_names.WIDOW_MINE), + + # Filler items to fill remaining spots + item_names.STARTING_MINERALS: + ItemData(800 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Minerals, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.STARTING_VESPENE: + ItemData(801 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Vespene, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.STARTING_SUPPLY: + ItemData(802 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Supply, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + # This item is used to "remove" location from the game. Never placed unless plando'd + item_names.NOTHING: + ItemData(803 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Nothing, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.trap), + + # Nova gear + item_names.NOVA_GHOST_VISOR: + ItemData(900 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 0, SC2Race.TERRAN), + item_names.NOVA_RANGEFINDER_OCULUS: + ItemData(901 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 1, SC2Race.TERRAN), + item_names.NOVA_DOMINATION: + ItemData(902 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 2, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_BLINK: + ItemData(903 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE: + ItemData(904 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 0, SC2Race.TERRAN, quantity=2, + classification=ItemClassification.progression), + item_names.NOVA_ENERGY_SUIT_MODULE: + ItemData(905 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 4, SC2Race.TERRAN), + item_names.NOVA_ARMORED_SUIT_MODULE: + ItemData(906 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_JUMP_SUIT_MODULE: + ItemData(907 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 6, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_C20A_CANISTER_RIFLE: + ItemData(908 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_HELLFIRE_SHOTGUN: + ItemData(909 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 8, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_PLASMA_RIFLE: + ItemData(910 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 9, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_MONOMOLECULAR_BLADE: + ItemData(911 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 10, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_BLAZEFIRE_GUNBLADE: + ItemData(912 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 11, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_STIM_INFUSION: + ItemData(913 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 12, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_PULSE_GRENADES: + ItemData(914 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 13, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_FLASHBANG_GRENADES: + ItemData(915 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 14, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_IONIC_FORCE_FIELD: + ItemData(916 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 15, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_HOLO_DECOY: + ItemData(917 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 16, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_NUKE: + ItemData(918 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 17, SC2Race.TERRAN, + classification=ItemClassification.progression), + + # HotS + item_names.ZERGLING: + ItemData(0 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 0, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SWARM_QUEEN: + ItemData(1 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 1, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ROACH: + ItemData(2 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 2, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.HYDRALISK: + ItemData(3 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 3, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ZERGLING_BANELING_ASPECT: + ItemData(4 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 5, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ABERRATION: + ItemData(5 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 5, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.MUTALISK: + ItemData(6 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 6, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SWARM_HOST: + ItemData(7 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 7, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTOR: + ItemData(8 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 8, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ULTRALISK: + ItemData(9 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 9, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SPORE_CRAWLER: + ItemData(10 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 10, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SPINE_CRAWLER: + ItemData(11 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 11, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.CORRUPTOR: + ItemData(12 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 12, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SCOURGE: + ItemData(13 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 13, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.BROOD_QUEEN: + ItemData(14 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 4, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.DEFILER: + ItemData(15 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 14, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_MARINE: + ItemData(16 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 15, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_BUNKER: + ItemData(17 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 16, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.NYDUS_WORM: + ItemData(18 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 17, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.OMEGA_WORM: + ItemData(19 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 18, SC2Race.ZERG, + classification=ItemClassification.useful), + item_names.INFESTED_SIEGE_TANK: + ItemData(20 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 19, SC2Race.ZERG, + classification=ItemClassification.useful), + item_names.INFESTED_DIAMONDBACK: + ItemData(21 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 20, SC2Race.ZERG, + classification=ItemClassification.useful), + item_names.INFESTED_BANSHEE: + ItemData(22 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 21, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_LIBERATOR: + ItemData(23 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 22, SC2Race.ZERG, + classification=ItemClassification.useful), + item_names.INFESTED_MISSILE_TURRET: + ItemData(24 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 23, SC2Race.ZERG, + classification=ItemClassification.progression), + + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK: ItemData(100 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 0, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK: ItemData(101 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 4, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE: ItemData(102 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 8, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK: ItemData(103 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 12, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE: ItemData(104 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 16, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + # Bundles + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: ItemData(105 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: ItemData(106 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: ItemData(107 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: ItemData(108 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + + item_names.ZERGLING_HARDENED_CARAPACE: + ItemData(200 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 0, SC2Race.ZERG, parent_item=item_names.ZERGLING), + item_names.ZERGLING_ADRENAL_OVERLOAD: + ItemData(201 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 1, SC2Race.ZERG, parent_item=item_names.ZERGLING, classification=ItemClassification.progression), + item_names.ZERGLING_METABOLIC_BOOST: + ItemData(202 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 2, SC2Race.ZERG, parent_item=item_names.ZERGLING, classification=ItemClassification.filler), + item_names.ROACH_HYDRIODIC_BILE: + ItemData(203 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 3, SC2Race.ZERG, parent_item=item_names.ROACH, classification=ItemClassification.progression), + item_names.ROACH_ADAPTIVE_PLATING: + ItemData(204 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 4, SC2Race.ZERG, parent_item=item_names.ROACH), + item_names.ROACH_TUNNELING_CLAWS: + ItemData(205 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 5, SC2Race.ZERG, parent_item=item_names.ROACH, classification=ItemClassification.filler), + item_names.HYDRALISK_FRENZY: + ItemData(206 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 6, SC2Race.ZERG, parent_item=item_names.HYDRALISK, classification=ItemClassification.progression), + item_names.HYDRALISK_ANCILLARY_CARAPACE: + ItemData(207 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 7, SC2Race.ZERG, parent_item=item_names.HYDRALISK, classification=ItemClassification.filler), + item_names.HYDRALISK_GROOVED_SPINES: + ItemData(208 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 8, SC2Race.ZERG, parent_item=item_names.HYDRALISK), + item_names.BANELING_CORROSIVE_ACID: + ItemData(209 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 9, SC2Race.ZERG, + parent_item=item_names.ZERGLING_BANELING_ASPECT, classification=ItemClassification.progression), + item_names.BANELING_RUPTURE: + ItemData(210 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 10, SC2Race.ZERG, + parent_item=item_names.ZERGLING_BANELING_ASPECT, + classification=ItemClassification.filler), + item_names.BANELING_REGENERATIVE_ACID: + ItemData(211 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 11, SC2Race.ZERG, + parent_item=item_names.ZERGLING_BANELING_ASPECT, + classification=ItemClassification.filler), + item_names.MUTALISK_VICIOUS_GLAIVE: + ItemData(212 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 12, SC2Race.ZERG, parent_item=item_names.MUTALISK), + item_names.MUTALISK_RAPID_REGENERATION: + ItemData(213 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 13, SC2Race.ZERG, parent_item=item_names.MUTALISK), + item_names.MUTALISK_SUNDERING_GLAIVE: + ItemData(214 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 14, SC2Race.ZERG, parent_item=item_names.MUTALISK), + item_names.SWARM_HOST_BURROW: + ItemData(215 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 15, SC2Race.ZERG, parent_item=item_names.SWARM_HOST, classification=ItemClassification.filler), + item_names.SWARM_HOST_RAPID_INCUBATION: + ItemData(216 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 16, SC2Race.ZERG, parent_item=item_names.SWARM_HOST), + item_names.SWARM_HOST_PRESSURIZED_GLANDS: + ItemData(217 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 17, SC2Race.ZERG, parent_item=item_names.SWARM_HOST, classification=ItemClassification.progression), + item_names.ULTRALISK_BURROW_CHARGE: + ItemData(218 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 18, SC2Race.ZERG, parent_item=item_names.ULTRALISK), + item_names.ULTRALISK_TISSUE_ASSIMILATION: + ItemData(219 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 19, SC2Race.ZERG, parent_item=item_names.ULTRALISK), + item_names.ULTRALISK_MONARCH_BLADES: + ItemData(220 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 20, SC2Race.ZERG, parent_item=item_names.ULTRALISK), + item_names.CORRUPTOR_CAUSTIC_SPRAY: + ItemData(221 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 21, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), + item_names.CORRUPTOR_CORRUPTION: + ItemData(222 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 22, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), + item_names.SCOURGE_VIRULENT_SPORES: + ItemData(223 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 23, SC2Race.ZERG, parent_item=item_names.SCOURGE), + item_names.SCOURGE_RESOURCE_EFFICIENCY: + ItemData(224 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 24, SC2Race.ZERG, parent_item=item_names.SCOURGE, classification=ItemClassification.progression), + item_names.SCOURGE_SWARM_SCOURGE: + ItemData(225 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 25, SC2Race.ZERG, parent_item=item_names.SCOURGE), + item_names.ZERGLING_SHREDDING_CLAWS: + ItemData(226 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 26, SC2Race.ZERG, parent_item=item_names.ZERGLING), + item_names.ROACH_GLIAL_RECONSTITUTION: + ItemData(227 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 27, SC2Race.ZERG, parent_item=item_names.ROACH, classification=ItemClassification.progression), + item_names.ROACH_ORGANIC_CARAPACE: + ItemData(228 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 28, SC2Race.ZERG, parent_item=item_names.ROACH), + item_names.HYDRALISK_MUSCULAR_AUGMENTS: + ItemData(229 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 29, SC2Race.ZERG, parent_item=item_names.HYDRALISK), + item_names.HYDRALISK_RESOURCE_EFFICIENCY: + ItemData(230 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 0, SC2Race.ZERG, parent_item=item_names.HYDRALISK), + item_names.BANELING_CENTRIFUGAL_HOOKS: + ItemData(231 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 1, SC2Race.ZERG, + parent_item=item_names.ZERGLING_BANELING_ASPECT), + item_names.BANELING_TUNNELING_JAWS: + ItemData(232 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 2, SC2Race.ZERG, + parent_item=item_names.ZERGLING_BANELING_ASPECT), + item_names.BANELING_RAPID_METAMORPH: + ItemData(233 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 3, SC2Race.ZERG, + parent_item=item_names.ZERGLING_BANELING_ASPECT), + item_names.MUTALISK_SEVERING_GLAIVE: + ItemData(234 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 4, SC2Race.ZERG, parent_item=item_names.MUTALISK, classification=ItemClassification.progression), + item_names.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE: + ItemData(235 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 5, SC2Race.ZERG, parent_item=item_names.MUTALISK), + item_names.SWARM_HOST_LOCUST_METABOLIC_BOOST: + ItemData(236 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 6, SC2Race.ZERG, parent_item=item_names.SWARM_HOST, classification=ItemClassification.filler), + item_names.SWARM_HOST_ENDURING_LOCUSTS: + ItemData(237 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 7, SC2Race.ZERG, parent_item=item_names.SWARM_HOST), + item_names.SWARM_HOST_ORGANIC_CARAPACE: + ItemData(238 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 8, SC2Race.ZERG, parent_item=item_names.SWARM_HOST), + item_names.SWARM_HOST_RESOURCE_EFFICIENCY: + ItemData(239 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 9, SC2Race.ZERG, parent_item=item_names.SWARM_HOST, classification=ItemClassification.progression), + item_names.ULTRALISK_ANABOLIC_SYNTHESIS: + ItemData(240 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 10, SC2Race.ZERG, parent_item=item_names.ULTRALISK, classification=ItemClassification.filler), + item_names.ULTRALISK_CHITINOUS_PLATING: + ItemData(241 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 11, SC2Race.ZERG, parent_item=item_names.ULTRALISK), + item_names.ULTRALISK_ORGANIC_CARAPACE: + ItemData(242 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 12, SC2Race.ZERG, parent_item=item_names.ULTRALISK), + item_names.ULTRALISK_RESOURCE_EFFICIENCY: + ItemData(243 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 13, SC2Race.ZERG, parent_item=item_names.ULTRALISK), + item_names.DEVOURER_CORROSIVE_SPRAY: + ItemData(244 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 14, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), + item_names.DEVOURER_GAPING_MAW: + ItemData(245 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 15, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), + item_names.DEVOURER_IMPROVED_OSMOSIS: + ItemData(246 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 16, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, + classification=ItemClassification.filler), + item_names.DEVOURER_PRESCIENT_SPORES: + ItemData(247 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 17, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), + item_names.GUARDIAN_PROLONGED_DISPERSION: + ItemData(248 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 18, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.GUARDIAN_PRIMAL_ADAPTATION: + ItemData(249 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 19, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.GUARDIAN_SORONAN_ACID: + ItemData(250 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 20, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.IMPALER_ADAPTIVE_TALONS: + ItemData(251 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 21, SC2Race.ZERG, + parent_item=item_names.HYDRALISK_IMPALER_ASPECT, + classification=ItemClassification.filler), + item_names.IMPALER_SECRETION_GLANDS: + ItemData(252 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 22, SC2Race.ZERG, + parent_item=item_names.HYDRALISK_IMPALER_ASPECT), + item_names.IMPALER_HARDENED_TENTACLE_SPINES: + ItemData(253 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 23, SC2Race.ZERG, + parent_item=item_names.HYDRALISK_IMPALER_ASPECT, classification=ItemClassification.progression), + item_names.LURKER_SEISMIC_SPINES: + ItemData(254 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 24, SC2Race.ZERG, + parent_item=item_names.HYDRALISK_LURKER_ASPECT, classification=ItemClassification.progression), + item_names.LURKER_ADAPTED_SPINES: + ItemData(255 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 25, SC2Race.ZERG, + parent_item=item_names.HYDRALISK_LURKER_ASPECT, classification=ItemClassification.progression), + item_names.RAVAGER_POTENT_BILE: + ItemData(256 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 26, SC2Race.ZERG, + parent_item=item_names.ROACH_RAVAGER_ASPECT), + item_names.RAVAGER_BLOATED_BILE_DUCTS: + ItemData(257 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 27, SC2Race.ZERG, + parent_item=item_names.ROACH_RAVAGER_ASPECT), + item_names.RAVAGER_DEEP_TUNNEL: + ItemData(258 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 28, SC2Race.ZERG, + parent_item=item_names.ROACH_RAVAGER_ASPECT), + item_names.VIPER_PARASITIC_BOMB: + ItemData(259 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 29, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, + classification=ItemClassification.progression), + item_names.VIPER_PARALYTIC_BARBS: + ItemData(260 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 0, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT), + item_names.VIPER_VIRULENT_MICROBES: + ItemData(261 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 1, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT), + item_names.BROOD_LORD_POROUS_CARTILAGE: + ItemData(262 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 2, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.BROOD_LORD_EVOLVED_CARAPACE: + ItemData(263 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 3, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.BROOD_LORD_SPLITTER_MITOSIS: + ItemData(264 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 4, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.BROOD_LORD_RESOURCE_EFFICIENCY: + ItemData(265 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 5, SC2Race.ZERG, + parent_item=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.INFESTOR_INFESTED_TERRAN: + ItemData(266 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 6, SC2Race.ZERG, parent_item=item_names.INFESTOR), + item_names.INFESTOR_MICROBIAL_SHROUD: + ItemData(267 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 7, SC2Race.ZERG, parent_item=item_names.INFESTOR), + item_names.SWARM_QUEEN_SPAWN_LARVAE: + ItemData(268 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 8, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_DEEP_TUNNEL: + ItemData(269 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 9, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_ORGANIC_CARAPACE: + ItemData(270 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 10, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN, classification=ItemClassification.filler), + item_names.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION: + ItemData(271 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 11, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN, classification=ItemClassification.progression), + item_names.SWARM_QUEEN_RESOURCE_EFFICIENCY: + ItemData(272 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 12, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_INCUBATOR_CHAMBER: + ItemData(273 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 13, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN), + item_names.BROOD_QUEEN_FUNGAL_GROWTH: + ItemData(274 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 14, SC2Race.ZERG, parent_item=item_names.BROOD_QUEEN), + item_names.BROOD_QUEEN_ENSNARE: + ItemData(275 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 15, SC2Race.ZERG, parent_item=item_names.BROOD_QUEEN), + item_names.BROOD_QUEEN_ENHANCED_MITOCHONDRIA: + ItemData(276 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 16, SC2Race.ZERG, parent_item=item_names.BROOD_QUEEN), + item_names.DEFILER_PATHOGEN_PROJECTORS: + ItemData(277 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 17, SC2Race.ZERG, parent_item=item_names.DEFILER), + item_names.DEFILER_TRAPDOOR_ADAPTATION: + ItemData(278 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 18, SC2Race.ZERG, parent_item=item_names.DEFILER), + item_names.DEFILER_PREDATORY_CONSUMPTION: + ItemData(279 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 19, SC2Race.ZERG, parent_item=item_names.DEFILER), + item_names.DEFILER_COMORBIDITY: + ItemData(280 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 20, SC2Race.ZERG, parent_item=item_names.DEFILER), + item_names.ABERRATION_MONSTROUS_RESILIENCE: + ItemData(281 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 21, SC2Race.ZERG, parent_item=item_names.ABERRATION), + item_names.ABERRATION_CONSTRUCT_REGENERATION: + ItemData(282 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 22, SC2Race.ZERG, parent_item=item_names.ABERRATION), + item_names.ABERRATION_BANELING_INCUBATION: + ItemData(283 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 23, SC2Race.ZERG, parent_item=item_names.ABERRATION), + item_names.ABERRATION_PROTECTIVE_COVER: + ItemData(284 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 24, SC2Race.ZERG, parent_item=item_names.ABERRATION), + item_names.ABERRATION_RESOURCE_EFFICIENCY: + ItemData(285 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 25, SC2Race.ZERG, parent_item=item_names.ABERRATION), + item_names.CORRUPTOR_MONSTROUS_RESILIENCE: + ItemData(286 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 26, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), + item_names.CORRUPTOR_CONSTRUCT_REGENERATION: + ItemData(287 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 27, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), + item_names.CORRUPTOR_SCOURGE_INCUBATION: + ItemData(288 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 28, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), + item_names.CORRUPTOR_RESOURCE_EFFICIENCY: + ItemData(289 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 29, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), + item_names.PRIMAL_IGNITER_CONCENTRATED_FIRE: + ItemData(290 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 0, SC2Race.ZERG, parent_item=item_names.ROACH_PRIMAL_IGNITER_ASPECT), + item_names.PRIMAL_IGNITER_PRIMAL_TENACITY: + ItemData(291 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 1, SC2Race.ZERG, parent_item=item_names.ROACH_PRIMAL_IGNITER_ASPECT), + item_names.INFESTED_SCV_BUILD_CHARGES: + ItemData(292 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 2, SC2Race.ZERG), + item_names.INFESTED_MARINE_PLAGUED_MUNITIONS: + ItemData(293 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 3, SC2Race.ZERG, parent_item=item_names.INFESTED_MARINE), + item_names.INFESTED_MARINE_RETINAL_AUGMENTATION: + ItemData(294 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 4, SC2Race.ZERG, parent_item=item_names.INFESTED_MARINE), + item_names.INFESTED_BUNKER_CALCIFIED_ARMOR: + ItemData(295 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 6, SC2Race.ZERG, parent_item=item_names.INFESTED_BUNKER), + item_names.INFESTED_BUNKER_REGENERATIVE_PLATING: + ItemData(296 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 5, SC2Race.ZERG, parent_item=item_names.INFESTED_BUNKER), + item_names.INFESTED_BUNKER_ENGORGED_BUNKERS: + ItemData(297 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 7, SC2Race.ZERG, parent_item=item_names.INFESTED_BUNKER), + item_names.INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD: + ItemData(298 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 6, SC2Race.ZERG, parent_item=item_names.INFESTED_MISSILE_TURRET), + item_names.INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS: + ItemData(299 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 7, SC2Race.ZERG, parent_item=item_names.INFESTED_MISSILE_TURRET), + + item_names.ZERGLING_RAPTOR_STRAIN: + ItemData(300 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 0, SC2Race.ZERG, parent_item=item_names.ZERGLING, classification=ItemClassification.progression), + item_names.ZERGLING_SWARMLING_STRAIN: + ItemData(301 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 1, SC2Race.ZERG, parent_item=item_names.ZERGLING), + item_names.ROACH_VILE_STRAIN: + ItemData(302 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 2, SC2Race.ZERG, parent_item=item_names.ROACH), + item_names.ROACH_CORPSER_STRAIN: + ItemData(303 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 3, SC2Race.ZERG, parent_item=item_names.ROACH, classification=ItemClassification.progression), + item_names.HYDRALISK_IMPALER_ASPECT: + ItemData(304 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 0, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.HYDRALISK_LURKER_ASPECT: + ItemData(305 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 1, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.BANELING_SPLITTER_STRAIN: + ItemData(306 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 6, SC2Race.ZERG, + parent_item=item_names.ZERGLING_BANELING_ASPECT), + item_names.BANELING_HUNTER_STRAIN: + ItemData(307 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 7, SC2Race.ZERG, + parent_item=item_names.ZERGLING_BANELING_ASPECT), + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: + ItemData(308 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 2, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT: + ItemData(309 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 3, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SWARM_HOST_CARRION_STRAIN: + ItemData(310 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 10, SC2Race.ZERG, parent_item=item_names.SWARM_HOST), + item_names.SWARM_HOST_CREEPER_STRAIN: + ItemData(311 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 11, SC2Race.ZERG, parent_item=item_names.SWARM_HOST, classification=ItemClassification.filler), + item_names.ULTRALISK_NOXIOUS_STRAIN: + ItemData(312 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 12, SC2Race.ZERG, parent_item=item_names.ULTRALISK, classification=ItemClassification.filler), + item_names.ULTRALISK_TORRASQUE_STRAIN: + ItemData(313 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 13, SC2Race.ZERG, parent_item=item_names.ULTRALISK), + + item_names.TYRANNOZOR_TYRANTS_PROTECTION: + ItemData(350 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 8, SC2Race.ZERG, parent_item=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.TYRANNOZOR_BARRAGE_OF_SPIKES: + ItemData(351 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 9, SC2Race.ZERG, parent_item=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.TYRANNOZOR_IMPALING_STRIKE: + ItemData(352 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 10, SC2Race.ZERG, parent_item=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.TYRANNOZOR_HEALING_ADAPTATION: + ItemData(353 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 11, SC2Race.ZERG, parent_item=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.NYDUS_WORM_OMEGA_WORM_SUBTERRANEAN_SCALES: + ItemData(354 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 12, SC2Race.ZERG, classification=ItemClassification.filler), + item_names.NYDUS_WORM_OMEGA_WORM_JORMUNGANDR_STRAIN: + ItemData(355 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 13, SC2Race.ZERG, classification=ItemClassification.useful), + item_names.NYDUS_WORM_OMEGA_WORM_RESOURCE_EFFICIENCY: + ItemData(356 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 14, SC2Race.ZERG, classification=ItemClassification.useful), + item_names.OMEGA_WORM_OUROBOROS_STRAIN: + ItemData(357 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 15, SC2Race.ZERG, parent_item=item_names.OMEGA_WORM, classification=ItemClassification.useful), + item_names.NYDUS_WORM_RAVENOUS_APPETITE: + ItemData(358 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 16, SC2Race.ZERG, parent_item=item_names.NYDUS_WORM, classification=ItemClassification.useful), + item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS: + ItemData(359 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Progressive, 0, SC2Race.ZERG, + parent_item=item_names.INFESTED_SIEGE_TANK, quantity=2), + item_names.INFESTED_SIEGE_TANK_ACIDIC_ENZYMES: + ItemData(360 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 17, SC2Race.ZERG, parent_item=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL: + ItemData(361 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 18, SC2Race.ZERG, parent_item=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_DIAMONDBACK_CAUSTIC_MUCUS: + ItemData(362 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 19, SC2Race.ZERG, parent_item=item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_DIAMONDBACK_VIOLENT_ENZYMES: + ItemData(363 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 20, SC2Race.ZERG, parent_item=item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_BANSHEE_BRACED_EXOSKELETON: + ItemData(364 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 21, SC2Race.ZERG, parent_item=item_names.INFESTED_BANSHEE), + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION: + ItemData(365 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 22, SC2Race.ZERG, parent_item=item_names.INFESTED_BANSHEE), + item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL: + ItemData(366 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 23, SC2Race.ZERG, parent_item=item_names.INFESTED_LIBERATOR), + item_names.INFESTED_LIBERATOR_VIRAL_CONTAMINATION: + ItemData(367 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 24, SC2Race.ZERG, parent_item=item_names.INFESTED_LIBERATOR), + item_names.GUARDIAN_PROPELLANT_SACS: + ItemData(368 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 25, SC2Race.ZERG, parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.GUARDIAN_EXPLOSIVE_SPORES: + ItemData(369 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 26, SC2Race.ZERG, parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.GUARDIAN_PRIMORDIAL_FURY: + ItemData(370 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 27, SC2Race.ZERG, parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.INFESTED_SIEGE_TANK_SEISMIC_SONAR: + ItemData(371 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 28, SC2Race.ZERG, parent_item=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_BANSHEE_ADVANCED_TARGETING_OPTICS: + ItemData(372 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 29, SC2Race.ZERG, parent_item=item_names.INFESTED_BANSHEE), + item_names.INFESTED_SIEGE_TANK_BALANCED_ROOTS: + ItemData(373 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 0, SC2Race.ZERG, parent_item=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE: + ItemData(374 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Progressive, 2, SC2Race.ZERG, + parent_item=item_names.INFESTED_DIAMONDBACK, quantity=2), + item_names.INFESTED_DIAMONDBACK_CONCENTRATED_SPEW: + ItemData(375 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 1, SC2Race.ZERG, parent_item=item_names.INFESTED_DIAMONDBACK), + item_names.FRIGHTFUL_FLESHWELDER_INFESTED_SIEGE_TANK: + ItemData(376 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 2, SC2Race.ZERG, parent_item=item_names.INFESTED_SIEGE_TANK), + item_names.FRIGHTFUL_FLESHWELDER_INFESTED_DIAMONDBACK: + ItemData(377 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 3, SC2Race.ZERG, parent_item=item_names.INFESTED_DIAMONDBACK), + item_names.FRIGHTFUL_FLESHWELDER_INFESTED_BANSHEE: + ItemData(378 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 4, SC2Race.ZERG, parent_item=item_names.INFESTED_BANSHEE), + item_names.FRIGHTFUL_FLESHWELDER_INFESTED_LIBERATOR: + ItemData(379 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 5, SC2Race.ZERG, parent_item=item_names.INFESTED_LIBERATOR), + + item_names.KERRIGAN_KINETIC_BLAST: ItemData(400 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 0, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_HEROIC_FORTITUDE: ItemData(401 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 1, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_LEAPING_STRIKE: ItemData(402 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 2, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_CRUSHING_GRIP: ItemData(403 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 3, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_CHAIN_REACTION: ItemData(404 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 4, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_PSIONIC_SHIFT: ItemData(405 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 5, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.ZERGLING_RECONSTITUTION: ItemData(406 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 0, SC2Race.ZERG, classification=ItemClassification.filler), + item_names.OVERLORD_IMPROVED_OVERLORDS: ItemData(407 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 1, SC2Race.ZERG), + item_names.AUTOMATED_EXTRACTORS: ItemData(408 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 2, SC2Race.ZERG), + item_names.KERRIGAN_WILD_MUTATION: ItemData(409 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 6, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_SPAWN_BANELINGS: ItemData(410 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 7, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_MEND: ItemData(411 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 8, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.TWIN_DRONES: ItemData(412 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 3, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.MALIGNANT_CREEP: ItemData(413 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 4, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.VESPENE_EFFICIENCY: ItemData(414 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 5, SC2Race.ZERG), + item_names.KERRIGAN_INFEST_BROODLINGS: ItemData(415 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 9, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_FURY: ItemData(416 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 10, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_ABILITY_EFFICIENCY: ItemData(417 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 11, SC2Race.ZERG), + item_names.KERRIGAN_APOCALYPSE: ItemData(418 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 12, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_SPAWN_LEVIATHAN: ItemData(419 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 13, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_DROP_PODS: ItemData(420 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 14, SC2Race.ZERG, classification=ItemClassification.progression), + # Handled separately from other abilities + item_names.KERRIGAN_PRIMAL_FORM: ItemData(421 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Primal_Form, 0, SC2Race.ZERG), + item_names.KERRIGAN_ASSIMIlATION_AURA: ItemData(422 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 15, SC2Race.ZERG), + item_names.KERRIGAN_IMMOBILIZATION_WAVE: ItemData(423 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 16, SC2Race.ZERG), + + item_names.KERRIGAN_LEVELS_10: ItemData(500 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 10, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_9: ItemData(501 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 9, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_8: ItemData(502 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 8, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_7: ItemData(503 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 7, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_6: ItemData(504 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 6, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_5: ItemData(505 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 5, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_4: ItemData(506 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 4, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_3: ItemData(507 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 3, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_2: ItemData(508 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 2, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_1: ItemData(509 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 1, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_14: ItemData(510 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 14, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_35: ItemData(511 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 35, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_70: ItemData(512 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 70, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + + # Zerg Mercs + item_names.INFESTED_MEDICS: ItemData(600 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 0, SC2Race.ZERG), + item_names.INFESTED_SIEGE_BREAKERS: ItemData(601 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 1, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.INFESTED_DUSK_WINGS: ItemData(602 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 2, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.DEVOURING_ONES: ItemData(603 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 3, SC2Race.ZERG), + item_names.HUNTER_KILLERS: ItemData(604 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 4, SC2Race.ZERG), + item_names.TORRASQUE_MERC: ItemData(605 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 5, SC2Race.ZERG), + item_names.HUNTERLING: ItemData(606 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 6, SC2Race.ZERG, classification=ItemClassification.progression), + + # Misc Upgrades + item_names.OVERLORD_VENTRAL_SACS: ItemData(700 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 6, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.OVERLORD_GENERATE_CREEP: ItemData(701 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 7, SC2Race.ZERG), + item_names.OVERLORD_ANTENNAE: ItemData(702 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 8, SC2Race.ZERG, classification=ItemClassification.filler), + item_names.OVERLORD_PNEUMATIZED_CARAPACE: ItemData(703 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 9, SC2Race.ZERG), + item_names.ZERG_EXCAVATING_CLAWS: ItemData(704 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 11, SC2Race.ZERG), + item_names.ZERG_CREEP_STOMACH: ItemData(705 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 10, SC2Race.ZERG), + item_names.HIVE_CLUSTER_MATURATION: ItemData(706 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 12, SC2Race.ZERG), + item_names.MACROSCOPIC_RECUPERATION: ItemData(707 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 13, SC2Race.ZERG), + + # Morphs + item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: ItemData(800 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 6, SC2Race.ZERG), + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: ItemData(801 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 7, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.ROACH_RAVAGER_ASPECT: ItemData(802 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 8, SC2Race.ZERG), + item_names.OVERLORD_OVERSEER_ASPECT: ItemData(803 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 4, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.ROACH_PRIMAL_IGNITER_ASPECT: ItemData(804 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 9, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.ULTRALISK_TYRANNOZOR_ASPECT: ItemData(805 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 10, SC2Race.ZERG, classification=ItemClassification.progression), + + + # Protoss Units (those that aren't as items in WoL (Prophecy)) + item_names.OBSERVER: + ItemData(0 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 9, SC2Race.PROTOSS, + classification=ItemClassification.filler), + item_names.CENTURION: + ItemData(1 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 10, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SENTINEL: + ItemData(2 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 11, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SUPPLICANT: + ItemData(3 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 12, SC2Race.PROTOSS, + classification=ItemClassification.filler, important_for_filtering=True), + item_names.INSTIGATOR: + ItemData(4 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 13, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SLAYER: + ItemData(5 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 14, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SENTRY: + ItemData(6 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 15, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ENERGIZER: + ItemData(7 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 16, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.HAVOC: + ItemData(8 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 17, SC2Race.PROTOSS, important_for_filtering=True), + item_names.SIGNIFIER: + ItemData(9 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 18, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ASCENDANT: + ItemData(10 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 19, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.AVENGER: + ItemData(11 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 20, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.BLOOD_HUNTER: + ItemData(12 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 21, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DRAGOON: + ItemData(13 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 22, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DARK_ARCHON: + ItemData(14 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 23, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ADEPT: + ItemData(15 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 24, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.WARP_PRISM: + ItemData(16 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 25, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ANNIHILATOR: + ItemData(17 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 26, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.VANGUARD: + ItemData(18 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 27, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.WRATHWALKER: + ItemData(19 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 28, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.REAVER: + ItemData(20 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 29, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DISRUPTOR: + ItemData(21 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 0, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.MIRAGE: + ItemData(22 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 1, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.CORSAIR: + ItemData(23 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 2, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DESTROYER: + ItemData(24 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 3, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SCOUT: + ItemData(25 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 4, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.TEMPEST: + ItemData(26 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 5, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.MOTHERSHIP: + ItemData(27 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 6, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ARBITER: + ItemData(28 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 7, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ORACLE: + ItemData(29 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 8, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.STALWART: + ItemData(30 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 9, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.WARP_RAY: + ItemData(31 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 10, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DAWNBRINGER: + ItemData(32 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 11, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SKYLORD: + ItemData(33 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 12, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.TRIREME: + ItemData(34 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 13, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SKIRMISHER: + ItemData(35 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 14, SC2Race.PROTOSS, + classification=ItemClassification.progression), + + # Protoss Upgrades + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON: ItemData(100 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 0, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR: ItemData(101 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 4, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_SHIELDS: ItemData(102 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 8, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON: ItemData(103 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 12, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR: ItemData(104 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 16, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + # Bundles + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: ItemData(105 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: ItemData(106 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: ItemData(107 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: ItemData(108 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + + # Protoss Buildings + item_names.PHOTON_CANNON: ItemData(200 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 0, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.KHAYDARIN_MONOLITH: ItemData(201 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SHIELD_BATTERY: ItemData(202 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 2, SC2Race.PROTOSS, classification=ItemClassification.progression), + + # Protoss Unit Upgrades + item_names.SUPPLICANT_BLOOD_SHIELD: ItemData(300 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 0, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SUPPLICANT), + item_names.SUPPLICANT_SOUL_AUGMENTATION: ItemData(301 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 1, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SUPPLICANT), + item_names.SUPPLICANT_SHIELD_REGENERATION: ItemData(302 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 2, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SUPPLICANT), + item_names.ADEPT_SHOCKWAVE: ItemData(303 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 3, SC2Race.PROTOSS, parent_item=item_names.ADEPT), + item_names.ADEPT_RESONATING_GLAIVES: ItemData(304 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 4, SC2Race.PROTOSS, parent_item=item_names.ADEPT), + item_names.ADEPT_PHASE_BULWARK: ItemData(305 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 5, SC2Race.PROTOSS, parent_item=item_names.ADEPT), + item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES: ItemData(306 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 6, SC2Race.PROTOSS, classification=ItemClassification.useful), + item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION: ItemData(307 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 7, SC2Race.PROTOSS, classification=ItemClassification.useful), + item_names.DRAGOON_HIGH_IMPACT_PHASE_DISRUPTORS: ItemData(308 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 8, SC2Race.PROTOSS, parent_item=item_names.DRAGOON), + item_names.DRAGOON_TRILLIC_COMPRESSION_SYSTEM: ItemData(309 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 9, SC2Race.PROTOSS, parent_item=item_names.DRAGOON), + item_names.DRAGOON_SINGULARITY_CHARGE: ItemData(310 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 10, SC2Race.PROTOSS, parent_item=item_names.DRAGOON), + item_names.DRAGOON_ENHANCED_STRIDER_SERVOS: ItemData(311 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 11, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.DRAGOON), + item_names.SCOUT_COMBAT_SENSOR_ARRAY: ItemData(312 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 12, SC2Race.PROTOSS, parent_item=item_names.SCOUT), + item_names.SCOUT_APIAL_SENSORS: ItemData(313 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 13, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SCOUT), + item_names.SCOUT_GRAVITIC_THRUSTERS: ItemData(314 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 14, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SCOUT), + item_names.SCOUT_ADVANCED_PHOTON_BLASTERS: ItemData(315 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 15, SC2Race.PROTOSS, parent_item=item_names.SCOUT), + item_names.TEMPEST_TECTONIC_DESTABILIZERS: ItemData(316 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 16, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.TEMPEST), + item_names.TEMPEST_QUANTIC_REACTOR: ItemData(317 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 17, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.TEMPEST), + item_names.TEMPEST_GRAVITY_SLING: ItemData(318 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 18, SC2Race.PROTOSS, parent_item=item_names.TEMPEST), + item_names.PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX: ItemData(319 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 19, SC2Race.PROTOSS), + item_names.PHOENIX_CLASS_ANION_PULSE_CRYSTALS: ItemData(320 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 20, SC2Race.PROTOSS), + item_names.CORSAIR_STEALTH_DRIVE: ItemData(321 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 21, SC2Race.PROTOSS, parent_item=item_names.CORSAIR), + item_names.CORSAIR_ARGUS_JEWEL: ItemData(322 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 22, SC2Race.PROTOSS, parent_item=item_names.CORSAIR), + item_names.CORSAIR_SUSTAINING_DISRUPTION: ItemData(323 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 23, SC2Race.PROTOSS, parent_item=item_names.CORSAIR), + item_names.CORSAIR_NEUTRON_SHIELDS: ItemData(324 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 24, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.CORSAIR), + item_names.ORACLE_STEALTH_DRIVE: ItemData(325 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 25, SC2Race.PROTOSS, parent_item=item_names.ORACLE), + item_names.ORACLE_STASIS_CALIBRATION: ItemData(326 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 26, SC2Race.PROTOSS, parent_item=item_names.ORACLE), + item_names.ORACLE_TEMPORAL_ACCELERATION_BEAM: ItemData(327 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 27, SC2Race.PROTOSS, parent_item=item_names.ORACLE), + item_names.ARBITER_CHRONOSTATIC_REINFORCEMENT: ItemData(328 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 28, SC2Race.PROTOSS, parent_item=item_names.ARBITER), + item_names.ARBITER_KHAYDARIN_CORE: ItemData(329 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 29, SC2Race.PROTOSS, parent_item=item_names.ARBITER), + item_names.ARBITER_SPACETIME_ANCHOR: ItemData(330 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 0, SC2Race.PROTOSS, parent_item=item_names.ARBITER), + item_names.ARBITER_RESOURCE_EFFICIENCY: ItemData(331 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 1, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.ARBITER), + item_names.ARBITER_ENHANCED_CLOAK_FIELD: ItemData(332 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 2, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.ARBITER), + item_names.CARRIER_TRIREME_GRAVITON_CATAPULT: + ItemData(333 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 3, SC2Race.PROTOSS), + item_names.CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES: + ItemData(334 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 4, SC2Race.PROTOSS), + item_names.VOID_RAY_DESTROYER_WARP_RAY_DAWNBRINGER_FLUX_VANES: + ItemData(335 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 5, SC2Race.PROTOSS, classification=ItemClassification.filler), + item_names.DESTROYER_RESOURCE_EFFICIENCY: ItemData(535 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 6, SC2Race.PROTOSS, parent_item=item_names.DESTROYER), + item_names.WARP_PRISM_GRAVITIC_DRIVE: + ItemData(337 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 7, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.WARP_PRISM), + item_names.WARP_PRISM_PHASE_BLASTER: + ItemData(338 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 8, SC2Race.PROTOSS, + classification=ItemClassification.progression, parent_item=item_names.WARP_PRISM), + item_names.WARP_PRISM_WAR_CONFIGURATION: ItemData(339 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 9, SC2Race.PROTOSS, parent_item=item_names.WARP_PRISM), + item_names.OBSERVER_GRAVITIC_BOOSTERS: ItemData(340 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 10, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.OBSERVER), + item_names.OBSERVER_SENSOR_ARRAY: ItemData(341 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 11, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.OBSERVER), + item_names.REAVER_SCARAB_DAMAGE: ItemData(342 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 12, SC2Race.PROTOSS, parent_item=item_names.REAVER), + item_names.REAVER_SOLARITE_PAYLOAD: ItemData(343 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 13, SC2Race.PROTOSS, parent_item=item_names.REAVER), + item_names.REAVER_REAVER_CAPACITY: ItemData(344 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 14, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.REAVER), + item_names.REAVER_RESOURCE_EFFICIENCY: ItemData(345 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 15, SC2Race.PROTOSS, parent_item=item_names.REAVER), + item_names.VANGUARD_AGONY_LAUNCHERS: ItemData(346 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 16, SC2Race.PROTOSS, parent_item=item_names.VANGUARD), + item_names.VANGUARD_MATTER_DISPERSION: ItemData(347 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 17, SC2Race.PROTOSS, parent_item=item_names.VANGUARD), + item_names.IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE: ItemData(348 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 18, SC2Race.PROTOSS), + item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS: ItemData(349 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 19, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.COLOSSUS_PACIFICATION_PROTOCOL: ItemData(350 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.COLOSSUS), + item_names.WRATHWALKER_RAPID_POWER_CYCLING: ItemData(351 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 21, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.WRATHWALKER), + item_names.WRATHWALKER_EYE_OF_WRATH: ItemData(352 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 22, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.WRATHWALKER), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN: ItemData(353 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 23, SC2Race.PROTOSS), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING: ItemData(354 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 24, SC2Race.PROTOSS), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK: ItemData(355 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 25, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY: ItemData(356 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 26, SC2Race.PROTOSS), + item_names.DARK_TEMPLAR_DARK_ARCHON_MELD: ItemData(357 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 27, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.DARK_TEMPLAR), + item_names.HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM: ItemData(358 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 28, SC2Race.PROTOSS), + item_names.HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION: ItemData(359 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 29, SC2Race.PROTOSS, classification=ItemClassification.filler), + item_names.HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET: ItemData(360 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 0, SC2Race.PROTOSS), + item_names.ARCHON_HIGH_ARCHON: ItemData(361 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.DARK_ARCHON_FEEDBACK: ItemData(362 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 2, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.DARK_ARCHON_MAELSTROM: ItemData(363 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 3, SC2Race.PROTOSS), + item_names.DARK_ARCHON_ARGUS_TALISMAN: ItemData(364 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 4, SC2Race.PROTOSS), + item_names.ASCENDANT_POWER_OVERWHELMING: ItemData(365 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 5, SC2Race.PROTOSS, parent_item=item_names.ASCENDANT), + item_names.ASCENDANT_CHAOTIC_ATTUNEMENT: ItemData(366 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 6, SC2Race.PROTOSS, parent_item=item_names.ASCENDANT), + item_names.ASCENDANT_BLOOD_AMULET: ItemData(367 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 7, SC2Race.PROTOSS, parent_item=item_names.ASCENDANT), + item_names.SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE: ItemData(368 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 8, SC2Race.PROTOSS), + item_names.SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING: ItemData(369 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 9, SC2Race.PROTOSS), + item_names.SENTRY_FORCE_FIELD: ItemData(370 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 10, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SENTRY), + item_names.SENTRY_HALLUCINATION: ItemData(371 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 11, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SENTRY), + item_names.ENERGIZER_RECLAMATION: ItemData(372 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 12, SC2Race.PROTOSS, parent_item=item_names.ENERGIZER), + item_names.ENERGIZER_FORGED_CHASSIS: ItemData(373 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 13, SC2Race.PROTOSS, parent_item=item_names.ENERGIZER), + item_names.HAVOC_DETECT_WEAKNESS: ItemData(374 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 14, SC2Race.PROTOSS, parent_item=item_names.HAVOC), + item_names.HAVOC_BLOODSHARD_RESONANCE: ItemData(375 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 15, SC2Race.PROTOSS, parent_item=item_names.HAVOC), + item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: ItemData(376 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 16, SC2Race.PROTOSS), + item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: ItemData(377 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 17, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.ORACLE_BOSONIC_CORE: ItemData(378 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 18, SC2Race.PROTOSS, parent_item=item_names.ORACLE), + item_names.SCOUT_RESOURCE_EFFICIENCY: ItemData(379 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 19, SC2Race.PROTOSS, parent_item=item_names.SCOUT), + item_names.IMMORTAL_ANNIHILATOR_DISRUPTOR_DISPERSION: ItemData(380 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 20, SC2Race.PROTOSS), + item_names.DISRUPTOR_CLOAKING_MODULE: ItemData(381 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 21, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.DISRUPTOR), + item_names.DISRUPTOR_PERFECTED_POWER: ItemData(382 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 22, SC2Race.PROTOSS, parent_item=item_names.DISRUPTOR, classification=ItemClassification.progression), + item_names.DISRUPTOR_RESTRAINED_DESTRUCTION: ItemData(383 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 23, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.DISRUPTOR), + item_names.TEMPEST_INTERPLANETARY_RANGE: ItemData(384 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 24, SC2Race.PROTOSS, parent_item=item_names.TEMPEST), + item_names.DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES: ItemData(385 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 25, SC2Race.PROTOSS, parent_item=item_names.DAWNBRINGER), + item_names.DAWNBRINGER_ENHANCED_SHIELD_GENERATOR: ItemData(386 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 26, SC2Race.PROTOSS, parent_item=item_names.DAWNBRINGER), + item_names.STALWART_HIGH_VOLTAGE_CAPACITORS: ItemData(387 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 27, SC2Race.PROTOSS, parent_item=item_names.STALWART), + item_names.STALWART_STRUT_ENHANCEMENTS: ItemData(388 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 28, SC2Race.PROTOSS, parent_item=item_names.STALWART), + item_names.STALWART_STABILIZED_ELECTRODES: ItemData(389 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 29, SC2Race.PROTOSS, parent_item=item_names.STALWART), + item_names.STALWART_LATTICED_SHIELDING: ItemData(390 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 0, SC2Race.PROTOSS, parent_item=item_names.STALWART), + + # War Council + item_names.ZEALOT_WHIRLWIND: ItemData(500 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 0, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.ZEALOT), + item_names.CENTURION_RESOURCE_EFFICIENCY: ItemData(501 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 1, SC2Race.PROTOSS, parent_item=item_names.CENTURION), + item_names.SENTINEL_RESOURCE_EFFICIENCY: ItemData(502 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 2, SC2Race.PROTOSS, parent_item=item_names.SENTINEL), + item_names.STALKER_PHASE_REACTOR: ItemData(503 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 3, SC2Race.PROTOSS, parent_item=item_names.STALKER), + item_names.DRAGOON_PHALANX_SUIT: ItemData(504 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 4, SC2Race.PROTOSS, parent_item=item_names.DRAGOON), + item_names.INSTIGATOR_RESOURCE_EFFICIENCY: ItemData(505 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 5, SC2Race.PROTOSS, parent_item=item_names.INSTIGATOR), + item_names.ADEPT_DISRUPTIVE_TRANSFER: ItemData(506 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 6, SC2Race.PROTOSS, parent_item=item_names.ADEPT), + item_names.SLAYER_PHASE_BLINK: ItemData(507 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 7, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.SLAYER), + item_names.AVENGER_KRYHAS_CLOAK: ItemData(508 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 8, SC2Race.PROTOSS, parent_item=item_names.AVENGER), + item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY: ItemData(509 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 9, SC2Race.PROTOSS, parent_item=item_names.DARK_TEMPLAR), + item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY: ItemData(510 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 10, SC2Race.PROTOSS, parent_item=item_names.DARK_TEMPLAR), + item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY: ItemData(511 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 11, SC2Race.PROTOSS, parent_item=item_names.BLOOD_HUNTER), + item_names.SENTRY_DOUBLE_SHIELD_RECHARGE: ItemData(512 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 12, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.SENTRY), + item_names.ENERGIZER_MOBILE_CHRONO_BEAM: ItemData(513 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 13, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.ENERGIZER), + item_names.HAVOC_ENDURING_SIGHT: ItemData(514 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 14, SC2Race.PROTOSS, parent_item=item_names.HAVOC), + item_names.HIGH_TEMPLAR_PLASMA_SURGE: ItemData(515 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 15, SC2Race.PROTOSS, parent_item=item_names.HIGH_TEMPLAR), + item_names.SIGNIFIER_FEEDBACK: ItemData(516 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 16, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.SIGNIFIER), + item_names.ASCENDANT_ABILITY_EFFICIENCY: ItemData(517 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 17, SC2Race.PROTOSS, parent_item=item_names.ASCENDANT), + item_names.DARK_ARCHON_INDOMITABLE_WILL: ItemData(518 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 18, SC2Race.PROTOSS), + item_names.IMMORTAL_IMPROVED_BARRIER: ItemData(519 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 19, SC2Race.PROTOSS, parent_item=item_names.IMMORTAL), + item_names.VANGUARD_RAPIDFIRE_CANNON: ItemData(520 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.VANGUARD), + item_names.VANGUARD_FUSION_MORTARS: ItemData(521 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 21, SC2Race.PROTOSS, parent_item=item_names.VANGUARD), + item_names.ANNIHILATOR_AERIAL_TRACKING: ItemData(522 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 22, SC2Race.PROTOSS, parent_item=item_names.ANNIHILATOR), + item_names.STALWART_ARC_INDUCERS: ItemData(523 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 23, SC2Race.PROTOSS, parent_item=item_names.STALWART), + item_names.COLOSSUS_FIRE_LANCE: ItemData(524 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 24, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.COLOSSUS), + item_names.WRATHWALKER_AERIAL_TRACKING: ItemData(525 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 25, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.WRATHWALKER), + item_names.REAVER_KHALAI_REPLICATORS: ItemData(526 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 26, SC2Race.PROTOSS, parent_item=item_names.REAVER), + item_names.DISRUPTOR_RESTRUCTURED_THRUSTERS: ItemData(527 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 27, SC2Race.PROTOSS, parent_item=item_names.DISRUPTOR), + item_names.WARP_PRISM_WARP_REFRACTION: ItemData(528 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 28, SC2Race.PROTOSS, parent_item=item_names.WARP_PRISM), + item_names.OBSERVER_INDUCE_SCOPOPHOBIA: ItemData(529 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 29, SC2Race.PROTOSS, parent_item=item_names.OBSERVER), + item_names.PHOENIX_DOUBLE_GRAVITON_BEAM: ItemData(530 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 0, SC2Race.PROTOSS, parent_item=item_names.PHOENIX), + item_names.CORSAIR_NETWORK_DISRUPTION: ItemData(531 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 1, SC2Race.PROTOSS, parent_item=item_names.CORSAIR), + item_names.MIRAGE_GRAVITON_BEAM: ItemData(532 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 2, SC2Race.PROTOSS, parent_item=item_names.MIRAGE), + item_names.SKIRMISHER_PEER_CONTEMPT: ItemData(533 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 3, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.SKIRMISHER), + item_names.VOID_RAY_PRISMATIC_RANGE: ItemData(534 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 4, SC2Race.PROTOSS, parent_item=item_names.VOID_RAY), + item_names.DESTROYER_REFORGED_BLOODSHARD_CORE: ItemData(336 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 5, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.DESTROYER), + # 536 reserved for Warp Ray + item_names.DAWNBRINGER_SOLARITE_LENS: ItemData(537 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 7, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.DAWNBRINGER), + item_names.CARRIER_REPAIR_DRONES: ItemData(538 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 8, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.CARRIER), + item_names.SKYLORD_HYPERJUMP: ItemData(539 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 9, SC2Race.PROTOSS, parent_item=item_names.SKYLORD), + item_names.TRIREME_SOLAR_BEAM: ItemData(540 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 10, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.TRIREME), + item_names.TEMPEST_DISINTEGRATION: ItemData(541 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 11, SC2Race.PROTOSS, parent_item=item_names.TEMPEST), + # 542 reserved for Scout + item_names.ARBITER_ABILITY_EFFICIENCY: ItemData(543 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 13, SC2Race.PROTOSS, parent_item=item_names.ARBITER), + # 544 reserved for Oracle + # 545 reserved for Mothership + + # SoA Calldown powers + item_names.SOA_CHRONO_SURGE: ItemData(700 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 0, SC2Race.PROTOSS), + item_names.SOA_PROGRESSIVE_PROXY_PYLON: ItemData(701 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Progressive, 0, SC2Race.PROTOSS, quantity=2), + item_names.SOA_PYLON_OVERCHARGE: ItemData(702 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 1, SC2Race.PROTOSS), + item_names.SOA_ORBITAL_STRIKE: ItemData(703 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 2, SC2Race.PROTOSS), + item_names.SOA_TEMPORAL_FIELD: ItemData(704 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 3, SC2Race.PROTOSS), + item_names.SOA_SOLAR_LANCE: ItemData(705 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 4, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_MASS_RECALL: ItemData(706 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 5, SC2Race.PROTOSS), + item_names.SOA_SHIELD_OVERCHARGE: ItemData(707 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 6, SC2Race.PROTOSS), + item_names.SOA_DEPLOY_FENIX: ItemData(708 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 7, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_PURIFIER_BEAM: ItemData(709 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 8, SC2Race.PROTOSS), + item_names.SOA_TIME_STOP: ItemData(710 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 9, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_SOLAR_BOMBARDMENT: ItemData(711 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 10, SC2Race.PROTOSS), + + # Generic Protoss Upgrades + item_names.MATRIX_OVERLOAD: + ItemData(800 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 0, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.QUATRO: + ItemData(801 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.NEXUS_OVERCHARGE: + ItemData(802 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 2, SC2Race.PROTOSS, + classification=ItemClassification.progression, important_for_filtering=True), + item_names.ORBITAL_ASSIMILATORS: + ItemData(803 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 3, SC2Race.PROTOSS), + item_names.WARP_HARMONIZATION: + ItemData(804 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 4, SC2Race.PROTOSS), + item_names.GUARDIAN_SHELL: + ItemData(805 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 5, SC2Race.PROTOSS), + item_names.RECONSTRUCTION_BEAM: + ItemData(806 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 6, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.OVERWATCH: + ItemData(807 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 7, SC2Race.PROTOSS), + item_names.SUPERIOR_WARP_GATES: + ItemData(808 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 8, SC2Race.PROTOSS), + item_names.ENHANCED_TARGETING: + ItemData(809 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 9, SC2Race.PROTOSS), + item_names.OPTIMIZED_ORDNANCE: + ItemData(810 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 10, SC2Race.PROTOSS), + item_names.KHALAI_INGENUITY: + ItemData(811 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 11, SC2Race.PROTOSS), + item_names.AMPLIFIED_ASSIMILATORS: + ItemData(812 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 12, SC2Race.PROTOSS), + item_names.PROGRESSIVE_WARP_RELOCATE: + ItemData(813 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Progressive, 2, SC2Race.PROTOSS, quantity=2, + classification=ItemClassification.progression), +} + +# Add keys to item table +# Mission keys (key offset + 0-999) +# Mission IDs start at 1 so the item IDs are moved down a space +mission_key_item_table = { + item_names._TEMPLATE_MISSION_KEY.format(mission.mission_name): + ItemData(mission.id - 1 + SC2_KEY_ITEM_ID_OFFSET, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for mission in SC2Mission +} +# Numbered layout keys (key offset + 1000 - 1999) +numbered_layout_key_item_table = { + item_names._TEMPLATE_NUMBERED_LAYOUT_KEY.format(number + 1): + ItemData(number + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for number in range(len(SC2Mission)) +} +# Numbered campaign keys (key offset + 2000 - 2999) +numbered_campaign_key_item_table = { + item_names._TEMPLATE_NUMBERED_CAMPAIGN_KEY.format(number + 1): + ItemData(number + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 2, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for number in range(len(SC2Mission)) +} +# Flavor keys (key offset + 3000 - 3999) +flavor_key_item_table = { + item_names._TEMPLATE_FLAVOR_KEY.format(name): + ItemData(i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 3, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for (i, name) in enumerate(item_names._flavor_key_names) +} +# Named layout keys (key offset + 4000 - 4999) +campaign_to_layout_names = get_used_layout_names() +named_layout_key_item_table = { + item_names._TEMPLATE_NAMED_LAYOUT_KEY.format(layout_name, campaign.campaign_name): + ItemData(layout_start + i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 4, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for (campaign, (layout_start, layout_names)) in campaign_to_layout_names.items() for (i, layout_name) in enumerate(layout_names) +} +# Named campaign keys (key offset + 5000 - 5999) +campaign_names = [campaign.campaign_name for campaign in SC2Campaign if campaign != SC2Campaign.GLOBAL] +named_campaign_key_item_table = { + item_names._TEMPLATE_NAMED_CAMPAIGN_KEY.format(campaign_name): + ItemData(i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 5, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for (i, campaign_name) in enumerate(campaign_names) +} +key_item_table = {} +key_item_table.update(mission_key_item_table) +key_item_table.update(numbered_layout_key_item_table) +key_item_table.update(numbered_campaign_key_item_table) +key_item_table.update(flavor_key_item_table) +key_item_table.update(named_layout_key_item_table) +key_item_table.update(named_campaign_key_item_table) +item_table.update(key_item_table) + +def get_item_table(): + return item_table + + +basic_units = { + SC2Race.TERRAN: { + item_names.MARINE, + item_names.MARAUDER, + item_names.GOLIATH, + item_names.HELLION, + item_names.VULTURE, + item_names.WARHOUND, + }, + SC2Race.ZERG: { + item_names.ZERGLING, + item_names.SWARM_QUEEN, + item_names.ROACH, + item_names.HYDRALISK, + }, + SC2Race.PROTOSS: { + item_names.ZEALOT, + item_names.CENTURION, + item_names.SENTINEL, + item_names.STALKER, + item_names.INSTIGATOR, + item_names.SLAYER, + item_names.DRAGOON, + item_names.ADEPT, + } +} + +advanced_basic_units = { + SC2Race.TERRAN: basic_units[SC2Race.TERRAN].union({ + item_names.REAPER, + item_names.DIAMONDBACK, + item_names.VIKING, + item_names.SIEGE_TANK, + item_names.BANSHEE, + item_names.THOR, + item_names.BATTLECRUISER, + item_names.CYCLONE + }), + SC2Race.ZERG: basic_units[SC2Race.ZERG].union({ + item_names.INFESTOR, + item_names.ABERRATION, + }), + SC2Race.PROTOSS: basic_units[SC2Race.PROTOSS].union({ + item_names.DARK_TEMPLAR, + item_names.BLOOD_HUNTER, + item_names.AVENGER, + item_names.IMMORTAL, + item_names.ANNIHILATOR, + item_names.VANGUARD, + item_names.STALWART, + }) +} + +no_logic_basic_units = { + SC2Race.TERRAN: advanced_basic_units[SC2Race.TERRAN].union({ + item_names.FIREBAT, + item_names.GHOST, + item_names.SPECTRE, + item_names.WRAITH, + item_names.RAVEN, + item_names.PREDATOR, + item_names.LIBERATOR, + item_names.HERC, + }), + SC2Race.ZERG: advanced_basic_units[SC2Race.ZERG].union({ + item_names.ULTRALISK, + item_names.SWARM_HOST + }), + SC2Race.PROTOSS: advanced_basic_units[SC2Race.PROTOSS].union({ + item_names.CARRIER, + item_names.TEMPEST, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.COLOSSUS, + item_names.WRATHWALKER, + item_names.SCOUT, + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.ASCENDANT, + item_names.DARK_ARCHON, + item_names.SUPPLICANT, + }) +} + +not_balanced_starting_units = { + item_names.SIEGE_TANK, + item_names.THOR, + item_names.BANSHEE, + item_names.BATTLECRUISER, + item_names.ULTRALISK, + item_names.CARRIER, + item_names.TEMPEST, +} + + +# Items that can be placed before resources if not already in +# General upgrades and Mercs +second_pass_placeable_items: typing.Tuple[str, ...] = ( + # Global weapon/armor upgrades + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_SHIELDS, + # Terran Buildings without upgrades + item_names.SENSOR_TOWER, + item_names.HIVE_MIND_EMULATOR, + item_names.PSI_DISRUPTER, + item_names.PERDITION_TURRET, + # General Terran upgrades without any dependencies + item_names.SCV_ADVANCED_CONSTRUCTION, + item_names.SCV_DUAL_FUSION_WELDERS, + item_names.SCV_CONSTRUCTION_JUMP_JETS, + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, + item_names.PROGRESSIVE_ORBITAL_COMMAND, + item_names.ULTRA_CAPACITORS, + item_names.VANADIUM_PLATING, + item_names.ORBITAL_DEPOTS, + item_names.MICRO_FILTERING, + item_names.AUTOMATED_REFINERY, + item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR, + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_MULE, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES, + item_names.TECH_REACTOR, + item_names.CELLULAR_REACTOR, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, # Place only L1 + item_names.STRUCTURE_ARMOR, + item_names.HI_SEC_AUTO_TRACKING, + item_names.ADVANCED_OPTICS, + item_names.ROGUE_FORCES, + # Mercenaries (All races) + *[item_name for item_name, item_data in item_table.items() + if item_data.type in (TerranItemType.Mercenary, ZergItemType.Mercenary)], + # Kerrigan and Nova levels, abilities and generally useful stuff + *[item_name for item_name, item_data in get_full_item_list().items() + if item_data.type in (ZergItemType.Level, ZergItemType.Ability, ZergItemType.Evolution_Pit, TerranItemType.Nova_Gear)], + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, + # Zerg static defenses + item_names.SPORE_CRAWLER, + item_names.SPINE_CRAWLER, + # Overseer + item_names.OVERLORD_OVERSEER_ASPECT, + # Spear of Adun Abilities + item_names.SOA_CHRONO_SURGE, + item_names.SOA_PROGRESSIVE_PROXY_PYLON, + item_names.SOA_PYLON_OVERCHARGE, + item_names.SOA_ORBITAL_STRIKE, + item_names.SOA_TEMPORAL_FIELD, + item_names.SOA_SOLAR_LANCE, + item_names.SOA_MASS_RECALL, + item_names.SOA_SHIELD_OVERCHARGE, + item_names.SOA_DEPLOY_FENIX, + item_names.SOA_PURIFIER_BEAM, + item_names.SOA_TIME_STOP, + item_names.SOA_SOLAR_BOMBARDMENT, + # Protoss generic upgrades + item_names.MATRIX_OVERLOAD, + item_names.QUATRO, + item_names.NEXUS_OVERCHARGE, + item_names.ORBITAL_ASSIMILATORS, + item_names.WARP_HARMONIZATION, + item_names.GUARDIAN_SHELL, + item_names.RECONSTRUCTION_BEAM, + item_names.OVERWATCH, + item_names.SUPERIOR_WARP_GATES, + item_names.KHALAI_INGENUITY, + item_names.AMPLIFIED_ASSIMILATORS, + # Protoss static defenses + item_names.PHOTON_CANNON, + item_names.KHAYDARIN_MONOLITH, + item_names.SHIELD_BATTERY +) + + +filler_items: typing.Tuple[str, ...] = ( + item_names.STARTING_MINERALS, + item_names.STARTING_VESPENE, + item_names.STARTING_SUPPLY, +) + +# Defense rating table +# Commented defense ratings are handled in LogicMixin +tvx_defense_ratings = { + item_names.SIEGE_TANK: 5, + # "Graduating Range": 1, + item_names.PLANETARY_FORTRESS: 3, + # Bunker w/ Marine/Marauder: 3, + item_names.PERDITION_TURRET: 2, + item_names.DEVASTATOR_TURRET: 2, + item_names.VULTURE: 1, + item_names.BANSHEE: 1, + item_names.BATTLECRUISER: 1, + item_names.LIBERATOR: 4, + item_names.WIDOW_MINE: 1, + # "Concealment (Widow Mine)": 1 +} +tvz_defense_ratings = { + item_names.PERDITION_TURRET: 2, + # Bunker w/ Firebat: 2, + item_names.LIBERATOR: -2, + item_names.HIVE_MIND_EMULATOR: 3, + item_names.PSI_DISRUPTER: 3, +} +tvx_air_defense_ratings = { + item_names.MISSILE_TURRET: 2, +} +zvx_defense_ratings = { + # Note that this doesn't include Kerrigan because this is just for race swaps, which doesn't involve her (for now) + item_names.SPINE_CRAWLER: 2, + # w/ Twin Drones: 1 + item_names.SWARM_QUEEN: 1, + item_names.SWARM_HOST: 1, + # impaler: 3 + # "Hardened Tentacle Spines (Impaler)": 2 + # lurker: 1 + # "Seismic Spines (Lurker)": 2 + # "Adapted Spines (Lurker)": 1 + # brood lord : 2 + # corpser roach: 1 + # creep tumors (swarm queen or overseer): 1 + # w/ malignant creep: 1 + item_names.INFESTED_SIEGE_BREAKERS: 5, + # "Graduating Range": 1, + item_names.INFESTED_BUNKER: 3, +} +# zvz_defense_ratings = { + # corpser roach: 1 + # primal igniter: 2 + # lurker: 1 + # w/ adapted spines: -1 + # impaler: -1 +# } +zvx_air_defense_ratings = { + item_names.SPORE_CRAWLER: 2, + # w/ Twin Drones: 1 + item_names.INFESTED_MISSILE_TURRET: 2, +} +pvx_defense_ratings = { + item_names.PHOTON_CANNON: 2, + item_names.KHAYDARIN_MONOLITH: 3, + item_names.SHIELD_BATTERY: 1, + item_names.NEXUS_OVERCHARGE: 2, + item_names.CORSAIR: 1, + item_names.MATRIX_OVERLOAD: 1, + item_names.COLOSSUS: 1, +} +pvz_defense_ratings = { + item_names.KHAYDARIN_MONOLITH: -2, + item_names.COLOSSUS: 2, + item_names.VANGUARD: 1, + item_names.REAVER: 1, + item_names.STALWART: 1, +} + +kerrigan_levels = [ + item_name for item_name, item_data in item_table.items() + if item_data.type == ZergItemType.Level and item_data.race == SC2Race.ZERG +] + +spider_mine_sources = { + item_names.VULTURE, + item_names.REAPER_SPIDER_MINES, + item_names.SIEGE_TANK_SPIDER_MINES, + item_names.RAVEN_SPIDER_MINES, +} + +kerrigan_actives: typing.List[typing.Set[str]] = [ + {item_names.KERRIGAN_KINETIC_BLAST, item_names.KERRIGAN_LEAPING_STRIKE}, + {item_names.KERRIGAN_CRUSHING_GRIP, item_names.KERRIGAN_PSIONIC_SHIFT}, + set(), + {item_names.KERRIGAN_WILD_MUTATION, item_names.KERRIGAN_SPAWN_BANELINGS, item_names.KERRIGAN_MEND}, + set(), + set(), + {item_names.KERRIGAN_APOCALYPSE, item_names.KERRIGAN_SPAWN_LEVIATHAN, item_names.KERRIGAN_DROP_PODS}, +] + +kerrigan_passives: typing.List[typing.Set[str]] = [ + {item_names.KERRIGAN_HEROIC_FORTITUDE}, + {item_names.KERRIGAN_CHAIN_REACTION}, + {item_names.ZERGLING_RECONSTITUTION, item_names.OVERLORD_IMPROVED_OVERLORDS, item_names.AUTOMATED_EXTRACTORS}, + set(), + {item_names.TWIN_DRONES, item_names.MALIGNANT_CREEP, item_names.VESPENE_EFFICIENCY}, + {item_names.KERRIGAN_INFEST_BROODLINGS, item_names.KERRIGAN_FURY, item_names.KERRIGAN_ABILITY_EFFICIENCY}, + set(), +] + +kerrigan_only_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, +} + +spear_of_adun_calldowns = { + item_names.SOA_CHRONO_SURGE, + item_names.SOA_PROGRESSIVE_PROXY_PYLON, + item_names.SOA_PYLON_OVERCHARGE, + item_names.SOA_ORBITAL_STRIKE, + item_names.SOA_TEMPORAL_FIELD, + item_names.SOA_SOLAR_LANCE, + item_names.SOA_MASS_RECALL, + item_names.SOA_SHIELD_OVERCHARGE, + item_names.SOA_DEPLOY_FENIX, + item_names.SOA_PURIFIER_BEAM, + item_names.SOA_TIME_STOP, + item_names.SOA_SOLAR_BOMBARDMENT +} + +spear_of_adun_castable_passives = { + item_names.RECONSTRUCTION_BEAM, + item_names.OVERWATCH, + item_names.GUARDIAN_SHELL, +} + +nova_equipment = { + *[item_name for item_name, item_data in get_full_item_list().items() + if item_data.type == TerranItemType.Nova_Gear], + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE +} + +upgrade_bundles: Dict[str, List[str]] = { + # Terran + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON + ], + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR + ], + # Zerg + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK + ], + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE + ], + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE + ], + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE + ], + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE + ], + # Protoss + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON + ], + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], +} + +# Used for logic +upgrade_bundle_inverted_lookup: Dict[str, List[str]] = dict() +for key, values in upgrade_bundles.items(): + for value in values: + if upgrade_bundle_inverted_lookup.get(value) is None: + upgrade_bundle_inverted_lookup[value] = list() + if (value != item_names.PROGRESSIVE_PROTOSS_SHIELDS + or key not in [ + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE + ] + ): + # Shield handling is trickier as it's max of Ground/Air group, not their sum + upgrade_bundle_inverted_lookup[value].append(key) + +lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in get_full_item_list().items() if + data.code} + +upgrade_item_types = (TerranItemType.Upgrade, ZergItemType.Upgrade, ProtossItemType.Upgrade) diff --git a/worlds/sc2/items.py b/worlds/sc2/items.py index 2846df6bf206..d81e16b0e75a 100644 --- a/worlds/sc2/items.py +++ b/worlds/sc2/items.py @@ -1,2427 +1,42 @@ -from typing import * - -from BaseClasses import Item, ItemClassification -import typing import enum +from dataclasses import dataclass +from typing import Optional -from .mission_tables import SC2Mission, SC2Race, SC2Campaign -from . import item_names -from .mission_order.presets_static import get_used_layout_names - - -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""" - War_Council = "War Council", 11 - War_Council_2 = "War Council", 12 - - -class FactionlessItemType(ItemTypeEnum): - Minerals = "Minerals", 0 - Vespene = "Vespene", 1 - Supply = "Supply", 2 - Nothing = "Nothing Group", 4 - Deprecated = "Deprecated", 5 - Keys = "Keys", -1 +from BaseClasses import Item, ItemClassification +from worlds.sc2.item_tables import ItemData -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 ItemFilterFlags(enum.IntFlag): + Available = 0 + Locked = enum.auto() + StartInventory = enum.auto() + NonLocal = enum.auto() + Removed = enum.auto() + Plando = enum.auto() + Excluded = 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""" + Necessary = enum.auto() + """Used to flag items that are never allowed to be culled. + This differs from `Locked` in that locked items may still be culled if there's space issues or in some circumstances when a parent item is culled.""" + Unremovable = Locked|StartInventory|Plando|Necessary -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_item: 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 class StarcraftItem(Item): game: str = "Starcraft 2" + filter_flags: ItemFilterFlags = ItemFilterFlags.Available - -def get_full_item_list(): - return item_table - - -SC2WOL_ITEM_ID_OFFSET = 1000 -SC2HOTS_ITEM_ID_OFFSET = SC2WOL_ITEM_ID_OFFSET + 1000 -SC2LOTV_ITEM_ID_OFFSET = SC2HOTS_ITEM_ID_OFFSET + 1000 -SC2_KEY_ITEM_ID_OFFSET = SC2LOTV_ITEM_ID_OFFSET + 1000 -# Reserve this many IDs for missions, layouts, campaigns, and generic keys each -SC2_KEY_ITEM_SECTION_SIZE = 1000 - -WEAPON_ARMOR_UPGRADE_MAX_LEVEL = 5 - - -# The items are sorted by their IDs. The IDs shall be kept for compatibility with older games. -item_table = { - # WoL - item_names.MARINE: - ItemData(0 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 0, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.MEDIC: - ItemData(1 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 1, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.FIREBAT: - ItemData(2 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 2, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.MARAUDER: - ItemData(3 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 3, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.REAPER: - ItemData(4 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 4, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.HELLION: - ItemData(5 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 5, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.VULTURE: - ItemData(6 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 6, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.GOLIATH: - ItemData(7 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 7, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.DIAMONDBACK: - ItemData(8 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 8, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.SIEGE_TANK: - ItemData(9 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 9, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.MEDIVAC: - ItemData(10 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 10, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.WRAITH: - ItemData(11 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 11, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.VIKING: - ItemData(12 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 12, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.BANSHEE: - ItemData(13 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 13, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.BATTLECRUISER: - ItemData(14 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 14, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.GHOST: - ItemData(15 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 15, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.SPECTRE: - ItemData(16 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 16, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.THOR: - ItemData(17 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 17, SC2Race.TERRAN, - classification=ItemClassification.progression), - # EE units - item_names.LIBERATOR: - ItemData(18 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 18, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.VALKYRIE: - ItemData(19 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 19, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.WIDOW_MINE: - ItemData(20 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 20, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.CYCLONE: - ItemData(21 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 21, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.HERC: - ItemData(22 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 26, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.WARHOUND: - ItemData(23 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 27, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.DOMINION_TROOPER: - ItemData(24 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 4, SC2Race.TERRAN, - classification=ItemClassification.progression), - # Elites - item_names.PRIDE_OF_AUGUSTRGRAD: - ItemData(50 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 28, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.SKY_FURY: - ItemData(51 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 29, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.SHOCK_DIVISION: - ItemData(52 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 0, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.BLACKHAMMER: - ItemData(53 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 1, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.AEGIS_GUARD: - ItemData(54 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 2, SC2Race.TERRAN), - item_names.EMPERORS_SHADOW: - ItemData(55 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 3, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.SON_OF_KORHAL: - ItemData(56 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 5, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.BULWARK_COMPANY: - ItemData(57 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 6, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.FIELD_RESPONSE_THETA: - ItemData(58 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 7, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.EMPERORS_GUARDIAN: - ItemData(59 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 8, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NIGHT_HAWK: - ItemData(60 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 9, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NIGHT_WOLF: - ItemData(61 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 10, SC2Race.TERRAN), - - # Some other items are moved to Upgrade group because of the way how the bot message is parsed - item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON: ItemData(100 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 0, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR: ItemData(102 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 4, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON: ItemData(103 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 8, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR: ItemData(104 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 12, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON: ItemData(105 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 16, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR: ItemData(106 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 20, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - # Bundles - item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: ItemData(107 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: ItemData(108 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: ItemData(109 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: ItemData(110 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: ItemData(111 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: ItemData(112 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - - # Unit and structure upgrades - item_names.BUNKER_PROJECTILE_ACCELERATOR: - ItemData(200 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 0, SC2Race.TERRAN, - parent_item=item_names.BUNKER), - item_names.BUNKER_NEOSTEEL_BUNKER: - ItemData(201 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 1, SC2Race.TERRAN, - parent_item=item_names.BUNKER), - item_names.MISSILE_TURRET_TITANIUM_HOUSING: - ItemData(202 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MISSILE_TURRET), - item_names.MISSILE_TURRET_HELLSTORM_BATTERIES: - ItemData(203 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 3, SC2Race.TERRAN, - parent_item=item_names.MISSILE_TURRET), - item_names.SCV_ADVANCED_CONSTRUCTION: - ItemData(204 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 4, SC2Race.TERRAN), - item_names.SCV_DUAL_FUSION_WELDERS: - ItemData(205 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 5, SC2Race.TERRAN), - item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM: - ItemData(206 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 24, SC2Race.TERRAN, - quantity=2), - item_names.PROGRESSIVE_ORBITAL_COMMAND: - ItemData(207 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Deprecated, -1, SC2Race.TERRAN, - quantity=0, classification=ItemClassification.progression), - item_names.MARINE_PROGRESSIVE_STIMPACK: - ItemData(208 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 0, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.MARINE, quantity=2), - item_names.MARINE_COMBAT_SHIELD: - ItemData(209 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 9, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.MARINE), - item_names.MEDIC_ADVANCED_MEDIC_FACILITIES: - ItemData(210 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 10, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MEDIC), - item_names.MEDIC_STABILIZER_MEDPACKS: - ItemData(211 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 11, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.MEDIC), - item_names.FIREBAT_INCINERATOR_GAUNTLETS: - ItemData(212 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 12, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.FIREBAT), - item_names.FIREBAT_JUGGERNAUT_PLATING: - ItemData(213 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 13, SC2Race.TERRAN, - parent_item=item_names.FIREBAT), - item_names.MARAUDER_CONCUSSIVE_SHELLS: - ItemData(214 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 14, SC2Race.TERRAN, - parent_item=item_names.MARAUDER), - item_names.MARAUDER_KINETIC_FOAM: - ItemData(215 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 15, SC2Race.TERRAN, - parent_item=item_names.MARAUDER), - item_names.REAPER_U238_ROUNDS: - ItemData(216 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 16, SC2Race.TERRAN, - parent_item=item_names.REAPER), - item_names.REAPER_G4_CLUSTERBOMB: - ItemData(217 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 17, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.REAPER), - item_names.CYCLONE_MAG_FIELD_ACCELERATORS: - ItemData(218 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 18, SC2Race.TERRAN, - parent_item=item_names.CYCLONE), - item_names.CYCLONE_MAG_FIELD_LAUNCHERS: - ItemData(219 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 19, SC2Race.TERRAN, - parent_item=item_names.CYCLONE), - item_names.MARINE_LASER_TARGETING_SYSTEM: - ItemData(220 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 8, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MARINE), - item_names.MARINE_MAGRAIL_MUNITIONS: - ItemData(221 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 20, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.MARINE), - item_names.MARINE_OPTIMIZED_LOGISTICS: - ItemData(222 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 21, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MARINE), - item_names.MEDIC_RESTORATION: - ItemData(223 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 22, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MEDIC), - item_names.MEDIC_OPTICAL_FLARE: - ItemData(224 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 23, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MEDIC), - item_names.MEDIC_RESOURCE_EFFICIENCY: - ItemData(225 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MEDIC), - item_names.FIREBAT_PROGRESSIVE_STIMPACK: - ItemData(226 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 6, SC2Race.TERRAN, - parent_item=item_names.FIREBAT, quantity=2), - item_names.FIREBAT_RESOURCE_EFFICIENCY: - ItemData(227 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 25, SC2Race.TERRAN, - parent_item=item_names.FIREBAT), - item_names.MARAUDER_PROGRESSIVE_STIMPACK: - ItemData(228 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 8, SC2Race.TERRAN, - parent_item=item_names.MARAUDER, quantity=2), - item_names.MARAUDER_LASER_TARGETING_SYSTEM: - ItemData(229 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 26, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MARAUDER), - item_names.MARAUDER_MAGRAIL_MUNITIONS: - ItemData(230 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 27, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MARAUDER), - item_names.MARAUDER_INTERNAL_TECH_MODULE: - ItemData(231 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 28, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MARAUDER), - item_names.SCV_HOSTILE_ENVIRONMENT_ADAPTATION: - ItemData(232 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 29, SC2Race.TERRAN, - classification=ItemClassification.filler), - item_names.MEDIC_ADAPTIVE_MEDPACKS: - ItemData(233 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 0, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.MEDIC), - item_names.MEDIC_NANO_PROJECTOR: - ItemData(234 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MEDIC), - item_names.FIREBAT_INFERNAL_PRE_IGNITER: - ItemData(235 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 2, SC2Race.TERRAN, - parent_item=item_names.FIREBAT), - item_names.FIREBAT_KINETIC_FOAM: - ItemData(236 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 3, SC2Race.TERRAN, - parent_item=item_names.FIREBAT), - item_names.FIREBAT_NANO_PROJECTORS: - ItemData(237 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 4, SC2Race.TERRAN, - parent_item=item_names.FIREBAT), - item_names.MARAUDER_JUGGERNAUT_PLATING: - ItemData(238 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 5, SC2Race.TERRAN, - parent_item=item_names.MARAUDER), - item_names.REAPER_JET_PACK_OVERDRIVE: - ItemData(239 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 6, SC2Race.TERRAN, - parent_item=item_names.REAPER), - item_names.HELLION_INFERNAL_PLATING: - ItemData(240 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 7, SC2Race.TERRAN, - parent_item=item_names.HELLION), - item_names.VULTURE_AUTO_REPAIR: - ItemData(241 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 8, SC2Race.TERRAN, - parent_item=item_names.VULTURE), - item_names.GOLIATH_SHAPED_HULL: - ItemData(242 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 9, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.GOLIATH), - item_names.GOLIATH_RESOURCE_EFFICIENCY: - ItemData(243 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 10, SC2Race.TERRAN, - parent_item=item_names.GOLIATH), - item_names.GOLIATH_INTERNAL_TECH_MODULE: - ItemData(244 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 11, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.GOLIATH), - item_names.SIEGE_TANK_SHAPED_HULL: - ItemData(245 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 12, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.SIEGE_TANK), - item_names.SIEGE_TANK_RESOURCE_EFFICIENCY: - ItemData(246 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 13, SC2Race.TERRAN, - parent_item=item_names.SIEGE_TANK), - item_names.PREDATOR_CLOAK: - ItemData(247 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 14, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.PREDATOR), - item_names.PREDATOR_CHARGE: - ItemData(248 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 15, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.PREDATOR), - item_names.MEDIVAC_SCATTER_VEIL: - ItemData(249 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 16, SC2Race.TERRAN, - parent_item=item_names.MEDIVAC), - item_names.REAPER_PROGRESSIVE_STIMPACK: - ItemData(250 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 10, SC2Race.TERRAN, - parent_item=item_names.REAPER, quantity=2), - item_names.REAPER_LASER_TARGETING_SYSTEM: - ItemData(251 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 17, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.REAPER), - item_names.REAPER_ADVANCED_CLOAKING_FIELD: - ItemData(252 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 18, SC2Race.TERRAN, - parent_item=item_names.REAPER), - item_names.REAPER_SPIDER_MINES: - ItemData(253 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 19, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.REAPER, - important_for_filtering=True), - item_names.REAPER_COMBAT_DRUGS: - ItemData(254 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 20, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.REAPER), - item_names.HELLION_HELLBAT_ASPECT: - ItemData(255 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 21, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.HELLION), - item_names.HELLION_SMART_SERVOS: - ItemData(256 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 22, SC2Race.TERRAN, - parent_item=item_names.HELLION), - item_names.HELLION_OPTIMIZED_LOGISTICS: - ItemData(257 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 23, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.HELLION), - item_names.HELLION_JUMP_JETS: - ItemData(258 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.HELLION), - item_names.HELLION_PROGRESSIVE_STIMPACK: - ItemData(259 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 12, SC2Race.TERRAN, - parent_item=item_names.HELLION, quantity=2), - item_names.VULTURE_ION_THRUSTERS: - ItemData(260 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.VULTURE), - item_names.VULTURE_AUTO_LAUNCHERS: - ItemData(261 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 26, SC2Race.TERRAN, - parent_item=item_names.VULTURE), - item_names.SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION: - ItemData(262 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 27, SC2Race.TERRAN), - item_names.GOLIATH_JUMP_JETS: - ItemData(263 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 28, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.GOLIATH), - item_names.GOLIATH_OPTIMIZED_LOGISTICS: - ItemData(264 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 29, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.GOLIATH), - item_names.DIAMONDBACK_HYPERFLUXOR: - ItemData(265 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 0, SC2Race.TERRAN, - parent_item=item_names.DIAMONDBACK), - item_names.DIAMONDBACK_BURST_CAPACITORS: - ItemData(266 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.DIAMONDBACK), - item_names.DIAMONDBACK_RESOURCE_EFFICIENCY: - ItemData(267 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 2, SC2Race.TERRAN, - parent_item=item_names.DIAMONDBACK), - item_names.SIEGE_TANK_JUMP_JETS: - ItemData(268 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 3, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.SIEGE_TANK), - item_names.SIEGE_TANK_SPIDER_MINES: - ItemData(269 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 4, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.SIEGE_TANK, - important_for_filtering=True), - item_names.SIEGE_TANK_SMART_SERVOS: - ItemData(270 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 5, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.SIEGE_TANK), - item_names.SIEGE_TANK_GRADUATING_RANGE: - ItemData(271 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 6, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.SIEGE_TANK), - item_names.SIEGE_TANK_LASER_TARGETING_SYSTEM: - ItemData(272 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 7, SC2Race.TERRAN, - parent_item=item_names.SIEGE_TANK), - item_names.SIEGE_TANK_ADVANCED_SIEGE_TECH: - ItemData(273 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 8, SC2Race.TERRAN, - parent_item=item_names.SIEGE_TANK), - item_names.SIEGE_TANK_INTERNAL_TECH_MODULE: - ItemData(274 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 9, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.SIEGE_TANK), - item_names.PREDATOR_RESOURCE_EFFICIENCY: - ItemData(275 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 10, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.PREDATOR), - item_names.MEDIVAC_EXPANDED_HULL: - ItemData(276 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 11, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MEDIVAC), - item_names.MEDIVAC_AFTERBURNERS: - ItemData(277 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 12, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MEDIVAC), - item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY: - ItemData(278 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 13, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.WRAITH), - item_names.VIKING_SMART_SERVOS: - ItemData(279 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 14, SC2Race.TERRAN, - parent_item=item_names.VIKING), - item_names.VIKING_ANTI_MECHANICAL_MUNITION: - ItemData(280 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 15, SC2Race.TERRAN, - parent_item=item_names.VIKING), - item_names.DIAMONDBACK_ION_THRUSTERS: - ItemData(281 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 21, SC2Race.TERRAN, - parent_item=item_names.DIAMONDBACK), - item_names.WARHOUND_RESOURCE_EFFICIENCY: - ItemData(282 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 13, SC2Race.TERRAN, - parent_item=item_names.WARHOUND), - item_names.WARHOUND_REINFORCED_PLATING: - ItemData(283 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 14, SC2Race.TERRAN, - parent_item=item_names.WARHOUND), - item_names.HERC_RESOURCE_EFFICIENCY: - ItemData(284 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 15, SC2Race.TERRAN, - parent_item=item_names.HERC), - item_names.HERC_JUGGERNAUT_PLATING: - ItemData(285 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 16, SC2Race.TERRAN, - parent_item=item_names.HERC), - item_names.HERC_KINETIC_FOAM: - ItemData(286 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 17, SC2Race.TERRAN, - parent_item=item_names.HERC), - item_names.REAPER_RESOURCE_EFFICIENCY: - ItemData(287 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 18, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.REAPER,), - item_names.REAPER_KINETIC_FOAM: - ItemData(288 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 19, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.REAPER), - item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK: - ItemData(289 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 6, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.SIEGE_TANK, quantity=2), - item_names.SIEGE_TANK_ENHANCED_COMBUSTION_ENGINES: - ItemData(290 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 20, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.SIEGE_TANK), - item_names.MEDIVAC_RAPID_REIGNITION_SYSTEMS: - ItemData(291 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 21, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MEDIVAC), - item_names.BATTLECRUISER_BEHEMOTH_REACTOR: - ItemData(292 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 22, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.BATTLECRUISER), - item_names.THOR_RAPID_RELOAD: - ItemData(293 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 23, SC2Race.TERRAN, - parent_item=item_names.THOR), - item_names.LIBERATOR_GUERILLA_MISSILES: - ItemData(294 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 24, SC2Race.TERRAN, - parent_item=item_names.LIBERATOR), - item_names.WIDOW_MINE_RESOURCE_EFFICIENCY: - ItemData(295 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 25, SC2Race.TERRAN, - parent_item=item_names.WIDOW_MINE), - item_names.HERC_GRAPPLE_PULL: - ItemData(296 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 26, SC2Race.TERRAN, - parent_item=item_names.HERC), - item_names.COMMAND_CENTER_SCANNER_SWEEP: - ItemData(297 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 27, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.COMMAND_CENTER_MULE: - ItemData(298 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 28, SC2Race.TERRAN, - important_for_filtering=True), - item_names.COMMAND_CENTER_EXTRA_SUPPLIES: - ItemData(299 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 29, SC2Race.TERRAN, - important_for_filtering=True), - item_names.HELLION_TWIN_LINKED_FLAMETHROWER: - ItemData(300 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 16, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.HELLION), - item_names.HELLION_THERMITE_FILAMENTS: - ItemData(301 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 17, SC2Race.TERRAN, - parent_item=item_names.HELLION), - item_names.SPIDER_MINE_CERBERUS_MINE: - ItemData(302 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 18, SC2Race.TERRAN, - classification=ItemClassification.filler), - item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE: - ItemData(303 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 16, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.VULTURE, quantity=2), - item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM: - ItemData(304 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 19, SC2Race.TERRAN, - parent_item=item_names.GOLIATH), - item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM: - ItemData(305 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 20, SC2Race.TERRAN, - parent_item=item_names.GOLIATH), - item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL: - ItemData(306 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 4, SC2Race.TERRAN, - parent_item=item_names.DIAMONDBACK, quantity=2), - item_names.DIAMONDBACK_SHAPED_HULL: - ItemData(307 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 22, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.DIAMONDBACK), - item_names.SIEGE_TANK_MAELSTROM_ROUNDS: - ItemData(308 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 23, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.SIEGE_TANK), - item_names.SIEGE_TANK_SHAPED_BLAST: - ItemData(309 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 24, SC2Race.TERRAN, - parent_item=item_names.SIEGE_TANK), - item_names.MEDIVAC_RAPID_DEPLOYMENT_TUBE: - ItemData(310 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MEDIVAC), - item_names.MEDIVAC_ADVANCED_HEALING_AI: - ItemData(311 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 26, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MEDIVAC), - item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS: - ItemData(312 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 18, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.WRAITH, quantity=2), - item_names.WRAITH_DISPLACEMENT_FIELD: - ItemData(313 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 27, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.WRAITH), - item_names.VIKING_RIPWAVE_MISSILES: - ItemData(314 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 28, SC2Race.TERRAN, - parent_item=item_names.VIKING), - item_names.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM: - ItemData(315 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 29, SC2Race.TERRAN, - parent_item=item_names.VIKING), - item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS: - ItemData(316 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.BANSHEE, quantity=2), - item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY: - ItemData(317 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 0, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.BANSHEE), - item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS: - ItemData(318 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 2, SC2Race.TERRAN, - parent_item=item_names.BATTLECRUISER, quantity=2), - item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX: - ItemData(319 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 20, SC2Race.TERRAN, - parent_item=item_names.BATTLECRUISER, quantity=2), - item_names.GHOST_OCULAR_IMPLANTS: - ItemData(320 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 2, SC2Race.TERRAN, - parent_item=item_names.GHOST), - item_names.GHOST_CRIUS_SUIT: - ItemData(321 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 3, SC2Race.TERRAN, - parent_item=item_names.GHOST), - item_names.SPECTRE_PSIONIC_LASH: - ItemData(322 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 4, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.SPECTRE), - item_names.SPECTRE_NYX_CLASS_CLOAKING_MODULE: - ItemData(323 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 5, SC2Race.TERRAN, - parent_item=item_names.SPECTRE), - item_names.THOR_330MM_BARRAGE_CANNON: - ItemData(324 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 6, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.THOR), - item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL: - ItemData(325 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 22, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.THOR, quantity=2), - item_names.LIBERATOR_ADVANCED_BALLISTICS: - ItemData(326 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 7, SC2Race.TERRAN, - parent_item=item_names.LIBERATOR), - item_names.LIBERATOR_RAID_ARTILLERY: - ItemData(327 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 8, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.LIBERATOR), - item_names.WIDOW_MINE_DRILLING_CLAWS: - ItemData(328 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 9, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.WIDOW_MINE), - item_names.WIDOW_MINE_CONCEALMENT: - ItemData(329 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 10, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.WIDOW_MINE), - item_names.MEDIVAC_ADVANCED_CLOAKING_FIELD: - ItemData(330 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 11, SC2Race.TERRAN, - parent_item=item_names.MEDIVAC), - item_names.WRAITH_TRIGGER_OVERRIDE: - ItemData(331 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 12, SC2Race.TERRAN, - parent_item=item_names.WRAITH), - item_names.WRAITH_INTERNAL_TECH_MODULE: - ItemData(332 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 13, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.WRAITH), - item_names.WRAITH_RESOURCE_EFFICIENCY: - ItemData(333 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 14, SC2Race.TERRAN, - parent_item=item_names.WRAITH), - item_names.VIKING_SHREDDER_ROUNDS: - ItemData(334 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 15, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.VIKING), - item_names.VIKING_WILD_MISSILES: - ItemData(335 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 16, SC2Race.TERRAN, - parent_item=item_names.VIKING), - item_names.BANSHEE_SHAPED_HULL: - ItemData(336 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 17, SC2Race.TERRAN, - parent_item=item_names.BANSHEE), - item_names.BANSHEE_ADVANCED_TARGETING_OPTICS: - ItemData(337 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 18, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.BANSHEE), - item_names.BANSHEE_DISTORTION_BLASTERS: - ItemData(338 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 19, SC2Race.TERRAN, - parent_item=item_names.BANSHEE), - item_names.BANSHEE_ROCKET_BARRAGE: - ItemData(339 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 20, SC2Race.TERRAN, - parent_item=item_names.BANSHEE), - item_names.GHOST_RESOURCE_EFFICIENCY: - ItemData(340 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 21, SC2Race.TERRAN, - parent_item=item_names.GHOST), - item_names.SPECTRE_RESOURCE_EFFICIENCY: - ItemData(341 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 22, SC2Race.TERRAN, - parent_item=item_names.SPECTRE), - item_names.THOR_BUTTON_WITH_A_SKULL_ON_IT: - ItemData(342 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 23, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.THOR), - item_names.THOR_LASER_TARGETING_SYSTEM: - ItemData(343 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.THOR), - item_names.THOR_LARGE_SCALE_FIELD_CONSTRUCTION: - ItemData(344 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.THOR), - item_names.RAVEN_RESOURCE_EFFICIENCY: - ItemData(345 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 26, SC2Race.TERRAN, - parent_item=item_names.RAVEN), - item_names.RAVEN_DURABLE_MATERIALS: - ItemData(346 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 27, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.RAVEN), - item_names.SCIENCE_VESSEL_IMPROVED_NANO_REPAIR: - ItemData(347 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 28, SC2Race.TERRAN, - parent_item=item_names.SCIENCE_VESSEL), - item_names.SCIENCE_VESSEL_ADVANCED_AI_SYSTEMS: - ItemData(348 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 29, SC2Race.TERRAN, - parent_item=item_names.SCIENCE_VESSEL), - item_names.CYCLONE_RESOURCE_EFFICIENCY: - ItemData(349 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 0, SC2Race.TERRAN, - parent_item=item_names.CYCLONE), - item_names.BANSHEE_HYPERFLIGHT_ROTORS: - ItemData(350 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.BANSHEE), - item_names.BANSHEE_LASER_TARGETING_SYSTEM: - ItemData(351 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.BANSHEE), - item_names.BANSHEE_INTERNAL_TECH_MODULE: - ItemData(352 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 3, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.BANSHEE), - item_names.BATTLECRUISER_TACTICAL_JUMP: - ItemData(353 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 4, SC2Race.TERRAN, - parent_item=item_names.BATTLECRUISER), - item_names.BATTLECRUISER_CLOAK: - ItemData(354 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 5, SC2Race.TERRAN, - parent_item=item_names.BATTLECRUISER), - item_names.BATTLECRUISER_ATX_LASER_BATTERY: - ItemData(355 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 6, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.BATTLECRUISER), - item_names.BATTLECRUISER_OPTIMIZED_LOGISTICS: - ItemData(356 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 7, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.BATTLECRUISER), - item_names.BATTLECRUISER_INTERNAL_TECH_MODULE: - ItemData(357 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 8, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.BATTLECRUISER), - item_names.GHOST_EMP_ROUNDS: - ItemData(358 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 9, SC2Race.TERRAN, - parent_item=item_names.GHOST), - item_names.GHOST_LOCKDOWN: - ItemData(359 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 10, SC2Race.TERRAN, - parent_item=item_names.GHOST), - item_names.SPECTRE_IMPALER_ROUNDS: - ItemData(360 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 11, SC2Race.TERRAN, - parent_item=item_names.SPECTRE), - item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD: - ItemData(361 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 14, SC2Race.TERRAN, - parent_item=item_names.THOR, quantity=2), - item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE: - ItemData(363 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 12, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.RAVEN), - item_names.RAVEN_SPIDER_MINES: - ItemData(364 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 13, SC2Race.TERRAN, - parent_item=item_names.RAVEN, important_for_filtering=True), - item_names.RAVEN_RAILGUN_TURRET: - ItemData(365 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 14, SC2Race.TERRAN, - parent_item=item_names.RAVEN), - item_names.RAVEN_HUNTER_SEEKER_WEAPON: - ItemData(366 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 15, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.RAVEN), - item_names.RAVEN_INTERFERENCE_MATRIX: - ItemData(367 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 16, SC2Race.TERRAN, - parent_item=item_names.RAVEN), - item_names.RAVEN_ANTI_ARMOR_MISSILE: - ItemData(368 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 17, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.RAVEN), - item_names.RAVEN_INTERNAL_TECH_MODULE: - ItemData(369 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 18, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.RAVEN), - item_names.SCIENCE_VESSEL_EMP_SHOCKWAVE: - ItemData(370 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 19, SC2Race.TERRAN, - parent_item=item_names.SCIENCE_VESSEL), - item_names.SCIENCE_VESSEL_DEFENSIVE_MATRIX: - ItemData(371 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 20, SC2Race.TERRAN, - parent_item=item_names.SCIENCE_VESSEL), - item_names.CYCLONE_TARGETING_OPTICS: - ItemData(372 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 21, SC2Race.TERRAN, - parent_item=item_names.CYCLONE), - item_names.CYCLONE_RAPID_FIRE_LAUNCHERS: - ItemData(373 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 22, SC2Race.TERRAN, - parent_item=item_names.CYCLONE), - item_names.LIBERATOR_CLOAK: - ItemData(374 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 23, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.LIBERATOR), - item_names.LIBERATOR_LASER_TARGETING_SYSTEM: - ItemData(375 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.LIBERATOR), - item_names.LIBERATOR_OPTIMIZED_LOGISTICS: - ItemData(376 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.LIBERATOR), - item_names.WIDOW_MINE_BLACK_MARKET_LAUNCHERS: - ItemData(377 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 26, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.WIDOW_MINE), - item_names.WIDOW_MINE_EXECUTIONER_MISSILES: - ItemData(378 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 27, SC2Race.TERRAN, - parent_item=item_names.WIDOW_MINE), - item_names.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS: - ItemData(379 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 28, - SC2Race.TERRAN, parent_item=item_names.VALKYRIE), - item_names.VALKYRIE_SHAPED_HULL: - ItemData(380 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 29, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.VALKYRIE), - item_names.VALKYRIE_FLECHETTE_MISSILES: - ItemData(381 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 0, SC2Race.TERRAN, - parent_item=item_names.VALKYRIE), - item_names.VALKYRIE_AFTERBURNERS: - ItemData(382 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.VALKYRIE), - item_names.CYCLONE_INTERNAL_TECH_MODULE: - ItemData(383 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.CYCLONE), - item_names.LIBERATOR_SMART_SERVOS: - ItemData(384 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 3, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.LIBERATOR), - item_names.LIBERATOR_RESOURCE_EFFICIENCY: - ItemData(385 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 4, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.LIBERATOR), - item_names.HERCULES_INTERNAL_FUSION_MODULE: - ItemData(386 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 5, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.HERCULES), - item_names.HERCULES_TACTICAL_JUMP: - ItemData(387 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 6, SC2Race.TERRAN, - parent_item=item_names.HERCULES), - item_names.PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS: - ItemData(388 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 28, SC2Race.TERRAN, - parent_item=item_names.PLANETARY_FORTRESS, quantity=2), - item_names.PLANETARY_FORTRESS_ADVANCED_TARGETING: - ItemData(389 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 7, SC2Race.TERRAN, - parent_item=item_names.PLANETARY_FORTRESS), - item_names.VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR: - ItemData(390 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 8, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.VALKYRIE), - item_names.VALKYRIE_RESOURCE_EFFICIENCY: - ItemData(391 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 9, SC2Race.TERRAN, - parent_item=item_names.VALKYRIE), - item_names.PREDATOR_VESPENE_SYNTHESIS: - ItemData(392 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 10, SC2Race.TERRAN, - parent_item=item_names.PREDATOR), - item_names.BATTLECRUISER_BEHEMOTH_PLATING: - ItemData(393 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 11, SC2Race.TERRAN, - parent_item=item_names.BATTLECRUISER), - item_names.BATTLECRUISER_COVERT_OPS_ENGINES: - ItemData(394 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 12, SC2Race.TERRAN, - parent_item=item_names.BATTLECRUISER), - item_names.PLANETARY_FORTRESS_ORBITAL_MODULE: - ItemData(395 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 1, SC2Race.TERRAN, - parent_item=item_names.PLANETARY_FORTRESS), - item_names.DEVASTATOR_TURRET_CONCUSSIVE_GRENADES: - ItemData(396 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 0, SC2Race.TERRAN, - parent_item=item_names.DEVASTATOR_TURRET), - item_names.DEVASTATOR_TURRET_ANTI_ARMOR_MUNITIONS: - ItemData(397 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 1, SC2Race.TERRAN, - parent_item=item_names.DEVASTATOR_TURRET), - item_names.DEVASTATOR_TURRET_RESOURCE_EFFICIENCY: - ItemData(398 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 2, SC2Race.TERRAN, - parent_item=item_names.DEVASTATOR_TURRET), - item_names.MISSILE_TURRET_RESOURCE_EFFICENCY: - ItemData(399 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 3, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=item_names.MISSILE_TURRET), - - #Buildings - item_names.BUNKER: - ItemData(400 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 0, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.MISSILE_TURRET: - ItemData(401 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 1, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.SENSOR_TOWER: - ItemData(402 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 2, SC2Race.TERRAN), - item_names.DEVASTATOR_TURRET: - ItemData(403 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 7, SC2Race.TERRAN, - classification=ItemClassification.progression), - - item_names.WAR_PIGS: - ItemData(500 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 0, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.DEVIL_DOGS: - ItemData(501 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 1, SC2Race.TERRAN, - classification=ItemClassification.filler), - item_names.HAMMER_SECURITIES: - ItemData(502 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 2, SC2Race.TERRAN), - item_names.SPARTAN_COMPANY: - ItemData(503 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 3, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.SIEGE_BREAKERS: - ItemData(504 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 4, SC2Race.TERRAN), - item_names.HELS_ANGELS: - ItemData(505 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 5, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.DUSK_WINGS: - ItemData(506 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 6, SC2Race.TERRAN), - item_names.JACKSONS_REVENGE: - ItemData(507 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 7, SC2Race.TERRAN), - item_names.SKIBIS_ANGELS: - ItemData(508 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 8, SC2Race.TERRAN), - item_names.DEATH_HEADS: - ItemData(509 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 9, SC2Race.TERRAN), - item_names.WINGED_NIGHTMARES: - ItemData(510 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 10, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.MIDNIGHT_RIDERS: - ItemData(511 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 11, SC2Race.TERRAN), - item_names.BRYNHILDS: - ItemData(512 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 12, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.JOTUN: - ItemData(513 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 13, SC2Race.TERRAN), - - item_names.ULTRA_CAPACITORS: - ItemData(600 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 0, SC2Race.TERRAN), - item_names.VANADIUM_PLATING: - ItemData(601 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 1, SC2Race.TERRAN), - item_names.ORBITAL_DEPOTS: - ItemData(602 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 2, SC2Race.TERRAN), - item_names.MICRO_FILTERING: - ItemData(603 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 3, SC2Race.TERRAN), - item_names.AUTOMATED_REFINERY: - ItemData(604 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 4, SC2Race.TERRAN), - item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR: - ItemData(605 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 5, SC2Race.TERRAN), - item_names.RAVEN: - ItemData(606 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 22, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.SCIENCE_VESSEL: - ItemData(607 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 23, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.TECH_REACTOR: - ItemData(608 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 6, SC2Race.TERRAN), - item_names.ORBITAL_STRIKE: - ItemData(609 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 7, SC2Race.TERRAN), - item_names.BUNKER_SHRIKE_TURRET: - ItemData(610 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 6, SC2Race.TERRAN, - parent_item=item_names.BUNKER), - item_names.BUNKER_FORTIFIED_BUNKER: - ItemData(611 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 7, SC2Race.TERRAN, - parent_item=item_names.BUNKER), - item_names.PLANETARY_FORTRESS: - ItemData(612 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 3, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.PERDITION_TURRET: - ItemData(613 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 4, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.PREDATOR: - ItemData(614 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 24, SC2Race.TERRAN, - classification=ItemClassification.filler), - item_names.HERCULES: - ItemData(615 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 25, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.CELLULAR_REACTOR: - ItemData(616 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 8, SC2Race.TERRAN), - item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: - ItemData(617 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 4, SC2Race.TERRAN, quantity=3, - classification= ItemClassification.progression), - item_names.HIVE_MIND_EMULATOR: - ItemData(618 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 5, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.PSI_DISRUPTER: - ItemData(619 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 6, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.STRUCTURE_ARMOR: - ItemData(620 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 9, SC2Race.TERRAN), - item_names.HI_SEC_AUTO_TRACKING: - ItemData(621 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 10, SC2Race.TERRAN), - item_names.ADVANCED_OPTICS: - ItemData(622 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 11, SC2Race.TERRAN), - item_names.ROGUE_FORCES: - ItemData(623 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 12, SC2Race.TERRAN), - item_names.MECHANICAL_KNOW_HOW: - ItemData(624 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 13, SC2Race.TERRAN), - item_names.MERCENARY_MUNITIONS: - ItemData(625 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 14, SC2Race.TERRAN), - item_names.FAST_DELIVERY: - ItemData(626 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 15, SC2Race.TERRAN), - item_names.RAPID_REINFORCEMENT: - ItemData(627 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 16, SC2Race.TERRAN), - item_names.FUSION_CORE_FUSION_REACTOR: - ItemData(628 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 17, SC2Race.TERRAN), - - # WoL Protoss - item_names.ZEALOT: - ItemData(700 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 0, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.STALKER: - ItemData(701 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 1, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.HIGH_TEMPLAR: - ItemData(702 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 2, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.DARK_TEMPLAR: - ItemData(703 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 3, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.IMMORTAL: - ItemData(704 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 4, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.COLOSSUS: - ItemData(705 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 5, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.PHOENIX: - ItemData(706 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 6, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.VOID_RAY: - ItemData(707 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 7, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.CARRIER: - ItemData(708 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 8, SC2Race.PROTOSS, - classification=ItemClassification.progression), - - item_names.SCIENCE_VESSEL_TACTICAL_JUMP: - ItemData(750 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 4, SC2Race.TERRAN, - parent_item=item_names.SCIENCE_VESSEL), - item_names.LIBERATOR_COMPRESSED_ROCKET_FUEL: - ItemData(751 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 5, SC2Race.TERRAN, - parent_item=item_names.LIBERATOR), - item_names.BATTLECRUISER_FIELD_ASSIST_TARGETING_SYSTEM: - ItemData(752 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 6, SC2Race.TERRAN, - parent_item=item_names.BATTLECRUISER), - item_names.PREDATOR_ADAPTIVE_DEFENSES: - ItemData(753 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 7, SC2Race.TERRAN, - parent_item=item_names.PREDATOR), - item_names.VIKING_AESIR_TURBINES: - ItemData(754 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 8, SC2Race.TERRAN, - parent_item=item_names.VIKING), - item_names.MEDIVAC_RESOURCE_EFFICIENCY: - ItemData(755 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 9, SC2Race.TERRAN, - parent_item=item_names.MEDIVAC), - item_names.EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES: - ItemData(756 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 10, SC2Race.TERRAN, - parent_item=item_names.EMPERORS_SHADOW), - item_names.DOMINION_TROOPER_B2_HIGH_CAL_LMG: - ItemData(757 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 11, SC2Race.TERRAN, - parent_item=item_names.DOMINION_TROOPER, important_for_filtering=True), - item_names.DOMINION_TROOPER_HAILSTORM_LAUNCHER: - ItemData(758 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 12, SC2Race.TERRAN, - parent_item=item_names.DOMINION_TROOPER, important_for_filtering=True), - item_names.DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER: - ItemData(759 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 13, SC2Race.TERRAN, - parent_item=item_names.DOMINION_TROOPER, important_for_filtering=True), - item_names.DOMINION_TROOPER_ADVANCED_ALLOYS: - ItemData(760 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 14, SC2Race.TERRAN, - parent_item=item_names.DOMINION_TROOPER), - item_names.DOMINION_TROOPER_OPTIMIZED_LOGISTICS: - ItemData(761 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 15, SC2Race.TERRAN, - parent_item=item_names.DOMINION_TROOPER, classification=ItemClassification.filler), - item_names.SCV_CONSTRUCTION_JUMP_JETS: - ItemData(762 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 16, SC2Race.TERRAN), - item_names.WIDOW_MINE_DEMOLITION_ARMAMENTS: - ItemData(763 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 17, SC2Race.TERRAN, - parent_item=item_names.WIDOW_MINE), - - # Filler items to fill remaining spots - item_names.STARTING_MINERALS: - ItemData(800 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Minerals, -1, SC2Race.ANY, quantity=0, - classification=ItemClassification.filler), - item_names.STARTING_VESPENE: - ItemData(801 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Vespene, -1, SC2Race.ANY, quantity=0, - classification=ItemClassification.filler), - item_names.STARTING_SUPPLY: - ItemData(802 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Supply, -1, SC2Race.ANY, quantity=0, - classification=ItemClassification.filler), - # This item is used to "remove" location from the game. Never placed unless plando'd - item_names.NOTHING: - ItemData(803 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Nothing, -1, SC2Race.ANY, quantity=0, - classification=ItemClassification.trap), - - # Nova gear - item_names.NOVA_GHOST_VISOR: - ItemData(900 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 0, SC2Race.TERRAN), - item_names.NOVA_RANGEFINDER_OCULUS: - ItemData(901 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 1, SC2Race.TERRAN), - item_names.NOVA_DOMINATION: - ItemData(902 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 2, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_BLINK: - ItemData(903 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 3, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE: - ItemData(904 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 0, SC2Race.TERRAN, quantity=2, - classification=ItemClassification.progression), - item_names.NOVA_ENERGY_SUIT_MODULE: - ItemData(905 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 4, SC2Race.TERRAN), - item_names.NOVA_ARMORED_SUIT_MODULE: - ItemData(906 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 5, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_JUMP_SUIT_MODULE: - ItemData(907 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 6, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_C20A_CANISTER_RIFLE: - ItemData(908 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 7, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_HELLFIRE_SHOTGUN: - ItemData(909 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 8, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_PLASMA_RIFLE: - ItemData(910 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 9, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_MONOMOLECULAR_BLADE: - ItemData(911 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 10, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_BLAZEFIRE_GUNBLADE: - ItemData(912 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 11, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_STIM_INFUSION: - ItemData(913 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 12, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_PULSE_GRENADES: - ItemData(914 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 13, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_FLASHBANG_GRENADES: - ItemData(915 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 14, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_IONIC_FORCE_FIELD: - ItemData(916 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 15, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_HOLO_DECOY: - ItemData(917 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 16, SC2Race.TERRAN, - classification=ItemClassification.progression), - item_names.NOVA_NUKE: - ItemData(918 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 17, SC2Race.TERRAN, - classification=ItemClassification.progression), - - # HotS - item_names.ZERGLING: - ItemData(0 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 0, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.SWARM_QUEEN: - ItemData(1 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 1, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.ROACH: - ItemData(2 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 2, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.HYDRALISK: - ItemData(3 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 3, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.ZERGLING_BANELING_ASPECT: - ItemData(4 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 5, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.ABERRATION: - ItemData(5 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 5, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.MUTALISK: - ItemData(6 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 6, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.SWARM_HOST: - ItemData(7 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 7, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.INFESTOR: - ItemData(8 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 8, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.ULTRALISK: - ItemData(9 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 9, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.SPORE_CRAWLER: - ItemData(10 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 10, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.SPINE_CRAWLER: - ItemData(11 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 11, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.CORRUPTOR: - ItemData(12 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 12, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.SCOURGE: - ItemData(13 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 13, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.BROOD_QUEEN: - ItemData(14 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 4, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.DEFILER: - ItemData(15 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 14, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.INFESTED_MARINE: - ItemData(16 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 15, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.INFESTED_BUNKER: - ItemData(17 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 16, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.NYDUS_WORM: - ItemData(18 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 17, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.OMEGA_WORM: - ItemData(19 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 18, SC2Race.ZERG, - classification=ItemClassification.useful), - item_names.INFESTED_SIEGE_TANK: - ItemData(20 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 19, SC2Race.ZERG, - classification=ItemClassification.useful), - item_names.INFESTED_DIAMONDBACK: - ItemData(21 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 20, SC2Race.ZERG, - classification=ItemClassification.useful), - item_names.INFESTED_BANSHEE: - ItemData(22 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 21, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.INFESTED_LIBERATOR: - ItemData(23 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 22, SC2Race.ZERG, - classification=ItemClassification.useful), - item_names.INFESTED_MISSILE_TURRET: - ItemData(24 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 23, SC2Race.ZERG, - classification=ItemClassification.progression), - - item_names.PROGRESSIVE_ZERG_MELEE_ATTACK: ItemData(100 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 0, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK: ItemData(101 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 4, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE: ItemData(102 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 8, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_FLYER_ATTACK: ItemData(103 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 12, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE: ItemData(104 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 16, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - # Bundles - item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: ItemData(105 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: ItemData(106 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: ItemData(107 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: ItemData(108 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - - item_names.ZERGLING_HARDENED_CARAPACE: - ItemData(200 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 0, SC2Race.ZERG, parent_item=item_names.ZERGLING), - item_names.ZERGLING_ADRENAL_OVERLOAD: - ItemData(201 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 1, SC2Race.ZERG, parent_item=item_names.ZERGLING, classification=ItemClassification.progression), - item_names.ZERGLING_METABOLIC_BOOST: - ItemData(202 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 2, SC2Race.ZERG, parent_item=item_names.ZERGLING, classification=ItemClassification.filler), - item_names.ROACH_HYDRIODIC_BILE: - ItemData(203 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 3, SC2Race.ZERG, parent_item=item_names.ROACH, classification=ItemClassification.progression), - item_names.ROACH_ADAPTIVE_PLATING: - ItemData(204 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 4, SC2Race.ZERG, parent_item=item_names.ROACH), - item_names.ROACH_TUNNELING_CLAWS: - ItemData(205 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 5, SC2Race.ZERG, parent_item=item_names.ROACH, classification=ItemClassification.filler), - item_names.HYDRALISK_FRENZY: - ItemData(206 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 6, SC2Race.ZERG, parent_item=item_names.HYDRALISK, classification=ItemClassification.progression), - item_names.HYDRALISK_ANCILLARY_CARAPACE: - ItemData(207 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 7, SC2Race.ZERG, parent_item=item_names.HYDRALISK, classification=ItemClassification.filler), - item_names.HYDRALISK_GROOVED_SPINES: - ItemData(208 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 8, SC2Race.ZERG, parent_item=item_names.HYDRALISK), - item_names.BANELING_CORROSIVE_ACID: - ItemData(209 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 9, SC2Race.ZERG, - parent_item=item_names.ZERGLING_BANELING_ASPECT, classification=ItemClassification.progression), - item_names.BANELING_RUPTURE: - ItemData(210 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 10, SC2Race.ZERG, - parent_item=item_names.ZERGLING_BANELING_ASPECT, - classification=ItemClassification.filler), - item_names.BANELING_REGENERATIVE_ACID: - ItemData(211 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 11, SC2Race.ZERG, - parent_item=item_names.ZERGLING_BANELING_ASPECT, - classification=ItemClassification.filler), - item_names.MUTALISK_VICIOUS_GLAIVE: - ItemData(212 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 12, SC2Race.ZERG, parent_item=item_names.MUTALISK), - item_names.MUTALISK_RAPID_REGENERATION: - ItemData(213 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 13, SC2Race.ZERG, parent_item=item_names.MUTALISK), - item_names.MUTALISK_SUNDERING_GLAIVE: - ItemData(214 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 14, SC2Race.ZERG, parent_item=item_names.MUTALISK), - item_names.SWARM_HOST_BURROW: - ItemData(215 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 15, SC2Race.ZERG, parent_item=item_names.SWARM_HOST, classification=ItemClassification.filler), - item_names.SWARM_HOST_RAPID_INCUBATION: - ItemData(216 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 16, SC2Race.ZERG, parent_item=item_names.SWARM_HOST), - item_names.SWARM_HOST_PRESSURIZED_GLANDS: - ItemData(217 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 17, SC2Race.ZERG, parent_item=item_names.SWARM_HOST, classification=ItemClassification.progression), - item_names.ULTRALISK_BURROW_CHARGE: - ItemData(218 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 18, SC2Race.ZERG, parent_item=item_names.ULTRALISK), - item_names.ULTRALISK_TISSUE_ASSIMILATION: - ItemData(219 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 19, SC2Race.ZERG, parent_item=item_names.ULTRALISK), - item_names.ULTRALISK_MONARCH_BLADES: - ItemData(220 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 20, SC2Race.ZERG, parent_item=item_names.ULTRALISK), - item_names.CORRUPTOR_CAUSTIC_SPRAY: - ItemData(221 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 21, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), - item_names.CORRUPTOR_CORRUPTION: - ItemData(222 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 22, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), - item_names.SCOURGE_VIRULENT_SPORES: - ItemData(223 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 23, SC2Race.ZERG, parent_item=item_names.SCOURGE), - item_names.SCOURGE_RESOURCE_EFFICIENCY: - ItemData(224 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 24, SC2Race.ZERG, parent_item=item_names.SCOURGE, classification=ItemClassification.progression), - item_names.SCOURGE_SWARM_SCOURGE: - ItemData(225 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 25, SC2Race.ZERG, parent_item=item_names.SCOURGE), - item_names.ZERGLING_SHREDDING_CLAWS: - ItemData(226 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 26, SC2Race.ZERG, parent_item=item_names.ZERGLING), - item_names.ROACH_GLIAL_RECONSTITUTION: - ItemData(227 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 27, SC2Race.ZERG, parent_item=item_names.ROACH, classification=ItemClassification.progression), - item_names.ROACH_ORGANIC_CARAPACE: - ItemData(228 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 28, SC2Race.ZERG, parent_item=item_names.ROACH), - item_names.HYDRALISK_MUSCULAR_AUGMENTS: - ItemData(229 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 29, SC2Race.ZERG, parent_item=item_names.HYDRALISK), - item_names.HYDRALISK_RESOURCE_EFFICIENCY: - ItemData(230 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 0, SC2Race.ZERG, parent_item=item_names.HYDRALISK), - item_names.BANELING_CENTRIFUGAL_HOOKS: - ItemData(231 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 1, SC2Race.ZERG, - parent_item=item_names.ZERGLING_BANELING_ASPECT), - item_names.BANELING_TUNNELING_JAWS: - ItemData(232 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 2, SC2Race.ZERG, - parent_item=item_names.ZERGLING_BANELING_ASPECT), - item_names.BANELING_RAPID_METAMORPH: - ItemData(233 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 3, SC2Race.ZERG, - parent_item=item_names.ZERGLING_BANELING_ASPECT), - item_names.MUTALISK_SEVERING_GLAIVE: - ItemData(234 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 4, SC2Race.ZERG, parent_item=item_names.MUTALISK, classification=ItemClassification.progression), - item_names.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE: - ItemData(235 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 5, SC2Race.ZERG, parent_item=item_names.MUTALISK), - item_names.SWARM_HOST_LOCUST_METABOLIC_BOOST: - ItemData(236 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 6, SC2Race.ZERG, parent_item=item_names.SWARM_HOST, classification=ItemClassification.filler), - item_names.SWARM_HOST_ENDURING_LOCUSTS: - ItemData(237 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 7, SC2Race.ZERG, parent_item=item_names.SWARM_HOST), - item_names.SWARM_HOST_ORGANIC_CARAPACE: - ItemData(238 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 8, SC2Race.ZERG, parent_item=item_names.SWARM_HOST), - item_names.SWARM_HOST_RESOURCE_EFFICIENCY: - ItemData(239 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 9, SC2Race.ZERG, parent_item=item_names.SWARM_HOST, classification=ItemClassification.progression), - item_names.ULTRALISK_ANABOLIC_SYNTHESIS: - ItemData(240 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 10, SC2Race.ZERG, parent_item=item_names.ULTRALISK, classification=ItemClassification.filler), - item_names.ULTRALISK_CHITINOUS_PLATING: - ItemData(241 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 11, SC2Race.ZERG, parent_item=item_names.ULTRALISK), - item_names.ULTRALISK_ORGANIC_CARAPACE: - ItemData(242 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 12, SC2Race.ZERG, parent_item=item_names.ULTRALISK), - item_names.ULTRALISK_RESOURCE_EFFICIENCY: - ItemData(243 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 13, SC2Race.ZERG, parent_item=item_names.ULTRALISK), - item_names.DEVOURER_CORROSIVE_SPRAY: - ItemData(244 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 14, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), - item_names.DEVOURER_GAPING_MAW: - ItemData(245 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 15, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), - item_names.DEVOURER_IMPROVED_OSMOSIS: - ItemData(246 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 16, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, - classification=ItemClassification.filler), - item_names.DEVOURER_PRESCIENT_SPORES: - ItemData(247 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 17, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), - item_names.GUARDIAN_PROLONGED_DISPERSION: - ItemData(248 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 18, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), - item_names.GUARDIAN_PRIMAL_ADAPTATION: - ItemData(249 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 19, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), - item_names.GUARDIAN_SORONAN_ACID: - ItemData(250 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 20, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), - item_names.IMPALER_ADAPTIVE_TALONS: - ItemData(251 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 21, SC2Race.ZERG, - parent_item=item_names.HYDRALISK_IMPALER_ASPECT, - classification=ItemClassification.filler), - item_names.IMPALER_SECRETION_GLANDS: - ItemData(252 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 22, SC2Race.ZERG, - parent_item=item_names.HYDRALISK_IMPALER_ASPECT), - item_names.IMPALER_HARDENED_TENTACLE_SPINES: - ItemData(253 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 23, SC2Race.ZERG, - parent_item=item_names.HYDRALISK_IMPALER_ASPECT, classification=ItemClassification.progression), - item_names.LURKER_SEISMIC_SPINES: - ItemData(254 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 24, SC2Race.ZERG, - parent_item=item_names.HYDRALISK_LURKER_ASPECT, classification=ItemClassification.progression), - item_names.LURKER_ADAPTED_SPINES: - ItemData(255 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 25, SC2Race.ZERG, - parent_item=item_names.HYDRALISK_LURKER_ASPECT, classification=ItemClassification.progression), - item_names.RAVAGER_POTENT_BILE: - ItemData(256 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 26, SC2Race.ZERG, - parent_item=item_names.ROACH_RAVAGER_ASPECT), - item_names.RAVAGER_BLOATED_BILE_DUCTS: - ItemData(257 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 27, SC2Race.ZERG, - parent_item=item_names.ROACH_RAVAGER_ASPECT), - item_names.RAVAGER_DEEP_TUNNEL: - ItemData(258 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 28, SC2Race.ZERG, - parent_item=item_names.ROACH_RAVAGER_ASPECT), - item_names.VIPER_PARASITIC_BOMB: - ItemData(259 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 29, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, - classification=ItemClassification.progression), - item_names.VIPER_PARALYTIC_BARBS: - ItemData(260 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 0, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT), - item_names.VIPER_VIRULENT_MICROBES: - ItemData(261 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 1, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT), - item_names.BROOD_LORD_POROUS_CARTILAGE: - ItemData(262 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 2, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), - item_names.BROOD_LORD_EVOLVED_CARAPACE: - ItemData(263 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 3, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), - item_names.BROOD_LORD_SPLITTER_MITOSIS: - ItemData(264 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 4, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), - item_names.BROOD_LORD_RESOURCE_EFFICIENCY: - ItemData(265 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 5, SC2Race.ZERG, - parent_item=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), - item_names.INFESTOR_INFESTED_TERRAN: - ItemData(266 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 6, SC2Race.ZERG, parent_item=item_names.INFESTOR), - item_names.INFESTOR_MICROBIAL_SHROUD: - ItemData(267 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 7, SC2Race.ZERG, parent_item=item_names.INFESTOR), - item_names.SWARM_QUEEN_SPAWN_LARVAE: - ItemData(268 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 8, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN), - item_names.SWARM_QUEEN_DEEP_TUNNEL: - ItemData(269 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 9, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN), - item_names.SWARM_QUEEN_ORGANIC_CARAPACE: - ItemData(270 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 10, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN, classification=ItemClassification.filler), - item_names.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION: - ItemData(271 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 11, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN, classification=ItemClassification.progression), - item_names.SWARM_QUEEN_RESOURCE_EFFICIENCY: - ItemData(272 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 12, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN), - item_names.SWARM_QUEEN_INCUBATOR_CHAMBER: - ItemData(273 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 13, SC2Race.ZERG, parent_item=item_names.SWARM_QUEEN), - item_names.BROOD_QUEEN_FUNGAL_GROWTH: - ItemData(274 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 14, SC2Race.ZERG, parent_item=item_names.BROOD_QUEEN), - item_names.BROOD_QUEEN_ENSNARE: - ItemData(275 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 15, SC2Race.ZERG, parent_item=item_names.BROOD_QUEEN), - item_names.BROOD_QUEEN_ENHANCED_MITOCHONDRIA: - ItemData(276 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 16, SC2Race.ZERG, parent_item=item_names.BROOD_QUEEN), - item_names.DEFILER_PATHOGEN_PROJECTORS: - ItemData(277 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 17, SC2Race.ZERG, parent_item=item_names.DEFILER), - item_names.DEFILER_TRAPDOOR_ADAPTATION: - ItemData(278 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 18, SC2Race.ZERG, parent_item=item_names.DEFILER), - item_names.DEFILER_PREDATORY_CONSUMPTION: - ItemData(279 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 19, SC2Race.ZERG, parent_item=item_names.DEFILER), - item_names.DEFILER_COMORBIDITY: - ItemData(280 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 20, SC2Race.ZERG, parent_item=item_names.DEFILER), - item_names.ABERRATION_MONSTROUS_RESILIENCE: - ItemData(281 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 21, SC2Race.ZERG, parent_item=item_names.ABERRATION), - item_names.ABERRATION_CONSTRUCT_REGENERATION: - ItemData(282 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 22, SC2Race.ZERG, parent_item=item_names.ABERRATION), - item_names.ABERRATION_BANELING_INCUBATION: - ItemData(283 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 23, SC2Race.ZERG, parent_item=item_names.ABERRATION), - item_names.ABERRATION_PROTECTIVE_COVER: - ItemData(284 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 24, SC2Race.ZERG, parent_item=item_names.ABERRATION), - item_names.ABERRATION_RESOURCE_EFFICIENCY: - ItemData(285 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 25, SC2Race.ZERG, parent_item=item_names.ABERRATION), - item_names.CORRUPTOR_MONSTROUS_RESILIENCE: - ItemData(286 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 26, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), - item_names.CORRUPTOR_CONSTRUCT_REGENERATION: - ItemData(287 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 27, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), - item_names.CORRUPTOR_SCOURGE_INCUBATION: - ItemData(288 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 28, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), - item_names.CORRUPTOR_RESOURCE_EFFICIENCY: - ItemData(289 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 29, SC2Race.ZERG, parent_item=item_names.CORRUPTOR), - item_names.PRIMAL_IGNITER_CONCENTRATED_FIRE: - ItemData(290 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 0, SC2Race.ZERG, parent_item=item_names.ROACH_PRIMAL_IGNITER_ASPECT), - item_names.PRIMAL_IGNITER_PRIMAL_TENACITY: - ItemData(291 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 1, SC2Race.ZERG, parent_item=item_names.ROACH_PRIMAL_IGNITER_ASPECT), - item_names.INFESTED_SCV_BUILD_CHARGES: - ItemData(292 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 2, SC2Race.ZERG), - item_names.INFESTED_MARINE_PLAGUED_MUNITIONS: - ItemData(293 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 3, SC2Race.ZERG, parent_item=item_names.INFESTED_MARINE), - item_names.INFESTED_MARINE_RETINAL_AUGMENTATION: - ItemData(294 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 4, SC2Race.ZERG, parent_item=item_names.INFESTED_MARINE), - item_names.INFESTED_BUNKER_CALCIFIED_ARMOR: - ItemData(295 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 6, SC2Race.ZERG, parent_item=item_names.INFESTED_BUNKER), - item_names.INFESTED_BUNKER_REGENERATIVE_PLATING: - ItemData(296 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 5, SC2Race.ZERG, parent_item=item_names.INFESTED_BUNKER), - item_names.INFESTED_BUNKER_ENGORGED_BUNKERS: - ItemData(297 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 7, SC2Race.ZERG, parent_item=item_names.INFESTED_BUNKER), - item_names.INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD: - ItemData(298 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 6, SC2Race.ZERG, parent_item=item_names.INFESTED_MISSILE_TURRET), - item_names.INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS: - ItemData(299 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 7, SC2Race.ZERG, parent_item=item_names.INFESTED_MISSILE_TURRET), - - item_names.ZERGLING_RAPTOR_STRAIN: - ItemData(300 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 0, SC2Race.ZERG, parent_item=item_names.ZERGLING, classification=ItemClassification.progression), - item_names.ZERGLING_SWARMLING_STRAIN: - ItemData(301 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 1, SC2Race.ZERG, parent_item=item_names.ZERGLING), - item_names.ROACH_VILE_STRAIN: - ItemData(302 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 2, SC2Race.ZERG, parent_item=item_names.ROACH), - item_names.ROACH_CORPSER_STRAIN: - ItemData(303 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 3, SC2Race.ZERG, parent_item=item_names.ROACH, classification=ItemClassification.progression), - item_names.HYDRALISK_IMPALER_ASPECT: - ItemData(304 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 0, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.HYDRALISK_LURKER_ASPECT: - ItemData(305 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 1, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.BANELING_SPLITTER_STRAIN: - ItemData(306 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 6, SC2Race.ZERG, - parent_item=item_names.ZERGLING_BANELING_ASPECT), - item_names.BANELING_HUNTER_STRAIN: - ItemData(307 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 7, SC2Race.ZERG, - parent_item=item_names.ZERGLING_BANELING_ASPECT), - item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: - ItemData(308 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 2, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT: - ItemData(309 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 3, SC2Race.ZERG, - classification=ItemClassification.progression), - item_names.SWARM_HOST_CARRION_STRAIN: - ItemData(310 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 10, SC2Race.ZERG, parent_item=item_names.SWARM_HOST), - item_names.SWARM_HOST_CREEPER_STRAIN: - ItemData(311 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 11, SC2Race.ZERG, parent_item=item_names.SWARM_HOST, classification=ItemClassification.filler), - item_names.ULTRALISK_NOXIOUS_STRAIN: - ItemData(312 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 12, SC2Race.ZERG, parent_item=item_names.ULTRALISK, classification=ItemClassification.filler), - item_names.ULTRALISK_TORRASQUE_STRAIN: - ItemData(313 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 13, SC2Race.ZERG, parent_item=item_names.ULTRALISK), - - item_names.TYRANNOZOR_TYRANTS_PROTECTION: - ItemData(350 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 8, SC2Race.ZERG, parent_item=item_names.ULTRALISK_TYRANNOZOR_ASPECT), - item_names.TYRANNOZOR_BARRAGE_OF_SPIKES: - ItemData(351 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 9, SC2Race.ZERG, parent_item=item_names.ULTRALISK_TYRANNOZOR_ASPECT), - item_names.TYRANNOZOR_IMPALING_STRIKE: - ItemData(352 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 10, SC2Race.ZERG, parent_item=item_names.ULTRALISK_TYRANNOZOR_ASPECT), - item_names.TYRANNOZOR_HEALING_ADAPTATION: - ItemData(353 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 11, SC2Race.ZERG, parent_item=item_names.ULTRALISK_TYRANNOZOR_ASPECT), - item_names.NYDUS_WORM_OMEGA_WORM_SUBTERRANEAN_SCALES: - ItemData(354 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 12, SC2Race.ZERG, classification=ItemClassification.filler), - item_names.NYDUS_WORM_OMEGA_WORM_JORMUNGANDR_STRAIN: - ItemData(355 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 13, SC2Race.ZERG, classification=ItemClassification.useful), - item_names.NYDUS_WORM_OMEGA_WORM_RESOURCE_EFFICIENCY: - ItemData(356 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 14, SC2Race.ZERG, classification=ItemClassification.useful), - item_names.OMEGA_WORM_OUROBOROS_STRAIN: - ItemData(357 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 15, SC2Race.ZERG, parent_item=item_names.OMEGA_WORM, classification=ItemClassification.useful), - item_names.NYDUS_WORM_RAVENOUS_APPETITE: - ItemData(358 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 16, SC2Race.ZERG, parent_item=item_names.NYDUS_WORM, classification=ItemClassification.useful), - item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS: - ItemData(359 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Progressive, 0, SC2Race.ZERG, - parent_item=item_names.INFESTED_SIEGE_TANK, quantity=2), - item_names.INFESTED_SIEGE_TANK_ACIDIC_ENZYMES: - ItemData(360 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 17, SC2Race.ZERG, parent_item=item_names.INFESTED_SIEGE_TANK), - item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL: - ItemData(361 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 18, SC2Race.ZERG, parent_item=item_names.INFESTED_SIEGE_TANK), - item_names.INFESTED_DIAMONDBACK_CAUSTIC_MUCUS: - ItemData(362 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 19, SC2Race.ZERG, parent_item=item_names.INFESTED_DIAMONDBACK), - item_names.INFESTED_DIAMONDBACK_VIOLENT_ENZYMES: - ItemData(363 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 20, SC2Race.ZERG, parent_item=item_names.INFESTED_DIAMONDBACK), - item_names.INFESTED_BANSHEE_BRACED_EXOSKELETON: - ItemData(364 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 21, SC2Race.ZERG, parent_item=item_names.INFESTED_BANSHEE), - item_names.INFESTED_BANSHEE_RAPID_HIBERNATION: - ItemData(365 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 22, SC2Race.ZERG, parent_item=item_names.INFESTED_BANSHEE), - item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL: - ItemData(366 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 23, SC2Race.ZERG, parent_item=item_names.INFESTED_LIBERATOR), - item_names.INFESTED_LIBERATOR_VIRAL_CONTAMINATION: - ItemData(367 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 24, SC2Race.ZERG, parent_item=item_names.INFESTED_LIBERATOR), - item_names.GUARDIAN_PROPELLANT_SACS: - ItemData(368 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 25, SC2Race.ZERG, parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), - item_names.GUARDIAN_EXPLOSIVE_SPORES: - ItemData(369 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 26, SC2Race.ZERG, parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), - item_names.GUARDIAN_PRIMORDIAL_FURY: - ItemData(370 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 27, SC2Race.ZERG, parent_item=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), - item_names.INFESTED_SIEGE_TANK_SEISMIC_SONAR: - ItemData(371 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 28, SC2Race.ZERG, parent_item=item_names.INFESTED_SIEGE_TANK), - item_names.INFESTED_BANSHEE_ADVANCED_TARGETING_OPTICS: - ItemData(372 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 29, SC2Race.ZERG, parent_item=item_names.INFESTED_BANSHEE), - item_names.INFESTED_SIEGE_TANK_BALANCED_ROOTS: - ItemData(373 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 0, SC2Race.ZERG, parent_item=item_names.INFESTED_SIEGE_TANK), - item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE: - ItemData(374 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Progressive, 2, SC2Race.ZERG, - parent_item=item_names.INFESTED_DIAMONDBACK, quantity=2), - item_names.INFESTED_DIAMONDBACK_CONCENTRATED_SPEW: - ItemData(375 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 1, SC2Race.ZERG, parent_item=item_names.INFESTED_DIAMONDBACK), - item_names.FRIGHTFUL_FLESHWELDER_INFESTED_SIEGE_TANK: - ItemData(376 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 2, SC2Race.ZERG, parent_item=item_names.INFESTED_SIEGE_TANK), - item_names.FRIGHTFUL_FLESHWELDER_INFESTED_DIAMONDBACK: - ItemData(377 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 3, SC2Race.ZERG, parent_item=item_names.INFESTED_DIAMONDBACK), - item_names.FRIGHTFUL_FLESHWELDER_INFESTED_BANSHEE: - ItemData(378 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 4, SC2Race.ZERG, parent_item=item_names.INFESTED_BANSHEE), - item_names.FRIGHTFUL_FLESHWELDER_INFESTED_LIBERATOR: - ItemData(379 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 5, SC2Race.ZERG, parent_item=item_names.INFESTED_LIBERATOR), - - item_names.KERRIGAN_KINETIC_BLAST: ItemData(400 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 0, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_HEROIC_FORTITUDE: ItemData(401 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 1, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_LEAPING_STRIKE: ItemData(402 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 2, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_CRUSHING_GRIP: ItemData(403 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 3, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_CHAIN_REACTION: ItemData(404 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 4, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_PSIONIC_SHIFT: ItemData(405 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 5, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.ZERGLING_RECONSTITUTION: ItemData(406 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 0, SC2Race.ZERG, classification=ItemClassification.filler), - item_names.OVERLORD_IMPROVED_OVERLORDS: ItemData(407 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 1, SC2Race.ZERG), - item_names.AUTOMATED_EXTRACTORS: ItemData(408 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 2, SC2Race.ZERG), - item_names.KERRIGAN_WILD_MUTATION: ItemData(409 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 6, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_SPAWN_BANELINGS: ItemData(410 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 7, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_MEND: ItemData(411 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 8, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.TWIN_DRONES: ItemData(412 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 3, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.MALIGNANT_CREEP: ItemData(413 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 4, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.VESPENE_EFFICIENCY: ItemData(414 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 5, SC2Race.ZERG), - item_names.KERRIGAN_INFEST_BROODLINGS: ItemData(415 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 9, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_FURY: ItemData(416 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 10, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_ABILITY_EFFICIENCY: ItemData(417 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 11, SC2Race.ZERG), - item_names.KERRIGAN_APOCALYPSE: ItemData(418 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 12, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_SPAWN_LEVIATHAN: ItemData(419 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 13, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.KERRIGAN_DROP_PODS: ItemData(420 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 14, SC2Race.ZERG, classification=ItemClassification.progression), - # Handled separately from other abilities - item_names.KERRIGAN_PRIMAL_FORM: ItemData(421 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Primal_Form, 0, SC2Race.ZERG), - item_names.KERRIGAN_ASSIMIlATION_AURA: ItemData(422 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 15, SC2Race.ZERG), - item_names.KERRIGAN_IMMOBILIZATION_WAVE: ItemData(423 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 16, SC2Race.ZERG), - - item_names.KERRIGAN_LEVELS_10: ItemData(500 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 10, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), - item_names.KERRIGAN_LEVELS_9: ItemData(501 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 9, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), - item_names.KERRIGAN_LEVELS_8: ItemData(502 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 8, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), - item_names.KERRIGAN_LEVELS_7: ItemData(503 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 7, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), - item_names.KERRIGAN_LEVELS_6: ItemData(504 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 6, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), - item_names.KERRIGAN_LEVELS_5: ItemData(505 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 5, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), - item_names.KERRIGAN_LEVELS_4: ItemData(506 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 4, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), - item_names.KERRIGAN_LEVELS_3: ItemData(507 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 3, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), - item_names.KERRIGAN_LEVELS_2: ItemData(508 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 2, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), - item_names.KERRIGAN_LEVELS_1: ItemData(509 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 1, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), - item_names.KERRIGAN_LEVELS_14: ItemData(510 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 14, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), - item_names.KERRIGAN_LEVELS_35: ItemData(511 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 35, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), - item_names.KERRIGAN_LEVELS_70: ItemData(512 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 70, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), - - # Zerg Mercs - item_names.INFESTED_MEDICS: ItemData(600 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 0, SC2Race.ZERG), - item_names.INFESTED_SIEGE_BREAKERS: ItemData(601 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 1, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.INFESTED_DUSK_WINGS: ItemData(602 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 2, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.DEVOURING_ONES: ItemData(603 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 3, SC2Race.ZERG), - item_names.HUNTER_KILLERS: ItemData(604 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 4, SC2Race.ZERG), - item_names.TORRASQUE_MERC: ItemData(605 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 5, SC2Race.ZERG), - item_names.HUNTERLING: ItemData(606 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 6, SC2Race.ZERG, classification=ItemClassification.progression), - - # Misc Upgrades - item_names.OVERLORD_VENTRAL_SACS: ItemData(700 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 6, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.OVERLORD_GENERATE_CREEP: ItemData(701 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 7, SC2Race.ZERG), - item_names.OVERLORD_ANTENNAE: ItemData(702 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 8, SC2Race.ZERG, classification=ItemClassification.filler), - item_names.OVERLORD_PNEUMATIZED_CARAPACE: ItemData(703 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 9, SC2Race.ZERG), - item_names.ZERG_EXCAVATING_CLAWS: ItemData(704 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 11, SC2Race.ZERG), - item_names.ZERG_CREEP_STOMACH: ItemData(705 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 10, SC2Race.ZERG), - item_names.HIVE_CLUSTER_MATURATION: ItemData(706 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 12, SC2Race.ZERG), - item_names.MACROSCOPIC_RECUPERATION: ItemData(707 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 13, SC2Race.ZERG), - - # Morphs - item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: ItemData(800 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 6, SC2Race.ZERG), - item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: ItemData(801 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 7, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.ROACH_RAVAGER_ASPECT: ItemData(802 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 8, SC2Race.ZERG), - item_names.OVERLORD_OVERSEER_ASPECT: ItemData(803 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 4, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.ROACH_PRIMAL_IGNITER_ASPECT: ItemData(804 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 9, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.ULTRALISK_TYRANNOZOR_ASPECT: ItemData(805 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 10, SC2Race.ZERG, classification=ItemClassification.progression), - - - # Protoss Units (those that aren't as items in WoL (Prophecy)) - item_names.OBSERVER: - ItemData(0 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 9, SC2Race.PROTOSS, - classification=ItemClassification.filler), - item_names.CENTURION: - ItemData(1 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 10, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.SENTINEL: - ItemData(2 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 11, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.SUPPLICANT: - ItemData(3 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 12, SC2Race.PROTOSS, - classification=ItemClassification.filler, important_for_filtering=True), - item_names.INSTIGATOR: - ItemData(4 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 13, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.SLAYER: - ItemData(5 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 14, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.SENTRY: - ItemData(6 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 15, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.ENERGIZER: - ItemData(7 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 16, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.HAVOC: - ItemData(8 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 17, SC2Race.PROTOSS, important_for_filtering=True), - item_names.SIGNIFIER: - ItemData(9 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 18, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.ASCENDANT: - ItemData(10 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 19, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.AVENGER: - ItemData(11 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 20, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.BLOOD_HUNTER: - ItemData(12 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 21, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.DRAGOON: - ItemData(13 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 22, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.DARK_ARCHON: - ItemData(14 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 23, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.ADEPT: - ItemData(15 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 24, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.WARP_PRISM: - ItemData(16 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 25, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.ANNIHILATOR: - ItemData(17 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 26, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.VANGUARD: - ItemData(18 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 27, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.WRATHWALKER: - ItemData(19 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 28, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.REAVER: - ItemData(20 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 29, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.DISRUPTOR: - ItemData(21 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 0, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.MIRAGE: - ItemData(22 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 1, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.CORSAIR: - ItemData(23 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 2, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.DESTROYER: - ItemData(24 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 3, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.SCOUT: - ItemData(25 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 4, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.TEMPEST: - ItemData(26 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 5, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.MOTHERSHIP: - ItemData(27 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 6, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.ARBITER: - ItemData(28 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 7, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.ORACLE: - ItemData(29 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 8, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.STALWART: - ItemData(30 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 9, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.WARP_RAY: - ItemData(31 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 10, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.DAWNBRINGER: - ItemData(32 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 11, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.SKYLORD: - ItemData(33 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 12, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.TRIREME: - ItemData(34 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 13, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.SKIRMISHER: - ItemData(35 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 14, SC2Race.PROTOSS, - classification=ItemClassification.progression), - - # Protoss Upgrades - item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON: ItemData(100 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 0, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR: ItemData(101 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 4, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_SHIELDS: ItemData(102 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 8, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON: ItemData(103 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 12, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR: ItemData(104 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 16, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - # Bundles - item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: ItemData(105 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: ItemData(106 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: ItemData(107 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: ItemData(108 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - - # Protoss Buildings - item_names.PHOTON_CANNON: ItemData(200 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 0, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.KHAYDARIN_MONOLITH: ItemData(201 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.SHIELD_BATTERY: ItemData(202 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 2, SC2Race.PROTOSS, classification=ItemClassification.progression), - - # Protoss Unit Upgrades - item_names.SUPPLICANT_BLOOD_SHIELD: ItemData(300 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 0, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SUPPLICANT), - item_names.SUPPLICANT_SOUL_AUGMENTATION: ItemData(301 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 1, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SUPPLICANT), - item_names.SUPPLICANT_SHIELD_REGENERATION: ItemData(302 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 2, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SUPPLICANT), - item_names.ADEPT_SHOCKWAVE: ItemData(303 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 3, SC2Race.PROTOSS, parent_item=item_names.ADEPT), - item_names.ADEPT_RESONATING_GLAIVES: ItemData(304 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 4, SC2Race.PROTOSS, parent_item=item_names.ADEPT), - item_names.ADEPT_PHASE_BULWARK: ItemData(305 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 5, SC2Race.PROTOSS, parent_item=item_names.ADEPT), - item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES: ItemData(306 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 6, SC2Race.PROTOSS, classification=ItemClassification.useful), - item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION: ItemData(307 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 7, SC2Race.PROTOSS, classification=ItemClassification.useful), - item_names.DRAGOON_HIGH_IMPACT_PHASE_DISRUPTORS: ItemData(308 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 8, SC2Race.PROTOSS, parent_item=item_names.DRAGOON), - item_names.DRAGOON_TRILLIC_COMPRESSION_SYSTEM: ItemData(309 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 9, SC2Race.PROTOSS, parent_item=item_names.DRAGOON), - item_names.DRAGOON_SINGULARITY_CHARGE: ItemData(310 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 10, SC2Race.PROTOSS, parent_item=item_names.DRAGOON), - item_names.DRAGOON_ENHANCED_STRIDER_SERVOS: ItemData(311 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 11, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.DRAGOON), - item_names.SCOUT_COMBAT_SENSOR_ARRAY: ItemData(312 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 12, SC2Race.PROTOSS, parent_item=item_names.SCOUT), - item_names.SCOUT_APIAL_SENSORS: ItemData(313 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 13, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SCOUT), - item_names.SCOUT_GRAVITIC_THRUSTERS: ItemData(314 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 14, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SCOUT), - item_names.SCOUT_ADVANCED_PHOTON_BLASTERS: ItemData(315 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 15, SC2Race.PROTOSS, parent_item=item_names.SCOUT), - item_names.TEMPEST_TECTONIC_DESTABILIZERS: ItemData(316 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 16, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.TEMPEST), - item_names.TEMPEST_QUANTIC_REACTOR: ItemData(317 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 17, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.TEMPEST), - item_names.TEMPEST_GRAVITY_SLING: ItemData(318 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 18, SC2Race.PROTOSS, parent_item=item_names.TEMPEST), - item_names.PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX: ItemData(319 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 19, SC2Race.PROTOSS), - item_names.PHOENIX_CLASS_ANION_PULSE_CRYSTALS: ItemData(320 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 20, SC2Race.PROTOSS), - item_names.CORSAIR_STEALTH_DRIVE: ItemData(321 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 21, SC2Race.PROTOSS, parent_item=item_names.CORSAIR), - item_names.CORSAIR_ARGUS_JEWEL: ItemData(322 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 22, SC2Race.PROTOSS, parent_item=item_names.CORSAIR), - item_names.CORSAIR_SUSTAINING_DISRUPTION: ItemData(323 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 23, SC2Race.PROTOSS, parent_item=item_names.CORSAIR), - item_names.CORSAIR_NEUTRON_SHIELDS: ItemData(324 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 24, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.CORSAIR), - item_names.ORACLE_STEALTH_DRIVE: ItemData(325 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 25, SC2Race.PROTOSS, parent_item=item_names.ORACLE), - item_names.ORACLE_STASIS_CALIBRATION: ItemData(326 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 26, SC2Race.PROTOSS, parent_item=item_names.ORACLE), - item_names.ORACLE_TEMPORAL_ACCELERATION_BEAM: ItemData(327 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 27, SC2Race.PROTOSS, parent_item=item_names.ORACLE), - item_names.ARBITER_CHRONOSTATIC_REINFORCEMENT: ItemData(328 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 28, SC2Race.PROTOSS, parent_item=item_names.ARBITER), - item_names.ARBITER_KHAYDARIN_CORE: ItemData(329 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 29, SC2Race.PROTOSS, parent_item=item_names.ARBITER), - item_names.ARBITER_SPACETIME_ANCHOR: ItemData(330 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 0, SC2Race.PROTOSS, parent_item=item_names.ARBITER), - item_names.ARBITER_RESOURCE_EFFICIENCY: ItemData(331 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 1, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.ARBITER), - item_names.ARBITER_ENHANCED_CLOAK_FIELD: ItemData(332 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 2, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.ARBITER), - item_names.CARRIER_TRIREME_GRAVITON_CATAPULT: - ItemData(333 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 3, SC2Race.PROTOSS), - item_names.CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES: - ItemData(334 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 4, SC2Race.PROTOSS), - item_names.VOID_RAY_DESTROYER_WARP_RAY_DAWNBRINGER_FLUX_VANES: - ItemData(335 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 5, SC2Race.PROTOSS, classification=ItemClassification.filler), - item_names.DESTROYER_RESOURCE_EFFICIENCY: ItemData(535 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 6, SC2Race.PROTOSS, parent_item=item_names.DESTROYER), - item_names.WARP_PRISM_GRAVITIC_DRIVE: - ItemData(337 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 7, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.WARP_PRISM), - item_names.WARP_PRISM_PHASE_BLASTER: - ItemData(338 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 8, SC2Race.PROTOSS, - classification=ItemClassification.progression, parent_item=item_names.WARP_PRISM), - item_names.WARP_PRISM_WAR_CONFIGURATION: ItemData(339 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 9, SC2Race.PROTOSS, parent_item=item_names.WARP_PRISM), - item_names.OBSERVER_GRAVITIC_BOOSTERS: ItemData(340 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 10, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.OBSERVER), - item_names.OBSERVER_SENSOR_ARRAY: ItemData(341 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 11, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.OBSERVER), - item_names.REAVER_SCARAB_DAMAGE: ItemData(342 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 12, SC2Race.PROTOSS, parent_item=item_names.REAVER), - item_names.REAVER_SOLARITE_PAYLOAD: ItemData(343 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 13, SC2Race.PROTOSS, parent_item=item_names.REAVER), - item_names.REAVER_REAVER_CAPACITY: ItemData(344 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 14, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.REAVER), - item_names.REAVER_RESOURCE_EFFICIENCY: ItemData(345 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 15, SC2Race.PROTOSS, parent_item=item_names.REAVER), - item_names.VANGUARD_AGONY_LAUNCHERS: ItemData(346 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 16, SC2Race.PROTOSS, parent_item=item_names.VANGUARD), - item_names.VANGUARD_MATTER_DISPERSION: ItemData(347 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 17, SC2Race.PROTOSS, parent_item=item_names.VANGUARD), - item_names.IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE: ItemData(348 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 18, SC2Race.PROTOSS), - item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS: ItemData(349 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 19, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.COLOSSUS_PACIFICATION_PROTOCOL: ItemData(350 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.COLOSSUS), - item_names.WRATHWALKER_RAPID_POWER_CYCLING: ItemData(351 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 21, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.WRATHWALKER), - item_names.WRATHWALKER_EYE_OF_WRATH: ItemData(352 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 22, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.WRATHWALKER), - item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN: ItemData(353 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 23, SC2Race.PROTOSS), - item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING: ItemData(354 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 24, SC2Race.PROTOSS), - item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK: ItemData(355 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 25, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY: ItemData(356 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 26, SC2Race.PROTOSS), - item_names.DARK_TEMPLAR_DARK_ARCHON_MELD: ItemData(357 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 27, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.DARK_TEMPLAR), - item_names.HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM: ItemData(358 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 28, SC2Race.PROTOSS), - item_names.HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION: ItemData(359 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 29, SC2Race.PROTOSS, classification=ItemClassification.filler), - item_names.HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET: ItemData(360 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 0, SC2Race.PROTOSS), - item_names.ARCHON_HIGH_ARCHON: ItemData(361 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.DARK_ARCHON_FEEDBACK: ItemData(362 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 2, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.DARK_ARCHON_MAELSTROM: ItemData(363 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 3, SC2Race.PROTOSS), - item_names.DARK_ARCHON_ARGUS_TALISMAN: ItemData(364 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 4, SC2Race.PROTOSS), - item_names.ASCENDANT_POWER_OVERWHELMING: ItemData(365 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 5, SC2Race.PROTOSS, parent_item=item_names.ASCENDANT), - item_names.ASCENDANT_CHAOTIC_ATTUNEMENT: ItemData(366 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 6, SC2Race.PROTOSS, parent_item=item_names.ASCENDANT), - item_names.ASCENDANT_BLOOD_AMULET: ItemData(367 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 7, SC2Race.PROTOSS, parent_item=item_names.ASCENDANT), - item_names.SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE: ItemData(368 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 8, SC2Race.PROTOSS), - item_names.SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING: ItemData(369 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 9, SC2Race.PROTOSS), - item_names.SENTRY_FORCE_FIELD: ItemData(370 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 10, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SENTRY), - item_names.SENTRY_HALLUCINATION: ItemData(371 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 11, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.SENTRY), - item_names.ENERGIZER_RECLAMATION: ItemData(372 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 12, SC2Race.PROTOSS, parent_item=item_names.ENERGIZER), - item_names.ENERGIZER_FORGED_CHASSIS: ItemData(373 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 13, SC2Race.PROTOSS, parent_item=item_names.ENERGIZER), - item_names.HAVOC_DETECT_WEAKNESS: ItemData(374 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 14, SC2Race.PROTOSS, parent_item=item_names.HAVOC), - item_names.HAVOC_BLOODSHARD_RESONANCE: ItemData(375 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 15, SC2Race.PROTOSS, parent_item=item_names.HAVOC), - item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: ItemData(376 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 16, SC2Race.PROTOSS), - item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: ItemData(377 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 17, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.ORACLE_BOSONIC_CORE: ItemData(378 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 18, SC2Race.PROTOSS, parent_item=item_names.ORACLE), - item_names.SCOUT_RESOURCE_EFFICIENCY: ItemData(379 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 19, SC2Race.PROTOSS, parent_item=item_names.SCOUT), - item_names.IMMORTAL_ANNIHILATOR_DISRUPTOR_DISPERSION: ItemData(380 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 20, SC2Race.PROTOSS), - item_names.DISRUPTOR_CLOAKING_MODULE: ItemData(381 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 21, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.DISRUPTOR), - item_names.DISRUPTOR_PERFECTED_POWER: ItemData(382 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 22, SC2Race.PROTOSS, parent_item=item_names.DISRUPTOR, classification=ItemClassification.progression), - item_names.DISRUPTOR_RESTRAINED_DESTRUCTION: ItemData(383 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 23, SC2Race.PROTOSS, classification=ItemClassification.filler, parent_item=item_names.DISRUPTOR), - item_names.TEMPEST_INTERPLANETARY_RANGE: ItemData(384 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 24, SC2Race.PROTOSS, parent_item=item_names.TEMPEST), - item_names.DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES: ItemData(385 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 25, SC2Race.PROTOSS, parent_item=item_names.DAWNBRINGER), - item_names.DAWNBRINGER_ENHANCED_SHIELD_GENERATOR: ItemData(386 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 26, SC2Race.PROTOSS, parent_item=item_names.DAWNBRINGER), - item_names.STALWART_HIGH_VOLTAGE_CAPACITORS: ItemData(387 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 27, SC2Race.PROTOSS, parent_item=item_names.STALWART), - item_names.STALWART_STRUT_ENHANCEMENTS: ItemData(388 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 28, SC2Race.PROTOSS, parent_item=item_names.STALWART), - item_names.STALWART_STABILIZED_ELECTRODES: ItemData(389 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 29, SC2Race.PROTOSS, parent_item=item_names.STALWART), - item_names.STALWART_LATTICED_SHIELDING: ItemData(390 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 0, SC2Race.PROTOSS, parent_item=item_names.STALWART), - - # War Council - item_names.ZEALOT_WHIRLWIND: ItemData(500 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 0, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.ZEALOT), - item_names.CENTURION_RESOURCE_EFFICIENCY: ItemData(501 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 1, SC2Race.PROTOSS, parent_item=item_names.CENTURION), - item_names.SENTINEL_RESOURCE_EFFICIENCY: ItemData(502 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 2, SC2Race.PROTOSS, parent_item=item_names.SENTINEL), - item_names.STALKER_PHASE_REACTOR: ItemData(503 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 3, SC2Race.PROTOSS, parent_item=item_names.STALKER), - item_names.DRAGOON_PHALANX_SUIT: ItemData(504 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 4, SC2Race.PROTOSS, parent_item=item_names.DRAGOON), - item_names.INSTIGATOR_RESOURCE_EFFICIENCY: ItemData(505 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 5, SC2Race.PROTOSS, parent_item=item_names.INSTIGATOR), - item_names.ADEPT_DISRUPTIVE_TRANSFER: ItemData(506 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 6, SC2Race.PROTOSS, parent_item=item_names.ADEPT), - item_names.SLAYER_PHASE_BLINK: ItemData(507 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 7, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.SLAYER), - item_names.AVENGER_KRYHAS_CLOAK: ItemData(508 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 8, SC2Race.PROTOSS, parent_item=item_names.AVENGER), - item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY: ItemData(509 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 9, SC2Race.PROTOSS, parent_item=item_names.DARK_TEMPLAR), - item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY: ItemData(510 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 10, SC2Race.PROTOSS, parent_item=item_names.DARK_TEMPLAR), - item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY: ItemData(511 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 11, SC2Race.PROTOSS, parent_item=item_names.BLOOD_HUNTER), - item_names.SENTRY_DOUBLE_SHIELD_RECHARGE: ItemData(512 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 12, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.SENTRY), - item_names.ENERGIZER_MOBILE_CHRONO_BEAM: ItemData(513 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 13, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.ENERGIZER), - item_names.HAVOC_ENDURING_SIGHT: ItemData(514 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 14, SC2Race.PROTOSS, parent_item=item_names.HAVOC), - item_names.HIGH_TEMPLAR_PLASMA_SURGE: ItemData(515 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 15, SC2Race.PROTOSS, parent_item=item_names.HIGH_TEMPLAR), - item_names.SIGNIFIER_FEEDBACK: ItemData(516 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 16, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.SIGNIFIER), - item_names.ASCENDANT_ABILITY_EFFICIENCY: ItemData(517 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 17, SC2Race.PROTOSS, parent_item=item_names.ASCENDANT), - item_names.DARK_ARCHON_INDOMITABLE_WILL: ItemData(518 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 18, SC2Race.PROTOSS), - item_names.IMMORTAL_IMPROVED_BARRIER: ItemData(519 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 19, SC2Race.PROTOSS, parent_item=item_names.IMMORTAL), - item_names.VANGUARD_RAPIDFIRE_CANNON: ItemData(520 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.VANGUARD), - item_names.VANGUARD_FUSION_MORTARS: ItemData(521 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 21, SC2Race.PROTOSS, parent_item=item_names.VANGUARD), - item_names.ANNIHILATOR_AERIAL_TRACKING: ItemData(522 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 22, SC2Race.PROTOSS, parent_item=item_names.ANNIHILATOR), - item_names.STALWART_ARC_INDUCERS: ItemData(523 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 23, SC2Race.PROTOSS, parent_item=item_names.STALWART), - item_names.COLOSSUS_FIRE_LANCE: ItemData(524 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 24, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.COLOSSUS), - item_names.WRATHWALKER_AERIAL_TRACKING: ItemData(525 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 25, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.WRATHWALKER), - item_names.REAVER_KHALAI_REPLICATORS: ItemData(526 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 26, SC2Race.PROTOSS, parent_item=item_names.REAVER), - item_names.DISRUPTOR_RESTRUCTURED_THRUSTERS: ItemData(527 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 27, SC2Race.PROTOSS, parent_item=item_names.DISRUPTOR), - item_names.WARP_PRISM_WARP_REFRACTION: ItemData(528 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 28, SC2Race.PROTOSS, parent_item=item_names.WARP_PRISM), - item_names.OBSERVER_INDUCE_SCOPOPHOBIA: ItemData(529 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 29, SC2Race.PROTOSS, parent_item=item_names.OBSERVER), - item_names.PHOENIX_DOUBLE_GRAVITON_BEAM: ItemData(530 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 0, SC2Race.PROTOSS, parent_item=item_names.PHOENIX), - item_names.CORSAIR_NETWORK_DISRUPTION: ItemData(531 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 1, SC2Race.PROTOSS, parent_item=item_names.CORSAIR), - item_names.MIRAGE_GRAVITON_BEAM: ItemData(532 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 2, SC2Race.PROTOSS, parent_item=item_names.MIRAGE), - item_names.SKIRMISHER_PEER_CONTEMPT: ItemData(533 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 3, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.SKIRMISHER), - item_names.VOID_RAY_PRISMATIC_RANGE: ItemData(534 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 4, SC2Race.PROTOSS, parent_item=item_names.VOID_RAY), - item_names.DESTROYER_REFORGED_BLOODSHARD_CORE: ItemData(336 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 5, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.DESTROYER), - # 536 reserved for Warp Ray - item_names.DAWNBRINGER_SOLARITE_LENS: ItemData(537 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 7, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.DAWNBRINGER), - item_names.CARRIER_REPAIR_DRONES: ItemData(538 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 8, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.CARRIER), - item_names.SKYLORD_HYPERJUMP: ItemData(539 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 9, SC2Race.PROTOSS, parent_item=item_names.SKYLORD), - item_names.TRIREME_SOLAR_BEAM: ItemData(540 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 10, SC2Race.PROTOSS, classification=ItemClassification.progression, parent_item=item_names.TRIREME), - item_names.TEMPEST_DISINTEGRATION: ItemData(541 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 11, SC2Race.PROTOSS, parent_item=item_names.TEMPEST), - # 542 reserved for Scout - item_names.ARBITER_ABILITY_EFFICIENCY: ItemData(543 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 13, SC2Race.PROTOSS, parent_item=item_names.ARBITER), - # 544 reserved for Oracle - # 545 reserved for Mothership - - # SoA Calldown powers - item_names.SOA_CHRONO_SURGE: ItemData(700 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 0, SC2Race.PROTOSS), - item_names.SOA_PROGRESSIVE_PROXY_PYLON: ItemData(701 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Progressive, 0, SC2Race.PROTOSS, quantity=2), - item_names.SOA_PYLON_OVERCHARGE: ItemData(702 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 1, SC2Race.PROTOSS), - item_names.SOA_ORBITAL_STRIKE: ItemData(703 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 2, SC2Race.PROTOSS), - item_names.SOA_TEMPORAL_FIELD: ItemData(704 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 3, SC2Race.PROTOSS), - item_names.SOA_SOLAR_LANCE: ItemData(705 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 4, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.SOA_MASS_RECALL: ItemData(706 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 5, SC2Race.PROTOSS), - item_names.SOA_SHIELD_OVERCHARGE: ItemData(707 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 6, SC2Race.PROTOSS), - item_names.SOA_DEPLOY_FENIX: ItemData(708 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 7, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.SOA_PURIFIER_BEAM: ItemData(709 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 8, SC2Race.PROTOSS), - item_names.SOA_TIME_STOP: ItemData(710 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 9, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.SOA_SOLAR_BOMBARDMENT: ItemData(711 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 10, SC2Race.PROTOSS), - - # Generic Protoss Upgrades - item_names.MATRIX_OVERLOAD: - ItemData(800 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 0, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.QUATRO: - ItemData(801 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), - item_names.NEXUS_OVERCHARGE: - ItemData(802 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 2, SC2Race.PROTOSS, - classification=ItemClassification.progression, important_for_filtering=True), - item_names.ORBITAL_ASSIMILATORS: - ItemData(803 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 3, SC2Race.PROTOSS), - item_names.WARP_HARMONIZATION: - ItemData(804 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 4, SC2Race.PROTOSS), - item_names.GUARDIAN_SHELL: - ItemData(805 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 5, SC2Race.PROTOSS), - item_names.RECONSTRUCTION_BEAM: - ItemData(806 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 6, SC2Race.PROTOSS, - classification=ItemClassification.progression), - item_names.OVERWATCH: - ItemData(807 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 7, SC2Race.PROTOSS), - item_names.SUPERIOR_WARP_GATES: - ItemData(808 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 8, SC2Race.PROTOSS), - item_names.ENHANCED_TARGETING: - ItemData(809 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 9, SC2Race.PROTOSS), - item_names.OPTIMIZED_ORDNANCE: - ItemData(810 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 10, SC2Race.PROTOSS), - item_names.KHALAI_INGENUITY: - ItemData(811 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 11, SC2Race.PROTOSS), - item_names.AMPLIFIED_ASSIMILATORS: - ItemData(812 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 12, SC2Race.PROTOSS), - item_names.PROGRESSIVE_WARP_RELOCATE: - ItemData(813 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Progressive, 2, SC2Race.PROTOSS, quantity=2, - classification=ItemClassification.progression), -} - -# Add keys to item table -# Mission keys (key offset + 0-999) -# Mission IDs start at 1 so the item IDs are moved down a space -mission_key_item_table = { - item_names._TEMPLATE_MISSION_KEY.format(mission.mission_name): - ItemData(mission.id - 1 + SC2_KEY_ITEM_ID_OFFSET, FactionlessItemType.Keys, 0, SC2Race.ANY, - classification=ItemClassification.progression, quantity=0) - for mission in SC2Mission -} -# Numbered layout keys (key offset + 1000 - 1999) -numbered_layout_key_item_table = { - item_names._TEMPLATE_NUMBERED_LAYOUT_KEY.format(number + 1): - ItemData(number + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE, FactionlessItemType.Keys, 0, SC2Race.ANY, - classification=ItemClassification.progression, quantity=0) - for number in range(len(SC2Mission)) -} -# Numbered campaign keys (key offset + 2000 - 2999) -numbered_campaign_key_item_table = { - item_names._TEMPLATE_NUMBERED_CAMPAIGN_KEY.format(number + 1): - ItemData(number + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 2, FactionlessItemType.Keys, 0, SC2Race.ANY, - classification=ItemClassification.progression, quantity=0) - for number in range(len(SC2Mission)) -} -# Flavor keys (key offset + 3000 - 3999) -flavor_key_item_table = { - item_names._TEMPLATE_FLAVOR_KEY.format(name): - ItemData(i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 3, FactionlessItemType.Keys, 0, SC2Race.ANY, - classification=ItemClassification.progression, quantity=0) - for (i, name) in enumerate(item_names._flavor_key_names) -} -# Named layout keys (key offset + 4000 - 4999) -campaign_to_layout_names = get_used_layout_names() -named_layout_key_item_table = { - item_names._TEMPLATE_NAMED_LAYOUT_KEY.format(layout_name, campaign.campaign_name): - ItemData(layout_start + i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 4, FactionlessItemType.Keys, 0, SC2Race.ANY, - classification=ItemClassification.progression, quantity=0) - for (campaign, (layout_start, layout_names)) in campaign_to_layout_names.items() for (i, layout_name) in enumerate(layout_names) -} -# Named campaign keys (key offset + 5000 - 5999) -campaign_names = [campaign.campaign_name for campaign in SC2Campaign if campaign != SC2Campaign.GLOBAL] -named_campaign_key_item_table = { - item_names._TEMPLATE_NAMED_CAMPAIGN_KEY.format(campaign_name): - ItemData(i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 5, FactionlessItemType.Keys, 0, SC2Race.ANY, - classification=ItemClassification.progression, quantity=0) - for (i, campaign_name) in enumerate(campaign_names) -} -key_item_table = {} -key_item_table.update(mission_key_item_table) -key_item_table.update(numbered_layout_key_item_table) -key_item_table.update(numbered_campaign_key_item_table) -key_item_table.update(flavor_key_item_table) -key_item_table.update(named_layout_key_item_table) -key_item_table.update(named_campaign_key_item_table) -item_table.update(key_item_table) - -def get_item_table(): - return item_table - - -basic_units = { - SC2Race.TERRAN: { - item_names.MARINE, - item_names.MARAUDER, - item_names.GOLIATH, - item_names.HELLION, - item_names.VULTURE, - item_names.WARHOUND, - }, - SC2Race.ZERG: { - item_names.ZERGLING, - item_names.SWARM_QUEEN, - item_names.ROACH, - item_names.HYDRALISK, - }, - SC2Race.PROTOSS: { - item_names.ZEALOT, - item_names.CENTURION, - item_names.SENTINEL, - item_names.STALKER, - item_names.INSTIGATOR, - item_names.SLAYER, - item_names.DRAGOON, - item_names.ADEPT, - } -} - -advanced_basic_units = { - SC2Race.TERRAN: basic_units[SC2Race.TERRAN].union({ - item_names.REAPER, - item_names.DIAMONDBACK, - item_names.VIKING, - item_names.SIEGE_TANK, - item_names.BANSHEE, - item_names.THOR, - item_names.BATTLECRUISER, - item_names.CYCLONE - }), - SC2Race.ZERG: basic_units[SC2Race.ZERG].union({ - item_names.INFESTOR, - item_names.ABERRATION, - }), - SC2Race.PROTOSS: basic_units[SC2Race.PROTOSS].union({ - item_names.DARK_TEMPLAR, - item_names.BLOOD_HUNTER, - item_names.AVENGER, - item_names.IMMORTAL, - item_names.ANNIHILATOR, - item_names.VANGUARD, - item_names.STALWART, - }) -} - -no_logic_basic_units = { - SC2Race.TERRAN: advanced_basic_units[SC2Race.TERRAN].union({ - item_names.FIREBAT, - item_names.GHOST, - item_names.SPECTRE, - item_names.WRAITH, - item_names.RAVEN, - item_names.PREDATOR, - item_names.LIBERATOR, - item_names.HERC, - }), - SC2Race.ZERG: advanced_basic_units[SC2Race.ZERG].union({ - item_names.ULTRALISK, - item_names.SWARM_HOST - }), - SC2Race.PROTOSS: advanced_basic_units[SC2Race.PROTOSS].union({ - item_names.CARRIER, - item_names.TEMPEST, - item_names.VOID_RAY, - item_names.DESTROYER, - item_names.COLOSSUS, - item_names.WRATHWALKER, - item_names.SCOUT, - item_names.HIGH_TEMPLAR, - item_names.SIGNIFIER, - item_names.ASCENDANT, - item_names.DARK_ARCHON, - item_names.SUPPLICANT, - }) -} - -not_balanced_starting_units = { - item_names.SIEGE_TANK, - item_names.THOR, - item_names.BANSHEE, - item_names.BATTLECRUISER, - item_names.ULTRALISK, - item_names.CARRIER, - item_names.TEMPEST, -} - - -# Items that can be placed before resources if not already in -# General upgrades and Mercs -second_pass_placeable_items: typing.Tuple[str, ...] = ( - # Global weapon/armor upgrades - item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, - item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, - item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, - item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE, - item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE, - item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, - item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE, - item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE, - item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, - item_names.PROGRESSIVE_PROTOSS_SHIELDS, - # Terran Buildings without upgrades - item_names.SENSOR_TOWER, - item_names.HIVE_MIND_EMULATOR, - item_names.PSI_DISRUPTER, - item_names.PERDITION_TURRET, - # General Terran upgrades without any dependencies - item_names.SCV_ADVANCED_CONSTRUCTION, - item_names.SCV_DUAL_FUSION_WELDERS, - item_names.SCV_CONSTRUCTION_JUMP_JETS, - item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, - item_names.PROGRESSIVE_ORBITAL_COMMAND, - item_names.ULTRA_CAPACITORS, - item_names.VANADIUM_PLATING, - item_names.ORBITAL_DEPOTS, - item_names.MICRO_FILTERING, - item_names.AUTOMATED_REFINERY, - item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR, - item_names.COMMAND_CENTER_SCANNER_SWEEP, - item_names.COMMAND_CENTER_MULE, - item_names.COMMAND_CENTER_EXTRA_SUPPLIES, - item_names.TECH_REACTOR, - item_names.CELLULAR_REACTOR, - item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, # Place only L1 - item_names.STRUCTURE_ARMOR, - item_names.HI_SEC_AUTO_TRACKING, - item_names.ADVANCED_OPTICS, - item_names.ROGUE_FORCES, - # Mercenaries (All races) - *[item_name for item_name, item_data in item_table.items() - if item_data.type in (TerranItemType.Mercenary, ZergItemType.Mercenary)], - # Kerrigan and Nova levels, abilities and generally useful stuff - *[item_name for item_name, item_data in get_full_item_list().items() - if item_data.type in (ZergItemType.Level, ZergItemType.Ability, ZergItemType.Evolution_Pit, TerranItemType.Nova_Gear)], - item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, - # Zerg static defenses - item_names.SPORE_CRAWLER, - item_names.SPINE_CRAWLER, - # Overseer - item_names.OVERLORD_OVERSEER_ASPECT, - # Spear of Adun Abilities - item_names.SOA_CHRONO_SURGE, - item_names.SOA_PROGRESSIVE_PROXY_PYLON, - item_names.SOA_PYLON_OVERCHARGE, - item_names.SOA_ORBITAL_STRIKE, - item_names.SOA_TEMPORAL_FIELD, - item_names.SOA_SOLAR_LANCE, - item_names.SOA_MASS_RECALL, - item_names.SOA_SHIELD_OVERCHARGE, - item_names.SOA_DEPLOY_FENIX, - item_names.SOA_PURIFIER_BEAM, - item_names.SOA_TIME_STOP, - item_names.SOA_SOLAR_BOMBARDMENT, - # Protoss generic upgrades - item_names.MATRIX_OVERLOAD, - item_names.QUATRO, - item_names.NEXUS_OVERCHARGE, - item_names.ORBITAL_ASSIMILATORS, - item_names.WARP_HARMONIZATION, - item_names.GUARDIAN_SHELL, - item_names.RECONSTRUCTION_BEAM, - item_names.OVERWATCH, - item_names.SUPERIOR_WARP_GATES, - item_names.KHALAI_INGENUITY, - item_names.AMPLIFIED_ASSIMILATORS, - # Protoss static defenses - item_names.PHOTON_CANNON, - item_names.KHAYDARIN_MONOLITH, - item_names.SHIELD_BATTERY -) - - -filler_items: typing.Tuple[str, ...] = ( - item_names.STARTING_MINERALS, - item_names.STARTING_VESPENE, - item_names.STARTING_SUPPLY, -) - -# Defense rating table -# Commented defense ratings are handled in LogicMixin -tvx_defense_ratings = { - item_names.SIEGE_TANK: 5, - # "Graduating Range": 1, - item_names.PLANETARY_FORTRESS: 3, - # Bunker w/ Marine/Marauder: 3, - item_names.PERDITION_TURRET: 2, - item_names.DEVASTATOR_TURRET: 2, - item_names.VULTURE: 1, - item_names.BANSHEE: 1, - item_names.BATTLECRUISER: 1, - item_names.LIBERATOR: 4, - item_names.WIDOW_MINE: 1, - # "Concealment (Widow Mine)": 1 -} -tvz_defense_ratings = { - item_names.PERDITION_TURRET: 2, - # Bunker w/ Firebat: 2, - item_names.LIBERATOR: -2, - item_names.HIVE_MIND_EMULATOR: 3, - item_names.PSI_DISRUPTER: 3, -} -tvx_air_defense_ratings = { - item_names.MISSILE_TURRET: 2, -} -zvx_defense_ratings = { - # Note that this doesn't include Kerrigan because this is just for race swaps, which doesn't involve her (for now) - item_names.SPINE_CRAWLER: 2, - # w/ Twin Drones: 1 - item_names.SWARM_QUEEN: 1, - item_names.SWARM_HOST: 1, - # impaler: 3 - # "Hardened Tentacle Spines (Impaler)": 2 - # lurker: 1 - # "Seismic Spines (Lurker)": 2 - # "Adapted Spines (Lurker)": 1 - # brood lord : 2 - # corpser roach: 1 - # creep tumors (swarm queen or overseer): 1 - # w/ malignant creep: 1 - item_names.INFESTED_SIEGE_BREAKERS: 5, - # "Graduating Range": 1, - item_names.INFESTED_BUNKER: 3, -} -# zvz_defense_ratings = { - # corpser roach: 1 - # primal igniter: 2 - # lurker: 1 - # w/ adapted spines: -1 - # impaler: -1 -# } -zvx_air_defense_ratings = { - item_names.SPORE_CRAWLER: 2, - # w/ Twin Drones: 1 - item_names.INFESTED_MISSILE_TURRET: 2, -} -pvx_defense_ratings = { - item_names.PHOTON_CANNON: 2, - item_names.KHAYDARIN_MONOLITH: 3, - item_names.SHIELD_BATTERY: 1, - item_names.NEXUS_OVERCHARGE: 2, - item_names.CORSAIR: 1, - item_names.MATRIX_OVERLOAD: 1, - item_names.COLOSSUS: 1, -} -pvz_defense_ratings = { - item_names.KHAYDARIN_MONOLITH: -2, - item_names.COLOSSUS: 2, - item_names.VANGUARD: 1, - item_names.REAVER: 1, - item_names.STALWART: 1, -} - -kerrigan_levels = [ - item_name for item_name, item_data in item_table.items() - if item_data.type == ZergItemType.Level and item_data.race == SC2Race.ZERG -] - -spider_mine_sources = { - item_names.VULTURE, - item_names.REAPER_SPIDER_MINES, - item_names.SIEGE_TANK_SPIDER_MINES, - item_names.RAVEN_SPIDER_MINES, -} - -kerrigan_actives: typing.List[typing.Set[str]] = [ - {item_names.KERRIGAN_KINETIC_BLAST, item_names.KERRIGAN_LEAPING_STRIKE}, - {item_names.KERRIGAN_CRUSHING_GRIP, item_names.KERRIGAN_PSIONIC_SHIFT}, - set(), - {item_names.KERRIGAN_WILD_MUTATION, item_names.KERRIGAN_SPAWN_BANELINGS, item_names.KERRIGAN_MEND}, - set(), - set(), - {item_names.KERRIGAN_APOCALYPSE, item_names.KERRIGAN_SPAWN_LEVIATHAN, item_names.KERRIGAN_DROP_PODS}, -] - -kerrigan_passives: typing.List[typing.Set[str]] = [ - {item_names.KERRIGAN_HEROIC_FORTITUDE}, - {item_names.KERRIGAN_CHAIN_REACTION}, - {item_names.ZERGLING_RECONSTITUTION, item_names.OVERLORD_IMPROVED_OVERLORDS, item_names.AUTOMATED_EXTRACTORS}, - set(), - {item_names.TWIN_DRONES, item_names.MALIGNANT_CREEP, item_names.VESPENE_EFFICIENCY}, - {item_names.KERRIGAN_INFEST_BROODLINGS, item_names.KERRIGAN_FURY, item_names.KERRIGAN_ABILITY_EFFICIENCY}, - set(), -] - -kerrigan_only_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, -} - -spear_of_adun_calldowns = { - item_names.SOA_CHRONO_SURGE, - item_names.SOA_PROGRESSIVE_PROXY_PYLON, - item_names.SOA_PYLON_OVERCHARGE, - item_names.SOA_ORBITAL_STRIKE, - item_names.SOA_TEMPORAL_FIELD, - item_names.SOA_SOLAR_LANCE, - item_names.SOA_MASS_RECALL, - item_names.SOA_SHIELD_OVERCHARGE, - item_names.SOA_DEPLOY_FENIX, - item_names.SOA_PURIFIER_BEAM, - item_names.SOA_TIME_STOP, - item_names.SOA_SOLAR_BOMBARDMENT -} - -spear_of_adun_castable_passives = { - item_names.RECONSTRUCTION_BEAM, - item_names.OVERWATCH, - item_names.GUARDIAN_SHELL, -} - -nova_equipment = { - *[item_name for item_name, item_data in get_full_item_list().items() - if item_data.type == TerranItemType.Nova_Gear], - item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE -} - -upgrade_bundles: Dict[str, List[str]] = { - # Terran - item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: - [ - item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, - item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, - item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON - ], - item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: - [ - item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, - item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, - item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR - ], - item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: - [ - item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR - ], - item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: - [ - item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR - ], - item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: - [ - item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR - ], - item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: - [ - item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, - item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, - item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR - ], - # Zerg - item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: - [ - item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, - item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, - item_names.PROGRESSIVE_ZERG_FLYER_ATTACK - ], - item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: - [ - item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE - ], - item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: - [ - item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, - item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, - item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE - ], - item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: - [ - item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE - ], - item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: - [ - item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, - item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, - item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, - item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, - item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE - ], - # Protoss - item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: - [ - item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON - ], - item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: - [ - item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, - item_names.PROGRESSIVE_PROTOSS_SHIELDS - ], - item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: - [ - item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, - item_names.PROGRESSIVE_PROTOSS_SHIELDS - ], - item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: - [ - item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, - item_names.PROGRESSIVE_PROTOSS_SHIELDS - ], - item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: - [ - item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, - item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, - item_names.PROGRESSIVE_PROTOSS_SHIELDS - ], -} - -# Used for logic -upgrade_bundle_inverted_lookup: Dict[str, List[str]] = dict() -for key, values in upgrade_bundles.items(): - for value in values: - if upgrade_bundle_inverted_lookup.get(value) is None: - upgrade_bundle_inverted_lookup[value] = list() - if (value != item_names.PROGRESSIVE_PROTOSS_SHIELDS - or key not in [ - item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, - item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE - ] - ): - # Shield handling is trickier as it's max of Ground/Air group, not their sum - upgrade_bundle_inverted_lookup[value].append(key) - -lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in get_full_item_list().items() if - data.code} - -upgrade_item_types = (TerranItemType.Upgrade, ZergItemType.Upgrade, ProtossItemType.Upgrade) + def __init__(self, name: str, classification: ItemClassification, code: Optional[int], player: int, filter_flags: ItemFilterFlags = ItemFilterFlags.Available): + Item.__init__(self, name, classification, code, player) + self.filter_flags = filter_flags \ No newline at end of file diff --git a/worlds/sc2/mission_order/entry_rules.py b/worlds/sc2/mission_order/entry_rules.py index 25c3f631f185..d4690d7a6c7c 100644 --- a/worlds/sc2/mission_order/entry_rules.py +++ b/worlds/sc2/mission_order/entry_rules.py @@ -4,7 +4,7 @@ from dataclasses import dataclass from ..mission_tables import SC2Mission -from ..items import item_table +from ..item_tables import item_table from BaseClasses import CollectionState if TYPE_CHECKING: diff --git a/worlds/sc2/mission_order/options.py b/worlds/sc2/mission_order/options.py index a2c136911ccb..834b1065465e 100644 --- a/worlds/sc2/mission_order/options.py +++ b/worlds/sc2/mission_order/options.py @@ -9,7 +9,7 @@ from ..mission_tables import lookup_name_to_mission from ..mission_groups import mission_groups -from ..items import item_table +from ..item_tables import item_table from ..item_groups import item_name_groups from .structs import Difficulty, LayoutType, GENERIC_KEY_NAME from .layout_types import Column, Grid, Hopscotch, Gauntlet, Blitz diff --git a/worlds/sc2/mission_order/structs.py b/worlds/sc2/mission_order/structs.py index cad8f7b58fb2..0859febee2e3 100644 --- a/worlds/sc2/mission_order/structs.py +++ b/worlds/sc2/mission_order/structs.py @@ -7,7 +7,7 @@ from BaseClasses import Region, Location, CollectionState, Entrance from ..mission_tables import SC2Mission, lookup_name_to_mission, MissionFlag, lookup_id_to_mission, get_goal_location -from ..items import named_layout_key_item_table, named_campaign_key_item_table +from ..item_tables import named_layout_key_item_table, named_campaign_key_item_table from .. import item_names from .layout_types import LayoutType from .entry_rules import EntryRule, SubRuleEntryRule, CountMissionsEntryRule, BeatMissionsEntryRule, SubRuleRuleData, ItemEntryRule diff --git a/worlds/sc2/pool_filter.py b/worlds/sc2/pool_filter.py index 2ee42ab23026..c54630062689 100644 --- a/worlds/sc2/pool_filter.py +++ b/worlds/sc2/pool_filter.py @@ -1,10 +1,13 @@ -from typing import Callable, Dict, List, Set, Union, Tuple, Optional, TYPE_CHECKING, Iterable -from BaseClasses import Item, Location -from .items import (get_full_item_list, spider_mine_sources, second_pass_placeable_items, - upgrade_item_types, +import copy +from typing import Callable, Dict, List, Set, Union, Tuple, TYPE_CHECKING, Iterable + +from BaseClasses import Item, Location +from . import item_groups, item_names +from .item_tables import ( + get_full_item_list, spider_mine_sources, second_pass_placeable_items, ) +from .items import StarcraftItem, ItemFilterFlags from .options import get_option_value, EnableMorphling, RequiredTactics -from . import item_groups, item_names if TYPE_CHECKING: from . import SC2World @@ -18,16 +21,16 @@ INF_TERRAN_UNITS = set(item_groups.infterr_units) -def get_item_upgrades(inventory: List[Item], parent_item: Union[Item, str]) -> List[Item]: - item_name = parent_item.name if isinstance(parent_item, Item) else parent_item +def get_item_upgrades(inventory: List[StarcraftItem], parent_item: Union[Item, str]) -> List[StarcraftItem]: + item_name = parent_item.name if isinstance(parent_item, StarcraftItem) else parent_item return [ inv_item for inv_item in inventory if get_full_item_list()[inv_item.name].parent_item == item_name ] -def copy_item(item: Item): - return Item(item.name, item.classification, item.code, item.player) +def copy_item(item: StarcraftItem) -> StarcraftItem: + return StarcraftItem(item.name, item.classification, item.code, item.player, item.filter_flags) class ValidInventory: @@ -60,9 +63,9 @@ def has_units_per_structure(self) -> bool: def generate_reduced_inventory(self, inventory_size: int, mission_requirements: List[Tuple[str, Callable]]) -> List[Item]: """Attempts to generate a reduced inventory that can fulfill the mission requirements.""" - inventory: List[Item] = list(self.item_pool) - locked_items: List[Item] = list(self.locked_items) - necessary_items: List[Item] = list(self.necessary_items) + inventory: List[StarcraftItem] = list(self.item_pool) + locked_items: List[StarcraftItem] = list(self.locked_items) + necessary_items: List[StarcraftItem] = list(self.necessary_items) enable_morphling = self.world.options.enable_morphling == EnableMorphling.option_true item_list = get_full_item_list() self.logical_inventory = [ @@ -71,10 +74,10 @@ def generate_reduced_inventory(self, inventory_size: int, mission_requirements: ] requirements = mission_requirements parent_items = self.item_children.keys() - parent_lookup = {child: parent for parent, children in self.item_children.items() for child in children} + parent_lookup: Dict[StarcraftItem, StarcraftItem] = {child: parent for parent, children in self.item_children.items() for child in children} minimum_upgrades = get_option_value(self.world, "min_number_of_upgrades") - def attempt_removal(item: Item) -> bool: + def attempt_removal(item: StarcraftItem) -> bool: removed_item = inventory.pop(inventory.index(item)) # Only run logic checks when removing logic items if item.name in self.logical_inventory: @@ -90,6 +93,29 @@ def attempt_removal(item: Item) -> bool: return False return True + # Process Excluded items, validate if the item can get actually excluded + excluded_items: List[StarcraftItem] = [stacrcraft_item for stacrcraft_item in inventory if ItemFilterFlags.Excluded in stacrcraft_item.filter_flags] + self.world.random.shuffle(excluded_items) + for excluded_item in excluded_items: + logical_inventory_copy = copy.copy(self.logical_inventory) + if ( + excluded_item in inventory + and attempt_removal(excluded_item) + and excluded_item in parent_items + ): + for child in self.item_children[excluded_item]: + if ( + child in inventory + and not attempt_removal(child) + and ItemFilterFlags.AllowedOrphan not in child.filter_flags + ): + if excluded_item.name in logical_inventory_copy: + self.logical_inventory.append(excluded_item.name) + if excluded_item not in self.logical_inventory: + self.logical_inventory.append(excluded_item.name) + if not excluded_item in locked_items: + self.locked_items.append(excluded_item) + # Limit the maximum number of upgrades maxNbUpgrade = get_option_value(self.world, "max_number_of_upgrades") if maxNbUpgrade != -1: @@ -139,7 +165,7 @@ def attempt_removal(item: Item) -> bool: known_parents = [item for item in known_items if item in parent_items] for parent in known_parents: child_items = self.item_children[parent] - removable_upgrades = [item for item in inventory if item in child_items] + removable_upgrades = [stacrcraft_item for stacrcraft_item in inventory if stacrcraft_item in child_items] locked_upgrade_count = sum(1 if item in child_items else 0 for item in known_items) self.world.random.shuffle(removable_upgrades) while len(removable_upgrades) > 0 and locked_upgrade_count < minimum_upgrades: @@ -157,16 +183,16 @@ def attempt_removal(item: Item) -> bool: raise Exception(f"Too many items excluded - couldn't satisfy access rules for the following locations:\n{failed_locations}") # Optionally locking generic items - generic_items = [item for item in inventory if item.name in second_pass_placeable_items] + generic_items: List[StarcraftItem] = [stacrcraft_item for stacrcraft_item in inventory if stacrcraft_item.name in second_pass_placeable_items] reserved_generic_percent = get_option_value(self.world, "ensure_generic_items") / 100 reserved_generic_amount = int(len(generic_items) * reserved_generic_percent) removable_generic_items = [] self.world.random.shuffle(generic_items) - for item in generic_items[:reserved_generic_amount]: - locked_items.append(copy_item(item)) - inventory.remove(item) - if item.name not in self.logical_inventory: - removable_generic_items.append(item) + for stacrcraft_item in generic_items[:reserved_generic_amount]: + locked_items.append(copy_item(stacrcraft_item)) + inventory.remove(stacrcraft_item) + if stacrcraft_item.name not in self.logical_inventory: + removable_generic_items.append(stacrcraft_item) # Main cull process unused_items: List[str] = [] # Reusable items for the second pass @@ -180,12 +206,12 @@ def attempt_removal(item: Item) -> bool: # If there still isn't enough space, push locked items into start inventory self.world.random.shuffle(locked_items) while len(locked_items) > 0 and len(locked_items) + len(necessary_items) > inventory_size: - item: Item = locked_items.pop() + item: StarcraftItem = locked_items.pop() self.multiworld.push_precollected(item) # If locked items weren't enough either, push necessary items into start inventory too self.world.random.shuffle(necessary_items) while len(necessary_items) > inventory_size: - item: Item = necessary_items.pop() + item: StarcraftItem = necessary_items.pop() self.multiworld.push_precollected(item) break # Select random item from removable items @@ -407,12 +433,18 @@ def attempt_removal(item: Item) -> bool: inventory += necessary_items # Replacing empty space with generically useful items - replacement_items = [item for item in self.item_pool - if (item not in inventory - and item not in self.locked_items - and ( - item.name in second_pass_placeable_items - or item.name in unused_items))] + replacement_items = [ + item for item in self.item_pool + if ( + item not in inventory + and item not in self.locked_items + and item not in excluded_items + and ( + item.name in second_pass_placeable_items + or item.name in unused_items + ) + ) + ] self.world.random.shuffle(replacement_items) while len(inventory) < inventory_size and len(replacement_items) > 0: item = replacement_items.pop() @@ -421,7 +453,7 @@ def attempt_removal(item: Item) -> bool: return inventory def __init__(self, world: 'SC2World', - item_pool: List[Item], existing_items: List[Item], locked_items: List[Item], necessary_items: List[Item] + item_pool: List[StarcraftItem], existing_items: List[StarcraftItem], locked_items: List[StarcraftItem], necessary_items: List[StarcraftItem] ): self.multiworld = world.multiworld self.player = world.player @@ -431,33 +463,18 @@ def __init__(self, world: 'SC2World', self.necessary_items = necessary_items[:] self.existing_items = existing_items # Initial filter of item pool - self.item_pool = [] - item_quantities: dict[str, int] = dict() + self.item_pool = item_pool # Inventory restrictiveness based on number of missions with checks mission_count = world.custom_mission_order.get_mission_count() self.min_units_per_structure = int(mission_count / 7) - min_upgrades = 1 if mission_count < 10 else 2 - for item in item_pool: - item_info = get_full_item_list()[item.name] - if item_info.type in upgrade_item_types: - # Locking upgrades based on mission duration - if item.name not in item_quantities: - item_quantities[item.name] = 0 - item_quantities[item.name] += 1 - if item_quantities[item.name] <= min_upgrades: - self.locked_items.append(item) - else: - self.item_pool.append(item) - else: - self.item_pool.append(item) - self.item_children: Dict[Item, List[Item]] = dict() + self.item_children: Dict[StarcraftItem, List[StarcraftItem]] = dict() for item in self.item_pool + locked_items + existing_items: if item.name in UPGRADABLE_ITEMS: self.item_children[item] = get_item_upgrades(self.item_pool, item) def filter_items(world: 'SC2World', location_cache: List[Location], - item_pool: List[Item], existing_items: List[Item], locked_items: List[Item], necessary_items: List[Item]) -> List[Item]: + item_pool: List[StarcraftItem], existing_items: List[StarcraftItem], locked_items: List[StarcraftItem], necessary_items: List[StarcraftItem]) -> List[Item]: """ Returns a semi-randomly pruned set of items based on number of available locations. The returned inventory must be capable of logically accessing every location in the world. diff --git a/worlds/sc2/rules.py b/worlds/sc2/rules.py index ff26acdcce63..eb371e2692e5 100644 --- a/worlds/sc2/rules.py +++ b/worlds/sc2/rules.py @@ -7,7 +7,7 @@ GrantStoryTech, GrantStoryLevels, TakeOverAIAllies, SpearOfAdunAutonomouslyCastAbilityPresence, get_enabled_campaigns, MissionOrder, EnableMorphling, get_enabled_races ) -from .items import ( +from .item_tables import ( tvx_defense_ratings, tvz_defense_ratings, kerrigan_actives, tvx_air_defense_ratings, kerrigan_levels, get_full_item_list, zvx_air_defense_ratings, zvx_defense_ratings, pvx_defense_ratings, pvz_defense_ratings, no_logic_basic_units, advanced_basic_units, basic_units, upgrade_bundles, diff --git a/worlds/sc2/test/test_generation.py b/worlds/sc2/test/test_generation.py index e941c10e57c9..c1c9d3549d63 100644 --- a/worlds/sc2/test/test_generation.py +++ b/worlds/sc2/test/test_generation.py @@ -4,7 +4,7 @@ from typing import * from .test_base import Sc2SetupTestBase -from .. import item_groups, item_names, items, mission_groups, mission_tables, options, locations +from .. import item_groups, item_names, items, mission_groups, mission_tables, options, locations, item_tables from .. import get_all_missions, get_first_mission @@ -136,11 +136,11 @@ def test_excluding_campaigns_excludes_campaign_specific_items(self) -> None: } self.generate_world(world_options) self.assertTrue(self.multiworld.itempool) - world_items = [(item.name, items.item_table[item.name]) for item in self.multiworld.itempool] + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] for item_name, item_data in world_items: - self.assertNotIn(item_data.type, items.ProtossItemType) - self.assertNotIn(item_data.type, items.ZergItemType) - self.assertNotEqual(item_data.type, items.TerranItemType.Nova_Gear) + self.assertNotIn(item_data.type, item_tables.ProtossItemType) + self.assertNotIn(item_data.type, item_tables.ZergItemType) + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Nova_Gear) self.assertNotEqual(item_name, item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE) def test_starter_unit_populates_start_inventory(self): @@ -171,9 +171,9 @@ def test_excluding_all_terran_missions_excludes_all_terran_items(self) -> None: } self.generate_world(world_options) self.assertTrue(self.multiworld.itempool) - world_items = [(item.name, items.item_table[item.name]) for item in self.multiworld.itempool] + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] for item_name, item_data in world_items: - self.assertNotIn(item_data.type, items.TerranItemType, f"Item '{item_name}' included when all terran missions are excluded") + self.assertNotIn(item_data.type, item_tables.TerranItemType, f"Item '{item_name}' included when all terran missions are excluded") def test_excluding_all_terran_build_missions_excludes_all_terran_units(self) -> None: world_options = { @@ -187,11 +187,11 @@ def test_excluding_all_terran_build_missions_excludes_all_terran_units(self) -> } self.generate_world(world_options) self.assertTrue(self.multiworld.itempool) - world_items = [(item.name, items.item_table[item.name]) for item in self.multiworld.itempool] + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] for item_name, item_data in world_items: - self.assertNotEqual(item_data.type, items.TerranItemType.Unit, f"Item '{item_name}' included when all terran build missions are excluded") - self.assertNotEqual(item_data.type, items.TerranItemType.Mercenary, f"Item '{item_name}' included when all terran build missions are excluded") - self.assertNotEqual(item_data.type, items.TerranItemType.Building, f"Item '{item_name}' included when all terran build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Unit, f"Item '{item_name}' included when all terran build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Mercenary, f"Item '{item_name}' included when all terran build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Building, f"Item '{item_name}' included when all terran build missions are excluded") def test_excluding_all_zerg_and_kerrigan_missions_excludes_all_zerg_items(self) -> None: world_options = { @@ -204,9 +204,9 @@ def test_excluding_all_zerg_and_kerrigan_missions_excludes_all_zerg_items(self) } self.generate_world(world_options) self.assertTrue(self.multiworld.itempool) - world_items = [(item.name, items.item_table[item.name]) for item in self.multiworld.itempool] + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] for item_name, item_data in world_items: - self.assertNotIn(item_data.type, items.ZergItemType, f"Item '{item_name}' included when all zerg missions are excluded") + self.assertNotIn(item_data.type, item_tables.ZergItemType, f"Item '{item_name}' included when all zerg missions are excluded") def test_excluding_all_zerg_build_missions_excludes_zerg_units(self) -> None: world_options = { @@ -222,10 +222,10 @@ def test_excluding_all_zerg_build_missions_excludes_zerg_units(self) -> None: } self.generate_world(world_options) self.assertTrue(self.multiworld.itempool) - world_items = [(item.name, items.item_table[item.name]) for item in self.multiworld.itempool] + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] for item_name, item_data in world_items: - self.assertNotEqual(item_data.type, items.ZergItemType.Unit, f"Item '{item_name}' included when all zerg build missions are excluded") - self.assertNotEqual(item_data.type, items.ZergItemType.Mercenary, f"Item '{item_name}' included when all zerg build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ZergItemType.Unit, f"Item '{item_name}' included when all zerg build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ZergItemType.Mercenary, f"Item '{item_name}' included when all zerg build missions are excluded") def test_excluding_all_protoss_missions_excludes_all_protoss_items(self) -> None: world_options = { @@ -240,9 +240,9 @@ def test_excluding_all_protoss_missions_excludes_all_protoss_items(self) -> None } self.generate_world(world_options) self.assertTrue(self.multiworld.itempool) - world_items = [(item.name, items.item_table[item.name]) for item in self.multiworld.itempool] + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] for item_name, item_data in world_items: - self.assertNotIn(item_data.type, items.ProtossItemType, f"Item '{item_name}' included when all protoss missions are excluded") + self.assertNotIn(item_data.type, item_tables.ProtossItemType, f"Item '{item_name}' included when all protoss missions are excluded") def test_excluding_all_protoss_build_missions_excludes_protoss_units(self) -> None: world_options = { @@ -259,11 +259,11 @@ def test_excluding_all_protoss_build_missions_excludes_protoss_units(self) -> No } self.generate_world(world_options) self.assertTrue(self.multiworld.itempool) - world_items = [(item.name, items.item_table[item.name]) for item in self.multiworld.itempool] + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] for item_name, item_data in world_items: - self.assertNotEqual(item_data.type, items.ProtossItemType.Unit, f"Item '{item_name}' included when all protoss build missions are excluded") - self.assertNotEqual(item_data.type, items.ProtossItemType.Unit_2, f"Item '{item_name}' included when all protoss build missions are excluded") - self.assertNotEqual(item_data.type, items.ProtossItemType.Building, f"Item '{item_name}' included when all protoss build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ProtossItemType.Unit, f"Item '{item_name}' included when all protoss build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ProtossItemType.Unit_2, f"Item '{item_name}' included when all protoss build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ProtossItemType.Building, f"Item '{item_name}' included when all protoss build missions are excluded") def test_vanilla_items_only_excludes_terran_progressives(self) -> None: world_options = { @@ -278,7 +278,7 @@ def test_vanilla_items_only_excludes_terran_progressives(self) -> None: 'vanilla_items_only': True, } self.generate_world(world_options) - world_items = [(item.name, items.item_table[item.name]) for item in self.multiworld.itempool] + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] self.assertTrue(items) occurrences: Dict[str, int] = {} for item_name, _ in world_items: @@ -298,7 +298,7 @@ def test_vanilla_items_only_includes_only_nova_equipment_and_vanilla_and_filler_ 'vanilla_items_only': True, } self.generate_world(world_options) - world_items = [(item.name, items.item_table[item.name]) for item in self.multiworld.itempool] + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] self.assertTrue(items) for item_name, item_data in world_items: if item_data.quantity == 0: @@ -367,7 +367,7 @@ def test_soa_items_are_included_in_wol_when_presence_set_to_everywhere(self) -> self.generate_world(world_options) itempool = [item.name for item in self.multiworld.itempool] self.assertTrue(itempool) - soa_items_in_pool = [item_name for item_name in itempool if items.item_table[item_name].type == items.ProtossItemType.Spear_Of_Adun] + soa_items_in_pool = [item_name for item_name in itempool if item_tables.item_table[item_name].type == item_tables.ProtossItemType.Spear_Of_Adun] self.assertGreater(len(soa_items_in_pool), 5) def test_lotv_only_doesnt_include_kerrigan_items_with_grant_story_tech(self) -> None: From d99a78ad6c54d0632430ddd30bb412bfa287bab2 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 15:30:19 +0100 Subject: [PATCH 02/13] Fix test_items --- worlds/sc2/test/test_items.py | 136 +++++++++++++++++----------------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/worlds/sc2/test/test_items.py b/worlds/sc2/test/test_items.py index 26d970634c16..48595f0b2f4b 100644 --- a/worlds/sc2/test/test_items.py +++ b/worlds/sc2/test/test_items.py @@ -1,7 +1,7 @@ import unittest from typing import List, Set -from worlds.sc2 import items +from worlds.sc2 import item_tables class TestItems(unittest.TestCase): @@ -10,8 +10,8 @@ def test_grouped_upgrades_number(self) -> None: Tests if grouped upgrades have set number correctly :return: """ - bundled_items = items.upgrade_bundles.keys() - bundled_item_data = [items.get_full_item_list()[item_name] for item_name in bundled_items] + bundled_items = item_tables.upgrade_bundles.keys() + bundled_item_data = [item_tables.get_full_item_list()[item_name] for item_name in bundled_items] bundled_item_numbers = [item_data.number for item_data in bundled_item_data] check_numbers = [number == -1 for number in bundled_item_numbers] @@ -24,13 +24,13 @@ def test_non_grouped_upgrades_number(self) -> None: :return: """ check_modulo = 4 - bundled_items = items.upgrade_bundles.keys() + bundled_items = item_tables.upgrade_bundles.keys() non_bundled_upgrades = [ - item_name for item_name in items.get_full_item_list().keys() + item_name for item_name in item_tables.get_full_item_list().keys() if (item_name not in bundled_items - and items.get_full_item_list()[item_name].type in items.upgrade_item_types) + and item_tables.get_full_item_list()[item_name].type in item_tables.upgrade_item_types) ] - non_bundled_upgrade_data = [items.get_full_item_list()[item_name] for item_name in non_bundled_upgrades] + non_bundled_upgrade_data = [item_tables.get_full_item_list()[item_name] for item_name in non_bundled_upgrades] non_bundled_upgrade_numbers = [item_data.number for item_data in non_bundled_upgrade_data] check_numbers = [number % check_modulo == 0 for number in non_bundled_upgrade_numbers] @@ -42,8 +42,8 @@ def test_bundles_contain_only_basic_elements(self) -> None: Checks if there are no bundles within bundles. :return: """ - bundled_items = items.upgrade_bundles.keys() - bundle_elements: List[str] = [item_name for values in items.upgrade_bundles.values() for item_name in values] + bundled_items = item_tables.upgrade_bundles.keys() + bundle_elements: List[str] = [item_name for values in item_tables.upgrade_bundles.values() for item_name in values] for element in bundle_elements: self.assertNotIn(element, bundled_items) @@ -53,41 +53,41 @@ def test_weapon_armor_level(self) -> None: Checks if Weapon/Armor upgrade level is correctly set to all Weapon/Armor upgrade items. :return: """ - weapon_armor_upgrades = [item for item in items.get_full_item_list() if items.get_item_table()[item].type in items.upgrade_item_types] + weapon_armor_upgrades = [item for item in item_tables.get_full_item_list() if item_tables.get_item_table()[item].type in item_tables.upgrade_item_types] for weapon_armor_upgrade in weapon_armor_upgrades: - self.assertEqual(items.get_full_item_list()[weapon_armor_upgrade].quantity, items.WEAPON_ARMOR_UPGRADE_MAX_LEVEL) + self.assertEqual(item_tables.get_full_item_list()[weapon_armor_upgrade].quantity, item_tables.WEAPON_ARMOR_UPGRADE_MAX_LEVEL) def test_item_ids_distinct(self) -> None: """ Verifies if there are no duplicates of item ID. :return: """ - item_ids: Set[int] = {items.get_full_item_list()[item_name].code for item_name in items.get_full_item_list()} + item_ids: Set[int] = {item_tables.get_full_item_list()[item_name].code for item_name in item_tables.get_full_item_list()} - self.assertEqual(len(item_ids), len(items.get_full_item_list())) + self.assertEqual(len(item_ids), len(item_tables.get_full_item_list())) def test_number_distinct_in_item_type(self) -> None: """ Tests if each item is distinct for sending into the mod. :return: """ - item_types: List[items.ItemTypeEnum] = [ - *[item.value for item in items.TerranItemType], - *[item.value for item in items.ZergItemType], - *[item.value for item in items.ProtossItemType], - *[item.value for item in items.FactionlessItemType] + item_types: List[item_tables.ItemTypeEnum] = [ + *[item.value for item in item_tables.TerranItemType], + *[item.value for item in item_tables.ZergItemType], + *[item.value for item in item_tables.ProtossItemType], + *[item.value for item in item_tables.FactionlessItemType] ] self.assertGreater(len(item_types), 0) for item_type in item_types: item_names: List[str] = [ - item_name for item_name in items.get_full_item_list() - if items.get_full_item_list()[item_name].number >= 0 # Negative numbers have special meaning - and items.get_full_item_list()[item_name].type == item_type + item_name for item_name in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item_name].number >= 0 # Negative numbers have special meaning + and item_tables.get_full_item_list()[item_name].type == item_type ] - item_numbers: Set[int] = {items.get_full_item_list()[item_name] for item_name in item_names} + item_numbers: Set[int] = {item_tables.get_full_item_list()[item_name] for item_name in item_names} self.assertEqual(len(item_names), len(item_numbers)) @@ -96,16 +96,16 @@ def test_progressive_has_quantity(self) -> None: Checks if the quantity attribute has been set for progressive items. :return: """ - progressive_groups: List[items.ItemTypeEnum] = [ - items.TerranItemType.Progressive, - items.TerranItemType.Progressive_2, - items.ProtossItemType.Progressive, - items.ZergItemType.Progressive + progressive_groups: List[item_tables.ItemTypeEnum] = [ + item_tables.TerranItemType.Progressive, + item_tables.TerranItemType.Progressive_2, + item_tables.ProtossItemType.Progressive, + item_tables.ZergItemType.Progressive ] quantities: List[int] = [ - items.get_full_item_list()[item].quantity for item in items.get_full_item_list() - if items.get_full_item_list()[item].type in progressive_groups + item_tables.get_full_item_list()[item].quantity for item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item].type in progressive_groups ] self.assertNotIn(1, quantities) @@ -115,46 +115,46 @@ def test_non_progressive_quantity(self) -> None: Check if non-progressive items have quantity at most 1. :return: """ - non_progressive_single_entity_groups: List[items.ItemTypeEnum] = [ + non_progressive_single_entity_groups: List[item_tables.ItemTypeEnum] = [ # Terran - items.TerranItemType.Unit, - items.TerranItemType.Unit_2, - items.TerranItemType.Mercenary, - items.TerranItemType.Armory_1, - items.TerranItemType.Armory_2, - items.TerranItemType.Armory_3, - items.TerranItemType.Armory_4, - items.TerranItemType.Armory_5, - items.TerranItemType.Armory_6, - items.TerranItemType.Armory_7, - items.TerranItemType.Building, - items.TerranItemType.Laboratory, - items.TerranItemType.Nova_Gear, + item_tables.TerranItemType.Unit, + item_tables.TerranItemType.Unit_2, + item_tables.TerranItemType.Mercenary, + item_tables.TerranItemType.Armory_1, + item_tables.TerranItemType.Armory_2, + item_tables.TerranItemType.Armory_3, + item_tables.TerranItemType.Armory_4, + item_tables.TerranItemType.Armory_5, + item_tables.TerranItemType.Armory_6, + item_tables.TerranItemType.Armory_7, + item_tables.TerranItemType.Building, + item_tables.TerranItemType.Laboratory, + item_tables.TerranItemType.Nova_Gear, # Zerg - items.ZergItemType.Unit, - items.ZergItemType.Mercenary, - items.ZergItemType.Morph, - items.ZergItemType.Strain, - items.ZergItemType.Mutation_1, - items.ZergItemType.Mutation_2, - items.ZergItemType.Mutation_3, - items.ZergItemType.Evolution_Pit, - items.ZergItemType.Ability, + item_tables.ZergItemType.Unit, + item_tables.ZergItemType.Mercenary, + item_tables.ZergItemType.Morph, + item_tables.ZergItemType.Strain, + item_tables.ZergItemType.Mutation_1, + item_tables.ZergItemType.Mutation_2, + item_tables.ZergItemType.Mutation_3, + item_tables.ZergItemType.Evolution_Pit, + item_tables.ZergItemType.Ability, # Protoss - items.ProtossItemType.Unit, - items.ProtossItemType.Unit_2, - items.ProtossItemType.Building, - items.ProtossItemType.Forge_1, - items.ProtossItemType.Forge_2, - items.ProtossItemType.Forge_3, - items.ProtossItemType.Forge_4, - items.ProtossItemType.Solarite_Core, - items.ProtossItemType.Spear_Of_Adun + item_tables.ProtossItemType.Unit, + item_tables.ProtossItemType.Unit_2, + item_tables.ProtossItemType.Building, + item_tables.ProtossItemType.Forge_1, + item_tables.ProtossItemType.Forge_2, + item_tables.ProtossItemType.Forge_3, + item_tables.ProtossItemType.Forge_4, + item_tables.ProtossItemType.Solarite_Core, + item_tables.ProtossItemType.Spear_Of_Adun ] quantities: List[int] = [ - items.get_full_item_list()[item].quantity for item in items.get_full_item_list() - if items.get_full_item_list()[item].type in non_progressive_single_entity_groups + item_tables.get_full_item_list()[item].quantity for item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item].type in non_progressive_single_entity_groups ] for quantity in quantities: @@ -165,14 +165,14 @@ def test_item_number_less_than_30(self) -> None: Checks if all item numbers are within bounds supported by game mod. :return: """ - not_checked_item_types: List[items.ItemTypeEnum] = [ - items.ZergItemType.Level + not_checked_item_types: List[item_tables.ItemTypeEnum] = [ + item_tables.ZergItemType.Level ] items_to_check: List[str] = [ - item for item in items.get_full_item_list() - if items.get_full_item_list()[item].type not in not_checked_item_types + item for item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item].type not in not_checked_item_types ] for item in items_to_check: - item_number = items.get_full_item_list()[item].number + item_number = item_tables.get_full_item_list()[item].number self.assertLess(item_number, 30) From 8c1b2aa17f22360b68f410c78c30ba6d64c2b99d Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 15:48:28 +0100 Subject: [PATCH 03/13] Some more test-related fixes --- worlds/sc2/test/test_custom_mission_orders.py | 4 ++-- worlds/sc2/test/test_generation.py | 6 +++--- worlds/sc2/test/test_itemdescriptions.py | 6 +++--- worlds/sc2/test/test_itemgroups.py | 4 ++-- worlds/sc2/test/test_options.py | 13 ++++++------- worlds/sc2/test/test_rules.py | 4 ++-- worlds/sc2/test/test_usecases.py | 10 +++++----- 7 files changed, 23 insertions(+), 24 deletions(-) diff --git a/worlds/sc2/test/test_custom_mission_orders.py b/worlds/sc2/test/test_custom_mission_orders.py index e9b2421cacd7..d0a5397e950a 100644 --- a/worlds/sc2/test/test_custom_mission_orders.py +++ b/worlds/sc2/test/test_custom_mission_orders.py @@ -5,7 +5,7 @@ from .test_base import Sc2SetupTestBase from .. import MissionFlag from .. import item_names -from .. import items +from .. import item_tables from BaseClasses import ItemClassification class TestCustomMissionOrders(Sc2SetupTestBase): @@ -126,7 +126,7 @@ def test_locked_and_necessary_item_appears_once(self): } } - self.assertNotEqual(items.item_table[test_item].classification, ItemClassification.progression, f"Test item {test_item} won't change classification") + self.assertNotEqual(item_tables.item_table[test_item].classification, ItemClassification.progression, f"Test item {test_item} won't change classification") self.generate_world(world_options) test_items_in_pool = [item for item in self.multiworld.itempool if item.name == test_item] diff --git a/worlds/sc2/test/test_generation.py b/worlds/sc2/test/test_generation.py index c1c9d3549d63..eed82dc090b6 100644 --- a/worlds/sc2/test/test_generation.py +++ b/worlds/sc2/test/test_generation.py @@ -4,7 +4,7 @@ from typing import * from .test_base import Sc2SetupTestBase -from .. import item_groups, item_names, items, mission_groups, mission_tables, options, locations, item_tables +from .. import item_groups, item_names, mission_groups, mission_tables, options, locations, item_tables from .. import get_all_missions, get_first_mission @@ -279,7 +279,7 @@ def test_vanilla_items_only_excludes_terran_progressives(self) -> None: } self.generate_world(world_options) world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] - self.assertTrue(items) + self.assertTrue(world_items) occurrences: Dict[str, int] = {} for item_name, _ in world_items: if item_name in item_groups.terran_progressive_items: @@ -299,7 +299,7 @@ def test_vanilla_items_only_includes_only_nova_equipment_and_vanilla_and_filler_ } self.generate_world(world_options) world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] - self.assertTrue(items) + self.assertTrue(world_items) for item_name, item_data in world_items: if item_data.quantity == 0: continue diff --git a/worlds/sc2/test/test_itemdescriptions.py b/worlds/sc2/test/test_itemdescriptions.py index f4b65b2c7924..dfefc4e24270 100644 --- a/worlds/sc2/test/test_itemdescriptions.py +++ b/worlds/sc2/test/test_itemdescriptions.py @@ -1,17 +1,17 @@ import unittest -from .. import items +from .. import item_tables from .. import item_descriptions class TestItemDescriptions(unittest.TestCase): def test_all_items_have_description(self) -> None: - for item_name in items.item_table: + for item_name in item_tables.item_table: self.assertIn(item_name, item_descriptions.item_descriptions) def test_all_descriptions_refer_to_item_and_end_in_dot(self) -> None: for item_name, item_desc in item_descriptions.item_descriptions.items(): - self.assertIn(item_name, items.item_table) + self.assertIn(item_name, item_tables.item_table) self.assertEqual(item_desc.strip()[-1], '.', msg=f"{item_name}'s item description does not end in a '.': '{item_desc}'") def test_item_descriptions_follow_single_space_after_period_style(self) -> None: diff --git a/worlds/sc2/test/test_itemgroups.py b/worlds/sc2/test/test_itemgroups.py index 407c6170bbb6..04ba9d9889fe 100644 --- a/worlds/sc2/test/test_itemgroups.py +++ b/worlds/sc2/test/test_itemgroups.py @@ -3,7 +3,7 @@ """ import unittest -from .. import item_groups, items +from .. import item_groups, item_tables class ItemGroupsUnitTests(unittest.TestCase): @@ -19,7 +19,7 @@ def test_all_production_structure_groups_capture_all_units(self) -> None: def test_terran_original_progressive_group_fully_contained_in_wol_upgrades(self) -> None: for item_name in item_groups.terran_original_progressive_upgrades: - self.assertIn(items.item_table[item_name].type, (items.TerranItemType.Progressive, items.TerranItemType.Progressive_2), f"{item_name} is not progressive") + self.assertIn(item_tables.item_table[item_name].type, (item_tables.TerranItemType.Progressive, item_tables.TerranItemType.Progressive_2), f"{item_name} is not progressive") self.assertIn(item_name, item_groups.wol_upgrades) def test_all_items_in_stimpack_group_are_stimpacks(self) -> None: diff --git a/worlds/sc2/test/test_options.py b/worlds/sc2/test/test_options.py index 793a6b5313bb..4debdd857126 100644 --- a/worlds/sc2/test/test_options.py +++ b/worlds/sc2/test/test_options.py @@ -1,8 +1,7 @@ import unittest from typing import Set, Dict, List -from .test_base import Sc2TestBase -from .. import mission_tables, options, items +from .. import mission_tables, options, item_tables class TestOptions(unittest.TestCase): @@ -11,19 +10,19 @@ def test_campaign_size_option_max_matches_number_of_missions(self) -> None: def test_unit_max_upgrades_matching_items(self) -> None: base_items: Set[str] = { - items.get_full_item_list()[item].parent_item for item in items.get_full_item_list() - if items.get_full_item_list()[item].parent_item is not None + item_tables.get_full_item_list()[item].parent_item for item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item].parent_item is not None } upgrade_items: Dict[str, List[str]] = dict() for item in base_items: upgrade_items[item] = [ - upgrade_item for upgrade_item in items.get_full_item_list() - if items.get_full_item_list()[upgrade_item].parent_item == item + upgrade_item for upgrade_item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[upgrade_item].parent_item == item ] upgrade_counter: List[int] = list() for item in base_items: - quantities: List[int] = [items.get_full_item_list()[upgrade_item].quantity for upgrade_item in upgrade_items[item]] + quantities: List[int] = [item_tables.get_full_item_list()[upgrade_item].quantity for upgrade_item in upgrade_items[item]] upgrade_counter.append(sum(quantities)) self.assertEqual(options.MAX_UPGRADES_OPTION, max(upgrade_counter)) diff --git a/worlds/sc2/test/test_rules.py b/worlds/sc2/test/test_rules.py index 17824f81e604..b78327679f89 100644 --- a/worlds/sc2/test/test_rules.py +++ b/worlds/sc2/test/test_rules.py @@ -6,7 +6,7 @@ from BaseClasses import ItemClassification, MultiWorld from Options import * # Mandatory -from worlds.sc2 import items, options, locations +from worlds.sc2 import item_tables, options, locations class TestInventory: @@ -18,7 +18,7 @@ def __init__(self): self.progression_types: Set[ItemClassification] = {ItemClassification.progression, ItemClassification.progression_skip_balancing} def is_item_progression(self, item: str) -> bool: - return items.get_full_item_list()[item].classification in self.progression_types + return item_tables.get_full_item_list()[item].classification in self.progression_types def random_boolean(self): return self.random.choice([True, False]) diff --git a/worlds/sc2/test/test_usecases.py b/worlds/sc2/test/test_usecases.py index 8a3886e5264f..81e09993e6a7 100644 --- a/worlds/sc2/test/test_usecases.py +++ b/worlds/sc2/test/test_usecases.py @@ -3,7 +3,7 @@ """ from .test_base import Sc2SetupTestBase -from .. import get_all_missions, item_groups, item_names, items, mission_tables, options +from .. import get_all_missions, item_groups, item_names, item_tables, mission_tables, options from ..mission_tables import SC2Race, SC2Mission, SC2Campaign, MissionFlag @@ -153,7 +153,7 @@ def test_free_protoss_only_generates(self) -> None: for mission in missions: self.assertIn(mission.campaign, (mission_tables.SC2Campaign.PROLOGUE, mission_tables.SC2Campaign.PROPHECY)) for item_name in world_item_names: - self.assertIn(items.item_table[item_name].race, (mission_tables.SC2Race.ANY, mission_tables.SC2Race.PROTOSS)) + self.assertIn(item_tables.item_table[item_name].race, (mission_tables.SC2Race.ANY, mission_tables.SC2Race.PROTOSS)) def test_resource_filler_items_may_be_put_in_start_inventory(self) -> None: NUM_RESOURCE_ITEMS = 10 @@ -187,7 +187,7 @@ def test_excluding_protoss_excludes_campaigns_and_items(self) -> None: world_regions = [region.name for region in self.multiworld.regions] world_regions.remove('Menu') for item_name in world_item_names: - self.assertNotEqual(items.item_table[item_name].race, mission_tables.SC2Race.PROTOSS, f"{item_name} is a PROTOSS item!") + self.assertNotEqual(item_tables.item_table[item_name].race, mission_tables.SC2Race.PROTOSS, f"{item_name} is a PROTOSS item!") for region in world_regions: self.assertNotIn(mission_tables.lookup_name_to_mission[region].campaign, (mission_tables.SC2Campaign.LOTV, mission_tables.SC2Campaign.PROPHECY, mission_tables.SC2Campaign.PROLOGUE), @@ -210,7 +210,7 @@ def test_excluding_terran_excludes_campaigns_and_items(self) -> None: world_regions = [region.name for region in self.multiworld.regions] world_regions.remove('Menu') for item_name in world_item_names: - self.assertNotEqual(items.item_table[item_name].race, mission_tables.SC2Race.TERRAN, + self.assertNotEqual(item_tables.item_table[item_name].race, mission_tables.SC2Race.TERRAN, f"{item_name} is a TERRAN item!") for region in world_regions: self.assertNotIn(mission_tables.lookup_name_to_mission[region].campaign, @@ -234,7 +234,7 @@ def test_excluding_zerg_excludes_campaigns_and_items(self) -> None: world_regions = [region.name for region in self.multiworld.regions] world_regions.remove('Menu') for item_name in world_item_names: - self.assertNotEqual(items.item_table[item_name].race, mission_tables.SC2Race.ZERG, + self.assertNotEqual(item_tables.item_table[item_name].race, mission_tables.SC2Race.ZERG, f"{item_name} is a ZERG item!") # have to manually exclude the only non-zerg HotS mission... for region in filter(lambda region: region != "With Friends Like These", world_regions): From 25d5bee2184885f180d45b07e06ed1af2a26304d Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 15:55:38 +0100 Subject: [PATCH 04/13] Additional bugfix --- worlds/sc2/item_descriptions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/sc2/item_descriptions.py b/worlds/sc2/item_descriptions.py index bfa085e38612..e5845704aaa0 100644 --- a/worlds/sc2/item_descriptions.py +++ b/worlds/sc2/item_descriptions.py @@ -3,7 +3,7 @@ """ import inspect -from . import item_names, items +from . import item_names, item_tables WEAPON_ARMOR_UPGRADE_NOTE = inspect.cleandoc(""" Must be researched during the mission if the mission type isn't set to auto-unlock generic upgrades. @@ -1051,6 +1051,6 @@ def _ability_desc(unit_name_plural: str, ability_name: str, ability_description: # Key descriptions key_descriptions = { key: GENERIC_KEY_DESC - for key in items.key_item_table.keys() + for key in item_tables.key_item_table.keys() } item_descriptions.update(key_descriptions) From 7866690d859e01b575d7402e65271757ae4e47f8 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 16:12:30 +0100 Subject: [PATCH 05/13] Minor test fix --- worlds/sc2/__init__.py | 7 ++++++- worlds/sc2/test/test_usecases.py | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index 340b732a6773..67de5051d018 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -445,7 +445,11 @@ def flag_mission_based_item_excludes(world: SC2World, item_list: List[FilterItem kerrigan_build_missions = [mission for mission in kerrigan_missions if MissionFlag.NoBuild not in mission.flags] nova_missions = [mission for mission in missions if MissionFlag.Nova in mission.flags] - kerrigan_is_present = len(kerrigan_missions) > 0 and world.options.kerrigan_presence == KerriganPresence.option_vanilla + kerrigan_is_present = ( + len(kerrigan_missions) > 0 + and world.options.kerrigan_presence == KerriganPresence.option_vanilla + and SC2Campaign.HOTS in options.get_enabled_campaigns(world) # TODO: Kerrigan available all Zerg/Everywhere + ) # TvZ build missions -- check flags Terran and VsZerg are true and NoBuild is false tvz_build_mask = MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.NoBuild @@ -498,6 +502,7 @@ def flag_mission_based_item_excludes(world: SC2World, item_list: List[FilterItem # Remove Kerrigan abilities if there's no kerrigan if item.data.type == item_tables.ZergItemType.Ability: if not kerrigan_is_present: + # TODO: Kerrigan presence Zerg/Everywhere item.flags |= ItemFilterFlags.Removed elif world.options.grant_story_tech and not kerrigan_build_missions: item.flags |= ItemFilterFlags.Removed diff --git a/worlds/sc2/test/test_usecases.py b/worlds/sc2/test/test_usecases.py index 81e09993e6a7..65b531834157 100644 --- a/worlds/sc2/test/test_usecases.py +++ b/worlds/sc2/test/test_usecases.py @@ -228,6 +228,9 @@ def test_excluding_zerg_excludes_campaigns_and_items(self) -> None: 'enable_lotv_missions': True, 'enable_epilogue_missions': True, 'mission_order': options.MissionOrder.option_grid, + 'excluded_missions': [ + "The Infinite Cycle" + ] } self.generate_world(world_options) world_item_names = [item.name for item in self.multiworld.itempool] From 03b5d399b4d0f2657d529db0e6ef4f34cc1f1397 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 16:45:43 +0100 Subject: [PATCH 06/13] Handle properly the case if an item is in excluded items but required in order to beat the game --- worlds/sc2/__init__.py | 5 +++-- worlds/sc2/test/test_generation.py | 36 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index 67de5051d018..840532e9524e 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -338,8 +338,7 @@ def resolve_count(count: Optional[int], max_count: int) -> int: f"({excluded_count} + {locked_count} + {start_count} > {max_count}). Decreasing excluded amount.") excluded_count = max_count - start_count - locked_count # Make sure the final count creates enough items to satisfy key requirements - final_count = max(max_count - excluded_count, key_count) - for index in range(final_count): + for index in range(max_count): result.append(FilterItem(item_name, item_data, index)) if index < start_count: result[-1].flags |= ItemFilterFlags.StartInventory @@ -347,6 +346,8 @@ def resolve_count(count: Optional[int], max_count: int) -> int: result[-1].flags |= ItemFilterFlags.Locked if item_name in world.options.non_local_items: result[-1].flags |= ItemFilterFlags.NonLocal + if index >= max(max_count - excluded_count, key_count): + result[-1].flags |= ItemFilterFlags.Excluded return result diff --git a/worlds/sc2/test/test_generation.py b/worlds/sc2/test/test_generation.py index eed82dc090b6..d8313c98f3cf 100644 --- a/worlds/sc2/test/test_generation.py +++ b/worlds/sc2/test/test_generation.py @@ -779,3 +779,39 @@ def test_weapon_armor_upgrades_generic_upgrade_missions_no_countermeasure_needed # No additional starting inventory item placement is needed self.assertEqual(len(upgrade_items), 0) + + + def test_locking_required_items(self): + world_options = { + 'mission_order': options.MissionOrder.option_custom, + 'custom_mission_order': { + 'campaign': { + 'goal': True, + 'layout': { + 'type': 'column', + 'size': 2, + 'missions': [ + { + 'index': 0, + 'mission_pool': ['Liberation Day'] + }, + { + 'index': 1, + 'mission_pool': ['Supreme'] + }, + ] + } + } + }, + 'grant_story_levels': options.GrantStoryLevels.option_additive, + 'excluded_items': [ + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.KERRIGAN_MEND, + ] + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + # These items will be in the pool despite exclusions + self.assertIn(item_names.KERRIGAN_LEAPING_STRIKE, itempool) + self.assertIn(item_names.KERRIGAN_MEND, itempool) \ No newline at end of file From d65f9a943e5bdbb514b8c6e8f5324bdd05814cde Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 16:53:28 +0100 Subject: [PATCH 07/13] Test-related fix --- worlds/sc2/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index 840532e9524e..af2fe363c6dd 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -338,7 +338,8 @@ def resolve_count(count: Optional[int], max_count: int) -> int: f"({excluded_count} + {locked_count} + {start_count} > {max_count}). Decreasing excluded amount.") excluded_count = max_count - start_count - locked_count # Make sure the final count creates enough items to satisfy key requirements - for index in range(max_count): + final_count = max(max_count, key_count) + for index in range(final_count): result.append(FilterItem(item_name, item_data, index)) if index < start_count: result[-1].flags |= ItemFilterFlags.StartInventory @@ -346,7 +347,7 @@ def resolve_count(count: Optional[int], max_count: int) -> int: result[-1].flags |= ItemFilterFlags.Locked if item_name in world.options.non_local_items: result[-1].flags |= ItemFilterFlags.NonLocal - if index >= max(max_count - excluded_count, key_count): + if index >= max(max_count - excluded_count, key_count - 1): result[-1].flags |= ItemFilterFlags.Excluded return result From 5a03d5f1b83f1f05f3f3c8f7d8a6cf113db6dec8 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 16:55:28 +0100 Subject: [PATCH 08/13] Small bugfix --- worlds/sc2/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index af2fe363c6dd..2dc0fcf9e245 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -347,7 +347,7 @@ def resolve_count(count: Optional[int], max_count: int) -> int: result[-1].flags |= ItemFilterFlags.Locked if item_name in world.options.non_local_items: result[-1].flags |= ItemFilterFlags.NonLocal - if index >= max(max_count - excluded_count, key_count - 1): + if index >= max(max_count - excluded_count, key_count): result[-1].flags |= ItemFilterFlags.Excluded return result From 20fde6188789fbbad5c0304016d8b639de24b80a Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 17:38:13 +0100 Subject: [PATCH 09/13] Code reorganization --- worlds/sc2/__init__.py | 32 ++++---- worlds/sc2/client.py | 10 +-- worlds/sc2/client_gui.py | 5 +- worlds/sc2/{items.py => item/__init__.py} | 2 +- worlds/sc2/{ => item}/item_descriptions.py | 11 ++- worlds/sc2/{ => item}/item_groups.py | 14 ++-- worlds/sc2/{ => item}/item_names.py | 0 worlds/sc2/{ => item}/item_tables.py | 74 +++++++++---------- worlds/sc2/locations.py | 14 ++-- worlds/sc2/mission_order/entry_rules.py | 4 +- worlds/sc2/mission_order/options.py | 4 +- worlds/sc2/mission_order/structs.py | 4 +- worlds/sc2/options.py | 7 +- worlds/sc2/pool_filter.py | 22 +++--- worlds/sc2/rules.py | 48 ++++++------ worlds/sc2/test/test_custom_mission_orders.py | 3 +- worlds/sc2/test/test_generation.py | 3 +- worlds/sc2/test/test_itemdescriptions.py | 3 +- worlds/sc2/test/test_itemgroups.py | 5 +- worlds/sc2/test/test_items.py | 2 +- worlds/sc2/test/test_options.py | 3 +- worlds/sc2/test/test_rules.py | 5 +- worlds/sc2/test/test_usecases.py | 3 +- 23 files changed, 142 insertions(+), 136 deletions(-) rename worlds/sc2/{items.py => item/__init__.py} (96%) rename worlds/sc2/{ => item}/item_descriptions.py (98%) rename worlds/sc2/{ => item}/item_groups.py (98%) rename worlds/sc2/{ => item}/item_names.py (100%) rename worlds/sc2/{ => item}/item_tables.py (98%) diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index 2dc0fcf9e245..3adc18482550 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -1,23 +1,19 @@ from dataclasses import fields -import enum import logging from typing import * from math import floor, ceil -from dataclasses import dataclass -from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification, CollectionState, Region +from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification, CollectionState from Options import Accessibility from worlds.AutoWorld import WebWorld, World -from . import item_names -from .item_tables import ( +from .item.item_tables import ( filler_items, get_full_item_list, ProtossItemType, ItemData, kerrigan_actives, kerrigan_passives, - not_balanced_starting_units, WEAPON_ARMOR_UPGRADE_MAX_LEVEL, ItemType, ZergItemType, + not_balanced_starting_units, WEAPON_ARMOR_UPGRADE_MAX_LEVEL, ZergItemType, ) -from . import items -from . import item_groups +from . import item from . import location_groups -from .items import FilterItem, ItemFilterFlags, StarcraftItem +from .item import FilterItem, ItemFilterFlags, StarcraftItem, item_groups, item_names, item_tables from .locations import get_locations, DEFAULT_LOCATION_LIST, get_location_types, get_location_flags, get_plando_locations from .mission_order.layout_types import LayoutType, Gauntlet from .options import ( @@ -402,9 +398,9 @@ def flag_excludes_by_faction_presence(world: SC2World, item_list: List[FilterIte item.flags |= ItemFilterFlags.Removed if (not protoss_build_missions and item.data.type in ( - item_tables.ProtossItemType.Unit, - item_tables.ProtossItemType.Unit_2, - item_tables.ProtossItemType.Building, + item_tables.ProtossItemType.Unit, + item_tables.ProtossItemType.Unit_2, + item_tables.ProtossItemType.Building, ) ): # Note(mm): This doesn't exclude things like automated assimilators or warp gate improvements @@ -412,9 +408,9 @@ def flag_excludes_by_faction_presence(world: SC2World, item_list: List[FilterIte if (SC2Mission.TEMPLAR_S_RETURN not in missions or world.options.grant_story_tech.value == GrantStoryTech.option_true or item.name not in ( - item_names.IMMORTAL, item_names.ANNIHILATOR, - item_names.COLOSSUS, item_names.VANGUARD, item_names.REAVER, item_names.DARK_TEMPLAR, - item_names.SENTRY, item_names.HIGH_TEMPLAR, + item_names.IMMORTAL, item_names.ANNIHILATOR, + item_names.COLOSSUS, item_names.VANGUARD, item_names.REAVER, item_names.DARK_TEMPLAR, + item_names.SENTRY, item_names.HIGH_TEMPLAR, ) ): item.flags |= ItemFilterFlags.Removed @@ -531,8 +527,8 @@ def flag_allowed_orphan_items(world: SC2World, item_list: List[FilterItem]) -> N terran_nobuild_missions = any((MissionFlag.Terran|MissionFlag.NoBuild) in mission.flags for mission in missions) for item in item_list: if item.name in ( - item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MARINE_MAGRAIL_MUNITIONS, - item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MEDIC_NANO_PROJECTOR, + item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MARINE_MAGRAIL_MUNITIONS, + item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MEDIC_NANO_PROJECTOR, ) and terran_nobuild_missions: item.flags |= ItemFilterFlags.AllowedOrphan @@ -585,7 +581,7 @@ def flag_start_unit(world: SC2World, item_list: List[FilterItem], starter_unit: # Special case - you don't have a logicless location but need an AA basic_units = basic_units.difference( {item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.BLOOD_HUNTER, - item_names.AVENGER, item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD}) + item_names.AVENGER, item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD}) if first_mission == SC2Mission.SUDDEN_STRIKE: # Special case - cliffjumpers basic_units = {item_names.REAPER, item_names.GOLIATH, item_names.SIEGE_TANK, item_names.VIKING, item_names.BANSHEE} diff --git a/worlds/sc2/client.py b/worlds/sc2/client.py index 4915e955b55b..f3b041866d97 100644 --- a/worlds/sc2/client.py +++ b/worlds/sc2/client.py @@ -23,8 +23,8 @@ # CommonClient import first to trigger ModuleUpdater from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser from Utils import init_logging, is_windows, async_start -from . import item_names -from .item_groups import item_name_groups, unlisted_item_name_groups +from worlds.sc2.item import item_names +from worlds.sc2.item.item_groups import item_name_groups, unlisted_item_name_groups from . import options from .options import ( MissionOrder, KerriganPrimalStatus, kerrigan_unit_available, KerriganPresence, EnableMorphling, @@ -52,7 +52,7 @@ from worlds._sc2common.bot.data import Race from worlds._sc2common.bot.main import run_game from worlds._sc2common.bot.player import Bot -from .item_tables import ( +from worlds.sc2.item.item_tables import ( lookup_id_to_name, get_full_item_list, ItemData, race_to_item_type, ZergItemType, ProtossItemType, upgrade_bundles, WEAPON_ARMOR_UPGRADE_MAX_LEVEL, @@ -931,8 +931,8 @@ async def main(): CompatItemHolder(item_name) for item_name, item_data in get_full_item_list().items() if item_data.type in (ProtossItemType.War_Council, ProtossItemType.War_Council_2) - and item_name != item_names.DESTROYER_REFORGED_BLOODSHARD_CORE - and item_name != item_names.OBSERVER_INDUCE_SCOPOPHOBIA + and item_name != item_names.DESTROYER_REFORGED_BLOODSHARD_CORE + and item_name != item_names.OBSERVER_INDUCE_SCOPOPHOBIA } diff --git a/worlds/sc2/client_gui.py b/worlds/sc2/client_gui.py index edde53f2321d..3e135f173ed8 100644 --- a/worlds/sc2/client_gui.py +++ b/worlds/sc2/client_gui.py @@ -7,7 +7,6 @@ from kvui import GameManager, HoverBehavior, ServerToolTip, KivyJSONtoTextParser from kivy.app import App from kivy.clock import Clock -from kivy.uix.tabbedpanel import TabbedPanelItem from kivy.uix.gridlayout import GridLayout from kivy.lang import Builder from kivy.uix.label import Label @@ -16,8 +15,8 @@ from kivy.uix.scrollview import ScrollView from kivy.properties import StringProperty, BooleanProperty -from worlds.sc2.client import SC2Context, calc_unfinished_nodes, force_settings_save_on_close -from worlds.sc2.item_descriptions import item_descriptions +from worlds.sc2.client import SC2Context, calc_unfinished_nodes +from worlds.sc2.item.item_descriptions import item_descriptions from worlds.sc2.mission_tables import lookup_id_to_mission, campaign_race_exceptions, \ SC2Mission, SC2Race from worlds.sc2.locations import LocationType, lookup_location_id_to_type, lookup_location_id_to_flags diff --git a/worlds/sc2/items.py b/worlds/sc2/item/__init__.py similarity index 96% rename from worlds/sc2/items.py rename to worlds/sc2/item/__init__.py index d81e16b0e75a..31528e46f508 100644 --- a/worlds/sc2/items.py +++ b/worlds/sc2/item/__init__.py @@ -3,7 +3,7 @@ from typing import Optional from BaseClasses import Item, ItemClassification -from worlds.sc2.item_tables import ItemData +from worlds.sc2.item.item_tables import ItemData class ItemFilterFlags(enum.IntFlag): diff --git a/worlds/sc2/item_descriptions.py b/worlds/sc2/item/item_descriptions.py similarity index 98% rename from worlds/sc2/item_descriptions.py rename to worlds/sc2/item/item_descriptions.py index e5845704aaa0..50d4ed326b09 100644 --- a/worlds/sc2/item_descriptions.py +++ b/worlds/sc2/item/item_descriptions.py @@ -3,7 +3,7 @@ """ import inspect -from . import item_names, item_tables +from worlds.sc2.item import item_tables, item_names WEAPON_ARMOR_UPGRADE_NOTE = inspect.cleandoc(""" Must be researched during the mission if the mission type isn't set to auto-unlock generic upgrades. @@ -751,7 +751,8 @@ def _ability_desc(unit_name_plural: str, ability_name: str, ability_description: item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL: "Infested Liberators instantly transform into a cloud of microscopic organisms while attacking, reducing the damage they take by 85%.", item_names.INFESTED_LIBERATOR_VIRAL_CONTAMINATION: "Increases the damage Infested Liberators deal to their primary target by 100%.", item_names.FRIGHTFUL_FLESHWELDER_INFESTED_SIEGE_TANK: _get_resource_efficiency_desc(item_names.INFESTED_SIEGE_TANK), - item_names.FRIGHTFUL_FLESHWELDER_INFESTED_DIAMONDBACK: _get_resource_efficiency_desc(item_names.INFESTED_DIAMONDBACK), + item_names.FRIGHTFUL_FLESHWELDER_INFESTED_DIAMONDBACK: _get_resource_efficiency_desc( + item_names.INFESTED_DIAMONDBACK), item_names.FRIGHTFUL_FLESHWELDER_INFESTED_BANSHEE: _get_resource_efficiency_desc(item_names.INFESTED_BANSHEE), item_names.FRIGHTFUL_FLESHWELDER_INFESTED_LIBERATOR: _get_resource_efficiency_desc(item_names.INFESTED_LIBERATOR), item_names.ZERG_EXCAVATING_CLAWS: "Increases movement speed of uprooted Zerg structures, especially off creep. Also increases root speed.", @@ -969,8 +970,10 @@ def _ability_desc(unit_name_plural: str, ability_name: str, ability_description: item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: "Zealots, Sentinels, and Centurions gain increased movement speed.", item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: "Zealots, Sentinels, and Centurions gain +30 maximum shields.", item_names.ZEALOT_WHIRLWIND: "Zealot War Council upgrade. Gives Zealots the whirlwind ability, dealing damage in an area over 3 seconds.", - item_names.CENTURION_RESOURCE_EFFICIENCY: "Centurion War Council upgrade. " + _get_resource_efficiency_desc(item_names.CENTURION), - item_names.SENTINEL_RESOURCE_EFFICIENCY: "Sentinel War Council upgrade. " + _get_resource_efficiency_desc(item_names.SENTINEL), + item_names.CENTURION_RESOURCE_EFFICIENCY: "Centurion War Council upgrade. " + _get_resource_efficiency_desc( + item_names.CENTURION), + item_names.SENTINEL_RESOURCE_EFFICIENCY: "Sentinel War Council upgrade. " + _get_resource_efficiency_desc( + item_names.SENTINEL), item_names.STALKER_PHASE_REACTOR: "Stalker War Council upgrade. Stalkers restore 80 shields over 5 seconds after they Blink.", item_names.DRAGOON_PHALANX_SUIT: "Dragoon War Council upgrade. Dragoons gain +1 range, move slightly faster, and can form tighter formations.", item_names.INSTIGATOR_RESOURCE_EFFICIENCY: f"Instigator War Council upgrade. {_get_resource_efficiency_desc(item_names.INSTIGATOR)}", diff --git a/worlds/sc2/item_groups.py b/worlds/sc2/item/item_groups.py similarity index 98% rename from worlds/sc2/item_groups.py rename to worlds/sc2/item/item_groups.py index 7bfd49459631..9f8685c2fa2b 100644 --- a/worlds/sc2/item_groups.py +++ b/worlds/sc2/item/item_groups.py @@ -1,6 +1,6 @@ import typing -from . import item_names, items, item_tables -from .mission_tables import campaign_mission_table, SC2Campaign, SC2Mission, SC2Race +from worlds.sc2.item import item_tables, item_names +from worlds.sc2.mission_tables import campaign_mission_table, SC2Campaign, SC2Mission, SC2Race """ Item name groups, given to Archipelago and used in YAMLs and /received filtering. @@ -42,7 +42,7 @@ 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('_')]] + 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: @@ -183,7 +183,8 @@ def get_all_group_names(cls) -> typing.Set[str]: ] 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) + 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() @@ -238,7 +239,7 @@ def get_all_group_names(cls) -> typing.Set[str]: ] 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], + if item_data.type == item_tables.TerranItemType.Nova_Gear], item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, ] item_name_groups[ItemGroupNames.WOL_UNITS] = wol_units = [ @@ -425,7 +426,8 @@ def get_all_group_names(cls) -> typing.Set[str]: item_names.OMEGA_WORM] item_name_groups[ItemGroupNames.ZERG_UNITS] = zerg_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, item_tables.ZergItemType.Morph) + if item_data.type in ( + item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary, item_tables.ZergItemType.Morph) and item_name not in zerg_buildings ] # For W/A upgrades diff --git a/worlds/sc2/item_names.py b/worlds/sc2/item/item_names.py similarity index 100% rename from worlds/sc2/item_names.py rename to worlds/sc2/item/item_names.py diff --git a/worlds/sc2/item_tables.py b/worlds/sc2/item/item_tables.py similarity index 98% rename from worlds/sc2/item_tables.py rename to worlds/sc2/item/item_tables.py index 4be9239bd4a3..fe0eae98d337 100644 --- a/worlds/sc2/item_tables.py +++ b/worlds/sc2/item/item_tables.py @@ -1,12 +1,12 @@ from typing import * -from BaseClasses import Item, ItemClassification +from BaseClasses import ItemClassification import typing import enum -from .mission_tables import SC2Mission, SC2Race, SC2Campaign -from . import item_names -from .mission_order.presets_static import get_used_layout_names +from ..mission_tables import SC2Mission, SC2Race, SC2Campaign +from ..item import item_names +from ..mission_order.presets_static import get_used_layout_names class ItemTypeEnum(enum.Enum): @@ -247,19 +247,19 @@ def get_full_item_list(): ItemData(61 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 10, SC2Race.TERRAN), # Some other items are moved to Upgrade group because of the way how the bot message is parsed - item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON: ItemData(100 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 0, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR: ItemData(102 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 4, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON: ItemData(103 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 8, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR: ItemData(104 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 12, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON: ItemData(105 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 16, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR: ItemData(106 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 20, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON: ItemData(100 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 0, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR: ItemData(102 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 4, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON: ItemData(103 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 8, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR: ItemData(104 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 12, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON: ItemData(105 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 16, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR: ItemData(106 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 20, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), # Bundles - item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: ItemData(107 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: ItemData(108 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: ItemData(109 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: ItemData(110 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: ItemData(111 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: ItemData(112 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: ItemData(107 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: ItemData(108 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: ItemData(109 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: ItemData(110 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: ItemData(111 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: ItemData(112 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), # Unit and structure upgrades item_names.BUNKER_PROJECTILE_ACCELERATOR: @@ -524,7 +524,7 @@ def get_full_item_list(): parent_item=item_names.HERC), item_names.REAPER_RESOURCE_EFFICIENCY: ItemData(287 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 18, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.REAPER,), + classification=ItemClassification.progression, parent_item=item_names.REAPER, ), item_names.REAPER_KINETIC_FOAM: ItemData(288 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 19, SC2Race.TERRAN, classification=ItemClassification.filler, parent_item=item_names.REAPER), @@ -1196,17 +1196,17 @@ def get_full_item_list(): ItemData(24 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 23, SC2Race.ZERG, classification=ItemClassification.progression), - item_names.PROGRESSIVE_ZERG_MELEE_ATTACK: ItemData(100 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 0, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK: ItemData(101 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 4, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE: ItemData(102 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 8, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_FLYER_ATTACK: ItemData(103 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 12, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE: ItemData(104 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 16, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK: ItemData(100 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 0, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK: ItemData(101 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 4, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE: ItemData(102 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 8, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK: ItemData(103 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 12, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE: ItemData(104 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 16, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), # Bundles - item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: ItemData(105 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: ItemData(106 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: ItemData(107 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: ItemData(108 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: ItemData(105 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: ItemData(106 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: ItemData(107 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: ItemData(108 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), item_names.ZERGLING_HARDENED_CARAPACE: ItemData(200 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 0, SC2Race.ZERG, parent_item=item_names.ZERGLING), @@ -1718,17 +1718,17 @@ def get_full_item_list(): classification=ItemClassification.progression), # Protoss Upgrades - item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON: ItemData(100 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 0, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR: ItemData(101 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 4, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_SHIELDS: ItemData(102 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 8, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON: ItemData(103 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 12, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR: ItemData(104 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 16, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON: ItemData(100 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 0, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR: ItemData(101 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 4, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_SHIELDS: ItemData(102 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 8, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON: ItemData(103 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 12, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR: ItemData(104 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 16, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), # Bundles - item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: ItemData(105 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: ItemData(106 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: ItemData(107 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: ItemData(108 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), - item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression , quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: ItemData(105 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: ItemData(106 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: ItemData(107 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: ItemData(108 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), # Protoss Buildings item_names.PHOTON_CANNON: ItemData(200 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 0, SC2Race.PROTOSS, classification=ItemClassification.progression), diff --git a/worlds/sc2/locations.py b/worlds/sc2/locations.py index b87365ca7aad..15486c1b33b0 100644 --- a/worlds/sc2/locations.py +++ b/worlds/sc2/locations.py @@ -1,6 +1,6 @@ import enum -from typing import List, Tuple, Optional, Callable, NamedTuple, Set, Any, TYPE_CHECKING -from . import item_names +from typing import List, Tuple, Optional, Callable, NamedTuple, Set, TYPE_CHECKING +from .item import item_names from .options import (get_option_value, RequiredTactics, LocationInclusion, KerriganPresence, ) @@ -574,14 +574,14 @@ def get_locations(world: Optional['SC2World']) -> Tuple[LocationData, ...]: lambda state: ( logic.terran_basic_anti_air(state) and (adv_tactics - or logic.terran_common_unit(state) - or state.has(item_names.REAPER, player))) + or logic.terran_common_unit(state) + or state.has(item_names.REAPER, player))) ), make_location_data(SC2Mission.DEVILS_PLAYGROUND.mission_name, "Zerg Cleared", SC2WOL_LOC_ID_OFFSET + 1308, LocationType.CHALLENGE, lambda state: ( logic.terran_competent_anti_air(state) and (logic.terran_common_unit(state) - or state.has(item_names.REAPER, player))) + or state.has(item_names.REAPER, player))) ), make_location_data(SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, "Victory", SC2WOL_LOC_ID_OFFSET + 1400, LocationType.VICTORY, logic.welcome_to_the_jungle_requirement @@ -2796,8 +2796,8 @@ def get_locations(world: Optional['SC2World']) -> Tuple[LocationData, ...]: lambda state: ( logic.zerg_basic_kerriganless_anti_air(state) and (adv_tactics - or logic.zerg_common_unit(state) - or state.has(item_names.HUNTERLING, player))) + or logic.zerg_common_unit(state) + or state.has(item_names.HUNTERLING, player))) ), make_location_data(SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, "Zerg Cleared", SC2_RACESWAP_LOC_ID_OFFSET + 2508, LocationType.CHALLENGE, lambda state: ( diff --git a/worlds/sc2/mission_order/entry_rules.py b/worlds/sc2/mission_order/entry_rules.py index d4690d7a6c7c..221123d0bc24 100644 --- a/worlds/sc2/mission_order/entry_rules.py +++ b/worlds/sc2/mission_order/entry_rules.py @@ -1,10 +1,10 @@ from __future__ import annotations -from typing import Set, Callable, Dict, List, Union, TYPE_CHECKING, Any, Tuple +from typing import Set, Callable, Dict, List, Union, TYPE_CHECKING, Any from abc import ABC, abstractmethod from dataclasses import dataclass from ..mission_tables import SC2Mission -from ..item_tables import item_table +from ..item.item_tables import item_table from BaseClasses import CollectionState if TYPE_CHECKING: diff --git a/worlds/sc2/mission_order/options.py b/worlds/sc2/mission_order/options.py index 834b1065465e..4d5262d35ac9 100644 --- a/worlds/sc2/mission_order/options.py +++ b/worlds/sc2/mission_order/options.py @@ -9,8 +9,8 @@ from ..mission_tables import lookup_name_to_mission from ..mission_groups import mission_groups -from ..item_tables import item_table -from ..item_groups import item_name_groups +from ..item.item_tables import item_table +from ..item.item_groups import item_name_groups from .structs import Difficulty, LayoutType, GENERIC_KEY_NAME from .layout_types import Column, Grid, Hopscotch, Gauntlet, Blitz from .presets_static import ( diff --git a/worlds/sc2/mission_order/structs.py b/worlds/sc2/mission_order/structs.py index 0859febee2e3..675b31324d28 100644 --- a/worlds/sc2/mission_order/structs.py +++ b/worlds/sc2/mission_order/structs.py @@ -7,8 +7,8 @@ from BaseClasses import Region, Location, CollectionState, Entrance from ..mission_tables import SC2Mission, lookup_name_to_mission, MissionFlag, lookup_id_to_mission, get_goal_location -from ..item_tables import named_layout_key_item_table, named_campaign_key_item_table -from .. import item_names +from ..item.item_tables import named_layout_key_item_table, named_campaign_key_item_table +from ..item import item_names from .layout_types import LayoutType from .entry_rules import EntryRule, SubRuleEntryRule, CountMissionsEntryRule, BeatMissionsEntryRule, SubRuleRuleData, ItemEntryRule from .mission_pools import SC2MOGenMissionPools, Difficulty, modified_difficulty_thresholds diff --git a/worlds/sc2/options.py b/worlds/sc2/options.py index d16433bf6b16..51b959ecb48f 100644 --- a/worlds/sc2/options.py +++ b/worlds/sc2/options.py @@ -1,7 +1,6 @@ -from dataclasses import dataclass, fields, Field +from dataclasses import fields, Field from typing import * -from Utils import is_iterable_except_str from Options import * from Utils import get_fuzzy_results from BaseClasses import PlandoOptions @@ -9,7 +8,7 @@ campaign_mission_table, SC2Race, MissionFlag from .mission_groups import mission_groups, MissionGroupNames from .mission_order.options import CustomMissionOrder -from . import item_names +from .item import item_names if TYPE_CHECKING: from worlds.AutoWorld import World @@ -770,7 +769,7 @@ def verify(self, world: Type['World'], player_name: str, plando_options: PlandoO self.value = new_value for item_name in self.value: if item_name not in world.item_names: - from . import item_groups + from .item import item_groups picks = get_fuzzy_results( item_name, list(world.item_names) + list(item_groups.ItemGroupNames.get_all_group_names()), diff --git a/worlds/sc2/pool_filter.py b/worlds/sc2/pool_filter.py index c54630062689..39afea5a8470 100644 --- a/worlds/sc2/pool_filter.py +++ b/worlds/sc2/pool_filter.py @@ -2,11 +2,10 @@ from typing import Callable, Dict, List, Set, Union, Tuple, TYPE_CHECKING, Iterable from BaseClasses import Item, Location -from . import item_groups, item_names -from .item_tables import ( +from worlds.sc2.item.item_tables import ( get_full_item_list, spider_mine_sources, second_pass_placeable_items, ) -from .items import StarcraftItem, ItemFilterFlags +from .item import StarcraftItem, ItemFilterFlags, item_groups, item_names from .options import get_option_value, EnableMorphling, RequiredTactics if TYPE_CHECKING: @@ -272,11 +271,14 @@ def attempt_removal(item: StarcraftItem) -> bool: item_names.TERRAN_INFANTRY_UPGRADE_PREFIX) or item_name == item_names.ORBITAL_STRIKE)] if not FACTORY_UNITS & logical_inventory_set: - inventory = [item for item in inventory if not item.name.startswith(item_names.TERRAN_VEHICLE_UPGRADE_PREFIX)] - unused_items = [item_name for item_name in unused_items if not item_name.startswith(item_names.TERRAN_VEHICLE_UPGRADE_PREFIX)] + inventory = [item for item in inventory if not item.name.startswith( + item_names.TERRAN_VEHICLE_UPGRADE_PREFIX)] + unused_items = [item_name for item_name in unused_items if not item_name.startswith( + item_names.TERRAN_VEHICLE_UPGRADE_PREFIX)] if not STARPORT_UNITS & logical_inventory_set: inventory = [item for item in inventory if not item.name.startswith(item_names.TERRAN_SHIP_UPGRADE_PREFIX)] - unused_items = [item_name for item_name in unused_items if not item_name.startswith(item_names.TERRAN_SHIP_UPGRADE_PREFIX)] + unused_items = [item_name for item_name in unused_items if not item_name.startswith( + item_names.TERRAN_SHIP_UPGRADE_PREFIX)] if not {item_names.MEDIVAC, item_names.HERCULES} & logical_inventory_set: inventory = [item for item in inventory if item.name != item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK] unused_items = [item_name for item_name in unused_items if item_name != item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK] @@ -301,7 +303,7 @@ def attempt_removal(item: StarcraftItem) -> bool: if not {item_names.COMMAND_CENTER_SCANNER_SWEEP, item_names.COMMAND_CENTER_MULE, item_names.COMMAND_CENTER_EXTRA_SUPPLIES} & logical_inventory_set: # No orbital Command Spells inventory = [item for item in inventory if item.name != item_names.PLANETARY_FORTRESS_ORBITAL_MODULE] - unused_items = [item_name for item_name in unused_items if item_name !=item_names.PLANETARY_FORTRESS_ORBITAL_MODULE] + unused_items = [item_name for item_name in unused_items if item_name != item_names.PLANETARY_FORTRESS_ORBITAL_MODULE] locked_items = [item for item in locked_items if item.name != item_names.PLANETARY_FORTRESS_ORBITAL_MODULE] # No weapon upgrades for Dominion Trooper -> drop weapon is useless if not { @@ -336,8 +338,10 @@ def attempt_removal(item: StarcraftItem) -> bool: unused_items = [item_name for item_name in unused_items if item_name != item_names.BANELING_RAPID_METAMORPH] if not {item_names.MUTALISK, item_names.CORRUPTOR, item_names.SCOURGE} & logical_inventory_set: inventory = [item for item in inventory if not item.name.startswith(item_names.ZERG_FLYER_UPGRADE_PREFIX)] - locked_items = [item for item in locked_items if not item.name.startswith(item_names.ZERG_FLYER_UPGRADE_PREFIX)] - unused_items = [item_name for item_name in unused_items if not item_name.startswith(item_names.ZERG_FLYER_UPGRADE_PREFIX)] + locked_items = [item for item in locked_items if not item.name.startswith( + item_names.ZERG_FLYER_UPGRADE_PREFIX)] + unused_items = [item_name for item_name in unused_items if not item_name.startswith( + item_names.ZERG_FLYER_UPGRADE_PREFIX)] # T3 items removal rules - remove morph and its upgrades if the basic unit isn't in and morphling is unavailable if not {item_names.MUTALISK, item_names.CORRUPTOR} & logical_inventory_set and not enable_morphling: inventory = [item for item in inventory if not item.name.endswith("(Mutalisk/Corruptor)")] diff --git a/worlds/sc2/rules.py b/worlds/sc2/rules.py index eb371e2692e5..ef07df2bc58a 100644 --- a/worlds/sc2/rules.py +++ b/worlds/sc2/rules.py @@ -7,14 +7,13 @@ GrantStoryTech, GrantStoryLevels, TakeOverAIAllies, SpearOfAdunAutonomouslyCastAbilityPresence, get_enabled_campaigns, MissionOrder, EnableMorphling, get_enabled_races ) -from .item_tables import ( +from worlds.sc2.item.item_tables import ( tvx_defense_ratings, tvz_defense_ratings, kerrigan_actives, tvx_air_defense_ratings, kerrigan_levels, get_full_item_list, zvx_air_defense_ratings, zvx_defense_ratings, pvx_defense_ratings, - pvz_defense_ratings, no_logic_basic_units, advanced_basic_units, basic_units, upgrade_bundles, - upgrade_bundle_inverted_lookup, WEAPON_ARMOR_UPGRADE_MAX_LEVEL + pvz_defense_ratings, no_logic_basic_units, advanced_basic_units, basic_units, upgrade_bundle_inverted_lookup, WEAPON_ARMOR_UPGRADE_MAX_LEVEL ) from .mission_tables import SC2Race, SC2Campaign -from . import item_names, item_groups +from .item import item_groups, item_names if TYPE_CHECKING: from . import SC2World @@ -148,7 +147,7 @@ def terran_air(self, state: CollectionState) -> bool: """ return (state.has_any({item_names.VIKING, item_names.WRAITH, item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) or self.advanced_tactics and state.has_any({item_names.HERCULES, item_names.MEDIVAC}, self.player) and self.terran_common_unit(state) - ) + ) def terran_air_anti_air(self, state: CollectionState) -> bool: """ @@ -284,9 +283,9 @@ def terran_basic_anti_air(self, state: CollectionState) -> bool: item_names.EMPERORS_GUARDIAN, item_names.NIGHT_HAWK, ), self.player) or ( - state.has(item_names.MEDIVAC, self.player) - and state.has_any((item_names.SIEGE_TANK, item_names.SHOCK_DIVISION), self.player) - and state.count(item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK, self.player) >= 2 + state.has(item_names.MEDIVAC, self.player) + and state.has_any((item_names.SIEGE_TANK, item_names.SHOCK_DIVISION), self.player) + and state.count(item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK, self.player) >= 2 ) ) ) @@ -301,7 +300,8 @@ def terran_defense_rating(self, state: CollectionState, zerg_enemy: bool, air_en """ defense_score = sum((tvx_defense_ratings[item] for item in tvx_defense_ratings if state.has(item, self.player))) # Manned Bunker - if state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) and state.has(item_names.BUNKER, self.player): + if state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) and state.has( + item_names.BUNKER, self.player): defense_score += 3 elif zerg_enemy and state.has(item_names.FIREBAT, self.player) and state.has(item_names.BUNKER, self.player): defense_score += 2 @@ -351,8 +351,8 @@ def terran_competent_comp(self, state: CollectionState) -> bool: state.has(item_names.BATTLECRUISER, self.player) and self.terran_common_unit(state) and ( - self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 - or state.has(item_names.BATTLECRUISER_ATX_LASER_BATTERY, self.player) + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 + or state.has(item_names.BATTLECRUISER_ATX_LASER_BATTERY, self.player) ) ) @@ -446,7 +446,7 @@ def marine_medic_upgrade(self, state: CollectionState) -> bool: }, self.player) or (state.count(item_names.MARINE_PROGRESSIVE_STIMPACK, self.player) >= 2 and state.has_group("Missions", self.player, 1) - ) + ) ) def terran_survives_rip_field(self, state: CollectionState) -> bool: @@ -475,16 +475,16 @@ def terran_sustainable_mech_heal(self, state: CollectionState) -> bool: :return: """ return ( - state.has(item_names.SCIENCE_VESSEL, self.player) - or ( + state.has(item_names.SCIENCE_VESSEL, self.player) + or ( state.has_any({item_names.MEDIC, item_names.FIELD_RESPONSE_THETA}, self.player) and state.has(item_names.MEDIC_ADAPTIVE_MEDPACKS, self.player) ) - or state.count(item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 3 - or (self.advanced_tactics + or state.count(item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 3 + or (self.advanced_tactics and ( - state.has_all({item_names.RAVEN, item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player) - or state.count(item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 2 + state.has_all({item_names.RAVEN, item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player) + or state.count(item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 2 ) ) ) @@ -549,8 +549,8 @@ def terran_respond_to_colony_infestations(self, state: CollectionState) -> bool: and ( self.terran_air_anti_air(state) or ( - state.has_any({item_names.BATTLECRUISER, item_names.VALKYRIE}, self.player) - and self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 + state.has_any({item_names.BATTLECRUISER, item_names.VALKYRIE}, self.player) + and self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 ) ) and self.terran_defense_rating(state, True) >= 3 @@ -930,7 +930,7 @@ def zerg_competent_defense(self, state: CollectionState) -> bool: ) or ( self.advanced_tactics and (self.morph_viper(state) - or state.has(item_names.SPINE_CRAWLER, self.player)) + or state.has(item_names.SPINE_CRAWLER, self.player)) ) ) ) @@ -966,9 +966,9 @@ def basic_kerrigan(self, state: CollectionState) -> bool: # Two non-ultimate abilities count = 0 for item in ( - item_names.KERRIGAN_KINETIC_BLAST, item_names.KERRIGAN_LEAPING_STRIKE, item_names.KERRIGAN_HEROIC_FORTITUDE, - item_names.KERRIGAN_CHAIN_REACTION, item_names.KERRIGAN_CRUSHING_GRIP, item_names.KERRIGAN_PSIONIC_SHIFT, - item_names.KERRIGAN_SPAWN_BANELINGS, item_names.KERRIGAN_INFEST_BROODLINGS, item_names.KERRIGAN_FURY + item_names.KERRIGAN_KINETIC_BLAST, item_names.KERRIGAN_LEAPING_STRIKE, item_names.KERRIGAN_HEROIC_FORTITUDE, + item_names.KERRIGAN_CHAIN_REACTION, item_names.KERRIGAN_CRUSHING_GRIP, item_names.KERRIGAN_PSIONIC_SHIFT, + item_names.KERRIGAN_SPAWN_BANELINGS, item_names.KERRIGAN_INFEST_BROODLINGS, item_names.KERRIGAN_FURY ): if state.has(item, self.player): count += 1 diff --git a/worlds/sc2/test/test_custom_mission_orders.py b/worlds/sc2/test/test_custom_mission_orders.py index d0a5397e950a..11244e99141e 100644 --- a/worlds/sc2/test/test_custom_mission_orders.py +++ b/worlds/sc2/test/test_custom_mission_orders.py @@ -4,8 +4,7 @@ from .test_base import Sc2SetupTestBase from .. import MissionFlag -from .. import item_names -from .. import item_tables +from ..item import item_tables, item_names from BaseClasses import ItemClassification class TestCustomMissionOrders(Sc2SetupTestBase): diff --git a/worlds/sc2/test/test_generation.py b/worlds/sc2/test/test_generation.py index d8313c98f3cf..3739ce022d0c 100644 --- a/worlds/sc2/test/test_generation.py +++ b/worlds/sc2/test/test_generation.py @@ -4,7 +4,8 @@ from typing import * from .test_base import Sc2SetupTestBase -from .. import item_groups, item_names, mission_groups, mission_tables, options, locations, item_tables +from .. import mission_groups, mission_tables, options, locations +from ..item import item_groups, item_tables, item_names from .. import get_all_missions, get_first_mission diff --git a/worlds/sc2/test/test_itemdescriptions.py b/worlds/sc2/test/test_itemdescriptions.py index dfefc4e24270..a4fd6d5c2846 100644 --- a/worlds/sc2/test/test_itemdescriptions.py +++ b/worlds/sc2/test/test_itemdescriptions.py @@ -1,7 +1,6 @@ import unittest -from .. import item_tables -from .. import item_descriptions +from ..item import item_descriptions, item_tables class TestItemDescriptions(unittest.TestCase): diff --git a/worlds/sc2/test/test_itemgroups.py b/worlds/sc2/test/test_itemgroups.py index 04ba9d9889fe..8b4a0939b905 100644 --- a/worlds/sc2/test/test_itemgroups.py +++ b/worlds/sc2/test/test_itemgroups.py @@ -3,7 +3,7 @@ """ import unittest -from .. import item_groups, item_tables +from ..item import item_groups, item_tables class ItemGroupsUnitTests(unittest.TestCase): @@ -19,7 +19,8 @@ def test_all_production_structure_groups_capture_all_units(self) -> None: def test_terran_original_progressive_group_fully_contained_in_wol_upgrades(self) -> None: for item_name in item_groups.terran_original_progressive_upgrades: - self.assertIn(item_tables.item_table[item_name].type, (item_tables.TerranItemType.Progressive, item_tables.TerranItemType.Progressive_2), f"{item_name} is not progressive") + self.assertIn(item_tables.item_table[item_name].type, ( + item_tables.TerranItemType.Progressive, item_tables.TerranItemType.Progressive_2), f"{item_name} is not progressive") self.assertIn(item_name, item_groups.wol_upgrades) def test_all_items_in_stimpack_group_are_stimpacks(self) -> None: diff --git a/worlds/sc2/test/test_items.py b/worlds/sc2/test/test_items.py index 48595f0b2f4b..49ec698c3bc6 100644 --- a/worlds/sc2/test/test_items.py +++ b/worlds/sc2/test/test_items.py @@ -1,7 +1,7 @@ import unittest from typing import List, Set -from worlds.sc2 import item_tables +from worlds.sc2.item import item_tables class TestItems(unittest.TestCase): diff --git a/worlds/sc2/test/test_options.py b/worlds/sc2/test/test_options.py index 4debdd857126..fb10f020c084 100644 --- a/worlds/sc2/test/test_options.py +++ b/worlds/sc2/test/test_options.py @@ -1,7 +1,8 @@ import unittest from typing import Set, Dict, List -from .. import mission_tables, options, item_tables +from .. import mission_tables, options +from ..item import item_tables class TestOptions(unittest.TestCase): diff --git a/worlds/sc2/test/test_rules.py b/worlds/sc2/test/test_rules.py index b78327679f89..c7cbf6768023 100644 --- a/worlds/sc2/test/test_rules.py +++ b/worlds/sc2/test/test_rules.py @@ -4,9 +4,10 @@ import unittest from typing import List, Set, Iterable -from BaseClasses import ItemClassification, MultiWorld +from BaseClasses import ItemClassification from Options import * # Mandatory -from worlds.sc2 import item_tables, options, locations +from worlds.sc2 import options, locations +from worlds.sc2.item import item_tables class TestInventory: diff --git a/worlds/sc2/test/test_usecases.py b/worlds/sc2/test/test_usecases.py index 65b531834157..26bb9ed21248 100644 --- a/worlds/sc2/test/test_usecases.py +++ b/worlds/sc2/test/test_usecases.py @@ -3,7 +3,8 @@ """ from .test_base import Sc2SetupTestBase -from .. import get_all_missions, item_groups, item_names, item_tables, mission_tables, options +from .. import get_all_missions, mission_tables, options +from ..item import item_groups, item_tables, item_names from ..mission_tables import SC2Race, SC2Mission, SC2Campaign, MissionFlag From 58378c9a9c3c9e60b7855ddf2243c9ad70c0bd57 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 17:39:48 +0100 Subject: [PATCH 10/13] Cleanup --- worlds/sc2/item/item_tables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/sc2/item/item_tables.py b/worlds/sc2/item/item_tables.py index fe0eae98d337..dcf36bd9595b 100644 --- a/worlds/sc2/item/item_tables.py +++ b/worlds/sc2/item/item_tables.py @@ -524,7 +524,7 @@ def get_full_item_list(): parent_item=item_names.HERC), item_names.REAPER_RESOURCE_EFFICIENCY: ItemData(287 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 18, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=item_names.REAPER, ), + classification=ItemClassification.progression, parent_item=item_names.REAPER), item_names.REAPER_KINETIC_FOAM: ItemData(288 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 19, SC2Race.TERRAN, classification=ItemClassification.filler, parent_item=item_names.REAPER), From 2942d2eb3a2e9b87e6955149d2871290ca65dfc1 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 17:46:16 +0100 Subject: [PATCH 11/13] Fix test errors --- worlds/sc2/test/test_rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/sc2/test/test_rules.py b/worlds/sc2/test/test_rules.py index c7cbf6768023..a52cc4aad61f 100644 --- a/worlds/sc2/test/test_rules.py +++ b/worlds/sc2/test/test_rules.py @@ -4,7 +4,7 @@ import unittest from typing import List, Set, Iterable -from BaseClasses import ItemClassification +from BaseClasses import ItemClassification, MultiWorld from Options import * # Mandatory from worlds.sc2 import options, locations from worlds.sc2.item import item_tables From ef2d6f7e5bce81c1bc34c847578fb2eaab00b704 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 22:03:57 +0100 Subject: [PATCH 12/13] Code cleanup --- worlds/sc2/item/__init__.py | 4 ++-- worlds/sc2/item/item_groups.py | 5 +++-- worlds/sc2/pool_filter.py | 16 ++++++++-------- worlds/sc2/rules.py | 11 +++++++++-- worlds/sc2/test/test_generation.py | 6 +++--- 5 files changed, 25 insertions(+), 17 deletions(-) diff --git a/worlds/sc2/item/__init__.py b/worlds/sc2/item/__init__.py index 31528e46f508..b177381d21d6 100644 --- a/worlds/sc2/item/__init__.py +++ b/worlds/sc2/item/__init__.py @@ -38,5 +38,5 @@ class StarcraftItem(Item): filter_flags: ItemFilterFlags = ItemFilterFlags.Available def __init__(self, name: str, classification: ItemClassification, code: Optional[int], player: int, filter_flags: ItemFilterFlags = ItemFilterFlags.Available): - Item.__init__(self, name, classification, code, player) - self.filter_flags = filter_flags \ No newline at end of file + super().__init__(name, classification, code, player) + self.filter_flags = filter_flags diff --git a/worlds/sc2/item/item_groups.py b/worlds/sc2/item/item_groups.py index 9f8685c2fa2b..a31eecaac9b5 100644 --- a/worlds/sc2/item/item_groups.py +++ b/worlds/sc2/item/item_groups.py @@ -427,8 +427,9 @@ def get_all_group_names(cls) -> typing.Set[str]: item_name_groups[ItemGroupNames.ZERG_UNITS] = zerg_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, item_tables.ZergItemType.Morph) - and item_name not in zerg_buildings + item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary, item_tables.ZergItemType.Morph + ) + and item_name not in zerg_buildings ] # For W/A upgrades zerg_ground_units = [ diff --git a/worlds/sc2/pool_filter.py b/worlds/sc2/pool_filter.py index 39afea5a8470..99c2ae80197a 100644 --- a/worlds/sc2/pool_filter.py +++ b/worlds/sc2/pool_filter.py @@ -93,7 +93,7 @@ def attempt_removal(item: StarcraftItem) -> bool: return True # Process Excluded items, validate if the item can get actually excluded - excluded_items: List[StarcraftItem] = [stacrcraft_item for stacrcraft_item in inventory if ItemFilterFlags.Excluded in stacrcraft_item.filter_flags] + excluded_items: List[StarcraftItem] = [starcraft_item for starcraft_item in inventory if ItemFilterFlags.Excluded in starcraft_item.filter_flags] self.world.random.shuffle(excluded_items) for excluded_item in excluded_items: logical_inventory_copy = copy.copy(self.logical_inventory) @@ -164,7 +164,7 @@ def attempt_removal(item: StarcraftItem) -> bool: known_parents = [item for item in known_items if item in parent_items] for parent in known_parents: child_items = self.item_children[parent] - removable_upgrades = [stacrcraft_item for stacrcraft_item in inventory if stacrcraft_item in child_items] + removable_upgrades = [starcraft_item for starcraft_item in inventory if starcraft_item in child_items] locked_upgrade_count = sum(1 if item in child_items else 0 for item in known_items) self.world.random.shuffle(removable_upgrades) while len(removable_upgrades) > 0 and locked_upgrade_count < minimum_upgrades: @@ -182,16 +182,16 @@ def attempt_removal(item: StarcraftItem) -> bool: raise Exception(f"Too many items excluded - couldn't satisfy access rules for the following locations:\n{failed_locations}") # Optionally locking generic items - generic_items: List[StarcraftItem] = [stacrcraft_item for stacrcraft_item in inventory if stacrcraft_item.name in second_pass_placeable_items] + generic_items: List[StarcraftItem] = [starcraft_item for starcraft_item in inventory if starcraft_item.name in second_pass_placeable_items] reserved_generic_percent = get_option_value(self.world, "ensure_generic_items") / 100 reserved_generic_amount = int(len(generic_items) * reserved_generic_percent) removable_generic_items = [] self.world.random.shuffle(generic_items) - for stacrcraft_item in generic_items[:reserved_generic_amount]: - locked_items.append(copy_item(stacrcraft_item)) - inventory.remove(stacrcraft_item) - if stacrcraft_item.name not in self.logical_inventory: - removable_generic_items.append(stacrcraft_item) + for starcraft_item in generic_items[:reserved_generic_amount]: + locked_items.append(copy_item(starcraft_item)) + inventory.remove(starcraft_item) + if starcraft_item.name not in self.logical_inventory: + removable_generic_items.append(starcraft_item) # Main cull process unused_items: List[str] = [] # Reusable items for the second pass diff --git a/worlds/sc2/rules.py b/worlds/sc2/rules.py index ef07df2bc58a..e9e50c4ca9e6 100644 --- a/worlds/sc2/rules.py +++ b/worlds/sc2/rules.py @@ -145,9 +145,16 @@ def terran_air(self, state: CollectionState) -> bool: :param state: :return: """ - return (state.has_any({item_names.VIKING, item_names.WRAITH, item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) or self.advanced_tactics - and state.has_any({item_names.HERCULES, item_names.MEDIVAC}, self.player) and self.terran_common_unit(state) + return ( + state.has_any({ + item_names.VIKING, item_names.WRAITH, item_names.BANSHEE, item_names.BATTLECRUISER + }, self.player) + or ( + self.advanced_tactics + and state.has_any({item_names.HERCULES, item_names.MEDIVAC}, self.player) + and self.terran_common_unit(state) ) + ) def terran_air_anti_air(self, state: CollectionState) -> bool: """ diff --git a/worlds/sc2/test/test_generation.py b/worlds/sc2/test/test_generation.py index 3739ce022d0c..579338c4dc95 100644 --- a/worlds/sc2/test/test_generation.py +++ b/worlds/sc2/test/test_generation.py @@ -4,7 +4,7 @@ from typing import * from .test_base import Sc2SetupTestBase -from .. import mission_groups, mission_tables, options, locations +from .. import mission_groups, mission_tables, options, locations, SC2Mission from ..item import item_groups, item_tables, item_names from .. import get_all_missions, get_first_mission @@ -794,11 +794,11 @@ def test_locking_required_items(self): 'missions': [ { 'index': 0, - 'mission_pool': ['Liberation Day'] + 'mission_pool': [SC2Mission.LIBERATION_DAY.mission_name] }, { 'index': 1, - 'mission_pool': ['Supreme'] + 'mission_pool': [SC2Mission.SUPREME.mission_name] }, ] } From 024bfa55005ff42682a1a3953256681861e12395 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Sun, 27 Oct 2024 22:13:50 +0100 Subject: [PATCH 13/13] Minor cleanup --- worlds/sc2/test/test_usecases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/sc2/test/test_usecases.py b/worlds/sc2/test/test_usecases.py index 26bb9ed21248..c2a2dbb8dd23 100644 --- a/worlds/sc2/test/test_usecases.py +++ b/worlds/sc2/test/test_usecases.py @@ -230,7 +230,7 @@ def test_excluding_zerg_excludes_campaigns_and_items(self) -> None: 'enable_epilogue_missions': True, 'mission_order': options.MissionOrder.option_grid, 'excluded_missions': [ - "The Infinite Cycle" + SC2Mission.THE_INFINITE_CYCLE.mission_name ] } self.generate_world(world_options)