From 7aa62e5c0ac0d86e5aed2ead2a7116ea0edbffde Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 16 Apr 2023 16:09:37 -0400 Subject: Implemented color shuffle --- Archipelago/client.gd | 20 ++++++++++++++++++++ Archipelago/doorControl.gd | 3 +-- Archipelago/load.gd | 12 ++++++++++++ Archipelago/painting_eye.gd | 3 +-- Archipelago/panel.gd | 39 +++++++++++++++++++++++++++++++++++++++ Archipelago/settings_screen.gd | 5 +++++ 6 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 Archipelago/panel.gd (limited to 'Archipelago') diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 5b4d81e..8f20d0a 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -6,6 +6,9 @@ var ap_pass = "" const ap_version = {"major": 0, "minor": 4, "build": 0, "class": "Version"} const orange_tower = ["Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh"] +const color_items = [ + "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" +] var _client = WebSocketClient.new() var _last_state = WebSocketPeer.STATE_CLOSED @@ -36,14 +39,18 @@ var _panel_ids_by_location = {} var _localdata_file = "" var _death_link = false var _victory_condition = 0 # THE END, THE MASTER +var _door_shuffle = false +var _color_shuffle = false var _map_loaded = false var _held_items = [] var _held_locations = [] var _last_new_item = -1 var _tower_floors = 0 +var _has_colors = ["white"] signal client_connected +signal evaluate_solvability func _init(): @@ -154,6 +161,10 @@ func _on_data(): if _slot_data.has("victory_condition"): _victory_condition = _slot_data["victory_condition"] + if _slot_data.has("shuffle_colors"): + _color_shuffle = _slot_data["shuffle_colors"] + if _slot_data.has("shuffle_doors"): + _door_shuffle = (_slot_data["shuffle_doors"] > 0) _localdata_file = "user://archipelago/%s_%d" % [_seed, _slot] var ap_file = File.new() @@ -365,6 +376,9 @@ func completedGoal(): func mapFinishedLoading(): if !_map_loaded: + _has_colors = ["white"] + emit_signal("evaluate_solvability") + for item in _held_items: processItem(item["item"], item["index"], item["from"]) @@ -396,6 +410,12 @@ func processItem(item, index, from): processItem(_item_name_to_id[subitem_name], null, null) _tower_floors += 1 + if _color_shuffle and color_items.has(_item_id_to_name[item]): + var lcol = _item_id_to_name[item].to_lower() + if not _has_colors.has(lcol): + _has_colors.append(lcol) + emit_signal("evaluate_solvability") + # Show a message about the item if it's new. if index != null and index > _last_new_item: _last_new_item = index diff --git a/Archipelago/doorControl.gd b/Archipelago/doorControl.gd index 011b0e0..f64f9e2 100644 --- a/Archipelago/doorControl.gd +++ b/Archipelago/doorControl.gd @@ -2,9 +2,8 @@ extends "res://scripts/doorControl.gd" func handle_correct(): - # TODO: Right now we are just assuming that door shuffle is on. var apclient = global.get_node("Archipelago") - if apclient.doorIsVanilla(self.get_parent().name + "/" + self.name): + if not apclient._door_shuffle or apclient.doorIsVanilla(self.get_parent().name + "/" + self.name): .handle_correct() diff --git a/Archipelago/load.gd b/Archipelago/load.gd index 7b7e648..f9dc65f 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd @@ -38,6 +38,18 @@ func _load(): "answer_correct", location, "handle_correct" ) + # Attach a script to every panel so that we can do things like conditionally + # disable them. + var gamedata = apclient.get_node("Gamedata") + var panel_script = ResourceLoader.load("user://maps/Archipelago/panel.gd") + for panel in gamedata.panels: + var panel_node = panels_parent.get_node(panel["id"]) + var script_instance = panel_script.new() + script_instance.name = "AP_Panel" + script_instance.data = panel + panel_node.add_child(script_instance) + apclient.connect("evaluate_solvability", script_instance, "evaluate_solvability") + # Hook up the goal panel. if apclient._victory_condition == 1: var the_master = self.get_node("Panels/Countdown Panels/Panel_master_master") diff --git a/Archipelago/painting_eye.gd b/Archipelago/painting_eye.gd index 86e0ce9..53d42b5 100644 --- a/Archipelago/painting_eye.gd +++ b/Archipelago/painting_eye.gd @@ -2,9 +2,8 @@ extends "res://scripts/painting_eye.gd" func _answer_correct(): - # TODO: Right now we are just assuming that door shuffle is on. var apclient = global.get_node("Archipelago") - if apclient.paintingIsVanilla(self.name): + if not apclient._door_shuffle or apclient.paintingIsVanilla(self.name): ._answer_correct() diff --git a/Archipelago/panel.gd b/Archipelago/panel.gd new file mode 100644 index 0000000..6ec5e14 --- /dev/null +++ b/Archipelago/panel.gd @@ -0,0 +1,39 @@ +extends Node + +var data = {} +var orig_text = "" +var orig_color = Color(0, 0, 0, 0) + + +func _ready(): + orig_text = self.get_parent().get_node("Viewport/GUI/Panel/Label").text + orig_color = self.get_parent().get_node("Quad").get_surface_material(0).albedo_color + + +func evaluate_solvability(): + var apclient = global.get_node("Archipelago") + + var solvable = true + var missing = [] + + if apclient._color_shuffle: + for color in data["color"]: + if not apclient._has_colors.has(color): + missing.append(color) + solvable = false + + if solvable: + self.get_parent().get_node("Viewport/GUI/Panel/Label").text = orig_text + self.get_parent().get_node("Viewport/GUI/Panel/TextEdit").editable = true + self.get_parent().get_node("Quad").get_surface_material(0).albedo_color = orig_color + else: + var missing_text = "Missing: " + for thing in missing: + missing_text += thing + ",\n" + missing_text = missing_text.left(missing_text.length() - 2) + + self.get_parent().get_node("Viewport/GUI/Panel/Label").text = missing_text + self.get_parent().get_node("Viewport/GUI/Panel/TextEdit").editable = false + self.get_parent().get_node("Quad").get_surface_material(0).albedo_color = Color( + 0.7, 0.2, 0.2 + ) diff --git a/Archipelago/settings_screen.gd b/Archipelago/settings_screen.gd index 06bebd1..6700b9c 100644 --- a/Archipelago/settings_screen.gd +++ b/Archipelago/settings_screen.gd @@ -13,6 +13,11 @@ func _ready(): apclient_instance.name = "Archipelago" global.add_child(apclient_instance) + var apdata = ResourceLoader.load("user://maps/Archipelago/gamedata.gd") + var apdata_instance = apdata.new() + apdata_instance.name = "Gamedata" + apclient_instance.add_child(apdata_instance) + # Let's also inject any scripts we need to inject now. installScriptExtension("user://maps/Archipelago/doorControl.gd") installScriptExtension("user://maps/Archipelago/load.gd") -- cgit 1.4.1