From e0fc5280442ea7a989b3b8e34333003099e20c32 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Fri, 19 Sep 2025 11:06:58 -0400 Subject: [Client] Handle strict purple/cyan ending options --- client/Archipelago/door.gd | 8 ++++ client/Archipelago/manager.gd | 4 ++ client/Archipelago/player.gd | 103 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+) diff --git a/client/Archipelago/door.gd b/client/Archipelago/door.gd index fead818..49f5728 100644 --- a/client/Archipelago/door.gd +++ b/client/Archipelago/door.gd @@ -28,6 +28,14 @@ func _ready(): call_deferred("_readier") + if global.map == "the_sun_temple": + if name == "spe_EndPlatform" or name == "spe_entry_2": + senders = [NodePath("/root/scene/Panels/EndCheck_dog")] + + if global.map == "the_parthenon": + if name == "spe_entry_1": + senders = [NodePath("/root/scene/Panels/EndCheck_dog")] + super._ready() diff --git a/client/Archipelago/manager.gd b/client/Archipelago/manager.gd index 06ae7d9..e46e4f3 100644 --- a/client/Archipelago/manager.gd +++ b/client/Archipelago/manager.gd @@ -50,6 +50,8 @@ var shuffle_doors = false var shuffle_gallery_paintings = false var shuffle_letters = kSHUFFLE_LETTERS_VANILLA var shuffle_symbols = false +var strict_cyan_ending = false +var strict_purple_ending = false var victory_condition = -1 signal could_not_connect @@ -373,6 +375,8 @@ func _client_connected(slot_data): shuffle_gallery_paintings = bool(slot_data.get("shuffle_gallery_paintings", false)) shuffle_letters = int(slot_data.get("shuffle_letters", 0)) shuffle_symbols = bool(slot_data.get("shuffle_symbols", false)) + strict_cyan_ending = bool(slot_data.get("strict_cyan_ending", false)) + strict_purple_ending = bool(slot_data.get("strict_purple_ending", false)) victory_condition = int(slot_data.get("victory_condition", 0)) if slot_data.has("version"): diff --git a/client/Archipelago/player.gd b/client/Archipelago/player.gd index f0b214f..583d5d6 100644 --- a/client/Archipelago/player.gd +++ b/client/Archipelago/player.gd @@ -225,6 +225,109 @@ func _ready(): sign2.material = load("res://assets/materials/%s.material" % sign2_color) get_parent().add_child.call_deferred(sign2) + # Add the strict purple ending validation. + if global.map == "the_sun_temple" and ap.strict_purple_ending: + var panel_prefab = preload("res://objects/nodes/panel.tscn") + var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") + var reverse_prefab = preload("res://objects/nodes/listeners/reversingListener.tscn") + + var previous_panel = null + var next_y = -100 + var words = ["quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"] + for word in words: + var panel = panel_prefab.instantiate() + panel.position = Vector3(0, next_y, 0) + next_y -= 10 + panel.clue = word + panel.symbol = "" + panel.answer = word + panel.name = "EndCheck_%s" % word + + var tpl = tpl_prefab.instantiate() + tpl.teleport_point = Vector3(0, 1, 0) + tpl.teleport_rotate = Vector3(-45, 180, 0) + tpl.target_path = panel + tpl.name = "Teleport" + + if previous_panel == null: + tpl.senders.append(NodePath("/root/scene/Panels/End/panel_24")) + else: + tpl.senders.append(NodePath("../../%s" % previous_panel.name)) + + var reversing = reverse_prefab.instantiate() + reversing.senders.append(NodePath("..")) + reversing.name = "Reversing" + tpl.senders.append(NodePath("../Reversing")) + + panel.add_child.call_deferred(tpl) + panel.add_child.call_deferred(reversing) + get_parent().get_node("Panels").add_child.call_deferred(panel) + + previous_panel = panel + + # Duplicate the doors that usually wait on EQUINOX. We can't set the senders + # here for some reason so we actually set them in the door ready function. + var endplat = get_node("/root/scene/Components/Doors/EndPlatform") + var endplat2 = endplat.duplicate() + endplat2.name = "spe_EndPlatform" + endplat.get_parent().add_child.call_deferred(endplat2) + endplat.queue_free() + + var entry2 = get_node("/root/scene/Components/Doors/entry_2") + var entry22 = entry2.duplicate() + entry22.name = "spe_entry_2" + entry2.get_parent().add_child.call_deferred(entry22) + entry2.queue_free() + + # Add the strict cyan ending validation. + if global.map == "the_parthenon" and ap.strict_cyan_ending: + var panel_prefab = preload("res://objects/nodes/panel.tscn") + var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") + var reverse_prefab = preload("res://objects/nodes/listeners/reversingListener.tscn") + + var previous_panel = null + var next_y = -100 + var words = ["quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"] + for word in words: + var panel = panel_prefab.instantiate() + panel.position = Vector3(0, next_y, 0) + next_y -= 10 + panel.clue = word + panel.symbol = "." + panel.answer = "%s%s" % [word, word] + panel.name = "EndCheck_%s" % word + + var tpl = tpl_prefab.instantiate() + tpl.teleport_point = Vector3(0, 1, -11) + tpl.teleport_rotate = Vector3(-45, 0, 0) + tpl.target_path = panel + tpl.name = "Teleport" + + if previous_panel == null: + tpl.senderGroup.append(NodePath("/root/scene/Panels/Rulers")) + else: + tpl.senders.append(NodePath("../../%s" % previous_panel.name)) + + var reversing = reverse_prefab.instantiate() + reversing.senders.append(NodePath("..")) + reversing.name = "Reversing" + tpl.senders.append(NodePath("../Reversing")) + + panel.add_child.call_deferred(tpl) + panel.add_child.call_deferred(reversing) + get_parent().get_node("Panels").add_child.call_deferred(panel) + + previous_panel = panel + + # Duplicate the door that usually waits on the rulers. We can't set the + # senders here for some reason so we actually set them in the door ready + # function. + var entry1 = get_node("/root/scene/Components/Doors/entry_1") + var entry12 = entry1.duplicate() + entry12.name = "spe_entry_1" + entry1.get_parent().add_child.call_deferred(entry12) + entry1.queue_free() + super._ready() await get_tree().process_frame -- cgit 1.4.1