From 7544b11c86fd597321a507747fbd0fe1491ccbd8 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 22 Oct 2025 21:58:43 -0400 Subject: Implemented latched doors in the client --- apworld/client/client.gd | 17 +++++++++++++++++ apworld/client/door.gd | 31 ++++++++++++++++++++++++++++++- apworld/client/manager.gd | 15 +++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) (limited to 'apworld/client') diff --git a/apworld/client/client.gd b/apworld/client/client.gd index 9a4b402..ce5ac7e 100644 --- a/apworld/client/client.gd +++ b/apworld/client/client.gd @@ -25,6 +25,7 @@ var _slot_data = {} var _accessible_locations = [] var _accessible_worldports = [] var _goal_accessible = false +var _latched_doors = [] signal could_not_connect signal connect_status @@ -34,6 +35,7 @@ signal location_scout_received(location_id, item_name, player_name, flags, for_s signal text_message_received(message) signal item_sent_notification(message) signal hint_received(message) +signal door_latched(id) signal accessible_locations_updated signal checked_locations_updated signal checked_worldports_updated @@ -189,6 +191,14 @@ func _on_web_socket_server_message_received(_peer_id: int, packet: String) -> vo message["type"], int(message.get("id", null)), message["path"] ) + elif cmd == "UpdateLatches": + for id in message["latches"]: + var iid = int(id) + if not _latched_doors.has(iid): + _latched_doors.append(iid) + + door_latched.emit(iid) + func connectToServer(server, un, pw): sendMessage([{"cmd": "Connect", "server": server, "player": un, "password": pw}]) @@ -255,6 +265,13 @@ func checkWorldport(port_id): sendMessage([{"cmd": "CheckWorldport", "port_id": port_id}]) +func latchDoor(id): + if not _latched_doors.has(id): + _latched_doors.append(id) + + sendMessage([{"cmd": "LatchDoor", "door": id}]) + + func getLogicalPath(object_type, object_id): var msg = {"cmd": "GetPath", "type": object_type} if object_id != null: diff --git a/apworld/client/door.gd b/apworld/client/door.gd index 49f5728..63cfa99 100644 --- a/apworld/client/door.gd +++ b/apworld/client/door.gd @@ -1,7 +1,9 @@ extends "res://scripts/nodes/door.gd" +var door_id var item_id var item_amount +var latched = false func _ready(): @@ -10,7 +12,7 @@ func _ready(): ) var gamedata = global.get_node("Gamedata") - var door_id = gamedata.get_door_for_map_node_path(global.map, node_path) + door_id = gamedata.get_door_for_map_node_path(global.map, node_path) if door_id != null: var ap = global.get_node("Archipelago") var item_lock = ap.get_item_id_for_door(door_id) @@ -27,6 +29,12 @@ func _ready(): self.excludeSenders = [] call_deferred("_readier") + else: + var door_data = gamedata.objects.get_doors()[door_id] + if door_data.has_latch() and door_data.get_latch(): + _check_latched.call_deferred(door_id) + + latched = true if global.map == "the_sun_temple": if name == "spe_EndPlatform" or name == "spe_entry_2": @@ -44,3 +52,24 @@ func _readier(): if ap.client.getItemAmount(item_id) >= item_amount: handleTriggered() + + +func _check_latched(door_id): + var ap = global.get_node("Archipelago") + + if ap.client._latched_doors.has(door_id): + triggered = total + handleTriggered() + + +func handleTriggered(): + super.handleTriggered() + + if latched and ran: + var ap = global.get_node("Archipelago") + ap.client.latchDoor(door_id) + + +func handleUntriggered(): + if not latched or not ran: + super.handleUntriggered() diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index dac09b2..a17bee8 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd @@ -141,6 +141,7 @@ func _ready(): client.accessible_locations_updated.connect(_on_accessible_locations_updated) client.checked_locations_updated.connect(_on_checked_locations_updated) client.checked_worldports_updated.connect(_on_checked_worldports_updated) + client.door_latched.connect(_on_door_latched) client.could_not_connect.connect(_client_could_not_connect) client.connect_status.connect(_client_connect_status) @@ -376,6 +377,20 @@ func _on_checked_worldports_updated(): textclient_node.update_worldports() +func _on_door_latched(door_id): + var gamedata = global.get_node("Gamedata") + if gamedata.get_door_map_name(door_id) != global.map: + return + + var receivers = gamedata.get_door_receivers(door_id) + var scene = get_tree().get_root().get_node_or_null("scene") + if scene != null: + for receiver in receivers: + var rnode = scene.get_node_or_null(receiver) + if rnode != null: + rnode.handleTriggered() + + func _client_could_not_connect(message): could_not_connect.emit(message) -- cgit 1.4.1