From b53d1f94582ebc62eb0520f041f83baecb747c0a Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 4 Oct 2025 16:06:32 -0400 Subject: Added button to get logical path --- apworld/tracker.py | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'apworld/tracker.py') diff --git a/apworld/tracker.py b/apworld/tracker.py index 7239b65..c65317c 100644 --- a/apworld/tracker.py +++ b/apworld/tracker.py @@ -1,6 +1,6 @@ -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Iterator -from BaseClasses import MultiWorld, CollectionState, ItemClassification +from BaseClasses import MultiWorld, CollectionState, ItemClassification, Region, Entrance from NetUtils import NetworkItem from . import Lingo2World, Lingo2Item from .regions import connect_ports_from_ut @@ -110,3 +110,34 @@ class Tracker: elif hasattr(location, "goal") and location.goal: if not self.manager.goaled: self.goal_accessible = True + + def get_path_to_location(self, location_id: int) -> list[str] | None: + location_name = self.world.location_id_to_name.get(location_id) + location = self.multiworld.get_location(location_name, PLAYER_NUM) + return self.get_logical_path(location.parent_region) + + def get_path_to_port(self, port_id: int) -> list[str] | None: + port = self.world.static_logic.objects.ports[port_id] + region_name = self.world.static_logic.get_room_region_name(port.room_id) + region = self.multiworld.get_region(region_name, PLAYER_NUM) + return self.get_logical_path(region) + + def get_path_to_goal(self): + room_id = self.world.player_logic.goal_room_id + region_name = self.world.static_logic.get_room_region_name(room_id) + region = self.multiworld.get_region(region_name, PLAYER_NUM) + return self.get_logical_path(region) + + def get_logical_path(self, region: Region) -> list[str] | None: + if region not in self.state.path: + return None + + def flist_to_iter(path_value) -> Iterator[str]: + while path_value: + region_or_entrance, path_value = path_value + yield region_or_entrance + + reversed_path = self.state.path.get(region) + flat_path = reversed(list(map(str, flist_to_iter(reversed_path)))) + + return list(flat_path)[1::2] -- cgit 1.4.1