From ea87cbbe4a23ceff72f31e461c7ead32f560031e Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 25 Oct 2025 11:20:55 -0400 Subject: Made White Ending customizable --- apworld/client/player.gd | 127 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) (limited to 'apworld/client/player.gd') diff --git a/apworld/client/player.gd b/apworld/client/player.gd index 789d1b7..9acb942 100644 --- a/apworld/client/player.gd +++ b/apworld/client/player.gd @@ -19,6 +19,84 @@ func _ready(): ap.start_batching_locations() + if global.map == "control_center": + get_node("/root/scene/Components/Doors/entry_18").queue_free() + + _set_up_mastery_listener("advanced") + _set_up_mastery_listener("charismatic") + _set_up_mastery_listener("crystalline") + _set_up_mastery_listener("icarus") + _set_up_mastery_listener("stellar") + + if ap.endings_requirement != 12 or ap.masteries_requirement != 0: + # Set up listeners for the potential White Ending requirements. + var merging_prefab = preload("res://objects/nodes/listeners/mergingListener.tscn") + + var old_door = get_node("/root/scene/Components/Doors/entry_19") + var new_door = old_door.duplicate() + new_door.name = "entry_19_new" + new_door.senders.clear() + new_door.senderGroup.clear() + new_door.excludeSenders.clear() + + if ap.endings_requirement == 12: + new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners")) + elif ap.endings_requirement > 0: + if ap.masteries_requirement == 0: + new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners")) + new_door.complete_at = ap.endings_requirement + else: + var endings_merge = merging_prefab.instantiate() + endings_merge.name = "EndingsMerge" + endings_merge.senderGroup.append( + NodePath("/root/scene/Meshes/Trophies/Listeners") + ) + endings_merge.complete_at = ap.endings_requirement + get_node("/root/scene/Components").add_child.call_deferred(endings_merge) + new_door.senders.append(NodePath("/root/scene/Components/EndingsMerge")) + + var max_masteries = 13 + ap.enable_gift_maps.size() + if ap.enable_icarus: + max_masteries += 1 + + if ap.masteries_requirement == max_masteries: + new_door.senderGroup.append( + NodePath("/root/scene/Meshes/Trophies/MasteryListeners") + ) + new_door.excludeSenders.append( + NodePath( + "/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite" + ) + ) + elif ap.masteries_requirement > 0: + if ap.endings_requirement == 0: + new_door.senderGroup.append( + NodePath("/root/scene/Meshes/Trophies/MasteryListeners") + ) + new_door.excludeSenders.append( + NodePath( + "/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite" + ) + ) + new_door.complete_at = ap.masteries_requirement + else: + var masteries_merge = merging_prefab.instantiate() + masteries_merge.name = "MasteriesMerge" + masteries_merge.senderGroup.append( + NodePath("/root/scene/Meshes/Trophies/MasteryListeners") + ) + masteries_merge.excludeSenders.append( + NodePath( + "/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite" + ) + ) + masteries_merge.complete_at = ap.masteries_requirement + get_node("/root/scene/Components").add_child.call_deferred(masteries_merge) + new_door.senders.append(NodePath("/root/scene/Components/MasteriesMerge")) + + old_door.queue_free() + get_node("/root/scene/Components/Doors").add_child.call_deferred(new_door) + # Block off roof access in Daedalus. if global.map == "daedalus" and not ap.daedalus_roof_access: _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49) @@ -297,6 +375,7 @@ func _ready(): var collectable_prefab = preload("res://objects/nodes/collectable.tscn") var saver_prefab = preload("res://objects/nodes/saver.tscn") var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") + var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn") var mastery = collectable_prefab.instantiate() mastery.name = "collectable" @@ -314,6 +393,13 @@ func _ready(): tpl.nested = true mastery.add_child.call_deferred(tpl) + var usl = usl_prefab.instantiate() + usl.name = "unlockSetterListenerMastery" + usl.key = "icarus_mastery" + usl.value = "unlocked" + usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable")) + get_node("/root/scene/Components").add_child.call_deferred(usl) + var saver = saver_prefab.instantiate() saver.name = "saver_collectables" saver.type = "collectables" @@ -325,6 +411,7 @@ func _ready(): var collectable_prefab = preload("res://objects/nodes/collectable.tscn") var saver_prefab = preload("res://objects/nodes/saver.tscn") var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") + var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn") var mastery = collectable_prefab.instantiate() mastery.name = "collectable" @@ -343,6 +430,13 @@ func _ready(): tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_31")) mastery.add_child.call_deferred(tpl) + var usl = usl_prefab.instantiate() + usl.name = "unlockSetterListenerMastery" + usl.key = "advanced_mastery" + usl.value = "unlocked" + usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable")) + get_node("/root/scene/Components").add_child.call_deferred(usl) + var saver = saver_prefab.instantiate() saver.name = "saver_collectables" saver.type = "collectables" @@ -353,6 +447,7 @@ func _ready(): if global.map == "the_charismatic": var collectable_prefab = preload("res://objects/nodes/collectable.tscn") var saver_prefab = preload("res://objects/nodes/saver.tscn") + var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn") var mastery = collectable_prefab.instantiate() mastery.name = "collectable" @@ -362,6 +457,13 @@ func _ready(): mastery.material_override = load("res://assets/materials/gold.material") get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery) + var usl = usl_prefab.instantiate() + usl.name = "unlockSetterListenerMastery" + usl.key = "charismatic_mastery" + usl.value = "unlocked" + usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable")) + get_node("/root/scene/Components").add_child.call_deferred(usl) + var saver = saver_prefab.instantiate() saver.name = "saver_collectables" saver.type = "collectables" @@ -373,6 +475,7 @@ func _ready(): var collectable_prefab = preload("res://objects/nodes/collectable.tscn") var saver_prefab = preload("res://objects/nodes/saver.tscn") var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") + var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn") var mastery = collectable_prefab.instantiate() mastery.name = "collectable" @@ -389,6 +492,13 @@ func _ready(): tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_3")) mastery.add_child.call_deferred(tpl) + var usl = usl_prefab.instantiate() + usl.name = "unlockSetterListenerMastery" + usl.key = "crystalline_mastery" + usl.value = "unlocked" + usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable")) + get_node("/root/scene/Components").add_child.call_deferred(usl) + var saver = saver_prefab.instantiate() saver.name = "saver_collectables" saver.type = "collectables" @@ -399,6 +509,7 @@ func _ready(): if global.map == "the_stellar": var collectable_prefab = preload("res://objects/nodes/collectable.tscn") var saver_prefab = preload("res://objects/nodes/saver.tscn") + var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn") var collectables = Node.new() collectables.name = "Collectables" @@ -412,6 +523,13 @@ func _ready(): collectables.add_child.call_deferred(mastery) get_node("/root/scene/Components").add_child.call_deferred(collectables) + var usl = usl_prefab.instantiate() + usl.name = "unlockSetterListenerMastery" + usl.key = "stellar_mastery" + usl.value = "unlocked" + usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable")) + get_node("/root/scene/Components").add_child.call_deferred(usl) + var saver = saver_prefab.instantiate() saver.name = "saver_collectables" saver.type = "collectables" @@ -585,5 +703,14 @@ func _set_up_invis_wall(x, y, z, sx, sy, sz): get_parent().add_child.call_deferred(newwall) +func _set_up_mastery_listener(name): + var prefab = preload("res://objects/nodes/listeners/unlockReaderListener.tscn") + var url = prefab.instantiate() + url.name = "unlockReaderListenerMastery_%s" % name + url.key = "%s_mastery" % name + url.value = "unlocked" + get_node("/root/scene/Meshes/Trophies/MasteryListeners").add_child.call_deferred(url) + + func _process(_dt): compass.update_rotation(global_rotation.y) -- cgit 1.4.1