From 048b6bdc607c61bf04766162970933e818a7173a Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 28 Sep 2025 15:11:48 -0400 Subject: Added checked worldports tab to tracker --- apworld/client/manager.gd | 5 +++ apworld/client/textclient.gd | 94 +++++++++++++++++++++++++++++++++++++++++++- apworld/context.py | 1 + 3 files changed, 99 insertions(+), 1 deletion(-) diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index 3facfba..5b731d2 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd @@ -333,6 +333,7 @@ func _on_checked_worldports_updated(): var textclient_node = global.get_node("Textclient") if textclient_node != null: textclient_node.update_locations() + textclient_node.update_worldports() func _client_could_not_connect(message): @@ -449,6 +450,10 @@ func _client_connected(slot_data): _inverse_item_locks[lock[0]].append([door_id, lock[1]]) + if shuffle_worldports: + var textclient = global.get_node("Textclient") + textclient.setup_worldports() + ap_connected.emit() diff --git a/apworld/client/textclient.gd b/apworld/client/textclient.gd index 1a0ce5c..0c4e675 100644 --- a/apworld/client/textclient.gd +++ b/apworld/client/textclient.gd @@ -8,10 +8,14 @@ var tracker_label var is_open = false var locations_overlay - var location_texture var worldport_texture +var worldports_tab +var worldports_tree +var port_tree_item_by_map = {} +var port_tree_item_by_map_port = {} + func _ready(): process_mode = ProcessMode.PROCESS_MODE_ALWAYS @@ -87,6 +91,22 @@ func _ready(): tracker_label = RichTextLabel.new() tracker_margins.add_child(tracker_label) + worldports_tab = MarginContainer.new() + worldports_tab.name = "Worldports" + worldports_tab.add_theme_constant_override("margin_top", 60) + worldports_tab.add_theme_constant_override("margin_left", 60) + worldports_tab.add_theme_constant_override("margin_right", 60) + worldports_tab.add_theme_constant_override("margin_bottom", 60) + tabs.add_child(worldports_tab) + tabs.set_tab_hidden(2, true) + + worldports_tree = Tree.new() + worldports_tree.columns = 2 + worldports_tree.hide_root = true + worldports_tree.theme = preload("res://assets/themes/baseUI.tres") + worldports_tree.add_theme_font_size_override("font_size", 24) + worldports_tab.add_child(worldports_tree) + var runtime = global.get_node("Runtime") var location_image = Image.new() location_image.load_png_from_buffer(runtime.read_path("assets/location.png")) @@ -199,5 +219,77 @@ func update_locations_visibility(): locations_overlay.visible = ap.show_locations +func setup_worldports(): + tabs.set_tab_hidden(2, false) + + var root_ti = worldports_tree.create_item(null) + + var ports_by_map_id = {} + var display_names_by_map_id = {} + var display_names_by_port_id = {} + + var ap = global.get_node("Archipelago") + var gamedata = global.get_node("Gamedata") + for fpid in ap.port_pairings: + var port = gamedata.objects.get_ports()[fpid] + var room = gamedata.objects.get_rooms()[port.get_room_id()] + + if not ports_by_map_id.has(room.get_map_id()): + ports_by_map_id[room.get_map_id()] = [] + + var map = gamedata.objects.get_maps()[room.get_map_id()] + display_names_by_map_id[map.get_id()] = map.get_display_name() + + ports_by_map_id[room.get_map_id()].append(fpid) + display_names_by_port_id[fpid] = port.get_display_name() + + var sorted_map_ids = ports_by_map_id.keys().duplicate() + sorted_map_ids.sort_custom( + func(a, b): return display_names_by_map_id[a] < display_names_by_map_id[b] + ) + + for map_id in sorted_map_ids: + var map_ti = root_ti.create_child() + map_ti.set_text(0, display_names_by_map_id[map_id]) + map_ti.visible = false + map_ti.collapsed = true + port_tree_item_by_map[map_id] = map_ti + port_tree_item_by_map_port[map_id] = {} + + var port_ids = ports_by_map_id[map_id] + port_ids.sort_custom( + func(a, b): return display_names_by_port_id[a] < display_names_by_port_id[b] + ) + + for port_id in port_ids: + var port_ti = map_ti.create_child() + port_ti.set_text(0, display_names_by_port_id[port_id]) + port_ti.set_text(1, gamedata.get_worldport_display_name(ap.port_pairings[port_id])) + port_ti.visible = false + port_tree_item_by_map_port[map_id][port_id] = port_ti + + update_worldports() + + +func update_worldports(): + var ap = global.get_node("Archipelago") + + for map_id in port_tree_item_by_map_port.keys(): + var map_visible = false + + for port_id in port_tree_item_by_map_port[map_id].keys(): + var ti = port_tree_item_by_map_port[map_id][port_id] + ti.visible = ap.client._checked_worldports.has(port_id) + + if ti.visible: + map_visible = true + + port_tree_item_by_map[map_id].visible = map_visible + + func reset(): locations_overlay.clear() + tabs.set_tab_hidden(2, true) + port_tree_item_by_map.clear() + port_tree_item_by_map_port.clear() + worldports_tree.clear() diff --git a/apworld/context.py b/apworld/context.py index 4a85868..35ba483 100644 --- a/apworld/context.py +++ b/apworld/context.py @@ -495,6 +495,7 @@ async def process_game_cmd(manager: Lingo2Manager, args: dict): updates = manager.update_worldports(worldports) if len(updates) > 0: async_start(manager.client_ctx.update_worldports(updates), name="client update worldports") + manager.game_ctx.send_update_worldports(updates) elif cmd == "Quit": manager.client_ctx.exit_event.set() -- cgit 1.4.1