From b0f474bee1c8e1111f7542bf4985136d9aedf340 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 27 Sep 2025 17:14:40 -0400 Subject: Treat local letters as items for tracker Local letters are now synced with datastorage, so they transfer to other computers like regular items would, and the tracker also now waits until you collect local letters before showing what they give you in logic. --- apworld/client/client.gd | 25 ++++++++++++------------- apworld/client/gamedata.gd | 7 +++++++ apworld/client/keyboard.gd | 36 ++++++++++++++++++++++++++++++++++-- apworld/client/manager.gd | 1 + 4 files changed, 54 insertions(+), 15 deletions(-) (limited to 'apworld/client') diff --git a/apworld/client/client.gd b/apworld/client/client.gd index 286ad4b..3d4096f 100644 --- a/apworld/client/client.gd +++ b/apworld/client/client.gd @@ -33,6 +33,7 @@ signal item_sent_notification(message) signal hint_received(message) signal accessible_locations_updated signal checked_locations_updated +signal keyboard_update_received func _init(): @@ -157,6 +158,13 @@ func _on_web_socket_server_message_received(_peer_id: int, packet: String) -> vo accessible_locations_updated.emit() + elif cmd == "UpdateKeyboard": + var updates = {} + for k in message["updates"]: + updates[k] = int(message["updates"][k]) + + keyboard_update_received.emit(updates) + func connectToServer(server, un, pw): sendMessage([{"cmd": "Connect", "server": server, "player": un, "password": pw}]) @@ -202,19 +210,6 @@ func sendLocations(loc_ids): sendMessage([{"cmd": "LocationChecks", "locations": loc_ids}]) -func setValue(key, value, operation = "replace"): - sendMessage( - [ - { - "cmd": "Set", - "key": "Lingo2_%d_%s" % [_slot, key], - "want_reply": false, - "operations": [{"operation": operation, "value": value}] - } - ] - ) - - func say(textdata): sendMessage([{"cmd": "Say", "text": textdata}]) @@ -227,6 +222,10 @@ func scoutLocations(loc_ids): sendMessage([{"cmd": "LocationScouts", "locations": loc_ids}]) +func updateKeyboard(updates): + sendMessage([{"cmd": "UpdateKeyboard", "keyboard": updates}]) + + func sendQuit(): sendMessage([{"cmd": "Quit"}]) diff --git a/apworld/client/gamedata.gd b/apworld/client/gamedata.gd index 39e0583..13ec568 100644 --- a/apworld/client/gamedata.gd +++ b/apworld/client/gamedata.gd @@ -161,6 +161,13 @@ func get_door_ap_id(door_id): return null +func get_door_map_name(door_id): + var door = objects.get_doors()[door_id] + var room = objects.get_rooms()[door.get_room_id()] + var map = objects.get_maps()[room.get_map_id()] + return map.get_name() + + func get_door_receivers(door_id): var door = objects.get_doors()[door_id] return door.get_receivers() diff --git a/apworld/client/keyboard.gd b/apworld/client/keyboard.gd index 450566d..a59c4d0 100644 --- a/apworld/client/keyboard.gd +++ b/apworld/client/keyboard.gd @@ -48,6 +48,9 @@ func load_seed(): if localdata.size() > 2: keyholder_state = localdata[2] + if not letters_saved.is_empty(): + ap.client.updateKeyboard(letters_saved) + for k in kALL_LETTERS: var level = 0 @@ -105,10 +108,20 @@ func update_unlocks(): func collect_local_letter(key, level): - if level < 0 or level > 2 or level < letters_saved.get(key, 0): + var ap = global.get_node("Archipelago") + var true_level = 0 + + if ap.get_letter_behavior(key, false) == ap.kLETTER_BEHAVIOR_VANILLA: + true_level += 1 + if level == 2 and ap.get_letter_behavior(key, true) == ap.kLETTER_BEHAVIOR_VANILLA: + true_level += 1 + + if true_level < letters_saved.get(key, 0): return - letters_saved[key] = level + letters_saved[key] = true_level + + ap.client.updateKeyboard({key: true_level}) if letters_blocked.has(key): letters_blocked.erase(key) @@ -197,3 +210,22 @@ func reset_keyholders(): save() return cleared_anything + + +func remote_keyboard_updated(updates): + var reverse = {} + var should_update = false + + for k in updates: + if not letters_saved.has(k) or updates[k] > letters_saved[k]: + letters_saved[k] = updates[k] + should_update = true + elif updates[k] < letters_saved[k]: + reverse[k] = letters_saved[k] + + if should_update: + update_unlocks() + + if not reverse.is_empty(): + var ap = global.get_node("Archipelago") + ap.client.updateKeyboard(reverse) diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index e7765dd..afa3ebe 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd @@ -118,6 +118,7 @@ func _ready(): keyboard = SCRIPT_keyboard.new() add_child(keyboard) + client.keyboard_update_received.connect(keyboard.remote_keyboard_updated) func saveSettings(): -- cgit 1.4.1