From 03594ca20b2ccfd296df8afafd4b3a0d6fb2daea Mon Sep 17 00:00:00 2001 From: Katelyn Gigante Date: Thu, 11 Dec 2025 13:52:19 +1100 Subject: [PATCH] Fix UT Yamlless gen --- src/__init__.py | 23 +++++++++++------------ src/hooks/Data.py | 6 ------ src/hooks/World.py | 8 ++++++++ 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/__init__.py b/src/__init__.py index 7f0cb4b1..13e92677 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -33,8 +33,7 @@ before_generate_basic, after_generate_basic, \ before_fill_slot_data, after_fill_slot_data, before_write_spoiler, \ before_extend_hint_information, after_extend_hint_information, \ - after_collect_item, after_remove_item, before_generate_early -from .hooks.Data import hook_interpret_slot_data + after_collect_item, after_remove_item, before_generate_early, hook_interpret_slot_data class ManualWorld(World): __doc__ = world_description @@ -68,23 +67,17 @@ class ManualWorld(World): victory_names = victory_names # UT (the universal-est of trackers) can now generate without a YAML - ut_can_gen_without_yaml = False # Temporary disable until we fix the bugs with it + ut_can_gen_without_yaml = True def get_filler_item_name(self) -> str: return hook_get_filler_item_name(self, self.multiworld, self.player) or self.filler_item_name - def interpret_slot_data(self, slot_data: dict[str, Any]): + def interpret_slot_data(self, slot_data: dict[str, Any]) -> dict[str, Any]: #this is called by tools like UT if not slot_data: - return False + return {} - regen = False - for key, value in slot_data.items(): - if key in self.options_dataclass.type_hints: - getattr(self.options, key).value = value - regen = True - - regen = hook_interpret_slot_data(self, self.player, slot_data) or regen + regen = hook_interpret_slot_data(self, self.player, slot_data) or slot_data return regen @classmethod @@ -93,6 +86,12 @@ def stage_assert_generate(cls, multiworld) -> None: def generate_early(self) -> None: before_generate_early(self, self.multiworld, self.player) + if hasattr(self.multiworld, "re_gen_passthrough"): + slot_data = self.multiworld.re_gen_passthrough.get(self.game, {}) + if slot_data: + for key, value in slot_data.items(): + if hasattr(self.options, key): + getattr(self.options, key).value = value def create_regions(self): before_create_regions(self, self.multiworld, self.player) diff --git a/src/hooks/Data.py b/src/hooks/Data.py index 31bb3f74..37b028c8 100644 --- a/src/hooks/Data.py +++ b/src/hooks/Data.py @@ -35,9 +35,3 @@ def after_load_option_file(option_table: dict) -> dict: # for more info check https://github.com/ArchipelagoMW/Archipelago/blob/main/docs/world%20api.md#webworld-class def after_load_meta_file(meta_table: dict) -> dict: return meta_table - -# called when an external tool (eg Universal Tracker) ask for slot data to be read -# use this if you want to restore more data -# return True if you want to trigger a regeneration if you changed anything -def hook_interpret_slot_data(world, player: int, slot_data: dict[str, any]) -> dict | bool: - return False diff --git a/src/hooks/World.py b/src/hooks/World.py index 97b2860a..930f476b 100644 --- a/src/hooks/World.py +++ b/src/hooks/World.py @@ -1,4 +1,5 @@ # Object classes from AP core, to represent an entire MultiWorld and this individual World that's part of it +from typing import Any from worlds.AutoWorld import World from BaseClasses import MultiWorld, CollectionState, Item @@ -190,3 +191,10 @@ def before_extend_hint_information(hint_data: dict[int, dict[int, str]], world: def after_extend_hint_information(hint_data: dict[int, dict[int, str]], world: World, multiworld: MultiWorld, player: int) -> None: pass + +def hook_interpret_slot_data(world: World, player: int, slot_data: dict[str, Any]) -> dict[str, Any]: + """ + Called when Universal Tracker wants to perform a fake generation + Use this if you want to use or modify the slot_data for passed into re_gen_passthrough + """ + return slot_data