From 7f5f14ddb5a67e1ccfdc7aa3d68d829473d0b745 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 1 Sep 2025 14:50:47 -0400 Subject: [Client] Handle progressive doors --- client/Archipelago/manager.gd | 70 ++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 27 deletions(-) (limited to 'client/Archipelago/manager.gd') diff --git a/client/Archipelago/manager.gd b/client/Archipelago/manager.gd index 97c556a..0186a09 100644 --- a/client/Archipelago/manager.gd +++ b/client/Archipelago/manager.gd @@ -15,12 +15,13 @@ var connection_history = [] var client var _localdata_file = "" -var _received_indexes = [] var _last_new_item = -1 var _batch_locations = false var _held_locations = [] +var _item_locks = {} var victory_condition = -1 +var shuffle_doors = false signal could_not_connect signal connect_status @@ -96,7 +97,6 @@ func saveLocaldata(): func connectToServer(): - _received_indexes = [] _last_new_item = -1 client.connectToServer(ap_server, ap_user, ap_pass) @@ -111,35 +111,25 @@ func disconnect_from_ap(): func get_item_id_for_door(door_id): - var gamedata = global.get_node("Gamedata") - var door = gamedata.objects.get_doors()[door_id] - if ( - door.get_type() == gamedata.SCRIPT_proto.DoorType.EVENT - or door.get_type() == gamedata.SCRIPT_proto.DoorType.LOCATION_ONLY - or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR - ): - return null - return gamedata.get_door_ap_id(door_id) - - -func has_item(item_id): - return client.hasItem(item_id) - - -func _process_item(item, index, from, flags): - if index != null: - if _received_indexes.has(index): - # Do not re-process items. - return + return _item_locks.get(door_id, null) - _received_indexes.append(index) +func _process_item(item, index, from, flags, amount): var item_name = "Unknown" if client._item_id_to_name["Lingo 2"].has(item): item_name = client._item_id_to_name["Lingo 2"][item] var gamedata = global.get_node("Gamedata") var door_id = gamedata.door_id_by_ap_id.get(item, null) + var prog_id = null + + if door_id == null: + prog_id = gamedata.progressive_id_by_ap_id.get(item, null) + if prog_id != null: + var progressive = gamedata.objects.get_progressives()[prog_id] + if progressive.get_doors().size() >= amount: + door_id = progressive.get_doors()[amount - 1] + if door_id != null and gamedata.get_door_map_name(door_id) == global.map: var receivers = gamedata.get_door_receivers(door_id) var scene = get_tree().get_root().get_node_or_null("scene") @@ -165,11 +155,18 @@ func _process_item(item, index, from, flags): var item_color = colorForItemType(flags) + var full_item_name = item_name + if prog_id != null and door_id != null: + var door = gamedata.objects.get_doors()[door_id] + full_item_name = "%s (%s)" % [item_name, door.get_name()] + var message if from == client._slot: - message = "Found [color=%s]%s[/color]" % [item_color, item_name] + message = "Found [color=%s]%s[/color]" % [item_color, full_item_name] else: - message = "Received [color=%s]%s[/color] from %s" % [item_color, item_name, player_name] + message = ( + "Received [color=%s]%s[/color] from %s" % [item_color, full_item_name, player_name] + ) global._print(message) @@ -271,6 +268,8 @@ func _client_connect_status(message): func _client_connected(slot_data): + var gamedata = global.get_node("Gamedata") + _localdata_file = "user://archipelago_data/%s_%d" % [client._seed, client._slot] _last_new_item = -1 @@ -288,8 +287,25 @@ func _client_connected(slot_data): if localdata.size() > 0: _last_new_item = localdata[0] - if slot_data.has("victory_condition"): - victory_condition = int(slot_data["victory_condition"]) + # Read slot data. + victory_condition = int(slot_data.get("victory_condition", 0)) + shuffle_doors = bool(slot_data.get("shuffle_doors", false)) + + # Set up item locks. + _item_locks = {} + + if shuffle_doors: + for door in gamedata.objects.get_doors(): + if ( + door.get_type() == gamedata.SCRIPT_proto.DoorType.STANDARD + or door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY + ): + _item_locks[door.get_id()] = [door.get_ap_id(), 1] + + for progressive in gamedata.objects.get_progressives(): + for i in range(0, progressive.get_doors().size()): + var door = gamedata.objects.get_doors()[progressive.get_doors()[i]] + _item_locks[door.get_id()] = [progressive.get_ap_id(), i + 1] emit_signal("ap_connected") -- cgit 1.4.1