From 648d682add36ae4bae939a9252972e35e03eb8e1 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Fri, 15 Sep 2023 02:22:10 +0200 Subject: [PATCH] SC2 WoL - Mod, Item and Location update (#2113) Migrates SC2 WoL world to the new mod with new items and locations. The new mod has a different architecture making it more future proof (with planned adding of other campaigns). Also gets rid of several old bugs Adds new short game formats intended for sync games (Tiny Grid, Mini Gauntlet). The final mission isn't decided by campaign length anymore but it's configurable instead. Allow excluding missions for Vanilla Shuffled, corrected some documentation. NOTE: This is a squashed commit with Salz' HotS excluded (not ready for the release and I plan multi-campaign instead) --------- Co-authored-by: Matthew --- Starcraft2Client.py | 1050 +------------- .../static/icons/sc2/SC2_Lab_BioSteel_L1.png | Bin 0 -> 5945 bytes .../static/icons/sc2/SC2_Lab_BioSteel_L2.png | Bin 0 -> 6699 bytes .../static/icons/sc2/advanceballistics.png | Bin 0 -> 11624 bytes .../static/icons/sc2/autoturretblackops.png | Bin 0 -> 8834 bytes .../static/icons/sc2/biomechanicaldrone.png | Bin 0 -> 6999 bytes .../static/icons/sc2/burstcapacitors.png | Bin 0 -> 2579 bytes .../icons/sc2/crossspectrumdampeners.png | Bin 0 -> 5344 bytes .../static/static/icons/sc2/cyclone.png | Bin 0 -> 8524 bytes .../static/icons/sc2/cyclonerangeupgrade.png | Bin 0 -> 12682 bytes .../static/static/icons/sc2/drillingclaws.png | Bin 0 -> 8451 bytes .../static/icons/sc2/emergencythrusters.png | Bin 0 -> 6796 bytes .../static/icons/sc2/hellionbattlemode.png | Bin 0 -> 8210 bytes .../icons/sc2/high-explosive-spidermine.png | Bin 0 -> 14334 bytes .../static/icons/sc2/hyperflightrotors.png | Bin 0 -> 14285 bytes .../static/static/icons/sc2/hyperfluxor.png | Bin 0 -> 9261 bytes .../static/static/icons/sc2/impalerrounds.png | Bin 0 -> 4347 bytes .../static/icons/sc2/improvedburstlaser.png | Bin 0 -> 11115 bytes .../static/icons/sc2/improvedsiegemode.png | Bin 0 -> 14293 bytes .../static/icons/sc2/interferencematrix.png | Bin 0 -> 10537 bytes .../icons/sc2/internalizedtechmodule.png | Bin 0 -> 16425 bytes .../static/static/icons/sc2/jotunboosters.png | Bin 0 -> 5740 bytes .../static/static/icons/sc2/jumpjets.png | Bin 0 -> 17881 bytes .../static/icons/sc2/lasertargetingsystem.png | Bin 0 -> 14802 bytes .../static/static/icons/sc2/liberator.png | Bin 0 -> 9012 bytes .../static/static/icons/sc2/lockdown.png | Bin 0 -> 8289 bytes .../static/icons/sc2/magfieldaccelerator.png | Bin 0 -> 11459 bytes .../static/icons/sc2/magrailmunitions.png | Bin 0 -> 19193 bytes .../icons/sc2/medivacemergencythrusters.png | Bin 0 -> 8954 bytes .../icons/sc2/neosteelfortifiedarmor.png | Bin 0 -> 13032 bytes .../static/static/icons/sc2/opticalflare.png | Bin 0 -> 11440 bytes .../static/icons/sc2/optimizedlogistics.png | Bin 0 -> 13116 bytes .../static/icons/sc2/reapercombatdrugs.png | Bin 0 -> 7102 bytes .../static/static/icons/sc2/restoration.png | Bin 0 -> 7754 bytes .../static/icons/sc2/ripwavemissiles.png | Bin 0 -> 13628 bytes .../static/icons/sc2/shreddermissile.png | Bin 0 -> 9827 bytes .../icons/sc2/siegetank-spidermines.png | Bin 0 -> 12764 bytes .../static/icons/sc2/siegetankrange.png | Bin 0 -> 11833 bytes .../static/icons/sc2/specialordance.png | Bin 0 -> 12992 bytes .../static/static/icons/sc2/spidermine.png | Bin 0 -> 3872 bytes .../static/icons/sc2/staticempblast.png | Bin 0 -> 12094 bytes .../static/static/icons/sc2/superstimpack.png | Bin 0 -> 14901 bytes .../static/icons/sc2/targetingoptics.png | Bin 0 -> 8431 bytes .../static/icons/sc2/terran-cloak-color.png | Bin 0 -> 8134 bytes .../static/icons/sc2/terran-emp-color.png | Bin 0 -> 7693 bytes .../sc2/terrandefendermodestructureattack.png | Bin 0 -> 14017 bytes .../static/static/icons/sc2/thorsiegemode.png | Bin 0 -> 11345 bytes .../static/icons/sc2/transformationservos.png | Bin 0 -> 9215 bytes .../static/static/icons/sc2/valkyrie.png | Bin 0 -> 7490 bytes .../static/static/icons/sc2/warpjump.png | Bin 0 -> 8665 bytes .../icons/sc2/widowmine-attackrange.png | Bin 0 -> 13367 bytes .../icons/sc2/widowmine-deathblossom.png | Bin 0 -> 12946 bytes .../static/static/icons/sc2/widowmine.png | Bin 0 -> 5671 bytes .../static/icons/sc2/widowminehidden.png | Bin 0 -> 12777 bytes WebHostLib/static/styles/sc2wolTracker.css | 6 +- WebHostLib/templates/sc2wolTracker.html | 324 +++-- WebHostLib/tracker.py | 234 +++- setup.py | 2 +- worlds/_sc2common/bot/maps.py | 27 +- worlds/sc2wol/Client.py | 1201 +++++++++++++++++ worlds/sc2wol/Items.py | 235 +++- worlds/sc2wol/Locations.py | 490 +++++-- worlds/sc2wol/LogicMixin.py | 76 +- worlds/sc2wol/MissionTables.py | 34 +- worlds/sc2wol/Options.py | 283 +++- worlds/sc2wol/PoolFilter.py | 155 ++- worlds/sc2wol/Regions.py | 47 +- worlds/sc2wol/__init__.py | 160 ++- 68 files changed, 2856 insertions(+), 1468 deletions(-) create mode 100644 WebHostLib/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png create mode 100644 WebHostLib/static/static/icons/sc2/SC2_Lab_BioSteel_L2.png create mode 100644 WebHostLib/static/static/icons/sc2/advanceballistics.png create mode 100644 WebHostLib/static/static/icons/sc2/autoturretblackops.png create mode 100644 WebHostLib/static/static/icons/sc2/biomechanicaldrone.png create mode 100644 WebHostLib/static/static/icons/sc2/burstcapacitors.png create mode 100644 WebHostLib/static/static/icons/sc2/crossspectrumdampeners.png create mode 100644 WebHostLib/static/static/icons/sc2/cyclone.png create mode 100644 WebHostLib/static/static/icons/sc2/cyclonerangeupgrade.png create mode 100644 WebHostLib/static/static/icons/sc2/drillingclaws.png create mode 100644 WebHostLib/static/static/icons/sc2/emergencythrusters.png create mode 100644 WebHostLib/static/static/icons/sc2/hellionbattlemode.png create mode 100644 WebHostLib/static/static/icons/sc2/high-explosive-spidermine.png create mode 100644 WebHostLib/static/static/icons/sc2/hyperflightrotors.png create mode 100644 WebHostLib/static/static/icons/sc2/hyperfluxor.png create mode 100644 WebHostLib/static/static/icons/sc2/impalerrounds.png create mode 100644 WebHostLib/static/static/icons/sc2/improvedburstlaser.png create mode 100644 WebHostLib/static/static/icons/sc2/improvedsiegemode.png create mode 100644 WebHostLib/static/static/icons/sc2/interferencematrix.png create mode 100644 WebHostLib/static/static/icons/sc2/internalizedtechmodule.png create mode 100644 WebHostLib/static/static/icons/sc2/jotunboosters.png create mode 100644 WebHostLib/static/static/icons/sc2/jumpjets.png create mode 100644 WebHostLib/static/static/icons/sc2/lasertargetingsystem.png create mode 100644 WebHostLib/static/static/icons/sc2/liberator.png create mode 100644 WebHostLib/static/static/icons/sc2/lockdown.png create mode 100644 WebHostLib/static/static/icons/sc2/magfieldaccelerator.png create mode 100644 WebHostLib/static/static/icons/sc2/magrailmunitions.png create mode 100644 WebHostLib/static/static/icons/sc2/medivacemergencythrusters.png create mode 100644 WebHostLib/static/static/icons/sc2/neosteelfortifiedarmor.png create mode 100644 WebHostLib/static/static/icons/sc2/opticalflare.png create mode 100644 WebHostLib/static/static/icons/sc2/optimizedlogistics.png create mode 100644 WebHostLib/static/static/icons/sc2/reapercombatdrugs.png create mode 100644 WebHostLib/static/static/icons/sc2/restoration.png create mode 100644 WebHostLib/static/static/icons/sc2/ripwavemissiles.png create mode 100644 WebHostLib/static/static/icons/sc2/shreddermissile.png create mode 100644 WebHostLib/static/static/icons/sc2/siegetank-spidermines.png create mode 100644 WebHostLib/static/static/icons/sc2/siegetankrange.png create mode 100644 WebHostLib/static/static/icons/sc2/specialordance.png create mode 100644 WebHostLib/static/static/icons/sc2/spidermine.png create mode 100644 WebHostLib/static/static/icons/sc2/staticempblast.png create mode 100644 WebHostLib/static/static/icons/sc2/superstimpack.png create mode 100644 WebHostLib/static/static/icons/sc2/targetingoptics.png create mode 100644 WebHostLib/static/static/icons/sc2/terran-cloak-color.png create mode 100644 WebHostLib/static/static/icons/sc2/terran-emp-color.png create mode 100644 WebHostLib/static/static/icons/sc2/terrandefendermodestructureattack.png create mode 100644 WebHostLib/static/static/icons/sc2/thorsiegemode.png create mode 100644 WebHostLib/static/static/icons/sc2/transformationservos.png create mode 100644 WebHostLib/static/static/icons/sc2/valkyrie.png create mode 100644 WebHostLib/static/static/icons/sc2/warpjump.png create mode 100644 WebHostLib/static/static/icons/sc2/widowmine-attackrange.png create mode 100644 WebHostLib/static/static/icons/sc2/widowmine-deathblossom.png create mode 100644 WebHostLib/static/static/icons/sc2/widowmine.png create mode 100644 WebHostLib/static/static/icons/sc2/widowminehidden.png create mode 100644 worlds/sc2wol/Client.py diff --git a/Starcraft2Client.py b/Starcraft2Client.py index cdcdb39a..87b50d35 100644 --- a/Starcraft2Client.py +++ b/Starcraft2Client.py @@ -1,1049 +1,11 @@ from __future__ import annotations -import asyncio -import copy -import ctypes -import logging -import multiprocessing -import os.path -import re -import sys -import typing -import queue -import zipfile -import io -from pathlib import Path +import ModuleUpdate +ModuleUpdate.update() -# 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 +from worlds.sc2wol.Client import launch +import Utils if __name__ == "__main__": - init_logging("SC2Client", exception_logger="Client") - -logger = logging.getLogger("Client") -sc2_logger = logging.getLogger("Starcraft2") - -import nest_asyncio -from worlds._sc2common import bot -from worlds._sc2common.bot.data import Race -from worlds._sc2common.bot.main import run_game -from worlds._sc2common.bot.player import Bot -from worlds.sc2wol import SC2WoLWorld -from worlds.sc2wol.Items import lookup_id_to_name, item_table, ItemData, type_flaggroups -from worlds.sc2wol.Locations import SC2WOL_LOC_ID_OFFSET -from worlds.sc2wol.MissionTables import lookup_id_to_mission -from worlds.sc2wol.Regions import MissionInfo - -import colorama -from NetUtils import ClientStatus, NetworkItem, RawJSONtoTextParser -from MultiServer import mark_raw - -nest_asyncio.apply() -max_bonus: int = 8 -victory_modulo: int = 100 - - -class StarcraftClientProcessor(ClientCommandProcessor): - ctx: SC2Context - - def _cmd_difficulty(self, difficulty: str = "") -> bool: - """Overrides the current difficulty set for the seed. Takes the argument casual, normal, hard, or brutal""" - options = difficulty.split() - num_options = len(options) - - if num_options > 0: - difficulty_choice = options[0].lower() - if difficulty_choice == "casual": - self.ctx.difficulty_override = 0 - elif difficulty_choice == "normal": - self.ctx.difficulty_override = 1 - elif difficulty_choice == "hard": - self.ctx.difficulty_override = 2 - elif difficulty_choice == "brutal": - self.ctx.difficulty_override = 3 - else: - self.output("Unable to parse difficulty '" + options[0] + "'") - return False - - self.output("Difficulty set to " + options[0]) - return True - - else: - if self.ctx.difficulty == -1: - self.output("Please connect to a seed before checking difficulty.") - else: - self.output("Current difficulty: " + ["Casual", "Normal", "Hard", "Brutal"][self.ctx.difficulty]) - self.output("To change the difficulty, add the name of the difficulty after the command.") - return False - - def _cmd_disable_mission_check(self) -> bool: - """Disables the check to see if a mission is available to play. Meant for co-op runs where one player can play - the next mission in a chain the other player is doing.""" - self.ctx.missions_unlocked = True - sc2_logger.info("Mission check has been disabled") - return True - - def _cmd_play(self, mission_id: str = "") -> bool: - """Start a Starcraft 2 mission""" - - options = mission_id.split() - num_options = len(options) - - if num_options > 0: - mission_number = int(options[0]) - - self.ctx.play_mission(mission_number) - - else: - sc2_logger.info( - "Mission ID needs to be specified. Use /unfinished or /available to view ids for available missions.") - return False - - return True - - def _cmd_available(self) -> bool: - """Get what missions are currently available to play""" - - request_available_missions(self.ctx) - return True - - def _cmd_unfinished(self) -> bool: - """Get what missions are currently available to play and have not had all locations checked""" - - request_unfinished_missions(self.ctx) - return True - - @mark_raw - def _cmd_set_path(self, path: str = '') -> bool: - """Manually set the SC2 install directory (if the automatic detection fails).""" - if path: - os.environ["SC2PATH"] = path - is_mod_installed_correctly() - return True - else: - sc2_logger.warning("When using set_path, you must type the path to your SC2 install directory.") - return False - - def _cmd_download_data(self) -> bool: - """Download the most recent release of the necessary files for playing SC2 with - Archipelago. Will overwrite existing files.""" - if "SC2PATH" not in os.environ: - check_game_install_path() - - if os.path.exists(os.environ["SC2PATH"]+"ArchipelagoSC2Version.txt"): - with open(os.environ["SC2PATH"]+"ArchipelagoSC2Version.txt", "r") as f: - current_ver = f.read() - else: - current_ver = None - - tempzip, version = download_latest_release_zip('TheCondor07', 'Starcraft2ArchipelagoData', - current_version=current_ver, force_download=True) - - if tempzip != '': - try: - zipfile.ZipFile(tempzip).extractall(path=os.environ["SC2PATH"]) - sc2_logger.info(f"Download complete. Version {version} installed.") - with open(os.environ["SC2PATH"]+"ArchipelagoSC2Version.txt", "w") as f: - f.write(version) - finally: - os.remove(tempzip) - else: - sc2_logger.warning("Download aborted/failed. Read the log for more information.") - return False - return True - - -class SC2Context(CommonContext): - command_processor = StarcraftClientProcessor - game = "Starcraft 2 Wings of Liberty" - items_handling = 0b111 - difficulty = -1 - all_in_choice = 0 - mission_order = 0 - mission_req_table: typing.Dict[str, MissionInfo] = {} - final_mission: int = 29 - announcements = queue.Queue() - sc2_run_task: typing.Optional[asyncio.Task] = None - missions_unlocked: bool = False # allow launching missions ignoring requirements - current_tooltip = None - last_loc_list = None - difficulty_override = -1 - mission_id_to_location_ids: typing.Dict[int, typing.List[int]] = {} - last_bot: typing.Optional[ArchipelagoBot] = None - - def __init__(self, *args, **kwargs): - super(SC2Context, self).__init__(*args, **kwargs) - self.raw_text_parser = RawJSONtoTextParser(self) - - async def server_auth(self, password_requested: bool = False): - if password_requested and not self.password: - await super(SC2Context, self).server_auth(password_requested) - await self.get_username() - await self.send_connect() - - def on_package(self, cmd: str, args: dict): - if cmd in {"Connected"}: - self.difficulty = args["slot_data"]["game_difficulty"] - self.all_in_choice = args["slot_data"]["all_in_map"] - slot_req_table = args["slot_data"]["mission_req"] - # Maintaining backwards compatibility with older slot data - self.mission_req_table = { - mission: MissionInfo( - **{field: value for field, value in mission_info.items() if field in MissionInfo._fields} - ) - for mission, mission_info in slot_req_table.items() - } - self.mission_order = args["slot_data"].get("mission_order", 0) - self.final_mission = args["slot_data"].get("final_mission", 29) - - self.build_location_to_mission_mapping() - - # Looks for the required maps and mods for SC2. Runs check_game_install_path. - maps_present = is_mod_installed_correctly() - if os.path.exists(os.environ["SC2PATH"] + "ArchipelagoSC2Version.txt"): - with open(os.environ["SC2PATH"] + "ArchipelagoSC2Version.txt", "r") as f: - current_ver = f.read() - if is_mod_update_available("TheCondor07", "Starcraft2ArchipelagoData", current_ver): - sc2_logger.info("NOTICE: Update for required files found. Run /download_data to install.") - elif maps_present: - sc2_logger.warning("NOTICE: Your map files may be outdated (version number not found). " - "Run /download_data to update them.") - - - def on_print_json(self, args: dict): - # goes to this world - if "receiving" in args and self.slot_concerns_self(args["receiving"]): - relevant = True - # found in this world - elif "item" in args and self.slot_concerns_self(args["item"].player): - relevant = True - # not related - else: - relevant = False - - if relevant: - self.announcements.put(self.raw_text_parser(copy.deepcopy(args["data"]))) - - super(SC2Context, self).on_print_json(args) - - def run_gui(self): - from kvui import GameManager, HoverBehavior, ServerToolTip - 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 - from kivy.uix.button import Button - from kivy.uix.floatlayout import FloatLayout - from kivy.properties import StringProperty - - class HoverableButton(HoverBehavior, Button): - pass - - class MissionButton(HoverableButton): - tooltip_text = StringProperty("Test") - ctx: SC2Context - - def __init__(self, *args, **kwargs): - super(HoverableButton, self).__init__(*args, **kwargs) - self.layout = FloatLayout() - self.popuplabel = ServerToolTip(text=self.text) - self.layout.add_widget(self.popuplabel) - - def on_enter(self): - self.popuplabel.text = self.tooltip_text - - if self.ctx.current_tooltip: - App.get_running_app().root.remove_widget(self.ctx.current_tooltip) - - if self.tooltip_text == "": - self.ctx.current_tooltip = None - else: - App.get_running_app().root.add_widget(self.layout) - self.ctx.current_tooltip = self.layout - - def on_leave(self): - self.ctx.ui.clear_tooltip() - - @property - def ctx(self) -> CommonContext: - return App.get_running_app().ctx - - class MissionLayout(GridLayout): - pass - - class MissionCategory(GridLayout): - pass - - class SC2Manager(GameManager): - logging_pairs = [ - ("Client", "Archipelago"), - ("Starcraft2", "Starcraft2"), - ] - base_title = "Archipelago Starcraft 2 Client" - - mission_panel = None - last_checked_locations = {} - mission_id_to_button = {} - launching: typing.Union[bool, int] = False # if int -> mission ID - refresh_from_launching = True - first_check = True - ctx: SC2Context - - def __init__(self, ctx): - super().__init__(ctx) - - def clear_tooltip(self): - if self.ctx.current_tooltip: - App.get_running_app().root.remove_widget(self.ctx.current_tooltip) - - self.ctx.current_tooltip = None - - def build(self): - container = super().build() - - panel = TabbedPanelItem(text="Starcraft 2 Launcher") - self.mission_panel = panel.content = MissionLayout() - - self.tabs.add_widget(panel) - - Clock.schedule_interval(self.build_mission_table, 0.5) - - return container - - def build_mission_table(self, dt): - if (not self.launching and (not self.last_checked_locations == self.ctx.checked_locations or - not self.refresh_from_launching)) or self.first_check: - self.refresh_from_launching = True - - self.mission_panel.clear_widgets() - if self.ctx.mission_req_table: - self.last_checked_locations = self.ctx.checked_locations.copy() - self.first_check = False - - self.mission_id_to_button = {} - categories = {} - available_missions, unfinished_missions = calc_unfinished_missions(self.ctx) - - # separate missions into categories - for mission in self.ctx.mission_req_table: - if not self.ctx.mission_req_table[mission].category in categories: - categories[self.ctx.mission_req_table[mission].category] = [] - - categories[self.ctx.mission_req_table[mission].category].append(mission) - - for category in categories: - category_panel = MissionCategory() - if category.startswith('_'): - category_display_name = '' - else: - category_display_name = category - category_panel.add_widget( - Label(text=category_display_name, size_hint_y=None, height=50, outline_width=1)) - - for mission in categories[category]: - text: str = mission - tooltip: str = "" - mission_id: int = self.ctx.mission_req_table[mission].id - # Map has uncollected locations - if mission in unfinished_missions: - text = f"[color=6495ED]{text}[/color]" - elif mission in available_missions: - text = f"[color=FFFFFF]{text}[/color]" - # Map requirements not met - else: - text = f"[color=a9a9a9]{text}[/color]" - tooltip = f"Requires: " - if self.ctx.mission_req_table[mission].required_world: - tooltip += ", ".join(list(self.ctx.mission_req_table)[req_mission - 1] for - req_mission in - self.ctx.mission_req_table[mission].required_world) - - if self.ctx.mission_req_table[mission].number: - tooltip += " and " - if self.ctx.mission_req_table[mission].number: - tooltip += f"{self.ctx.mission_req_table[mission].number} missions completed" - remaining_location_names: typing.List[str] = [ - self.ctx.location_names[loc] for loc in self.ctx.locations_for_mission(mission) - if loc in self.ctx.missing_locations] - - if mission_id == self.ctx.final_mission: - if mission in available_missions: - text = f"[color=FFBC95]{mission}[/color]" - else: - text = f"[color=D0C0BE]{mission}[/color]" - if tooltip: - tooltip += "\n" - tooltip += "Final Mission" - - if remaining_location_names: - if tooltip: - tooltip += "\n" - tooltip += f"Uncollected locations:\n" - tooltip += "\n".join(remaining_location_names) - - mission_button = MissionButton(text=text, size_hint_y=None, height=50) - mission_button.tooltip_text = tooltip - mission_button.bind(on_press=self.mission_callback) - self.mission_id_to_button[mission_id] = mission_button - category_panel.add_widget(mission_button) - - category_panel.add_widget(Label(text="")) - self.mission_panel.add_widget(category_panel) - - elif self.launching: - self.refresh_from_launching = False - - self.mission_panel.clear_widgets() - self.mission_panel.add_widget(Label(text="Launching Mission: " + - lookup_id_to_mission[self.launching])) - if self.ctx.ui: - self.ctx.ui.clear_tooltip() - - def mission_callback(self, button): - if not self.launching: - mission_id: int = next(k for k, v in self.mission_id_to_button.items() if v == button) - self.ctx.play_mission(mission_id) - self.launching = mission_id - Clock.schedule_once(self.finish_launching, 10) - - def finish_launching(self, dt): - self.launching = False - - self.ui = SC2Manager(self) - self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") - import pkgutil - data = pkgutil.get_data(SC2WoLWorld.__module__, "Starcraft2.kv").decode() - Builder.load_string(data) - - async def shutdown(self): - await super(SC2Context, self).shutdown() - if self.last_bot: - self.last_bot.want_close = True - if self.sc2_run_task: - self.sc2_run_task.cancel() - - def play_mission(self, mission_id: int): - if self.missions_unlocked or \ - is_mission_available(self, mission_id): - if self.sc2_run_task: - if not self.sc2_run_task.done(): - sc2_logger.warning("Starcraft 2 Client is still running!") - self.sc2_run_task.cancel() # doesn't actually close the game, just stops the python task - if self.slot is None: - sc2_logger.warning("Launching Mission without Archipelago authentication, " - "checks will not be registered to server.") - self.sc2_run_task = asyncio.create_task(starcraft_launch(self, mission_id), - name="Starcraft 2 Launch") - else: - sc2_logger.info( - f"{lookup_id_to_mission[mission_id]} is not currently unlocked. " - f"Use /unfinished or /available to see what is available.") - - def build_location_to_mission_mapping(self): - mission_id_to_location_ids: typing.Dict[int, typing.Set[int]] = { - mission_info.id: set() for mission_info in self.mission_req_table.values() - } - - for loc in self.server_locations: - mission_id, objective = divmod(loc - SC2WOL_LOC_ID_OFFSET, victory_modulo) - mission_id_to_location_ids[mission_id].add(objective) - self.mission_id_to_location_ids = {mission_id: sorted(objectives) for mission_id, objectives in - mission_id_to_location_ids.items()} - - def locations_for_mission(self, mission: str): - mission_id: int = self.mission_req_table[mission].id - objectives = self.mission_id_to_location_ids[self.mission_req_table[mission].id] - for objective in objectives: - yield SC2WOL_LOC_ID_OFFSET + mission_id * 100 + objective - - -async def main(): - multiprocessing.freeze_support() - parser = get_base_parser() - parser.add_argument('--name', default=None, help="Slot Name to connect as.") - args = parser.parse_args() - - ctx = SC2Context(args.connect, args.password) - ctx.auth = args.name - if ctx.server_task is None: - ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop") - - if gui_enabled: - ctx.run_gui() - ctx.run_cli() - - await ctx.exit_event.wait() - - await ctx.shutdown() - - -maps_table = [ - "ap_traynor01", "ap_traynor02", "ap_traynor03", - "ap_thanson01", "ap_thanson02", "ap_thanson03a", "ap_thanson03b", - "ap_ttychus01", "ap_ttychus02", "ap_ttychus03", "ap_ttychus04", "ap_ttychus05", - "ap_ttosh01", "ap_ttosh02", "ap_ttosh03a", "ap_ttosh03b", - "ap_thorner01", "ap_thorner02", "ap_thorner03", "ap_thorner04", "ap_thorner05s", - "ap_tzeratul01", "ap_tzeratul02", "ap_tzeratul03", "ap_tzeratul04", - "ap_tvalerian01", "ap_tvalerian02a", "ap_tvalerian02b", "ap_tvalerian03" -] - -wol_default_categories = [ - "Mar Sara", "Mar Sara", "Mar Sara", "Colonist", "Colonist", "Colonist", "Colonist", - "Artifact", "Artifact", "Artifact", "Artifact", "Artifact", "Covert", "Covert", "Covert", "Covert", - "Rebellion", "Rebellion", "Rebellion", "Rebellion", "Rebellion", "Prophecy", "Prophecy", "Prophecy", "Prophecy", - "Char", "Char", "Char", "Char" -] -wol_default_category_names = [ - "Mar Sara", "Colonist", "Artifact", "Covert", "Rebellion", "Prophecy", "Char" -] - - -def calculate_items(items: typing.List[NetworkItem]) -> typing.List[int]: - network_item: NetworkItem - accumulators: typing.List[int] = [0 for _ in type_flaggroups] - - for network_item in items: - name: str = lookup_id_to_name[network_item.item] - item_data: ItemData = item_table[name] - - # exists exactly once - if item_data.quantity == 1: - accumulators[type_flaggroups[item_data.type]] |= 1 << item_data.number - - # exists multiple times - elif item_data.type == "Upgrade": - accumulators[type_flaggroups[item_data.type]] += 1 << item_data.number - - # sum - else: - accumulators[type_flaggroups[item_data.type]] += item_data.number - - return accumulators - - -def calc_difficulty(difficulty): - if difficulty == 0: - return 'C' - elif difficulty == 1: - return 'N' - elif difficulty == 2: - return 'H' - elif difficulty == 3: - return 'B' - - return 'X' - - -async def starcraft_launch(ctx: SC2Context, mission_id: int): - sc2_logger.info(f"Launching {lookup_id_to_mission[mission_id]}. If game does not launch check log file for errors.") - - with DllDirectory(None): - run_game(bot.maps.get(maps_table[mission_id - 1]), [Bot(Race.Terran, ArchipelagoBot(ctx, mission_id), - name="Archipelago", fullscreen=True)], realtime=True) - - -class ArchipelagoBot(bot.bot_ai.BotAI): - game_running: bool = False - mission_completed: bool = False - boni: typing.List[bool] - setup_done: bool - ctx: SC2Context - mission_id: int - want_close: bool = False - can_read_game = False - - last_received_update: int = 0 - - def __init__(self, ctx: SC2Context, mission_id): - self.setup_done = False - self.ctx = ctx - self.ctx.last_bot = self - self.mission_id = mission_id - self.boni = [False for _ in range(max_bonus)] - - super(ArchipelagoBot, self).__init__() - - async def on_step(self, iteration: int): - if self.want_close: - self.want_close = False - await self._client.leave() - return - game_state = 0 - if not self.setup_done: - self.setup_done = True - start_items = calculate_items(self.ctx.items_received) - if self.ctx.difficulty_override >= 0: - difficulty = calc_difficulty(self.ctx.difficulty_override) - else: - difficulty = calc_difficulty(self.ctx.difficulty) - await self.chat_send("ArchipelagoLoad {} {} {} {} {} {} {} {} {} {} {} {} {}".format( - difficulty, - start_items[0], start_items[1], start_items[2], start_items[3], start_items[4], - start_items[5], start_items[6], start_items[7], start_items[8], start_items[9], - self.ctx.all_in_choice, start_items[10])) - self.last_received_update = len(self.ctx.items_received) - - else: - if not self.ctx.announcements.empty(): - message = self.ctx.announcements.get(timeout=1) - await self.chat_send("SendMessage " + message) - self.ctx.announcements.task_done() - - # Archipelago reads the health - for unit in self.all_own_units(): - if unit.health_max == 38281: - game_state = int(38281 - unit.health) - self.can_read_game = True - - if iteration == 160 and not game_state & 1: - await self.chat_send("SendMessage Warning: Archipelago unable to connect or has lost connection to " + - "Starcraft 2 (This is likely a map issue)") - - if self.last_received_update < len(self.ctx.items_received): - current_items = calculate_items(self.ctx.items_received) - await self.chat_send("UpdateTech {} {} {} {} {} {} {} {}".format( - current_items[0], current_items[1], current_items[2], current_items[3], current_items[4], - current_items[5], current_items[6], current_items[7])) - self.last_received_update = len(self.ctx.items_received) - - if game_state & 1: - if not self.game_running: - print("Archipelago Connected") - self.game_running = True - - if self.can_read_game: - if game_state & (1 << 1) and not self.mission_completed: - if self.mission_id != self.ctx.final_mission: - print("Mission Completed") - await self.ctx.send_msgs( - [{"cmd": 'LocationChecks', - "locations": [SC2WOL_LOC_ID_OFFSET + victory_modulo * self.mission_id]}]) - self.mission_completed = True - else: - print("Game Complete") - await self.ctx.send_msgs([{"cmd": 'StatusUpdate', "status": ClientStatus.CLIENT_GOAL}]) - self.mission_completed = True - - for x, completed in enumerate(self.boni): - if not completed and game_state & (1 << (x + 2)): - await self.ctx.send_msgs( - [{"cmd": 'LocationChecks', - "locations": [SC2WOL_LOC_ID_OFFSET + victory_modulo * self.mission_id + x + 1]}]) - self.boni[x] = True - - else: - await self.chat_send("LostConnection - Lost connection to game.") - - -def request_unfinished_missions(ctx: SC2Context): - if ctx.mission_req_table: - message = "Unfinished Missions: " - unlocks = initialize_blank_mission_dict(ctx.mission_req_table) - unfinished_locations = initialize_blank_mission_dict(ctx.mission_req_table) - - _, unfinished_missions = calc_unfinished_missions(ctx, unlocks=unlocks) - - # Removing All-In from location pool - final_mission = lookup_id_to_mission[ctx.final_mission] - if final_mission in unfinished_missions.keys(): - message = f"Final Mission Available: {final_mission}[{ctx.final_mission}]\n" + message - if unfinished_missions[final_mission] == -1: - unfinished_missions.pop(final_mission) - - message += ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}[{ctx.mission_req_table[mission].id}] " + - mark_up_objectives( - f"[{len(unfinished_missions[mission])}/" - f"{sum(1 for _ in ctx.locations_for_mission(mission))}]", - ctx, unfinished_locations, mission) - for mission in unfinished_missions) - - if ctx.ui: - ctx.ui.log_panels['All'].on_message_markup(message) - ctx.ui.log_panels['Starcraft2'].on_message_markup(message) - else: - sc2_logger.info(message) - else: - sc2_logger.warning("No mission table found, you are likely not connected to a server.") - - -def calc_unfinished_missions(ctx: SC2Context, unlocks=None): - unfinished_missions = [] - locations_completed = [] - - if not unlocks: - unlocks = initialize_blank_mission_dict(ctx.mission_req_table) - - available_missions = calc_available_missions(ctx, unlocks) - - for name in available_missions: - objectives = set(ctx.locations_for_mission(name)) - if objectives: - objectives_completed = ctx.checked_locations & objectives - if len(objectives_completed) < len(objectives): - unfinished_missions.append(name) - locations_completed.append(objectives_completed) - - else: # infer that this is the final mission as it has no objectives - unfinished_missions.append(name) - locations_completed.append(-1) - - return available_missions, dict(zip(unfinished_missions, locations_completed)) - - -def is_mission_available(ctx: SC2Context, mission_id_to_check): - unfinished_missions = calc_available_missions(ctx) - - return any(mission_id_to_check == ctx.mission_req_table[mission].id for mission in unfinished_missions) - - -def mark_up_mission_name(ctx: SC2Context, mission, unlock_table): - """Checks if the mission is required for game completion and adds '*' to the name to mark that.""" - - if ctx.mission_req_table[mission].completion_critical: - if ctx.ui: - message = "[color=AF99EF]" + mission + "[/color]" - else: - message = "*" + mission + "*" - else: - message = mission - - if ctx.ui: - unlocks = unlock_table[mission] - - if len(unlocks) > 0: - pre_message = f"[ref={list(ctx.mission_req_table).index(mission)}|Unlocks: " - pre_message += ", ".join(f"{unlock}({ctx.mission_req_table[unlock].id})" for unlock in unlocks) - pre_message += f"]" - message = pre_message + message + "[/ref]" - - return message - - -def mark_up_objectives(message, ctx, unfinished_locations, mission): - formatted_message = message - - if ctx.ui: - locations = unfinished_locations[mission] - - pre_message = f"[ref={list(ctx.mission_req_table).index(mission) + 30}|" - pre_message += "
".join(location for location in locations) - pre_message += f"]" - formatted_message = pre_message + message + "[/ref]" - - return formatted_message - - -def request_available_missions(ctx: SC2Context): - if ctx.mission_req_table: - message = "Available Missions: " - - # Initialize mission unlock table - unlocks = initialize_blank_mission_dict(ctx.mission_req_table) - - missions = calc_available_missions(ctx, unlocks) - message += \ - ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}" - f"[{ctx.mission_req_table[mission].id}]" - for mission in missions) - - if ctx.ui: - ctx.ui.log_panels['All'].on_message_markup(message) - ctx.ui.log_panels['Starcraft2'].on_message_markup(message) - else: - sc2_logger.info(message) - else: - sc2_logger.warning("No mission table found, you are likely not connected to a server.") - - -def calc_available_missions(ctx: SC2Context, unlocks=None): - available_missions = [] - missions_complete = 0 - - # Get number of missions completed - for loc in ctx.checked_locations: - if loc % victory_modulo == 0: - missions_complete += 1 - - for name in ctx.mission_req_table: - # Go through the required missions for each mission and fill up unlock table used later for hover-over tooltips - if unlocks: - for unlock in ctx.mission_req_table[name].required_world: - unlocks[list(ctx.mission_req_table)[unlock - 1]].append(name) - - if mission_reqs_completed(ctx, name, missions_complete): - available_missions.append(name) - - return available_missions - - -def mission_reqs_completed(ctx: SC2Context, mission_name: str, missions_complete: int): - """Returns a bool signifying if the mission has all requirements complete and can be done - - Arguments: - ctx -- instance of SC2Context - locations_to_check -- the mission string name to check - missions_complete -- an int of how many missions have been completed - mission_path -- a list of missions that have already been checked -""" - if len(ctx.mission_req_table[mission_name].required_world) >= 1: - # A check for when the requirements are being or'd - or_success = False - - # Loop through required missions - for req_mission in ctx.mission_req_table[mission_name].required_world: - req_success = True - - # Check if required mission has been completed - if not (ctx.mission_req_table[list(ctx.mission_req_table)[req_mission - 1]].id * - victory_modulo + SC2WOL_LOC_ID_OFFSET) in ctx.checked_locations: - if not ctx.mission_req_table[mission_name].or_requirements: - return False - else: - req_success = False - - # Grid-specific logic (to avoid long path checks and infinite recursion) - if ctx.mission_order in (3, 4): - if req_success: - return True - else: - if req_mission is ctx.mission_req_table[mission_name].required_world[-1]: - return False - else: - continue - - # Recursively check required mission to see if it's requirements are met, in case !collect has been done - # Skipping recursive check on Grid settings to speed up checks and avoid infinite recursion - if not mission_reqs_completed(ctx, list(ctx.mission_req_table)[req_mission - 1], missions_complete): - if not ctx.mission_req_table[mission_name].or_requirements: - return False - else: - req_success = False - - # If requirement check succeeded mark or as satisfied - if ctx.mission_req_table[mission_name].or_requirements and req_success: - or_success = True - - if ctx.mission_req_table[mission_name].or_requirements: - # Return false if or requirements not met - if not or_success: - return False - - # Check number of missions - if missions_complete >= ctx.mission_req_table[mission_name].number: - return True - else: - return False - else: - return True - - -def initialize_blank_mission_dict(location_table): - unlocks = {} - - for mission in list(location_table): - unlocks[mission] = [] - - return unlocks - - -def check_game_install_path() -> bool: - # First thing: go to the default location for ExecuteInfo. - # An exception for Windows is included because it's very difficult to find ~\Documents if the user moved it. - if is_windows: - # The next five lines of utterly inscrutable code are brought to you by copy-paste from Stack Overflow. - # https://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path/30924555# - import ctypes.wintypes - CSIDL_PERSONAL = 5 # My Documents - SHGFP_TYPE_CURRENT = 0 # Get current, not default value - - buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) - ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf) - documentspath = buf.value - einfo = str(documentspath / Path("StarCraft II\\ExecuteInfo.txt")) - else: - einfo = str(bot.paths.get_home() / Path(bot.paths.USERPATH[bot.paths.PF])) - - # Check if the file exists. - if os.path.isfile(einfo): - - # Open the file and read it, picking out the latest executable's path. - with open(einfo) as f: - content = f.read() - if content: - try: - base = re.search(r" = (.*)Versions", content).group(1) - except AttributeError: - sc2_logger.warning(f"Found {einfo}, but it was empty. Run SC2 through the Blizzard launcher, then " - f"try again.") - return False - if os.path.exists(base): - executable = bot.paths.latest_executeble(Path(base).expanduser() / "Versions") - - # Finally, check the path for an actual executable. - # If we find one, great. Set up the SC2PATH. - if os.path.isfile(executable): - sc2_logger.info(f"Found an SC2 install at {base}!") - sc2_logger.debug(f"Latest executable at {executable}.") - os.environ["SC2PATH"] = base - sc2_logger.debug(f"SC2PATH set to {base}.") - return True - else: - sc2_logger.warning(f"We may have found an SC2 install at {base}, but couldn't find {executable}.") - else: - sc2_logger.warning(f"{einfo} pointed to {base}, but we could not find an SC2 install there.") - else: - sc2_logger.warning(f"Couldn't find {einfo}. Run SC2 through the Blizzard launcher, then try again. " - f"If that fails, please run /set_path with your SC2 install directory.") - return False - - -def is_mod_installed_correctly() -> bool: - """Searches for all required files.""" - if "SC2PATH" not in os.environ: - check_game_install_path() - - mapdir = os.environ['SC2PATH'] / Path('Maps/ArchipelagoCampaign') - modfile = os.environ["SC2PATH"] / Path("Mods/Archipelago.SC2Mod") - wol_required_maps = [ - "ap_thanson01.SC2Map", "ap_thanson02.SC2Map", "ap_thanson03a.SC2Map", "ap_thanson03b.SC2Map", - "ap_thorner01.SC2Map", "ap_thorner02.SC2Map", "ap_thorner03.SC2Map", "ap_thorner04.SC2Map", "ap_thorner05s.SC2Map", - "ap_traynor01.SC2Map", "ap_traynor02.SC2Map", "ap_traynor03.SC2Map", - "ap_ttosh01.SC2Map", "ap_ttosh02.SC2Map", "ap_ttosh03a.SC2Map", "ap_ttosh03b.SC2Map", - "ap_ttychus01.SC2Map", "ap_ttychus02.SC2Map", "ap_ttychus03.SC2Map", "ap_ttychus04.SC2Map", "ap_ttychus05.SC2Map", - "ap_tvalerian01.SC2Map", "ap_tvalerian02a.SC2Map", "ap_tvalerian02b.SC2Map", "ap_tvalerian03.SC2Map", - "ap_tzeratul01.SC2Map", "ap_tzeratul02.SC2Map", "ap_tzeratul03.SC2Map", "ap_tzeratul04.SC2Map" - ] - needs_files = False - - # Check for maps. - missing_maps = [] - for mapfile in wol_required_maps: - if not os.path.isfile(mapdir / mapfile): - missing_maps.append(mapfile) - if len(missing_maps) >= 19: - sc2_logger.warning(f"All map files missing from {mapdir}.") - needs_files = True - elif len(missing_maps) > 0: - for map in missing_maps: - sc2_logger.debug(f"Missing {map} from {mapdir}.") - sc2_logger.warning(f"Missing {len(missing_maps)} map files.") - needs_files = True - else: # Must be no maps missing - sc2_logger.info(f"All maps found in {mapdir}.") - - # Check for mods. - if os.path.isfile(modfile): - sc2_logger.info(f"Archipelago mod found at {modfile}.") - else: - sc2_logger.warning(f"Archipelago mod could not be found at {modfile}.") - needs_files = True - - # Final verdict. - if needs_files: - sc2_logger.warning(f"Required files are missing. Run /download_data to acquire them.") - return False - else: - return True - - -class DllDirectory: - # Credit to Black Sliver for this code. - # More info: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectoryw - _old: typing.Optional[str] = None - _new: typing.Optional[str] = None - - def __init__(self, new: typing.Optional[str]): - self._new = new - - def __enter__(self): - old = self.get() - if self.set(self._new): - self._old = old - - def __exit__(self, *args): - if self._old is not None: - self.set(self._old) - - @staticmethod - def get() -> typing.Optional[str]: - if sys.platform == "win32": - n = ctypes.windll.kernel32.GetDllDirectoryW(0, None) - buf = ctypes.create_unicode_buffer(n) - ctypes.windll.kernel32.GetDllDirectoryW(n, buf) - return buf.value - # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific - return None - - @staticmethod - def set(s: typing.Optional[str]) -> bool: - if sys.platform == "win32": - return ctypes.windll.kernel32.SetDllDirectoryW(s) != 0 - # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific - return False - - -def download_latest_release_zip(owner: str, repo: str, current_version: str = None, force_download=False) -> (str, str): - """Downloads the latest release of a GitHub repo to the current directory as a .zip file.""" - import requests - - headers = {"Accept": 'application/vnd.github.v3+json'} - url = f"https://api.github.com/repos/{owner}/{repo}/releases/latest" - - r1 = requests.get(url, headers=headers) - if r1.status_code == 200: - latest_version = r1.json()["tag_name"] - sc2_logger.info(f"Latest version: {latest_version}.") - else: - sc2_logger.warning(f"Status code: {r1.status_code}") - sc2_logger.warning(f"Failed to reach GitHub. Could not find download link.") - sc2_logger.warning(f"text: {r1.text}") - return "", current_version - - if (force_download is False) and (current_version == latest_version): - sc2_logger.info("Latest version already installed.") - return "", current_version - - sc2_logger.info(f"Attempting to download version {latest_version} of {repo}.") - download_url = r1.json()["assets"][0]["browser_download_url"] - - r2 = requests.get(download_url, headers=headers) - if r2.status_code == 200 and zipfile.is_zipfile(io.BytesIO(r2.content)): - with open(f"{repo}.zip", "wb") as fh: - fh.write(r2.content) - sc2_logger.info(f"Successfully downloaded {repo}.zip.") - return f"{repo}.zip", latest_version - else: - sc2_logger.warning(f"Status code: {r2.status_code}") - sc2_logger.warning("Download failed.") - sc2_logger.warning(f"text: {r2.text}") - return "", current_version - - -def is_mod_update_available(owner: str, repo: str, current_version: str) -> bool: - import requests - - headers = {"Accept": 'application/vnd.github.v3+json'} - url = f"https://api.github.com/repos/{owner}/{repo}/releases/latest" - - r1 = requests.get(url, headers=headers) - if r1.status_code == 200: - latest_version = r1.json()["tag_name"] - if current_version != latest_version: - return True - else: - return False - - else: - sc2_logger.warning(f"Failed to reach GitHub while checking for updates.") - sc2_logger.warning(f"Status code: {r1.status_code}") - sc2_logger.warning(f"text: {r1.text}") - return False - - -if __name__ == '__main__': - colorama.init() - asyncio.run(main()) - colorama.deinit() + Utils.init_logging("Starcraft2Client", exception_logger="Client") + launch() diff --git a/WebHostLib/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png b/WebHostLib/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb366b93ff0debd825faf213132da839c04a89b GIT binary patch literal 5945 zcmV-97slv`P)EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRF*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc| zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X z 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 Eg6#q-ApigX literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/biomechanicaldrone.png b/WebHostLib/static/static/icons/sc2/biomechanicaldrone.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ebf4031619f66461de686511e9212989c34ff6 GIT binary patch literal 6999 zcmV-d8>r-oP)EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRF*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc| zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X z0(e)|c(-}5}M$Rdj@ zvdAKfEV9TVi!8FpB8x1t$Rhv$Aid1jC%)VkB)m+8dOh%3U|`|(9PlXc-+|U2yM=8B zZUe3d_5gc<%YZK6JmCJycRPXq3Vi(5tM{z=+?T%HuZvc{<`q_F3#}VG-@g+0F<|^L zx_bop0$>CFKl6ARxEXi_@YMxN^7kwa`9FK`DL+>-{J;Our~F&{miwCr`d++dKhXQf z=8{R^=fKvrLrEg>Bpo3Q(`kbTk|z)C4}1mqERg+U5bVRiN3XlIpGVI7L_;A&Sp!MD7{6<8)*q^1PoyH+?r3K(R-lXF;pHgNB=t%TRSSaX(U;U%ziu;kZCOik%M#`S zDPH*V5A*%6d=j~1h^FY_IVQo9#k+U@M^=C4diHH_c^@kn`Ni{m`v;%l$;TdHBvS>* zFId_I;NFGDA575i0`A#791YBPgRI@M6G;g&cJu(3Z&=Rul`+mul<6PX&Rbr!jNT>7 zDc3Sc(Js^*_Ht_55R;SVY3IwdgCdn39Xzn*S-jgWW2dqN|Ljq^<0+=pVQNY@*KA4? z@SCBIRI=MJ?Mn>Pe(gdcIrzH}O#U5Z#aKroM6(=25aIN*zaS|#`SZ8l#R~_&&)B5G zQ>SutJNvo*_O}wQD|p%cq_vu z{P#F|GR@q!_p|A$!^~$6GgUo6N^mGv&3k}XFC?5Zz<&lNUXB*_8sNVG9Wh12>)A-a zF4LSD;SG1(Odu%n(JwxS(y@_i*X77ejWLn65MoiJY@3;He2a)ZO|nv_r{%Ds+2)ez z0{!O-XirTrKc8bxG#EW|7RR)ZW1A5|NlyIiV+gf#IKISecAj-hdkF>teIeNxv|MqE z>-le8$iT;5E`nVPd=0oe*&pwC{lDMC;}2x%lcFg0EK4t0NmqAO*0D1dk*33Vkh&A)#_RW@N4xq6;=p0ntzJU67NtCKjwORp23GB0V%Flx{r9qS%T_MieHr;mi)cJa zy=7q33RLPQyRXyIA>3ekx1#d#e12b8l}VOA#~?@s=EgX4|a0?o(D-!&XGx|3?G=M za_3q$zy2o7eIt~c^;ZJxf$#mc1p7YlruE$`*>d-t6gFGLixHkVc9LcH-p7%9PqXLK zf5Wp%mAElY;wK`l2Qpa6an2lnib%X0MV8pGZXFZjlemt>@L(U6dK+JWpsXPA;|s86iW_GkY4*Hw(lCEH1iyjXD4Y`E@S7 z@)&IqJ)Wd7F@rj765P9#ywPI$s-?W}%_kXN8DsLTo9Oof%qk{pR_#GKGfuu%UIT3U zf1MIuieNtiZtqE6!j?O3!n#_*xlmpK+M>k~oN$>*U`;U-z zhOosH(T+~eJ$FA-qZ2rS%&pwoo|ujRboS@E=w!8OBNMVC{Q* z87WN>@9yS=XJUTn2Q-^DtN-dfC;=Zy7HEC>D8-6PL6GQ(>&Q}&O5Gr+1jx_N5|4(d zHx0(d#zB;EtR`cb8f|Hibi}~@$w}H@K0u`ILv$?};U*?eo#N!aPvY1zuB1`S&mu?) z&1M_VvCx7tfq;VRIN-WSqKD(TIEI0&hv>a#8MWzIQeC}d4vr9?C{ezAfWde_nYldc z)~%xUyiGtUQmHjB17;VJ!LL;U?gc*4lMFFBH_Q#M>trg@MlRW8V=>k|d6-yLr=|@AIYG5)k(rsnbzNM`qS`P}oN+uU zz#P}n3|vVoaSiRz8<~;biCvgt?B{Q1ZnljSOH(bE5e0#ItwvCjNTpIZmQS1Wg+0iw-C{Mq?kpmA)yDmunmjKR2_ibmu{uMznAiC3E}tzk-;k2(+_d@ z$jMf%WsTQbmXj;a5es-!Yjx&J4(+x{+icQoR*_sA%kdG)`*H0ijlf2v)E-))D^RLO znccUWv&Y9sbuXb*EK{DJ!$U+1NJQgNilsKGR2LgBy_C+uL8_+0WL^g?MLMo9v^tJ) z$tt`JF+vTQ)%_~~P@kHl(I^v9Va_WMSr?`wya}yq=ZpK(H~cz>??K>>o^*;#TVZ{o zi4|2SRdOtgs1&^x_UVgtyP4x<*3M+fjh?`t>!W9hz|l$_;4{FtfTuM*99=fBf#Ucn zL`gt!bnrZCwHmf*6OKly)M{vFKZ~peX~_Xv=M{3c!R(|*XYVT7MvM8`DI_I;ED9vz zF*1`G(p_nWmiKc$(_pTg#xh+((Kwan909*c*Y&%Z4b_M*Nsv6MGT|-(Mv!y|q1eW0 z`N&!T$)86Lq-aPtkc>V>sn&k&!shlRS=c6767VIRfL}uP>!^AVPgH1CB$PxF*K_EL z>trKAp8eoA82!W}lrD^O)fIQr)uRJk2W$Z*gXTPLxQAFgiY9vaN|0EphvDU`iN@nt zjzv12M3E9WrcAriq%>WoI9DT;?xNACF+Vebt_M(6g>))Pty)KsW%`GDIC8Q`p^`w8 z9a6n32v7>diTREUAO8 z?qPaT;q42RmzNauZ;J$#t5rQtRCjUe6?%q;kgs0J?8ArYJX*up(MvpM6Zd?&2l}X6 zHbHi1q6bxD{juelES^Ak+Zjnj0O5F3c#Z83;k`x@qg8J6j38-a-BlYYx4P9OXwgP$A4xp^zI^%CyW7qE1goS3HJ z`Z&!B&z~M=*WdmbI|Bm8PK<|qKyOcxEm)Mw^K9R=2HCgBOpc?5k{FIp%P^=lnlu^) zO~a(wY}0DCuq+2jQL#ONO1XsU8_dnkG0@*bDAmj9sRXHkD^Y@d)W-LbJNF%Yw@q@% z)r6xu3E!vpY=COMNzG`{YPTuxF-cst1IKIOryFc2t)}?%;}k5Frkz4FkApEou~Pje zaQ3CdFjZFt3avJxuhHF^B!7O2zJn$DUUMzS#(%`F-VUmJFX8NWo+NtQ##JR^i8Kv! zp3C2S6_XoN?7!dPRZBObEDey$WohLukV+iXzLj z+iet0LknuODlHt>!!%6vpn{V~BZ?B;y-CjJ6C?(%#;lG~KJz&Yqe4)L6I*&CVjw{| z^Fx|Ps&r~YB$h5E`(z1YdybCX>xlL&<5cb;cC(GZV-|(>99BCIj(nANLLV)Ad&!{C}BT6#`^1aGJ1JGt)p|S-m#uDBPVH$GrE=SDNHUPoY>X9LvKu9NcyT$8qpX z6RXk0GA%^QCZOpgd%Bs=6|^B5d;tN2#O}9~_&4uGRHv9f@Fk3T zgJ3j9EImYJBE$S(p7gseBei}TV{^|i(BI421D#}^I?6<`h8VdHPwl~-e+aXYbxh0s zhkq*CKUdz_13W&^8D-wo=!&TXbsewLWc7v>^!&p+`R+3Z=^xG0*O}(zFQ2FIqY*sc zL=J@6ykRXpc7WyAZz8^T71elvle8!}27b#RSa*=}7049O8y>Rh;1`-0As=@|A9mZo z^$gsAgrulQic0a}qhy{tM)+i-sAm~x5AUaUT@ROytinA|=kSRilPO(6*Shy}?)1H+ zXFf>2V&q$Pelr?UI6`snl5TG{@CKwB0_JpyPbVnbcXkMSc7n?63BoHA41D38h=~-VhaYBHs-NwrR?_-;jPOqzz z6hcIU60v-nWWgj^Fi6ZA47N0k(^;~|#)zi6$W5KWM%jVPu)*bGr^jL<`>;W!JMhN!53pKi&?1k^5 z&iyZHZ9fm(@qa2V{@*IDI&dr+l$Kjk1WA$zsXn?MCa4GSn-(3O%BnZ+rTn@z9DDRI z#-|@9WGSTftV7#6h}*1Dd~}rJGw0E?FnV{IXgZ8634{cVcu+?Vh6o0A)MyAHAmX&z z*uIDFyEvAEV|u89%1k}SzJvQnCQ_slG4hoN?oDfX_gDUk@rlRy?zNvLUcZ$<)Wn_m zF?y&(>VtRDe0x8hJxBVu&v31e*io7Mxk)ApN0`kG5*m6pS}4KH^kHH%A7Uai2k>VL zo%LV4M7<6;))`gBk`p8z4G~g66lG*ZMiwR1ipjE_n+V^&iCWC!{JAmaXA0<%7@ggn zD29txXwsUmQO>*6Crrqe(Oefv5s@?*S(6ZT5n1q2C6$mK#I_9(M0_87&nFm5aPs-* z$d$7UrI#=NRwPFKhj zPg1DOQZu)p_q_>46Pd|8hc^8&a=CeYp9g^(|0Om3Hv`{HM>T4G2tBA0RzQ*!WLZH8 zs0dA)U>iC%4722xtu*_CjJZ|jXL5*^gD;8%9nc*S#SI|a5^k|YyV$~R8`!o-{roJ} zR0cID5l$qDBs;Jj7he()MFA-or0SK)S8}A6FTqJFNIe~RJv!Pz7gCRf6{;W^2|{Lo z_}4PTvl?17ietijBTKP9OQjk?jO<45*p4swy9bZT^&IS5fA!EqJ%7~NRou4Ncg6Q)bQ!)?`H57>tJP)O4y~0N!4uAHrv>yf#A9b z9*8a|o`_hp(B@i5*KWeX#%$J+LprYG;>!Y}C}6o3a%UJJp<`Aq8ClQ4o+76-5hCD9#hs!zi{uSdd8frHKu75*SWFZ71USva`ZxAF(gSO{OOyq>IOo~$G07P3k1mn!N>P}gtmoLvry_ba>+z#xM)oQ ztsxO?2JkaB)tPz9%`B$sVmS(>>^P1iksN+CN-#~OJWZp~Kx;gYT|G^qYQNY)`oQm^ z&DOW@Ph8g(58y~4Y(YhlCE^jCX0wIhyQDfgC{-qrpki6TdX zh#?gz9>8xnc$y4rcvE01*+%6A?5CMFQEdkyQyr^6?PB zckuD?JP$z>K#;KnaBx9V@sRL*1;>-|kwASw8C9zv2Y7G~;&EbW$o z<#-10_Y0O){e3lZhk-u@-Ujq_L==2cMNk7&4H-#Iq6ZXYQ9=+rKtK&dP-5#r3L%Oz zqO2ndGCm+mI)bR+`!2rc;`J+Tg1jUk9Cf*^q)06xCw;CT*s4zAP0vFmtN6IT%M3E}!8 zp4~zgnmEl181)Q-+JR@z<2xTWh&obq4#+5JbnG0etWg5%4Yw z<+~vG$fAfWL8WQp+Xk&x^Tppk0hqwnsIC&yB#Lzd%kfzlZ~DSQCx|~3!TxC*S^{|2r(hr<`xD+>Ss002ovPDHLkV1oPZNH+ig literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/burstcapacitors.png b/WebHostLib/static/static/icons/sc2/burstcapacitors.png new file mode 100644 index 0000000000000000000000000000000000000000..3af9b20a1698065fa07a7729b74cfed01b094a27 GIT binary patch literal 2579 zcmV+u3hecXP)EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRF*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc| zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X zbWe2dEI& zG`&F}uE$B-+{bb3u|2bSm~YD~TYKzrZO`~}mbA6c*=L{2{?1x!e{1axx#W^dF1h5A zOD?(Ol1nbzMlzQ^ow>Asqn}&Y!I-_V84oS)V8EUO<};TjwsAbExXh)c@uaelYuNpA z5;y@Iid=gtb7^VUYgp#eBf!^zUmDO(0>20W1Ezt>uF$Z|rAITD?vGp=1imfJ@_;=C zybx&GLp$E-XD;1mPQM47i*$PkI3Q#$_+Fs!oUXUUgghV@yM9^fO+-pQ~S?>)ADbOCzVe$_O0mjM}X6c0bds&i76#uQD7X` z7;NzXU6zI|s+?I5o!IKLv)-_F*2dQQ*tLwIyjz%%t81 z27r%&Swlf;kx5`j0X8Z}KI&;eU==;)`>kVt5BOBjzosDjh``+5CYiZ(Aaki5$ivbe zUmw$;YdT*5&P!Vs1V%|3l>k>%_Ud`RmF7)sgobSeA9ey5i?lz}qW>M>T^&yXe*^vs z{H{e`Uq0GNK5Q&=>8}J{=9N$NylT(*D?n8s8~|>q#N;pPhXA`nJfXO?H7s-KGnq@j z64A0T;D>5^Hn?qGniMAeZnt>NO%*HWx2uLdExz@ZzF`>nzQ8D&z}e4o7i4}_k=O#w zjOi_DUQeI|PJI*kvPI3VcLmz)b~MS6;Cx7>*1{K6WP+A!gkh!akF`8L0=PrmLQ6D!u* z_~yQD0`|=opnX?>oekRm0gRjTHw9M3IOSH~H6Kacc)8HRm(EFp_nJ7gtFhz@#P=$A z(>p64X7low1lsStSsR~KFu?T$K>ahA8SP5Zq>9y`KGBnZ>->hyw%Sd=9sxeDXFUr1 zKxT48VD^idUo<|XsL9|%<8x-rwW2^uG+R#V_6@|X14Y9L6PNy`l-bri0=wuXN=FXdmz00!DI+Z5$0WxX6=(^m8CuNG&hr6k_KIp zS?$+#uRXVnhRrFWuruPnR1QkRj&>8UUYZM}CCx--WgwP}U%4))Uyk_AX$@pjob8&l z>asNSrYOU0nVHk`JeT@deJpRgX(oq$`Nw`eqaK7>9S3Z$KJ1G@g0Njbae?M?zfU>W zj31gX8d=qQTqLti@~ZTZ;bzApfUFfDx6b?hnBVF&4;zi}tSdD4XYG-h`ghF8XMLb} zaisw#9RjSQ8s^pdyqI_@)4Qzf!Jq==drB_eFsyxkg+V55fRwD`y5A$)=rmyW1cG0@ zs0P>GH|Mv5_xU8@k{Lv@2I3h`RxScgvdYh1>@;A15?BwI*sW@4$2}96C&BytCXv`m zw%v!?qggPC08)tbFPQ6%fY#W)U2*z1B5hMf!`jh~!YUM}9vN)x{z4mc$@cYhB$r%r p$t9Oua>*r^Tyn`Jms~m`{|C`oK4n}?j*$QW002ovPDHLkV1isK*}?z- literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/crossspectrumdampeners.png b/WebHostLib/static/static/icons/sc2/crossspectrumdampeners.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c0c6c9a01050df51d171481302cdffc38326dd GIT binary patch literal 5344 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 Eg7O=+9{>OV literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/drillingclaws.png b/WebHostLib/static/static/icons/sc2/drillingclaws.png new file mode 100644 index 0000000000000000000000000000000000000000..2b067a6e44d4f787505814b9bfdbc54e006a6d2d GIT binary patch literal 8451 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 G{C@z-2s91= literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/hyperflightrotors.png b/WebHostLib/static/static/icons/sc2/hyperflightrotors.png new file mode 100644 index 0000000000000000000000000000000000000000..3753258458769357ecd299f44b44dc9a3be45e8d GIT binary patch literal 14285 zcmV;;H!{eHP)EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRF*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc| zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X zzAb63vc<@;_r$A7%)=^n5FOMiJSFTb^3*Iixr-n#EQd+)RN zx4-@1|9|}#y~KaU?*(AC-s1m-XZ&7&_jdnpZh2nupLuU?x#qtJu$vbNX$c`MgaBi{ z>qbVHw_Iv&{xlc_Vhd-35L?H_fDmuqPXKyr4U86+Wnn4VUln6+d31x;+8ASmF$S$Q z0JiNI1EgsJ2BcD^e`_K7KQRU)(0c3f4Mtjky!klLe~A8Z|Fa7rF{u6pX@oHeAP_=e zjQ%dbgxtE55mLDbWf`4B7#;tA!h`UW`3>m4DdFqS5tHaLJ zZQ}S_026GP&W)htWJ>orzW3`QyW>tHi?K+WiH_%`ma!yLBD4FGM&|a3aQOw|g)bRl z+Bh!8$c#X_Lit6cmovCojGMzaSyC@A?BXz)!R<6I&X{PeDJPHY55M;VTzumVvc6~X z$_Bq6tXvJPZBr=ip>y&ChaVajgN_uZo{h|+7&O6^ryy(@93*zpsBFb3lZZ45Kst_a z9K3vaZ+q&@&zU5g--@Feg!SEk8DmU}F=^igongxnpHlw#UB-COTk+Ch3WLF}og}mO zCrMjtbkBSW9bUZ|0;P*>`xv3nI(^e)4F;nGUao{!8N#?ZQsJV7MW@+fVQLoFg%_WF zmd}6g3q-vh|IV;?7HZj6G-u(ftT)x7}(jt!Q5yc_8 zvxa!vBXkERS$yd#{{B7WT*;j(q&egejvi$3$}{L*8yanxyM~bv zgPAZ`>&%`1Z!xC#-J#IB#qPw7{YjvATkhzjNj;2SCGAXOj3G1mar_-0pndr-31|NV zgzf_+B$nqPq}AU9EeGYeXbdJzP|CqA)^G|HQe_jR8ezK#+a*plLD=Qj{@E`xJvGHU zAAOAXKk+eK&*z(8dy-49pQ2DIa^=zmEKBjwBkyH)dWyyQ1w1c95VT2?6hlg*P$PKn zds)r}6sO_39WXf*a%8t+_1px_;ux)^a}ahR>Y|Ot*cKuVF>wfKOyuS9$M)RUUA$B? zNi_StToR;|qk?UrvHyr z3ZZPUJd|I+EmVehp_^Utq8cJFG5C7;_7#o{lX?~j5UVe@! z>QSmxn3=lH^3o!Y{oscQdJ!{I*YNxdQJkW+L2E;jBy_*@M=X@zj$_qmPj&HUnq0oy z;ekD{YrAB1Xb0_!{SA;Lz@!OUyO=bBG=?-LUSGgRX<-<1OOh%Qku*%) znFHZ5@Zhf@tum|6{t70%*au5UEI)^^T+-B_(Wp!wVf&;;BCv3CMO3~9PL@b0v~s}B zf}2IhDMkoP+~u9`elI(A?IDR1p8ooibb~fvC=@HKt}Ju)(nTJ8W^xR!H0|iIWAlipbRvxdFnpF7ZYiTc$kr_M@02;Or|e5Jn-& zvXMfPFBDnd*yQx7S2%w1ZfZjloPO<9EK8x&zCEW&NSqkrBw=p%$1ywK1v-GMUq+gQ zD3+|BcbFdD#sfzrJ9lj7T5*Ej{3!@Jm?T747Q&<$DZq816OeSd#_Ut{#o6_)mhAsF}Y))i0y9!cuuUGq16Dd6d>R&5m)0>ezM~=OsD{ zFgn2`F=!2O(tk^dNqV=G8^&zqpWg+T5d9sre~zx4{CTb10p_0k`ykdp8l3AzHZzTk*{zW_NCt*2X%8LLP)5 zNfK}bl(IkmxQH|4i`#%L`A(x**ZC-+) zP8tSS{vb(flf^gAvV7zuN5&01c1$wmR?&JIj3y0xpwq3-F1HFEonp2SGyN*>`?{o+ z8zMJ+2lIdZPcg|nD20>)%gvD_DN92NV23s zYm&6rN2OSVB!xJo?~dlS#kh6TA8$d?ujtiRK7;PPj<7PIBP=&hoPu&3r0bEGz6-kf z0h~e&k)0q_l0>D1-7?W)Od70XgvQe=l+`*Fr^(28k;*`gF!X6R%Vdfrk~k&`I!sSb zv9!2AzEI%t5B(7H3(L$+P2p!Uh`2)(C-iy&7+6|fBmMZ3;AN5VEOP!S=(QniL9Ye9 zHad#2GLm?6n&qi!)(-Dsbgag}&^9_395CG*qyYp07y&|(Y9rptP>45e%(@+lY0xl1 z^IJ$KgV7PT=aU$Tv>c@ClOj-=0&cd7%2qJ`D8?4p`4XMElz43uOn|S~n5=e~oXDZ9 z0T2Ty%SK3vCl#*eBb206tzkPZi__PsH@?o!-Fq-nap}T&Y{v!xahwozx?o^&VGf@7 z3_X8@?PETVpE$~2{`==xcw?@g9z+2|UDC9Tv9jnWVq^LW8?8M|RwM&MqfA>K+$@(N zia=UmtDB+emaP89vAP9B8zEA_m?Rogj`Jaet}53a3A<1NM{_dGKg~;lToyvT!{Q+poT%^ zJ9pf9k~hws<<-+?*futfF@~@g5``gA6w+!nvETKp)Q2CWTy(g1dk?EM$3yo#z{Kz{ zS5AM2q_GNd7orYAxG3phghzS%9ZU>4EKe_R^~|#nHE(*J5Fiyug;e%*8g{>6blMg| zCbVJ+kV*k57$YR3mX~<~%c=^?!zdT!XGw*Ho2ybB-T_V)nH|E)Sma6*m{o&m z&m*E$?%CPnnyiR!U=(LOMRia!_6#q(s_2`N3@nFN0Beq^+>aqjZ*1XwFjgTHLwcB44Ty zbOMG(hFM)$;OVEnMj{lucJC&WFW|W@8Q;ff%_}cFLoaCa?vH(fM!imiWZ%&{c-O-Z z@u&ack5QI|?RqFB35HLS-1|Qwh2o*(MIN|Q(V83Q!pn8q-3=Nm)2LjIANj;j@$f^B z@Yz536jRr(qpScE2gE^_CwyQc zTpuYFp5x$qKDlg$YPHI~g9mx;o8P2ZD6s$738FY=aCn5y+A^J1gGQrH62<7;DC-aY zCR*Ca?nP!^{1fKiSmo%!gWP#+5Z|lz7q!<$#2w1z3h#L2y%Y--re|h|6NmiR9wzpT z5pK3P|N1M$y;X=qKq92tA`leH_Gjau`9-7C76N&zh20Xvl!Zw(V1(t2s6y?-DqF28 zKTj%b+~Oel;q4g912>P%WIztly?O;q$dQpc)k=Xd3>g?6;_~TNkwS9sJ09ZDf&B~) z3~=f4CAyt1N(u7$0oV+sjVJo%$F0E-9_s0w$!ix9TS&Y;QzW$3AQq zhpWc25N?*j$SyL4GPpUcOosf>cH-Gp=&Vt-mNYcpt}OAy@u@z9ylSKgx80_c&(mzS z0J!g-d${Z5Ni55v*XuFAut2BNq0ww&v}U|kWwcx(=yqUil%mw+*V<%;4`Yy>4!Wr_u#T|zaad5oK*Z=IZ{PwT>5^1-=C;raInZ24phh1b6(T!vLZiC^maqh4z zUU)qwN>b`EA-^a50f70_jcJ17W z)`rc^4OUiGDVIz5woNDm%C?E3h_u(B8ABTOxN!Ci?|<)cytK>4++|z@)!HEU-gh@& z`P0ubF}|Dm1=!rE69o+<8q$c-kPyb22On_wqgT45sRkzpB#2Z)z6dB}oYLvE^(}arTZ_qCx<*2JJezgR;Ejn}(IuRB5#ha^Vu{4?Jo)rQwzdyS~qBaT84 zU@42axjD|AKTosO;^>hh{NM*3C!f!g@qN}eHb4lfBcrt29gGxguCCJR1k`)bN+69j z#nJ#5Pp{H!tYgJp!k|qO_qcrSHGcf3ehO(pv%X1VZJH?TC$0Irj^STh!})s~Z{`a*aWBh@ zF(zsultkGXyiAeOW|yXu;ri4(BX{iL+U1l^vyQYt<3f)edUavmIVfSVT9{CNGZu?vvh-i>6uwBUbsMN;N&|Vrq}6USr)EkF*kJ$ou+JvB8e7M z3JxZL<=H991sm0AK-i|fG{@0ncQUg50Ml2eF=9c#ykePBz0H-=*J;#aCTy6Q zPH8tcNW#t*FK8hw4=kTzF-I@eXu53mRQnxUal05M=vV6)3Rz_yeRNU`)M{W-wARFN zjM0WP)dbxxVHgrc5lNJwjX`5*)Y~LUOwjFM`kOV{bqK={DFi}EqBtf^G|IO5@|V7Z za$WZAKfs-L-NWqc6wxk1EQN)ksA?RJZ1t4+JzCJ1^&aYPh_#8JrV@-k5zV-PgzbuzgE zsg7wj>-2g(dO<)Gg>>6(I^8Z|9MkIs^rDCu!wWCGNGFWwcDsD^Z~rta%ZnsQiluCx z{`%Jmq8M!it=uG92&x62m4zuh+aa#6VF|&B5dMv%c2ERP&hqlL#yvFH1IG zpx$aTyWXQv9Uw|I!{svFjRg?Ui^27?AT4aiL8uJE%7UE{-%HCPZ?|=7osy)9h@*%k ziizWxG);)3n6TF)O=5aM2cZ;xp~%YO0)8&f+aG<5^RJ#lNJ$t)v^yO--GDHTh{BLq zYdYP4mtTH`^^Hv&*X0*~^*88-0rSf%*q+b);u4E9^Jr|YMHSkWLwF9jgcxE9r6QSZ z0U;#KMvH@Y-pj<~PMVE6x)Y+CZA=nkI}VoA%w3zJRZmc!g^&UfbeO1kZx%PPl%Q;E z%R@R&KQg%)@g|Kgg!o>0n7P6GC}o+Up%JrVau1&Gqhw!RAcaIKMX6E+sW^S^9FCtM zHHPa~F7wzA|2P-Vo?&ighJ2|+zED6ZMHEJ~x?LL07RzFZB#ycNk$3Zs*AD@)TTWubhJv0b~UFU`|S;cXAS7o+BmJ`Z`nB7qRm@33W=ra%e73leIMWpFGNQr!N2&%5q7CjS`Z?q@WxSQrv8( zNxqvv6vo_S8Qbj^&wTsa`nA)i5lED!u$1*?^CXTUI_)-Y#z!j2@WgheuU=trbezBU zFF(a+|IP34t*`wxLQ14mBymj8Y2&*#dk-Ju-iIG$^2kv(*Vj=(P#vt%3nQNT(qECw zSJ7$0sfCDW$Aj1wj8-(A*$qm57Q%!~#^&zjFj54c$%6#>@qx<}xd*E1(k)2AvwRCV>o%;F) z#Y!2+^%)o*Azvz!8bf1ajeMz$pYgeL{tad>T_>9@fe9lllk7`Bj9D=x;wNZUbK zU@J{5dTcgYJaGR*4DD2$eYHcJYPw;BHUi(vflgT2=+adKI8GMZ7PMCzv}Ui+s&7&( zel01)jL36Zj{aCe3S9J9o2f??JY2iR4nPNs@#{qd~D$qFAZY zsy8_G%yZbv!}qfoW9ap|eCE@?hInTQ27ZE8&#=+5vuO|q_!%47-Zt1LD&s=SLt8jMkFOkJhBu|ODveDaeY$IX^G^~QC6=5PH7 zzx|oNAW34Bo5e``tun^j0fqph`!URzev%jj9rT+@LDN5H%TODe8w?DMu(`R;8!x}e z#N=KogClf1ZK614cIq0L^*pZY;rc$=Y>q;)gy*|-TP;pM`yA~?8_&;Sj7DpipSjFm zeD;qpI^q7t=eXRuhYjl}%j6idJlef3W5YGp8y!Y=O>+3|D$}#D-s;e5w~2ZQxpEF{ zkF`dZ*_MwpHjMJ18^o;6UZPpwWZT3p%9R@5c;+=$n*o_Zk-z(+KgjQV{wpY9k=h>S zX3&321IfCbcGG~?#u&Y&t~A`-W#7Dylvu9IzC(9#_T?9eqnJ*!$-wY1<#HL@b#Xlp zODRCm-dJaKc7|@J14dw34$87f)0m*!Y#e7Ko1^;I_N?;AM znc0ICzK(V>thOTVzyDoSfm3zp20daFR<1y)Hh@uzg^h$LKY^2X@G^?kxp~@~3p7K` z;bSLg2QhPVt6+ItzP3WMdkqyEk|@T_>1XvqNR(7aWg(S9DTS042@yfP&EotN zOEXglBiMWB2+C4OOQKWF`oc6ne&|d5f%pj;kxymdC|wf}7>j!!Kh7G^jX^6H;buwW zh){SWVMxmvK#o+fT<9e+OH-E#qaJ=`ki&NzO)qdEzJ}O%imPB9$TvLl6Sj^GKqYW~YwlXL#4+PcS=m zm9sCuz`i5Lag9MLi4qoCX_QVOk^Khj+A7yCoo8`&n#0FWuxH;vx}6rnlGw`bH;ScT zd1;Zo2RC`w=4bfk;3t`F*m$DL*xrNOQG`<(>Ji9X2^}Y73VA}Kh(cJk2FVW!2n`F< ztF*hTL@16QJxpS`oSE4maf?V&I;|d+jK{-IJj}b__b9*l*(c4@-?<6WRtW#@pfBER zzh!cHks`5`g`Mg51$B~=Bz=8w81`s2>iB+!!*?7fn=f-_#pOHBLD~mC!e)CKZ)1U4 zI)!Hfzz_sof^LT-21?b~VjHTLY95Kq5_K$L&8mXu0~G)YYV*U}t1cDI?o z{yL8BpbdQyiZOVePo+A*@aQO!Eb!dbm~)p(^qfI(Jdifc+;*Bu(YX4j$k%=sW!t!p zhcPKfj=znW=^4^glgZdfB~X?_oJ90mEs`+g&cjEza_J)V)n#&(Dvsy#>mT07NB{8a zBzxY;#W}dL0G0$>f+cNidjKbZxeY_c3D8mlipAA+dPxhFDN-HxnAkqS7rt?h#LuCU zm_!JS(utd;S%=c%fQjWwH%wPlp02ve5_kM3k863lcospliKORv)*QyO5; z-S?2X87{tlfnKvM^p;$puMWFS47+uHA?S2Cd*%%uedHmooPU)hj%Woj&tGivAHEjS za|b}#pe%|LL-ec|yJV9aDWGhJwAYsn#VUvEx)|5RXhYEL(CxJP5&_XdD)}aZB89-q zWRW#VGiWn7G|aZiJsdoGC*OJcX}iyzuR>@!=o)2v@&a=gH@%nF$BMDjvQkSiDI z23@AEUt>9JGqQ6pZr1C^Jtu!-Rsx+Q_`c81J$nhG^QY~& zLZiOPwq28~Ev@kR&-^|+CwKAid*8?E!Xip#$QN9UFs!ev(Qb6udvKDh1;4OE@y99j zdJeL)i0wG!^BIIR6iV{JLPY=o6~0MCK~x3aSe++P9u^jErOZSv&%j`onYneYZ3GzK z!&vH8O6T^)_pL>FHkT7;PM_h2{{ENP?D(Yd1lTrs3b*PoxqpN->X7tS>8;es7fS3J zt#NI7nuWMWW$XY_DP(p4EfmTm1aZjZ{zFu%!({v^4A2XDH)eH^Qc*7TDeF$VO>KAt z5d6{q@jGSzlXYaBzrjXOsCwpKK;e9HrP}gSb|fdrA)f>cuYT3`4sn zn7eR+tnX2+l$dQqtOhYSF4byeUgQHFR@{w6(&{u~809?xwrGLVf8vmTjTk zBGN0O4P^6q%GE)Z7ZxcLi+#aN7?P$b#u#kd!E-$@0%O3k9bS3yIWC+##k~(ci0AvP zEG$wgmq7{=eWQ(Wbi*j|QKYVnoR^Tb9mFjgU3F0i-} z5F`n9uD}K!9WBsOkge6kO$&O<@Y7Aegp_aQ@f+>bARR)nft<+W4%bleI&RdWvv?gp z?c$~(cHF@;A#T#6wKUCvy$ATaKl{@}jb)Srsg=PgkC7%Z#ZnoJU~_$)Oum2+5Jxdd z9An!ymepTTou(8@C6s0Jou{9|^;~xD*-NY0Kmbx%pfaR!fKGZO&KTJ-i@Z`a1k9x= zKYY&soik5kE5WwOT`0E%VT5rU_U|3TD8bZHgRapG)GDNzJgW%=af(|k;1;v!tunEn zZ{40i#M~^J48@Ew*&gA{OL$HeS9yqFgJ5NvjhTz&EhzaO8KF^0m+_$?jvX82hwp|@ z{p+<<24#x{g!g**5X^6;O&a<(;!RYunuH&JEij^PYTY+n+#ZPw2B*qC0Y z6WKIcT^>GunD)5~C2^9?yL5qEE<<@> z5U~0wh>k&&u?7y3op2GBqOl+erk3b!oTk@mpc8@7efR#?KY9Q;-=NfNl94HmcF-TJ z)0(_zv)E18h*H+tG1ZDs$0!=9h01t{TV;si_S0+_b7OSIV1j15S2QZM7PytKgD>Ix$hJ1A8Kh{H~Q$j#e^H#kVP<^eACS&1LLM#h8G zvWPlOT(ONp#pBXk%B$zj!;#=4f3o%MyuVTnD_d^Ibm~krAy9(o`J5GIC&Rs zSwbi&zrVIZ-a7m%jff*-lAtfJ4Lg`PpmpgRIx9WpH?inW^gpy>7o(u;rGH=jap|qw z#EsXH@d{EZ;wYt1C{ip9vCwpxJO3S?{lqA_6&(`}&B2ov`pO+cpv z^QSPuCdJ+NqDJrJ{8Y^0LY|jic$sD_*?(e;sg3@iLdRI-^F?ymEXuY?jVA1MsSOQb z+Yaq!nNNxXv*fkHG*o1YPq&<%cXHg>QGok`2l>yw`D63JG z*Pi)nF1-3J65~@F-9^T;*<8FtV{?f{eS;ml458J!>Jay0+-wft5fDVU zSr6q(%#8u_@8yyb&|7S*lu9S=E^kL(so9M_Yrh9 zn7;4=jg1xF@$SbM8W`rcf8*cro})j-_M(NpevTJSiTq#{4}s}+s5uVC?vnspiRqRU z}YqjZkStE^w=&X^g?4+j?k`#2h3Od13vag*;LW0H9^jb^wn)3)tF?shf0zcx7 zwGNpH3(_jq=EGPykW%A29>#z_c#yG!kFt6G9IA2vZ+JVg0k@JvP6dRk7w9bsBrfz? zXk)M}2ivl6y$o(~I~%<$&pq`rGp|33AZB>yJvg~BR%Xu8TzrjOF-M_NVdmO({>8ui zMUrhl#+Uy5_h7Y)Zb$6faUXNVGTo#@)>T-R#F&(J7{65=W^V47x8z~BxU6l<-6tLq zVWWW+*2&cN<5nhda>F>;%2u^-bGpPtO@gJ19D<AuAWv0$OMJAVJ?7;g-)Ckwle~WPA9OJw8k!aYxYdfF(g->%G`0qX@*(Im> z%Ab9iv~mcm-Jo{vJD9LXqAWz3Afk{cNfEcWq`0kx8T01EgOZRLKgywp9p3os-^WjS z_|;vQOp&B9L)=~@3D&ki>rd#TH6{vJy805`-UfF+{^K+olXQi{(#kSc=N!uM5t%GW z9MUdYINjIjOn-yUM4Py{kGRt$9_leRR>ihmqOi9`24peH#jYG+sV=#E>I`dhZ=iIW z!STabg#*kl%+Q#Bj?qCMV{NCsvC0P?{}2!U$P+w$27ckh-{$Ry^8E6ze~Ruee}NaD z`Z{;ra~FK;!ixoFaF|3_~-w4 zle1^faA^MsDq281b(Z*nCs5-Pi2hfG$XhJwZ|d~>lk++Sj9;h?-uc+aK04pd42*7@ zq?pOFa_ubiHn1}VRJMwf9l|Q_K-hWGB!9_T4d3M9eCji+oFs8T+FtS zQs6osekQ}I7oWv;T!x3ov2BMqiP^dL5E~m2vkNVD9{B-Q*Ap(BeT~(*OW0B~Fm@D? z-N*dQb?S4^P{@U3azp5D%%hKefG7T&pW&tJS^n{V|1Wsu^Z%S`-ln$qapEN9l^31{ zdz2sj@h5oY*(aHwyF|6>pyFlPXP-e1A0Uc4(~D34#plv6=t^Z-NGWg3Fx)z8Wc5u1 zBfLWG(EX2nG+(OL<~L%-cJ8HI8DwK&nzXr!k^;*wkgbej7srwLZHU|$xFxXq#2&VX z&Qzg#5Yt{|e{>$HB$j1uZ9J07z#!+&yh^9tWprW^H(MbH1*1DpFtq(BT4Y(An_>F$ z8Issg7}!l=@E~jJ>nvP(9$zmrIx+K(z7%bK-V&>{8#o=uXjcg|lBZAf@aj%WzD)QMZ z`BDkDFpSBJq4T>D#XZQv7_ztxF}{;HblBf`2FG@gmIQ1PEg9RkpQ&q$OwFt?GI=MJ zfn8W`0aT9b*DfqYv=p zSI+T|e(o2z`tARVN;c;31MlPR5Bw7LaFx0Zm4SQdPW?xcV4BmXPLcBy-u~cm&Ypgi zcB4V5l*f{WwKLDnY;LT6K8<=?fC*vJB>kQm*EH&gg_&uYsZLP!QmRU^(kS3%w=;hC z2dOMyV)5#0Y_2R5Ynx(8QmYji_6l@TLp^nAr&$77CC!1{IY_7Vb_#h7x`$4-zSF|n zL3Ustp}xjuBj)7LHhPKR-YJ)Yhp3u72G2eIAs2{`n7KSl3oWe&FRUB~gReTX5drf-6 zre$1EMM?wX_{AFCNVD1O&~A6YcF9-As03l|vF{kEG2C(J2-SR^ z&wcv$_*cL3OKhypQX8$Y_p#q*{N%@RN;}AvJ$fnB8_;b+cYT#mIM}Qauf2klnzN^0 zrCKg>@W?Tyu3kaw6lvMBOLMbdNYk`~5K>5`zHbaeh=C;Pebg9LON5PI9>!82yBpY+ zA}}tEKwx`Ca^+E+(ipK-px%mDU2Cw>jOb|>RoRZa$H5;FDLjxWwKTs$23`-y2NHHVEf^_Irz3m=yf85G3?#3mxVX3@O!`W zTfFq0XUW#U6v{%;IHnEe^z;2%U`nUMpXa0aj zv(D)DgG{{d3zXjRcBn!|z(^k4C?so^C=Zv|FtFZ)cyk4MO^oqy{341raeI#cyPb3Q zjiZX<@ORGa%rjgo*~yhK4{DC_qAr zkdVN6I0=cfak75zuD$cRhhk>!bx;brAaTpN(&*0FyLaZC-|u{$7x3WTDvgN-r>5sv zUwd?Wdvo&}=iE?5JyGu;XV?pjHcLVLtpAMO>W{eSfOxRO;^k##-dLo&-l5;?P$|_Z zw`08`k9;{Fe>&#vKl=geeFq!wp2Lg2gH-LII zYVC8Jn7P2_uJY%~Bf>_TOIJUjIysB@4K6HQ zq*`fm2$d7=ykTY2FibP%S{nuNLYKnU?B?Cosucs;_U z4v#2r1M(&?ZRUWIc%7{O1o6r|?X3N@x4UyKiQ}~*E%HQFEX%TSZA}pM;fU~rXp5lo z8KR%yvQr{{KWHrs{S#->(+f+o@YXvTw5BZ*&jy2`MZ-v(^TkRvBWPKq!hw(2lu&7# zE$tZ1*xCA;h)Yt`^Jq52(ipk-$8Fo{Zm_U;j@QndX3*QSYB`YUlNDB1?sM~p>ufyl zQZ6?*d--FVeRr0)C9?C}EItr%0&QQUT{Ejy^4FJd(4c1-R+Iw0NO0~=!I zg9X?@MSqCwM2l?f>~+pf}_OoLk8CVIqjKl8mPj6;sg)CGg z_J-NWahoUmg>iN?{b~%a=mfDB`H5rjMA5OjPmX0Uvf|D8vY~~7p#|$uL_}0o3dWC^ za~Z|ND93lMz#+<*{3qkZ50gBwn0lU$aF%wsXgTC}j*%tAIWuEiu^vGf3v`tn3A1K} zRee~#nT3ipDho4hnY`C`1Irlov$2qt-`O!B*p>}IOu zo>?)o!pb=!f#wz~b4EU&_mZh9>S?}MV`N$pZ0zAjKY&?IIXw*Gag3`RyDF%Tm-7l* v>fxPmA|)~6@j}k4vh)9QAmIPUza4)AZcC-3a~@-=00000NkvXXu0mjfbZ5r! literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/hyperfluxor.png b/WebHostLib/static/static/icons/sc2/hyperfluxor.png new file mode 100644 index 0000000000000000000000000000000000000000..cdd95bb515bef7d712352f33e40f92aca5fbb871 GIT binary patch literal 9261 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 P00000NkvXXu0mjfj`g)7 literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/impalerrounds.png b/WebHostLib/static/static/icons/sc2/impalerrounds.png new file mode 100644 index 0000000000000000000000000000000000000000..b00e0c475827388aa30c6470055aceecb04b8e27 GIT binary patch literal 4347 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

hpilznk6nM#o3T-srRT^HN9S9KCrk|Id z9YO(+MiPyrZmU<`&&%RJ22;9DA><|#W<`h%Sg&}X90{?JL`6R@HQI3j3;0G7dBFGc zvbS}!G@245GRCN?s)(qy))Zx_s7e$?Qaa~RFLf)ZqD~P-MRjZDw3CiFTjkZUwT zWPA2iN9Q3%P`P%XqJURM?gI_?^Ve%nGmW?IDS#EkgtLql5(68Hy<(xAMv=(Y_3h5* z+^J!sFZ@WW+V%8cqn3WSm*ofIC@RL9b?-_iQ5?(s+$?9#T~zg+y?f@lbah$$u+Q7( zM2$x-bRk2<1>qT|;DVHlDn`LqLNFSRdlX{?lURH#h=OJwGKWE-5n<8@RYX+7U~`9d zOKj;86}Bcww}mHw+Y+2YY+xcm>#^WK(irnVTN;N{F8!M;^4llY^0U`z;139Fbij|) zcDz}C>qNWtPvR(gU|4Pz^*Aoa+v6rH3R6#0ZaH*7uPm)do)_$zo7Lq`59cy{+q@N9 zczGJwaH@qu=Al%jRHW1}^5H)y+#{N$wJBMqC>cL{gRo1_2vztLYg zy--{l$z-Qu?R4y}dNEc@c8!mZ|E9$8n{uy!*2I9d7V8|w7?LO=jbj#9R(R#qYpnM& zrjv+P>@f;;3quv~iZ_54q?&K1BLh^73Qi%3pp}H#FBSSF^b4q2m`b6Ug7csTtU#ww zRx=^j@Yz>`(8{<+LbHGhcn{+->>GozSSStbYQRTl3_pYp4OO~nWi-{1!A!3NFyZz zA^~H zqCw535;)Kj##4b9=9}>GS;L1KhG>5f7RP~0@X)$>Yt6{)jZD(qNO-CmcRHO-?>)vC ziozk*vTJ^xdXmuZ^(mdBbdIrRgG2lFa&Z4%YDtWi1(7jCq8Jog2}`8N>~}JWg&cpktjxVYe?prfrR%nDI6FRCTd`kaNUp3 zSRShxPBhDN@OcD%!AoYCNNuvq&nY7nBujeu$fiY zl5G!cxKf88>O3(wV-h3@*;o!wQn&P4teyQkI-t=ao*EvHL;Pwl_et_zQYf14RoYg zv4O%V-5k^hKQq+`z6^rqDX=^9t~$s0+fHZ$c{)q9{bezceX)bllLY6SV5yDm%=9CxPz?-z^=#d&P0F zuOv~pcj>o4@ay`p9Y(8)D)m|oYYeV*#IdEBCcOK{9^~@!DqnxBWG4weT&s3Q&XRqAOf8^1e!hQ9aY4%Yisrh5Z+#N0@Vsz{o| z)N3grby4CdW^s9y7ry@j%{b;AZ+VzBvgAdHiX8^XG+E}m8hJ`%`E80H}| z&NiT(j?jKE!`#729|mqa72oNf1g)a(_VJk->}f*NLKF%0I{d_x;lpi9(gxmFX%@hm zfzJuNVt64}erLh6k||?}FvK$~;L19z!)Hw3QRQWVi9g&0qS)ehBhN9#y2rRWhSR*qO0c(}4gykV*x(#%NYke0xgcqwa zpTe$YaP*N8>NR-(wBZ9SL)4alvF@(Md$qz@7nBz=$8TS9tmM$N!cdi74wu(qX$T5> zGd3-{krb`9ib#M7a&2y)#?q|UNs@>WR1v`1C}0WoSP4#7D%g+}LS90{3S%`-5($0; zIZQ}}R)$L9Bw)BIK{q4wV;i1$r$i#mHiXFO&c|^G`lu?UE3wvYnMhGZ#VE3PAM%^RIh-n2uPj25Q%hqkO3grL7?S3(7#cMY z30hM)i-giuSsMaoak7~a#iFd^`$!l7!s z%Mvu}g7RAC`JKz2r5qAb`d-=S!=+8=mO>l_;M|CylWmb7KLE9EW|FkqEy~g{%ra2L z8jH1-(uIWFTA^OA@xsd|vDWa)$=8@SLNiHd7?>Vc$_k808X{rt1S5(y%H~j58$e$9 zF|%VjJ)ojUl>vK#X3aFAX22q}Yp@BtwFU2)HAqe1y&i6raFMH0X%?KyJfFDiSr|fO zf@ZCE;BpVT9+FrYPeKNQhN!G>0Jv`bz&WRRp3xp_5JeHrIm8;`II4sdVXehEPpeU< z*=R66Jxx8aOh`^Gf+U5h37Bd@Dj^a|<*~b&u$FD(t`UkKIdr?_=oRrHcO!wFg;60F0*)Rrkyl)-xD796t(hMZ~LmttCl?zg8$phZqau z@IH9$7{l(dgts0ZBkT2esqgv2euJ?_jdt1Nz?kDuD?XWSBau1L_{$NK`W9t3DK)4+1Ii>a%+Q^ zPB=7&1M_w6+SlT#(~gCHk0TR`HPGq9#xVE?L#SX#7fm60vyLtq(&4B3~5LMCH zR3WrxV4+Zk3bld27lVVzRC!{_^JiC-OoOln4wg6IN*78C?TT6&IjW(rG|O)RV*A62 zAU}X?(=??lOUf)mM6i(w9J!cK+A)U281}Sd4j*iAWZcvC1#j9TbbLvFP;hX6$f7%g zz-9Rn(<*_sQ6qT2!@)~Pbs7;&jWi30<0=>kh*4C9Rs<^re0tII-YG-fz=ne_EP1}O zri{hG2j&hoI>KT<_`QiL5~>DG?-j6CKygiNPW6Xr*!5cGMMTG1EdcU-1y{PQpNJ|G zsbwk>#!_H5=IESfZ_RUR6`o(}@R9j~`)4CgufWEjiafsJ`Khp2rD>r+67C$#P_ZI7 zfhejpLD=H&^D3FF2|Tl|ywGu2Aal@jA&YQ8Ucy>exY`Tnx6>f3QKH`~VLcC;T|LIm ztXp1B!>$dT#%QBamn4qK%M!01F(%N`J|hvs9dnioF{Dz$n9z(o-CTI~)gC{-*YPvA zMXY4PT30D$dz!33EW*Ht+Se9u=3y*Srp5$Iz+h3lqYA{RcnMCFo>L+OLFg7iAQ2&_ zbOfKb+JS|R;%(sbYbIR733M~qtj@EeN)}rjp5IXjzNv=ogcWo)H!&4-7-m_hjvDYK z>`CFyX~TCUqTP(3A*}U!M4YKGmMGJW zaLh>%7P^B?t)9@boh}uXTQLDLQ2PNLzz(;rj_RH zsCvJ#T+*wu+3krSl%=CtZ!+F);Y!C?sXRRCxpTVY?S~E1lVhN5zVvF&bOit9Ju!{M z@WLg>N=F#raVluVNJIjq*{<P6SLP4bIJT$Y$;Z#}{N@Coeda75J#3h4M7(s-v)qA>`mG$p$aYiBh%GgQG-sj? zu@RgJzRM$cvt5uK%|4a(q1TquR25@GC&}6dEcHO5;IrZ?4eo0QJOif{^C2P0zm8l; zJTwwm&2QXo6y3CcN8&`hmk%R+}-Nw~(1Ag@%f1S?ekY6|+akMey&3jVTdvJM0S@)2O;{CS2 zsqzC1LQ|A>L#U@gD2+HU1$k9%a%gp)>|j@Q+qqmv?HL38J}h^^CZSYktBhn&28>ns zZ3b6&R2oec8DoX{F_><{rQRF!VOxJ`9GkJ!ntYfsZWG=*p7A#ysd3ArxA5X~tNhyk z`W@!;4SwU%21bR;o65x{Sm=1xJq(R9EP^l+D~R_L6^NX)LaQcd4C@6XBHJ|eXf$58 zdM^MR+l3WVIep#1It_clZ%Gu|3QVN~-6B++eDz!1QJQlyD%2<`u)8I+TY)+8uhWYd z-K?{3I4qb;g||$W{KA{--15L~KJ)3<`1OB#f_Kg3{M9!%Ss%cqWzWhG)|}FFfiVp| zO~HRe)x#!)9*To4MH6AAP>fYtv20a|tb%tzW~Gj@f)U7+kPrK9A1DIZ09JcpB(0?K zbA(2gZnj+=_t(|1M?SCt>>7twBT!G?zkciD4K>WG`l(3t{&vBK?;mI1t@He&PoCmy zkDum0x!3acgLTfXDi>Cj6^hGo*jH@C^s5O)>)FB5>5Ti6>m~9!Ba>XIE;!xJA zLOIrfHz7|PRmwv*o>sJvY~eCvA@9R_H;kf@1gWT2!YV=rVXO0uUaMJ=1g>$u1Bu4qk#kw3WbH!2CGW8ll#pRb}4q=mWV?Z^aEO-;u#j@0rsV zdrf}jx1M8i?F#?PV=3b`%L@yR%N=FSc`_enuw8>mqa3>x9{THW{8nKs5B(8|g?pzB z6S1(b0sAHbW^x5sl>4R(A3kV#`&zrKnWJ6^=+onN81NG95;b;vG91YRs>`CFJILx*m!gNE}T`GPlFru<6+^~HI zaBI~NvJ8Aj0|)Q6!+xp3`H!B;4TBkvG6$*Jp}JZ1OlF&DkR61)3ZyR3Is5^an63$9^@uY|4p#=^Z?g#86crvic0^yQV4zhKj1kC(*AQa*di2g{j%0a5nNNbS zHu4a;O!bSpg+>}EbXz05NrmJ-%YB!GV>RJmTX|+dnLg;buU@tEFA1qprHal$|N z4m@+Ue0mjHpckn0FxVdfxB_(Y@K7V^3s95Lanr5^ zrWe|BlW-@CuTj~$rh;;VhkKVRbLM;ytUE0kDh zfY}Os-;=Du;VI#4ru0jppFzJ+N)wud9YR+1lsT2H?(FUEzftumbZ}25!t|t~kx-P| z7)luxVMZ;U+aS2tS2Pyn2P@yN-%#g0I;>iftPKFODZ+eHm}v$FKi&}Dbx*{p3_kXU zT|V-s8F{ay_{+y{<;2N8xiuVl;1vf1jXHz`B9ZVikSff@FgF#Vp}ML$rt0rEvVESB;ET&X z^m~=htm*(aGf4{&TO*aWm4)+6CT8x(Cd^0YQ)cQO8b+9@1yd{>OtytL-4*fWS4)2W z^Epe6c_gV3Z>;fPeT9$S>-nk29;B~L{^;|sFf&=_k$2vWi(-b~TcBo3%x!VdvW3dt zQ)nzhkqf<2Q4^ZzvOGlHUNNH21Mg)kWGj`R43HvB#=_jB5G8^u!}oRv|5mLr!dODv z=%50@Rex5$fX!Ubt>pU0x%2(lno;LgSvY@VSYZviX9jlH1UC$22J3>-+e`zxWDCnenmz z>ceE0kFfTcKVh;l!2VbRo+>H7rYw17sjQOd6vQcUE_8k1$jnyBbbD=A%r;<(fR=^H zNg#o;2o-mS;6=8I#eN4s&HIoIL-e!?gCh7&Bl@GkiZ~Ln#xoIn4oz9oL@2~CR)@^O zfAhs5zwxs2ru**Tfx8ay_{kntdc5PUck#}#WimG*|*Vo{tT;MeumlmOK`$#XB^)wm2L`BEh~!=`U5CRs7HdhQFW(cZH*v4 z44@%GGlkZ;LKL8bv6X=s}T%+JX2WtlW=GSJ;`tUekASBa=+6nSWxn z@iSMYHU0goaAwuh9~NBh9*PM14%WNM zl^%2}zTH;spOFZO2#E^qNI2LO_OxJr64F#~E|8Q~WXp6T2@Ncf4Slw*7c`5iiasnu z^d0%Nq2v6O%>QxjeD8Xbyk20gaGqT4+}OU`KK56B>U}f2?my08&p}Q{^L%b;n#Zr? zASH+P?qOJz^s|gxj~paTEVZ#Z-+JycNjk=V`q%H~x$mCm(yFB`8{Bq$KSgtr|Lxa5 zLpnCbXJ5{Vm%7~ENLV|o9Dcj9dk)sF1lX|B75Y2ix(TEJH6x@N+BEOqB}A!mvhTPu z@Zf~8*pO7E>rppkWQ15k-M|loVknqMutq3Kp>)Cd$JJyEonE*!^nbKNU^0@;4F#4Y z@w^>uer$DRFjH5{)L4VLy}P;Vf&1}Z_}yP9M|oi*=D+(tzfC=bpF3oj&!N^;=HDHtn)4?@ zakX23+VD`Rg~SLAg0OZsg@^VFi^GyXy{K%)HNL%Md0{!{Xj?ciX31R;(3ZAY@B{Ee zAxT2-ZB#9<8Hpchf{8Q^3x#d=V@ozrB-~UHXQKq+X zmwSnKy!AFd_4LaebZgvwZwu}&XfG=B2u~PSQ8BH^zE%vo+QMzK!j~6H z{{0opk-cLKwLv%am|}(b*m1mRxMV_AT?s2xa%XS`7}roK5(#P4sDE7ruRi3kDN2G+aGZH+(x=f$}n3>M8w3U{2M8u>n7| zfqmn`!QF<1wSrH6Gv{;%9@}k5q|4K%mAPg_t7%E2lus>tE}qU=?v`X&Y?4sAu%1A~ z5=9Y41ZxaYWJ7gHgrOMvnZuPOSy52>A6QECI=N)&%=ce7AvTI=x0<-pVa3pDx3Jcd z4@+)6w3p|ef0-vvc6iUj_we$W^PC3W^uWEm^vbKW#>Od4&Z$M=>RQ6z{^^JLm4EW* zeB&<``OEVqzxCdj2M^3Ogne_c-pTocmkbAwALZ};#4LyB zgmY(w(k#XC=3J-WWZ zxwGd;i~%Y98)>LhfMJ%Am5xTe&ei2r46ti%mLyF>mDwmyzq-bU-g1-|PJNjtzxxtz zy5~42&zz?{R_B3x@8t0(zeQ2z{LBYFz-Pa5k_Qf@>^iWUdwUo8{l^-t^*k?ZdenuG z?&AvC55xNK)WDQ6%uk2e0kHr830z4;K~xC+!t=Y&7TodhZT!Q3`cu?f3A{33)hGwE zl7)?o{^dU1VV~(4w@r==YVlT2HAi@LJtrRY$C~Cy64)#+sx_im{fxbGsM} z`>e08`!~#oiHLgV)Ok;Tm=RgaL~9HL;wUC73T&JZrwLzrae<=;cBA7Nubnza)A#8N zhb;65;Faf|d!F4j%M&l3<)OxaA3u_wmucaSvble3#9ag@dWV_!93uzAU#^tvFYrUMb5!J{w~xT!A%~3zru7?u#dQ z`2M>{law!f$b(`+`_-0YC$1&8+U zWqf=b@0Fq~iLIqI)}WRoSYvtd++}*54sqTK3sF0L#;2y(H$TfOCr|NIui(v-%4gr5 z(lLftHXP*uRtu%K)iM;YS0X}9;nud0spmJpp7XH}9_QzN`CeZ5{6+q+uWoSGS-h3N zmR1cbd0FC|!y1eC4!ox*gPA$+v3Tyj{TPc&%RKx2m-*=rJjUUJ2UuKQ;n=N*dG*y( z%K%VvGq(W#R;5BL-Pczu$vm zz(%*va^`V1=J26|+;zt>a*4RJ<@oITQgUl}wd1fEtaXEC>5i3YaTOW&*Mx)9!f!k` zGk?#!;GRR84iaGhZ%!B$EhbT z3i3Rs-|4cpyv&>KyNmVBO}_oqGaTBti_T`3we@v&&CJm4^%)E@vOM=c(gIWOoZlRF zblPySoK61Tv>z7s%U5`ekKw~y)YXK_a89)tC#v*sZa1P|G@*SzI>J6`_vVlbqQw7 z5?PB8gZE)82#c+dduSK(Sn{fwxm8Q?WdUi-!r~IMGs;xE#mldrrk=#iO^$Qw^cjvE zIl{#Fc(9--lAG-mbz^~f@8@S`^eqoRh_SG`w#m%&6#YS;B#No0H9FlMmlhV#qQI9K zoxEgfYLfA>23NWrk~s9ZK0FD#>hR1JPm(K(Yp||W->cuDU0xWE;K752uU^jhKhCE7 z!LQv-wz9z|{&0n_b|ZY#;+PJ63|o59Pz6D2g9?;GQIjEnj}}TMUO8kG}Jf(6jFx z-CmzlXV22^Ge4 z=lqXPJO0+s-plSr#IOJUMV?qmC|iakNw`{N71kQ!I4rt!-iN-%N^8Xk*4T;<^VihO zM1&-=q_rscxFSc4VYAyKiVQZuje(-Y8#c*$tyX$Z{FyI&nNF|AyB>K9QEU-}&0e2Z zUVV)$&zPN_!g3E?d+c$=fC*h&vUYuU>X)12^(wcTwYuxiDPDGrV(R819P{-{LCz3gh7^v#rh$5 zjh5zZEjm-cl_jc5ebfnLEOydXTTUqbUiW)NQFPu2(wBhrhZn!{SfGGo@=Evog$u*dyK>j;l=S;U)9LjzD@yJ6`?`B} zR^m7oK)bzxM#fT>xh(Y^=ew$l87%hERTs9zGC)nyiMEKXqrdg+kXM_t+GgYfSG7!y+BZEiEK4&O3ig-c6LNT?4H_l1IFEd*zvjE`&$=UEjXGGb*}e0P?sWMdV82AW zbMv{K`zP+)Wz&pylB@<01FoN!?sYC~b~L^y*KPzby1u(^Yp>VaE%W-;E4|4gSh>kg zoNr`j&zl|79d1g1K|e2DB?~i>L$qU0Q-9rlsKx6DNUz^a@g@S>xuw_5damSk1R*!r xTjT#JEz}*YW%33m_W#>||8H#U`yc(^{|#5@0jcp76VU(w002ovPDHLkV1kCEh^_zt literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/improvedsiegemode.png b/WebHostLib/static/static/icons/sc2/improvedsiegemode.png new file mode 100644 index 0000000000000000000000000000000000000000..f19dad952bb571357e72fe2bca831e127f3396db GIT binary patch literal 14293 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 D09+_4 literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/jotunboosters.png b/WebHostLib/static/static/icons/sc2/jotunboosters.png new file mode 100644 index 0000000000000000000000000000000000000000..25720306e5c2d580647e3abdcfb2bf86af30d0fe GIT binary patch literal 5740 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 IM6N<$g5

j{pDw literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/lasertargetingsystem.png b/WebHostLib/static/static/icons/sc2/lasertargetingsystem.png new file mode 100644 index 0000000000000000000000000000000000000000..c57899b270ff580c51980956089b24e629c18128 GIT binary patch literal 14802 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

UNj)5@82Mmt*U$~`bXx%B7W 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 literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/magfieldaccelerator.png b/WebHostLib/static/static/icons/sc2/magfieldaccelerator.png new file mode 100644 index 0000000000000000000000000000000000000000..0272b4b73892fa735ad850ba22ecaf0646b08a95 GIT binary patch literal 11459 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 literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/magrailmunitions.png b/WebHostLib/static/static/icons/sc2/magrailmunitions.png new file mode 100644 index 0000000000000000000000000000000000000000..ec303498ccdbffc072664429e7a943a128c84025 GIT binary patch literal 19193 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 QF8}}l07*qoM6N<$f)DZ>AOHXW literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/ripwavemissiles.png b/WebHostLib/static/static/icons/sc2/ripwavemissiles.png new file mode 100644 index 0000000000000000000000000000000000000000..f68e820397652a0e3177a9e03cda1954b1ab12a0 GIT binary patch literal 13628 zcmV-CHN(n@P)EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRF*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc| zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X z7MBvtE;LjoVfS>qpD|mq>-@K^;%x*u6x!xt4~)t=RD^P&wk!_Z}@-Pe`yo{iT4Gd ztGoCgxW-pH?}c913$9oECx4p--}x^Aw(v`4b>{*s~(_iD%gm5269z`W9p^M3%C z1dQsj2Lua@MzH{tm!8b1?jGR(U*t{t6%1v5GXSglS5*O<2hj(#x!_ClADZ8b3x24+ z3a(zT%LPwz{t3MF35%C}_SLLF{2Hqf7rbeKs2*{ zo>KxgkORi5_bL{Ec=p=Nm!La;lc=(%h3iSBlqN(At%XK|#;#uDa^Ux> z;LT%VashKUtDtD06}S_)_`fxZ$SPQdtR71+D!Zue^MF=Bl@*KyXdw_%AZ!yEvA{IJ zG>}mn<(2R=)5LmLQup3>qt|vbyKfKSeNT{B(}lINhujbD!S5eMyB@map?x2e2Bpwi zSB}qZ{|x*-;8bIpSv}VB6@uatVCjEv$QAPzaSkZUKv)LSHW8KymIaZ@E+Tg2Z_I{7 z6eAtOs81p5(};8&qdtv{8I-f5SRGv~{nig?|EF&-q4PLDyp^{d%=6BMO{lNkiB~8Q zy=*On3V}dqUA>;_b-jGM6li)imt=vfQAIUh4fg+ifJp(Sfi@+=FcFqfu`1I9QzA^G zYHbF>th^^o10p8Ewm}MvsEtTQDNm0PZEIuAAN~okH@%L5hwnn&{8iqb?BZST{|ap@ zSMuV$5An>g7sxdw2_D{qj7QNW7cB)s3ACu%$UJ!Gl7U-|=`Y*NS0Jguf0oGor(MyI z2vdS7kySu24X~=fStb|;SOzi{MMNt9i>lipKw35`EeO*QmVNL`G+loq11EQL^p8J9 z-JMVHx*LCsFMjo}=-Yja=N@~E=kL9X(as3Xtxe1fj3Xi@+VLt6PE>DKfY6}l6Kw@F z9|$i*YUL}C$ngJ&?Nr^51@0#dQL!AuK$s?2CfFvzwh&bp6fqkkoxrF|V$`NEYLggs zDMTWM(Nv4qB1m4eiA(?TUoh5g=9w>jlJ+0|h=0231KhLs3@bKV#3yfh54(5oA(lw9 zYscdl7cD`JWDpUna?bgCm(}pVg8eKzIZK^hMtRJa@ScSqQZL0KSzk{)nPO^W7#)T$ z2WjDN&!1ch#94Q%SQA#&vgQG+f+wR9WKA5IidR6^AS@dd1GmXy+3SCkwo7kh=PlnN z@zf*y{hL0(+uwc@P6#_+JcM*YHf`O;@uPd$`Q!r(#~s?XZJ_Xrr!ksq(Wjk?t6L`M z04-F-+U8yH+`vk|5-#Q|*oj&Qm=%k%cJsxwclR(gImy)U(0PIUT&@*o|BC8UtYpQi zyUn|xX;cBS5m6f=b|vtq;)qnd@}6yBq*HhlFxs2B?A@PZE?UFmU-~$|k!;}R@83n# zgdKrK>p7e}cz;aVrgf^c$cA{=gV`0ceeg+K5nr1|6zOb`+IF za5knP!b<9V^%(YYe>F{dm#x4~#Hnp=AyhCta0;!|xgcHzNzDKM(jdQpI?QK9A~rG+ zLBwOocmxrPAmS0Q?TQ<=)M7Q%;s!aQwViB#-=A}8W|+*6zQ(QBy^D8U`C6VHnc~Hx zCz+fa=fsJltX{Gh*KzpQAN?b%RhN@drAvl$Pon)z%C znTjKmQJ4oT5k*98%(e#1CGCiWjgy}wR=MR4>B-1 z#^l5Zh=s5% zbPymcqY{smK9@0HS=G3pT7hZVVsvyIC-8|{7MaNj3Z)XM+B%$EZUHNw&xBMM`a;m8 ztaz)G6?zc0k;xcFI)Sz<{JAWu7+|(F66;w^{q{?!TfGshz7>suQF3_t>z}71aQN{T zzs2ssF?OElqf{<2IXy<;x~y2T5*-BW-Ss?PsfZy2u~eGLRs(x!58l1cV0Jd*WG66M zQq)}X7If60@NW+i&g2m>3;YlvC0gl)X#M&uDW%j}YqZvs%Vj;A&FF@vX53Pd>FFs_ zwYB6kQaM1NNXC%qI5HVW5fTJt>aM(s_BY>1a?M)GTH!cl zvU6pEoi8BAPc!iF{j?=pdHomvj9>2CgDx55%SFaU&tMCK6}>Ac7w0&*cPCD94!=~Q zVf89PLo?A`ixDU?6aCa|-cHB%k5X!DVfgM_i05Xh`{di1{r;Tnq+`n#veIXKw2yNC8PC1z@(pt|Oq-ELKb;=YAc>>=j zSyM+bpFw#6A{s#z%gCApjf*fE3S)C995vd0FSOj64C_ltV#b{ms8V-E> zW=eP7#-INE&sf~jO)^nKd(`BoJ9d#7EAS6r`Exb_drll9DJ4aJj*-4Y^e$e9=Q!-% zy#ss?Lr5}{Q#7t#O*lKlq0xOT{>&dx*S(3MgL|oe^n1Ktr?_Ov24Ww-k>S2G3t(;_`B)F91=^4x#T;E)`LsLP`S!%uY^JzU{d5Y*@$ZZ+s7Hw{AyR zCQ7Sw)WNI{XKVwRh#+GTWW+?;CRSqu-kCET{_dA)zv)ACyyIiIWskw|PrPCr3{7^Wd(hc>KUKw0CsVnohFwu{+63kJHuJgPYGYH#>uq%h9@Q zDQBjKNPXfD2^*GBxc3g0-1;N7%(%SvhWC?iY3KgCe#wDcKeZcILD4~`5*4+gD!VO^ zFx4xlv*!TQ^EwJ3q{K7~oKlfkBFW_7X~MF{qSY(da^1Bw_b$PV#u*;$$H~oNM55KP z;yJM9xs`}kn7pt|P>NXZV&;zRq&TvRw%`36-#+{_Kf3)Eyw(Q3cgMf;?$=zyN4H(d z(f%PG-1!72NBh{Ycop|QcqjV~?qhjJ2SZ18;g?Eub}c49K2GD3Udl7$>`hk$n9Cn} zgum)s$3OkUPwBk$YQFlzuQ8F$aOl~`$hAj_rE1ZxhtZIRKraw&U$t&23t%-E{#zakBLw05o-z#(Jb#G+-wo9=RDRTKNLj!$`obE>{g&DCc!=HIwD`Fwz zQN%ohx2#Gk*AQ9LLwxNDiu?CcP88_8?l;+Y`>ovaXJ6)$O&9a^-~9u|#;19B#}gbl zbC`%y)W+*Ej3m!Icn>P@=xA5Zyk1uy4e z)#RYH66LuZg~A;1c$C+^=?1iAbNI+1q#==pq*yNClna=#ignG4gVHuD!;grGG^@{} z%BGEU93vG&7#2b)azFbOOE&%nZe1M>GR7bL_9rOMIXt=ZX$}q?!kx=u$v9n|tC<~t z2DgxBdUOowg*4RG(f9nbq*t!w=<|NFPx*eJA!OzD?G#*(zN1Ho#-k91 zOU3>l4}-4a2uz_L&LHO|;!roR6@ zS~p)r%<LAY_*nzJD{9KuBuX_vAW5Yao-|Zx<2&ORb%MSYw@4zxGMv7yYGjsgS zFMiDKlSAx0a+uSTBSaH1I&15AF?#$sjb@y=wiHHJ6YkD~2q%C@RUL^~2x**Oc0d@fR0KI!&{!}!*ScD}v25~% z0*O=#trfGGX)N0U0mXb4I~oNkk)~Op4iWp@crg;Gu={ijqb5;RCM-&sVLD#>LAra_ z@x*&BrDM@zzIyZ5dGl3orM7z!58d}GM9E{rstxRT`~hzH$FGtd8zy4eSb*|8W(EdX z{D#ZP7G_DzD(Y6O;gJXKW@ciTj)oRmlC|u6@mVsb`e}%#@n>_)_N0l#V}!#KmBbW_ zoKsH>iJUhg@v?yb3bf*!nnn=#s;0SBn^I#4g)~j_xmlF&6H6p;N(Ee}jA7ddtKxJXJnj)x@O7^QSz;E!XpD1b!m*4#o0j#oQ=WqJT32K_0X3qu4gNkrln)C zxbQreVr~ZCbFgD^q-_%DknGGfb~1ss49eOkjF^~-XeCZXEsThTj9TY-SRx8dF_Nn{ zu=>jP)A#6qFm~^q{P`_+(H&3l-JgD+@~M+-y67sVC&$>bm^97II`zON;4UBwtx;pqNc@ot4Xx3 zmSA86v!e;5KouPbsv4PPo+YqVC2ye~cmWF&ylem!jm0RG9cD5abl?((KJnUGoN^H_ z^zjTZY7(rw@(LC$TS_QGjCcei9!18hK*b{1ix&}H-GfS+EPm_nF*AIOT_3oSHCMlx zRg2f~v&SFe=;QbCrgwgrzLQ7z!8iVr>FH^vp`gMm}$1!$;7*yz-drYpd@G=5QIJ>ql1W4jON}RHe7Nk z>o2*2k)Z)*^BE#Fsfs&BZDhp4Y^fu%yaT5&P4BfIM}`&${^)~z_%nZw8HSt~?q}ra zewx#@M3X7*`r&s-#FLZ@1;$5)S=_Uj(DOKU=m3_dsJUW2C->~7VOr6>aXs-!jPbEy zqEQ<+m!a%>U=A4^eB;73@KzK>qKp2#Kvl?#iLC7CGVoS^CF)7og4V*JAa37z5N3m zE|z)v;a}1juVW^krSFC330)t{j$mlee!$q!5VmE}XvZnGCOI=YNb6L<@~ztme2?1N zT1H1l*mrOr9qsMl6e-T;h}6~5b@_JA%#AVH6-SK?({=5;h`s)u%nl4tfB&->sVHLe z5=xKkf_bp2lC@U)3|jx93YfeQaTQXC`I0$WE6ij}nTaTv5<8V3TgtO)+r@0Z`VC~< z0wX~IFAB4khqbB;+q6*m68HhKA&E4>D`jZD{5^E_UczI4bQ5p8@-2MnE$`)pl0z|? zAm%FKhJiOdOJ-tfJp$K73W(S?+0#RGz2kajCkClIGDq*`&Ger%tp6#h{s`apiX6i`J4;K3$JL$-74jELnRa-#YjpL($nv zy&)b&1R>J*QB|>6|C*r@)uE9Bv}xNd4a<7pW!I-05t;x^U27Xl)~#n+`iweR9Jhow zJwq^?rCi7$lO{TCpi?HYE`>~|XuR|WmaKad`@a1JRz++1&ZqvAY|-Ip*=6;jZc1Lr zuE*|Y?dr88Q#Fj98NkqxP9$*34$jyFo8EREN2Z1dUpT>Ue)=;^g(b#E2XW_0%w=Xc zerPYzM2!0SMzW)0OyiQSOVF1aA^EA#;x%+pKQ>CseRptmq@C+;`Y4C{PVhu>3U@Y# z|MUTjR08dIXg@$JjaF(g!65n;H6&A7e>zIrvoE?W))Y-#<;|H-V6C)aD<7Jog z@K64gFz|^dQ+TsE3d&>AhAot*Cz-hMa(Z$OH|+1@ZHw1pz3*mzw)0_bedL!MJMcVH z-7e9YB7Q6aVQ`k@i(k`;XTD@`UL6-`XiiXWucxVNE2-WdL^4iux|#ZxUNT;ploaHI zM__4Ec1^VqDp8|Tga`JL8y{xqxt(No?BsRt_#h8{_nX{i8|bJ--DHNlj^D$^OJB#@ zOk3v|Y<(ln;(;0R=`3%=wc?rMQYO?;a8+mqmgfo2yS>4*hJx|@mi@_OE=@k@@ z??lF9gvByi>q^thOZh^jvkIjvgLCsj6*jxRLD`@Dkgnfy88xnAr2iz|@CdRzi=K5T zOpOwAJ({GTS4v`9P#cMnHf?Ozr?Iw)7mtqdqr2|lgMafae*dk%&FB8&cWGR`me)2f z<$(jgLir9SUwoP%m#4L@gY@OEW8mmPVpf#)mJW(tX@30WKjyM^TXCZ%Tb8Y4-LjSZ z;2*w0*Wx8ye(B{LKXRDt)C@R2jn{0&vJCp4-_Ip0xALc3-htK8!S|kikgQXnr>&g_ zp1dC~Ge`5rb>z(eHJz>Suuy>)5V$U(8=fl@>PjmbLV^ljVqvmcy-->chO*`8s8}Bv zAu=_^_JTvbT~B?gj#NBBqIn7FbRE);;R2pkIAO?ixr7&s<4jEO#m8xrbS@`XXY96wS@8s6q*QWjBxC@yF#&Gh}`KDKPVnwH*99zV2) znFG5hdk!5Po$P-0apv-K*rs6C&mm7|Kvn9gItX!H2P=`FuCtNQahV+%J!eT;U7%_- zUjaf>6B_FGx-ZpNY`L1C8uA>V0OX1#N{&lksl-GnPf;mCA@Dp8v?i(ze)^-o#^`C~ zwmWWjxg#v^sHV>PeThQj~rm=-~kr*u4Xjl5%?w8a~vThf#(uQr&+z}Vp54T>2wWy zpLt!AW^&)a39_z7S!;a5K$sSxkc6R+TPhHii@1{$ zpL92?^or}yyMj*UG0&9AZj(rbACM?T8~kKMzs{^dIu zL4XyF)4O&H`JrL1xaob2XD503+uvs8wo8zPL18MxXkR~0u|#c69f9XDIB<%%Y16c* zjbLpTyMA#e%>~Jl?HdU_k09`fTNX{JT8lwdYPP%Pnx z4sJeAAu~mBdIE1QM`>o7ayEx$802QAa16=M?s|$kVe%(0-p{IrE>8UPXKdMeB_I9m z&+)>+y$qc?!Q|;vbZpv!W!iZ8IhJqOM8r#|@mdb-+rx6Zi8ufL`?&k(KV`+*%}61sN!K!Zrk~m2A>4^cnih32 zTLW22*e7O?5erpvFe4GX%oMvHeULMqy{HgYEnTdS?AtHS*Q)hPTvAm*105tH`p}`r z#iTRH%+Me*X5kz^P3h$6O2Y^cF)SjH7?DVvbY~rf*$icWoWKA6kJ+}Ui?2L%J268t zdgnbfG`8}wk9~m`_Pxl_6NlOJ=-tFE3#U|~vAvFwJugs-2ONCn36^&*%?TQ^bOaR4(G#js59EBwVTl^7a4#iu|2r@VXn z6@2}md>w-=7Wvzr;p>0-OZvXke zvtsL3{8bw{^uqIKw@7(%6kAJrSFPoAqt9GQAf7mb8ME;+`AU59d<{mqYa+wp_!IPpB`6N8jTCwa&FeuweVVNMP7Gj`$-XZG)+zOE4hg~*pk z^|aBraWzvr_S3s;B^x(vV(8dm2KMb@qW>ftwp~g~_i_qeh!7Ty%U2O>Uc!!lzLodC z;{&8yo4M=G+sR~SNGBSIr)mjwz|_oWp;Aw5yww|wV=$Dn*<{4Y{9U~GI-oOb;#}6{S<8i#sT57-Y6-MuT z0Dp3Vy6dmNlmg-V^!FX-%1f@|kN@PW?9OF*WdGx|W*lY@oM7t}Zy=ql?kVmQN<$hx-=W!avl5s?dMFKIK}!)wsT<5iyS<7fYA3DJhYe7hYyghtEZ#0 zm(H%m^t}7cyzq-VSsrhpWGU{y=a&qRo?%gYFR@6H7aqHhh-nfAA>*fqh_p2@(CFdT z*aS}<#B8oXyB_!<+Hvt+k91uh{^lEu44vV~-aWL|w@}PxdHkN+Aqa`bk`zZLXx+M& zS;MEiwFlb`(SC^8R8#45ExQDTGM?|Tdi7f7a#^Ov$B4%hluPA>vr5kEeUj%%ht>WH zErqrNja$m$7$K2Fl9``=pI~N)rf+@~$BuCH-Uq2`YvT(ye~m;u&V#!iV`$(A(Sa;w z&*Azv-^l355Oak&j_-V$$^Mh1k~L`8$DPj5deIsZ(q#XA57D-G8J10$ z>|KE^C1^!s%Oc`NgiRlKFGmi($k-hZ@zF1QnSJ|r)7I9(){8HpG@B!0Kr#^{mQ3Mi za-@6Ov6glamRuqYH3XeR%?khk6D>(ZK~#OCSlz9Jvqe-Uk6S1bk0)8WWCgj*3`2vb zNhMQ^jSMq0J;|$AzUTW;s)Z0k2we`!I`8F>zK3DQkcl``zxW|-sg0!GdlT-F6MXtp zUuH>b8;>5`#fwLurD4KjdSrwvu6_fiVKFi?%w*qjPVRn|y81?x?-ORT#1=KNV#{U@ z-*G=?JV{G)JAx1_$>jJLlOuzuFrdDn5ige~y>2;Y&K%{zoBxv6zwI|I~Pa*GWA+0FdnUw@aY z*KOj-6Gymb&jU0~1!Ml2I@C;#0}nh# zvc47(1_%`ri6_WsrWrqVoMbwU6>2hg)UW8p+kKpsYd7(x4}6G1K8GmYw77;%E5hmnI0dfp}7?+ zngpe(P1g{OM9^r(xrXYO(h6}Ntq`Wf47CttpYq56joYqc`Nr#b?mK_T#gTSC@yX9I zIGf|P0}r6j4AX10Fg$jex@4Lat2dHN)v)WKyBR#Rk7P293OtIV6ZBqtDXraI?Ed#( z5KG62T2@6ekp}U`dJ4H2{BjXnRC@P&uDBTg#4yvj3`;NCjOPcmF6u&QNXFyT)in^Y zZDO$~DJw!^NhiZmmwa~}6KiTY&>nJTc94!(3!Uvfgq};av9Gac%;ZzmS<2_r`kYc>&WUc~ZHaPn8bM9t*buzW4K=^0F|DQ2_G&diWX zxP-1pvbG-IwDEO82q`N~Dhua_ydteYh){UQXoPhi{yP27+)a4*o&535-=)zI+_Lu( zP95LNlDv&F4YIRCNK@0?(#-RZ-plC&FVNN9i;x2CxtONGns;7L-@T79cJLTA%}r>f zksA^sxg1WO#Gdu>AAX9t(kz6+IWY))+`=5W z>1jYC1uC59VWQdzaGr&UN{`fhe}$GBrE$?je3a*cCNYb>Vm*DVe@`VBo?VXs?BsVvWS8_?FQcRrgBU#@>GMOftwsD$c z6l;5sS6|M-U;Ycu@e^2Q@|2~*J#vtl{vkH@tR@{zutZ39BU=-_D(LS3j7A}`d{Q_fAR?l*r#oAG*%e&Hj0=mVeS^_#bH=aCn9a{rSo z>YE}WElQ;p@`D_-Y6}srK^onhyni@Fr%ln8eYQWG`OkD>E36WF+ z(=>?1EBzPA)+VA8c}DvCiKSE6mW5j`Qd`$Z@5;4=N+S(}P$^{DN3_>76e&}>Y767{ z-$wTFCvc99keQyKtX!u123eM9p{J#T!w2`_7t3^XEvBPqDgDQeke!;qibT<2NGUhV z#NYtJFo-8p@r{9-itu#NB%yq50S-Nh5-< zL;PY9r9+HBVU#@Z1Ke^M&v7YCPE*s;OwU!@*nR8m%#3Cr8AUWC5kY|PE1f@PO$uok z7zk<_8fefqlYRa8LSva$rES)>FipGK^rna_`ywaCPjl;zyGianNv*aBP4Egu{J_Ul8q@JnPC(!~ zcx4A?ZVsU|i{JPf_Wbg0yy+a<-f}%@BaW*>L}w%T0on_QHq;_a1LgTNC+aE96)2Pn z#3K>3QW%y+G#+PmVwCBzVNA=$FO>;>hnXPD__9XI(xY(Keb|jH7y`^>ghJ?2;|sQ~ z+Q5lpN0=TRrLMM~=C)2U(=$vAoyIB7VcQW5Dm75o^Qoz?C-6Lc*Ha6W=vPoHsSOz}q_`XWVD&2O;IUC=p+Aaqk)?$3~bO86j@Rsc&c@ z3_~V{&XAuP$1*Jf*C!cI;&~pP=VIFtT;CJtb(}0<`|>5pu^Pl&{k}K6hsLG`zVqm< zT6y@cdCs-W(H$XJ<9XYL5N{ncq%}9K2pxBCl$9e%?O65Ow}>MkkryH3i&*$ z?Bb74K(T}oj}uI1$>*~K(>XS`EFma6^q)KdAvDxCl1QYO92;eJVx*GflqM3XOkOP( zi$tPv5~&(m+PkzqH@#ag+z=a?r zsSI#D%5!-F&qIYFg^4Me7WWWc-ob%ef62u+yq&tPMNFOP2Px3yGWa1|-ugDW5-pU9 zb0k_@NJJAT--l!ryRjBsaDYl*nrWKYmW?4Ks#qr3xd_M5sNpH<+B-3un=w*Jbg4`@ zn?p^^vc9Q@xMg!_{~nYZl8D8rt*a-W&oMJLMBq3WhKWFtOe87f^VoI-%QEp?m$_Va zVcZfIw6F@Xt-Mj6uF>}&d0HR*)m`)!EQ~}1zf`6ic<3-7sSFHX;T8+{UO*UxlxAl! z4U^_;wz2mozoNTqDT^=NMrLG~fB*@^Wt6Z~rd%%4xo!h-VWCY)G?BoN2IYZaXsN+$ ztw*~aW-?Z-07{HdlW1;2HrG)e7$$DV5D^=*t_B^3gt<9_**Vs9E~TTRll{A2#CLpR zkr)jPO#}+Y2hUKPnZdGbLf@k%T}P={#4S5mmW`AK#X_F)T;3EyidWXdWThxcSOImk zl#$0Ce3+IA2Rj`na9zB>CkzAP%D@bDB^$aG0Nrv4HU1`JLFaE*su@1KEjj z9N$3-LBfn7lqL*)%7p@Mu|P5~iPa=2nIX>T1a+x8{Gmy7dksciszt>n<2U6keu)TC;0iv>`c*~xKc$3~D+5(FOU zbPXyDDbD4vtqL7AO^d*DQ7Y6zp10hVF!Z09E3Qq^b zF^Fo3=ejuM5~1%Ccpk;kNfuqcg?ui{^izA;_TG2nx-N5t92!N+ieW17eU~5zC{Ik% zylo@8wU)!T{Rj2yR$ypNZATZqOIG2X8bNnAR=Tj2LTZRF?xH+7MKC#w8LwELsRYuL z_+dy>s-E?0*3p0R7*nI8)THZh=dy&J%jiHK`Kd7?wuMrfXf%dt8sug(n1*?Fo~I!t zvJyMhD@|-T>ypxtXJft@qN0g}Rw_V;6|kaO5<}v;WxRQ?f`G#K6t#=HusRw!_S3uB zeEl1V)ufr7nLwebvEvvacy1Y`LY&zgb~;6B^GdqbZ)9Z0F817a59ab-ax)XuFYcu^ z-HJOljnQ0-sWe7yiqiBn?(i6PDp3g^hCt4h@w2l;(@8e0TF><8DE%joQL!p!w z8azS_4GC%DxemVL5C#E(AK=X9u##~aFI~@ppZtpM<*R95x0)9F$|OCS6)GL zPY>zZ21K9;d=EPw$2M$&QpGZ@SQO>?XV<|HLLx1LWv%Op1Qy2+?IU7ZSi-<7l@S_D zvogOa@B@6;B^r%V%;ylMMY_3(!1GZ-P?hhgZys!J-R7A#q$18E2g zLz9$dW!T`j758*plHeFP9DPaA!6CMr6MW_h}bqlYXU#Oa~&el7;dqM7LxYmE2wX6Bi+=5 z@Azk3(=-jjFr-i{>;vXrc`RAAxcTX9#d3Lgba?Du!%@U63*T`o%eI99+V}B`1(NN} z*oMi-v%A>#j<=GmNmD4~NJZk*L=$KgfL0g+!m>*&5hs1w8nXM2(wc4})zXaA3SS3A z>B|o?sxl;+8%T7w6G_HN#NwDrGc>#hX(`gNB!T0g zgOGSER#{Uk^ijT#ZCQvgKnp=@?_&H?fuLNZX;BAFU5ijbfMuEpDVZx2o-P(kKcDY7 zd})>x=V+L;wAP{4Is~vStA6duWuIQ!wdl8PDVhV{FO-T!$1Rlu*KY+FsvDQdfaRbk8G$B@q(iG$P2=E zJZ*#;?T0w!5`p6pxV{!b;*?4v)zXGA44gs%BN9Pc7NJ69Mu%mprlIU3_Kb~>{jlUX z4=ot{L;$I^c34mX7g9=7DHQ-(8iu7RJ}f(1o8QsePsFWr0&J=^zZ1ZJ3~x4nw7t3Y7{&75V{oI-!GPRQn?{D&5c^v;aTwbf`iiW<;a3 z4wR}WatI8Co-+e-(E!^AS(DPr^>9N+q^5mU*U&1YLd@l6w9}G=xv~x>W~49;Efgy7 zeW5~y4nu^HIt+YaSP{%fM7ia%kfy1Hlv0JE1|h;A&`PN(KMebWFr3s{`wIZGDsykO z{}RB2sgw=?ZAfV$gbc&b1+YxBL2Dg`Ds+SpT1ZJ4gu<>U3OWdUgpiubBzrYqO0TL$ zN?4}QexM}+Err%fi3JTEuePA%|I}t&U{>z=)es?stlVsc$BCD?=mmxB3W*U?2zj>k ztkUix&i=lXp;k&tA%u_uU0r=d3V~MDMG3{isVEw42!T=>HNOPle3PWqS_)9Aa+>NY z2-ODFY9s3TOAG31^;&Dqxpo|Vo&;Desm*`JL`tEQDpR?4QH}NCuUisSTp-}hvs*2N zFy?jbYM+a$wEI^Zk@eX*h+1eQLYzkc#W~&byoDh3Ioqss(1^-Jv-xEYRdsO*F|S4m zadrZ$zK|L!#LErkyqdOHSo_iQlhl;f?gGHXg%)r6f7}1e!oL4^Z~q%T8k#ksY>CJK O0000EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRF*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc| zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X zV|R@t+qB6gb?*`fMb5bv#pQ6gLjVKU2JKx?^cRBW zaA@uh`KLjzITUT38h4F@Ymz2ua~n8b$60&3>uhAptJN-dWpb&d#N~+Mh$E6SbAQZm zh9gn7i^JVt8Q_J);S6WyJKyK~Jn!>7Gw{>pr_2A#MH#m8%)k3nt$g{M07%*m02)mT zK%_kr0L!dlnKg7xc-C&$U)Sm4C>j8c;~=FZnVV5k)5qQP^qc_b?pR)Oa+cciIjqe! zIy)Vu+iucrZwF^2K#|eOh^`m@YoyRKGyd=Q+QC|hRP|t82idbg_0IuS2VBKouSP!? zzhZAM4z7pLj8PZpbX#{EZ8W0*N_WR}{i6kok;#ajZF>O4M}JAC56{Zx?KM~L*-kc{ z6xnoA1(eZ5!qbf;fB=+)=!xWrF8XKRQ=||=grD`%w9?sbi1hTFlAfMZHdkH|$;sLN zv4z|1DcyEck=lsj_BskeRe}rfhvLfMe>pO7TnUaVh0uiO_7tfa{qKe6I#LJ(sxA;x zpz5M?XG3_so(PVoD2l(oR1iWzdck=FpH)4XK?o^4*YVs=+mV_f9S_y(*$#jj0tUj! zWXKxG#tUDe_~?_p%zcZn`ok>PMLI(bNm!Wb{fM@`?zja4w4B4z!=X5pc=97r9g4I{zVJT!1Wx#SQ1(mv@E2Qp+p?8 zc-m-Y@biBLu8F{`gWImSdjU&K9>LyR^Gd6id&Q}Y2An9p^tC@NKKjsfajrmZy@Azg zvv9~z%3J;ko|?^2F*@Grtr~NM;DSs`sckjMr&BS|tm-P(tyQv_#fUNEGf-WQpT3X^ z?*5B2a(%!OietBt0i)^IN*^q#8Mt}?_~W9Xrw5PV~QZYnAp?hQh;7(!NtBF+M|LG6HpgWpS{^^C4iiZ6l3@f5LV<0z`|> zZxE~ysJ$%HHAs&^FMcek>K~S>ehv6_r`JKMQgM3Ge&Mfq-JX`r-{U^;p2u{|8;gdK z__Q{9D09rag=nsG|ENXYy~D$YTnd`aVXsBjZ80{cGN$&J&5kfNI!ej*IFwFt%N<2e zjbnEdR6T*JC-6FL5)(5ZN3pl=U~k<)Xi0iITXb4?P)AcZ9UIqm18*rXCJH2{?jn)R zA~hA)^N^~FR8>6N#_Q}N6p5BjA$6UuwGHMS-!%w8H9)8!RD`O7s={aj#xvl!;CcbE zwf+z&ii)Cqqf@)tRFmVHKq$TTcCYX0{JXzV!m5=-r%@((^bxeo^w7I)Zrfzj2F2+N znUul$rX3D|g^Y~-HF8t2{p~yD@UMC8Jn6gUNZ&O_s&M?k*e7|o5c{lWvf=;Qp)}ec zs|P}eq02lN=rcE%w)1Fa4J!cBO+k>#e>eE}3NpkZ(V{-E|JbrV9FMO}e zxl$8=%0E0uW3bzTZa1LXfJXH?(CbFq2f?k|ho*0yozB3@J%IT?v>k%Bxlx7!A!rq| ziG9PuzELCd{zZ&p9>a((w=FV( z{&cJ+dNLAutGq_HVa84Ht|Br$pmmxCnhv_|hY`Kbz8EbGIrIQfD=^;yu;PJhHUMlh zx}){Y3YCP;bSA}gCKbPkz$A@@YzWrMH_vnKw)Ku@{?_^m$>|e5JCC2De(gMG|NHNA z=3oA93@m`eXp%;~76YqQE3;9Wh5y;`Te?$0GJT&rBWa)=nZn$<%*8)>l8-$74AraWX_WkP zHAD_Nn_xsHz47AnFqVk0x%)WU$eyqu2xvQP3%A!rIDr`|iqAS#gj&|!?$3j9g{pZ2 z65`r>0n@X2p=a}M=Z=3z?MCFHtDALy9vFZ&xLmkaY4`5X?iB)ezK=lcwYH@QO<|VDtlAA0pk_cS>AZY6WU;z0%{P>m~0d}Jvf(4Kq z)v0Z^u-aXc2@T5|ZjN2Mi)Ls*H)L3UnVLHlg7(m_KI7lC0l=)a64sl(DdvCnLwn+} zXd>O&GKYfXYoUdCBW}(@H;_W?VW>7-!;-~C(RZJT@fi~1GqmrNq4MK6XpTOVWdJ9S z=ehExzg<3;3|V&2GL{`f^*`dHANy&7nZ;nNJRi+i<`NQ&|^qH*a16@MeympgC%=lRraw<-8vv zv~6rnXXgF~S;-e@)~eL6ejn5X^T&>I;ra~>RVO=@!)k4#kLlPge}ZhaZ9t-F8hT%6 zY}jqt*gJM;mQs}@(>@Dol^R*|5)%0+KEhfEIl@m z-)qs`@x8J!>fhyVr;F9JNT!n{Q%S70@9sCRzQV*k4>KKv7wPFE0JPh!5UhiiPH6>q z&-Zdbr^JBS#q_J6G#|)>g!iYmUK0S#JDYwA=lBV>8+BfP={cJ9GU?n5GxMiNPezmJ z=Egd?Y=(Le2hATZ4tVo4$*~mHj*Zo}$>%a869%1N9@lEN=G|lL>?5XoBQuf^uz>&Ta>NL`NUdadsgw zYS7-XG3#asSboN5Qt4`NoK+vNX60s_VU5jw>}tGp7Q0+}Oa1HvA~X%D1>opPxIsl7PvU-X9cRa>a17m954DNx_PI; z#CSFY3*ezs@1@c68FJ%|8~%LoXpU?#N2657yb&>@Rx`=xqmba@%YK%`_SPu9eqrC8 zZr5uhf-G$9+*z!(QUp}b9tsvx1J4b?l9~=e#ImyN4J!t}8wAX;+d>)%FPWVU(X?u7 zR64nEf`$6l2CH0s`94>A$8qw$d z>78!J60Tt&Ra~pF<{E{f(ri|cnW=%w&l<()BF1={;&hOGeSHbJ)eW-4b*86gIkB(^ zJ-D*GgtglyKU*L>>n8#;WtbT&ppQ#xw`$Z(ll)|!eBL*&&H5&mWg&EdwPTSDm^nQ= zPx{aVsb-mpV-K_N#HRqbzVrgj&12qN!o0aegRBo4iJ)lGjuTEwgwSw;ATDB-@N20u ziIk2P;dj8)NT&U}YF;?&O+E4H;pv#dED$e&74Gu)yYvr{8EtOVsBij%6x7zL!B{6h zo+p1-p4u&ccCdK=;((6TXxnY9AhnX8%!6=9AM%gU+}fo2y)U!Em&qMF>CarI{QZmX z`y`DUOL)u6nANobNs_p(g9yal4bEQ<=I+%1EL9?<^OgjRyyP1%xgwRrm?S=?RuD_~x{DauMCpsnu%KYPBE@<%5+> zCP^lfNL>rS@*PBwKBIo!H%~h-%^N>}2Y>bRD9Icbzwyu;Na+PlqQ zPG7j&b?j~b#O(D_koPJD$-Y_g51tMH8>nh;)v4a9$G{p~^0NhMYt``orSDzx8(x0t zjGs6hU}kNjMkc>R|g80oa;)3q9 z;~G`^#ur)m*l+OI$DU&O>tCdy7K1>vf9XL&KyiFQ?+2<! z#4wNPCzhOninM>x?F~Q5&fM=u|Mtc*jm<_B8|}nT-fCLp3wajbv*-(awHAUEGN{pD z+cZgKGNdz^7+3&CGM@U`r>p72!14U>Wclk~q*=Mb!pDB&AJzNivr!weF7lFM5AC8- zj50hHF<*Nw4qDp|QpkxAq`lLdK3I$IS&Xyc`V}fSZVUx0pU+b)7Gt0pNrTL>Ol%B- zW^G3SYvtu{(yUzJqrd#A;bB8;Rb1Eh>Xtm9kjp->_B4g`nP%6PN#yUtm|Tc|zhg(K znQ|?R!2t3F-#eDBUl|xHOdmZOg4GxMVzC(NST-NUd5NSCO!iooV;?+5_Em3!)vGV06|nu6kb;Gu{-@Xvwqp5vmZBjCD7Au(+OFEIr| zCAaWF?6tG>+#b8yB%Pg2bWO0eQO9$-j2$vC#xkteHW8YRK*wrr&}`NzU0-2zbd+?~ zU?ic1QX@Kl(2&ryy)yuj94lUKiSk+H-Ws#Nh@hY>^b zJMV-)c6MwwS6)QR-p&1|KT5ZHk)}5q_F5oRJn7*n9ter2Ku-aLC<|5o)z-CF+u0K* zC5nQ1^`f)aOCD&7T|3eg-N;bCxfHc3ocuJ63tx$J%xcG2(QHOJ_HwyQI_c9rH<1ep zzQg;-rlzM^ulU)HnR^NYz6r`pHz~ii7D~aOj;6;9(kX-Hw#|0SH_?^veTDfC!u$vS z73IHqW(bS4$a5-@XC0>RVp#LqLCYX;^_xo}aM_cerrRimX49xOsFtd ztdNxh)u;LU7ddhNA}1DohftWFi5;VSwMu2RO8IKME2r|>8kN`9VqooE(qr*;_3IbW zM-m6J%OCQcMfxsyC=%SR7p6mofM#z-LY_IX$i{Yp?e#T`saY8RHF)XIVkd8#@nS^b zo+6A4obaeaE|tQtA(u+g^<1*Yv)p(5XL$YfC0={=FL>aAMe-y0zz=n}va*70`aq?| zQgnM=oUX%IA{o{_lW7CJ7Z;tbRU(<1rO}AMcZ5U==}(vxCjv}}pm9t;z$6u^0Ny)g zT;{~0Ki>Ta#*}Y5iNXxYxzq1B?kOHGa_WKo+rR$$(t-P2Sy`c8uanE=$mMc$2l^vA zd+LwLv_Z08(SJuVnB1Qe6LC9K|1lb7OwW>;nk92$k?g&`2_+0)klWQV?P{6gM?U9= z6@UAOSgYsW60G9!A~TbIs=0joCNqbRP->QV?ysMPPkb`m_E-Of|No!=<+E%zeXzo^ zp{mjCbwl8E^k5q1J043fPy`4B812G+hhXCmpd z>X3o86_oexH2J??9S~7{AOrjeGjOS_8Y9#vIe7ylN zo|LRzUBRlBu+~c?r;6k{!NmLBXK386qA9DC-z+0^0VANuWIC+% z5~a(RC|$lp<93zo;R0*dqFmL@)reisKKC3;%Tc;{@d3XJ=d-{0nW4w&cl8*WMs{or zL)U4vTCr``?6|`@{rKqv^()q4twhL(Jvsi6Vg0toetKswSe;;wr;TMo&;X3Pe5N&) zm$>ouXEDaI1N~o7`nYjB9v1Y0v$tIq7ZzB0W0}Q;1r{H8ki`cc^g;Z~uN(-Lkw{{U zCb4(gv^yOVK}mmiAi+6nWN2W zJwC&^7kuaQxzGIve&zGelAp{|+o-)$untTh0(i#!d!!3pJ1DtnP6s)n(+wVEaD;|_ zcm{iW8+&^j^M!AL9Z}eBH4s7z13|mxPg@d4j*=KL$W9jMHX|J>Th}SvUBKRGP&2D6 zUtOkj^$KUd^G*N82m`wl1;EAeNfN3-)vQuTr6{(QuulWvqhm$BQ(a-T^#+XP$Uc0U zcTMEjUS8%~Uw?@|_~;4#_}dm2T8U^kSH!)df`ZH2OpSaSR>FSJerNG+hfcFar`f_8 zXxHxCE@S@v*Pt_ezTh|=94FeoQ5)Vrzg}La`ev1>nJ5+B2MfUN*ddFiCJH3<1P!Z! zp&1whCH%#?c^2p91F(EqS#8x>TfV^T!b#TNxWKvR{+L&;RyjFW;N;xY+j+)!Fg5B6 zU$^TI%fjt+af2$g47zTt%Rgf0^7#V~;=0}ad9;o7z+3*}P|yl@`=)#L+uw-Ce!39@ zts2xR4b32-Cql3QmR9}vYHlpY+*lNTtSw()_TH16{`kM;%ip=gh1Kf8CAPs?{t$+# zd%*JWy8C`a=o)fF$Jy;*U%mL2cSH_QIo5#Lg_F!KJj~kiD*#+r zU5^;1X%SI|slDsQJf#@;23!}ryzJn#Rh+ihhtt)^=vK>guPy~Ki~))P!ic609)N}` z)Y$0Q79HEd>2)wS)_LK7{Ta!^5k&EQlsh?$l!1{lu>^7~g zq~qz-nmgF8f}tkBQ?NU`e9Fx-eexlA;v?|HM>us?fn={qve)EYhQ_-LjohZimEAPY zZ9w&U6}#8Q?zK7hMhU5lp&3{_p%C);&FVa)19XqoXiMcHG}iUvwN zwL2K_h30W(iJNaMab#e&Fg+cg?-h?l;Yc@llC0B1(h2^m&Y42p`uStmNTK4>902Y{9idSvsH?<|8c zjA7A}rbb$o!f@4e7B)9BbbC+Xl0z7QZ%{!|qdgSqw-E^i6b~U)6vgu!KZL|n1fC+$ z)lsC-5%@g~Xd_`h{p#{hIQ1+4l}hOvl^fS-?ey?^E*;yUQC`CnNs@|!iidDrQc~xk zu?enj-Qnu(Dm|%kdwZMfyB$)yyG*_EGV0I&f)CEoBB{bOTR(b{NnK@9SDD$}Vq>ex z*3>*>nMr2cT{c}U%Hg;nG-dFekPoM&>>c8k5Kyl^Q?DzBz?ArYyo@Q(r-im`~Uf8 zWMBO;k3D>b;?JCkdR>C{gta%8U2?x;_K)nxyNjv;2e0EI2wd z?>YfN#-#Xx4|D1lm$3gjcocEF4%>D9hoYfP9^r1sH~Tkt-97Q?L6QDm4H{(3UQ_Bf z*vf%MTJ?ZlcWt2ENHgLtd(YCidWmnnxg1oFW}8txxx`%`t~zi zX!|!JA9UgLgNEf7FR*;>0t=sr!idG+`Ygu%C;0B~e<5OFP|e?-JVI*Y=G&%sWOOkj zI?zM$O;RYrH%TR~K{2rU3ATZE-Gtw(IzmWgW$rXdnK2#~slP$izwW4#S7Hj1j?2@g+r2vx?1NFaoc5IWnfHlvv- zQq%L4Y9?#7I(NVK=culgQMClBmf$CeEO(?%7Z`QBm}UcecNcm+CT3^+S1=d`*{M8w zvq9@dl}Vv8V_V!;Ugni#0aZ0tRn>TA^NkmFv-6Kh6d}#4KkDr<$%N`pJEez^b>_mVL_sa(yPt%92li|B^mR^0CGldyWJn#@#E?*>fxWN1a z53({)2dL=D*#0YLpJzgLnFn(3eir}>KmY#7N&Nlu%viNMz)t{{`)RL%gxCPX##EsQ z7wJh9&lEyDqN@6YgOgGQGzCTws)2$;RTD_52WBb#7)<(4g=wmW6f%0-h!B2IC`bG` zX@5vHrfF|CdP1kCNP0r$>h-Hk9Vv3?aDmr;@(QWRDO{OgYo|?5sPu%&Pf|rpHE6`^ zwb@wP#M(5u`+@uEHCw1-MsM=?Q8$-JxFbuiyC%*L4=bJj^5yS;tpu?6Gw)TlU0s-~ zFZJS8BO%>Ay%oO){F+d;PYx@bgkDh9+%OJPb)Qi|Dn@ESaahEP3|{P3DZ+b4$#u_( zVz_}U>7|#>^5COqI6A+`jg=(|GYcfgnpmwUnlB}ylHo#chtiAZIr|^K#F>BpG(Z<1 zfBF>p7f)T|JKz0pL0IAE>PET>Kxv49cy?>uH8N8&h^1}>puH+p?SsJeASi7Nh79a` zp_C7Z)WV##8w-5po_dUwZ~fi|PYwh3V}1{^;drV^f;lTJIW}DXm{7 z18}4q8+_DPs3{o(Ox1dWPCz$wXDDF(3si7pvZeIBgB+e)_vFD0bR3L<8pP50MRs@m z$6oq?85ptsKeG|9b-wQtAKG2~t)~Z0C$X0R{Kl_*TKVE%e8r11O!3dwHrKlVqZ7w9 zsY*vjZUygE1XY)43B>^=5JC}{pbQ0Gkuq`&5|9cCB4S3o1n&yzg>Swbcs4P3g2i=| zy}`8z18x`SxLQ!FaK*LKO*eUHMq2f9|7&6Up-;%_X9|ys;&z#0tKt@06`udgXA{P~ z^J4Dj-tPcCuiMrEasGF{V7>PXf8YUROC{O2B;_BIcFfE@Dj=Z?ED`ERGxbuV}% z*p;d-q^2t|z(ml6EPb%VzUL8j81j11(6j?^0`e&k*S!7EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRF*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc| zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X z$lb{?pk-%d$-=Z@1A}3*=O(X z{_YL`as0au`8WJu0L@SN|KS;5?sw03UDrIX{2TAhn(zF(1h)1|Zhmr}8_BT)M z&*pDL);xpcpAn#^3ZjaFnq1Nf7}e7Q62PEn{<~&%u;&QJhzOn|CQj_>$yjqwNAu@e zolFCgtA;p`=6`inGh8ED^9)PvNED1fDT0#=@Fx)*J&zqfOJJ)P?3#zXLEv{pxKbcC zLgIiif^jpkt0N+wfDtrb!;0jCQAk0pf<>^Zq>8K#R~1#oNUj2CW+Tqg2s9I{L6!gX zs&)4GY+IguanWc#|B9;BGhmg_^{bCfua4cfKm~Rj zh4;pAa*a&fa|NbAnx6op0v{LQS^ zyY#Nnk_0Hgn-t~`!}~0B`3`o#%Z)t1s{}qTLjS6uoLn%zfNz9ApqT$%y?$C?xy4*v z+lgjpq)KEVvEaCZ>p1-6+b*QH>hPie{_JT(Aur?C2ypLj+{iO~7Wv(KUOZz^SzX&_ z1h!UK1+wQ05FAwkBYg0;-$w1aE9e=op(#Y&F5*Nq78d!JFFwEfL;wAsU$@eUCi9`W z7CLK<{;Hu|Jv847QWJ=xag#6HdzMQ_^0zdVU$MY}cf|9i}nyvMF9yrKM}G?HZW*lv}i~x4h`3^zUDwZWjVAgcP;paoz4^j@ij9Y0Z{gY-@X3>xYzs~t}e0gx8KKK z{`S}Dq)N9HlNdn)Lv6T3+*^p-%ggDi+hJTsIgh~BF4uJRAy=28XCM%vBrslfnRJEc zkA(z|;9OAR*sQP;8LSnowIE7g!7$Kc`Sw)Aw;i})V}bq#5L#4~P$5l~&wlX`rIO*j z@4ART`sl6v%C9}bGcV3#BomgC`!GI=8sYJWr+D|B8~D2(k5)UuNi5A%Z3awcS6u}k z!B@ovD!%X=U->Z@`w^C&{seuG-p^zAA7uXU3Q2A@LRBK*-dG@RricNxU=+l{p~DSYt%Pe|QRBN_GtTqhUSMURo7qYc3MQMZk`e0j z9bSL+FcSv$9jVjn7-~l7b%cH+42Yr6z=&(80U!9#wRji4m-fm3&4d5tSGnNT8`%B$ zERCh^8As7%-i;cesZ5?U^4VCa8^N(DVsqK76_~raOA4%W3~w^RfF}?b2ppj(Fjz1= zG#%pzT)wSDtLswmeTv-<7uVa2G!rTl7qD^r052Yy!!4Dm_4F`UikNSvq!va41DZKY zt5!RWQl?L|h~k(X8){tpie8?7YJoINDH`Z8Ld6Juj^M{B8_EG!Y^lOrm*G@dXJMNW zCLCd-E36Y?y>EEUP2=?6{RT+pc<^1n#VxNI#UCtl^r=%MjSvt5C-arm2uY&YvU_Z< z=-t;0(}sY9V)SJMW^>!M-VxsH8U}m=1xF|vC=1kl!(^;{*QNq}MVGm_%0RV3P;XF9 zEPbyjpqmR!e|>>DETw9dPLy!*xX_!VEQXei6+;>-zGHBVpjHuupy<$UTUv`PF4;85 zRTot_eyD-zB=i_z*bydN!$wD-6|r@qLZ9Q}cT%chLa!_I8e#J*hS;#FLZy|m@$K6{ zu4MU~xF1#4_#(qpr~J8iIDh z*l>~FK#*ok$wH3^WrRQ+%u0vhbrsxon;~3e;cp*iA2tx(Kk}Gr^hlx!N$L1`} zZbT=s#C=0FWrBJ-PS578EO#R6ttPIfyz)}ZvNhDLQdK2wr`Qxk4W+=L7&vHb(QXP+ zN@Jme+v>7qyodFbfSxdA*mLMhmBEV3aG#&=h7M)PT#HKCP;dobQvxFtFX{uk0iBzq z*jmP^co0Ff6e3}Y?;6A^ahPIU!>evx&#T_JiNF2Sq2u3}Y}^+^reSi%hPf{X^{jOS zT{4{A_`-^`J9}Nu3tFZr9S9!(~w7h47dh~mEM9!|A0f%h$ttD zA6Z(*nzULeqZNlcql9Ol=pYK0tSfNesLMUyXfri0s0yid&{hBYl=6`2a!=oJuG+55 z)Ki{28S<6=EpED~%)P?_h1gIUE>Ygz3qwUnJzjX?FayISHFNDOwmV0YoO42>)g?K$ zc1e~TgDb+*OG*A^B~4S(Btaa9?E?;5M+{3VA&qvIZnuMzcG+Bv=`C31yFwbr*d#&n zD0{YTSzk10Xc-kQrD&N}M#t}nem2M(Da=@in9-&<6 zAxTpDi-rwV#l^DNj!7&ePLY$1URvFdb`&FGIB+WD#JJC0)c}9E2qhOP6_$?IdFH|6 zbjN!pAD`=dHnQ4uj5v-Flj=*C4r5a!Esv}jm2n_Xqez55FDrI~^glO4S!`y|I_ap0aeKl#x=Adbi6+dx??dHlG6C4sgru+}P9N z=+Z78nF{e$DV9o%kBxJobCPEdwwP-qe7qI&(?d1r#B}RzoK(5s@CZ~yGRgSn@F z20Z*uMn8j3a-ms;9iCy(7#35@r6rfN12Iaoo6t?6sYUq}F@VAl9PM$hru2f-xVG`&_aOsUf;v}hdnNlgo*X*7<4S% znRzs{)C(TBj2bA1aHTT!rI6*h6eB_)%Bkro9LI3;&I&tv9R7CK3SZjS<)>?1=q3~b z!{|f>zv?qN-=fn^&zlrEuhG{t*f+64*Fr~N*cHY-2QkobghI&!*U;`JEHzWQ>8ikT z?G$iP0-z*9H%;jC9c~*cP%StFR_QIej9pM;=Zi}mS_}zNn40gf4nfANRLTWjxxuoK zSbi#X`RRixrAjY|L&GnzsXt_HIz-zkJtM%^#(C;ZU*qszm@#nO#tC$Ag!$vg32n;r zN8xWaSD0Qj3=g{*E?cZZ!K2U%eg!73KC6e&(Yo_x#@-o^=iHyTfJT zH+~o`9OberVw~!Z?2(qIpxJ_^2X*+9rz>z!Ay#fqV*+5R-D2Ka(t$CC9iP^zS$=b> z#ht%yd8}Dwa=5_ln;yLbC&5m_affgIDnws;PC|)f5WqIHESymtgv5B^{Iu zf47opSvyQQIoHBsC;9N8pGcYA=kwZa z-()3%*8T!p-Z{vY!K>N%m9KK$;|?=RT^2KhuuOSYd_V z|Ggp~{ViyH@LBdBn&#)P@8jyW0mp-q2Z2W@iIXJR&SX;+F(RA?q7HJeK?SaIg-^P$ z!{oc7$>CmCvH~B<<~(YIR1w){S+)NbMP}w<_`#)Zh~*$4^F2=;RerVY+FEkxyA5C zrEf=#uYC>{3nlKjqDpZn;KWmK{m&T8ztBJitb0|aL zB2`|UScWe(u=|4$EkP2}I%3)LH$LCoWvE$Y{3=+OhrRP~K`*RRm;z>j0|M(@hZU=Q z`)Ofh+7cC94m|}$M{#{&aolI-(H8X>_W3Tih|8NgrU%OLgbS0DJyF6Q z&*O%7Uc&NohdKG=33`J9BWXft6&2xur&?TdO__2?XNvR>esG@)Y*H(pfW^%wgb+wXB` zG2zHcN+D6U3yhW>di#aZ^#Pan2233ci2am%{`n~Vs;tB@ji7+>J>n$6SLM0mAzO`* zB4S@=H#}=eu1aj*k(61GA0o3mZl0=gT{toi-}s6!;s{#<%hWN8lv8YP%G|t5cgg34 zhC?J452Xo&0&_qO=s{QnPQ=P4-_S{wq#a|Ul&%P#F&s{yDG-XV_f!kdW?0qwqG99B zJv{c66^10``^SoyuP-yuU*O8CiZB%;V*vz$Ohw=ba-a(&_`iBN2jBZB@4dFn%v{R9 z9PV%+>@wrJ_&F$Wa3P^?>{(8{oa4}+Hi36TqM7a0A@SGex}UF`eJGRK@OHP=vGjSOGHtvXE=aIz$h zD5yB-solt^g^PxTb&JYW0=-5!uF6pnW>NYh#W=!Ts&rBdsin_xsn&c>HA0TG61J%_ z0L+OH=S#b2GT+V>rCJcmC_2?-sK-S^%YY;7@P#>578N$QhMKiJn<_;|Xy%#pMNP9C zS*7NKfA=_pANh4~?*PYzG)0|nkv{hbZZU+xei$4ESr5_=h403_`_1&-{V+R+{)o$- zeVkUPT>Q9-^BstD889ZNlg>2Tn5U0phR>n&3;>=OrUY67^*mOrrIwN^Nvc?@)QS#U zYCa1n4XaeGWvdADnx*SYl9NSL8S=sJCX|=EOlLYSni-w^PMKe!cl!_PyqfwVJ2_Zxps`HE%cKk$znQ!!@51z_D8BFyT<}6j@mHp3tmsSl9;XE+hKxC~%A`}6mV7xP#OP__ z$7%u~0y+jHwG_exKXM3SL#^OauKLu{6jF<84TDx05=d1DP=Yk`2q%04?T`S=Seno% z8sa3ubMsg>ry7Jt>5`@W1@KEQoo2$8%c|`7&D+8MNr< z^(+;%{epT5D*}s-(6P`(Nb-TBo0GjC{`RIT#{~@LmmlzzTi3r z*D8LZc(F2MEwn;NQbyC1iZ8T{#WN12euva5%S#E3(BeB;*ioqZqzUxx>|x}+H$n6J zpcr%NV?V;7&p*bFJI3&Dy_SdG_IVali?2cfr6ihXxxvoFv>%$Maj-$(olBIiJ&1e3 zjmVDMF?aqV{P~CTAko2fl{mEL?2>2TYfZr{f_MTg6szDFL#m2nGG?8dr%H?w%0{S} z%;*lOGG;9`1A@V?K;MP}6u=(okknJ$w#BH0UI#`EcnMU2qNOrmsEm}*qitkG!4U!% z#^16I8WGD6EnvDz_0kG_*F~^=E0iXg{n*FY_swIhySSghw_m|?fBX#7^DT^KC_<`2 zEJ}e4P$(x*9ss8rA}fcG#X7Pu564=-<=_TD7t&O0dLGAht%gNlPv!))5U>_PQ6fij z`e8-@DHte-(qn`HM;H?r2~*akmY&T8+PBsC!hFP+9$8`2Rb_tZ`X2l*F2bv;a9xFH zF6P+rn3GADmZo^?4Z}N2Y`D0@z^)b?>cG=2oSkLf^tEXwsxEJNQ(p#&cWSVFC8U#d z|L(KQJT=9{j$StZ=N-&EG0(9_CNqv2k}>!64FA$EfR=D-ty;j{OrB+-23PX+a?P9z?);Ba0d(!r&T+t)<<8^ps*##i<6A2iIeE454ugjoO&mM@5q`lZP>g*q6qVvS#{CaosqxOUu-k7Kus~zU#Fes&0YXZ+#UT1_wED zXg~9(W+(>*s-{6%mYHAd^1^gT*QR)-GI6s(sW!ktw)4#2gj5IH96El43opEwYEPA? z4j$+G|L_D~`k@JUJ|>zE=}dRAtr*7@h(RS^2{y}b6) z{4j-DgbabKG|%EVs~CNWz}C99%@n?wLP5@uUc=mlFgcT_?11ZJp1G^a#Bji$9_(OD z=2ag(d6GB`>FcR-)#cYPbL0?PH*do?4kwRK(rI-Wa1w4S?B}Y12;&R(7N1G$^S}cO z{KNC}RE9@bnm$QwWCP>tH*v@KM!xi=&#`;&9*X4(eo)}S7u)QSl#8)M%Q2=IQ4qoR z9NKAumq!c-1)SJY2^`knwt=m$-$Jj_{3OO-3}4*i!Bbxbh8K8NYIn zV_!SU^cRmJk`k22h=7UGo`b`C(5P$tFj!jfVrShL8uD!Ind__eV(D}I`kF{pLw#8g;3V=d++M!d#Vn> za=_8U`?>a&w{ZLG-a@~`$ow=>x6N!4vs^HY-a1UM)q(9~?#5g1=4f|}Jzq?St)=Q2 zYQDpP7oO*-hrddFaR%|W@)I9k$M;@Pq+u;nUCWoAsl)mLMbE((q2LMqwSa9G^l{BC z<6M5@2-f#`^)(CY{_Pv{jG>T`MicpD20*IeGS&WFbv{L`}qHf`F%#x2`vHXF#$ zD3?6{EW4TwmU~M$?KZs?2k!9UwgRkt8g9CWb>DzJQb{`~F%?%CTS1-|rDle=F#Ofb`=+UrsnD&Pzh@hTn^J!Y0tp8oP-8nbNz z5gd~R@a3XFW1e6{DUU*-57J4n@oBn*oDQmHvk&!vUJY7aEyGYD%2nJ|B~YPC zCbWtXipKDJcl2{WEjN$&@MH^auQ9jWW?*m&jrs})_wQlH#%*l9>3S}B^jW^`2V7lm zvABDh{&)4k8!v*nMdto&FS{LwPtCNrqQ~RAF1wr)TQ9?VaW}QG4J=_ z%FB~cP7}x)2<5<`WCTYXQneVMry5Xo4OL&L6nfV#M`i(EMb;D*hUMk4uZ9HcUE8m`B;C=Jd>jmm}{SY6xb|=AjKZhCP!LL3{ zNJ^w2jzg(fV!6JY@fVIoa6w*jbs*08my%;Co{!TCS=_roccIJhV2N0jQmVLp0d*rt z&ERgTaALNLJ+jQ`g-{sE?6t1eKIz#zrF*`TyA)_AsVsJsQpqLoEx1An!=PgsD;kD9 zL!U`0MroFs8uB@QtIt>GBYyC@BJAtZ+vm|q9nv&rab=Nep-9*^EY3d0ZqMVwk@ehg z#WhS^eg&mck)CFoVYL)*xQe9%hxpXr{2k@~Dvef)L{r?Lh?6FyY0Qq%0+fW$xRzqu za`#{Xc14gldGTU{c%}>O7_Z_oyWFMFO?btXgV@m0ZpWkrmzC!hSm-2lfaANNZ#T^L zBAT3kLv+sv!#YN^zv8MDsQZS2qRX&n81;og$1qTE8S)*=`f z8nEl;0si=|BLC|G%RdLpeDVvUEG;gO#4)vU50z3C$M>k&gyC?SZ$8!`^*oBDB4HHr z=toz-4;LdG{z8u!11XQ~ zFY!NKF!a5qL=-J@=-44jef^}4VX57qk#vcDpP6zG&vt#5jiIgyvz<1}iL%hH(}-I1 z4h>RoHCgF&2})(APn~4;)B%QH-NWM#wfTi#@wj40xVYcrk3P}iO&>YTp-X(&=0n9G zzC*d{GdNbFS1n6V&eA%xLeh$vu18D)&jSx0fG3}TnZ3|63L9_6dgaq_7{=kHl^{-* z4!3zad}P4tTYI8((2r7VC&5=suWuMBI`sO&j`coEKhVe9KYWZ`Plt2|Mi?j-7%3Xs zkzvl;$v-{_zxx-@v#`8~sxmk-Mw%*~@8JeMTB@+(cr=rQP8`uq6JkxNx0_T4hNz7U zQ!Kj-4%T>V*Djua_6eRnHqSqPzMskF^(@VtqQ|tcg&r3C8k}hH`7h3}{^knXwwIt~ zAxdd3gzVkFLT4qSs=}Z^pc(nF!x_`J+=jUWaOe=n9*X#M*V1+z95G^&^c>o`$x3um zK#MT6U3jZ+7+NiANWv7`jnOD&>xjqVTl;wHj~>FAjqxf~Izz+sMuyN^Pv67@3v(xF zdsPUEEH2Ekva*DqCOA>Z^x`~Gl2EAhVEh1a3|_HFp;W{=S@~S2+h+IP-Tcc}zrcfE z|1u{|o@9P@ir#@CMmJr+sf9U)$Hr)S6HLvwp%PF+xNvEiFMg{@d2_(UH}=8)i2Zw) zSn68l6c#kAm)ux`9b<-xz-MH0KdEb|=hbmd;n<^=`?^ZYfa8FZ*q3r#*IIr}fIflZ zYOS%!w$C_>sa#p)wjbWlK;lqCAWFFYz&`wHmE+?hoSZtw$>T@y`{%*)3CcZ?#LO)& z&?y#~TA1V5@xvTB_#(rj>+lN&3Vy(VF~m{CRM@54Y0>VqnVOxURPLctso?nq21^w> zCyy~XHATH|fXx@Zg4dRW(Sv)L6qmN+v%$vv!C%d=&No~?YALveYJY(+vUEE!vyr79 z8^%JP!LgLl(FN8GTjpF?n1)ly*?_7&1L>b%!^$vno8fI6gux|8P)8^`S#j33L7x{- zgnZ#-O1-C-&BkR%r%A21m-@&$rVj0;HGP7>IMD4d(`rzx^&{32NSoKbzK^5FvjE-3 z5zF-zX6I*_o<7OciDOL7&oZ;Jgr*6lAmF-@GGha<|HLwbBkSnam#HnxGc1a?FiUv! z5YFfrwNjZ)vr{;#JT)-H@i-zq*5P$`4N$II>dO&fqO?^AJ&(mGWpb&@!BYv72NYRU zw%iOC-wDw$$3B0UPj^$=4mbu(avm1-X$MX6V0-VH^qMPBb`9NT%F`!8e8;2S?J`v? za#7y~js+zq54}h;j%hkB4VyBBA@y8}Nr*%(p7`80#zN&6UhVSLy#=0lyv6fJVisEt zY2skTrRodY`-RKaTW+}mUUhjH>OLR*x^n+RZ3tYZS}|kdlNf`8GWq<|9Gcj|6T?)Y7dI~2}3gZ>Z^D)e~@e?IYvH&~HcfC5WZ$+5-tg>M}*eem&LkQR4hxYvJ z9m!*JJw;ZuS(1zs7Dxsb2EbDtOW?T-Cn+`K5*vr+;e9lX!?JOhMfs_B4{@lT@QKeY zQ}1^8fj9Ir)>M*TIn0D6{NRsF@Pl920Qb((3LMf60cOahd^AFuDU5sYLK{BafW-zM z`JO@k`g12RuFIAIpAY{07$5oI2^vvM;CfV!A784O1}t?J1%uMWhqIy^QscR_LD;_ z|J+fws^O`hUB||WfX**XbF`gOEV?WiLt!e#n~F#a1!9Dy7en;LF1~MY#9^^*aZHx* zC4%(HWqxz4z`H-Xk?mM`{~>m63i#8Ht>ZmEJ4q;l?|ame7)etiRXm&0>Iz=L;3&+U zYO<0*m}ap12(WQ1Q?Z3<2)ht0>(NQTG=QpR=|YoN-WnCQ`G&2) z-G0I?Kc;-*_hBUwBDGvr5&p-zfQ4T;!9tiN0m9ENuqOqPHSzVBcz#~go zU=3lar>WkWD#n77S~it@2w~_?r@p5fPT zEwb*nZ)5(GU*yHqVijIh^Z36u1U&O>o34WThBVDw;z+WGv>l7d{h+L6ieOM&fi%u~ zOO$*ewn{2`rV)^Z9hH+nL z#b8sVqM4B{s!R>PB*CDffw6(FMuL<&Jh%ppvaf(Yw= z!h@+t3ICzUJH{;yU`x^AXj^HB&{QSrX4{Zhh;25@j)I>HY?b`t0wz^@D=r098cj>= zW)vnPn&WY>zhyb_NE0atzCb6;@}sT@fhrgI!mo@vOeV0w&kE$lLY!p6ifk_UKq=-s zf1JQm}bQZ4N;E#LQJQT&@w{R z7+is4k)>gwkt$8i7^0p9V#j8&X8v&D%~OaMK-ARd&4;i6$!o`i!> z!hypO-wWn-fMnHDB8Z-@oH{ozxmr*qc&hltoX4qFaYeAHatdW>KAT;~C|!glQI_%o zh?Z4iRf;y_v4%Ed?D(pADo?WAH&^&HFP1-kEFxJ>=$foz&9PZ$9RU)uCOrjF(iGaF zsL7~SuE~qCC983AC0h|o3SF!8Y6d&2qo=!~c@-!QfKyO{9@zN~xZ+(f{S3VLWq9U) z(}`k@&)4AQ4C3mnR!c&nB!S=+$_g@ zTh>lyOZh1NqLXn(eGUiU)Xk?;9u26PWz9 zt7{sK>FNF&dFiwwxgGO;@I~oFlC`(-6u&GaVP?}xo1j=yYzjR)z~2KWk1DN2*mQZ` z=1HME45eWuZsk3)Qivw&`0gYRpW6QLKdrPslj?lJ8PD~l5Vf^xR|C!t)bCe*@uVpd!YFjyY_^;)|e_;3sIl0c5n@D zYDqNXyLxFx12fke-n;{DTvl3jn2WQ`MMIDou!};HXPc~1D1-KA5RpYscZplAkFYL? zi)1~=vKCq@Ipck`J&S@`6ss9M6N5S)xE_LwHG*IfYf;w+w}=|S#3AZcut5)^X&wg_ zJPqe!Y0g5=I;>xHM2(|Htx>O_;`NA4+B$z~W$w@{hv!-{8z*|YjiKj?C#Xb8*3$2c zzyvqdGXfJZNfv|CBMhWU8k4zLt2xZ{Y^QGZX4b5sZ0DIe(X-2=Wi6#+O&`L4Q>V-S zuMfwFV^!@Mj+mT&y++l{8e1%`!Lv%5>RBv;a}Tqob(iL_nV2=2YcqzYk(X;NDrY~0 z>glp!1=KN|_PJLlYpq|DtM00=l>e2p{HL5w2R6;VD{_`yI^#Nk>xe5N(g~AJnrbS7 z7{R1Alf&91h&>BHRN`~zTe6mZlG&Ji=U+2cljS@mr%kPX-JBMvoNh|6rnzBm?^o$o zYtT9)8D$JPhr?#pw*Mc; i|C>g@|8e|#kN*d%*9U9<00i6s0000P`P)EX>4Tx04R}tkv&MmKpe$iTct%Rg6&YmAwzYtAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRF*B8G^>Onpui)9@T$_we!cF2S?B&;2?2m4e9tpFljzbi*RvAfDc| zbk6(4QC5}|;&b9LgDyz?$aUG}H_j!8{X8>jWHa-`QDULg#c~(3vY`@B5yur(qkMnP zWrgz=XSG^q?R)YUh6~!tGS_JiBZWmQL4*JqbyQG=g#@h{DJC+spY-q#Iew8`GPx>X zWgEec#j0K>ryFxZz_d)A(w-m1E~_AN8tdhhWc?`17L-9tbQh3yDsM0I9o=6iYX zchC9mx#xWM!hd{xPY?B7e69eg{?z{qZM@O%UhjR`)n4^o-kV+5d{2PwzQ`(tt^Oz9 z1IW7@DyZtUAgX#TyzZ{*-vcnYrl)evz5aax(}1a7XF##bXgq+u4iHjZWTd<(|9@l~ z*Y@x~fcbq7-Xu3Ll)=LQLG|n_zy=`ZfY@CZ4Zh?7FG6o{7poanCAhNvr_i!vISRpF z$D$M<8Z=5tWnxMzC`80d_5HFdN^U&*d+DJxDRqO-sXFNg@5_$$$PK{KKq$h7zs8ee(F&yiqm;553AEOM2Bi?A z(9WY*Q|B{5DJeTr{jL_!B6!(l5!HL;^Ptlez#@q3v|UmDUk^Gd<)FA-!0k2q@^dZF z@Gw_6ena5Gb$EOaV1qaOppngxw@x1vI z-mRu8!&TenwCj1-SZD#G6-F!SM$xe4b5H_?h+-ux&_GmL9f^auav-frQ!oOdfiP5v zKwJn~mu4YSf-I`~1AH~qit;@_FuCeGC3*_c;8kg!s&Z6c-BSU9;{C?3oH~BqLvk$< z+Ut>G&2YSKIAK&}%L7x|1&~tLVVmklwSo``m7=B!n5-Gjtmiy_HKT6J-}TjRh_Ao`bk%X?_wt3V23k z?rOX3P7eSrC(WXw-?~<4rAP{)5XqIoRb03ysI}LPRTR#s(pvm(3sZYR+x?zYd=Y4< z8%5Jw&eKFLta;(FzqcYpMwV>e?_JhD1gY7eX$j^C?{helnObE9)7&)>T7;l7{eV2e>`f zRuR1(5U#GKL=R%h?~1RmH0AX*G#=P;p3GNneNFiBMiw@R^t@JhqxZTa>h*lK8!)R% z({30|!)iips0WJi&@gJDmkD!y*v$R*HQtw`>->%zngM|;L1{s2g{gQGuO+@azy{{xZ8kXfr9x#LlXb(fmSrL`Xsszk=s6*Af>$M1?RG&g;P52?g8`~Yv1!ZuTD=39_dD&t zgEnOtqAGGXrfN)OCq@amRyYqKLSQwilafDWSHI--w(v$Aw)<1jRp*uL4I%UZJlVN( zA&`2QtZ8oTgdAyxG_0mTZLei|xhM8z1IzHa{2=!byAr%mgHZ|tL`Ksvr7KG1US<%4 zRx_iitXipZhBFGZ*JV6lz-x_nLQxHl(Ph|>IAJ|=?#E{qiHDN>5Uv;b!>a}yemAgs+@tfQdp(XR-t^^N2j1rrKN=;7^T=KJgb=_S7oq^ zR7AfQv};{*uZ79$GbLgaVpTg~DNE9e)F&AcF& zGDwMYA$6Xqy5;6h#KDF|19`Osm&)Iql-Fw`SiNHngO$0lRpL%5tk&2vEm8)(g~o}X z6of{jy|A7ZtR}u3%qnCWtjcxuy6WQ%vqp9oe7osL27I*3uh9w$U%KE>pg2$un2bt` z>K2}cQUtb&uobw9uQqc>-+6jP$z!9D;jYmJ$65gaik@?2Tm(2TRXnG+b50sChRWqC ztJkI5TCK236DozSt`QM(rN|4YQ{H$XFIY%D1!b)0E6ds)OX;1NTE8J+^7?o~w63P* z!2-78o0@?mwSei!5*W&0&y~U7fQbdQos25HXEn{a+Ry2Pmb*qGPIf{%R?{y$eJ@xw zSl5-y7o|$Rsp3IG1yRLczH-~hC?cZ?bp;w_@aciVYqa*%ZRxvLdO3@+$Eh;(5Wka# zFx6~3;7Kn~c+?Y=!Fd5n1URo{UMePa{3ta+b6zs1VrfLCATM}n4FB4bJS9zKW ztlbOt<)mOOaojRg=hSeGu~3sap;ve;ibx9qCDB_|c3N~9R^*gm)pfZLFMP?XHLIv= zO`vrNn$p{Y>b#=Rf0P@CGIQLQvP_87$We zt15RK1e7D8X1W$I6lii0HgdNU4v63cLNuzH8AL&@HJLAyO!tp9*k8AJ5&DHEP>O~s zb4Io5bud^kJ5|PI0$mGrtIF7}BI(d-8rDz?6m@L~l-{<+yv(1`REo?A=hk!PlLBYK zR_-QM3Q9DHE8mMfWCe^yid!cPZL9h6LN5K{jpMLAq+bX$jN)M3G7{|Yl&jLAz5=R{ zDq~lXT&^`<8yW(2=V;Xofri9+Otr|Z0Sygptr#j4b*~Ac0(2ju1Zu#3*jSt7#iuoO z4N=9m&A?E%nz}Vaw&X5UX<62n1KrCUFRdrMw&n2EWR*z?&>-n2RolIX@knue+;X_3 zsTsxjEvHlW27#-3eVIV*iwrll0z}Hr=2b3uU{Ssz=t2ae6<#ZHt!QY)FrIn^&>&4y zt1POnp`~HeYg(B>59ctoT!J)QXLIZXi&J+|bei1q+F!8mY|f=V42K$ROc|e9L){ue zQ(BjJ!HGs|SnOq-S?lA0Q)8u7i?3!tDI;?2Ag!H*-fTu-rBhxMx;9Te*9k z_u1=(XLY0fL}W!o*eV3?t0jzpV+Syg5POdj#gsM71eT5xte29pss|5h9NY= znI^0Y99n>Bc&2?1v!_2y>%{#mx>2q)57SwAkz2Bd8Lj7ZOu&ROU<}q8>PAx!OqtE7 z`jUHLp_j1~ryOh<_BR3|rAU35!ydG`@KCstbDaq5si#{A(+$g;C+gfe8t}?y;s5Yl zvOD+xy2bY(c$X?j)`=IDxYCMT1(Y9{GqRn-su{(pPMwp@h!CNWG8l~%gi5HPsA*^c z!?~doD45!S{TY{9hxnb@o$(*AQ!BPShQhHfU3GG}n zqBXVQK1}x68fxHvnp^9O9L+Bh^gD=l6m59++vhpG8MChuvC_9}YE7y& z#+FtVm~y@^a!=e($t9;=(>Sk4yr3%L4}qa7AD$J^-4Z&H=9V$T(N@5Lra@_8E%j{V zo<^CalQ>{9On<0o07X_vQD4=pf zgnFSE63uwW!Ne*w10F8k#HSbT;gUYUu};Cg(>0nCGi0I|uGQ(K3BUPE{|EiY{xv`S z-T>Q<7}-?pvzneY4QA#){i`3r`%O^uE`B4wroRR+FN+Q%SiCuQp7nn?eeA}5Y=2JAZ_ z)QSg2>zr&yw2Y=-I5Gi?V5^c?fDj5aa>ZB(<5OEOT<}~x%x_)2gU5;^gi5&gprE6O z7oK{GZ+_uXR+pCn`1ybGkJ&0bNk1TX_W?HE`$|=quMq}rrF#jt|IV+o9)xSR*v%A{1)TI)3~io*0#E=tt|2UGf(dsu_HI% z%m+U5^Eg+KCZ1q43`ki`O$SwjX9zVA*05z=n6KwIk%{YlQ-3&ZK~Y1$2wEa zO#AyVUT|)+&ToHtm`^^};zGB9%q2LU7BPevaF7%*8 zsq5)o>;T2x7S=MFJ34iLYsa#Yd6L4Fb#$say)Rv{Q78^HJrmP?P{QwCZ1HRJ2Y7N- z6S-G;+wmFR@zei=R2zQfBOfA5v+W-~dF$=m{myrB==Rgt;SutJtXW@UlxQ{O^H)xI-9=v6UiHYObBM^R5s41Ydag zkGb=nySV%N-^ERLJ%Gy+=I5@k*&1Qy*kR^Z*IAjJr9Hi$ANU{sG1HGc2IpP?Hwq(; z>DDH+GtO|3UwwR(*ESVn4Jjv`K$AMplXD^SZiuONj}z%KMG~{Muu8BMkf2!Ubg8dg zCc2{oAxL7N56UYVN0fcYHsGZ@rZ)_l!&g?0=*Nec-?q7|Xe^Ho~vJcAAgRMl5fv(Qayd zXN-CXp*4t!Xg4-EAuGgNeKuxS2)9DQdWYVdm&xDPL&qR58}iGhl$&g6#Ceq6Ns?YS ztAB%>{&rn5!qe~ymn&Kt+B&8&;)t3K>Kz_mJj%E2G%wuuAUD7CGTn2_w3|n1%pBn8 zn;u~L*3fZbL^d~;S9rwSDJHP*3^y8RwXP)Ner@q5eUw(pn z-}RsH;E(?}LO?J)#K?KixE^OVYx0ffn*7o7VXoFjIeH}Heltui1zA0!K2*m90fiIJ zojJ?erI?^Ugq>)Tynhw{o|xL{2L8`2{853qvq=_s*aAg?)@D1?avdeto|pCpx;`Hj zO2$02qYa`-VBZidrmV)N`SUBc^5s;s_O{#UUwVymPdr9rY!X*%aA9tqi|0Sh-48v) zgFo_KzVw+t;o$L`c+XG&EEivW8Dk6=UwwfB&xLcZa_OZP5a-yxe?Mox{#9Q7#@84b zA7$>+ET6plE*ew!u<+z6!Pq{UewFcfj*YdP-f$aL^Mn$U4>!r`j$St@@(JV5=C7&Uhh4#vcjA(%mGwF=v*v{TpkquM1Fu-5=sDh3OsM~tZP z=?%E^2!9#8jqG{h)RitzhLb#-FH^toFdO*>7ryl*-bN&8%C{bUgoW8zawkmxFTcb` zf9==#i4Xl8S>}jpb)NsyBP87(8|&-5`0TUP>J2)bA%a>Rtu?bWv%6mx7prrR9s%79;E}3jM(@W}hb-5sVUQCW6E3M0tbO=cdu0Y?3_bh~qWv zM8rtv06DPPjZ49XQYC?V*)D~N?9JiG^{PgD{8Wj*W27tHJMZL=Mn1ywzk89lUA)AF z17lp+n5FT+?OYme@~w}3oUHKpqG0XfMQmUh8673davuHE?{nLm?!jxzr5DbyJbRg^ zzxHL;H#ey@T8vIi64-K-yIWgmtOL-2ia1N| zAm8fIeosz_(5RMX>kFFTw@)zqNQd;y7C9?KV-1`S$n%0c$?%&SY^}R0|16c-lx@YG z(TLg>D6&UOYIphR_S^fKPAzsieDdPk@ee=7gW)F0%?DZR_4&r!1-|lU=lGEyc@H9< zs~0cP?zE^kTX=DZc!q{M2=MFw@E6FloH$8Hb4RV!qCGN(c)?f;^^pFhE#jQO@QPdv%RSG`@)h2Dtd#n6 zok1B@=JgdsTJhpqE-Q&wf1N&Ty9n~MnUdpaP5H&=czAh%S5_A2TFc3Liyxdkz*9$- zdE!e?@PPvdxcx2nbLOjG#|DP577^I6G=1mj#xaPe(P$zl(mV$x*gPN{4sj=Act?S~ z5@4?ec;#{Z9Ftj^GZC%(8wBt46t|_spUy~%9216wVFSqxvlnKm)tjI_uA5_RNT}PS zX+l5V1gDVPH}F)*+v4r&B6<8wLlcO{mL+C6d z>BjUnw+N#e&03Qnh_GQDC5obOXy<9!fFeoAHa7^ZWq9T&b4i1rJCN|U)(YpYv{>=r zt(1}j6r(lGQ!5!?T*wHtx^TJcA5J}eRnnRs0A}}y2dcDBD5#>Gxyu+_91Lc1r!u;fjJV3<+yBjI~6~2onc{N~8CU zl8kM^9gh6vl=PWC`m({z3XSFv(ZP_QZec^wP5U@k5NJy?sG~AR;x@{fsI}B<5uq_` zZEewu6O>kHZ8<-;#Mw*2dmlW`KREV0{aM9|7ji45SVqA_&2YY3@Yq7aP^9T)^15hV z_HdZ&$hQYlBb6j1VL$}L0)YrkDFq&9lP;k#6iJR`IcrHq7KX&i;cY;uNWE}1#uO?4?a6um)q$(9;dy?wMc+7_DmA#d2+yo# ze0@2^Dj2q!ICpzCZ^-qe0=Xzep%9V2cQTph*eD{dMKqEWZEA=ym@MV&)hj&dE|ZB+ z3qx!zLfL?ZHF#@F5eR}fL6ndrX-SyYBHrV@5a*t){yP3yVYoI%`_K?+$Fs4vffY}d z_tCnP4CqS!?165-Ulw7N&}p`5jSMkAKgZQ87jZ>_X?5tX3D&Lf(NpmEZdDu@ab#|yvVv?|&#yF)2YBkzXZF?Jr>-Wft9Hli{Ray?MQOb~JS()k38m&v=r4pf5YZJ8% zL10*4T4Z%CWvVS~Dhu8t-eI&x8;#NmFCL{7twsZ@;r#4n#*>67YJguNmm%(I)%iQ8 z7kTT1;qbJ9Wz7q(SXNTaRUCaOD_O7h3SQfE2%eG15Eo^QvKc5|-E#EZcej?TB%4~c zih|87rGa7#0X*?E2%J_dHOw1QV2t#qGl|q6E1cO7UD8F`tqhzg-6{` zP0ZdV#t6nODyrODG2 z5y2RP(i){St>Iy87-8xKDr)eBm56U%*rM5t7#eN>kft$N;?Sy;T*m#FtjKvjNw{bF zASXxn@#^dxeq@N>x?`Q&4=mF?)8X7ET*cG19#M)72kVuTYOrm``LZf@v6r)$IO3wz zy`^O~+!%bmTpW2-XIrqR+XKgQV01i7$29N;JN3r6{-B5acU;w^jzN4I&=z z-L}P)PY$OvHn1ok^BYfS&>>?(ihjS36h*1w@PfzVeOV+9ZAeiReCz5gcTDd`Z8msc zeSr_(w?Ou4gIBf`S53}_6Fi!p6Rsq#+_vL9sVl{MHLbYP^PJss+q*#`1$ni@?YkER zgLv=7R#HgWoyRr?t#%ddl%mKpvLq?R1J0qfLMy$K!u2JX)&?l8aYas4uVcfAEbdd} z8474OJ%xj{t&Ex#tT8y}ugTO^DPnEO`vu=Vx6BPTxDHT$Uk9$P4$n&$SIuN~3jYQPvuo z?G}Y|6h%>i~u_s+W26EZxZu zzxj~m$4+kXk^5g{*c#3}Ut>m>mlf z*}KPvQqq?tNhz~521Mu=&~7O{|NfYN_$AA?7cDo97u1aK+(NlA_Vk3~{ih1vdz<6l znaYnY!&B!BmkUqN2&q>TB3zCO)^ktY>Rmg*OZDPx&#{pSkuIy=T(eh3UJu${z_iwQ zSHfItcYJf^po|?l#KGI|WN4%VX@b{=W&mMi5iy)Q^DL{23#_LJXTSL^-txekId%))73N=ho;yz6jWUL0BVoda{M?C~`O2}o zIP!yU=k2!~=kY)P3@`i=7j*yt3@S-PK~$c30hh+$9eI|bv_`xy({6sCU)Zs_ZM971 zIJ06neVgLHY6{HOq44~dx98vlIcr&7G4wO&8&BU9Bnpxodb!Zeg`V?xUv3gBD&>(z z5gJXu5axPrdp}byuTMF@E~zRz)@HAXSxW~V>gYpRt`3}?(fkP#wHHXoS7jZBl5!1>@2NTlLy}Y5YK+~t8~{_>5LE2-`oIguwjTVa>Tjq z*;JfEX+w&DD>xGOOI_8vhIvcw9V>H+t`iCcKJfSuiX4huBTg`0Xh^yHp{5l*?MXaj zqDV#P7s7JlSWe4LShf-a-)INJH7@yj4l7-y{Qk!B3Ul*IJgDkCaCM%2;V`w$4FVHD zX9D_NoT-rq0hix$KmYXnXPI5`{KVh-J1m|(!^-L!Cl4MXPkO8^%%i6E(;44Ke`B5g z#yZMcj0viJK^7fqjM3=2MTz6zoLBrnz0cIa0+v%`$&!X;NFas6CYqWRI<1`XArBdJ z6Ie}Qt{C_d^&R-?&^~utlq#pwc?+c8z z>^pLdw7W@nb(!wwCPh(TqX=UxPHVJrgki{k{iXdhpB~~5e{`1j+&)YA4aG#?&=8HO zJ4PoH7y|;s*>nQk8Rmdn=aA1i)L(~J;VVl4XEH5T0lG`aUZm1Y~~;{CvL%Y*I8SdXJd7ZB#vne4U=antyY_+v7Fn=`Om+4 zKac!~;ek6Y(s;5#Lj$*EoM()OFHi933!vphI5$Kgww zudD^kDNkMd@~9UPyj0ng>r^4HQuB(nu_nXbGAy3n zNR!zhU_1<1i>@sV_Wk_f$xm_m#5`DdHrvNT&;A&(GYr`-6Jwhc z-7OY2VqQGA#OJ=<;8zZv;BSu^{{F-zerh=7YgYoE>{+yR7NM zZ;Oksp5@B`P!n0p|obFmcqus(6IjzYVI`x2dv%%?m@1xsWCGN#6&0eCW z95>zbcIIa<@|_DYAHDkD@Mrsfl~%UFhaSJ3%x!Szq(z4j+D@UFV#*aH{VjZVi;dXv z4=x?y(>eU}!?V2WNY1Sb@E5B!&WcBgE436-ZeSHJ6zl>{>1vnLjU)YPVy`l;Hc;Ju zUuQ|5S3`*DawNArlJ}SxuCX3khPSrZ*MqhGMLOeCG@DHpXXja8-#}~4;_M|h*H>6y zm}h8mABS(djpeKJ%)NG&uvVi;W41!g!lijOHu{Y1-$yh$%(3wUgcdSaply@erV3uk zZsMPA{0#9o{*Mjb4hP|AzC_8^rvh{KH5KJ9MG`ThzQrY7jb zOPqP>EX9BNK`uW08ytMg4>Nn>2%q?qhq;toA#G0smgR+cHW#l_WC>}%R|1n~^w!tW z#u7CeIA5l%^E6{(|6wL4ritT}*(*zQH`Z|8?IN`~qX&!sN#!PF0 zE9V@`SLSh9fo(QRZVl@kzx@tI4jdv$65`Ns{NN1teBgaN{=&Vy>CuPzA9;rV{($GU zm4uJ`h@NQrsiqK5$2bhI=@jbq$K|N&6>@h_#Vc~I9dY0-4`CQ#*|vGpo%iv? zQ(vbxItfY4*+WMdYTrWGO;M7uxG>Ac@*>`OvLvO}Y$4*w(u5!g@mX5dE%Sn!HeCM3 zmzlrx8pG53X}9ZyjSii$8KMabK|mNppcKn%YnZJoOhqwa*u)i@qqm->Jvl)Tgv?Bh z(_LNXOP_s&&b~>G-Tfxa_&BeeyFlye65oIKJuDsh+x)Z7{Ux7y<*)el$qoK)C*>2X zhR@lE#l&KjqiqV52wQ4TVf&4aVW?a(3WHl8d}p}t@KNfm4nqe|arkW`_&nilAO5?n zU%Z55F^$mq)>`VVDkbn%c#3gJZzV_R?D`D_$HRV^jOaM)ytp%+cFU4Nc#Coc_ux z!;|}~^J#LTC}iy56y5nNtS-!9&`i!8XLD@%j_cAm#LA~8T8)5F^ELSd^=llz2c=g$*nLK=mcx#h$Pd|xs zo?f?0((kdgvc}cfIWEo3^U8}aa_fEf@%Eqk88#OeIrGG$EWUQ0MrWAe@k!R!*0}uI zdG0uQf+MHz;rFf6_(GRMH!1|jY2bX)2*C;>3J@`{1Uz> z=&r31L^ZV0^w-x(l9((n$m5t+XPBto;L2++QE#`Yb;jv!tYHF6SZ}iLz!9boA12*e zCC_uFPMlzMZkDwxbF@cBs5hFlhK3lOnV~)0W^HYiP+QJ_>uWTJMtIjx|16F6FlWB_ zSInP#iM*fC85tpLHMscdIhw}sjt3v)RWr=T&Mvc_6?||+cuSaYrq2^+HsxP9?`L-( z6E>JccdaG;_Sz}wbvIvr?uB2hH$J;GedzFqY@;>V>vp@{_0=Se<04H{m8@^*+I*$ZL=OWfbW zIY(G)ic%<76a-O?)e9F{xqJy_3|SJ30=5(?j}w_ZbV!9^#PZyn8X9WLm;T_l>8>tw z$GhH*c+aE1^D(*n(sQiMUs3yxA7kp+5iXp2nbp;09yoam2Zmbe_rLH3{mA0w_{YP| zCue;Bx4n~Z?^*rq%2uddX?!ap1t3bPKtystE3N*suvYuNBF}m*cS}I7jTRGx3WX1B zR0v-3EcH>nL9O1DBF`l0^}Hb77&|!qM!bm6(^R#FhSAna+V5eF5yXiJL&OW(Sc*K8 zEKTsvAp(tNOZwd|&KF84<&CyV2UZztMJq*TbX?Lr*F~O7XtXy$s7Ci6V07jHD|54Q z{+Xv#+K=&4_}0j%8rnA{&K24!BZp4jta|IK^31otvqa%v(~>TF=Xdj0P~nubOCPLI z%CZ+Q4Ws}zv}1^JB9h3?ab`+n*8zKje?+{}dbhmFS6g+ZT6&2#Mv3=S_mcAa9ufWn zos{@JKg{mK=XTGO>Y9Yv?)6hp`K^0{8xM}o+jYKRS##QTsDZ1F%u~C!{8oxTp*qo| z+y%A0k3h+ec2cXVl0FavDy7sl$4iKaD6N!8`Q^c2RQtBI*uW0JUDcq+QjRw4J-UL@kRay096MiDYcV%E{`%%YWpn0!JufRl-?ue^E-tN zr78vK&aL)tL*JI6Zp)ixFIbA5joEtdX4ze@y)TQvT5GTdKPawL$IpmVhyQ^Wk!$jY n|DUn^|KA-1{2w3R>*N0hMzIM-eT2HW00000NkvXXu0mjfyAA@q literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/specialordance.png b/WebHostLib/static/static/icons/sc2/specialordance.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7410d7ca9e250b0305fae35b0ccee603b2e5ee GIT binary patch literal 12992 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 literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/superstimpack.png b/WebHostLib/static/static/icons/sc2/superstimpack.png new file mode 100644 index 0000000000000000000000000000000000000000..0fba8ce5749ad42fe9fa5c86246280aade0e1fa4 GIT binary patch literal 14901 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 literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/targetingoptics.png b/WebHostLib/static/static/icons/sc2/targetingoptics.png new file mode 100644 index 0000000000000000000000000000000000000000..057a40f08e3097f095239cb437618258d58fcb59 GIT binary patch literal 8431 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 literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/thorsiegemode.png b/WebHostLib/static/static/icons/sc2/thorsiegemode.png new file mode 100644 index 0000000000000000000000000000000000000000..a298fb57de5a10de67b9d1c88ad2576884df5967 GIT binary patch literal 11345 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 M07*qoM6N<$f-r-FHvj+t literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/warpjump.png b/WebHostLib/static/static/icons/sc2/warpjump.png new file mode 100644 index 0000000000000000000000000000000000000000..ff0a7b1af4aaeb9fa6cd112b093c3300d8b46041 GIT binary patch literal 8665 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 N002ovPDHLkV1mnDw5$LC literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/widowmine-deathblossom.png b/WebHostLib/static/static/icons/sc2/widowmine-deathblossom.png new file mode 100644 index 0000000000000000000000000000000000000000..7097db05e6c0da7760362b090ad385232f2220b9 GIT binary patch literal 12946 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 IM6N<$g1}Pepa1{> literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/widowmine.png b/WebHostLib/static/static/icons/sc2/widowmine.png new file mode 100644 index 0000000000000000000000000000000000000000..802c49a83d882539becb20df50e6d8a360cc6001 GIT binary patch literal 5671 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 N002ovPDHLkV1hnhB6a`( literal 0 HcmV?d00001 diff --git a/WebHostLib/static/static/icons/sc2/widowminehidden.png b/WebHostLib/static/static/icons/sc2/widowminehidden.png new file mode 100644 index 0000000000000000000000000000000000000000..e568742e8a50c5a1084e6d6de4a43309908f49de GIT binary patch literal 12777 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 literal 0 HcmV?d00001 diff --git a/WebHostLib/static/styles/sc2wolTracker.css b/WebHostLib/static/styles/sc2wolTracker.css index b68668ec..a7d8bd28 100644 --- a/WebHostLib/static/styles/sc2wolTracker.css +++ b/WebHostLib/static/styles/sc2wolTracker.css @@ -9,7 +9,7 @@ border-top-left-radius: 4px; border-top-right-radius: 4px; padding: 3px 3px 10px; - width: 500px; + width: 710px; background-color: #525494; } @@ -34,10 +34,12 @@ max-height: 40px; border: 1px solid #000000; filter: grayscale(100%) contrast(75%) brightness(20%); + background-color: black; } #inventory-table img.acquired{ filter: none; + background-color: black; } #inventory-table div.counted-item { @@ -52,7 +54,7 @@ } #location-table{ - width: 500px; + width: 710px; border-left: 2px solid #000000; border-right: 2px solid #000000; border-bottom: 2px solid #000000; diff --git a/WebHostLib/templates/sc2wolTracker.html b/WebHostLib/templates/sc2wolTracker.html index af27e30b..49c31a57 100644 --- a/WebHostLib/templates/sc2wolTracker.html +++ b/WebHostLib/templates/sc2wolTracker.html @@ -11,7 +11,7 @@

- @@ -26,7 +26,7 @@ --> - @@ -37,120 +37,266 @@ + + + - - - - - - + + + + + - + + + + + + - - + + + + + + + - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + + + + + + + + - - - - - - - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + - - - - - - - - - - - - - - @@ -165,36 +311,18 @@ - - - - - - - - - - + - - - - - - - - - - - + - diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py index 5b89495e..4261c27e 100644 --- a/WebHostLib/tracker.py +++ b/WebHostLib/tracker.py @@ -990,6 +990,7 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict SC2WOL_LOC_ID_OFFSET = 1000 SC2WOL_ITEM_ID_OFFSET = 1000 + icons = { "Starting Minerals": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/icons/icon-mineral-protoss.png", "Starting Vespene": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/icons/icon-gas-terran.png", @@ -1034,15 +1035,36 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict "Reaper": "https://static.wikia.nocookie.net/starcraft/images/7/7d/Reaper_SC2_Icon1.jpg", "Stimpack (Marine)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", + "Super Stimpack (Marine)": "/static/static/icons/sc2/superstimpack.png", "Combat Shield (Marine)": "https://0rganics.org/archipelago/sc2wol/CombatShieldCampaign.png", + "Laser Targeting System (Marine)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Magrail Munitions (Marine)": "/static/static/icons/sc2/magrailmunitions.png", + "Optimized Logistics (Marine)": "/static/static/icons/sc2/optimizedlogistics.png", "Advanced Medic Facilities (Medic)": "https://0rganics.org/archipelago/sc2wol/AdvancedMedicFacilities.png", "Stabilizer Medpacks (Medic)": "https://0rganics.org/archipelago/sc2wol/StabilizerMedpacks.png", + "Restoration (Medic)": "/static/static/icons/sc2/restoration.png", + "Optical Flare (Medic)": "/static/static/icons/sc2/opticalflare.png", + "Optimized Logistics (Medic)": "/static/static/icons/sc2/optimizedlogistics.png", "Incinerator Gauntlets (Firebat)": "https://0rganics.org/archipelago/sc2wol/IncineratorGauntlets.png", "Juggernaut Plating (Firebat)": "https://0rganics.org/archipelago/sc2wol/JuggernautPlating.png", + "Stimpack (Firebat)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", + "Super Stimpack (Firebat)": "/static/static/icons/sc2/superstimpack.png", + "Optimized Logistics (Firebat)": "/static/static/icons/sc2/optimizedlogistics.png", "Concussive Shells (Marauder)": "https://0rganics.org/archipelago/sc2wol/ConcussiveShellsCampaign.png", "Kinetic Foam (Marauder)": "https://0rganics.org/archipelago/sc2wol/KineticFoam.png", + "Stimpack (Marauder)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", + "Super Stimpack (Marauder)": "/static/static/icons/sc2/superstimpack.png", + "Laser Targeting System (Marauder)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Magrail Munitions (Marauder)": "/static/static/icons/sc2/magrailmunitions.png", + "Internal Tech Module (Marauder)": "/static/static/icons/sc2/internalizedtechmodule.png", "U-238 Rounds (Reaper)": "https://0rganics.org/archipelago/sc2wol/U-238Rounds.png", "G-4 Clusterbomb (Reaper)": "https://0rganics.org/archipelago/sc2wol/G-4Clusterbomb.png", + "Stimpack (Reaper)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", + "Super Stimpack (Reaper)": "/static/static/icons/sc2/superstimpack.png", + "Laser Targeting System (Reaper)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Advanced Cloaking Field (Reaper)": "/static/static/icons/sc2/terran-cloak-color.png", + "Spider Mines (Reaper)": "/static/static/icons/sc2/spidermine.png", + "Combat Drugs (Reaper)": "/static/static/icons/sc2/reapercombatdrugs.png", "Hellion": "https://static.wikia.nocookie.net/starcraft/images/5/56/Hellion_SC2_Icon1.jpg", "Vulture": "https://static.wikia.nocookie.net/starcraft/images/d/da/Vulture_WoL.jpg", @@ -1052,14 +1074,35 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict "Twin-Linked Flamethrower (Hellion)": "https://0rganics.org/archipelago/sc2wol/Twin-LinkedFlamethrower.png", "Thermite Filaments (Hellion)": "https://0rganics.org/archipelago/sc2wol/ThermiteFilaments.png", - "Cerberus Mine (Vulture)": "https://0rganics.org/archipelago/sc2wol/CerberusMine.png", + "Hellbat Aspect (Hellion)": "/static/static/icons/sc2/hellionbattlemode.png", + "Smart Servos (Hellion)": "/static/static/icons/sc2/transformationservos.png", + "Optimized Logistics (Hellion)": "/static/static/icons/sc2/optimizedlogistics.png", + "Jump Jets (Hellion)": "/static/static/icons/sc2/jumpjets.png", + "Stimpack (Hellion)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", + "Super Stimpack (Hellion)": "/static/static/icons/sc2/superstimpack.png", + "Cerberus Mine (Spider Mine)": "https://0rganics.org/archipelago/sc2wol/CerberusMine.png", + "High Explosive Munition (Spider Mine)": "/static/static/icons/sc2/high-explosive-spidermine.png", "Replenishable Magazine (Vulture)": "https://0rganics.org/archipelago/sc2wol/ReplenishableMagazine.png", + "Ion Thrusters (Vulture)": "/static/static/icons/sc2/emergencythrusters.png", + "Auto Launchers (Vulture)": "/static/static/icons/sc2/jotunboosters.png", "Multi-Lock Weapons System (Goliath)": "https://0rganics.org/archipelago/sc2wol/Multi-LockWeaponsSystem.png", "Ares-Class Targeting System (Goliath)": "https://0rganics.org/archipelago/sc2wol/Ares-ClassTargetingSystem.png", + "Jump Jets (Goliath)": "/static/static/icons/sc2/jumpjets.png", + "Optimized Logistics (Goliath)": "/static/static/icons/sc2/optimizedlogistics.png", "Tri-Lithium Power Cell (Diamondback)": "https://0rganics.org/archipelago/sc2wol/Tri-LithiumPowerCell.png", "Shaped Hull (Diamondback)": "https://0rganics.org/archipelago/sc2wol/ShapedHull.png", + "Hyperfluxor (Diamondback)": "/static/static/icons/sc2/hyperfluxor.png", + "Burst Capacitors (Diamondback)": "/static/static/icons/sc2/burstcapacitors.png", + "Optimized Logistics (Diamondback)": "/static/static/icons/sc2/optimizedlogistics.png", "Maelstrom Rounds (Siege Tank)": "https://0rganics.org/archipelago/sc2wol/MaelstromRounds.png", "Shaped Blast (Siege Tank)": "https://0rganics.org/archipelago/sc2wol/ShapedBlast.png", + "Jump Jets (Siege Tank)": "/static/static/icons/sc2/jumpjets.png", + "Spider Mines (Siege Tank)": "/static/static/icons/sc2/siegetank-spidermines.png", + "Smart Servos (Siege Tank)": "/static/static/icons/sc2/transformationservos.png", + "Graduating Range (Siege Tank)": "/static/static/icons/sc2/siegetankrange.png", + "Laser Targeting System (Siege Tank)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Advanced Siege Tech (Siege Tank)": "/static/static/icons/sc2/improvedsiegemode.png", + "Internal Tech Module (Siege Tank)": "/static/static/icons/sc2/internalizedtechmodule.png", "Medivac": "https://static.wikia.nocookie.net/starcraft/images/d/db/Medivac_SC2_Icon1.jpg", "Wraith": "https://static.wikia.nocookie.net/starcraft/images/7/75/Wraith_WoL.jpg", @@ -1069,25 +1112,77 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict "Rapid Deployment Tube (Medivac)": "https://0rganics.org/archipelago/sc2wol/RapidDeploymentTube.png", "Advanced Healing AI (Medivac)": "https://0rganics.org/archipelago/sc2wol/AdvancedHealingAI.png", + "Expanded Hull (Medivac)": "/static/static/icons/sc2/neosteelfortifiedarmor.png", + "Afterburners (Medivac)": "/static/static/icons/sc2/medivacemergencythrusters.png", "Tomahawk Power Cells (Wraith)": "https://0rganics.org/archipelago/sc2wol/TomahawkPowerCells.png", "Displacement Field (Wraith)": "https://0rganics.org/archipelago/sc2wol/DisplacementField.png", + "Advanced Laser Technology (Wraith)": "/static/static/icons/sc2/improvedburstlaser.png", "Ripwave Missiles (Viking)": "https://0rganics.org/archipelago/sc2wol/RipwaveMissiles.png", "Phobos-Class Weapons System (Viking)": "https://0rganics.org/archipelago/sc2wol/Phobos-ClassWeaponsSystem.png", - "Cross-Spectrum Dampeners (Banshee)": "https://0rganics.org/archipelago/sc2wol/Cross-SpectrumDampeners.png", + "Smart Servos (Viking)": "/static/static/icons/sc2/transformationservos.png", + "Magrail Munitions (Viking)": "/static/static/icons/sc2/magrailmunitions.png", + "Cross-Spectrum Dampeners (Banshee)": "/static/static/icons/sc2/crossspectrumdampeners.png", + "Advanced Cross-Spectrum Dampeners (Banshee)": "https://0rganics.org/archipelago/sc2wol/Cross-SpectrumDampeners.png", "Shockwave Missile Battery (Banshee)": "https://0rganics.org/archipelago/sc2wol/ShockwaveMissileBattery.png", + "Hyperflight Rotors (Banshee)": "/static/static/icons/sc2/hyperflightrotors.png", + "Laser Targeting System (Banshee)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Internal Tech Module (Banshee)": "/static/static/icons/sc2/internalizedtechmodule.png", "Missile Pods (Battlecruiser)": "https://0rganics.org/archipelago/sc2wol/MissilePods.png", "Defensive Matrix (Battlecruiser)": "https://0rganics.org/archipelago/sc2wol/DefensiveMatrix.png", + "Tactical Jump (Battlecruiser)": "/static/static/icons/sc2/warpjump.png", + "Cloak (Battlecruiser)": "/static/static/icons/sc2/terran-cloak-color.png", + "ATX Laser Battery (Battlecruiser)": "/static/static/icons/sc2/specialordance.png", + "Optimized Logistics (Battlecruiser)": "/static/static/icons/sc2/optimizedlogistics.png", + "Internal Tech Module (Battlecruiser)": "/static/static/icons/sc2/internalizedtechmodule.png", "Ghost": "https://static.wikia.nocookie.net/starcraft/images/6/6e/Ghost_SC2_Icon1.jpg", "Spectre": "https://static.wikia.nocookie.net/starcraft/images/0/0d/Spectre_WoL.jpg", "Thor": "https://static.wikia.nocookie.net/starcraft/images/e/ef/Thor_SC2_Icon1.jpg", + "Widow Mine": "/static/static/icons/sc2/widowmine.png", + "Cyclone": "/static/static/icons/sc2/cyclone.png", + "Liberator": "/static/static/icons/sc2/liberator.png", + "Valkyrie": "/static/static/icons/sc2/valkyrie.png", + "Ocular Implants (Ghost)": "https://0rganics.org/archipelago/sc2wol/OcularImplants.png", "Crius Suit (Ghost)": "https://0rganics.org/archipelago/sc2wol/CriusSuit.png", + "EMP Rounds (Ghost)": "/static/static/icons/sc2/terran-emp-color.png", + "Lockdown (Ghost)": "/static/static/icons/sc2/lockdown.png", "Psionic Lash (Spectre)": "https://0rganics.org/archipelago/sc2wol/PsionicLash.png", "Nyx-Class Cloaking Module (Spectre)": "https://0rganics.org/archipelago/sc2wol/Nyx-ClassCloakingModule.png", + "Impaler Rounds (Spectre)": "/static/static/icons/sc2/impalerrounds.png", "330mm Barrage Cannon (Thor)": "https://0rganics.org/archipelago/sc2wol/330mmBarrageCannon.png", "Immortality Protocol (Thor)": "https://0rganics.org/archipelago/sc2wol/ImmortalityProtocol.png", + "High Impact Payload (Thor)": "/static/static/icons/sc2/thorsiegemode.png", + "Smart Servos (Thor)": "/static/static/icons/sc2/transformationservos.png", + + "Optimized Logistics (Predator)": "/static/static/icons/sc2/optimizedlogistics.png", + "Drilling Claws (Widow Mine)": "/static/static/icons/sc2/drillingclaws.png", + "Concealment (Widow Mine)": "/static/static/icons/sc2/widowminehidden.png", + "Black Market Launchers (Widow Mine)": "/static/static/icons/sc2/widowmine-attackrange.png", + "Executioner Missiles (Widow Mine)": "/static/static/icons/sc2/widowmine-deathblossom.png", + "Mag-Field Accelerators (Cyclone)": "/static/static/icons/sc2/magfieldaccelerator.png", + "Mag-Field Launchers (Cyclone)": "/static/static/icons/sc2/cyclonerangeupgrade.png", + "Targeting Optics (Cyclone)": "/static/static/icons/sc2/targetingoptics.png", + "Rapid Fire Launchers (Cyclone)": "/static/static/icons/sc2/ripwavemissiles.png", + "Bio Mechanical Repair Drone (Raven)": "/static/static/icons/sc2/biomechanicaldrone.png", + "Spider Mines (Raven)": "/static/static/icons/sc2/siegetank-spidermines.png", + "Railgun Turret (Raven)": "/static/static/icons/sc2/autoturretblackops.png", + "Hunter-Seeker Weapon (Raven)": "/static/static/icons/sc2/specialordance.png", + "Interference Matrix (Raven)": "/static/static/icons/sc2/interferencematrix.png", + "Anti-Armor Missile (Raven)": "/static/static/icons/sc2/shreddermissile.png", + "Internal Tech Module (Raven)": "/static/static/icons/sc2/internalizedtechmodule.png", + "EMP Shockwave (Science Vessel)": "/static/static/icons/sc2/staticempblast.png", + "Defensive Matrix (Science Vessel)": "https://0rganics.org/archipelago/sc2wol/DefensiveMatrix.png", + "Advanced Ballistics (Liberator)": "/static/static/icons/sc2/advanceballistics.png", + "Raid Artillery (Liberator)": "/static/static/icons/sc2/terrandefendermodestructureattack.png", + "Cloak (Liberator)": "/static/static/icons/sc2/terran-cloak-color.png", + "Laser Targeting System (Liberator)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Optimized Logistics (Liberator)": "/static/static/icons/sc2/optimizedlogistics.png", + "Enhanced Cluster Launchers (Valkyrie)": "https://0rganics.org/archipelago/sc2wol/HellstormBatteries.png", + "Shaped Hull (Valkyrie)": "https://0rganics.org/archipelago/sc2wol/ShapedHull.png", + "Burst Lasers (Valkyrie)": "/static/static/icons/sc2/improvedburstlaser.png", + "Afterburners (Valkyrie)": "/static/static/icons/sc2/medivacemergencythrusters.png", "War Pigs": "https://static.wikia.nocookie.net/starcraft/images/e/ed/WarPigs_SC2_Icon1.jpg", "Devil Dogs": "https://static.wikia.nocookie.net/starcraft/images/3/33/DevilDogs_SC2_Icon1.jpg", @@ -1109,14 +1204,15 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict "Tech Reactor": "https://static.wikia.nocookie.net/starcraft/images/c/c5/SC2_Lab_Tech_Reactor_Icon.png", "Orbital Strike": "https://static.wikia.nocookie.net/starcraft/images/d/df/SC2_Lab_Orb_Strike_Icon.png", - "Shrike Turret": "https://static.wikia.nocookie.net/starcraft/images/4/44/SC2_Lab_Shrike_Turret_Icon.png", - "Fortified Bunker": "https://static.wikia.nocookie.net/starcraft/images/4/4f/SC2_Lab_FortBunker_Icon.png", + "Shrike Turret (Bunker)": "https://static.wikia.nocookie.net/starcraft/images/4/44/SC2_Lab_Shrike_Turret_Icon.png", + "Fortified Bunker (Bunker)": "https://static.wikia.nocookie.net/starcraft/images/4/4f/SC2_Lab_FortBunker_Icon.png", "Planetary Fortress": "https://static.wikia.nocookie.net/starcraft/images/0/0b/SC2_Lab_PlanetFortress_Icon.png", "Perdition Turret": "https://static.wikia.nocookie.net/starcraft/images/a/af/SC2_Lab_PerdTurret_Icon.png", "Predator": "https://static.wikia.nocookie.net/starcraft/images/8/83/SC2_Lab_Predator_Icon.png", "Hercules": "https://static.wikia.nocookie.net/starcraft/images/4/40/SC2_Lab_Hercules_Icon.png", "Cellular Reactor": "https://static.wikia.nocookie.net/starcraft/images/d/d8/SC2_Lab_CellReactor_Icon.png", - "Regenerative Bio-Steel": "https://static.wikia.nocookie.net/starcraft/images/d/d3/SC2_Lab_BioSteel_Icon.png", + "Regenerative Bio-Steel Level 1": "/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png", + "Regenerative Bio-Steel Level 2": "/static/static/icons/sc2/SC2_Lab_BioSteel_L2.png", "Hive Mind Emulator": "https://static.wikia.nocookie.net/starcraft/images/b/bc/SC2_Lab_Hive_Emulator_Icon.png", "Psi Disrupter": "https://static.wikia.nocookie.net/starcraft/images/c/cf/SC2_Lab_Psi_Disruptor_Icon.png", @@ -1132,40 +1228,71 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict "Nothing": "", } - sc2wol_location_ids = { - "Liberation Day": [SC2WOL_LOC_ID_OFFSET + 100, SC2WOL_LOC_ID_OFFSET + 101, SC2WOL_LOC_ID_OFFSET + 102, SC2WOL_LOC_ID_OFFSET + 103, SC2WOL_LOC_ID_OFFSET + 104, SC2WOL_LOC_ID_OFFSET + 105, SC2WOL_LOC_ID_OFFSET + 106], - "The Outlaws": [SC2WOL_LOC_ID_OFFSET + 200, SC2WOL_LOC_ID_OFFSET + 201], - "Zero Hour": [SC2WOL_LOC_ID_OFFSET + 300, SC2WOL_LOC_ID_OFFSET + 301, SC2WOL_LOC_ID_OFFSET + 302, SC2WOL_LOC_ID_OFFSET + 303], - "Evacuation": [SC2WOL_LOC_ID_OFFSET + 400, SC2WOL_LOC_ID_OFFSET + 401, SC2WOL_LOC_ID_OFFSET + 402, SC2WOL_LOC_ID_OFFSET + 403], - "Outbreak": [SC2WOL_LOC_ID_OFFSET + 500, SC2WOL_LOC_ID_OFFSET + 501, SC2WOL_LOC_ID_OFFSET + 502], - "Safe Haven": [SC2WOL_LOC_ID_OFFSET + 600, SC2WOL_LOC_ID_OFFSET + 601, SC2WOL_LOC_ID_OFFSET + 602, SC2WOL_LOC_ID_OFFSET + 603], - "Haven's Fall": [SC2WOL_LOC_ID_OFFSET + 700, SC2WOL_LOC_ID_OFFSET + 701, SC2WOL_LOC_ID_OFFSET + 702, SC2WOL_LOC_ID_OFFSET + 703], - "Smash and Grab": [SC2WOL_LOC_ID_OFFSET + 800, SC2WOL_LOC_ID_OFFSET + 801, SC2WOL_LOC_ID_OFFSET + 802, SC2WOL_LOC_ID_OFFSET + 803, SC2WOL_LOC_ID_OFFSET + 804], - "The Dig": [SC2WOL_LOC_ID_OFFSET + 900, SC2WOL_LOC_ID_OFFSET + 901, SC2WOL_LOC_ID_OFFSET + 902, SC2WOL_LOC_ID_OFFSET + 903], - "The Moebius Factor": [SC2WOL_LOC_ID_OFFSET + 1000, SC2WOL_LOC_ID_OFFSET + 1003, SC2WOL_LOC_ID_OFFSET + 1004, SC2WOL_LOC_ID_OFFSET + 1005, SC2WOL_LOC_ID_OFFSET + 1006, SC2WOL_LOC_ID_OFFSET + 1007, SC2WOL_LOC_ID_OFFSET + 1008], - "Supernova": [SC2WOL_LOC_ID_OFFSET + 1100, SC2WOL_LOC_ID_OFFSET + 1101, SC2WOL_LOC_ID_OFFSET + 1102, SC2WOL_LOC_ID_OFFSET + 1103, SC2WOL_LOC_ID_OFFSET + 1104], - "Maw of the Void": [SC2WOL_LOC_ID_OFFSET + 1200, SC2WOL_LOC_ID_OFFSET + 1201, SC2WOL_LOC_ID_OFFSET + 1202, SC2WOL_LOC_ID_OFFSET + 1203, SC2WOL_LOC_ID_OFFSET + 1204, SC2WOL_LOC_ID_OFFSET + 1205], - "Devil's Playground": [SC2WOL_LOC_ID_OFFSET + 1300, SC2WOL_LOC_ID_OFFSET + 1301, SC2WOL_LOC_ID_OFFSET + 1302], - "Welcome to the Jungle": [SC2WOL_LOC_ID_OFFSET + 1400, SC2WOL_LOC_ID_OFFSET + 1401, SC2WOL_LOC_ID_OFFSET + 1402, SC2WOL_LOC_ID_OFFSET + 1403], - "Breakout": [SC2WOL_LOC_ID_OFFSET + 1500, SC2WOL_LOC_ID_OFFSET + 1501, SC2WOL_LOC_ID_OFFSET + 1502], - "Ghost of a Chance": [SC2WOL_LOC_ID_OFFSET + 1600, SC2WOL_LOC_ID_OFFSET + 1601, SC2WOL_LOC_ID_OFFSET + 1602, SC2WOL_LOC_ID_OFFSET + 1603, SC2WOL_LOC_ID_OFFSET + 1604, SC2WOL_LOC_ID_OFFSET + 1605], - "The Great Train Robbery": [SC2WOL_LOC_ID_OFFSET + 1700, SC2WOL_LOC_ID_OFFSET + 1701, SC2WOL_LOC_ID_OFFSET + 1702, SC2WOL_LOC_ID_OFFSET + 1703], - "Cutthroat": [SC2WOL_LOC_ID_OFFSET + 1800, SC2WOL_LOC_ID_OFFSET + 1801, SC2WOL_LOC_ID_OFFSET + 1802, SC2WOL_LOC_ID_OFFSET + 1803, SC2WOL_LOC_ID_OFFSET + 1804], - "Engine of Destruction": [SC2WOL_LOC_ID_OFFSET + 1900, SC2WOL_LOC_ID_OFFSET + 1901, SC2WOL_LOC_ID_OFFSET + 1902, SC2WOL_LOC_ID_OFFSET + 1903, SC2WOL_LOC_ID_OFFSET + 1904, SC2WOL_LOC_ID_OFFSET + 1905], - "Media Blitz": [SC2WOL_LOC_ID_OFFSET + 2000, SC2WOL_LOC_ID_OFFSET + 2001, SC2WOL_LOC_ID_OFFSET + 2002, SC2WOL_LOC_ID_OFFSET + 2003, SC2WOL_LOC_ID_OFFSET + 2004], - "Piercing the Shroud": [SC2WOL_LOC_ID_OFFSET + 2100, SC2WOL_LOC_ID_OFFSET + 2101, SC2WOL_LOC_ID_OFFSET + 2102, SC2WOL_LOC_ID_OFFSET + 2103, SC2WOL_LOC_ID_OFFSET + 2104, SC2WOL_LOC_ID_OFFSET + 2105], - "Whispers of Doom": [SC2WOL_LOC_ID_OFFSET + 2200, SC2WOL_LOC_ID_OFFSET + 2201, SC2WOL_LOC_ID_OFFSET + 2202, SC2WOL_LOC_ID_OFFSET + 2203], - "A Sinister Turn": [SC2WOL_LOC_ID_OFFSET + 2300, SC2WOL_LOC_ID_OFFSET + 2301, SC2WOL_LOC_ID_OFFSET + 2302, SC2WOL_LOC_ID_OFFSET + 2303], - "Echoes of the Future": [SC2WOL_LOC_ID_OFFSET + 2400, SC2WOL_LOC_ID_OFFSET + 2401, SC2WOL_LOC_ID_OFFSET + 2402], - "In Utter Darkness": [SC2WOL_LOC_ID_OFFSET + 2500, SC2WOL_LOC_ID_OFFSET + 2501, SC2WOL_LOC_ID_OFFSET + 2502], - "Gates of Hell": [SC2WOL_LOC_ID_OFFSET + 2600, SC2WOL_LOC_ID_OFFSET + 2601], - "Belly of the Beast": [SC2WOL_LOC_ID_OFFSET + 2700, SC2WOL_LOC_ID_OFFSET + 2701, SC2WOL_LOC_ID_OFFSET + 2702, SC2WOL_LOC_ID_OFFSET + 2703], - "Shatter the Sky": [SC2WOL_LOC_ID_OFFSET + 2800, SC2WOL_LOC_ID_OFFSET + 2801, SC2WOL_LOC_ID_OFFSET + 2802, SC2WOL_LOC_ID_OFFSET + 2803, SC2WOL_LOC_ID_OFFSET + 2804, SC2WOL_LOC_ID_OFFSET + 2805], + "Liberation Day": range(SC2WOL_LOC_ID_OFFSET + 100, SC2WOL_LOC_ID_OFFSET + 200), + "The Outlaws": range(SC2WOL_LOC_ID_OFFSET + 200, SC2WOL_LOC_ID_OFFSET + 300), + "Zero Hour": range(SC2WOL_LOC_ID_OFFSET + 300, SC2WOL_LOC_ID_OFFSET + 400), + "Evacuation": range(SC2WOL_LOC_ID_OFFSET + 400, SC2WOL_LOC_ID_OFFSET + 500), + "Outbreak": range(SC2WOL_LOC_ID_OFFSET + 500, SC2WOL_LOC_ID_OFFSET + 600), + "Safe Haven": range(SC2WOL_LOC_ID_OFFSET + 600, SC2WOL_LOC_ID_OFFSET + 700), + "Haven's Fall": range(SC2WOL_LOC_ID_OFFSET + 700, SC2WOL_LOC_ID_OFFSET + 800), + "Smash and Grab": range(SC2WOL_LOC_ID_OFFSET + 800, SC2WOL_LOC_ID_OFFSET + 900), + "The Dig": range(SC2WOL_LOC_ID_OFFSET + 900, SC2WOL_LOC_ID_OFFSET + 1000), + "The Moebius Factor": range(SC2WOL_LOC_ID_OFFSET + 1000, SC2WOL_LOC_ID_OFFSET + 1100), + "Supernova": range(SC2WOL_LOC_ID_OFFSET + 1100, SC2WOL_LOC_ID_OFFSET + 1200), + "Maw of the Void": range(SC2WOL_LOC_ID_OFFSET + 1200, SC2WOL_LOC_ID_OFFSET + 1300), + "Devil's Playground": range(SC2WOL_LOC_ID_OFFSET + 1300, SC2WOL_LOC_ID_OFFSET + 1400), + "Welcome to the Jungle": range(SC2WOL_LOC_ID_OFFSET + 1400, SC2WOL_LOC_ID_OFFSET + 1500), + "Breakout": range(SC2WOL_LOC_ID_OFFSET + 1500, SC2WOL_LOC_ID_OFFSET + 1600), + "Ghost of a Chance": range(SC2WOL_LOC_ID_OFFSET + 1600, SC2WOL_LOC_ID_OFFSET + 1700), + "The Great Train Robbery": range(SC2WOL_LOC_ID_OFFSET + 1700, SC2WOL_LOC_ID_OFFSET + 1800), + "Cutthroat": range(SC2WOL_LOC_ID_OFFSET + 1800, SC2WOL_LOC_ID_OFFSET + 1900), + "Engine of Destruction": range(SC2WOL_LOC_ID_OFFSET + 1900, SC2WOL_LOC_ID_OFFSET + 2000), + "Media Blitz": range(SC2WOL_LOC_ID_OFFSET + 2000, SC2WOL_LOC_ID_OFFSET + 2100), + "Piercing the Shroud": range(SC2WOL_LOC_ID_OFFSET + 2100, SC2WOL_LOC_ID_OFFSET + 2200), + "Whispers of Doom": range(SC2WOL_LOC_ID_OFFSET + 2200, SC2WOL_LOC_ID_OFFSET + 2300), + "A Sinister Turn": range(SC2WOL_LOC_ID_OFFSET + 2300, SC2WOL_LOC_ID_OFFSET + 2400), + "Echoes of the Future": range(SC2WOL_LOC_ID_OFFSET + 2400, SC2WOL_LOC_ID_OFFSET + 2500), + "In Utter Darkness": range(SC2WOL_LOC_ID_OFFSET + 2500, SC2WOL_LOC_ID_OFFSET + 2600), + "Gates of Hell": range(SC2WOL_LOC_ID_OFFSET + 2600, SC2WOL_LOC_ID_OFFSET + 2700), + "Belly of the Beast": range(SC2WOL_LOC_ID_OFFSET + 2700, SC2WOL_LOC_ID_OFFSET + 2800), + "Shatter the Sky": range(SC2WOL_LOC_ID_OFFSET + 2800, SC2WOL_LOC_ID_OFFSET + 2900), } display_data = {} + # Grouped Items + grouped_item_ids = { + "Progressive Weapon Upgrade": 107 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Armor Upgrade": 108 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Infantry Upgrade": 109 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Vehicle Upgrade": 110 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Ship Upgrade": 111 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Weapon/Armor Upgrade": 112 + SC2WOL_ITEM_ID_OFFSET + } + grouped_item_replacements = { + "Progressive Weapon Upgrade": ["Progressive Infantry Weapon", "Progressive Vehicle Weapon", "Progressive Ship Weapon"], + "Progressive Armor Upgrade": ["Progressive Infantry Armor", "Progressive Vehicle Armor", "Progressive Ship Armor"], + "Progressive Infantry Upgrade": ["Progressive Infantry Weapon", "Progressive Infantry Armor"], + "Progressive Vehicle Upgrade": ["Progressive Vehicle Weapon", "Progressive Vehicle Armor"], + "Progressive Ship Upgrade": ["Progressive Ship Weapon", "Progressive Ship Armor"] + } + grouped_item_replacements["Progressive Weapon/Armor Upgrade"] = grouped_item_replacements["Progressive Weapon Upgrade"] + grouped_item_replacements["Progressive Armor Upgrade"] + replacement_item_ids = { + "Progressive Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Infantry Armor": 102 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET, + } + for grouped_item_name, grouped_item_id in grouped_item_ids.items(): + count: int = inventory[grouped_item_id] + if count > 0: + for replacement_item in grouped_item_replacements[grouped_item_name]: + replacement_id: int = replacement_item_ids[replacement_item] + inventory[replacement_id] = count + # Determine display for progressive items progressive_items = { "Progressive Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET, @@ -1173,7 +1300,15 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict "Progressive Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET, "Progressive Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET, "Progressive Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET + "Progressive Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Stimpack (Marine)": 208 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Stimpack (Firebat)": 226 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Stimpack (Marauder)": 228 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Stimpack (Reaper)": 250 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Stimpack (Hellion)": 259 + SC2WOL_ITEM_ID_OFFSET, + "Progressive High Impact Payload (Thor)": 361 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Cross-Spectrum Dampeners (Banshee)": 316 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Regenerative Bio-Steel": 617 + SC2WOL_ITEM_ID_OFFSET } progressive_names = { "Progressive Infantry Weapon": ["Infantry Weapons Level 1", "Infantry Weapons Level 1", "Infantry Weapons Level 2", "Infantry Weapons Level 3"], @@ -1181,14 +1316,27 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict "Progressive Vehicle Weapon": ["Vehicle Weapons Level 1", "Vehicle Weapons Level 1", "Vehicle Weapons Level 2", "Vehicle Weapons Level 3"], "Progressive Vehicle Armor": ["Vehicle Armor Level 1", "Vehicle Armor Level 1", "Vehicle Armor Level 2", "Vehicle Armor Level 3"], "Progressive Ship Weapon": ["Ship Weapons Level 1", "Ship Weapons Level 1", "Ship Weapons Level 2", "Ship Weapons Level 3"], - "Progressive Ship Armor": ["Ship Armor Level 1", "Ship Armor Level 1", "Ship Armor Level 2", "Ship Armor Level 3"] + "Progressive Ship Armor": ["Ship Armor Level 1", "Ship Armor Level 1", "Ship Armor Level 2", "Ship Armor Level 3"], + "Progressive Stimpack (Marine)": ["Stimpack (Marine)", "Stimpack (Marine)", "Super Stimpack (Marine)"], + "Progressive Stimpack (Firebat)": ["Stimpack (Firebat)", "Stimpack (Firebat)", "Super Stimpack (Firebat)"], + "Progressive Stimpack (Marauder)": ["Stimpack (Marauder)", "Stimpack (Marauder)", "Super Stimpack (Marauder)"], + "Progressive Stimpack (Reaper)": ["Stimpack (Reaper)", "Stimpack (Reaper)", "Super Stimpack (Reaper)"], + "Progressive Stimpack (Hellion)": ["Stimpack (Hellion)", "Stimpack (Hellion)", "Super Stimpack (Hellion)"], + "Progressive High Impact Payload (Thor)": ["High Impact Payload (Thor)", "High Impact Payload (Thor)", "Smart Servos (Thor)"], + "Progressive Cross-Spectrum Dampeners (Banshee)": ["Cross-Spectrum Dampeners (Banshee)", "Cross-Spectrum Dampeners (Banshee)", "Advanced Cross-Spectrum Dampeners (Banshee)"], + "Progressive Regenerative Bio-Steel": ["Regenerative Bio-Steel Level 1", "Regenerative Bio-Steel Level 1", "Regenerative Bio-Steel Level 2"] } for item_name, item_id in progressive_items.items(): level = min(inventory[item_id], len(progressive_names[item_name]) - 1) display_name = progressive_names[item_name][level] - base_name = item_name.split(maxsplit=1)[1].lower().replace(' ', '_') + base_name = (item_name.split(maxsplit=1)[1].lower() + .replace(' ', '_') + .replace("-", "") + .replace("(", "") + .replace(")", "")) display_data[base_name + "_level"] = level display_data[base_name + "_url"] = icons[display_name] + display_data[base_name + "_name"] = display_name # Multi-items multi_items = { @@ -1220,12 +1368,12 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict checks_in_area['Total'] = sum(checks_in_area.values()) return render_template("sc2wolTracker.html", - inventory=inventory, icons=icons, - acquired_items={lookup_any_item_id_to_name[id] for id in inventory if - id in lookup_any_item_id_to_name}, - player=player, team=team, room=room, player_name=playerName, - checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, - **display_data) + inventory=inventory, icons=icons, + acquired_items={lookup_any_item_id_to_name[id] for id in inventory if + id in lookup_any_item_id_to_name}, + player=player, team=team, room=room, player_name=playerName, + checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, + **display_data) def __renderChecksfinder(multisave: Dict[str, Any], room: Room, locations: Dict[int, Dict[int, Tuple[int, int, int]]], inventory: Counter, team: int, player: int, playerName: str, diff --git a/setup.py b/setup.py index 212bcc5d..ce35c0f1 100644 --- a/setup.py +++ b/setup.py @@ -80,7 +80,6 @@ non_apworlds: set = { "Raft", "Secret of Evermore", "Slay the Spire", - "Starcraft 2 Wings of Liberty", "Sudoku", "Super Mario 64", "VVVVVV", @@ -91,6 +90,7 @@ non_apworlds: set = { # LogicMixin is broken before 3.10 import revamp if sys.version_info < (3,10): non_apworlds.add("Hollow Knight") + non_apworlds.add("Starcraft 2 Wings of Liberty") def download_SNI(): print("Updating SNI") diff --git a/worlds/_sc2common/bot/maps.py b/worlds/_sc2common/bot/maps.py index f14b5af9..29ce9f65 100644 --- a/worlds/_sc2common/bot/maps.py +++ b/worlds/_sc2common/bot/maps.py @@ -8,18 +8,31 @@ from .paths import Paths def get(name: str) -> Map: - # Iterate through 2 folder depths for map_dir in (p for p in Paths.MAPS.iterdir()): - if map_dir.is_dir(): - for map_file in (p for p in map_dir.iterdir()): - if Map.matches_target_map_name(map_file, name): - return Map(map_file) - elif Map.matches_target_map_name(map_dir, name): - return Map(map_dir) + map = find_map_in_dir(name, map_dir) + if map is not None: + return map raise KeyError(f"Map '{name}' was not found. Please put the map file in \"/StarCraft II/Maps/\".") +# Go deeper +def find_map_in_dir(name, path): + if Map.matches_target_map_name(path, name): + return Map(path) + + if path.name.endswith("SC2Map"): + return None + + if path.is_dir(): + for childPath in (p for p in path.iterdir()): + map = find_map_in_dir(name, childPath) + if map is not None: + return map + + return None + + class Map: def __init__(self, path: Path): diff --git a/worlds/sc2wol/Client.py b/worlds/sc2wol/Client.py new file mode 100644 index 00000000..c544cf0c --- /dev/null +++ b/worlds/sc2wol/Client.py @@ -0,0 +1,1201 @@ +from __future__ import annotations + +import asyncio +import copy +import ctypes +import logging +import multiprocessing +import os.path +import re +import sys +import typing +import queue +import zipfile +import io +import random +from pathlib import Path + +# 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 + +if __name__ == "__main__": + init_logging("SC2Client", exception_logger="Client") + +logger = logging.getLogger("Client") +sc2_logger = logging.getLogger("Starcraft2") + +import nest_asyncio +from worlds._sc2common import bot +from worlds._sc2common.bot.data import Race +from worlds._sc2common.bot.main import run_game +from worlds._sc2common.bot.player import Bot +from worlds.sc2wol import SC2WoLWorld +from worlds.sc2wol.Items import lookup_id_to_name, get_full_item_list, ItemData, type_flaggroups, upgrade_numbers +from worlds.sc2wol.Locations import SC2WOL_LOC_ID_OFFSET +from worlds.sc2wol.MissionTables import lookup_id_to_mission +from worlds.sc2wol.Regions import MissionInfo + +import colorama +from NetUtils import ClientStatus, NetworkItem, RawJSONtoTextParser, JSONtoTextParser, JSONMessagePart +from MultiServer import mark_raw + +loop = asyncio.get_event_loop_policy().new_event_loop() +nest_asyncio.apply(loop) +max_bonus: int = 13 +victory_modulo: int = 100 + +# GitHub repo where the Map/mod data is hosted for /download_data command +DATA_REPO_OWNER = "Ziktofel" +DATA_REPO_NAME = "Archipelago-SC2-data" +DATA_API_VERSION = "API2" + + +# Data version file path. +# This file is used to tell if the downloaded data are outdated +# Associated with /download_data command +def get_metadata_file(): + return os.environ["SC2PATH"] + os.sep + "ArchipelagoSC2Metadata.txt" + + +class StarcraftClientProcessor(ClientCommandProcessor): + ctx: SC2Context + + def _cmd_difficulty(self, difficulty: str = "") -> bool: + """Overrides the current difficulty set for the world. Takes the argument casual, normal, hard, or brutal""" + options = difficulty.split() + num_options = len(options) + + if num_options > 0: + difficulty_choice = options[0].lower() + if difficulty_choice == "casual": + self.ctx.difficulty_override = 0 + elif difficulty_choice == "normal": + self.ctx.difficulty_override = 1 + elif difficulty_choice == "hard": + self.ctx.difficulty_override = 2 + elif difficulty_choice == "brutal": + self.ctx.difficulty_override = 3 + else: + self.output("Unable to parse difficulty '" + options[0] + "'") + return False + + self.output("Difficulty set to " + options[0]) + return True + + else: + if self.ctx.difficulty == -1: + self.output("Please connect to a seed before checking difficulty.") + else: + current_difficulty = self.ctx.difficulty + if self.ctx.difficulty_override >= 0: + current_difficulty = self.ctx.difficulty_override + self.output("Current difficulty: " + ["Casual", "Normal", "Hard", "Brutal"][current_difficulty]) + self.output("To change the difficulty, add the name of the difficulty after the command.") + return False + + + def _cmd_game_speed(self, game_speed: str = "") -> bool: + """Overrides the current game speed for the world. + Takes the arguments default, slower, slow, normal, fast, faster""" + options = game_speed.split() + num_options = len(options) + + if num_options > 0: + speed_choice = options[0].lower() + if speed_choice == "default": + self.ctx.game_speed_override = 0 + elif speed_choice == "slower": + self.ctx.game_speed_override = 1 + elif speed_choice == "slow": + self.ctx.game_speed_override = 2 + elif speed_choice == "normal": + self.ctx.game_speed_override = 3 + elif speed_choice == "fast": + self.ctx.game_speed_override = 4 + elif speed_choice == "faster": + self.ctx.game_speed_override = 5 + else: + self.output("Unable to parse game speed '" + options[0] + "'") + return False + + self.output("Game speed set to " + options[0]) + return True + + else: + if self.ctx.game_speed == -1: + self.output("Please connect to a seed before checking game speed.") + else: + current_speed = self.ctx.game_speed + if self.ctx.game_speed_override >= 0: + current_speed = self.ctx.game_speed_override + self.output("Current game speed: " + + ["Default", "Slower", "Slow", "Normal", "Fast", "Faster"][current_speed]) + self.output("To change the game speed, add the name of the speed after the command," + " or Default to select based on difficulty.") + return False + + def _cmd_color(self, color: str = "") -> bool: + player_colors = [ + "White", "Red", "Blue", "Teal", + "Purple", "Yellow", "Orange", "Green", + "LightPink", "Violet", "LightGrey", "DarkGreen", + "Brown", "LightGreen", "DarkGrey", "Pink", + "Rainbow", "Random", "Default" + ] + match_colors = [player_color.lower() for player_color in player_colors] + if color: + if color.lower() not in match_colors: + self.output(color + " is not a valid color. Available colors: " + ', '.join(player_colors)) + return False + if color.lower() == "random": + color = random.choice(player_colors[:16]) + self.ctx.player_color = match_colors.index(color.lower()) + self.output("Color set to " + player_colors[self.ctx.player_color]) + else: + self.output("Current player color: " + player_colors[self.ctx.player_color]) + self.output("To change your colors, add the name of the color after the command.") + self.output("Available colors: " + ', '.join(player_colors)) + + def _cmd_disable_mission_check(self) -> bool: + """Disables the check to see if a mission is available to play. Meant for co-op runs where one player can play + the next mission in a chain the other player is doing.""" + self.ctx.missions_unlocked = True + sc2_logger.info("Mission check has been disabled") + return True + + def _cmd_play(self, mission_id: str = "") -> bool: + """Start a Starcraft 2 mission""" + + options = mission_id.split() + num_options = len(options) + + if num_options > 0: + mission_number = int(options[0]) + + self.ctx.play_mission(mission_number) + + else: + sc2_logger.info( + "Mission ID needs to be specified. Use /unfinished or /available to view ids for available missions.") + return False + + return True + + def _cmd_available(self) -> bool: + """Get what missions are currently available to play""" + + request_available_missions(self.ctx) + return True + + def _cmd_unfinished(self) -> bool: + """Get what missions are currently available to play and have not had all locations checked""" + + request_unfinished_missions(self.ctx) + return True + + @mark_raw + def _cmd_set_path(self, path: str = '') -> bool: + """Manually set the SC2 install directory (if the automatic detection fails).""" + if path: + os.environ["SC2PATH"] = path + is_mod_installed_correctly() + return True + else: + sc2_logger.warning("When using set_path, you must type the path to your SC2 install directory.") + return False + + def _cmd_download_data(self) -> bool: + """Download the most recent release of the necessary files for playing SC2 with + Archipelago. Will overwrite existing files.""" + if "SC2PATH" not in os.environ: + check_game_install_path() + + if os.path.exists(get_metadata_file()): + with open(get_metadata_file(), "r") as f: + metadata = f.read() + else: + metadata = None + + tempzip, metadata = download_latest_release_zip(DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, + metadata=metadata, force_download=True) + + if tempzip != '': + try: + zipfile.ZipFile(tempzip).extractall(path=os.environ["SC2PATH"]) + sc2_logger.info(f"Download complete. Package installed.") + with open(get_metadata_file(), "w") as f: + f.write(metadata) + finally: + os.remove(tempzip) + else: + sc2_logger.warning("Download aborted/failed. Read the log for more information.") + return False + return True + + +class SC2JSONtoTextParser(JSONtoTextParser): + def __init__(self, ctx): + self.handlers = { + "ItemSend": self._handle_color, + "ItemCheat": self._handle_color, + "Hint": self._handle_color, + } + super().__init__(ctx) + + def _handle_color(self, node: JSONMessagePart): + codes = node["color"].split(";") + buffer = "".join(self.color_code(code) for code in codes if code in self.color_codes) + return buffer + self._handle_text(node) + '' + + def color_code(self, code: str): + return '' + + +class SC2Context(CommonContext): + command_processor = StarcraftClientProcessor + game = "Starcraft 2 Wings of Liberty" + items_handling = 0b111 + difficulty = -1 + game_speed = -1 + all_in_choice = 0 + mission_order = 0 + player_color = 2 + mission_req_table: typing.Dict[str, MissionInfo] = {} + final_mission: int = 29 + announcements = queue.Queue() + sc2_run_task: typing.Optional[asyncio.Task] = None + missions_unlocked: bool = False # allow launching missions ignoring requirements + generic_upgrade_missions = 0 + generic_upgrade_research = 0 + generic_upgrade_items = 0 + current_tooltip = None + last_loc_list = None + difficulty_override = -1 + game_speed_override = -1 + mission_id_to_location_ids: typing.Dict[int, typing.List[int]] = {} + last_bot: typing.Optional[ArchipelagoBot] = None + + def __init__(self, *args, **kwargs): + super(SC2Context, self).__init__(*args, **kwargs) + self.raw_text_parser = SC2JSONtoTextParser(self) + + async def server_auth(self, password_requested: bool = False): + if password_requested and not self.password: + await super(SC2Context, self).server_auth(password_requested) + await self.get_username() + await self.send_connect() + + def on_package(self, cmd: str, args: dict): + if cmd in {"Connected"}: + self.difficulty = args["slot_data"]["game_difficulty"] + if "game_speed" in args["slot_data"]: + self.game_speed = args["slot_data"]["game_speed"] + else: + self.game_speed = 0 + self.all_in_choice = args["slot_data"]["all_in_map"] + slot_req_table = args["slot_data"]["mission_req"] + # Maintaining backwards compatibility with older slot data + self.mission_req_table = { + mission: MissionInfo( + **{field: value for field, value in mission_info.items() if field in MissionInfo._fields} + ) + for mission, mission_info in slot_req_table.items() + } + self.mission_order = args["slot_data"].get("mission_order", 0) + self.final_mission = args["slot_data"].get("final_mission", 29) + self.player_color = args["slot_data"].get("player_color", 2) + self.generic_upgrade_missions = args["slot_data"].get("generic_upgrade_missions", 0) + self.generic_upgrade_items = args["slot_data"].get("generic_upgrade_items", 0) + self.generic_upgrade_research = args["slot_data"].get("generic_upgrade_research", 0) + + self.build_location_to_mission_mapping() + + # Looks for the required maps and mods for SC2. Runs check_game_install_path. + maps_present = is_mod_installed_correctly() + if os.path.exists(get_metadata_file()): + with open(get_metadata_file(), "r") as f: + current_ver = f.read() + sc2_logger.debug(f"Current version: {current_ver}") + if is_mod_update_available(DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, current_ver): + sc2_logger.info("NOTICE: Update for required files found. Run /download_data to install.") + elif maps_present: + sc2_logger.warning("NOTICE: Your map files may be outdated (version number not found). " + "Run /download_data to update them.") + + + def on_print_json(self, args: dict): + # goes to this world + if "receiving" in args and self.slot_concerns_self(args["receiving"]): + relevant = True + # found in this world + elif "item" in args and self.slot_concerns_self(args["item"].player): + relevant = True + # not related + else: + relevant = False + + if relevant: + self.announcements.put(self.raw_text_parser(copy.deepcopy(args["data"]))) + + super(SC2Context, self).on_print_json(args) + + def run_gui(self): + from kvui import GameManager, HoverBehavior, ServerToolTip + 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 + from kivy.uix.button import Button + from kivy.uix.floatlayout import FloatLayout + from kivy.properties import StringProperty + + class HoverableButton(HoverBehavior, Button): + pass + + class MissionButton(HoverableButton): + tooltip_text = StringProperty("Test") + ctx: SC2Context + + def __init__(self, *args, **kwargs): + super(HoverableButton, self).__init__(*args, **kwargs) + self.layout = FloatLayout() + self.popuplabel = ServerToolTip(text=self.text) + self.layout.add_widget(self.popuplabel) + + def on_enter(self): + self.popuplabel.text = self.tooltip_text + + if self.ctx.current_tooltip: + App.get_running_app().root.remove_widget(self.ctx.current_tooltip) + + if self.tooltip_text == "": + self.ctx.current_tooltip = None + else: + App.get_running_app().root.add_widget(self.layout) + self.ctx.current_tooltip = self.layout + + def on_leave(self): + self.ctx.ui.clear_tooltip() + + @property + def ctx(self) -> CommonContext: + return App.get_running_app().ctx + + class MissionLayout(GridLayout): + pass + + class MissionCategory(GridLayout): + pass + + class SC2Manager(GameManager): + logging_pairs = [ + ("Client", "Archipelago"), + ("Starcraft2", "Starcraft2"), + ] + base_title = "Archipelago Starcraft 2 Client" + + mission_panel = None + last_checked_locations = {} + mission_id_to_button = {} + launching: typing.Union[bool, int] = False # if int -> mission ID + refresh_from_launching = True + first_check = True + ctx: SC2Context + + def __init__(self, ctx): + super().__init__(ctx) + + def clear_tooltip(self): + if self.ctx.current_tooltip: + App.get_running_app().root.remove_widget(self.ctx.current_tooltip) + + self.ctx.current_tooltip = None + + def build(self): + container = super().build() + + panel = TabbedPanelItem(text="Starcraft 2 Launcher") + self.mission_panel = panel.content = MissionLayout() + + self.tabs.add_widget(panel) + + Clock.schedule_interval(self.build_mission_table, 0.5) + + return container + + def build_mission_table(self, dt): + if (not self.launching and (not self.last_checked_locations == self.ctx.checked_locations or + not self.refresh_from_launching)) or self.first_check: + self.refresh_from_launching = True + + self.mission_panel.clear_widgets() + if self.ctx.mission_req_table: + self.last_checked_locations = self.ctx.checked_locations.copy() + self.first_check = False + + self.mission_id_to_button = {} + categories = {} + available_missions, unfinished_missions = calc_unfinished_missions(self.ctx) + + # separate missions into categories + for mission in self.ctx.mission_req_table: + if not self.ctx.mission_req_table[mission].category in categories: + categories[self.ctx.mission_req_table[mission].category] = [] + + categories[self.ctx.mission_req_table[mission].category].append(mission) + + for category in categories: + category_panel = MissionCategory() + if category.startswith('_'): + category_display_name = '' + else: + category_display_name = category + category_panel.add_widget( + Label(text=category_display_name, size_hint_y=None, height=50, outline_width=1)) + + for mission in categories[category]: + text: str = mission + tooltip: str = "" + mission_id: int = self.ctx.mission_req_table[mission].id + # Map has uncollected locations + if mission in unfinished_missions: + text = f"[color=6495ED]{text}[/color]" + elif mission in available_missions: + text = f"[color=FFFFFF]{text}[/color]" + # Map requirements not met + else: + text = f"[color=a9a9a9]{text}[/color]" + tooltip = f"Requires: " + if self.ctx.mission_req_table[mission].required_world: + tooltip += ", ".join(list(self.ctx.mission_req_table)[req_mission - 1] for + req_mission in + self.ctx.mission_req_table[mission].required_world) + + if self.ctx.mission_req_table[mission].number: + tooltip += " and " + if self.ctx.mission_req_table[mission].number: + tooltip += f"{self.ctx.mission_req_table[mission].number} missions completed" + remaining_location_names: typing.List[str] = [ + self.ctx.location_names[loc] for loc in self.ctx.locations_for_mission(mission) + if loc in self.ctx.missing_locations] + + if mission_id == self.ctx.final_mission: + if mission in available_missions: + text = f"[color=FFBC95]{mission}[/color]" + else: + text = f"[color=D0C0BE]{mission}[/color]" + if tooltip: + tooltip += "\n" + tooltip += "Final Mission" + + if remaining_location_names: + if tooltip: + tooltip += "\n" + tooltip += f"Uncollected locations:\n" + tooltip += "\n".join(remaining_location_names) + + mission_button = MissionButton(text=text, size_hint_y=None, height=50) + mission_button.tooltip_text = tooltip + mission_button.bind(on_press=self.mission_callback) + self.mission_id_to_button[mission_id] = mission_button + category_panel.add_widget(mission_button) + + category_panel.add_widget(Label(text="")) + self.mission_panel.add_widget(category_panel) + + elif self.launching: + self.refresh_from_launching = False + + self.mission_panel.clear_widgets() + self.mission_panel.add_widget(Label(text="Launching Mission: " + + lookup_id_to_mission[self.launching])) + if self.ctx.ui: + self.ctx.ui.clear_tooltip() + + def mission_callback(self, button): + if not self.launching: + mission_id: int = next(k for k, v in self.mission_id_to_button.items() if v == button) + if self.ctx.play_mission(mission_id): + self.launching = mission_id + Clock.schedule_once(self.finish_launching, 10) + + def finish_launching(self, dt): + self.launching = False + + self.ui = SC2Manager(self) + self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") + import pkgutil + data = pkgutil.get_data(SC2WoLWorld.__module__, "Starcraft2.kv").decode() + Builder.load_string(data) + + async def shutdown(self): + await super(SC2Context, self).shutdown() + if self.last_bot: + self.last_bot.want_close = True + if self.sc2_run_task: + self.sc2_run_task.cancel() + + def play_mission(self, mission_id: int) -> bool: + if self.missions_unlocked or \ + is_mission_available(self, mission_id): + if self.sc2_run_task: + if not self.sc2_run_task.done(): + sc2_logger.warning("Starcraft 2 Client is still running!") + self.sc2_run_task.cancel() # doesn't actually close the game, just stops the python task + if self.slot is None: + sc2_logger.warning("Launching Mission without Archipelago authentication, " + "checks will not be registered to server.") + self.sc2_run_task = asyncio.create_task(starcraft_launch(self, mission_id), + name="Starcraft 2 Launch") + return True + else: + sc2_logger.info( + f"{lookup_id_to_mission[mission_id]} is not currently unlocked. " + f"Use /unfinished or /available to see what is available.") + return False + + def build_location_to_mission_mapping(self): + mission_id_to_location_ids: typing.Dict[int, typing.Set[int]] = { + mission_info.id: set() for mission_info in self.mission_req_table.values() + } + + for loc in self.server_locations: + mission_id, objective = divmod(loc - SC2WOL_LOC_ID_OFFSET, victory_modulo) + mission_id_to_location_ids[mission_id].add(objective) + self.mission_id_to_location_ids = {mission_id: sorted(objectives) for mission_id, objectives in + mission_id_to_location_ids.items()} + + def locations_for_mission(self, mission: str): + mission_id: int = self.mission_req_table[mission].id + objectives = self.mission_id_to_location_ids[self.mission_req_table[mission].id] + for objective in objectives: + yield SC2WOL_LOC_ID_OFFSET + mission_id * 100 + objective + + +async def main(): + multiprocessing.freeze_support() + parser = get_base_parser() + parser.add_argument('--name', default=None, help="Slot Name to connect as.") + args = parser.parse_args() + + ctx = SC2Context(args.connect, args.password) + ctx.auth = args.name + if ctx.server_task is None: + ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop") + + if gui_enabled: + ctx.run_gui() + ctx.run_cli() + + await ctx.exit_event.wait() + + await ctx.shutdown() + + +maps_table = [ + "ap_liberation_day", "ap_the_outlaws", "ap_zero_hour", + "ap_evacuation", "ap_outbreak", "ap_safe_haven", "ap_havens_fall", + "ap_smash_and_grab", "ap_the_dig", "ap_the_moebius_factor", "ap_supernova", "ap_maw_of_the_void", + "ap_devils_playground", "ap_welcome_to_the_jungle", "ap_breakout", "ap_ghost_of_a_chance", + "ap_the_great_train_robbery", "ap_cutthroat", "ap_engine_of_destruction", "ap_media_blitz", "ap_piercing_the_shroud", + "ap_whispers_of_doom", "ap_a_sinister_turn", "ap_echoes_of_the_future", "ap_in_utter_darkness", + "ap_gates_of_hell", "ap_belly_of_the_beast", "ap_shatter_the_sky", "ap_all_in" +] + +wol_default_categories = [ + "Mar Sara", "Mar Sara", "Mar Sara", "Colonist", "Colonist", "Colonist", "Colonist", + "Artifact", "Artifact", "Artifact", "Artifact", "Artifact", "Covert", "Covert", "Covert", "Covert", + "Rebellion", "Rebellion", "Rebellion", "Rebellion", "Rebellion", "Prophecy", "Prophecy", "Prophecy", "Prophecy", + "Char", "Char", "Char", "Char" +] +wol_default_category_names = [ + "Mar Sara", "Colonist", "Artifact", "Covert", "Rebellion", "Prophecy", "Char" +] + + +def calculate_items(ctx: SC2Context) -> typing.List[int]: + items = ctx.items_received + network_item: NetworkItem + accumulators: typing.List[int] = [0 for _ in type_flaggroups] + + for network_item in items: + name: str = lookup_id_to_name[network_item.item] + item_data: ItemData = get_full_item_list()[name] + + # exists exactly once + if item_data.quantity == 1: + accumulators[type_flaggroups[item_data.type]] |= 1 << item_data.number + + # exists multiple times + elif item_data.type == "Upgrade" or item_data.type == "Progressive Upgrade": + flaggroup = type_flaggroups[item_data.type] + + # Generic upgrades apply only to Weapon / Armor upgrades + if item_data.type != "Upgrade" or ctx.generic_upgrade_items == 0: + accumulators[flaggroup] += 1 << item_data.number + else: + for bundled_number in upgrade_numbers[item_data.number]: + accumulators[flaggroup] += 1 << bundled_number + + # sum + else: + accumulators[type_flaggroups[item_data.type]] += item_data.number + + # Upgrades from completed missions + if ctx.generic_upgrade_missions > 0: + upgrade_flaggroup = type_flaggroups["Upgrade"] + num_missions = ctx.generic_upgrade_missions * len(ctx.mission_req_table) + amounts = [ + num_missions // 100, + 2 * num_missions // 100, + 3 * num_missions // 100 + ] + upgrade_count = 0 + completed = len([id for id in ctx.mission_id_to_location_ids if SC2WOL_LOC_ID_OFFSET + victory_modulo * id in ctx.checked_locations]) + for amount in amounts: + if completed >= amount: + upgrade_count += 1 + # Equivalent to "Progressive Weapon/Armor Upgrade" item + for bundled_number in upgrade_numbers[5]: + accumulators[upgrade_flaggroup] += upgrade_count << bundled_number + + return accumulators + + +def calc_difficulty(difficulty): + if difficulty == 0: + return 'C' + elif difficulty == 1: + return 'N' + elif difficulty == 2: + return 'H' + elif difficulty == 3: + return 'B' + + return 'X' + + +async def starcraft_launch(ctx: SC2Context, mission_id: int): + sc2_logger.info(f"Launching {lookup_id_to_mission[mission_id]}. If game does not launch check log file for errors.") + + with DllDirectory(None): + run_game(bot.maps.get(maps_table[mission_id - 1]), [Bot(Race.Terran, ArchipelagoBot(ctx, mission_id), + name="Archipelago", fullscreen=True)], realtime=True) + + +class ArchipelagoBot(bot.bot_ai.BotAI): + game_running: bool = False + mission_completed: bool = False + boni: typing.List[bool] + setup_done: bool + ctx: SC2Context + mission_id: int + want_close: bool = False + can_read_game = False + last_received_update: int = 0 + + def __init__(self, ctx: SC2Context, mission_id): + self.setup_done = False + self.ctx = ctx + self.ctx.last_bot = self + self.mission_id = mission_id + self.boni = [False for _ in range(max_bonus)] + + super(ArchipelagoBot, self).__init__() + + async def on_step(self, iteration: int): + if self.want_close: + self.want_close = False + await self._client.leave() + return + game_state = 0 + if not self.setup_done: + self.setup_done = True + start_items = calculate_items(self.ctx) + if self.ctx.difficulty_override >= 0: + difficulty = calc_difficulty(self.ctx.difficulty_override) + else: + difficulty = calc_difficulty(self.ctx.difficulty) + if self.ctx.game_speed_override >= 0: + game_speed = self.ctx.game_speed_override + else: + game_speed = self.ctx.game_speed + await self.chat_send("?SetOptions {} {} {} {}".format( + difficulty, + self.ctx.generic_upgrade_research, + self.ctx.all_in_choice, + game_speed + )) + await self.chat_send("?GiveResources {} {} {}".format( + start_items[8], + start_items[9], + start_items[10] + )) + await self.chat_send("?GiveTerranTech {} {} {} {} {} {} {} {} {} {}".format( + start_items[0], start_items[1], start_items[2], start_items[3], start_items[4], + start_items[5], start_items[6], start_items[12], start_items[13], start_items[14])) + await self.chat_send("?GiveProtossTech {}".format(start_items[7])) + await self.chat_send("?SetColor rr " + str(self.ctx.player_color)) # TODO: Add faction color options + await self.chat_send("?LoadFinished") + self.last_received_update = len(self.ctx.items_received) + + else: + if not self.ctx.announcements.empty(): + message = self.ctx.announcements.get(timeout=1) + await self.chat_send("?SendMessage " + message) + self.ctx.announcements.task_done() + + # Archipelago reads the health + for unit in self.all_own_units(): + if unit.health_max == 38281: + game_state = int(38281 - unit.health) + self.can_read_game = True + + if iteration == 160 and not game_state & 1: + await self.chat_send("?SendMessage Warning: Archipelago unable to connect or has lost connection to " + + "Starcraft 2 (This is likely a map issue)") + + if self.last_received_update < len(self.ctx.items_received): + current_items = calculate_items(self.ctx) + await self.chat_send("?GiveTerranTech {} {} {} {} {} {} {} {} {} {}".format( + current_items[0], current_items[1], current_items[2], current_items[3], current_items[4], + current_items[5], current_items[6], current_items[12], current_items[13], current_items[14])) + await self.chat_send("?GiveProtossTech {}".format(current_items[7])) + self.last_received_update = len(self.ctx.items_received) + + if game_state & 1: + if not self.game_running: + print("Archipelago Connected") + self.game_running = True + + if self.can_read_game: + if game_state & (1 << 1) and not self.mission_completed: + if self.mission_id != self.ctx.final_mission: + print("Mission Completed") + await self.ctx.send_msgs( + [{"cmd": 'LocationChecks', + "locations": [SC2WOL_LOC_ID_OFFSET + victory_modulo * self.mission_id]}]) + self.mission_completed = True + else: + print("Game Complete") + await self.ctx.send_msgs([{"cmd": 'StatusUpdate', "status": ClientStatus.CLIENT_GOAL}]) + self.mission_completed = True + + for x, completed in enumerate(self.boni): + if not completed and game_state & (1 << (x + 2)): + await self.ctx.send_msgs( + [{"cmd": 'LocationChecks', + "locations": [SC2WOL_LOC_ID_OFFSET + victory_modulo * self.mission_id + x + 1]}]) + self.boni[x] = True + + else: + await self.chat_send("?SendMessage LostConnection - Lost connection to game.") + + +def request_unfinished_missions(ctx: SC2Context): + if ctx.mission_req_table: + message = "Unfinished Missions: " + unlocks = initialize_blank_mission_dict(ctx.mission_req_table) + unfinished_locations = initialize_blank_mission_dict(ctx.mission_req_table) + + _, unfinished_missions = calc_unfinished_missions(ctx, unlocks=unlocks) + + # Removing All-In from location pool + final_mission = lookup_id_to_mission[ctx.final_mission] + if final_mission in unfinished_missions.keys(): + message = f"Final Mission Available: {final_mission}[{ctx.final_mission}]\n" + message + if unfinished_missions[final_mission] == -1: + unfinished_missions.pop(final_mission) + + message += ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}[{ctx.mission_req_table[mission].id}] " + + mark_up_objectives( + f"[{len(unfinished_missions[mission])}/" + f"{sum(1 for _ in ctx.locations_for_mission(mission))}]", + ctx, unfinished_locations, mission) + for mission in unfinished_missions) + + if ctx.ui: + ctx.ui.log_panels['All'].on_message_markup(message) + ctx.ui.log_panels['Starcraft2'].on_message_markup(message) + else: + sc2_logger.info(message) + else: + sc2_logger.warning("No mission table found, you are likely not connected to a server.") + + +def calc_unfinished_missions(ctx: SC2Context, unlocks=None): + unfinished_missions = [] + locations_completed = [] + + if not unlocks: + unlocks = initialize_blank_mission_dict(ctx.mission_req_table) + + available_missions = calc_available_missions(ctx, unlocks) + + for name in available_missions: + objectives = set(ctx.locations_for_mission(name)) + if objectives: + objectives_completed = ctx.checked_locations & objectives + if len(objectives_completed) < len(objectives): + unfinished_missions.append(name) + locations_completed.append(objectives_completed) + + else: # infer that this is the final mission as it has no objectives + unfinished_missions.append(name) + locations_completed.append(-1) + + return available_missions, dict(zip(unfinished_missions, locations_completed)) + + +def is_mission_available(ctx: SC2Context, mission_id_to_check): + unfinished_missions = calc_available_missions(ctx) + + return any(mission_id_to_check == ctx.mission_req_table[mission].id for mission in unfinished_missions) + + +def mark_up_mission_name(ctx: SC2Context, mission, unlock_table): + """Checks if the mission is required for game completion and adds '*' to the name to mark that.""" + + if ctx.mission_req_table[mission].completion_critical: + if ctx.ui: + message = "[color=AF99EF]" + mission + "[/color]" + else: + message = "*" + mission + "*" + else: + message = mission + + if ctx.ui: + unlocks = unlock_table[mission] + + if len(unlocks) > 0: + pre_message = f"[ref={list(ctx.mission_req_table).index(mission)}|Unlocks: " + pre_message += ", ".join(f"{unlock}({ctx.mission_req_table[unlock].id})" for unlock in unlocks) + pre_message += f"]" + message = pre_message + message + "[/ref]" + + return message + + +def mark_up_objectives(message, ctx, unfinished_locations, mission): + formatted_message = message + + if ctx.ui: + locations = unfinished_locations[mission] + + pre_message = f"[ref={list(ctx.mission_req_table).index(mission) + 30}|" + pre_message += "
".join(location for location in locations) + pre_message += f"]" + formatted_message = pre_message + message + "[/ref]" + + return formatted_message + + +def request_available_missions(ctx: SC2Context): + if ctx.mission_req_table: + message = "Available Missions: " + + # Initialize mission unlock table + unlocks = initialize_blank_mission_dict(ctx.mission_req_table) + + missions = calc_available_missions(ctx, unlocks) + message += \ + ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}" + f"[{ctx.mission_req_table[mission].id}]" + for mission in missions) + + if ctx.ui: + ctx.ui.log_panels['All'].on_message_markup(message) + ctx.ui.log_panels['Starcraft2'].on_message_markup(message) + else: + sc2_logger.info(message) + else: + sc2_logger.warning("No mission table found, you are likely not connected to a server.") + + +def calc_available_missions(ctx: SC2Context, unlocks=None): + available_missions = [] + missions_complete = 0 + + # Get number of missions completed + for loc in ctx.checked_locations: + if loc % victory_modulo == 0: + missions_complete += 1 + + for name in ctx.mission_req_table: + # Go through the required missions for each mission and fill up unlock table used later for hover-over tooltips + if unlocks: + for unlock in ctx.mission_req_table[name].required_world: + unlocks[list(ctx.mission_req_table)[unlock - 1]].append(name) + + if mission_reqs_completed(ctx, name, missions_complete): + available_missions.append(name) + + return available_missions + + +def mission_reqs_completed(ctx: SC2Context, mission_name: str, missions_complete: int): + """Returns a bool signifying if the mission has all requirements complete and can be done + + Arguments: + ctx -- instance of SC2Context + locations_to_check -- the mission string name to check + missions_complete -- an int of how many missions have been completed + mission_path -- a list of missions that have already been checked +""" + if len(ctx.mission_req_table[mission_name].required_world) >= 1: + # A check for when the requirements are being or'd + or_success = False + + # Loop through required missions + for req_mission in ctx.mission_req_table[mission_name].required_world: + req_success = True + + # Check if required mission has been completed + if not (ctx.mission_req_table[list(ctx.mission_req_table)[req_mission - 1]].id * + victory_modulo + SC2WOL_LOC_ID_OFFSET) in ctx.checked_locations: + if not ctx.mission_req_table[mission_name].or_requirements: + return False + else: + req_success = False + + # Grid-specific logic (to avoid long path checks and infinite recursion) + if ctx.mission_order in (3, 4): + if req_success: + return True + else: + if req_mission is ctx.mission_req_table[mission_name].required_world[-1]: + return False + else: + continue + + # Recursively check required mission to see if it's requirements are met, in case !collect has been done + # Skipping recursive check on Grid settings to speed up checks and avoid infinite recursion + if not mission_reqs_completed(ctx, list(ctx.mission_req_table)[req_mission - 1], missions_complete): + if not ctx.mission_req_table[mission_name].or_requirements: + return False + else: + req_success = False + + # If requirement check succeeded mark or as satisfied + if ctx.mission_req_table[mission_name].or_requirements and req_success: + or_success = True + + if ctx.mission_req_table[mission_name].or_requirements: + # Return false if or requirements not met + if not or_success: + return False + + # Check number of missions + if missions_complete >= ctx.mission_req_table[mission_name].number: + return True + else: + return False + else: + return True + + +def initialize_blank_mission_dict(location_table): + unlocks = {} + + for mission in list(location_table): + unlocks[mission] = [] + + return unlocks + + +def check_game_install_path() -> bool: + # First thing: go to the default location for ExecuteInfo. + # An exception for Windows is included because it's very difficult to find ~\Documents if the user moved it. + if is_windows: + # The next five lines of utterly inscrutable code are brought to you by copy-paste from Stack Overflow. + # https://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path/30924555# + import ctypes.wintypes + CSIDL_PERSONAL = 5 # My Documents + SHGFP_TYPE_CURRENT = 0 # Get current, not default value + + buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) + ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf) + documentspath = buf.value + einfo = str(documentspath / Path("StarCraft II\\ExecuteInfo.txt")) + else: + einfo = str(bot.paths.get_home() / Path(bot.paths.USERPATH[bot.paths.PF])) + + # Check if the file exists. + if os.path.isfile(einfo): + + # Open the file and read it, picking out the latest executable's path. + with open(einfo) as f: + content = f.read() + if content: + try: + base = re.search(r" = (.*)Versions", content).group(1) + except AttributeError: + sc2_logger.warning(f"Found {einfo}, but it was empty. Run SC2 through the Blizzard launcher, then " + f"try again.") + return False + if os.path.exists(base): + executable = bot.paths.latest_executeble(Path(base).expanduser() / "Versions") + + # Finally, check the path for an actual executable. + # If we find one, great. Set up the SC2PATH. + if os.path.isfile(executable): + sc2_logger.info(f"Found an SC2 install at {base}!") + sc2_logger.debug(f"Latest executable at {executable}.") + os.environ["SC2PATH"] = base + sc2_logger.debug(f"SC2PATH set to {base}.") + return True + else: + sc2_logger.warning(f"We may have found an SC2 install at {base}, but couldn't find {executable}.") + else: + sc2_logger.warning(f"{einfo} pointed to {base}, but we could not find an SC2 install there.") + else: + sc2_logger.warning(f"Couldn't find {einfo}. Run SC2 through the Blizzard launcher, then try again. " + f"If that fails, please run /set_path with your SC2 install directory.") + return False + + +def is_mod_installed_correctly() -> bool: + """Searches for all required files.""" + if "SC2PATH" not in os.environ: + check_game_install_path() + + mapdir = os.environ['SC2PATH'] / Path('Maps/ArchipelagoCampaign') + mods = ["ArchipelagoCore", "ArchipelagoPlayer", "ArchipelagoPlayerWoL", "ArchipelagoTriggers"] + modfiles = [os.environ["SC2PATH"] / Path("Mods/" + mod + ".SC2Mod") for mod in mods] + wol_required_maps = ["WoL" + os.sep + map_name + ".SC2Map" for map_name in maps_table] + needs_files = False + + # Check for maps. + missing_maps = [] + for mapfile in wol_required_maps: + if not os.path.isfile(mapdir / mapfile): + missing_maps.append(mapfile) + if len(missing_maps) >= 19: + sc2_logger.warning(f"All map files missing from {mapdir}.") + needs_files = True + elif len(missing_maps) > 0: + for map in missing_maps: + sc2_logger.debug(f"Missing {map} from {mapdir}.") + sc2_logger.warning(f"Missing {len(missing_maps)} map files.") + needs_files = True + else: # Must be no maps missing + sc2_logger.info(f"All maps found in {mapdir}.") + + # Check for mods. + for modfile in modfiles: + if os.path.isfile(modfile) or os.path.isdir(modfile): + sc2_logger.info(f"Archipelago mod found at {modfile}.") + else: + sc2_logger.warning(f"Archipelago mod could not be found at {modfile}.") + needs_files = True + + # Final verdict. + if needs_files: + sc2_logger.warning(f"Required files are missing. Run /download_data to acquire them.") + return False + else: + sc2_logger.debug(f"All map/mod files are properly installed.") + return True + + +class DllDirectory: + # Credit to Black Sliver for this code. + # More info: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectoryw + _old: typing.Optional[str] = None + _new: typing.Optional[str] = None + + def __init__(self, new: typing.Optional[str]): + self._new = new + + def __enter__(self): + old = self.get() + if self.set(self._new): + self._old = old + + def __exit__(self, *args): + if self._old is not None: + self.set(self._old) + + @staticmethod + def get() -> typing.Optional[str]: + if sys.platform == "win32": + n = ctypes.windll.kernel32.GetDllDirectoryW(0, None) + buf = ctypes.create_unicode_buffer(n) + ctypes.windll.kernel32.GetDllDirectoryW(n, buf) + return buf.value + # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific + return None + + @staticmethod + def set(s: typing.Optional[str]) -> bool: + if sys.platform == "win32": + return ctypes.windll.kernel32.SetDllDirectoryW(s) != 0 + # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific + return False + + +def download_latest_release_zip(owner: str, repo: str, api_version: str, metadata: str = None, force_download=False) -> (str, str): + """Downloads the latest release of a GitHub repo to the current directory as a .zip file.""" + import requests + + headers = {"Accept": 'application/vnd.github.v3+json'} + url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}" + + r1 = requests.get(url, headers=headers) + if r1.status_code == 200: + latest_metadata = str(r1.json()) + # sc2_logger.info(f"Latest version: {latest_metadata}.") + else: + sc2_logger.warning(f"Status code: {r1.status_code}") + sc2_logger.warning(f"Failed to reach GitHub. Could not find download link.") + sc2_logger.warning(f"text: {r1.text}") + return "", metadata + + if (force_download is False) and (metadata == latest_metadata): + sc2_logger.info("Latest version already installed.") + return "", metadata + + sc2_logger.info(f"Attempting to download latest version of API version {api_version} of {repo}.") + download_url = r1.json()["assets"][0]["browser_download_url"] + + r2 = requests.get(download_url, headers=headers) + if r2.status_code == 200 and zipfile.is_zipfile(io.BytesIO(r2.content)): + with open(f"{repo}.zip", "wb") as fh: + fh.write(r2.content) + sc2_logger.info(f"Successfully downloaded {repo}.zip.") + return f"{repo}.zip", latest_metadata + else: + sc2_logger.warning(f"Status code: {r2.status_code}") + sc2_logger.warning("Download failed.") + sc2_logger.warning(f"text: {r2.text}") + return "", metadata + + +def is_mod_update_available(owner: str, repo: str, api_version: str, metadata: str) -> bool: + import requests + + headers = {"Accept": 'application/vnd.github.v3+json'} + url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}" + + r1 = requests.get(url, headers=headers) + if r1.status_code == 200: + latest_metadata = str(r1.json()) + if metadata != latest_metadata: + return True + else: + return False + + else: + sc2_logger.warning(f"Failed to reach GitHub while checking for updates.") + sc2_logger.warning(f"Status code: {r1.status_code}") + sc2_logger.warning(f"text: {r1.text}") + return False + + +def launch(): + colorama.init() + asyncio.run(main()) + colorama.deinit() diff --git a/worlds/sc2wol/Items.py b/worlds/sc2wol/Items.py index ea495adf..971a7537 100644 --- a/worlds/sc2wol/Items.py +++ b/worlds/sc2wol/Items.py @@ -12,6 +12,7 @@ class ItemData(typing.NamedTuple): classification: ItemClassification = ItemClassification.useful quantity: int = 1 parent_item: str = None + origin: typing.Set[str] = {"wol"} class StarcraftWoLItem(Item): @@ -43,23 +44,36 @@ item_table = { "Ghost": ItemData(15 + SC2WOL_ITEM_ID_OFFSET, "Unit", 15, classification=ItemClassification.progression), "Spectre": ItemData(16 + SC2WOL_ITEM_ID_OFFSET, "Unit", 16, classification=ItemClassification.progression), "Thor": ItemData(17 + SC2WOL_ITEM_ID_OFFSET, "Unit", 17, classification=ItemClassification.progression), + # EE units + "Liberator": ItemData(18 + SC2WOL_ITEM_ID_OFFSET, "Unit", 18, classification=ItemClassification.progression, origin={"nco", "ext"}), + "Valkyrie": ItemData(19 + SC2WOL_ITEM_ID_OFFSET, "Unit", 19, classification=ItemClassification.progression, origin={"bw"}), + "Widow Mine": ItemData(20 + SC2WOL_ITEM_ID_OFFSET, "Unit", 20, classification=ItemClassification.progression, origin={"ext"}), + "Cyclone": ItemData(21 + SC2WOL_ITEM_ID_OFFSET, "Unit", 21, classification=ItemClassification.progression, origin={"ext"}), + # Some other items are moved to Upgrade group because of the way how the bot message is parsed "Progressive Infantry Weapon": ItemData(100 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, quantity=3), "Progressive Infantry Armor": ItemData(102 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, quantity=3), "Progressive Vehicle Weapon": ItemData(103 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, quantity=3), "Progressive Vehicle Armor": ItemData(104 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 6, quantity=3), "Progressive Ship Weapon": ItemData(105 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 8, quantity=3), "Progressive Ship Armor": ItemData(106 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 10, quantity=3), + # Upgrade bundle 'number' values are used as indices to get affected 'number's + "Progressive Weapon Upgrade": ItemData(107 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, quantity=3), + "Progressive Armor Upgrade": ItemData(108 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 1, quantity=3), + "Progressive Infantry Upgrade": ItemData(109 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, quantity=3), + "Progressive Vehicle Upgrade": ItemData(110 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 3, quantity=3), + "Progressive Ship Upgrade": ItemData(111 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, quantity=3), + "Progressive Weapon/Armor Upgrade": ItemData(112 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 5, quantity=3), "Projectile Accelerator (Bunker)": ItemData(200 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 0, parent_item="Bunker"), "Neosteel Bunker (Bunker)": ItemData(201 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 1, parent_item="Bunker"), "Titanium Housing (Missile Turret)": ItemData(202 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 2, classification=ItemClassification.filler, parent_item="Missile Turret"), "Hellstorm Batteries (Missile Turret)": ItemData(203 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 3, parent_item="Missile Turret"), - "Advanced Construction (SCV)": ItemData(204 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 4, parent_item="SCV"), - "Dual-Fusion Welders (SCV)": ItemData(205 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 5, parent_item="SCV"), + "Advanced Construction (SCV)": ItemData(204 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 4), + "Dual-Fusion Welders (SCV)": ItemData(205 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 5), "Fire-Suppression System (Building)": ItemData(206 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 6), "Orbital Command (Building)": ItemData(207 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 7), - "Stimpack (Marine)": ItemData(208 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 8, parent_item="Marine"), + "Progressive Stimpack (Marine)": ItemData(208 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 0, parent_item="Marine", quantity=2), "Combat Shield (Marine)": ItemData(209 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 9, classification=ItemClassification.progression, parent_item="Marine"), "Advanced Medic Facilities (Medic)": ItemData(210 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 10, classification=ItemClassification.filler, parent_item="Medic"), "Stabilizer Medpacks (Medic)": ItemData(211 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 11, classification=ItemClassification.progression, parent_item="Medic"), @@ -69,10 +83,59 @@ item_table = { "Kinetic Foam (Marauder)": ItemData(215 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 15, parent_item="Marauder"), "U-238 Rounds (Reaper)": ItemData(216 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 16, parent_item="Reaper"), "G-4 Clusterbomb (Reaper)": ItemData(217 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 17, classification=ItemClassification.progression, parent_item="Reaper"), + # Items from EE + "Mag-Field Accelerators (Cyclone)": ItemData(218 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 18, parent_item="Cyclone", origin={"ext"}), + "Mag-Field Launchers (Cyclone)": ItemData(219 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 19, parent_item="Cyclone", origin={"ext"}), + # Items from new mod + "Laser Targeting System (Marine)": ItemData(220 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 8, classification=ItemClassification.filler, parent_item="Marine", origin={"nco"}), # Freed slot from Stimpack + "Magrail Munitions (Marine)": ItemData(221 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 20, parent_item="Marine", origin={"nco"}), + "Optimized Logistics (Marine)": ItemData(222 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 21, classification=ItemClassification.filler, parent_item="Marine", origin={"nco"}), + "Restoration (Medic)": ItemData(223 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 22, classification=ItemClassification.filler, parent_item="Medic", origin={"bw"}), + "Optical Flare (Medic)": ItemData(224 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 23, classification=ItemClassification.filler, parent_item="Medic", origin={"bw"}), + "Optimized Logistics (Medic)": ItemData(225 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 24, classification=ItemClassification.filler, parent_item="Medic", origin={"bw"}), + "Progressive Stimpack (Firebat)": ItemData(226 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 6, parent_item="Firebat", quantity=2, origin={"bw"}), + "Optimized Logistics (Firebat)": ItemData(227 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 25, parent_item="Firebat", origin={"bw"}), + "Progressive Stimpack (Marauder)": ItemData(228 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 8, parent_item="Marauder", quantity=2, origin={"nco"}), + "Laser Targeting System (Marauder)": ItemData(229 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 26, classification=ItemClassification.filler, parent_item="Marauder", origin={"nco"}), + "Magrail Munitions (Marauder)": ItemData(230 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 27, classification=ItemClassification.filler, parent_item="Marauder", origin={"nco"}), + "Internal Tech Module (Marauder)": ItemData(231 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 28, classification=ItemClassification.filler, parent_item="Marauder", origin={"nco"}), + + # Items from new mod + "Progressive Stimpack (Reaper)": ItemData(250 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 10, parent_item="Reaper", quantity=2, origin={"nco"}), + "Laser Targeting System (Reaper)": ItemData(251 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 0, classification=ItemClassification.filler, parent_item="Reaper", origin={"nco"}), + "Advanced Cloaking Field (Reaper)": ItemData(252 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 1, parent_item="Reaper", origin={"nco"}), + "Spider Mines (Reaper)": ItemData(253 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 2, classification=ItemClassification.filler, parent_item="Reaper", origin={"nco"}), + "Combat Drugs (Reaper)": ItemData(254 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 3, classification=ItemClassification.filler, parent_item="Reaper", origin={"ext"}), + "Hellbat Aspect (Hellion)": ItemData(255 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 4, parent_item="Hellion", origin={"nco"}), + "Smart Servos (Hellion)": ItemData(256 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 5, parent_item="Hellion", origin={"nco"}), + "Optimized Logistics (Hellion)": ItemData(257 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 6, classification=ItemClassification.filler, parent_item="Hellion", origin={"nco"}), + "Jump Jets (Hellion)": ItemData(258 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 7, classification=ItemClassification.filler, parent_item="Hellion", origin={"nco"}), + "Progressive Stimpack (Hellion)": ItemData(259 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 12, parent_item="Hellion", quantity=2, origin={"nco"}), + "Ion Thrusters (Vulture)": ItemData(260 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 8, classification=ItemClassification.filler, parent_item="Vulture", origin={"bw"}), + "Auto Launchers (Vulture)": ItemData(261 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 9, parent_item="Vulture", origin={"bw"}), + "High Explosive Munition (Spider Mine)": ItemData(262 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 10, origin={"bw"}), + "Jump Jets (Goliath)": ItemData(263 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 11, classification=ItemClassification.filler, parent_item="Goliath", origin={"nco"}), + "Optimized Logistics (Goliath)": ItemData(264 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 12, classification=ItemClassification.filler, parent_item="Goliath", origin={"nco"}), + "Hyperfluxor (Diamondback)": ItemData(265 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 13, parent_item="Diamondback", origin={"ext"}), + "Burst Capacitors (Diamondback)": ItemData(266 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 14, classification=ItemClassification.filler, parent_item="Diamondback", origin={"ext"}), + "Optimized Logistics (Diamondback)": ItemData(267 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 15, parent_item="Diamondback", origin={"ext"}), + "Jump Jets (Siege Tank)": ItemData(268 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 16, parent_item="Siege Tank", origin={"nco"}), + "Spider Mines (Siege Tank)": ItemData(269 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 17, classification=ItemClassification.filler, parent_item="Siege Tank", origin={"nco"}), + "Smart Servos (Siege Tank)": ItemData(270 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 18, classification=ItemClassification.filler, parent_item="Siege Tank", origin={"nco"}), + "Graduating Range (Siege Tank)": ItemData(271 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 19, classification=ItemClassification.progression, parent_item="Siege Tank", origin={"ext"}), + "Laser Targeting System (Siege Tank)": ItemData(272 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 20, parent_item="Siege Tank", origin={"nco"}), + "Advanced Siege Tech (Siege Tank)": ItemData(273 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 21, parent_item="Siege Tank", origin={"ext"}), + "Internal Tech Module (Siege Tank)": ItemData(274 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 22, classification=ItemClassification.filler, parent_item="Siege Tank", origin={"nco"}), + "Optimized Logistics (Predator)": ItemData(275 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 23, classification=ItemClassification.filler, parent_item="Predator", origin={"ext"}), + "Expanded Hull (Medivac)": ItemData(276 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 24, classification=ItemClassification.filler, parent_item="Medivac", origin={"ext"}), + "Afterburners (Medivac)": ItemData(277 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 25, classification=ItemClassification.filler, parent_item="Medivac", origin={"ext"}), + "Advanced Laser Technology (Wraith)": ItemData(278 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 26, classification=ItemClassification.progression, parent_item="Wraith", origin={"ext"}), + "Smart Servos (Viking)": ItemData(279 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 27, parent_item="Viking", origin={"ext"}), + "Magrail Munitions (Viking)": ItemData(280 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 28, parent_item="Viking", origin={"ext"}), "Twin-Linked Flamethrower (Hellion)": ItemData(300 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 0, classification=ItemClassification.filler, parent_item="Hellion"), "Thermite Filaments (Hellion)": ItemData(301 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 1, parent_item="Hellion"), - "Cerberus Mine (Vulture)": ItemData(302 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 2, classification=ItemClassification.filler, parent_item="Vulture"), + "Cerberus Mine (Spider Mine)": ItemData(302 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 2, classification=ItemClassification.filler), "Replenishable Magazine (Vulture)": ItemData(303 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 3, classification=ItemClassification.filler, parent_item="Vulture"), "Multi-Lock Weapons System (Goliath)": ItemData(304 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 4, parent_item="Goliath"), "Ares-Class Targeting System (Goliath)": ItemData(305 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 5, parent_item="Goliath"), @@ -86,7 +149,7 @@ item_table = { "Displacement Field (Wraith)": ItemData(313 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 13, classification=ItemClassification.filler, parent_item="Wraith"), "Ripwave Missiles (Viking)": ItemData(314 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 14, parent_item="Viking"), "Phobos-Class Weapons System (Viking)": ItemData(315 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 15, parent_item="Viking"), - "Cross-Spectrum Dampeners (Banshee)": ItemData(316 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 16, classification=ItemClassification.filler, parent_item="Banshee"), + "Progressive Cross-Spectrum Dampeners (Banshee)": ItemData(316 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 2, classification=ItemClassification.filler, parent_item="Banshee", quantity=2), "Shockwave Missile Battery (Banshee)": ItemData(317 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 17, parent_item="Banshee"), "Missile Pods (Battlecruiser)": ItemData(318 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 18, classification=ItemClassification.filler, parent_item="Battlecruiser"), "Defensive Matrix (Battlecruiser)": ItemData(319 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 19, classification=ItemClassification.filler, parent_item="Battlecruiser"), @@ -96,6 +159,47 @@ item_table = { "Nyx-Class Cloaking Module (Spectre)": ItemData(323 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 23, parent_item="Spectre"), "330mm Barrage Cannon (Thor)": ItemData(324 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 24, classification=ItemClassification.filler, parent_item="Thor"), "Immortality Protocol (Thor)": ItemData(325 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 25, classification=ItemClassification.filler, parent_item="Thor"), + # Items from EE + "Advanced Ballistics (Liberator)": ItemData(326 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 26, parent_item="Liberator", origin={"ext"}), + "Raid Artillery (Liberator)": ItemData(327 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 27, classification=ItemClassification.progression, parent_item="Liberator", origin={"nco"}), + "Drilling Claws (Widow Mine)": ItemData(328 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 28, classification=ItemClassification.filler, parent_item="Widow Mine", origin={"ext"}), + "Concealment (Widow Mine)": ItemData(329 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 29, classification=ItemClassification.progression, parent_item="Widow Mine", origin={"ext"}), + + #Items from new mod + "Hyperflight Rotors (Banshee)": ItemData(350 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 0, classification=ItemClassification.filler, parent_item="Banshee", origin={"ext"}), + "Laser Targeting System (Banshee)": ItemData(351 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 1, classification=ItemClassification.filler, parent_item="Banshee", origin={"nco"}), + "Internal Tech Module (Banshee)": ItemData(352 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 2, classification=ItemClassification.filler, parent_item="Banshee", origin={"nco"}), + "Tactical Jump (Battlecruiser)": ItemData(353 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 3, parent_item="Battlecruiser", origin={"nco", "ext"}), + "Cloak (Battlecruiser)": ItemData(354 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 4, parent_item="Battlecruiser", origin={"nco"}), + "ATX Laser Battery (Battlecruiser)": ItemData(355 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 5, classification=ItemClassification.progression, parent_item="Battlecruiser", origin={"nco"}), + "Optimized Logistics (Battlecruiser)": ItemData(356 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 6, classification=ItemClassification.filler, parent_item="Battlecruiser", origin={"ext"}), + "Internal Tech Module (Battlecruiser)": ItemData(357 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 7, classification=ItemClassification.filler, parent_item="Battlecruiser", origin={"nco"}), + "EMP Rounds (Ghost)": ItemData(358 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 8, parent_item="Ghost", origin={"ext"}), + "Lockdown (Ghost)": ItemData(359 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 9, parent_item="Ghost", origin={"bw"}), + "Impaler Rounds (Spectre)": ItemData(360 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 10, parent_item="Spectre", origin={"ext"}), + "Progressive High Impact Payload (Thor)": ItemData(361 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 14, parent_item="Thor", quantity=2, origin={"ext"}), # L2 is Smart Servos + "Bio Mechanical Repair Drone (Raven)": ItemData(363 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 13, parent_item="Raven", origin={"nco"}), + "Spider Mines (Raven)": ItemData(364 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 14, parent_item="Raven", origin={"nco"}), + "Railgun Turret (Raven)": ItemData(365 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 15, parent_item="Raven", origin={"nco"}), + "Hunter-Seeker Weapon (Raven)": ItemData(366 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 16, parent_item="Raven", origin={"nco"}), + "Interference Matrix (Raven)": ItemData(367 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 17, parent_item="Raven", origin={"ext"}), + "Anti-Armor Missile (Raven)": ItemData(368 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 18, classification=ItemClassification.filler, parent_item="Raven", origin={"ext"}), + "Internal Tech Module (Raven)": ItemData(369 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 19, classification=ItemClassification.filler, parent_item="Raven", origin={"nco"}), + "EMP Shockwave (Science Vessel)": ItemData(370 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 20, parent_item="Science Vessel", origin={"bw"}), + "Defensive Matrix (Science Vessel)": ItemData(371 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 21, parent_item="Science Vessel", origin={"bw"}), + "Targeting Optics (Cyclone)": ItemData(372 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 22, parent_item="Cyclone", origin={"ext"}), + "Rapid Fire Launchers (Cyclone)": ItemData(373 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 23, parent_item="Cyclone", origin={"ext"}), + "Cloak (Liberator)": ItemData(374 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 24, classification=ItemClassification.filler, parent_item="Liberator", origin={"nco"}), + "Laser Targeting System (Liberator)": ItemData(375 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 25, classification=ItemClassification.filler, parent_item="Liberator", origin={"ext"}), + "Optimized Logistics (Liberator)": ItemData(376 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 26, classification=ItemClassification.filler, parent_item="Liberator", origin={"nco"}), + "Black Market Launchers (Widow Mine)": ItemData(377 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 27, classification=ItemClassification.filler, parent_item="Widow Mine", origin={"ext"}), + "Executioner Missiles (Widow Mine)": ItemData(378 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 28, parent_item="Widow Mine", origin={"ext"}), + + # Just lazy to create a new group for one unit + "Enhanced Cluster Launchers (Valkyrie)": ItemData(379 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 17, parent_item="Valkyrie", origin={"ext"}), + "Shaped Hull (Valkyrie)": ItemData(380 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 20, classification=ItemClassification.filler, parent_item="Valkyrie", origin={"ext"}), + "Burst Lasers (Valkyrie)": ItemData(381 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 21, parent_item="Valkyrie", origin={"ext"}), + "Afterburners (Valkyrie)": ItemData(382 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 22, classification=ItemClassification.filler, parent_item="Valkyrie", origin={"ext"}), "Bunker": ItemData(400 + SC2WOL_ITEM_ID_OFFSET, "Building", 0, classification=ItemClassification.progression), "Missile Turret": ItemData(401 + SC2WOL_ITEM_ID_OFFSET, "Building", 1, classification=ItemClassification.progression), @@ -120,14 +224,14 @@ item_table = { "Science Vessel": ItemData(607 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 7, classification=ItemClassification.progression), "Tech Reactor": ItemData(608 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 8), "Orbital Strike": ItemData(609 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 9), - "Shrike Turret": ItemData(610 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 10, parent_item="Bunker"), - "Fortified Bunker": ItemData(611 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 11, parent_item="Bunker"), + "Shrike Turret (Bunker)": ItemData(610 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 10, parent_item="Bunker"), + "Fortified Bunker (Bunker)": ItemData(611 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 11, parent_item="Bunker"), "Planetary Fortress": ItemData(612 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 12, classification=ItemClassification.progression), "Perdition Turret": ItemData(613 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 13, classification=ItemClassification.progression), "Predator": ItemData(614 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 14, classification=ItemClassification.filler), "Hercules": ItemData(615 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 15, classification=ItemClassification.progression), "Cellular Reactor": ItemData(616 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 16), - "Regenerative Bio-Steel": ItemData(617 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 17), + "Progressive Regenerative Bio-Steel": ItemData(617 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 4, quantity=2), "Hive Mind Emulator": ItemData(618 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 18, ItemClassification.progression), "Psi Disrupter": ItemData(619 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 19, classification=ItemClassification.progression), @@ -136,18 +240,24 @@ item_table = { "High Templar": ItemData(702 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 2, classification=ItemClassification.progression), "Dark Templar": ItemData(703 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 3, classification=ItemClassification.progression), "Immortal": ItemData(704 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 4, classification=ItemClassification.progression), - "Colossus": ItemData(705 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 5, classification=ItemClassification.progression), - "Phoenix": ItemData(706 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 6, classification=ItemClassification.progression), + "Colossus": ItemData(705 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 5), + "Phoenix": ItemData(706 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 6, classification=ItemClassification.filler), "Void Ray": ItemData(707 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 7, classification=ItemClassification.progression), "Carrier": ItemData(708 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 8, classification=ItemClassification.progression), + # Filler items to fill remaining spots "+15 Starting Minerals": ItemData(800 + SC2WOL_ITEM_ID_OFFSET, "Minerals", 15, quantity=0, classification=ItemClassification.filler), "+15 Starting Vespene": ItemData(801 + SC2WOL_ITEM_ID_OFFSET, "Vespene", 15, quantity=0, classification=ItemClassification.filler), + # This Filler item isn't placed by the generator yet unless plando'd "+2 Starting Supply": ItemData(802 + SC2WOL_ITEM_ID_OFFSET, "Supply", 2, quantity=0, classification=ItemClassification.filler), + # This item is used to "remove" location from the game. Never placed unless plando'd + "Nothing": ItemData(803 + SC2WOL_ITEM_ID_OFFSET, "Nothing Group", 2, quantity=0, classification=ItemClassification.trap), # "Keystone Piece": ItemData(850 + SC2WOL_ITEM_ID_OFFSET, "Goal", 0, quantity=0, classification=ItemClassification.progression_skip_balancing) } +def get_item_table(multiworld: MultiWorld, player: int): + return item_table basic_units = { 'Marine', @@ -172,10 +282,49 @@ def get_basic_units(multiworld: MultiWorld, player: int) -> typing.Set[str]: item_name_groups = {} -for item, data in item_table.items(): +for item, data in get_full_item_list().items(): item_name_groups.setdefault(data.type, []).append(item) + if data.type in ("Armory 1", "Armory 2") and '(' in item: + short_name = item[:item.find(' (')] + item_name_groups[short_name] = [item] item_name_groups["Missions"] = ["Beat " + mission_name for mission_name in vanilla_mission_req_table] + +# Items that can be placed before resources if not already in +# General upgrades and Mercs +second_pass_placeable_items: typing.Tuple[str, ...] = ( + # Buildings without upgrades + "Sensor Tower", + "Hive Mind Emulator", + "Psi Disrupter", + "Perdition Turret", + # General upgrades without any dependencies + "Advanced Construction (SCV)", + "Dual-Fusion Welders (SCV)", + "Fire-Suppression System (Building)", + "Orbital Command (Building)", + "Ultra-Capacitors", + "Vanadium Plating", + "Orbital Depots", + "Micro-Filtering", + "Automated Refinery", + "Command Center Reactor", + "Tech Reactor", + "Planetary Fortress", + "Cellular Reactor", + "Progressive Regenerative Bio-Steel", # Place only L1 + # Mercenaries + "War Pigs", + "Devil Dogs", + "Hammer Securities", + "Spartan Company", + "Siege Breakers", + "Hel's Angel", + "Dusk Wings", + "Jackson's Revenge" +) + + filler_items: typing.Tuple[str, ...] = ( '+15 Starting Minerals', '+15 Starting Vespene' @@ -190,7 +339,10 @@ defense_ratings = { # Bunker w/ Marine/Marauder: 3, "Perdition Turret": 2, "Missile Turret": 2, - "Vulture": 2 + "Vulture": 2, + "Liberator": 2, + "Widow Mine": 2 + # "Concealment (Widow Mine)": 1 } zerg_defense_ratings = { "Perdition Turret": 2, @@ -199,14 +351,61 @@ zerg_defense_ratings = { "Psi Disruptor": 3 } +spider_mine_sources = { + "Vulture", + "Spider Mines (Reaper)", + "Spider Mines (Siege Tank)", + "Spider Mines (Raven)" +} + +progressive_if_nco = { + "Progressive Stimpack (Marine)", + "Progressive Stimpack (Firebat)", + "Progressive Cross-Spectrum Dampeners (Banshee)", + "Progressive Regenerative Bio-Steel" +} + +# 'number' values of upgrades for upgrade bundle items +upgrade_numbers = [ + {0, 4, 8}, # Weapon + {2, 6, 10}, # Armor + {0, 2}, # Infantry + {4, 6}, # Vehicle + {8, 10}, # Starship + {0, 2, 4, 6, 8, 10} # All +] +# Names of upgrades to be included for different options +upgrade_included_names = [ + { # Individual Items + "Progressive Infantry Weapon", + "Progressive Infantry Armor", + "Progressive Vehicle Weapon", + "Progressive Vehicle Armor", + "Progressive Ship Weapon", + "Progressive Ship Armor" + }, + { # Bundle Weapon And Armor + "Progressive Weapon Upgrade", + "Progressive Armor Upgrade" + }, + { # Bundle Unit Class + "Progressive Infantry Upgrade", + "Progressive Vehicle Upgrade", + "Progressive Starship Upgrade" + }, + { # Bundle All + "Progressive Weapon/Armor Upgrade" + } +] + 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} # Map type to expected int type_flaggroups: typing.Dict[str, int] = { "Unit": 0, - "Upgrade": 1, - "Armory 1": 2, - "Armory 2": 3, + "Upgrade": 1, # Weapon / Armor upgrades + "Armory 1": 2, # Unit upgrades + "Armory 2": 3, # Unit upgrades "Building": 4, "Mercenary": 5, "Laboratory": 6, @@ -214,5 +413,9 @@ type_flaggroups: typing.Dict[str, int] = { "Minerals": 8, "Vespene": 9, "Supply": 10, - "Goal": 11 + "Goal": 11, + "Armory 3": 12, # Unit upgrades + "Armory 4": 13, # Unit upgrades + "Progressive Upgrade": 14, # Unit upgrades that exist multiple times (Stimpack / Super Stimpack) + "Nothing Group": 15 } diff --git a/worlds/sc2wol/Locations.py b/worlds/sc2wol/Locations.py index e91068c4..ae31fa8e 100644 --- a/worlds/sc2wol/Locations.py +++ b/worlds/sc2wol/Locations.py @@ -1,3 +1,4 @@ +from enum import IntEnum from typing import List, Tuple, Optional, Callable, NamedTuple from BaseClasses import MultiWorld from .Options import get_option_value @@ -11,10 +12,18 @@ class SC2WoLLocation(Location): game: str = "Starcraft2WoL" +class LocationType(IntEnum): + VICTORY = 0 # Winning a mission + MISSION_PROGRESS = 1 # All tasks done for progressing the mission normally towards victory. All cleaning of expansion bases falls here + BONUS = 2 # Bonus objective, getting a campaign or mission bonus in vanilla (credits, research, bonus units or resources) + CHALLENGE = 3 # Challenging objectives, often harder than just completing a mission + OPTIONAL_BOSS = 4 # Any boss that's not required to win the mission. All Brutalisks, Loki, etc. + class LocationData(NamedTuple): region: str name: str code: Optional[int] + type: LocationType rule: Callable = lambda state: True @@ -22,256 +31,473 @@ def get_locations(multiworld: Optional[MultiWorld], player: Optional[int]) -> Tu # Note: rules which are ended with or True are rules identified as needed later when restricted units is an option logic_level = get_option_value(multiworld, player, 'required_tactics') location_table: List[LocationData] = [ - LocationData("Liberation Day", "Liberation Day: Victory", SC2WOL_LOC_ID_OFFSET + 100), - LocationData("Liberation Day", "Liberation Day: First Statue", SC2WOL_LOC_ID_OFFSET + 101), - LocationData("Liberation Day", "Liberation Day: Second Statue", SC2WOL_LOC_ID_OFFSET + 102), - LocationData("Liberation Day", "Liberation Day: Third Statue", SC2WOL_LOC_ID_OFFSET + 103), - LocationData("Liberation Day", "Liberation Day: Fourth Statue", SC2WOL_LOC_ID_OFFSET + 104), - LocationData("Liberation Day", "Liberation Day: Fifth Statue", SC2WOL_LOC_ID_OFFSET + 105), - LocationData("Liberation Day", "Liberation Day: Sixth Statue", SC2WOL_LOC_ID_OFFSET + 106), - LocationData("The Outlaws", "The Outlaws: Victory", SC2WOL_LOC_ID_OFFSET + 200, + LocationData("Liberation Day", "Liberation Day: Victory", SC2WOL_LOC_ID_OFFSET + 100, LocationType.VICTORY), + LocationData("Liberation Day", "Liberation Day: First Statue", SC2WOL_LOC_ID_OFFSET + 101, LocationType.BONUS), + LocationData("Liberation Day", "Liberation Day: Second Statue", SC2WOL_LOC_ID_OFFSET + 102, LocationType.BONUS), + LocationData("Liberation Day", "Liberation Day: Third Statue", SC2WOL_LOC_ID_OFFSET + 103, LocationType.BONUS), + LocationData("Liberation Day", "Liberation Day: Fourth Statue", SC2WOL_LOC_ID_OFFSET + 104, LocationType.BONUS), + LocationData("Liberation Day", "Liberation Day: Fifth Statue", SC2WOL_LOC_ID_OFFSET + 105, LocationType.BONUS), + LocationData("Liberation Day", "Liberation Day: Sixth Statue", SC2WOL_LOC_ID_OFFSET + 106, LocationType.BONUS), + LocationData("Liberation Day", "Liberation Day: Special Delivery", SC2WOL_LOC_ID_OFFSET + 107, LocationType.MISSION_PROGRESS), + LocationData("The Outlaws", "The Outlaws: Victory", SC2WOL_LOC_ID_OFFSET + 200, LocationType.VICTORY, lambda state: state._sc2wol_has_common_unit(multiworld, player)), - LocationData("The Outlaws", "The Outlaws: Rebel Base", SC2WOL_LOC_ID_OFFSET + 201, + LocationData("The Outlaws", "The Outlaws: Rebel Base", SC2WOL_LOC_ID_OFFSET + 201, LocationType.BONUS, lambda state: state._sc2wol_has_common_unit(multiworld, player)), - LocationData("Zero Hour", "Zero Hour: Victory", SC2WOL_LOC_ID_OFFSET + 300, + LocationData("The Outlaws", "The Outlaws: North Resource Pickups", SC2WOL_LOC_ID_OFFSET + 202, LocationType.BONUS), + LocationData("The Outlaws", "The Outlaws: Bunker", SC2WOL_LOC_ID_OFFSET + 203, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_common_unit(multiworld, player)), + LocationData("Zero Hour", "Zero Hour: Victory", SC2WOL_LOC_ID_OFFSET + 300, LocationType.VICTORY, lambda state: state._sc2wol_has_common_unit(multiworld, player) and state._sc2wol_defense_rating(multiworld, player, True) >= 2 and (logic_level > 0 or state._sc2wol_has_anti_air(multiworld, player))), - LocationData("Zero Hour", "Zero Hour: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 301), - LocationData("Zero Hour", "Zero Hour: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 302, + LocationData("Zero Hour", "Zero Hour: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 301, LocationType.BONUS), + LocationData("Zero Hour", "Zero Hour: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 302, LocationType.BONUS, lambda state: state._sc2wol_has_common_unit(multiworld, player)), - LocationData("Zero Hour", "Zero Hour: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 303, + LocationData("Zero Hour", "Zero Hour: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 303, LocationType.BONUS, lambda state: state._sc2wol_has_common_unit(multiworld, player) and state._sc2wol_defense_rating(multiworld, player, True) >= 2), - LocationData("Evacuation", "Evacuation: Victory", SC2WOL_LOC_ID_OFFSET + 400, + LocationData("Zero Hour", "Zero Hour: First Hatchery", SC2WOL_LOC_ID_OFFSET + 304, LocationType.CHALLENGE, + lambda state: state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Zero Hour", "Zero Hour: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 305, LocationType.CHALLENGE, + lambda state: state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Zero Hour", "Zero Hour: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 306, LocationType.CHALLENGE, + lambda state: state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Zero Hour", "Zero Hour: Fourth Hatchery", SC2WOL_LOC_ID_OFFSET + 307, LocationType.CHALLENGE, + lambda state: state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Evacuation", "Evacuation: Victory", SC2WOL_LOC_ID_OFFSET + 400, LocationType.VICTORY, lambda state: state._sc2wol_has_common_unit(multiworld, player) and (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player) or state._sc2wol_has_competent_anti_air(multiworld, player))), - LocationData("Evacuation", "Evacuation: First Chysalis", SC2WOL_LOC_ID_OFFSET + 401), - LocationData("Evacuation", "Evacuation: Second Chysalis", SC2WOL_LOC_ID_OFFSET + 402, + LocationData("Evacuation", "Evacuation: First Chrysalis", SC2WOL_LOC_ID_OFFSET + 401, LocationType.BONUS), + LocationData("Evacuation", "Evacuation: Second Chrysalis", SC2WOL_LOC_ID_OFFSET + 402, LocationType.BONUS, lambda state: state._sc2wol_has_common_unit(multiworld, player)), - LocationData("Evacuation", "Evacuation: Third Chysalis", SC2WOL_LOC_ID_OFFSET + 403, + LocationData("Evacuation", "Evacuation: Third Chrysalis", SC2WOL_LOC_ID_OFFSET + 403, LocationType.BONUS, lambda state: state._sc2wol_has_common_unit(multiworld, player)), - LocationData("Outbreak", "Outbreak: Victory", SC2WOL_LOC_ID_OFFSET + 500, + LocationData("Evacuation", "Evacuation: Reach Hanson", SC2WOL_LOC_ID_OFFSET + 404, LocationType.MISSION_PROGRESS), + LocationData("Evacuation", "Evacuation: Secret Resource Stash", SC2WOL_LOC_ID_OFFSET + 405, LocationType.BONUS), + LocationData("Evacuation", "Evacuation: Flawless", SC2WOL_LOC_ID_OFFSET + 406, LocationType.CHALLENGE, + lambda state: state._sc2wol_has_common_unit(multiworld, player) and + state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and + (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player) + or state._sc2wol_has_competent_anti_air(multiworld, player))), + LocationData("Outbreak", "Outbreak: Victory", SC2WOL_LOC_ID_OFFSET + 500, LocationType.VICTORY, lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 4 and (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), - LocationData("Outbreak", "Outbreak: Left Infestor", SC2WOL_LOC_ID_OFFSET + 501, + LocationData("Outbreak", "Outbreak: Left Infestor", SC2WOL_LOC_ID_OFFSET + 501, LocationType.BONUS, lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), - LocationData("Outbreak", "Outbreak: Right Infestor", SC2WOL_LOC_ID_OFFSET + 502, + LocationData("Outbreak", "Outbreak: Right Infestor", SC2WOL_LOC_ID_OFFSET + 502, LocationType.BONUS, lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), - LocationData("Safe Haven", "Safe Haven: Victory", SC2WOL_LOC_ID_OFFSET + 600, + LocationData("Outbreak", "Outbreak: North Infested Command Center", SC2WOL_LOC_ID_OFFSET + 503, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and + (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), + LocationData("Outbreak", "Outbreak: South Infested Command Center", SC2WOL_LOC_ID_OFFSET + 504, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and + (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), + LocationData("Outbreak", "Outbreak: Northwest Bar", SC2WOL_LOC_ID_OFFSET + 505, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and + (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), + LocationData("Outbreak", "Outbreak: North Bar", SC2WOL_LOC_ID_OFFSET + 506, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and + (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), + LocationData("Outbreak", "Outbreak: South Bar", SC2WOL_LOC_ID_OFFSET + 507, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_defense_rating(multiworld, player, True, False) >= 2 and + (state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), + LocationData("Safe Haven", "Safe Haven: Victory", SC2WOL_LOC_ID_OFFSET + 600, LocationType.VICTORY, lambda state: state._sc2wol_has_common_unit(multiworld, player) and state._sc2wol_has_competent_anti_air(multiworld, player)), - LocationData("Safe Haven", "Safe Haven: North Nexus", SC2WOL_LOC_ID_OFFSET + 601, + LocationData("Safe Haven", "Safe Haven: North Nexus", SC2WOL_LOC_ID_OFFSET + 601, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_common_unit(multiworld, player) and state._sc2wol_has_competent_anti_air(multiworld, player)), - LocationData("Safe Haven", "Safe Haven: East Nexus", SC2WOL_LOC_ID_OFFSET + 602, + LocationData("Safe Haven", "Safe Haven: East Nexus", SC2WOL_LOC_ID_OFFSET + 602, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_common_unit(multiworld, player) and state._sc2wol_has_competent_anti_air(multiworld, player)), - LocationData("Safe Haven", "Safe Haven: South Nexus", SC2WOL_LOC_ID_OFFSET + 603, + LocationData("Safe Haven", "Safe Haven: South Nexus", SC2WOL_LOC_ID_OFFSET + 603, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_common_unit(multiworld, player) and state._sc2wol_has_competent_anti_air(multiworld, player)), - LocationData("Haven's Fall", "Haven's Fall: Victory", SC2WOL_LOC_ID_OFFSET + 700, + LocationData("Safe Haven", "Safe Haven: First Terror Fleet", SC2WOL_LOC_ID_OFFSET + 604, LocationType.BONUS, + lambda state: state._sc2wol_has_common_unit(multiworld, player) and + state._sc2wol_has_competent_anti_air(multiworld, player)), + LocationData("Safe Haven", "Safe Haven: Second Terror Fleet", SC2WOL_LOC_ID_OFFSET + 605, LocationType.BONUS, + lambda state: state._sc2wol_has_common_unit(multiworld, player) and + state._sc2wol_has_competent_anti_air(multiworld, player)), + LocationData("Safe Haven", "Safe Haven: Third Terror Fleet", SC2WOL_LOC_ID_OFFSET + 606, LocationType.BONUS, + lambda state: state._sc2wol_has_common_unit(multiworld, player) and + state._sc2wol_has_competent_anti_air(multiworld, player)), + LocationData("Haven's Fall", "Haven's Fall: Victory", SC2WOL_LOC_ID_OFFSET + 700, LocationType.VICTORY, lambda state: state._sc2wol_has_common_unit(multiworld, player) and state._sc2wol_has_competent_anti_air(multiworld, player) and state._sc2wol_defense_rating(multiworld, player, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: North Hive", SC2WOL_LOC_ID_OFFSET + 701, + LocationData("Haven's Fall", "Haven's Fall: North Hive", SC2WOL_LOC_ID_OFFSET + 701, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_common_unit(multiworld, player) and state._sc2wol_has_competent_anti_air(multiworld, player) and state._sc2wol_defense_rating(multiworld, player, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: East Hive", SC2WOL_LOC_ID_OFFSET + 702, + LocationData("Haven's Fall", "Haven's Fall: East Hive", SC2WOL_LOC_ID_OFFSET + 702, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_common_unit(multiworld, player) and state._sc2wol_has_competent_anti_air(multiworld, player) and state._sc2wol_defense_rating(multiworld, player, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: South Hive", SC2WOL_LOC_ID_OFFSET + 703, + LocationData("Haven's Fall", "Haven's Fall: South Hive", SC2WOL_LOC_ID_OFFSET + 703, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_common_unit(multiworld, player) and state._sc2wol_has_competent_anti_air(multiworld, player) and state._sc2wol_defense_rating(multiworld, player, True) >= 3), - LocationData("Smash and Grab", "Smash and Grab: Victory", SC2WOL_LOC_ID_OFFSET + 800, + LocationData("Haven's Fall", "Haven's Fall: Northeast Colony Base", SC2WOL_LOC_ID_OFFSET + 704, LocationType.CHALLENGE, + lambda state: state._sc2wol_can_respond_to_colony_infestations), + LocationData("Haven's Fall", "Haven's Fall: East Colony Base", SC2WOL_LOC_ID_OFFSET + 705, LocationType.CHALLENGE, + lambda state: state._sc2wol_can_respond_to_colony_infestations), + LocationData("Haven's Fall", "Haven's Fall: Middle Colony Base", SC2WOL_LOC_ID_OFFSET + 706, LocationType.CHALLENGE, + lambda state: state._sc2wol_can_respond_to_colony_infestations), + LocationData("Haven's Fall", "Haven's Fall: Southeast Colony Base", SC2WOL_LOC_ID_OFFSET + 707, LocationType.CHALLENGE, + lambda state: state._sc2wol_can_respond_to_colony_infestations), + LocationData("Haven's Fall", "Haven's Fall: Southwest Colony Base", SC2WOL_LOC_ID_OFFSET + 708, LocationType.CHALLENGE, + lambda state: state._sc2wol_can_respond_to_colony_infestations), + LocationData("Smash and Grab", "Smash and Grab: Victory", SC2WOL_LOC_ID_OFFSET + 800, LocationType.VICTORY, lambda state: state._sc2wol_has_common_unit(multiworld, player) and (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player) or state._sc2wol_has_competent_anti_air(multiworld, player))), - LocationData("Smash and Grab", "Smash and Grab: First Relic", SC2WOL_LOC_ID_OFFSET + 801), - LocationData("Smash and Grab", "Smash and Grab: Second Relic", SC2WOL_LOC_ID_OFFSET + 802), - LocationData("Smash and Grab", "Smash and Grab: Third Relic", SC2WOL_LOC_ID_OFFSET + 803, + LocationData("Smash and Grab", "Smash and Grab: First Relic", SC2WOL_LOC_ID_OFFSET + 801, LocationType.BONUS), + LocationData("Smash and Grab", "Smash and Grab: Second Relic", SC2WOL_LOC_ID_OFFSET + 802, LocationType.BONUS), + LocationData("Smash and Grab", "Smash and Grab: Third Relic", SC2WOL_LOC_ID_OFFSET + 803, LocationType.BONUS, lambda state: state._sc2wol_has_common_unit(multiworld, player) and (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player) or state._sc2wol_has_competent_anti_air(multiworld, player))), - LocationData("Smash and Grab", "Smash and Grab: Fourth Relic", SC2WOL_LOC_ID_OFFSET + 804, + LocationData("Smash and Grab", "Smash and Grab: Fourth Relic", SC2WOL_LOC_ID_OFFSET + 804, LocationType.BONUS, lambda state: state._sc2wol_has_common_unit(multiworld, player) and (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player) or state._sc2wol_has_competent_anti_air(multiworld, player))), - LocationData("The Dig", "The Dig: Victory", SC2WOL_LOC_ID_OFFSET + 900, + LocationData("Smash and Grab", "Smash and Grab: First Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 805, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_common_unit(multiworld, player) and + (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player) + or state._sc2wol_has_competent_anti_air(multiworld, player))), + LocationData("Smash and Grab", "Smash and Grab: Second Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 806, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_common_unit(multiworld, player) and + (logic_level > 0 and state._sc2wol_has_anti_air(multiworld, player) + or state._sc2wol_has_competent_anti_air(multiworld, player))), + LocationData("The Dig", "The Dig: Victory", SC2WOL_LOC_ID_OFFSET + 900, LocationType.VICTORY, lambda state: state._sc2wol_has_anti_air(multiworld, player) and state._sc2wol_defense_rating(multiworld, player, False) >= 7), - LocationData("The Dig", "The Dig: Left Relic", SC2WOL_LOC_ID_OFFSET + 901, + LocationData("The Dig", "The Dig: Left Relic", SC2WOL_LOC_ID_OFFSET + 901, LocationType.BONUS, lambda state: state._sc2wol_defense_rating(multiworld, player, False) >= 5), - LocationData("The Dig", "The Dig: Right Ground Relic", SC2WOL_LOC_ID_OFFSET + 902, + LocationData("The Dig", "The Dig: Right Ground Relic", SC2WOL_LOC_ID_OFFSET + 902, LocationType.BONUS, lambda state: state._sc2wol_defense_rating(multiworld, player, False) >= 5), - LocationData("The Dig", "The Dig: Right Cliff Relic", SC2WOL_LOC_ID_OFFSET + 903, + LocationData("The Dig", "The Dig: Right Cliff Relic", SC2WOL_LOC_ID_OFFSET + 903, LocationType.BONUS, lambda state: state._sc2wol_defense_rating(multiworld, player, False) >= 5), - LocationData("The Moebius Factor", "The Moebius Factor: Victory", SC2WOL_LOC_ID_OFFSET + 1000, + LocationData("The Dig", "The Dig: Moebius Base", SC2WOL_LOC_ID_OFFSET + 904, LocationType.MISSION_PROGRESS), + LocationData("The Moebius Factor", "The Moebius Factor: Victory", SC2WOL_LOC_ID_OFFSET + 1000, LocationType.VICTORY, lambda state: state._sc2wol_has_anti_air(multiworld, player) and (state._sc2wol_has_air(multiworld, player) or state.has_any({'Medivac', 'Hercules'}, player) and state._sc2wol_has_common_unit(multiworld, player))), - LocationData("The Moebius Factor", "The Moebius Factor: South Rescue", SC2WOL_LOC_ID_OFFSET + 1003, + LocationData("The Moebius Factor", "The Moebius Factor: 1st Data Core", SC2WOL_LOC_ID_OFFSET + 1001, LocationType.MISSION_PROGRESS), + LocationData("The Moebius Factor", "The Moebius Factor: 2nd Data Core", SC2WOL_LOC_ID_OFFSET + 1002, LocationType.MISSION_PROGRESS, + lambda state: (state._sc2wol_has_air(multiworld, player) + or state.has_any({'Medivac', 'Hercules'}, player) + and state._sc2wol_has_common_unit(multiworld, player))), + LocationData("The Moebius Factor", "The Moebius Factor: South Rescue", SC2WOL_LOC_ID_OFFSET + 1003, LocationType.BONUS, lambda state: state._sc2wol_able_to_rescue(multiworld, player)), - LocationData("The Moebius Factor", "The Moebius Factor: Wall Rescue", SC2WOL_LOC_ID_OFFSET + 1004, + LocationData("The Moebius Factor", "The Moebius Factor: Wall Rescue", SC2WOL_LOC_ID_OFFSET + 1004, LocationType.BONUS, lambda state: state._sc2wol_able_to_rescue(multiworld, player)), - LocationData("The Moebius Factor", "The Moebius Factor: Mid Rescue", SC2WOL_LOC_ID_OFFSET + 1005, + LocationData("The Moebius Factor", "The Moebius Factor: Mid Rescue", SC2WOL_LOC_ID_OFFSET + 1005, LocationType.BONUS, lambda state: state._sc2wol_able_to_rescue(multiworld, player)), - LocationData("The Moebius Factor", "The Moebius Factor: Nydus Roof Rescue", SC2WOL_LOC_ID_OFFSET + 1006, + LocationData("The Moebius Factor", "The Moebius Factor: Nydus Roof Rescue", SC2WOL_LOC_ID_OFFSET + 1006, LocationType.BONUS, lambda state: state._sc2wol_able_to_rescue(multiworld, player)), - LocationData("The Moebius Factor", "The Moebius Factor: Alive Inside Rescue", SC2WOL_LOC_ID_OFFSET + 1007, + LocationData("The Moebius Factor", "The Moebius Factor: Alive Inside Rescue", SC2WOL_LOC_ID_OFFSET + 1007, LocationType.BONUS, lambda state: state._sc2wol_able_to_rescue(multiworld, player)), - LocationData("The Moebius Factor", "The Moebius Factor: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1008, + LocationData("The Moebius Factor", "The Moebius Factor: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1008, LocationType.OPTIONAL_BOSS, lambda state: state._sc2wol_has_anti_air(multiworld, player) and (state._sc2wol_has_air(multiworld, player) or state.has_any({'Medivac', 'Hercules'}, player) and state._sc2wol_has_common_unit(multiworld, player))), - LocationData("Supernova", "Supernova: Victory", SC2WOL_LOC_ID_OFFSET + 1100, + LocationData("The Moebius Factor", "The Moebius Factor: 3rd Data Core", SC2WOL_LOC_ID_OFFSET + 1009, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_anti_air(multiworld, player) and + (state._sc2wol_has_air(multiworld, player) + or state.has_any({'Medivac', 'Hercules'}, player) + and state._sc2wol_has_common_unit(multiworld, player))), + LocationData("Supernova", "Supernova: Victory", SC2WOL_LOC_ID_OFFSET + 1100, LocationType.VICTORY, lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)), - LocationData("Supernova", "Supernova: West Relic", SC2WOL_LOC_ID_OFFSET + 1101), - LocationData("Supernova", "Supernova: North Relic", SC2WOL_LOC_ID_OFFSET + 1102), - LocationData("Supernova", "Supernova: South Relic", SC2WOL_LOC_ID_OFFSET + 1103, + LocationData("Supernova", "Supernova: West Relic", SC2WOL_LOC_ID_OFFSET + 1101, LocationType.BONUS), + LocationData("Supernova", "Supernova: North Relic", SC2WOL_LOC_ID_OFFSET + 1102, LocationType.BONUS), + LocationData("Supernova", "Supernova: South Relic", SC2WOL_LOC_ID_OFFSET + 1103, LocationType.BONUS, lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)), - LocationData("Supernova", "Supernova: East Relic", SC2WOL_LOC_ID_OFFSET + 1104, + LocationData("Supernova", "Supernova: East Relic", SC2WOL_LOC_ID_OFFSET + 1104, LocationType.BONUS, lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)), - LocationData("Maw of the Void", "Maw of the Void: Victory", SC2WOL_LOC_ID_OFFSET + 1200, + LocationData("Supernova", "Supernova: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1105, LocationType.MISSION_PROGRESS), + LocationData("Supernova", "Supernova: Middle Base", SC2WOL_LOC_ID_OFFSET + 1106, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)), + LocationData("Supernova", "Supernova: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1107, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_beats_protoss_deathball(multiworld, player)), + LocationData("Maw of the Void", "Maw of the Void: Victory", SC2WOL_LOC_ID_OFFSET + 1200, LocationType.VICTORY, lambda state: state._sc2wol_survives_rip_field(multiworld, player)), - LocationData("Maw of the Void", "Maw of the Void: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1201), - LocationData("Maw of the Void", "Maw of the Void: Expansion Prisoners", SC2WOL_LOC_ID_OFFSET + 1202, + LocationData("Maw of the Void", "Maw of the Void: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1201, LocationType.MISSION_PROGRESS), + LocationData("Maw of the Void", "Maw of the Void: Expansion Prisoners", SC2WOL_LOC_ID_OFFSET + 1202, LocationType.BONUS, lambda state: logic_level > 0 or state._sc2wol_survives_rip_field(multiworld, player)), - LocationData("Maw of the Void", "Maw of the Void: South Close Prisoners", SC2WOL_LOC_ID_OFFSET + 1203, + LocationData("Maw of the Void", "Maw of the Void: South Close Prisoners", SC2WOL_LOC_ID_OFFSET + 1203, LocationType.BONUS, lambda state: logic_level > 0 or state._sc2wol_survives_rip_field(multiworld, player)), - LocationData("Maw of the Void", "Maw of the Void: South Far Prisoners", SC2WOL_LOC_ID_OFFSET + 1204, + LocationData("Maw of the Void", "Maw of the Void: South Far Prisoners", SC2WOL_LOC_ID_OFFSET + 1204, LocationType.BONUS, lambda state: state._sc2wol_survives_rip_field(multiworld, player)), - LocationData("Maw of the Void", "Maw of the Void: North Prisoners", SC2WOL_LOC_ID_OFFSET + 1205, + LocationData("Maw of the Void", "Maw of the Void: North Prisoners", SC2WOL_LOC_ID_OFFSET + 1205, LocationType.BONUS, lambda state: state._sc2wol_survives_rip_field(multiworld, player)), - LocationData("Devil's Playground", "Devil's Playground: Victory", SC2WOL_LOC_ID_OFFSET + 1300, + LocationData("Maw of the Void", "Maw of the Void: Mothership", SC2WOL_LOC_ID_OFFSET + 1206, LocationType.OPTIONAL_BOSS, + lambda state: state._sc2wol_survives_rip_field(multiworld, player)), + LocationData("Maw of the Void", "Maw of the Void: Expansion Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1207, LocationType.MISSION_PROGRESS, + lambda state: logic_level > 0 or state._sc2wol_survives_rip_field(multiworld, player)), + LocationData("Maw of the Void", "Maw of the Void: Middle Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1208, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_survives_rip_field(multiworld, player)), + LocationData("Maw of the Void", "Maw of the Void: Southeast Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1209, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_survives_rip_field(multiworld, player)), + LocationData("Maw of the Void", "Maw of the Void: Stargate Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1210, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_survives_rip_field(multiworld, player)), + LocationData("Maw of the Void", "Maw of the Void: Northwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1211, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_survives_rip_field(multiworld, player)), + LocationData("Maw of the Void", "Maw of the Void: West Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1212, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_survives_rip_field(multiworld, player)), + LocationData("Maw of the Void", "Maw of the Void: Southwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1213, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_survives_rip_field(multiworld, player)), + LocationData("Devil's Playground", "Devil's Playground: Victory", SC2WOL_LOC_ID_OFFSET + 1300, LocationType.VICTORY, lambda state: logic_level > 0 or state._sc2wol_has_anti_air(multiworld, player) and ( state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), - LocationData("Devil's Playground", "Devil's Playground: Tosh's Miners", SC2WOL_LOC_ID_OFFSET + 1301), - LocationData("Devil's Playground", "Devil's Playground: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1302, + LocationData("Devil's Playground", "Devil's Playground: Tosh's Miners", SC2WOL_LOC_ID_OFFSET + 1301, LocationType.BONUS), + LocationData("Devil's Playground", "Devil's Playground: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1302, LocationType.OPTIONAL_BOSS, lambda state: logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Victory", SC2WOL_LOC_ID_OFFSET + 1400, - lambda state: state._sc2wol_has_common_unit(multiworld, player) and - state._sc2wol_has_competent_anti_air(multiworld, player)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Close Relic", SC2WOL_LOC_ID_OFFSET + 1401), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: West Relic", SC2WOL_LOC_ID_OFFSET + 1402, - lambda state: state._sc2wol_has_common_unit(multiworld, player) and - state._sc2wol_has_competent_anti_air(multiworld, player)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: North-East Relic", SC2WOL_LOC_ID_OFFSET + 1403, - lambda state: state._sc2wol_has_common_unit(multiworld, player) and - state._sc2wol_has_competent_anti_air(multiworld, player)), - LocationData("Breakout", "Breakout: Victory", SC2WOL_LOC_ID_OFFSET + 1500), - LocationData("Breakout", "Breakout: Diamondback Prison", SC2WOL_LOC_ID_OFFSET + 1501), - LocationData("Breakout", "Breakout: Siegetank Prison", SC2WOL_LOC_ID_OFFSET + 1502), - LocationData("Ghost of a Chance", "Ghost of a Chance: Victory", SC2WOL_LOC_ID_OFFSET + 1600), - LocationData("Ghost of a Chance", "Ghost of a Chance: Terrazine Tank", SC2WOL_LOC_ID_OFFSET + 1601), - LocationData("Ghost of a Chance", "Ghost of a Chance: Jorium Stockpile", SC2WOL_LOC_ID_OFFSET + 1602), - LocationData("Ghost of a Chance", "Ghost of a Chance: First Island Spectres", SC2WOL_LOC_ID_OFFSET + 1603), - LocationData("Ghost of a Chance", "Ghost of a Chance: Second Island Spectres", SC2WOL_LOC_ID_OFFSET + 1604), - LocationData("Ghost of a Chance", "Ghost of a Chance: Third Island Spectres", SC2WOL_LOC_ID_OFFSET + 1605), - LocationData("The Great Train Robbery", "The Great Train Robbery: Victory", SC2WOL_LOC_ID_OFFSET + 1700, + LocationData("Devil's Playground", "Devil's Playground: North Reapers", SC2WOL_LOC_ID_OFFSET + 1303, LocationType.BONUS), + LocationData("Devil's Playground", "Devil's Playground: Middle Reapers", SC2WOL_LOC_ID_OFFSET + 1304, LocationType.BONUS, + lambda state: logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player)), + LocationData("Devil's Playground", "Devil's Playground: Southwest Reapers", SC2WOL_LOC_ID_OFFSET + 1305, LocationType.BONUS, + lambda state: logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player)), + LocationData("Devil's Playground", "Devil's Playground: Southeast Reapers", SC2WOL_LOC_ID_OFFSET + 1306, LocationType.BONUS, + lambda state: logic_level > 0 or + state._sc2wol_has_anti_air(multiworld, player) and ( + state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), + LocationData("Devil's Playground", "Devil's Playground: East Reapers", SC2WOL_LOC_ID_OFFSET + 1307, LocationType.BONUS, + lambda state: state._sc2wol_has_anti_air(multiworld, player) and + (logic_level > 0 or + state._sc2wol_has_common_unit(multiworld, player) or state.has("Reaper", player))), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: Victory", SC2WOL_LOC_ID_OFFSET + 1400, LocationType.VICTORY, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: Close Relic", SC2WOL_LOC_ID_OFFSET + 1401, LocationType.BONUS), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: West Relic", SC2WOL_LOC_ID_OFFSET + 1402, LocationType.BONUS, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: North-East Relic", SC2WOL_LOC_ID_OFFSET + 1403, LocationType.BONUS, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: Middle Base", SC2WOL_LOC_ID_OFFSET + 1404, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: Main Base", SC2WOL_LOC_ID_OFFSET + 1405, LocationType.CHALLENGE, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player) + and state._sc2wol_beats_protoss_deathball(multiworld, player)), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: No Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1406, LocationType.CHALLENGE, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player) + and state._sc2wol_has_competent_ground_to_air(multiworld, player) + and state._sc2wol_beats_protoss_deathball(multiworld, player)), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 1 Terrazine Node Sealed", SC2WOL_LOC_ID_OFFSET + 1407, LocationType.CHALLENGE, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player) + and state._sc2wol_has_competent_ground_to_air(multiworld, player) + and state._sc2wol_beats_protoss_deathball(multiworld, player)), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 2 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1408, LocationType.CHALLENGE, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player) + and state._sc2wol_beats_protoss_deathball(multiworld, player)), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 3 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1409, LocationType.CHALLENGE, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player) + and state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 4 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1410, LocationType.CHALLENGE, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)), + LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 5 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1411, LocationType.CHALLENGE, + lambda state: state._sc2wol_welcome_to_the_jungle_requirement(multiworld, player)), + LocationData("Breakout", "Breakout: Victory", SC2WOL_LOC_ID_OFFSET + 1500, LocationType.VICTORY), + LocationData("Breakout", "Breakout: Diamondback Prison", SC2WOL_LOC_ID_OFFSET + 1501, LocationType.BONUS), + LocationData("Breakout", "Breakout: Siege Tank Prison", SC2WOL_LOC_ID_OFFSET + 1502, LocationType.BONUS), + LocationData("Breakout", "Breakout: First Checkpoint", SC2WOL_LOC_ID_OFFSET + 1503, LocationType.MISSION_PROGRESS), + LocationData("Breakout", "Breakout: Second Checkpoint", SC2WOL_LOC_ID_OFFSET + 1504, LocationType.MISSION_PROGRESS), + LocationData("Ghost of a Chance", "Ghost of a Chance: Victory", SC2WOL_LOC_ID_OFFSET + 1600, LocationType.VICTORY), + LocationData("Ghost of a Chance", "Ghost of a Chance: Terrazine Tank", SC2WOL_LOC_ID_OFFSET + 1601, LocationType.MISSION_PROGRESS), + LocationData("Ghost of a Chance", "Ghost of a Chance: Jorium Stockpile", SC2WOL_LOC_ID_OFFSET + 1602, LocationType.MISSION_PROGRESS), + LocationData("Ghost of a Chance", "Ghost of a Chance: First Island Spectres", SC2WOL_LOC_ID_OFFSET + 1603, LocationType.BONUS), + LocationData("Ghost of a Chance", "Ghost of a Chance: Second Island Spectres", SC2WOL_LOC_ID_OFFSET + 1604, LocationType.BONUS), + LocationData("Ghost of a Chance", "Ghost of a Chance: Third Island Spectres", SC2WOL_LOC_ID_OFFSET + 1605, LocationType.BONUS), + LocationData("The Great Train Robbery", "The Great Train Robbery: Victory", SC2WOL_LOC_ID_OFFSET + 1700, LocationType.VICTORY, lambda state: state._sc2wol_has_train_killers(multiworld, player) and state._sc2wol_has_anti_air(multiworld, player)), - LocationData("The Great Train Robbery", "The Great Train Robbery: North Defiler", SC2WOL_LOC_ID_OFFSET + 1701), - LocationData("The Great Train Robbery", "The Great Train Robbery: Mid Defiler", SC2WOL_LOC_ID_OFFSET + 1702), - LocationData("The Great Train Robbery", "The Great Train Robbery: South Defiler", SC2WOL_LOC_ID_OFFSET + 1703), - LocationData("Cutthroat", "Cutthroat: Victory", SC2WOL_LOC_ID_OFFSET + 1800, + LocationData("The Great Train Robbery", "The Great Train Robbery: North Defiler", SC2WOL_LOC_ID_OFFSET + 1701, LocationType.BONUS), + LocationData("The Great Train Robbery", "The Great Train Robbery: Mid Defiler", SC2WOL_LOC_ID_OFFSET + 1702, LocationType.BONUS), + LocationData("The Great Train Robbery", "The Great Train Robbery: South Defiler", SC2WOL_LOC_ID_OFFSET + 1703, LocationType.BONUS), + LocationData("The Great Train Robbery", "The Great Train Robbery: Close Diamondback", SC2WOL_LOC_ID_OFFSET + 1704, LocationType.BONUS), + LocationData("The Great Train Robbery", "The Great Train Robbery: Northwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1705, LocationType.BONUS), + LocationData("The Great Train Robbery", "The Great Train Robbery: North Diamondback", SC2WOL_LOC_ID_OFFSET + 1706, LocationType.BONUS), + LocationData("The Great Train Robbery", "The Great Train Robbery: Northeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1707, LocationType.BONUS), + LocationData("The Great Train Robbery", "The Great Train Robbery: Southwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1708, LocationType.BONUS), + LocationData("The Great Train Robbery", "The Great Train Robbery: Southeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1709, LocationType.BONUS), + LocationData("The Great Train Robbery", "The Great Train Robbery: Kill Team", SC2WOL_LOC_ID_OFFSET + 1710, LocationType.CHALLENGE, + lambda state: (logic_level > 0 or state._sc2wol_has_common_unit(multiworld, player)) and + state._sc2wol_has_train_killers(multiworld, player) and + state._sc2wol_has_anti_air(multiworld, player)), + LocationData("Cutthroat", "Cutthroat: Victory", SC2WOL_LOC_ID_OFFSET + 1800, LocationType.VICTORY, lambda state: state._sc2wol_has_common_unit(multiworld, player) and (logic_level > 0 or state._sc2wol_has_anti_air)), - LocationData("Cutthroat", "Cutthroat: Mira Han", SC2WOL_LOC_ID_OFFSET + 1801, + LocationData("Cutthroat", "Cutthroat: Mira Han", SC2WOL_LOC_ID_OFFSET + 1801, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_common_unit(multiworld, player)), - LocationData("Cutthroat", "Cutthroat: North Relic", SC2WOL_LOC_ID_OFFSET + 1802, + LocationData("Cutthroat", "Cutthroat: North Relic", SC2WOL_LOC_ID_OFFSET + 1802, LocationType.BONUS, lambda state: state._sc2wol_has_common_unit(multiworld, player)), - LocationData("Cutthroat", "Cutthroat: Mid Relic", SC2WOL_LOC_ID_OFFSET + 1803), - LocationData("Cutthroat", "Cutthroat: Southwest Relic", SC2WOL_LOC_ID_OFFSET + 1804, + LocationData("Cutthroat", "Cutthroat: Mid Relic", SC2WOL_LOC_ID_OFFSET + 1803, LocationType.BONUS), + LocationData("Cutthroat", "Cutthroat: Southwest Relic", SC2WOL_LOC_ID_OFFSET + 1804, LocationType.BONUS, lambda state: state._sc2wol_has_common_unit(multiworld, player)), - LocationData("Engine of Destruction", "Engine of Destruction: Victory", SC2WOL_LOC_ID_OFFSET + 1900, + LocationData("Cutthroat", "Cutthroat: North Command Center", SC2WOL_LOC_ID_OFFSET + 1805, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_common_unit(multiworld, player)), + LocationData("Cutthroat", "Cutthroat: South Command Center", SC2WOL_LOC_ID_OFFSET + 1806, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_common_unit(multiworld, player)), + LocationData("Cutthroat", "Cutthroat: West Command Center", SC2WOL_LOC_ID_OFFSET + 1807, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_common_unit(multiworld, player)), + LocationData("Engine of Destruction", "Engine of Destruction: Victory", SC2WOL_LOC_ID_OFFSET + 1900, LocationType.VICTORY, lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)), - LocationData("Engine of Destruction", "Engine of Destruction: Odin", SC2WOL_LOC_ID_OFFSET + 1901), - LocationData("Engine of Destruction", "Engine of Destruction: Loki", SC2WOL_LOC_ID_OFFSET + 1902, + LocationData("Engine of Destruction", "Engine of Destruction: Odin", SC2WOL_LOC_ID_OFFSET + 1901, LocationType.MISSION_PROGRESS), + LocationData("Engine of Destruction", "Engine of Destruction: Loki", SC2WOL_LOC_ID_OFFSET + 1902, LocationType.OPTIONAL_BOSS, lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)), - LocationData("Engine of Destruction", "Engine of Destruction: Lab Devourer", SC2WOL_LOC_ID_OFFSET + 1903), - LocationData("Engine of Destruction", "Engine of Destruction: North Devourer", SC2WOL_LOC_ID_OFFSET + 1904, + LocationData("Engine of Destruction", "Engine of Destruction: Lab Devourer", SC2WOL_LOC_ID_OFFSET + 1903, LocationType.BONUS), + LocationData("Engine of Destruction", "Engine of Destruction: North Devourer", SC2WOL_LOC_ID_OFFSET + 1904, LocationType.BONUS, lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)), - LocationData("Engine of Destruction", "Engine of Destruction: Southeast Devourer", SC2WOL_LOC_ID_OFFSET + 1905, + LocationData("Engine of Destruction", "Engine of Destruction: Southeast Devourer", SC2WOL_LOC_ID_OFFSET + 1905, LocationType.BONUS, lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)), - LocationData("Media Blitz", "Media Blitz: Victory", SC2WOL_LOC_ID_OFFSET + 2000, + LocationData("Engine of Destruction", "Engine of Destruction: West Base", SC2WOL_LOC_ID_OFFSET + 1906, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and + state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)), + LocationData("Engine of Destruction", "Engine of Destruction: Northwest Base", SC2WOL_LOC_ID_OFFSET + 1907, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and + state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)), + LocationData("Engine of Destruction", "Engine of Destruction: Northeast Base", SC2WOL_LOC_ID_OFFSET + 1908, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and + state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)), + LocationData("Engine of Destruction", "Engine of Destruction: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1909, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_competent_anti_air(multiworld, player) and + state._sc2wol_has_common_unit(multiworld, player) or state.has('Wraith', player)), + LocationData("Media Blitz", "Media Blitz: Victory", SC2WOL_LOC_ID_OFFSET + 2000, LocationType.VICTORY, lambda state: state._sc2wol_has_competent_comp(multiworld, player)), - LocationData("Media Blitz", "Media Blitz: Tower 1", SC2WOL_LOC_ID_OFFSET + 2001, + LocationData("Media Blitz", "Media Blitz: Tower 1", SC2WOL_LOC_ID_OFFSET + 2001, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_competent_comp(multiworld, player)), - LocationData("Media Blitz", "Media Blitz: Tower 2", SC2WOL_LOC_ID_OFFSET + 2002, + LocationData("Media Blitz", "Media Blitz: Tower 2", SC2WOL_LOC_ID_OFFSET + 2002, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_competent_comp(multiworld, player)), - LocationData("Media Blitz", "Media Blitz: Tower 3", SC2WOL_LOC_ID_OFFSET + 2003, + LocationData("Media Blitz", "Media Blitz: Tower 3", SC2WOL_LOC_ID_OFFSET + 2003, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_competent_comp(multiworld, player)), - LocationData("Media Blitz", "Media Blitz: Science Facility", SC2WOL_LOC_ID_OFFSET + 2004), - LocationData("Piercing the Shroud", "Piercing the Shroud: Victory", SC2WOL_LOC_ID_OFFSET + 2100, + LocationData("Media Blitz", "Media Blitz: Science Facility", SC2WOL_LOC_ID_OFFSET + 2004, LocationType.BONUS), + LocationData("Media Blitz", "Media Blitz: All Barracks", SC2WOL_LOC_ID_OFFSET + 2005, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Media Blitz", "Media Blitz: All Factories", SC2WOL_LOC_ID_OFFSET + 2006, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Media Blitz", "Media Blitz: All Starports", SC2WOL_LOC_ID_OFFSET + 2007, LocationType.MISSION_PROGRESS, + lambda state: logic_level > 0 or state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Media Blitz", "Media Blitz: Odin Not Trashed", SC2WOL_LOC_ID_OFFSET + 2008, LocationType.CHALLENGE, + lambda state: state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Piercing the Shroud", "Piercing the Shroud: Victory", SC2WOL_LOC_ID_OFFSET + 2100, LocationType.VICTORY, lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Holding Cell Relic", SC2WOL_LOC_ID_OFFSET + 2101), - LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk Relic", SC2WOL_LOC_ID_OFFSET + 2102, + LocationData("Piercing the Shroud", "Piercing the Shroud: Holding Cell Relic", SC2WOL_LOC_ID_OFFSET + 2101, LocationType.BONUS), + LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk Relic", SC2WOL_LOC_ID_OFFSET + 2102, LocationType.BONUS, lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)), - LocationData("Piercing the Shroud", "Piercing the Shroud: First Escape Relic", SC2WOL_LOC_ID_OFFSET + 2103, + LocationData("Piercing the Shroud", "Piercing the Shroud: First Escape Relic", SC2WOL_LOC_ID_OFFSET + 2103,LocationType.BONUS, lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Second Escape Relic", SC2WOL_LOC_ID_OFFSET + 2104, + LocationData("Piercing the Shroud", "Piercing the Shroud: Second Escape Relic", SC2WOL_LOC_ID_OFFSET + 2104, LocationType.BONUS, lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk", SC2WOL_LOC_ID_OFFSET + 2105, + LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk", SC2WOL_LOC_ID_OFFSET + 2105, LocationType.OPTIONAL_BOSS, lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)), - LocationData("Whispers of Doom", "Whispers of Doom: Victory", SC2WOL_LOC_ID_OFFSET + 2200), - LocationData("Whispers of Doom", "Whispers of Doom: First Hatchery", SC2WOL_LOC_ID_OFFSET + 2201), - LocationData("Whispers of Doom", "Whispers of Doom: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 2202), - LocationData("Whispers of Doom", "Whispers of Doom: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 2203), - LocationData("A Sinister Turn", "A Sinister Turn: Victory", SC2WOL_LOC_ID_OFFSET + 2300, + LocationData("Piercing the Shroud", "Piercing the Shroud: Fusion Reactor", SC2WOL_LOC_ID_OFFSET + 2106, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_mm_upgrade(multiworld, player)), + LocationData("Whispers of Doom", "Whispers of Doom: Victory", SC2WOL_LOC_ID_OFFSET + 2200, LocationType.VICTORY), + LocationData("Whispers of Doom", "Whispers of Doom: First Hatchery", SC2WOL_LOC_ID_OFFSET + 2201, LocationType.BONUS), + LocationData("Whispers of Doom", "Whispers of Doom: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 2202, LocationType.BONUS), + LocationData("Whispers of Doom", "Whispers of Doom: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 2203, LocationType.BONUS), + LocationData("Whispers of Doom", "Whispers of Doom: First Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2204, LocationType.MISSION_PROGRESS), + LocationData("Whispers of Doom", "Whispers of Doom: Second Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2205, LocationType.MISSION_PROGRESS), + LocationData("Whispers of Doom", "Whispers of Doom: Third Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2206, LocationType.MISSION_PROGRESS), + LocationData("A Sinister Turn", "A Sinister Turn: Victory", SC2WOL_LOC_ID_OFFSET + 2300, LocationType.VICTORY, lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)), - LocationData("A Sinister Turn", "A Sinister Turn: Robotics Facility", SC2WOL_LOC_ID_OFFSET + 2301, + LocationData("A Sinister Turn", "A Sinister Turn: Robotics Facility", SC2WOL_LOC_ID_OFFSET + 2301, LocationType.BONUS, lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)), - LocationData("A Sinister Turn", "A Sinister Turn: Dark Shrine", SC2WOL_LOC_ID_OFFSET + 2302, + LocationData("A Sinister Turn", "A Sinister Turn: Dark Shrine", SC2WOL_LOC_ID_OFFSET + 2302, LocationType.BONUS, lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)), - LocationData("A Sinister Turn", "A Sinister Turn: Templar Archives", SC2WOL_LOC_ID_OFFSET + 2303, - lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)), - LocationData("Echoes of the Future", "Echoes of the Future: Victory", SC2WOL_LOC_ID_OFFSET + 2400, + LocationData("A Sinister Turn", "A Sinister Turn: Templar Archives", SC2WOL_LOC_ID_OFFSET + 2303, LocationType.BONUS, + lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)), + LocationData("A Sinister Turn", "A Sinister Turn: Northeast Base", SC2WOL_LOC_ID_OFFSET + 2304, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)), + LocationData("A Sinister Turn", "A Sinister Turn: Southeast Base", SC2WOL_LOC_ID_OFFSET + 2305, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)), + LocationData("A Sinister Turn", "A Sinister Turn: Maar", SC2WOL_LOC_ID_OFFSET + 2306, LocationType.MISSION_PROGRESS, lambda state: logic_level > 0 or state._sc2wol_has_protoss_medium_units(multiworld, player)), - LocationData("Echoes of the Future", "Echoes of the Future: Close Obelisk", SC2WOL_LOC_ID_OFFSET + 2401), - LocationData("Echoes of the Future", "Echoes of the Future: West Obelisk", SC2WOL_LOC_ID_OFFSET + 2402, - lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)), - LocationData("In Utter Darkness", "In Utter Darkness: Defeat", SC2WOL_LOC_ID_OFFSET + 2500), - LocationData("In Utter Darkness", "In Utter Darkness: Protoss Archive", SC2WOL_LOC_ID_OFFSET + 2501, + LocationData("A Sinister Turn", "A Sinister Turn: Northwest Preserver", SC2WOL_LOC_ID_OFFSET + 2307, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)), - LocationData("In Utter Darkness", "In Utter Darkness: Kills", SC2WOL_LOC_ID_OFFSET + 2502, + LocationData("A Sinister Turn", "A Sinister Turn: Southwest Preserver", SC2WOL_LOC_ID_OFFSET + 2308, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)), + LocationData("A Sinister Turn", "A Sinister Turn: East Preserver", SC2WOL_LOC_ID_OFFSET + 2309, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)), + LocationData("Echoes of the Future", "Echoes of the Future: Victory", SC2WOL_LOC_ID_OFFSET + 2400, LocationType.VICTORY, + lambda state: logic_level > 0 or state._sc2wol_has_protoss_medium_units(multiworld, player)), + LocationData("Echoes of the Future", "Echoes of the Future: Close Obelisk", SC2WOL_LOC_ID_OFFSET + 2401, LocationType.BONUS), + LocationData("Echoes of the Future", "Echoes of the Future: West Obelisk", SC2WOL_LOC_ID_OFFSET + 2402, LocationType.BONUS, + lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)), + LocationData("Echoes of the Future", "Echoes of the Future: Base", SC2WOL_LOC_ID_OFFSET + 2403, LocationType.MISSION_PROGRESS), + LocationData("Echoes of the Future", "Echoes of the Future: Southwest Tendril", SC2WOL_LOC_ID_OFFSET + 2404, LocationType.MISSION_PROGRESS), + LocationData("Echoes of the Future", "Echoes of the Future: Southeast Tendril", SC2WOL_LOC_ID_OFFSET + 2405, LocationType.MISSION_PROGRESS, + lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)), + LocationData("Echoes of the Future", "Echoes of the Future: Northeast Tendril", SC2WOL_LOC_ID_OFFSET + 2406, LocationType.MISSION_PROGRESS, + lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)), + LocationData("Echoes of the Future", "Echoes of the Future: Northwest Tendril", SC2WOL_LOC_ID_OFFSET + 2407, LocationType.MISSION_PROGRESS, + lambda state: logic_level > 0 or state._sc2wol_has_protoss_common_units(multiworld, player)), + LocationData("In Utter Darkness", "In Utter Darkness: Defeat", SC2WOL_LOC_ID_OFFSET + 2500, LocationType.VICTORY), + LocationData("In Utter Darkness", "In Utter Darkness: Protoss Archive", SC2WOL_LOC_ID_OFFSET + 2501, LocationType.BONUS, + lambda state: state._sc2wol_has_protoss_medium_units(multiworld, player)), + LocationData("In Utter Darkness", "In Utter Darkness: Kills", SC2WOL_LOC_ID_OFFSET + 2502, LocationType.CHALLENGE, lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)), - LocationData("Gates of Hell", "Gates of Hell: Victory", SC2WOL_LOC_ID_OFFSET + 2600, + LocationData("In Utter Darkness", "In Utter Darkness: Urun", SC2WOL_LOC_ID_OFFSET + 2503, LocationType.MISSION_PROGRESS), + LocationData("In Utter Darkness", "In Utter Darkness: Mohandar", SC2WOL_LOC_ID_OFFSET + 2504, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)), + LocationData("In Utter Darkness", "In Utter Darkness: Selendis", SC2WOL_LOC_ID_OFFSET + 2505, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)), + LocationData("In Utter Darkness", "In Utter Darkness: Artanis", SC2WOL_LOC_ID_OFFSET + 2506, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_protoss_common_units(multiworld, player)), + LocationData("Gates of Hell", "Gates of Hell: Victory", SC2WOL_LOC_ID_OFFSET + 2600, LocationType.VICTORY, lambda state: state._sc2wol_has_competent_comp(multiworld, player) and state._sc2wol_defense_rating(multiworld, player, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Large Army", SC2WOL_LOC_ID_OFFSET + 2601, + LocationData("Gates of Hell", "Gates of Hell: Large Army", SC2WOL_LOC_ID_OFFSET + 2601, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_competent_comp(multiworld, player) and state._sc2wol_defense_rating(multiworld, player, True) > 6), - LocationData("Belly of the Beast", "Belly of the Beast: Victory", SC2WOL_LOC_ID_OFFSET + 2700), - LocationData("Belly of the Beast", "Belly of the Beast: First Charge", SC2WOL_LOC_ID_OFFSET + 2701), - LocationData("Belly of the Beast", "Belly of the Beast: Second Charge", SC2WOL_LOC_ID_OFFSET + 2702), - LocationData("Belly of the Beast", "Belly of the Beast: Third Charge", SC2WOL_LOC_ID_OFFSET + 2703), - LocationData("Shatter the Sky", "Shatter the Sky: Victory", SC2WOL_LOC_ID_OFFSET + 2800, + LocationData("Gates of Hell", "Gates of Hell: 2 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2602, LocationType.BONUS, + lambda state: state._sc2wol_has_competent_comp(multiworld, player) and + state._sc2wol_defense_rating(multiworld, player, True) > 6), + LocationData("Gates of Hell", "Gates of Hell: 4 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2603, LocationType.BONUS, + lambda state: state._sc2wol_has_competent_comp(multiworld, player) and + state._sc2wol_defense_rating(multiworld, player, True) > 6), + LocationData("Gates of Hell", "Gates of Hell: 6 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2604, LocationType.BONUS, + lambda state: state._sc2wol_has_competent_comp(multiworld, player) and + state._sc2wol_defense_rating(multiworld, player, True) > 6), + LocationData("Gates of Hell", "Gates of Hell: 8 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2605, LocationType.BONUS, + lambda state: state._sc2wol_has_competent_comp(multiworld, player) and + state._sc2wol_defense_rating(multiworld, player, True) > 6), + LocationData("Belly of the Beast", "Belly of the Beast: Victory", SC2WOL_LOC_ID_OFFSET + 2700, LocationType.VICTORY), + LocationData("Belly of the Beast", "Belly of the Beast: First Charge", SC2WOL_LOC_ID_OFFSET + 2701, LocationType.MISSION_PROGRESS), + LocationData("Belly of the Beast", "Belly of the Beast: Second Charge", SC2WOL_LOC_ID_OFFSET + 2702, LocationType.MISSION_PROGRESS), + LocationData("Belly of the Beast", "Belly of the Beast: Third Charge", SC2WOL_LOC_ID_OFFSET + 2703, LocationType.MISSION_PROGRESS), + LocationData("Belly of the Beast", "Belly of the Beast: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 2704, LocationType.BONUS), + LocationData("Belly of the Beast", "Belly of the Beast: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 2705, LocationType.BONUS), + LocationData("Belly of the Beast", "Belly of the Beast: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 2706, LocationType.BONUS), + LocationData("Shatter the Sky", "Shatter the Sky: Victory", SC2WOL_LOC_ID_OFFSET + 2800, LocationType.VICTORY, lambda state: state._sc2wol_has_competent_comp(multiworld, player)), - LocationData("Shatter the Sky", "Shatter the Sky: Close Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2801, + LocationData("Shatter the Sky", "Shatter the Sky: Close Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2801, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_competent_comp(multiworld, player)), - LocationData("Shatter the Sky", "Shatter the Sky: Northwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2802, + LocationData("Shatter the Sky", "Shatter the Sky: Northwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2802, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_competent_comp(multiworld, player)), - LocationData("Shatter the Sky", "Shatter the Sky: Southeast Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2803, + LocationData("Shatter the Sky", "Shatter the Sky: Southeast Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2803, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_competent_comp(multiworld, player)), - LocationData("Shatter the Sky", "Shatter the Sky: Southwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2804, + LocationData("Shatter the Sky", "Shatter the Sky: Southwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2804, LocationType.MISSION_PROGRESS, lambda state: state._sc2wol_has_competent_comp(multiworld, player)), - LocationData("Shatter the Sky", "Shatter the Sky: Leviathan", SC2WOL_LOC_ID_OFFSET + 2805, + LocationData("Shatter the Sky", "Shatter the Sky: Leviathan", SC2WOL_LOC_ID_OFFSET + 2805, LocationType.OPTIONAL_BOSS, lambda state: state._sc2wol_has_competent_comp(multiworld, player)), - LocationData("All-In", "All-In: Victory", None, + LocationData("Shatter the Sky", "Shatter the Sky: East Hatchery", SC2WOL_LOC_ID_OFFSET + 2806, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Shatter the Sky", "Shatter the Sky: North Hatchery", SC2WOL_LOC_ID_OFFSET + 2807, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("Shatter the Sky", "Shatter the Sky: Mid Hatchery", SC2WOL_LOC_ID_OFFSET + 2808, LocationType.MISSION_PROGRESS, + lambda state: state._sc2wol_has_competent_comp(multiworld, player)), + LocationData("All-In", "All-In: Victory", None, LocationType.VICTORY, lambda state: state._sc2wol_final_mission_requirements(multiworld, player)) ] diff --git a/worlds/sc2wol/LogicMixin.py b/worlds/sc2wol/LogicMixin.py index 8c7182e0..112302be 100644 --- a/worlds/sc2wol/LogicMixin.py +++ b/worlds/sc2wol/LogicMixin.py @@ -9,22 +9,38 @@ class SC2WoLLogic(LogicMixin): return self.has_any(get_basic_units(multiworld, player), player) def _sc2wol_has_air(self, multiworld: MultiWorld, player: int) -> bool: - return self.has_any({'Viking', 'Wraith', 'Banshee'}, player) or get_option_value(multiworld, player, 'required_tactics') > 0 \ + return self.has_any({'Viking', 'Wraith', 'Banshee', 'Battlecruiser'}, player) or get_option_value(multiworld, player, 'required_tactics') > 0 \ and self.has_any({'Hercules', 'Medivac'}, player) and self._sc2wol_has_common_unit(multiworld, player) def _sc2wol_has_air_anti_air(self, multiworld: MultiWorld, player: int) -> bool: return self.has('Viking', player) \ - or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('Wraith', player) + or self.has_all({'Wraith', 'Advanced Laser Technology (Wraith)'}, player) \ + or self.has_all({'Battlecruiser', 'ATX Laser Battery (Battlecruiser)'}, player) \ + or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Wraith', 'Valkyrie', 'Battlecruiser'}, player) - def _sc2wol_has_competent_anti_air(self, multiworld: MultiWorld, player: int) -> bool: + def _sc2wol_has_competent_ground_to_air(self, multiworld: MultiWorld, player: int) -> bool: return self.has('Goliath', player) \ or self.has('Marine', player) and self.has_any({'Medic', 'Medivac'}, player) \ + or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('Cyclone', player) + + def _sc2wol_has_competent_anti_air(self, multiworld: MultiWorld, player: int) -> bool: + return self._sc2wol_has_competent_ground_to_air(multiworld, player) \ or self._sc2wol_has_air_anti_air(multiworld, player) + def _sc2wol_welcome_to_the_jungle_requirement(self, multiworld: MultiWorld, player: int) -> bool: + return ( + self._sc2wol_has_common_unit(multiworld, player) + and self._sc2wol_has_competent_ground_to_air(multiworld, player) + ) or ( + get_option_value(multiworld, player, 'required_tactics') > 0 + and self.has_any({'Marine', 'Vulture'}, player) + and self._sc2wol_has_air_anti_air(multiworld, player) + ) + def _sc2wol_has_anti_air(self, multiworld: MultiWorld, player: int) -> bool: - return self.has_any({'Missile Turret', 'Thor', 'War Pigs', 'Spartan Company', "Hel's Angel", 'Battlecruiser', 'Marine', 'Wraith'}, player) \ + return self.has_any({'Missile Turret', 'Thor', 'War Pigs', 'Spartan Company', "Hel's Angel", 'Battlecruiser', 'Marine', 'Wraith', 'Valkyrie', 'Cyclone'}, player) \ or self._sc2wol_has_competent_anti_air(multiworld, player) \ - or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Ghost', 'Spectre'}, player) + or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Ghost', 'Spectre', 'Widow Mine', 'Liberator'}, player) def _sc2wol_defense_rating(self, multiworld: MultiWorld, player: int, zerg_enemy: bool, air_enemy: bool = True) -> bool: defense_score = sum((defense_ratings[item] for item in defense_ratings if self.has(item, player))) @@ -32,6 +48,10 @@ class SC2WoLLogic(LogicMixin): defense_score += 3 if self.has_all({'Siege Tank', 'Maelstrom Rounds (Siege Tank)'}, player): defense_score += 2 + if self.has_all({'Siege Tank', 'Graduating Range (Siege Tank)'}, player): + defense_score += 1 + if self.has_all({'Widow Mine', 'Concealment (Widow Mine)'}, player): + defense_score += 1 if zerg_enemy: defense_score += sum((zerg_defense_ratings[item] for item in zerg_defense_ratings if self.has(item, player))) if self.has('Firebat', player) and self.has('Bunker', player): @@ -44,20 +64,27 @@ class SC2WoLLogic(LogicMixin): return defense_score def _sc2wol_has_competent_comp(self, multiworld: MultiWorld, player: int) -> bool: - return (self.has('Marine', player) or self.has('Marauder', player) and - self._sc2wol_has_competent_anti_air(multiworld, player)) and self.has_any({'Medivac', 'Medic'}, player) or \ - self.has('Thor', player) or self.has("Banshee", player) and self._sc2wol_has_competent_anti_air(multiworld, player) or \ - self.has('Battlecruiser', player) and self._sc2wol_has_common_unit(multiworld, player) or \ - self.has('Siege Tank', player) and self._sc2wol_has_competent_anti_air(multiworld, player) + return \ + ( + ( + self.has_any({'Marine', 'Marauder'}, player) and self.has_any({'Medivac', 'Medic'}, player) + or self.has_any({'Thor', 'Banshee', 'Siege Tank'}, player) + or self.has_all({'Liberator', 'Raid Artillery (Liberator)'}, player) + ) and self._sc2wol_has_competent_anti_air(multiworld, player) + ) \ + or \ + ( + self.has('Battlecruiser', player) and self._sc2wol_has_common_unit(multiworld, player) + ) def _sc2wol_has_train_killers(self, multiworld: MultiWorld, player: int) -> bool: return ( - self.has_any({'Siege Tank', 'Diamondback', 'Marauder'}, player) + self.has_any({'Siege Tank', 'Diamondback', 'Marauder', 'Cyclone'}, player) or get_option_value(multiworld, player, 'required_tactics') > 0 and ( self.has_all({'Reaper', "G-4 Clusterbomb"}, player) or self.has_all({'Spectre', 'Psionic Lash'}, player) - or self.has('Vulture', player) + or self.has_any({'Vulture', 'Liberator'}, player) ) ) @@ -66,16 +93,18 @@ class SC2WoLLogic(LogicMixin): def _sc2wol_has_protoss_common_units(self, multiworld: MultiWorld, player: int) -> bool: return self.has_any({'Zealot', 'Immortal', 'Stalker', 'Dark Templar'}, player) \ - or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'High Templar', 'Dark Templar'}, player) + or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('High Templar', player) def _sc2wol_has_protoss_medium_units(self, multiworld: MultiWorld, player: int) -> bool: return self._sc2wol_has_protoss_common_units(multiworld, player) and \ - self.has_any({'Stalker', 'Void Ray', 'Phoenix', 'Carrier'}, player) \ - or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'High Templar', 'Dark Templar'}, player) + self.has_any({'Stalker', 'Void Ray', 'Carrier'}, player) \ + or get_option_value(multiworld, player, 'required_tactics') > 0 and self.has('Dark Templar', player) def _sc2wol_beats_protoss_deathball(self, multiworld: MultiWorld, player: int) -> bool: - return self.has_any({'Banshee', 'Battlecruiser'}, player) and self._sc2wol_has_competent_anti_air(multiworld, player) or \ - self._sc2wol_has_competent_comp(multiworld, player) and self._sc2wol_has_air_anti_air(multiworld, player) + return (self.has_any({'Banshee', 'Battlecruiser'}, player) or + self.has_all({'Liberator', 'Raid Artillery (Liberator)'}, player)) \ + and self._sc2wol_has_competent_anti_air(multiworld, player) or \ + self._sc2wol_has_competent_comp(multiworld, player) and self._sc2wol_has_air_anti_air(multiworld, player) def _sc2wol_has_mm_upgrade(self, multiworld: MultiWorld, player: int) -> bool: return self.has_any({"Combat Shield (Marine)", "Stabilizer Medpacks (Medic)"}, player) @@ -89,6 +118,17 @@ class SC2WoLLogic(LogicMixin): def _sc2wol_has_nukes(self, multiworld: MultiWorld, player: int) -> bool: return get_option_value(multiworld, player, 'required_tactics') > 0 and self.has_any({'Ghost', 'Spectre'}, player) + def _sc2wol_can_respond_to_colony_infestations(self, multiworld: MultiWorld, player: int) -> bool: + return self._sc2wol_has_common_unit(multiworld, player) \ + and self._sc2wol_has_competent_anti_air(multiworld, player) \ + and \ + ( + self._sc2wol_has_air_anti_air(multiworld, player) or + self.has_any({'Battlecruiser', 'Valkyrie'}), player + ) \ + and \ + self._sc2wol_defense_rating(multiworld, player, True) >= 3 + def _sc2wol_final_mission_requirements(self, multiworld: MultiWorld, player: int): beats_kerrigan = self.has_any({'Marine', 'Banshee', 'Ghost'}, player) or get_option_value(multiworld, player, 'required_tactics') > 0 if get_option_value(multiworld, player, 'all_in_map') == 0: @@ -101,7 +141,7 @@ class SC2WoLLogic(LogicMixin): # Air defense_rating = self._sc2wol_defense_rating(multiworld, player, True, True) return defense_rating >= 8 and beats_kerrigan \ - and self.has_any({'Viking', 'Battlecruiser'}, player) \ + and self.has_any({'Viking', 'Battlecruiser', 'Valkyrie'}, player) \ and self.has_any({'Hive Mind Emulator', 'Psi Disruptor', 'Missile Turret'}, player) def _sc2wol_cleared_missions(self, multiworld: MultiWorld, player: int, mission_count: int) -> bool: diff --git a/worlds/sc2wol/MissionTables.py b/worlds/sc2wol/MissionTables.py index 6db93547..298cd7a9 100644 --- a/worlds/sc2wol/MissionTables.py +++ b/worlds/sc2wol/MissionTables.py @@ -49,8 +49,8 @@ vanilla_shuffle_order = [ FillMission(MissionPools.EASY, [2], "Artifact", completion_critical=True), FillMission(MissionPools.MEDIUM, [7], "Artifact", number=8, completion_critical=True), FillMission(MissionPools.HARD, [8], "Artifact", number=11, completion_critical=True), - FillMission(MissionPools.HARD, [9], "Artifact", number=14, completion_critical=True), - FillMission(MissionPools.HARD, [10], "Artifact", completion_critical=True), + FillMission(MissionPools.HARD, [9], "Artifact", number=14, completion_critical=True, removal_priority=11), + FillMission(MissionPools.HARD, [10], "Artifact", completion_critical=True, removal_priority=10), FillMission(MissionPools.MEDIUM, [2], "Covert", number=4), FillMission(MissionPools.MEDIUM, [12], "Covert"), FillMission(MissionPools.HARD, [13], "Covert", number=8, removal_priority=3), @@ -58,7 +58,7 @@ vanilla_shuffle_order = [ FillMission(MissionPools.MEDIUM, [2], "Rebellion", number=6), FillMission(MissionPools.HARD, [16], "Rebellion"), FillMission(MissionPools.HARD, [17], "Rebellion"), - FillMission(MissionPools.HARD, [18], "Rebellion"), + FillMission(MissionPools.HARD, [18], "Rebellion", removal_priority=12), FillMission(MissionPools.HARD, [19], "Rebellion", removal_priority=5), FillMission(MissionPools.MEDIUM, [8], "Prophecy", removal_priority=9), FillMission(MissionPools.HARD, [21], "Prophecy", removal_priority=8), @@ -98,6 +98,13 @@ gauntlet_order = [ FillMission(MissionPools.FINAL, [5], "Final", completion_critical=True) ] +mini_gauntlet_order = [ + FillMission(MissionPools.STARTER, [-1], "I", completion_critical=True), + FillMission(MissionPools.EASY, [0], "II", completion_critical=True), + FillMission(MissionPools.MEDIUM, [1], "III", completion_critical=True), + FillMission(MissionPools.FINAL, [2], "Final", completion_critical=True) +] + grid_order = [ FillMission(MissionPools.STARTER, [-1], "_1"), FillMission(MissionPools.EASY, [0], "_1"), @@ -129,6 +136,13 @@ mini_grid_order = [ FillMission(MissionPools.FINAL, [5, 7], "_3", or_requirements=True) ] +tiny_grid_order = [ + FillMission(MissionPools.STARTER, [-1], "_1"), + FillMission(MissionPools.MEDIUM, [0], "_1"), + FillMission(MissionPools.EASY, [0], "_2"), + FillMission(MissionPools.FINAL, [1, 2], "_2", or_requirements=True), +] + blitz_order = [ FillMission(MissionPools.STARTER, [-1], "I"), FillMission(MissionPools.EASY, [-1], "I"), @@ -144,7 +158,17 @@ blitz_order = [ FillMission(MissionPools.FINAL, [0, 1], "Final", number=5, or_requirements=True) ] -mission_orders = [vanilla_shuffle_order, vanilla_shuffle_order, mini_campaign_order, grid_order, mini_grid_order, blitz_order, gauntlet_order] +mission_orders = [ + vanilla_shuffle_order, + vanilla_shuffle_order, + mini_campaign_order, + grid_order, + mini_grid_order, + blitz_order, + gauntlet_order, + mini_gauntlet_order, + tiny_grid_order +] vanilla_mission_req_table = { @@ -190,7 +214,7 @@ starting_mission_locations = { "Whispers of Doom": "Whispers of Doom: Victory", "Belly of the Beast": "Belly of the Beast: Victory", "Zero Hour": "Zero Hour: First Group Rescued", - "Evacuation": "Evacuation: First Chysalis", + "Evacuation": "Evacuation: Reach Hanson", "Devil's Playground": "Devil's Playground: Tosh's Miners", "Smash and Grab": "Smash and Grab: First Relic", "The Great Train Robbery": "The Great Train Robbery: North Defiler" diff --git a/worlds/sc2wol/Options.py b/worlds/sc2wol/Options.py index 4f2032d6..0702e431 100644 --- a/worlds/sc2wol/Options.py +++ b/worlds/sc2wol/Options.py @@ -3,31 +3,49 @@ from BaseClasses import MultiWorld from Options import Choice, Option, Toggle, DefaultOnToggle, ItemSet, OptionSet, Range from .MissionTables import vanilla_mission_req_table +ORDER_VANILLA = 0 +ORDER_VANILLA_SHUFFLED = 1 class GameDifficulty(Choice): - """The difficulty of the campaign, affects enemy AI, starting units, and game speed.""" + """ + The difficulty of the campaign, affects enemy AI, starting units, and game speed. + + For those unfamiliar with the Archipelago randomizer, the recommended settings are one difficulty level + lower than the vanilla game + """ display_name = "Game Difficulty" option_casual = 0 option_normal = 1 option_hard = 2 option_brutal = 3 + default = 1 +class GameSpeed(Choice): + """Optional setting to override difficulty-based game speed.""" + display_name = "Game Speed" + option_default = 0 + option_slower = 1 + option_slow = 2 + option_normal = 3 + option_fast = 4 + option_faster = 5 + default = option_default -class UpgradeBonus(Choice): - """Determines what lab upgrade to use, whether it is Ultra-Capacitors which boost attack speed with every weapon - upgrade or Vanadium Plating which boosts life with every armor upgrade.""" - display_name = "Upgrade Bonus" - option_ultra_capacitors = 0 - option_vanadium_plating = 1 +class FinalMap(Choice): + """ + Determines if the final map and goal of the campaign. + All in: You need to beat All-in map + Random Hard: A random hard mission is selected as a goal. + Beat this mission in order to complete the game. + All-in map won't be in the campaign + Vanilla mission order always ends with All in mission! -class BunkerUpgrade(Choice): - """Determines what bunker lab upgrade to use, whether it is Shrike Turret which outfits bunkers with an automated - turret or Fortified Bunker which boosts the life of bunkers.""" - display_name = "Bunker Upgrade" - option_shrike_turret = 0 - option_fortified_bunker = 1 - + This option is short-lived. It may be changed in the future + """ + display_name = "Final Map" + option_all_in = 0 + option_random_hard = 1 class AllInMap(Choice): """Determines what version of All-In (final map) that will be generated for the campaign.""" @@ -37,14 +55,18 @@ class AllInMap(Choice): class MissionOrder(Choice): - """Determines the order the missions are played in. The last three mission orders end in a random mission. + """ + Determines the order the missions are played in. The last three mission orders end in a random mission. Vanilla (29): Keeps the standard mission order and branching from the WoL Campaign. Vanilla Shuffled (29): Keeps same branching paths from the WoL Campaign but randomizes the order of missions within. Mini Campaign (15): Shorter version of the campaign with randomized missions and optional branches. - Grid (16): A 4x4 grid of random missions. Start at the top-left and forge a path towards All-In. + Grid (16): A 4x4 grid of random missions. Start at the top-left and forge a path towards bottom-right mission to win. Mini Grid (9): A 3x3 version of Grid. Complete the bottom-right mission to win. Blitz (12): 12 random missions that open up very quickly. Complete the bottom-right mission to win. - Gauntlet (7): Linear series of 7 random missions to complete the campaign.""" + Gauntlet (7): Linear series of 7 random missions to complete the campaign. + Mini Gauntlet (4): Linear series of 4 random missions to complete the campaign. + Tiny Grid (4): A 2x2 version of Grid. Complete the bottom-right mission to win. + """ display_name = "Mission Order" option_vanilla = 0 option_vanilla_shuffled = 1 @@ -53,27 +75,53 @@ class MissionOrder(Choice): option_mini_grid = 4 option_blitz = 5 option_gauntlet = 6 + option_mini_gauntlet = 7 + option_tiny_grid = 8 + + +class PlayerColor(Choice): + """Determines in-game team color.""" + display_name = "Player Color" + option_white = 0 + option_red = 1 + option_blue = 2 + option_teal = 3 + option_purple = 4 + option_yellow = 5 + option_orange = 6 + option_green = 7 + option_light_pink = 8 + option_violet = 9 + option_light_grey = 10 + option_dark_green = 11 + option_brown = 12 + option_light_green = 13 + option_dark_grey = 14 + option_pink = 15 + option_rainbow = 16 + option_default = 17 + default = option_default class ShuffleProtoss(DefaultOnToggle): """Determines if the 3 protoss missions are included in the shuffle if Vanilla mission order is not enabled. - If turned off with Vanilla Shuffled, the 3 protoss missions will be in their normal position on the Prophecy chain - if not shuffled. - If turned off with reduced mission settings, the 3 protoss missions will not appear and Protoss units are removed - from the pool.""" + If turned off, the 3 protoss missions will not appear and Protoss units are removed from the pool.""" display_name = "Shuffle Protoss Missions" class ShuffleNoBuild(DefaultOnToggle): """Determines if the 5 no-build missions are included in the shuffle if Vanilla mission order is not enabled. - If turned off with Vanilla Shuffled, one no-build mission will be placed as the first mission and the rest will be - placed at the end of optional routes. - If turned off with reduced mission settings, the 5 no-build missions will not appear.""" + If turned off, the 5 no-build missions will not appear.""" display_name = "Shuffle No-Build Missions" class EarlyUnit(DefaultOnToggle): - """Guarantees that the first mission will contain a unit.""" + """ + Guarantees that the first mission will contain a unit. + + Each mission available to be the first mission has a pre-defined location where the unit should spawn. + This location gets overriden over any exclusion. It's guaranteed to be reachable with an empty inventory. + """ display_name = "Early Unit" @@ -91,11 +139,97 @@ class RequiredTactics(Choice): class UnitsAlwaysHaveUpgrades(DefaultOnToggle): - """If turned on, both upgrades will be present for each unit and structure in the seed. - This usually results in fewer units.""" + """ + If turned on, all upgrades will be present for each unit and structure in the seed. + This usually results in fewer units. + + See also: Max Number of Upgrades + """ display_name = "Units Always Have Upgrades" +class GenericUpgradeMissions(Range): + """Determines the percentage of missions in the mission order that must be completed before + level 1 of all weapon and armor upgrades is unlocked. Level 2 upgrades require double the amount of missions, + and level 3 requires triple the amount. The required amounts are always rounded down. + If set to 0, upgrades are instead added to the item pool and must be found to be used.""" + display_name = "Generic Upgrade Missions" + range_start = 0 + range_end = 100 + default = 0 + + +class GenericUpgradeResearch(Choice): + """Determines how weapon and armor upgrades affect missions once unlocked. + + Vanilla: Upgrades must be researched as normal. + Auto In No-Build: In No-Build missions, upgrades are automatically researched. + In all other missions, upgrades must be researched as normal. + Auto In Build: In No-Build missions, upgrades are unavailable as normal. + In all other missions, upgrades are automatically researched. + Always Auto: Upgrades are automatically researched in all missions.""" + display_name = "Generic Upgrade Research" + option_vanilla = 0 + option_auto_in_no_build = 1 + option_auto_in_build = 2 + option_always_auto = 3 + + +class GenericUpgradeItems(Choice): + """Determines how weapon and armor upgrades are split into items. All options produce 3 levels of each item. + Does nothing if upgrades are unlocked by completed mission counts. + + Individual Items: All weapon and armor upgrades are each an item, + resulting in 18 total upgrade items. + Bundle Weapon And Armor: All types of weapon upgrades are one item, + and all types of armor upgrades are one item, + resulting in 6 total items. + Bundle Unit Class: Weapon and armor upgrades are merged, + but Infantry, Vehicle, and Starship upgrades are bundled separately, + resulting in 9 total items. + Bundle All: All weapon and armor upgrades are one item, + resulting in 3 total items.""" + display_name = "Generic Upgrade Items" + option_individual_items = 0 + option_bundle_weapon_and_armor = 1 + option_bundle_unit_class = 2 + option_bundle_all = 3 + + +class NovaCovertOpsItems(Toggle): + """If turned on, the equipment upgrades from Nova Covert Ops may be present in the world.""" + display_name = "Nova Covert Ops Items" + default = Toggle.option_true + + +class BroodWarItems(Toggle): + """If turned on, returning items from StarCraft: Brood War may appear in the world.""" + display_name = "Brood War Items" + default = Toggle.option_true + + +class ExtendedItems(Toggle): + """If turned on, original items that did not appear in Campaign mode may appear in the world.""" + display_name = "Extended Items" + default = Toggle.option_true + + +class MaxNumberOfUpgrades(Range): + """ + Set a maximum to the number of upgrades a unit/structure can have. -1 is used to define unlimited. + Note that most unit have 4 or 6 upgrades. + + If used with Units Always Have Upgrades, each unit has this given amount of upgrades (if there enough upgrades exist) + + See also: Units Always Have Upgrades + """ + display_name = "Maximum number of upgrades per unit/structure" + range_start = -1 + # Do not know the maximum, but it is less than 123! + range_end = 123 + default = -1 + + class LockedItems(ItemSet): """Guarantees that these items will be unlockable""" display_name = "Locked Items" @@ -108,27 +242,114 @@ class ExcludedItems(ItemSet): class ExcludedMissions(OptionSet): """Guarantees that these missions will not appear in the campaign - Only applies on shortened mission orders. + Doesn't apply to vanilla mission order. It may be impossible to build a valid campaign if too many missions are excluded.""" display_name = "Excluded Missions" valid_keys = {mission_name for mission_name in vanilla_mission_req_table.keys() if mission_name != 'All-In'} +class LocationInclusion(Choice): + option_enabled = 0 + option_trash = 1 + option_nothing = 2 + + +class MissionProgressLocations(LocationInclusion): + """ + Enables or disables item rewards for progressing (not finishing) a mission. + Progressing a mission is usually a task of completing or progressing into a main objective. + Clearing an expansion base also counts here. + + Enabled: All locations fitting into this do their normal rewards + Trash: Forces a trash item in + Nothing: No rewards for this type of tasks, effectively disabling such locations + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + Warning: The generation may fail if too many locations are excluded by this way. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Mission Progress Locations" + + +class BonusLocations(LocationInclusion): + """ + Enables or disables item rewards for completing bonus tasks. + Bonus tasks are those giving you a campaign-wide or mission-wide bonus in vanilla game: + Research, credits, bonus units or resources, etc. + + Enabled: All locations fitting into this do their normal rewards + Trash: Forces a trash item in + Nothing: No rewards for this type of tasks, effectively disabling such locations + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + Warning: The generation may fail if too many locations are excluded by this way. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Bonus Locations" + + +class ChallengeLocations(LocationInclusion): + """ + Enables or disables item rewards for completing challenge tasks. + Challenges are tasks that have usually higher requirements to be completed + than to complete the mission they're in successfully. + You might be required to visit the same mission later when getting stronger in order to finish these tasks. + + Enabled: All locations fitting into this do their normal rewards + Trash: Forces a trash item in + Nothing: No rewards for this type of tasks, effectively disabling such locations + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + Warning: The generation may fail if too many locations are excluded by this way. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Challenge Locations" + + +class OptionalBossLocations(LocationInclusion): + """ + Enables or disables item rewards for defeating optional bosses. + An optional boss is any boss that's not required to kill in order to finish the mission successfully. + All Brutalisks, Loki, etc. belongs here. + + Enabled: All locations fitting into this do their normal rewards + Trash: Forces a trash item in + Nothing: No rewards for this type of tasks, effectively disabling such locations + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + Warning: The generation may fail if too many locations are excluded by this way. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Challenge Locations" + + # noinspection PyTypeChecker sc2wol_options: Dict[str, Option] = { "game_difficulty": GameDifficulty, - "upgrade_bonus": UpgradeBonus, - "bunker_upgrade": BunkerUpgrade, + "game_speed": GameSpeed, "all_in_map": AllInMap, + "final_map": FinalMap, "mission_order": MissionOrder, + "player_color": PlayerColor, "shuffle_protoss": ShuffleProtoss, "shuffle_no_build": ShuffleNoBuild, "early_unit": EarlyUnit, "required_tactics": RequiredTactics, "units_always_have_upgrades": UnitsAlwaysHaveUpgrades, + "max_number_of_upgrades": MaxNumberOfUpgrades, + "generic_upgrade_missions": GenericUpgradeMissions, + "generic_upgrade_research": GenericUpgradeResearch, + "generic_upgrade_items": GenericUpgradeItems, "locked_items": LockedItems, "excluded_items": ExcludedItems, - "excluded_missions": ExcludedMissions + "excluded_missions": ExcludedMissions, + "nco_items": NovaCovertOpsItems, + "bw_items": BroodWarItems, + "ext_items": ExtendedItems, + "mission_progress_locations": MissionProgressLocations, + "bonus_locations": BonusLocations, + "challenge_locations": ChallengeLocations, + "optional_boss_locations": OptionalBossLocations } diff --git a/worlds/sc2wol/PoolFilter.py b/worlds/sc2wol/PoolFilter.py index 16cc51f2..4a19e2db 100644 --- a/worlds/sc2wol/PoolFilter.py +++ b/worlds/sc2wol/PoolFilter.py @@ -1,22 +1,22 @@ from typing import Callable, Dict, List, Set from BaseClasses import MultiWorld, ItemClassification, Item, Location -from .Items import item_table +from .Items import get_full_item_list, spider_mine_sources, second_pass_placeable_items, filler_items from .MissionTables import no_build_regions_list, easy_regions_list, medium_regions_list, hard_regions_list,\ mission_orders, MissionInfo, alt_final_mission_locations, MissionPools -from .Options import get_option_value +from .Options import get_option_value, MissionOrder, FinalMap, MissionProgressLocations, LocationInclusion from .LogicMixin import SC2WoLLogic # Items with associated upgrades UPGRADABLE_ITEMS = [ "Marine", "Medic", "Firebat", "Marauder", "Reaper", "Ghost", "Spectre", - "Hellion", "Vulture", "Goliath", "Diamondback", "Siege Tank", "Thor", - "Medivac", "Wraith", "Viking", "Banshee", "Battlecruiser", + "Hellion", "Vulture", "Goliath", "Diamondback", "Siege Tank", "Thor", "Predator", "Widow Mine", "Cyclone", + "Medivac", "Wraith", "Viking", "Banshee", "Battlecruiser", "Raven", "Science Vessel", "Liberator", "Valkyrie", "Bunker", "Missile Turret" ] BARRACKS_UNITS = {"Marine", "Medic", "Firebat", "Marauder", "Reaper", "Ghost", "Spectre"} -FACTORY_UNITS = {"Hellion", "Vulture", "Goliath", "Diamondback", "Siege Tank", "Thor", "Predator"} -STARPORT_UNITS = {"Medivac", "Wraith", "Viking", "Banshee", "Battlecruiser", "Hercules", "Science Vessel", "Raven"} +FACTORY_UNITS = {"Hellion", "Vulture", "Goliath", "Diamondback", "Siege Tank", "Thor", "Predator", "Widow Mine"} +STARPORT_UNITS = {"Medivac", "Wraith", "Viking", "Banshee", "Battlecruiser", "Hercules", "Science Vessel", "Raven", "Liberator", "Valkyrie"} PROTOSS_REGIONS = {"A Sinister Turn", "Echoes of the Future", "In Utter Darkness"} @@ -30,7 +30,7 @@ def filter_missions(multiworld: MultiWorld, player: int) -> Dict[int, List[str]] shuffle_no_build = get_option_value(multiworld, player, "shuffle_no_build") shuffle_protoss = get_option_value(multiworld, player, "shuffle_protoss") excluded_missions = get_option_value(multiworld, player, "excluded_missions") - mission_count = len(mission_orders[mission_order_type]) - 1 + final_map = get_option_value(multiworld, player, "final_map") mission_pools = { MissionPools.STARTER: no_build_regions_list[:], MissionPools.EASY: easy_regions_list[:], @@ -38,21 +38,18 @@ def filter_missions(multiworld: MultiWorld, player: int) -> Dict[int, List[str]] MissionPools.HARD: hard_regions_list[:], MissionPools.FINAL: [] } - if mission_order_type == 0: + if mission_order_type == MissionOrder.option_vanilla: # Vanilla uses the entire mission pool mission_pools[MissionPools.FINAL] = ['All-In'] return mission_pools - elif mission_order_type == 1: - # Vanilla Shuffled ignores the player-provided excluded missions - excluded_missions = set() # Omitting No-Build missions if not shuffling no-build if not shuffle_no_build: excluded_missions = excluded_missions.union(no_build_regions_list) # Omitting Protoss missions if not shuffling protoss if not shuffle_protoss: excluded_missions = excluded_missions.union(PROTOSS_REGIONS) - # Replacing All-In on low mission counts - if mission_count < 14: + # Replacing All-In with alternate ending depending on option + if final_map == FinalMap.option_random_hard: final_mission = multiworld.random.choice([mission for mission in alt_final_mission_locations.keys() if mission not in excluded_missions]) excluded_missions.add(final_mission) else: @@ -92,10 +89,18 @@ def get_item_upgrades(inventory: List[Item], parent_item: Item or str): item_name = parent_item.name if isinstance(parent_item, Item) else parent_item return [ inv_item for inv_item in inventory - if item_table[inv_item.name].parent_item == item_name + if get_full_item_list()[inv_item.name].parent_item == item_name ] +def get_item_quantity(item): + return get_full_item_list()[item.name].quantity + + +def copy_item(item: Item): + return Item(item.name, item.classification, item.code, item.player) + + class ValidInventory: def has(self, item: str, player: int): @@ -124,22 +129,6 @@ class ValidInventory: cascade_keys = self.cascade_removal_map.keys() units_always_have_upgrades = get_option_value(self.multiworld, self.player, "units_always_have_upgrades") - # Locking associated items for items that have already been placed when units_always_have_upgrades is on - if units_always_have_upgrades: - existing_items = self.existing_items[:] - while existing_items: - existing_item = existing_items.pop() - items_to_lock = self.cascade_removal_map.get(existing_item, [existing_item]) - for item in items_to_lock: - if item in inventory: - inventory.remove(item) - locked_items.append(item) - if item in existing_items: - existing_items.remove(item) - - if self.min_units_per_structure > 0 and self.has_units_per_structure(): - requirements.append(lambda state: state.has_units_per_structure()) - def attempt_removal(item: Item) -> bool: # If item can be removed and has associated items, remove them as well inventory.remove(item) @@ -149,9 +138,77 @@ class ValidInventory: if not all(requirement(self) for requirement in requirements): # If item cannot be removed, lock or revert self.logical_inventory.add(item.name) - locked_items.append(item) + for _ in range(get_item_quantity(item)): + locked_items.append(copy_item(item)) return False return True + + # Limit the maximum number of upgrades + maxUpgrad = get_option_value(self.multiworld, self.player, + "max_number_of_upgrades") + if maxUpgrad != -1: + unit_avail_upgrades = {} + # Needed to take into account locked/existing items + unit_nb_upgrades = {} + for item in inventory: + cItem = get_full_item_list()[item.name] + if cItem.type in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades: + unit_avail_upgrades[item.name] = [] + unit_nb_upgrades[item.name] = 0 + elif cItem.parent_item is not None: + if cItem.parent_item not in unit_avail_upgrades: + unit_avail_upgrades[cItem.parent_item] = [item] + unit_nb_upgrades[cItem.parent_item] = 1 + else: + unit_avail_upgrades[cItem.parent_item].append(item) + unit_nb_upgrades[cItem.parent_item] += 1 + # For those two categories, we count them but dont include them in removal + for item in locked_items + self.existing_items: + cItem = get_full_item_list()[item.name] + if cItem.type in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades: + unit_avail_upgrades[item.name] = [] + unit_nb_upgrades[item.name] = 0 + elif cItem.parent_item is not None: + if cItem.parent_item not in unit_avail_upgrades: + unit_nb_upgrades[cItem.parent_item] = 1 + else: + unit_nb_upgrades[cItem.parent_item] += 1 + # Making sure that the upgrades being removed is random + # Currently, only for combat shield vs Stabilizer Medpacks... + shuffled_unit_upgrade_list = list(unit_avail_upgrades.keys()) + self.multiworld.random.shuffle(shuffled_unit_upgrade_list) + for unit in shuffled_unit_upgrade_list: + while (unit_nb_upgrades[unit] > maxUpgrad) \ + and (len(unit_avail_upgrades[unit]) > 0): + itemCandidate = self.multiworld.random.choice(unit_avail_upgrades[unit]) + _ = attempt_removal(itemCandidate) + # Whatever it succeed to remove the iventory or it fails and thus + # lock it, the upgrade is no longer available for removal + unit_avail_upgrades[unit].remove(itemCandidate) + unit_nb_upgrades[unit] -= 1 + + # Locking associated items for items that have already been placed when units_always_have_upgrades is on + if units_always_have_upgrades: + existing_items = set(self.existing_items[:] + locked_items) + while existing_items: + existing_item = existing_items.pop() + items_to_lock = self.cascade_removal_map.get(existing_item, [existing_item]) + if get_full_item_list()[existing_item.name].type != "Upgrade": + # Don't process general upgrades, they may have been pre-locked per-level + for item in items_to_lock: + if item in inventory: + # Unit upgrades, lock all levels + for _ in range(inventory.count(item)): + inventory.remove(item) + if item not in locked_items: + # Lock all the associated items if not already locked + for _ in range(get_item_quantity(item)): + locked_items.append(copy_item(item)) + if item in existing_items: + existing_items.remove(item) + + if self.min_units_per_structure > 0 and self.has_units_per_structure(): + requirements.append(lambda state: state.has_units_per_structure()) # Determining if the full-size inventory can complete campaign if not all(requirement(self) for requirement in requirements): @@ -185,21 +242,47 @@ class ValidInventory: if cascade_failure: for transient_item in transient_items: if transient_item in inventory: - inventory.remove(transient_item) + for _ in range(inventory.count(transient_item)): + inventory.remove(transient_item) if transient_item not in locked_items: - locked_items.append(transient_item) + for _ in range(get_item_quantity(transient_item)): + locked_items.append(copy_item(transient_item)) if transient_item.classification in (ItemClassification.progression, ItemClassification.progression_skip_balancing): self.logical_inventory.add(transient_item.name) else: attempt_removal(item) - return inventory + locked_items + if not spider_mine_sources & self.logical_inventory: + inventory = [item for item in inventory if not item.name.endswith("(Spider Mine)")] + if not BARRACKS_UNITS & self.logical_inventory: + inventory = [item for item in inventory if + not (item.name.startswith("Progressive Infantry") or item.name == "Orbital Strike")] + if not FACTORY_UNITS & self.logical_inventory: + inventory = [item for item in inventory if not item.name.startswith("Progressive Vehicle")] + if not STARPORT_UNITS & self.logical_inventory: + inventory = [item for item in inventory if not item.name.startswith("Progressive Ship")] + + # Cull finished, adding locked items back into inventory + inventory += locked_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)] + self.multiworld.random.shuffle(replacement_items) + while len(inventory) < inventory_size and len(replacement_items) > 0: + item = replacement_items.pop() + inventory.append(item) + + return inventory def _read_logic(self): self._sc2wol_has_common_unit = lambda world, player: SC2WoLLogic._sc2wol_has_common_unit(self, world, player) self._sc2wol_has_air = lambda world, player: SC2WoLLogic._sc2wol_has_air(self, world, player) self._sc2wol_has_air_anti_air = lambda world, player: SC2WoLLogic._sc2wol_has_air_anti_air(self, world, player) self._sc2wol_has_competent_anti_air = lambda world, player: SC2WoLLogic._sc2wol_has_competent_anti_air(self, world, player) + self._sc2wol_has_competent_ground_to_air = lambda world, player: SC2WoLLogic._sc2wol_has_competent_ground_to_air(self, world, player) self._sc2wol_has_anti_air = lambda world, player: SC2WoLLogic._sc2wol_has_anti_air(self, world, player) self._sc2wol_defense_rating = lambda world, player, zerg_enemy, air_enemy=False: SC2WoLLogic._sc2wol_defense_rating(self, world, player, zerg_enemy, air_enemy) self._sc2wol_has_competent_comp = lambda world, player: SC2WoLLogic._sc2wol_has_competent_comp(self, world, player) @@ -210,6 +293,8 @@ class ValidInventory: self._sc2wol_has_protoss_common_units = lambda world, player: SC2WoLLogic._sc2wol_has_protoss_common_units(self, world, player) self._sc2wol_has_protoss_medium_units = lambda world, player: SC2WoLLogic._sc2wol_has_protoss_medium_units(self, world, player) self._sc2wol_has_mm_upgrade = lambda world, player: SC2WoLLogic._sc2wol_has_mm_upgrade(self, world, player) + self._sc2wol_welcome_to_the_jungle_requirement = lambda world, player: SC2WoLLogic._sc2wol_welcome_to_the_jungle_requirement(self, world, player) + self._sc2wol_can_respond_to_colony_infestations = lambda world, player: SC2WoLLogic._sc2wol_can_respond_to_colony_infestations(self, world, player) self._sc2wol_final_mission_requirements = lambda world, player: SC2WoLLogic._sc2wol_final_mission_requirements(self, world, player) def __init__(self, multiworld: MultiWorld, player: int, @@ -230,7 +315,7 @@ class ValidInventory: 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 = item_table[item.name] + item_info = get_full_item_list()[item.name] if item_info.type == "Upgrade": # Locking upgrades based on mission duration if item.name not in item_quantities: diff --git a/worlds/sc2wol/Regions.py b/worlds/sc2wol/Regions.py index 03363666..f588ce7e 100644 --- a/worlds/sc2wol/Regions.py +++ b/worlds/sc2wol/Regions.py @@ -1,10 +1,14 @@ from typing import List, Set, Dict, Tuple, Optional, Callable from BaseClasses import MultiWorld, Region, Entrance, Location from .Locations import LocationData -from .Options import get_option_value -from .MissionTables import MissionInfo, mission_orders, vanilla_mission_req_table, alt_final_mission_locations, MissionPools +from .Options import get_option_value, MissionOrder +from .MissionTables import MissionInfo, mission_orders, vanilla_mission_req_table, alt_final_mission_locations, \ + MissionPools, vanilla_shuffle_order from .PoolFilter import filter_missions +PROPHECY_CHAIN_MISSION_COUNT = 4 + +VANILLA_SHUFFLED_FIRST_PROPHECY_MISSION = 21 def create_regions(multiworld: MultiWorld, player: int, locations: Tuple[LocationData, ...], location_cache: List[Location])\ -> Tuple[Dict[str, MissionInfo], int, str]: @@ -19,7 +23,7 @@ def create_regions(multiworld: MultiWorld, player: int, locations: Tuple[Locatio names: Dict[str, int] = {} - if mission_order_type == 0: + if mission_order_type == MissionOrder.option_vanilla: # Generating all regions and locations for region_name in vanilla_mission_req_table.keys(): @@ -108,12 +112,17 @@ def create_regions(multiworld: MultiWorld, player: int, locations: Tuple[Locatio removals = len(mission_order) - mission_pool_size # Removing entire Prophecy chain on vanilla shuffled when not shuffling protoss if remove_prophecy: - removals -= 4 + removals -= PROPHECY_CHAIN_MISSION_COUNT # Initial fill out of mission list and marking all-in mission for mission in mission_order: # Removing extra missions if mission pool is too small - if 0 < mission.removal_priority <= removals or mission.category == 'Prophecy' and remove_prophecy: + # Also handle lower removal priority than Prophecy + if 0 < mission.removal_priority <= removals or mission.category == 'Prophecy' and remove_prophecy \ + or (remove_prophecy and mission_order_type == MissionOrder.option_vanilla_shuffled + and mission.removal_priority > vanilla_shuffle_order[ + VANILLA_SHUFFLED_FIRST_PROPHECY_MISSION].removal_priority + and 0 < mission.removal_priority <= removals + PROPHECY_CHAIN_MISSION_COUNT): missions.append(None) elif mission.type == MissionPools.FINAL: missions.append(final_mission) @@ -191,22 +200,38 @@ def create_regions(multiworld: MultiWorld, player: int, locations: Tuple[Locatio # TODO: Handle 'and' connections mission_req_table = {} + def build_connection_rule(mission_names: List[str], missions_req: int) -> Callable: + if len(mission_names) > 1: + return lambda state: state.has_all({f"Beat {name}" for name in mission_names}, player) and \ + state._sc2wol_cleared_missions(multiworld, player, missions_req) + else: + return lambda state: state.has(f"Beat {mission_names[0]}", player) and \ + state._sc2wol_cleared_missions(multiworld, player, missions_req) + for i, mission in enumerate(missions): if mission is None: continue connections = [] + all_connections = [] + for connection in mission_order[i].connect_to: + if connection == -1: + continue + while missions[connection] is None: + connection -= 1 + all_connections.append(missions[connection]) for connection in mission_order[i].connect_to: required_mission = missions[connection] if connection == -1: connect(multiworld, player, names, "Menu", mission) - elif required_mission is None: - continue else: + if required_mission is None and not mission_order[i].completion_critical: # Drop non-critical null slots + continue + while required_mission is None: # Substituting null slot with prior slot + connection -= 1 + required_mission = missions[connection] + required_missions = [required_mission] if mission_order[i].or_requirements else all_connections connect(multiworld, player, names, required_mission, mission, - (lambda name, missions_req: (lambda state: state.has(f"Beat {name}", player) and - state._sc2wol_cleared_missions(multiworld, player, - missions_req))) - (missions[connection], mission_order[i].number)) + build_connection_rule(required_missions, mission_order[i].number)) connections.append(slot_map[connection]) mission_req_table.update({mission: MissionInfo( diff --git a/worlds/sc2wol/__init__.py b/worlds/sc2wol/__init__.py index 49052429..93aebb7a 100644 --- a/worlds/sc2wol/__init__.py +++ b/worlds/sc2wol/__init__.py @@ -3,11 +3,11 @@ import typing from typing import List, Set, Tuple, Dict from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification from worlds.AutoWorld import WebWorld, World -from .Items import StarcraftWoLItem, item_table, filler_items, item_name_groups, get_full_item_list, \ - get_basic_units -from .Locations import get_locations +from .Items import StarcraftWoLItem, filler_items, item_name_groups, get_item_table, get_full_item_list, \ + get_basic_units, ItemData, upgrade_included_names, progressive_if_nco +from .Locations import get_locations, LocationType from .Regions import create_regions -from .Options import sc2wol_options, get_option_value +from .Options import sc2wol_options, get_option_value, LocationInclusion from .LogicMixin import SC2WoLLogic from .PoolFilter import filter_missions, filter_items, get_item_upgrades from .MissionTables import starting_mission_locations, MissionInfo @@ -36,7 +36,7 @@ class SC2WoLWorld(World): web = Starcraft2WoLWebWorld() data_version = 4 - item_name_to_id = {name: data.code for name, data in item_table.items()} + item_name_to_id = {name: data.code for name, data in get_full_item_list().items()} location_name_to_id = {location.name: location.code for location in get_locations(None, None)} option_definitions = sc2wol_options @@ -69,6 +69,8 @@ class SC2WoLWorld(World): starter_items = assign_starter_items(self.multiworld, self.player, excluded_items, self.locked_locations) + filter_locations(self.multiworld, self.player, self.locked_locations, self.location_cache) + pool = get_item_pool(self.multiworld, self.player, self.mission_req_table, starter_items, excluded_items, self.location_cache) fill_item_pool_with_dummy_items(self, self.multiworld, self.player, self.locked_locations, self.location_cache, pool) @@ -109,16 +111,6 @@ def setup_events(player: int, locked_locations: typing.List[str], location_cache def get_excluded_items(multiworld: MultiWorld, player: int) -> Set[str]: excluded_items: Set[str] = set() - if get_option_value(multiworld, player, "upgrade_bonus") == 1: - excluded_items.add("Ultra-Capacitors") - else: - excluded_items.add("Vanadium Plating") - - if get_option_value(multiworld, player, "bunker_upgrade") == 1: - excluded_items.add("Shrike Turret") - else: - excluded_items.add("Fortified Bunker") - for item in multiworld.precollected_items[player]: excluded_items.add(item.name) @@ -167,7 +159,7 @@ def assign_starter_item(multiworld: MultiWorld, player: int, excluded_items: Set def get_item_pool(multiworld: MultiWorld, player: int, mission_req_table: Dict[str, MissionInfo], - starter_items: List[str], excluded_items: Set[str], location_cache: List[Location]) -> List[Item]: + starter_items: List[Item], excluded_items: Set[str], location_cache: List[Location]) -> List[Item]: pool: List[Item] = [] # For the future: goal items like Artifact Shards go here @@ -176,17 +168,43 @@ def get_item_pool(multiworld: MultiWorld, player: int, mission_req_table: Dict[s # YAML items yaml_locked_items = get_option_value(multiworld, player, 'locked_items') - for name, data in item_table.items(): - if name not in excluded_items: - for _ in range(data.quantity): - item = create_item_with_correct_settings(player, name) - if name in yaml_locked_items: - locked_items.append(item) - else: - pool.append(item) + # Adjust generic upgrade availability based on options + include_upgrades = get_option_value(multiworld, player, 'generic_upgrade_missions') == 0 + upgrade_items = get_option_value(multiworld, player, 'generic_upgrade_items') + + # Include items from outside Wings of Liberty + item_sets = {'wol'} + if get_option_value(multiworld, player, 'nco_items'): + item_sets.add('nco') + if get_option_value(multiworld, player, 'bw_items'): + item_sets.add('bw') + if get_option_value(multiworld, player, 'ext_items'): + item_sets.add('ext') + + def allowed_quantity(name: str, data: ItemData) -> int: + if name in excluded_items \ + or data.type == "Upgrade" and (not include_upgrades or name not in upgrade_included_names[upgrade_items]) \ + or not data.origin.intersection(item_sets): + return 0 + elif name in progressive_if_nco and 'nco' not in item_sets: + return 1 + else: + return data.quantity + + for name, data in get_item_table(multiworld, player).items(): + for i in range(allowed_quantity(name, data)): + item = create_item_with_correct_settings(player, name) + if name in yaml_locked_items: + locked_items.append(item) + else: + pool.append(item) existing_items = starter_items + [item for item in multiworld.precollected_items[player]] existing_names = [item.name for item in existing_items] + + # Check the parent item integrity, exclude items + pool[:] = [item for item in pool if pool_contains_parent(item, pool + locked_items + existing_items)] + # Removing upgrades for excluded items for item_name in excluded_items: if item_name in existing_names: @@ -207,8 +225,100 @@ def fill_item_pool_with_dummy_items(self: SC2WoLWorld, multiworld: MultiWorld, p def create_item_with_correct_settings(player: int, name: str) -> Item: - data = item_table[name] + data = get_full_item_list()[name] item = Item(name, data.classification, data.code, player) return item + + +def pool_contains_parent(item: Item, pool: [Item]): + item_data = get_full_item_list().get(item.name) + if item_data.parent_item is None: + # The item has not associated parent, the item is valid + return True + parent_item = item_data.parent_item + # Check if the pool contains the parent item + return parent_item in [pool_item.name for pool_item in pool] + + +def filter_locations(multiworld: MultiWorld, player, locked_locations: List[str], location_cache: List[Location]): + """ + Filters the locations in the world using a trash or Nothing item + :param multiworld: + :param player: + :param locked_locations: + :param location_cache: + :return: + """ + open_locations = [location for location in location_cache if location.item is None] + plando_locations = get_plando_locations(multiworld, player) + mission_progress_locations = get_option_value(multiworld, player, "mission_progress_locations") + bonus_locations = get_option_value(multiworld, player, "bonus_locations") + challenge_locations = get_option_value(multiworld, player, "challenge_locations") + optional_boss_locations = get_option_value(multiworld, player, "optional_boss_locations") + location_data = get_locations(multiworld, player) + for location in open_locations: + # Go through the locations that aren't locked yet (early unit, etc) + if location.name not in plando_locations: + # The location is not plando'd + sc2_location = [sc2_location for sc2_location in location_data if sc2_location.name == location.name][0] + location_type = sc2_location.type + + if location_type == LocationType.MISSION_PROGRESS \ + and mission_progress_locations != LocationInclusion.option_enabled: + item_name = get_exclusion_item(multiworld, mission_progress_locations) + place_exclusion_item(item_name, location, locked_locations, player) + + if location_type == LocationType.BONUS \ + and bonus_locations != LocationInclusion.option_enabled: + item_name = get_exclusion_item(multiworld, bonus_locations) + place_exclusion_item(item_name, location, locked_locations, player) + + if location_type == LocationType.CHALLENGE \ + and challenge_locations != LocationInclusion.option_enabled: + item_name = get_exclusion_item(multiworld, challenge_locations) + place_exclusion_item(item_name, location, locked_locations, player) + + if location_type == LocationType.OPTIONAL_BOSS \ + and optional_boss_locations != LocationInclusion.option_enabled: + item_name = get_exclusion_item(multiworld, optional_boss_locations) + place_exclusion_item(item_name, location, locked_locations, player) + + +def place_exclusion_item(item_name, location, locked_locations, player): + item = create_item_with_correct_settings(player, item_name) + location.place_locked_item(item) + locked_locations.append(location.name) + + +def get_exclusion_item(multiworld: MultiWorld, option) -> str: + """ + Gets the exclusion item according to settings (trash/nothing) + :param multiworld: + :param option: + :return: Item used for location exclusion + """ + if option == LocationInclusion.option_nothing: + return "Nothing" + elif option == LocationInclusion.option_trash: + index = multiworld.random.randint(0, len(filler_items) - 1) + return filler_items[index] + raise Exception(f"Unsupported option type: {option}") + + +def get_plando_locations(multiworld: MultiWorld, player) -> List[str]: + """ + + :param multiworld: + :param player: + :return: A list of locations affected by a plando in a world + """ + plando_locations = [] + for plando_setting in multiworld.plando_items[player]: + plando_locations += plando_setting.get("locations", []) + plando_setting_location = plando_setting.get("location", None) + if plando_setting_location is not None: + plando_locations.append(plando_setting_location) + + return plando_locations
+ Starting Resources
+ Weapon & Armor Upgrades
+ Base
 
+
Infantry
+ Vehicles
+
Starships
- Dominion -
+ Mercenaries
- Lab Upgrades + + General Upgrades
+ Protoss Units