From e448f5b318f05cae1b40a949e11ef2d7fb613645 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 15 Apr 2024 11:39:52 -0400 Subject: Implemented panels mode door shuffle --- Archipelago/client.gd | 70 ++++++++++++++++++++++++++++++++++++++++++----- Archipelago/load.gd | 2 ++ Archipelago/panel.gd | 9 +++++- util/generate_gamedata.rb | 38 +++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 8 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index f15afe6..cafe2f9 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -21,7 +21,7 @@ const ap_version = {"major": 0, "minor": 4, "build": 5, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" ] -const progressive_items = { +const door_progressive_items = { "Progressive Orange Tower": [ {"item": "Orange Tower - Second Floor", "display": "Second Floor"}, @@ -65,6 +65,40 @@ const progressive_items = { {"item": "The Colorful - Gray Door", "display": "Gray"}, ] } +const panel_progressive_items = { + "Progressive Hallway Room": + [ + {"item": "Hallway Room - First Room Panels", "display": "First Door"}, + {"item": "Hallway Room - Second Room Panels", "display": "Second Door"}, + {"item": "Hallway Room - Third Room Panels", "display": "Third Door"}, + {"item": "Hallway Room - WHEEL", "display": "Fourth Door"}, + ], + "Progressive Colorful": + [ + {"item": "The Colorful - BEGIN (Panel)", "display": "White"}, + {"item": "The Colorful - FOUND (Panel)", "display": "Black"}, + {"item": "The Colorful - LOAF (Panel)", "display": "Red"}, + {"item": "The Colorful - CREAM (Panel)", "display": "Yellow"}, + {"item": "The Colorful - SUN (Panel)", "display": "Blue"}, + {"item": "The Colorful - SPOON (Panel)", "display": "Purple"}, + {"item": "The Colorful - LETTERS (Panel)", "display": "Orange"}, + {"item": "The Colorful - WALLS (Panel)", "display": "Green"}, + {"item": "The Colorful - IRON (Panel)", "display": "Brown"}, + {"item": "The Colorful - OBSTACLE (Panel)", "display": "Gray"}, + ], + "Progressive Number Hunt": + [ + {"item": "Two Panels", "display": "Two"}, + {"item": "Three Panels", "display": "Three"}, + {"item": "Four Panels", "display": "Four"}, + {"item": "Five Panels", "display": "Five"}, + {"item": "Six Panels", "display": "Six"}, + {"item": "Seven Panels", "display": "Seven"}, + {"item": "Eight Panels", "display": "Eight"}, + {"item": "Nine Panels", "display": "Nine"}, + {"item": "Outside The Undeterred - ZERO (Panel)", "display": "Zero"}, + ] +} const kTHE_END = 0 const kTHE_MASTER = 1 @@ -109,6 +143,7 @@ var _localdata_file = "" var _death_link = false var _victory_condition = 0 # THE END, THE MASTER, LEVEL 2 var _door_shuffle = false +var _panel_door_shuffle = false var _color_shuffle = false var _panel_shuffle = 0 # none, rearrange var _painting_shuffle = false @@ -278,7 +313,8 @@ func _on_data(): 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) + _door_shuffle = (_slot_data["shuffle_doors"] == 2) + _panel_door_shuffle = (_slot_data["shuffle_doors"] == 1) if _slot_data.has("shuffle_paintings"): _painting_shuffle = _slot_data["shuffle_paintings"] if _slot_data.has("shuffle_panels"): @@ -668,6 +704,12 @@ func processItem(item, index, from, flags): for door_id in gamedata.door_ids_by_item_id[int(item)]: doorsNode.get_node(door_id).openDoor() + if gamedata.panel_ids_by_item_id.has(int(item)): + var panelsNode = get_tree().get_root().get_node("Spatial/Panels") + for panel_id in gamedata.panel_ids_by_item_id[int(item)]: + panelsNode.get_node(panel_id).get_node("AP_Panel").locked = false + emit_signal("evaluate_solvability") + if gamedata.painting_ids_by_item_id.has(int(item)): var real_parent_node = get_tree().get_root().get_node("Spatial/Decorations/Paintings") var fake_parent_node = get_tree().get_root().get_node_or_null("Spatial/AP_Paintings") @@ -683,12 +725,22 @@ func processItem(item, index, from, flags): painting_node.get_node("Script").movePainting() # Handle progressive items. - if item_name in progressive_items.keys(): + if _door_shuffle and item_name in door_progressive_items.keys(): + if not item_name in _progressive_progress: + _progressive_progress[item_name] = 0 + + if _progressive_progress[item_name] < door_progressive_items[item_name].size(): + var subitem_name = door_progressive_items[item_name][_progressive_progress[item_name]]["item"] + global._print(subitem_name) + processItem(_item_name_to_id[subitem_name], null, null, null) + _progressive_progress[item_name] += 1 + + if _panel_door_shuffle and item_name in panel_progressive_items.keys(): if not item_name in _progressive_progress: _progressive_progress[item_name] = 0 - if _progressive_progress[item_name] < progressive_items[item_name].size(): - var subitem_name = progressive_items[item_name][_progressive_progress[item_name]]["item"] + if _progressive_progress[item_name] < panel_progressive_items[item_name].size(): + var subitem_name = panel_progressive_items[item_name][_progressive_progress[item_name]]["item"] global._print(subitem_name) processItem(_item_name_to_id[subitem_name], null, null, null) _progressive_progress[item_name] += 1 @@ -704,8 +756,12 @@ func processItem(item, index, from, flags): _last_new_item = index saveLocaldata() - if item_name in progressive_items: - var subitem = progressive_items[item_name][_progressive_progress[item_name] - 1] + if _door_shuffle and item_name in door_progressive_items: + var subitem = door_progressive_items[item_name][_progressive_progress[item_name] - 1] + item_name += " (%s)" % subitem["display"] + + if _panel_door_shuffle and item_name in panel_progressive_items: + var subitem = panel_progressive_items[item_name][_progressive_progress[item_name] - 1] item_name += " (%s)" % subitem["display"] var player_name = "Unknown" diff --git a/Archipelago/load.gd b/Archipelago/load.gd index 566ee39..82f8e94 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd @@ -568,6 +568,8 @@ func _load(): var script_instance = panel_script.new() script_instance.name = "AP_Panel" script_instance.data = panel + if apclient._panel_door_shuffle and gamedata.mentioned_panels.has(panel["id"]): + script_instance.locked = true panel_node.add_child(script_instance) apclient.connect("evaluate_solvability", script_instance, "evaluate_solvability") diff --git a/Archipelago/panel.gd b/Archipelago/panel.gd index aec18e8..0e8f1df 100644 --- a/Archipelago/panel.gd +++ b/Archipelago/panel.gd @@ -5,6 +5,7 @@ var orig_text = "" var atbash_text = "" var orig_color = Color(0, 0, 0, 0) var solvable = true +var locked = false const kAtbashPre = "abcdefghijklmnopqrstuvwxyz1234567890+-" const kAtbashPost = "zyxwvutsrqponmlkjihgfedcba0987654321-+" @@ -45,7 +46,13 @@ func evaluate_solvability(): missing.append(color) solvable = false - if solvable: + if locked: + self.get_parent().get_node("Viewport/GUI/Panel/Label").text = "Locked" + 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.2, 0.7, 0.7 + ) + elif solvable: if effects.atbash_remaining > 0: self.get_parent().get_node("Viewport/GUI/Panel/Label").text = atbash_text else: diff --git a/util/generate_gamedata.rb b/util/generate_gamedata.rb index f63e062..a3f9ba5 100644 --- a/util/generate_gamedata.rb +++ b/util/generate_gamedata.rb @@ -11,14 +11,17 @@ CLASSIFICATION_INSANITY = 4 panel_to_id = {} door_groups = {} +panel_groups = {} panel_output = [] door_ids_by_item_id = {} painting_ids_by_item_id = {} +panel_ids_by_item_id = {} panel_ids_by_location_id = {} classification_by_location_id = {} mentioned_doors = Set[] mentioned_paintings = Set[] +mentioned_panels = Set[] painting_output = {} ids_config = YAML.load_file(idspath) @@ -155,6 +158,26 @@ config.each do |room_name, room_data| end end end + + if room_data.include? "panel_doors" + room_data["panel_doors"].each do |panel_door_name, panel_door| + item_id = ids_config["panel_doors"][room_name][panel_door_name] + + panel_ids_by_item_id[item_id] = panel_door["panels"].map do |panel_identifier| + other_room_name = (panel_identifier.kind_of? String) ? room_name : panel_identifier["room"] + other_panel_name = (panel_identifier.kind_of? String) ? panel_identifier : panel_identifier["panel"] + + config[other_room_name]["panels"][other_panel_name]["id"] + end + + mentioned_panels.merge(panel_ids_by_item_id[item_id]) + + if panel_door.include? "panel_group" + panel_groups[panel_door["panel_group"]] ||= Set[] + panel_groups[panel_door["panel_group"]].merge(panel_ids_by_item_id[item_id]) + end + end + end end door_groups.each do |group_name, door_ids| @@ -162,6 +185,11 @@ door_groups.each do |group_name, door_ids| door_ids_by_item_id[item_id] = door_ids.to_a end +panel_groups.each do |group_name, panel_ids| + item_id = ids_config["panel_groups"][group_name] + panel_ids_by_item_id[item_id] = panel_ids.to_a +end + File.open(outputpath, "w") do |f| f.write "extends Node\n\nvar panels = [" f.write(panel_output.map do |panel| @@ -175,6 +203,12 @@ File.open(outputpath, "w") do |f| "\"#{door_id}\"" end.join(",") + "]" end.join(",")) + f.write "}\nvar panel_ids_by_item_id = {" + f.write(panel_ids_by_item_id.map do |item_id, panel_ids| + "#{item_id}:[" + panel_ids.map do |panel_id| + "\"#{panel_id}\"" + end.join(",") + "]" + end.join(",")) f.write "}\nvar painting_ids_by_item_id = {" f.write(painting_ids_by_item_id.map do |item_id, painting_ids| "#{item_id}:[" + painting_ids.map do |painting_id| @@ -195,6 +229,10 @@ File.open(outputpath, "w") do |f| f.write(mentioned_paintings.map do |painting_id| "\"#{painting_id}\"" end.join(",")) + f.write "]\nvar mentioned_panels = [" + f.write(mentioned_panels.map do |panel_id| + "\"#{panel_id}\"" + end.join(",")) f.write "]\nvar paintings = {" f.write(painting_output.map do |painting_id, painting| "\"#{painting_id}\":{\"orientation\":\"#{painting["orientation"]}\",\"move\":#{painting.include? "move" and painting["move"]}}" -- cgit 1.4.1 From 49d7ff22aae922ef081bac1aa2a4b47b2b079166 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 15 Apr 2024 12:56:19 -0400 Subject: Backwards compatibility for games genned before panels mode options changes --- Archipelago/client.gd | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index cafe2f9..63c82f4 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -128,6 +128,7 @@ var _item_name_to_id = {} # LINGO only var _location_name_to_id = {} # LINGO only var _remote_version = {"major": 0, "minor": 0, "build": 0} +var _gen_version = {"major": 0, "minor": 0, "build": 0} # TODO: caching per MW/slot, reset between connections var _authenticated = false @@ -265,6 +266,7 @@ func _on_data(): if cmd == "RoomInfo": _seed = message["seed_name"] _remote_version = message["version"] + _gen_version = message["generator_version"] var needed_games = [] for game in message["datapackage_checksums"].keys(): @@ -313,8 +315,13 @@ func _on_data(): if _slot_data.has("shuffle_colors"): _color_shuffle = _slot_data["shuffle_colors"] if _slot_data.has("shuffle_doors"): - _door_shuffle = (_slot_data["shuffle_doors"] == 2) - _panel_door_shuffle = (_slot_data["shuffle_doors"] == 1) + # TODO: This assumes that panels mode will be releaed in 0.4.6, which is untrue. + if wasGeneratedBeforeVersion({"major": 0, "minor": 4, "build": 6}): + _door_shuffle = (_slot_data["shuffle_doors"] > 0) + _panel_door_shuffle = false + else: + _door_shuffle = (_slot_data["shuffle_doors"] == 2) + _panel_door_shuffle = (_slot_data["shuffle_doors"] == 1) if _slot_data.has("shuffle_paintings"): _painting_shuffle = _slot_data["shuffle_paintings"] if _slot_data.has("shuffle_panels"): @@ -831,3 +838,17 @@ func colorForItemType(flags): return "#d63a22" else: # filler return "#14de9e" + + +func compareVersion(lhs, rhs): + if lhs["major"] == rhs["major"]: + if lhs["minor"] == rhs["minor"]: + return lhs["build"] < rhs["build"] + else: + return lhs["minor"] < rhs["minor"] + else: + return lhs["major"] < rhs["major"] + + +func wasGeneratedBeforeVersion(rhs): + return compareVersion(_gen_version, rhs) -- cgit 1.4.1 From 4302e550cde189d8bc1d111e81270ed7960ad77c Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Tue, 16 Apr 2024 16:29:02 -0400 Subject: Better compatibility mode --- Archipelago/client.gd | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 63c82f4..6fe2cab 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -315,13 +315,12 @@ func _on_data(): if _slot_data.has("shuffle_colors"): _color_shuffle = _slot_data["shuffle_colors"] if _slot_data.has("shuffle_doors"): - # TODO: This assumes that panels mode will be releaed in 0.4.6, which is untrue. - if wasGeneratedBeforeVersion({"major": 0, "minor": 4, "build": 6}): - _door_shuffle = (_slot_data["shuffle_doors"] > 0) - _panel_door_shuffle = false - else: + if _slot_data.has("group_doors"): _door_shuffle = (_slot_data["shuffle_doors"] == 2) _panel_door_shuffle = (_slot_data["shuffle_doors"] == 1) + else: + _door_shuffle = (_slot_data["shuffle_doors"] > 0) + _panel_door_shuffle = false if _slot_data.has("shuffle_paintings"): _painting_shuffle = _slot_data["shuffle_paintings"] if _slot_data.has("shuffle_panels"): -- cgit 1.4.1 From 5c22b3c8d1268310553dd4ef78141dbf43d9da18 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 27 Apr 2024 12:15:48 -0400 Subject: Fixed panel progressive items --- Archipelago/client.gd | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 0944352..e5e930f 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -36,38 +36,11 @@ const door_progressive_items = { ["1 Sunwarp", "2 Sunwarp", "3 Sunwarp", "4 Sunwarp", "5 Sunwarp", "6 Sunwarp"] } const panel_progressive_items = { - "Progressive Hallway Room": - [ - {"item": "Hallway Room - First Room Panels", "display": "First Door"}, - {"item": "Hallway Room - Second Room Panels", "display": "Second Door"}, - {"item": "Hallway Room - Third Room Panels", "display": "Third Door"}, - {"item": "Hallway Room - WHEEL", "display": "Fourth Door"}, - ], + "Progressive Hallway Room": ["First Door", "Second Door", "Third Door", "Fourth Door"], "Progressive Colorful": - [ - {"item": "The Colorful - BEGIN (Panel)", "display": "White"}, - {"item": "The Colorful - FOUND (Panel)", "display": "Black"}, - {"item": "The Colorful - LOAF (Panel)", "display": "Red"}, - {"item": "The Colorful - CREAM (Panel)", "display": "Yellow"}, - {"item": "The Colorful - SUN (Panel)", "display": "Blue"}, - {"item": "The Colorful - SPOON (Panel)", "display": "Purple"}, - {"item": "The Colorful - LETTERS (Panel)", "display": "Orange"}, - {"item": "The Colorful - WALLS (Panel)", "display": "Green"}, - {"item": "The Colorful - IRON (Panel)", "display": "Brown"}, - {"item": "The Colorful - OBSTACLE (Panel)", "display": "Gray"}, - ], + ["White", "Black", "Red", "Yellow", "Blue", "Purple", "Orange", "Green", "Brown", "Gray"], "Progressive Number Hunt": - [ - {"item": "Two Panels", "display": "Two"}, - {"item": "Three Panels", "display": "Three"}, - {"item": "Four Panels", "display": "Four"}, - {"item": "Five Panels", "display": "Five"}, - {"item": "Six Panels", "display": "Six"}, - {"item": "Seven Panels", "display": "Seven"}, - {"item": "Eight Panels", "display": "Eight"}, - {"item": "Nine Panels", "display": "Nine"}, - {"item": "Outside The Undeterred - ZERO (Panel)", "display": "Zero"}, - ] + ["Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Zero"] } const kTHE_END = 0 -- cgit 1.4.1 From 60f8b6a0a1db6275453689a40d2432ec0f3ee0cb Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 27 Apr 2024 12:35:08 -0400 Subject: Fixed progressive item name display --- Archipelago/client.gd | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index e5e930f..c0b5366 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -722,16 +722,21 @@ func processItem(item, index, from, flags): var is_progressive_door = int(item) in gamedata.door_items_by_progressive_id var is_progressive_panel = int(item) in gamedata.panel_items_by_progressive_id var progitems = null + var prognames = null if is_progressive_door and is_progressive_panel: if _door_shuffle: progitems = gamedata.door_items_by_progressive_id[int(item)] + prognames = door_progressive_items else: progitems = gamedata.panel_items_by_progressive_id[int(item)] + prognames = panel_progressive_items elif is_progressive_door: progitems = gamedata.door_items_by_progressive_id[int(item)] + prognames = door_progressive_items elif is_progressive_panel: progitems = gamedata.panel_items_by_progressive_id[int(item)] + prognames = panel_progressive_items if progitems != null: if not int(item) in _progressive_progress: @@ -741,6 +746,7 @@ func processItem(item, index, from, flags): var subitem_id = progitems[_progressive_progress[int(item)]] global._print("Subitem: %d" % subitem_id) processItem(subitem_id, null, null, null) + item_name += " (%s)" % prognames[item_name][_progressive_progress[int(item)]] _progressive_progress[int(item)] += 1 if _color_shuffle and color_items.has(_item_id_to_name[item]): @@ -754,14 +760,6 @@ func processItem(item, index, from, flags): _last_new_item = index saveLocaldata() - if _door_shuffle and item_name in door_progressive_items: - var subitem = door_progressive_items[item_name][_progressive_progress[int(item)] - 1] - item_name += " (%s)" % subitem["display"] - - if _panel_door_shuffle and item_name in panel_progressive_items: - var subitem = panel_progressive_items[item_name][_progressive_progress[int(item)] - 1] - item_name += " (%s)" % subitem["display"] - var player_name = "Unknown" if _player_name_by_slot.has(from): player_name = _player_name_by_slot[from] -- cgit 1.4.1 From fad5732724e672735062502d94300c36551148de Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 29 Apr 2024 10:25:20 -0400 Subject: Added new progressive panel doors --- Archipelago/client.gd | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index c0b5366..0f1c651 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -40,7 +40,9 @@ const panel_progressive_items = { "Progressive Colorful": ["White", "Black", "Red", "Yellow", "Blue", "Purple", "Orange", "Green", "Brown", "Gray"], "Progressive Number Hunt": - ["Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Zero"] + ["Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Zero"], + "Progressive Symmetry Room": ["Near Far", "Warts Straw", "Leaf Feel"], + "Progressive Suits Area": ["Words Sword", "Lost", "Amen Name"] } const kTHE_END = 0 -- cgit 1.4.1 From 0e10801d335a52d3e88ad02a5f3ff9784a53a119 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 1 May 2024 16:00:34 -0400 Subject: Prevent puzzle skipping locked panels --- Archipelago/panel.gd | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Archipelago/panel.gd b/Archipelago/panel.gd index 9d30455..ce632c5 100644 --- a/Archipelago/panel.gd +++ b/Archipelago/panel.gd @@ -40,25 +40,27 @@ func evaluate_solvability(): solvable = true var missing = [] - if apclient._color_shuffle: + if locked: + solvable = false + elif apclient._color_shuffle: for color in data["color"]: if not apclient._has_colors.has(color): missing.append(color) solvable = false - if locked: - self.get_parent().get_node("Viewport/GUI/Panel/Label").text = "Locked" - 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.2, 0.7, 0.7 - ) - elif solvable: + if solvable: if effects.atbash_remaining > 0: self.get_parent().get_node("Viewport/GUI/Panel/Label").text = atbash_text else: 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 + elif locked: + self.get_parent().get_node("Viewport/GUI/Panel/Label").text = "Locked" + 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.2, 0.7, 0.7 + ) else: var missing_text = "Missing: " for thing in missing: -- cgit 1.4.1 From 6b5b85f96fc855810ac21e96e1aeb9cbde0fe88e Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 14 Jul 2024 08:55:09 -0400 Subject: Released v4.0.2 --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c5113a..1174ce7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # lingo-archipelago Releases +## v4.0.2 - 2024-07-14 + +- Multiplayer mode now shows a player's alias in addition to their slot name. +- Messages are now cleared out between connections. +- Fixed issue where traps and Geronimo state could persist when switching from + an active slot to a new slot. + +Download: +[lingo-archipelago-v4.0.2.zip](https://files.fourisland.com/releases/lingo-archipelago/lingo-archipelago-v4.0.2.zip)
+Source: [v4.0.2](https://code.fourisland.com/lingo-archipelago/tag/?h=v4.0.2) + ## v4.0.1 - 2024-07-02 - Fixed issue where paired panels would become proxied on panelsanity under -- cgit 1.4.1 From 9ef676bab06b08f12e6fc8c8e2b56db70cea5ac3 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Tue, 16 Jul 2024 14:01:49 -0400 Subject: Set beta version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 325418f..a990fa2 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -18,7 +18,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "4.0.2" +const my_version = "panels-beta6" const ap_version = {"major": 0, "minor": 5, "build": 0, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From 400ad1ed74166d3f01adf6d97f07a16ec391f2a9 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 2 Sep 2024 11:49:12 -0400 Subject: Added text client --- Archipelago/client.gd | 44 +++++++++++++++++++++ Archipelago/load.gd | 6 +++ Archipelago/pause_menu.gd | 5 +++ Archipelago/settings_screen.gd | 1 + Archipelago/textclient.gd | 88 ++++++++++++++++++++++++++++++++++++++++++ README.md | 3 ++ 6 files changed, 147 insertions(+) create mode 100644 Archipelago/textclient.gd diff --git a/Archipelago/client.gd b/Archipelago/client.gd index aa50069..f58b3d6 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -8,6 +8,7 @@ var SCRIPT_mypainting var SCRIPT_notifier var SCRIPT_panel var SCRIPT_pilgrimage_terminator +var SCRIPT_textclient var SCRIPT_uuid var ap_server = "" @@ -451,6 +452,8 @@ func _on_data(): i += 1 elif cmd == "PrintJSON": + parse_printjson(message) + if ( !message.has("receiving") or !message.has("item") @@ -684,6 +687,10 @@ func setValue(key, value, operation = "replace"): ) +func say(textdata): + sendMessage([{"cmd": "Say", "text": textdata}]) + + func completedGoal(): sendMessage([{"cmd": "StatusUpdate", "status": 30}]) # CLIENT_GOAL @@ -855,6 +862,43 @@ func colorForItemType(flags): return "#14de9e" +func parse_printjson(message): + var parts = [] + for message_part in message["data"]: + if !message_part.has("type") and message_part.has("text"): + parts.append(message_part["text"]) + elif message_part["type"] == "player_id": + if int(message_part["text"]) == _slot: + parts.append("[color=#ee00ee]%s[/color]" % _player_name_by_slot[_slot]) + else: + var from = float(message_part["text"]) + parts.append("[color=#fafad2]%s[/color]" % _player_name_by_slot[from]) + elif message_part["type"] == "item_id": + var item_name = "Unknown" + var item_player_game = _game_by_player[message_part["player"]] + if _item_id_to_name[item_player_game].has(float(message_part["text"])): + item_name = _item_id_to_name[item_player_game][float(message_part["text"])] + + parts.append( + "[color=%s]%s[/color]" % [colorForItemType(message_part["flags"]), item_name] + ) + elif message_part["type"] == "location_id": + var location_name = "Unknown" + var location_player_game = _game_by_player[message_part["player"]] + if _location_id_to_name[location_player_game].has(float(message_part["text"])): + location_name = _location_id_to_name[location_player_game][float( + message_part["text"] + )] + + parts.append("[color=#00ff7f]%s[/color]" % location_name) + elif message_part.has("text"): + parts.append(message_part["text"]) + + var textclient_node = get_tree().get_root().get_node_or_null("Spatial/AP_TextClient") + if textclient_node != null: + textclient_node.parse_printjson("".join(parts)) + + func compareVersion(lhs, rhs): if lhs["major"] == rhs["major"]: if lhs["minor"] == rhs["minor"]: diff --git a/Archipelago/load.gd b/Archipelago/load.gd index 931dfde..c35525b 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd @@ -663,6 +663,12 @@ func _load(): effects.set_name("AP_Effects") self.add_child(effects) + # Create the textclient node. + var textclient_script = apclient.SCRIPT_textclient + var textclient = textclient_script.new() + textclient.set_name("AP_TextClient") + self.add_child(textclient) + # Create the multiplayer node, if needed. if apclient.enable_multiplayer: var multiplayer_node = apclient.SCRIPT_multiplayer.new() diff --git a/Archipelago/pause_menu.gd b/Archipelago/pause_menu.gd index 40994d9..62ba6c3 100644 --- a/Archipelago/pause_menu.gd +++ b/Archipelago/pause_menu.gd @@ -6,3 +6,8 @@ func _main_menu(): apclient.disconnect_from_ap() ._main_menu() + + +func _pause_game(): + get_tree().get_root().get_node("Spatial/AP_TextClient").dismiss() + ._pause_game() diff --git a/Archipelago/settings_screen.gd b/Archipelago/settings_screen.gd index 6c64b15..2ed8594 100644 --- a/Archipelago/settings_screen.gd +++ b/Archipelago/settings_screen.gd @@ -32,6 +32,7 @@ func _ready(): apclient_instance.SCRIPT_panel = load("user://maps/Archipelago/panel.gd") var pilg_term = load("user://maps/Archipelago/pilgrimage_terminator.gd") apclient_instance.SCRIPT_pilgrimage_terminator = pilg_term + apclient_instance.SCRIPT_textclient = load("user://maps/Archipelago/textclient.gd") apclient_instance.SCRIPT_uuid = load("user://maps/Archipelago/vendor/uuid.gd") var apdata = ResourceLoader.load("user://maps/Archipelago/gamedata.gd") diff --git a/Archipelago/textclient.gd b/Archipelago/textclient.gd new file mode 100644 index 0000000..7bddf38 --- /dev/null +++ b/Archipelago/textclient.gd @@ -0,0 +1,88 @@ +extends Node + +var panel +var label +var entry +var is_open = false + + +func _ready(): + pause_mode = PAUSE_MODE_PROCESS + + panel = Panel.new() + panel.set_name("Panel") + panel.margin_left = 100 + panel.margin_right = 1820 + panel.margin_top = 100 + panel.margin_bottom = 980 + panel.visible = false + add_child(panel) + + label = RichTextLabel.new() + label.set_name("Label") + label.margin_left = 80 + label.margin_right = 1640 + label.margin_top = 80 + label.margin_bottom = 720 + label.scroll_following = true + panel.add_child(label) + + var dynamic_font = DynamicFont.new() + dynamic_font.font_data = load("res://fonts/Lingo.ttf") + dynamic_font.size = 36 + label.push_font(dynamic_font) + + var entry_style = StyleBoxFlat.new() + entry_style.bg_color = Color(0.9, 0.9, 0.9, 1) + + entry = LineEdit.new() + entry.set_name("Entry") + entry.margin_left = 80 + entry.margin_right = 1640 + entry.margin_top = 760 + entry.margin_bottom = 840 + entry.add_font_override("font", dynamic_font) + entry.add_color_override("font_color", Color(0, 0, 0, 1)) + entry.add_color_override("cursor_color", Color(0, 0, 0, 1)) + entry.add_stylebox_override("focus", entry_style) + panel.add_child(entry) + entry.connect("text_entered", self, "text_entered") + + +func _input(event): + if event is InputEventKey and event.pressed: + if event.scancode == KEY_TAB: + if !get_tree().paused: + is_open = true + get_tree().paused = true + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + panel.visible = true + entry.grab_focus() + get_tree().set_input_as_handled() + else: + dismiss() + elif event.scancode == KEY_ESCAPE: + if is_open: + dismiss() + get_tree().set_input_as_handled() + + +func dismiss(): + if is_open: + get_tree().paused = false + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + panel.visible = false + is_open = false + + +func parse_printjson(text): + if !label.text.empty(): + label.append_bbcode("\n") + + label.append_bbcode(text) + + +func text_entered(text): + var apclient = global.get_node("Archipelago") + apclient.say(text.trim_suffix("\n")) + entry.text = "" diff --git a/README.md b/README.md index a242f95..a8491d6 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,9 @@ pick and choose which ones you would like to use. the numbering can change. You can also specify whether access to the sunwarps should be locked behind receiving certain items. +There is also a built-in text client you can use to talk to other players and +issue commands. You can open and close it by pressing tab. + ## Frequently Asked Questions ### What are location checks in this game? -- cgit 1.4.1 From 7ba426a8e0762b7e1a2e838c314410922df51e6c Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 2 Sep 2024 11:49:38 -0400 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index f58b3d6..3973f0e 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -19,7 +19,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "4.0.2" +const my_version = "4.1.0" const ap_version = {"major": 0, "minor": 5, "build": 0, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From 15fd151d4b7b4b86d65ae37386b96aae7cb6ba79 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 2 Sep 2024 12:06:33 -0400 Subject: Released v4.1.0 --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1174ce7..d00999c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # lingo-archipelago Releases +## v4.1.0 - 2024-09-02 + +- Added an in-game text client, which can be used to talk to other players and + issue commands, similar to the official Archipelago Text Client app. Press TAB + to open or close the text client. + +Download: +[lingo-archipelago-v4.1.0.zip](https://files.fourisland.com/releases/lingo-archipelago/lingo-archipelago-v4.1.0.zip)
+Source: [v4.1.0](https://code.fourisland.com/lingo-archipelago/tag/?h=v4.1.0) + ## v4.0.2 - 2024-07-14 - Multiplayer mode now shows a player's alias in addition to their slot name. -- cgit 1.4.1 From ed3247cd00cde86026379aebba200fee673cdba0 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Fri, 20 Sep 2024 16:15:56 -0400 Subject: Added speed boost mode --- Archipelago/client.gd | 15 +++++++++++- Archipelago/effects.gd | 66 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 10 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 3973f0e..6621194 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -104,6 +104,7 @@ var _pilgrimage_allows_roof_access = false var _pilgrimage_allows_paintings = false var _sunwarp_shuffle = false var _sunwarp_mapping = [] +var _speed_boost_mode = false var _slot_seed = 0 var _map_loaded = false @@ -117,6 +118,7 @@ var _puzzle_skips = 0 var _cached_slowness = 0 var _cached_iceland = 0 var _cached_atbash = 0 +var _cached_speed_boosts = 0 var _geronimo_skip = false var _checked_paintings = [] @@ -330,6 +332,10 @@ func _on_data(): _sunwarp_shuffle = false if _slot_data.has("sunwarp_permutation"): _sunwarp_mapping = _slot_data["sunwarp_permutation"] + if _slot_data.has("speed_boost_mode"): + _speed_boost_mode = _slot_data["speed_boost_mode"] + else: + _speed_boost_mode = false if ( _location_classification_bit != kCLASSIFICATION_LOCAL_INSANITY @@ -348,6 +354,7 @@ func _on_data(): _cached_slowness = 0 _cached_iceland = 0 _cached_atbash = 0 + _cached_speed_boosts = 0 _geronimo_skip = false _localdata_file = "user://archipelago_data/%s_%d" % [_seed, _slot] @@ -379,6 +386,9 @@ func _on_data(): if localdata.size() > 5: _geronimo_skip = localdata[5] + if localdata.size() > 6: + _cached_speed_boosts = localdata[6] + requestSync() sendMessage( @@ -568,7 +578,8 @@ func saveLocaldata(): effects_node.slowness_remaining, effects_node.iceland_remaining, effects_node.atbash_remaining, - _geronimo_skip + _geronimo_skip, + effects_node.speed_boosts_remaining, ] file.store_var(data, true) file.close() @@ -800,6 +811,8 @@ func processItem(item, index, from, flags): effects_node.trigger_iceland_trap() if item_name == "Atbash Trap": effects_node.trigger_atbash_trap() + if item_name == "Speed Boost": + effects_node.trigger_speed_boost() if item_name == "Puzzle Skip": _puzzle_skips += 1 diff --git a/Archipelago/effects.gd b/Archipelago/effects.gd index 1e2e311..341a783 100644 --- a/Archipelago/effects.gd +++ b/Archipelago/effects.gd @@ -5,6 +5,7 @@ var effect_running = false var slowness_remaining = 0 var iceland_remaining = 0 var atbash_remaining = 0 +var speed_boosts_remaining = 0 var queued_iceland = 0 var skip_available = false var puzzle_focused = false @@ -48,6 +49,12 @@ func _ready(): add_child(slowness_timer) slowness_timer.connect("timeout", self, "_tick_slowness") + var speed_boost_timer = Timer.new() + speed_boost_timer.name = "SpeedBoostTimer" + speed_boost_timer.wait_time = 1.0 + add_child(speed_boost_timer) + speed_boost_timer.connect("timeout", self, "_tick_speed_boost") + var iceland_timer = Timer.new() iceland_timer.name = "IcelandTimer" iceland_timer.wait_time = 1.0 @@ -63,6 +70,12 @@ func activate(): queued_iceland = 0 + var apclient = global.get_node("Archipelago") + if apclient._speed_boost_mode: + var player = get_tree().get_root().get_node("Spatial/player") + player.walk_speed = orig_walk / 2.0 + player.run_speed = orig_run / 2.0 + func trigger_slowness_trap(length = 30): if slowness_remaining == 0: @@ -79,6 +92,21 @@ func trigger_slowness_trap(length = 30): apclient.saveLocaldata() +func trigger_speed_boost(length = 20): + if speed_boosts_remaining == 0: + var player = get_tree().get_root().get_node("Spatial/player") + player.walk_speed = orig_walk + player.run_speed = orig_run + + $SpeedBoostTimer.start() + + speed_boosts_remaining += length + text_dirty = true + + var apclient = global.get_node("Archipelago") + apclient.saveLocaldata() + + func trigger_iceland_trap(length = 60): if not activated: queued_iceland += length @@ -99,7 +127,7 @@ func trigger_iceland_trap(length = 60): func trigger_atbash_trap(): - var newly_atbash = (atbash_remaining == 0) + var newly_atbash = atbash_remaining == 0 atbash_remaining += 1 if newly_atbash: @@ -121,7 +149,7 @@ func deactivate_atbash_trap(): apclient.evaluateSolvability() text_dirty = true - + var apclient = global.get_node("Archipelago") apclient.saveLocaldata() @@ -192,23 +220,37 @@ func _tick_slowness(): player.run_speed = orig_run $SlownessTimer.stop() - + if slowness_remaining % 5 == 0: var apclient = global.get_node("Archipelago") apclient.saveLocaldata() +func _tick_speed_boost(): + speed_boosts_remaining -= 1 + text_dirty = true + + if speed_boosts_remaining == 0: + var player = get_tree().get_root().get_node("Spatial/player") + player.walk_speed = orig_walk / 2.0 + player.run_speed = orig_run / 2.0 + + $SpeedBoostTimer.stop() + + if speed_boosts_remaining % 5 == 0: + var apclient = global.get_node("Archipelago") + apclient.saveLocaldata() + + func _tick_iceland(): iceland_remaining -= 1 text_dirty = true if iceland_remaining == 0: - get_tree().get_root().get_node("Spatial/player/pivot/camera").set_environment( - orig_env - ) + get_tree().get_root().get_node("Spatial/player/pivot/camera").set_environment(orig_env) $IcelandTimer.stop() - + if iceland_remaining % 5 == 0: var apclient = global.get_node("Archipelago") apclient.saveLocaldata() @@ -220,9 +262,11 @@ func _process(_delta): if wallcast.is_colliding(): var player = get_tree().get_root().get_node("Spatial/player") var puzzlecast = player.get_node("pivot/camera/RayCast_sight") - var distance = puzzlecast.get_collision_point().distance_to(wallcast.get_collision_point()) + var distance = puzzlecast.get_collision_point().distance_to( + wallcast.get_collision_point() + ) should_nbw = (distance < 0.05) - + if should_nbw != not_behind_wall: not_behind_wall = should_nbw text_dirty = true @@ -239,6 +283,10 @@ func _process(_delta): if not text.empty(): text += "\n" text += "Slowness: %d seconds" % slowness_remaining + if speed_boosts_remaining > 0: + if not text.empty(): + text += "\n" + text += "Speed Boost: %d seconds" % speed_boosts_remaining if iceland_remaining > 0: if not text.empty(): text += "\n" -- cgit 1.4.1 From e92ae750012d37733ef803e882eb8191ad530e11 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Fri, 20 Sep 2024 21:29:42 -0400 Subject: Added proximity chat --- Archipelago/client.gd | 4 ++++ Archipelago/load.gd | 1 + Archipelago/multiplayer.gd | 55 ++++++++++++++++++++++++++++++++++++++++++++++ Archipelago/textclient.gd | 13 ++++++++++- 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 6621194..a636bec 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -912,6 +912,10 @@ func parse_printjson(message): textclient_node.parse_printjson("".join(parts)) +func get_player_name(): + return _player_name_by_slot[_slot] + + func compareVersion(lhs, rhs): if lhs["major"] == rhs["major"]: if lhs["minor"] == rhs["minor"]: diff --git a/Archipelago/load.gd b/Archipelago/load.gd index c35525b..09aaee2 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd @@ -672,6 +672,7 @@ func _load(): # Create the multiplayer node, if needed. if apclient.enable_multiplayer: var multiplayer_node = apclient.SCRIPT_multiplayer.new() + multiplayer_node.name = "Multiplayer" multiplayer_node.ghost_mode = true add_child(multiplayer_node) diff --git a/Archipelago/multiplayer.gd b/Archipelago/multiplayer.gd index 0bc2241..c2d9875 100644 --- a/Archipelago/multiplayer.gd +++ b/Archipelago/multiplayer.gd @@ -1,5 +1,8 @@ extends "res://scripts/multiplayer.gd" +var queued_messages = [] +var queued_messages_mutex = Mutex.new() + func _request_lobby_list(): var apclient = global.get_node("Archipelago") @@ -41,3 +44,55 @@ func _update_lobby_members(): if member_id != player_steam_id and member_id in active_lobby_members: var slot_name = Steam.getLobbyMemberData(active_lobby_id, member_id, "slot_name") active_lobby_members[member_id].steam_name = slot_name + + +func say(text): + queued_messages_mutex.lock() + queued_messages.append(text) + queued_messages_mutex.unlock() + + +func _physics_process(_delta): + if queued_messages_mutex.try_lock() == OK: + if queued_messages.empty(): + queued_messages_mutex.unlock() + else: + var messages = queued_messages.duplicate() + queued_messages = [] + queued_messages_mutex.unlock() + + var player = get_tree().get_root().get_node("Spatial/player") + var space_state = get_tree().get_root().get_world().direct_space_state + var nearby_members = [] + for member_id in active_lobby_members.keys(): + var other_member = active_lobby_members[member_id] + var ray = space_state.intersect_ray( + player.global_translation, other_member.global_translation, [player], 0b0101 + ) + if !("collider" in ray) or ray["collider"] == other_member: + # Visible! + nearby_members.append(member_id) + + var apclient = global.get_node("Archipelago") + var player_name = apclient.get_player_name() + for member_id in nearby_members: + for msg in messages: + _send_p2p_packet( + {"solves": [{"say": msg, "from": player_name}]}, + member_id, + Steam.P2P_SEND_RELIABLE, + true + ) + + +# I'm completely hijacking this callback, since we're in ghost mode and it won't be called normally. +func _receive_solve(data): + if "say" in data: + get_tree().get_root().get_node("Spatial/AP_TextClient").parse_printjson( + "[LOCAL] [color=#fafad2]%s[/color]: %s" % [data["from"], data["say"]] + ) + messages.showMessage("[color=#fafad2]%s[/color]: %s" % [data["from"], data["say"]]) + + +func _send_hi(_discard): + pass diff --git a/Archipelago/textclient.gd b/Archipelago/textclient.gd index 7bddf38..f100776 100644 --- a/Archipelago/textclient.gd +++ b/Archipelago/textclient.gd @@ -84,5 +84,16 @@ func parse_printjson(text): func text_entered(text): var apclient = global.get_node("Archipelago") - apclient.say(text.trim_suffix("\n")) + var cmd = text.trim_suffix("\n") + if cmd.begins_with("/say "): + if apclient.enable_multiplayer: + var msg = cmd.trim_prefix("/say ") + parse_printjson( + "[LOCAL] [color=#ee00ee]%s[/color]: %s" % [apclient.get_player_name(), msg] + ) + get_tree().get_root().get_node("Spatial/Multiplayer").say(msg) + else: + parse_printjson("Multiplayer must be enabled to use /say") + else: + apclient.say(cmd) entry.text = "" -- cgit 1.4.1 From d7baf7fa2e25eb1df0cd8c888544e0269a0e731d Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Fri, 20 Sep 2024 23:11:27 -0400 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index a636bec..350723e 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -19,7 +19,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "4.1.0" +const my_version = "4.2.0" const ap_version = {"major": 0, "minor": 5, "build": 0, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From 128c17c9f696bc1c6e77f9db9bb3d3d7e9f2500b Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Fri, 20 Sep 2024 23:14:57 -0400 Subject: Add /say to README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index a8491d6..dcdc9cd 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,11 @@ pick and choose which ones you would like to use. There is also a built-in text client you can use to talk to other players and issue commands. You can open and close it by pressing tab. +The command "/say" can be used in the built-in text client to send messages that +are only visible to players that you can currently see. Note that this is not +symmetric: it is possible that you may see someone who cannot see you back, if, +for instance, there is a door in between you and it is only open on your slot. + ## Frequently Asked Questions ### What are location checks in this game? -- cgit 1.4.1 From 1d639e2f9f3d696636356afd25612219cdc5b7ab Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Fri, 20 Sep 2024 23:25:31 -0400 Subject: Released v4.2.0 --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d00999c..0ff2d56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # lingo-archipelago Releases +## v4.2.0 - 2024-09-20 + +- Added a proximity chat feature. You can use the command "/say" followed by a + message in the text client, and it will broadcast the message only to other + nearby Lingo players. + +Download: +[lingo-archipelago-v4.2.0.zip](https://files.fourisland.com/releases/lingo-archipelago/lingo-archipelago-v4.2.0.zip)
+Source: [v4.2.0](https://code.fourisland.com/lingo-archipelago/tag/?h=v4.2.0) + ## v4.1.0 - 2024-09-02 - Added an in-game text client, which can be used to talk to other players and -- cgit 1.4.1 From 439588d5e04eb296f5a3be609127579bf616c27a Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 21 Sep 2024 07:47:50 -0400 Subject: Prevent text client from opening if SHIFT is held --- Archipelago/textclient.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Archipelago/textclient.gd b/Archipelago/textclient.gd index f100776..003ef8d 100644 --- a/Archipelago/textclient.gd +++ b/Archipelago/textclient.gd @@ -51,7 +51,7 @@ func _ready(): func _input(event): if event is InputEventKey and event.pressed: - if event.scancode == KEY_TAB: + if event.scancode == KEY_TAB and !Input.is_key_pressed(KEY_SHIFT): if !get_tree().paused: is_open = true get_tree().paused = true -- cgit 1.4.1 From ee12114277180c2171c3a5f8f4b5171cb0b41fc1 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 21 Sep 2024 07:48:23 -0400 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 350723e..f12cfbd 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -19,7 +19,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "4.2.0" +const my_version = "4.2.1" const ap_version = {"major": 0, "minor": 5, "build": 0, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From eae936def6d642a8b152d47caf775cba88cd886c Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 21 Sep 2024 07:52:13 -0400 Subject: Released v4.2.1 --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ff2d56..6bea522 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # lingo-archipelago Releases +## v4.2.1 - 2024-09-21 + +- The text client will no longer open if SHIFT is being held, to prevent + conflicts with the Steam Overlay. + +Download: +[lingo-archipelago-v4.2.1.zip](https://files.fourisland.com/releases/lingo-archipelago/lingo-archipelago-v4.2.1.zip)
+Source: [v4.2.1](https://code.fourisland.com/lingo-archipelago/tag/?h=v4.2.1) + ## v4.2.0 - 2024-09-20 - Added a proximity chat feature. You can use the command "/say" followed by a -- cgit 1.4.1 From 8b0d1293d98fff5d58dcc824e7eaefa6a7530fc1 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Mon, 23 Sep 2024 11:09:22 -0400 Subject: Prevent speed modifying items in wrong mode --- Archipelago/client.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index f12cfbd..1d8e779 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -805,13 +805,13 @@ func processItem(item, index, from, flags): ) var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects") - if item_name == "Slowness Trap": + if item_name == "Slowness Trap" and !_speed_boost_mode: effects_node.trigger_slowness_trap() if item_name == "Iceland Trap": effects_node.trigger_iceland_trap() if item_name == "Atbash Trap": effects_node.trigger_atbash_trap() - if item_name == "Speed Boost": + if item_name == "Speed Boost" and _speed_boost_mode: effects_node.trigger_speed_boost() if item_name == "Puzzle Skip": _puzzle_skips += 1 -- cgit 1.4.1 From 3d7efa558252e9c3e0ef5d2708c525ad06ae5e86 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Thu, 10 Oct 2024 15:13:50 -0400 Subject: Tell player if location was hinted --- Archipelago/client.gd | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 1d8e779..01f812c 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -121,6 +121,8 @@ var _cached_atbash = 0 var _cached_speed_boosts = 0 var _geronimo_skip = false var _checked_paintings = [] +var _hints_key = "" +var _hinted_locations = [] signal could_not_connect signal connect_status @@ -403,6 +405,11 @@ func _on_data(): ] ) + _hints_key = "_read_hints_%d_%d" % [_team, _slot] + sendMessage( + [{"cmd": "SetNotify", "keys": [_hints_key]}, {"cmd": "Get", "keys": [_hints_key]}] + ) + emit_signal("client_connected") elif cmd == "ConnectionRefused": @@ -500,9 +507,12 @@ func _on_data(): ) else: if message["receiving"] != _slot: - messages.showMessage( + var sentMsg = ( "Sent [color=%s]%s[/color] to %s" % [item_color, item_name, player_name] ) + if _hinted_locations.has(message["item"]["location"]): + sentMsg += " ([color=#fafad2]Hinted![/color])" + messages.showMessage(sentMsg) elif cmd == "Bounced": if ( @@ -523,8 +533,15 @@ func _on_data(): get_tree().get_root().get_node("Spatial/player/pause_menu")._reload() elif cmd == "SetReply": - if message.has("key") and message["key"] == ("Lingo_%d_Paintings" % _slot): - _checked_paintings = message["value"] + if message.has("key"): + if message["key"] == ("Lingo_%d_Paintings" % _slot): + _checked_paintings = message["value"] + elif message["key"] == _hints_key: + parseHints(message["value"]) + + elif cmd == "Retrieved": + if message.has("keys") and message["keys"].has(_hints_key): + parseHints(message["keys"][_hints_key]) func _process(_delta): @@ -863,6 +880,14 @@ func checkPainting(painting_id): setValue("Paintings", [painting_id], "add") +func parseHints(hints): + _hinted_locations.clear() + + for hint in hints: + if hint["finding_player"] == int(_slot): + _hinted_locations.append(hint["location"]) + + func colorForItemType(flags): var int_flags = int(flags) if int_flags & 1: # progression -- cgit 1.4.1 From 5d4df9284173c457dfa70da67f3274a4069abc92 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 27 Oct 2024 13:36:16 -0400 Subject: Made text client selectable --- Archipelago/textclient.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/Archipelago/textclient.gd b/Archipelago/textclient.gd index 003ef8d..3abd9e0 100644 --- a/Archipelago/textclient.gd +++ b/Archipelago/textclient.gd @@ -25,6 +25,7 @@ func _ready(): label.margin_top = 80 label.margin_bottom = 720 label.scroll_following = true + label.selection_enabled = true panel.add_child(label) var dynamic_font = DynamicFont.new() -- cgit 1.4.1 From 0ea3f9dc81f9a6a3807fb88b83a37905fa329469 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Tue, 26 Nov 2024 14:58:15 -0500 Subject: Bump version --- Archipelago/client.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 8cddb83..8f9d3e0 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -19,8 +19,8 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "4.2.1" -const ap_version = {"major": 0, "minor": 5, "build": 0, "class": "Version"} +const my_version = "5.0.0" +const ap_version = {"major": 0, "minor": 5, "build": 1, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" ] -- cgit 1.4.1 From 4b53c8858448e4fc835c907813632f6eeddd543d Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Tue, 26 Nov 2024 15:12:09 -0500 Subject: Released v5.0.0 --- CHANGELOG.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bea522..4895247 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # lingo-archipelago Releases +## v5.0.0 - 2024-11-26 + +- [Archipelago 0.5.1](https://github.com/ArchipelagoMW/Archipelago/releases/tag/0.5.1) + has been released! this release includes a couple of major new features for + Lingo: + - There is a new type of door shuffle called "panels mode". In panels mode, + the doors open when their vanilla panels are solved, but the panels + themselves are locked behind items. This provides a vanilla-like progression + route through the game, while maintaining a door shuffle amount of + progression gating. + - By default, checks that are behind your victory condition are now removed + from your world. + - There are also a number of minor tweaks and bug fixes, which you can see in + the above changelog. +- This update should retain compatibility with Archipelago 0.5.0 worlds. +- The messages in the bottom left corner now lets you know if an item you sent + out was hinted. +- The text in the text client is now selectable. + +Download: +[lingo-archipelago-v5.0.0.zip](https://files.fourisland.com/releases/lingo-archipelago/lingo-archipelago-v5.0.0.zip)
+Source: [v5.0.0](https://code.fourisland.com/lingo-archipelago/tag/?h=v5.0.0) + ## v4.2.1 - 2024-09-21 - The text client will no longer open if SHIFT is being held, to prevent -- cgit 1.4.1 From 84f4fc2db8b7ada36faa5341cb7bee17750f1a07 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 8 Dec 2024 16:14:53 -0500 Subject: Add workaround for 0.5.1 number hunt logic bug --- Archipelago/client.gd | 16 ++++++++- Archipelago/extradata.gd | 84 ++++++++++++++++++++++++++++++++++++++++++++++++ Archipelago/load.gd | 14 ++++++++ 3 files changed, 113 insertions(+), 1 deletion(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 8f9d3e0..99be37a 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -779,8 +779,14 @@ func processItem(item, index, from, flags): doorsNode.get_node(door_id).openDoor() if gamedata.panel_ids_by_item_id.has(int(item)): + var panel_ids = gamedata.panel_ids_by_item_id[int(item)] + if wasGeneratedOnVersion(0, 5, 1): + var extradata = get_node("Extradata") + if extradata.panels_mode_051_panel_fixes.has(int(item)): + panel_ids = extradata.panels_mode_051_panel_fixes[int(item)] + var panelsNode = get_tree().get_root().get_node("Spatial/Panels") - for panel_id in gamedata.panel_ids_by_item_id[int(item)]: + for panel_id in panel_ids: panelsNode.get_node(panel_id).get_node("AP_Panel").locked = false emit_signal("evaluate_solvability") @@ -990,3 +996,11 @@ func compareVersion(lhs, rhs): func wasGeneratedBeforeVersion(major, minor, build): return compareVersion(_gen_version, {"major": major, "minor": minor, "build": build}) + + +func wasGeneratedOnVersion(major, minor, build): + return ( + _gen_version["major"] == major + and _gen_version["minor"] == minor + and _gen_version["build"] == build + ) diff --git a/Archipelago/extradata.gd b/Archipelago/extradata.gd index 89c41d2..2e26eb2 100644 --- a/Archipelago/extradata.gd +++ b/Archipelago/extradata.gd @@ -93,3 +93,87 @@ var proxies = { "Open Areas/Panel_rise_horizon": ["Open Areas/Panel_son_horizon"], "Open Areas/Panel_son_sunrise": ["Open Areas/Panel_rise_sunrise"] } + +var panels_mode_051_panel_fixes = { + 444647: + [ + "Backside Room/Panel_three_three", + "Backside Room/Panel_three_three_2", + "Backside Room/Panel_three_three_3", + "Backside Room/Panel_four_four_3", + "Backside Room/Panel_four_four_2", + "Backside Room/Panel_four_four_4" + ], + 444648: + [ + "Backside Room/Panel_four_four", + "Backside Room/Panel_five_five_5", + "Backside Room/Panel_five_five_4" + ], + 444649: + [ + "Backside Room/Panel_five_five", + "Backside Room/Panel_five_five_3", + "Backside Room/Panel_five_five_2", + "Backside Room/Panel_six_six_4" + ], + 444650: + [ + "Backside Room/Panel_six_six", + "Backside Room/Panel_six_six_3", + "Backside Room/Panel_six_six_2", + "Backside Room/Panel_six_six_5", + "Backside Room/Panel_six_six_6", + "Backside Room/Panel_seven_seven_5", + "Backside Room/Panel_seven_seven_6" + ], + 444651: + [ + "Backside Room/Panel_seven_seven", + "Backside Room/Panel_seven_seven_2", + "Backside Room/Panel_seven_seven_7", + "Backside Room/Panel_seven_seven_3", + "Backside Room/Panel_seven_seven_4", + "Backside Room/Panel_eight_eight_8", + "Backside Room/Panel_eight_eight_5", + "Backside Room/Panel_eight_eight_3", + "Backside Room/Panel_eight_eight_7" + ], + 444652: + [ + "Backside Room/Panel_eight_eight", + "Backside Room/Panel_eight_eight_2", + "Backside Room/Panel_eight_eight_4", + "Backside Room/Panel_eight_eight_6", + "Backside Room/Panel_nine_nine_3", + "Backside Room/Panel_nine_nine_8", + "Backside Room/Panel_nine_nine_4", + "Backside Room/Panel_nine_nine_5", + "Backside Room/Panel_nine_nine_2" + ], + 444653: + [ + "Backside Room/Panel_nine_nine", + "Backside Room/Panel_nine_nine_6", + "Backside Room/Panel_nine_nine_8", + "Backside Room/Panel_nine_nine_9", + "Backside Room/Panel_nine_nine_7" + ] +} + +var panels_mode_051_door_fixes = { + "Door_four_hider": ["Door_four_hider_3", "Door_four_hider_4", "Door_four_hider_2"], + "Door_five_hider": ["Door_five_hider_4", "Door_five_hider_5"], + "Door_six_hider": ["Door_six_hider_4"], + "Door_seven_hider": ["Door_seven_hider_6", "Door_seven_hider_5"], + "Door_eight_hider": + ["Door_eight_hider_7", "Door_eight_hider_8", "Door_eight_hider_3", "Door_eight_hider_5"], + "Door_nine_hider": + [ + "Door_nine_hider_3", + "Door_nine_hider_8", + "Door_nine_hider_4", + "Door_nine_hider_5", + "Door_nine_hider_2" + ] +} diff --git a/Archipelago/load.gd b/Archipelago/load.gd index 4811b47..e593548 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd @@ -551,6 +551,20 @@ func _load(): proxynode.exact_proxy = true proxynode.request_ready() oldparent.add_child(proxynode) + + # If the world was generated on 0.5.1, apply the hotfix for the number hunt doors. + if apclient.wasGeneratedOnVersion(0, 5, 1): + var number_hunt_parent = get_node("Doors/Count Up Room Area Doors") + var extradata_051_fix = apclient.get_node("Extradata").panels_mode_051_door_fixes + for template_door_path in extradata_051_fix: + var template_door = number_hunt_parent.get_node(template_door_path) + var impacted_doors = extradata_051_fix[template_door_path] + for impacted_door_path in impacted_doors: + var impacted_door = number_hunt_parent.get_node(impacted_door_path) + var copied_door = impacted_door.duplicate() + copied_door.panels = template_door.panels + number_hunt_parent.add_child(copied_door) + impacted_door.queue_free() # Attach a script to every panel so that we can do things like conditionally # disable them. -- cgit 1.4.1 From 6611cd44d3ff06f00fac429f30e57d6d4a1e6769 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 8 Dec 2024 16:15:48 -0500 Subject: Bump version --- Archipelago/client.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 99be37a..85cfd05 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd @@ -19,7 +19,7 @@ var enable_multiplayer = false var track_player = false var connection_history = [] -const my_version = "5.0.0" +const my_version = "5.0.1" const ap_version = {"major": 0, "minor": 5, "build": 1, "class": "Version"} const color_items = [ "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" -- cgit 1.4.1 From 7d158c97ca10e815c8344dca801d0eba307dff57 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 8 Dec 2024 16:46:42 -0500 Subject: The workaround should only be on PMDS --- Archipelago/load.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Archipelago/load.gd b/Archipelago/load.gd index e593548..651fc39 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd @@ -553,7 +553,7 @@ func _load(): oldparent.add_child(proxynode) # If the world was generated on 0.5.1, apply the hotfix for the number hunt doors. - if apclient.wasGeneratedOnVersion(0, 5, 1): + if apclient._panel_door_shuffle && apclient.wasGeneratedOnVersion(0, 5, 1): var number_hunt_parent = get_node("Doors/Count Up Room Area Doors") var extradata_051_fix = apclient.get_node("Extradata").panels_mode_051_door_fixes for template_door_path in extradata_051_fix: -- cgit 1.4.1 From 45fa76505dd00bdd6665bae476277371fb1252a2 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 8 Dec 2024 16:50:44 -0500 Subject: Released v5.0.1 --- CHANGELOG.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4895247..d34321d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # lingo-archipelago Releases +## v5.0.1 - 2024-12-08 + +- This update adds a workaround for + [a logic error in Archipelago 0.5.1](https://github.com/ArchipelagoMW/Archipelago/pull/4342). + If your slot is affected by this bug (if you are playing panels mode door + shuffle in a multiworld generated on Archipelago 0.5.1), the following changes + will occur: + - The broken panels (listed at the above link) will now unlock at one + Progressive Number Hunt earlier than would be expected. + - The doors covering the broken panels will now open when all of the numbers + in the previous set have been solved, instead of when the number in the + number hunt hallway is solved. +- This can lead to some non-intuitive gameplay, because the panels no longer + unlock the way they do in the base game. To help with this, v0.11.5 of the + tracker now uses the 0.5.1 broken logic, so that you can always tell what is + expected of you. +- There is already a fix for the logic error, and it will likely be included as + part of the next major Archipelago release. I apologize for the inconvenience. + +Download: +[lingo-archipelago-v5.0.1.zip](https://files.fourisland.com/releases/lingo-archipelago/lingo-archipelago-v5.0.1.zip)
+Source: [v5.0.1](https://code.fourisland.com/lingo-archipelago/tag/?h=v5.0.1) + ## v5.0.0 - 2024-11-26 - [Archipelago 0.5.1](https://github.com/ArchipelagoMW/Archipelago/releases/tag/0.5.1) -- cgit 1.4.1