From 6fd6d493cd16b41bf88742ff6f4b7635ec3fa67c Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Thu, 28 Aug 2025 14:25:50 -0400 Subject: Client is starting to work! --- client/Archipelago/settings_screen.gd | 173 ++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 client/Archipelago/settings_screen.gd (limited to 'client/Archipelago/settings_screen.gd') diff --git a/client/Archipelago/settings_screen.gd b/client/Archipelago/settings_screen.gd new file mode 100644 index 0000000..90d5437 --- /dev/null +++ b/client/Archipelago/settings_screen.gd @@ -0,0 +1,173 @@ +extends Node2D + + +func _ready(): + # Some helpful logging. + if Steam.isSubscribed(): + global._print("Provisioning successful! Build ID: %d" % Steam.getAppBuildId()) + else: + global._print("Provisioning failed.") + + # Undo the load screen removing our cursor + get_tree().get_root().set_disable_input(false) + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + + # Increase the WebSocket input buffer size so that we can download large + # data packages. + ProjectSettings.set_setting("network/limits/websocket_client/max_in_buffer_kb", 8192) + + # Create the global AP manager, if it doesn't already exist. + if not global.has_node("Archipelago"): + var ap_script = ResourceLoader.load("user://maps/Archipelago/manager.gd") + var ap_instance = ap_script.new() + ap_instance.name = "Archipelago" + + #apclient_instance.SCRIPT_doorControl = load("user://maps/Archipelago/doorControl.gd") + #apclient_instance.SCRIPT_effects = load("user://maps/Archipelago/effects.gd") + #apclient_instance.SCRIPT_location = load("user://maps/Archipelago/location.gd") + #apclient_instance.SCRIPT_mypainting = load("user://maps/Archipelago/mypainting.gd") + #apclient_instance.SCRIPT_panel = load("user://maps/Archipelago/panel.gd") + #apclient_instance.SCRIPT_textclient = load("user://maps/Archipelago/textclient.gd") + + ap_instance.SCRIPT_client = load("user://maps/Archipelago/client.gd") + ap_instance.SCRIPT_locationListener = load("user://maps/Archipelago/locationListener.gd") + ap_instance.SCRIPT_uuid = load("user://maps/Archipelago/vendor/uuid.gd") + + global.add_child(ap_instance) + + # Let's also inject any scripts we need to inject now. + installScriptExtension(ResourceLoader.load("user://maps/Archipelago/door.gd")) + installScriptExtension(ResourceLoader.load("user://maps/Archipelago/painting.gd")) + installScriptExtension(ResourceLoader.load("user://maps/Archipelago/player.gd")) + + var proto_script = load("user://maps/Archipelago/generated/proto.gd") + var gamedata_script = load("user://maps/Archipelago/gamedata.gd") + var gamedata_instance = gamedata_script.new(proto_script) + gamedata_instance.load( + FileAccess.get_file_as_bytes("user://maps/Archipelago/generated/data.binpb") + ) + gamedata_instance.name = "Gamedata" + global.add_child(gamedata_instance) + + var ap = global.get_node("Archipelago") + ap.connect("ap_connected", connectionSuccessful) + ap.connect("could_not_connect", connectionUnsuccessful) + ap.connect("connect_status", connectionStatus) + + # Populate textboxes with AP settings. + $Panel/server_box.text = ap.ap_server + $Panel/player_box.text = ap.ap_user + $Panel/password_box.text = ap.ap_pass + + var history_box = $Panel/connection_history + if ap.connection_history.is_empty(): + history_box.disabled = true + else: + history_box.disabled = false + + var i = 0 + for details in ap.connection_history: + history_box.get_popup().add_item("%s (%s)" % [details[1], details[0]], i) + i += 1 + + history_box.get_popup().connect("id_pressed", historySelected) + + # Show client version. + $Panel/title.text = "ARCHIPELAGO (%s)" % ap.my_version + + # Increase font size in text boxes. + $Panel/server_box.add_theme_font_size_override("font_size", 36) + $Panel/player_box.add_theme_font_size_override("font_size", 36) + $Panel/password_box.add_theme_font_size_override("font_size", 36) + + +# Adapted from https://gitlab.com/Delta-V-Modding/Mods/-/blob/main/game/ModLoader.gd +func installScriptExtension(childScript: Resource): + # Force Godot to compile the script now. + # We need to do this here to ensure that the inheritance chain is + # properly set up, and multiple mods can chain-extend the same + # class multiple times. + # This is also needed to make Godot instantiate the extended class + # when creating singletons. + # The actual instance is thrown away. + childScript.new() + + var parentScript = childScript.get_base_script() + var parentScriptPath = parentScript.resource_path + global._print("ModLoader: Installing script extension over %s" % parentScriptPath) + childScript.take_over_path(parentScriptPath) + + +func connectionStatus(message): + var popup = self.get_node("Panel/AcceptDialog") + popup.title = "Connecting to Archipelago" + popup.dialog_text = message + popup.exclusive = true + popup.get_ok_button().visible = false + popup.popup_centered() + + +func connectionSuccessful(): + var ap = global.get_node("Archipelago") + + # Save connection details + var connection_details = [ap.ap_server, ap.ap_user, ap.ap_pass] + if ap.connection_history.has(connection_details): + ap.connection_history.erase(connection_details) + ap.connection_history.push_front(connection_details) + if ap.connection_history.size() > 10: + ap.connection_history.resize(10) + ap.saveSettings() + + # Switch to the_entry + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + global.user = ap.getSaveFileName() + global.universe = "lingo" + global.map = "the_entry" + + unlocks.resetKeys() + unlocks.resetCollectables() + unlocks.resetData() + unlocks.loadKeys() + unlocks.loadCollectables() + unlocks.loadData() + unlocks.unlockKey("capslock", 1) + + clearResourceCache("res://objects/nodes/door.tscn") + clearResourceCache("res://objects/nodes/player.tscn") + + var paintings_dir = DirAccess.open("res://objects/meshes/paintings") + if paintings_dir: + paintings_dir.list_dir_begin() + var file_name = paintings_dir.get_next() + while file_name != "": + if not paintings_dir.current_is_dir() and file_name.ends_with(".tscn"): + clearResourceCache("res://objects/meshes/paintings/" + file_name) + file_name = paintings_dir.get_next() + + switcher.switch_map("res://objects/scenes/the_entry.tscn") + + +func connectionUnsuccessful(error_message): + $Panel/connect_button.disabled = false + + var popup = $Panel/AcceptDialog + popup.title = "Could not connect to Archipelago" + popup.dialog_text = error_message + popup.exclusive = true + popup.get_ok_button().visible = true + popup.popup_centered() + + +func historySelected(index): + var ap = global.get_node("Archipelago") + var details = ap.connection_history[index] + + $Panel/server_box.text = details[0] + $Panel/player_box.text = details[1] + $Panel/password_box.text = details[2] + + +func clearResourceCache(path): + ResourceLoader.load_threaded_request(path, "", false, ResourceLoader.CACHE_MODE_REPLACE) + ResourceLoader.load_threaded_get(path) -- cgit 1.4.1