diff options
Diffstat (limited to 'apworld/client/maps/control_center.gd')
| -rw-r--r-- | apworld/client/maps/control_center.gd | 143 |
1 files changed, 143 insertions, 0 deletions
| diff --git a/apworld/client/maps/control_center.gd b/apworld/client/maps/control_center.gd new file mode 100644 index 0000000..b307984 --- /dev/null +++ b/apworld/client/maps/control_center.gd | |||
| @@ -0,0 +1,143 @@ | |||
| 1 | const kALL_MASTERIES = 19 | ||
| 2 | |||
| 3 | |||
| 4 | func on_map_load(root): | ||
| 5 | var ap = global.get_node("Archipelago") | ||
| 6 | |||
| 7 | # Remove the door blocking the trophy case. | ||
| 8 | root.get_node("/root/scene/Components/Doors/entry_18").queue_free() | ||
| 9 | |||
| 10 | # Set up mastery listeners for extra maps. | ||
| 11 | _set_up_mastery_listener(root, "advanced") | ||
| 12 | _set_up_mastery_listener(root, "charismatic") | ||
| 13 | _set_up_mastery_listener(root, "crystalline") | ||
| 14 | _set_up_mastery_listener(root, "fuzzy") | ||
| 15 | _set_up_mastery_listener(root, "icarus") | ||
| 16 | _set_up_mastery_listener(root, "stellar") | ||
| 17 | |||
| 18 | if ap.endings_requirement == 0 and ap.masteries_requirement == 0: | ||
| 19 | # Weird edge case. Dunno why I'm even allowing it. | ||
| 20 | var old_door = root.get_node("/root/scene/Components/Doors/entry_19") | ||
| 21 | old_door.queue_free() | ||
| 22 | elif ap.endings_requirement != 12 or ap.masteries_requirement != 0: | ||
| 23 | # Set up listeners for the potential White Ending requirements. | ||
| 24 | var merging_prefab = preload("res://objects/nodes/listeners/mergingListener.tscn") | ||
| 25 | |||
| 26 | var old_door = root.get_node("/root/scene/Components/Doors/entry_19") | ||
| 27 | var new_door = old_door.duplicate() | ||
| 28 | new_door.name = "entry_19_new" | ||
| 29 | new_door.senders.clear() | ||
| 30 | new_door.senderGroup.clear() | ||
| 31 | new_door.excludeSenders.clear() | ||
| 32 | |||
| 33 | if ap.endings_requirement == 12: | ||
| 34 | new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners")) | ||
| 35 | elif ap.endings_requirement > 0: | ||
| 36 | if ap.masteries_requirement == 0: | ||
| 37 | new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners")) | ||
| 38 | new_door.complete_at = ap.endings_requirement | ||
| 39 | else: | ||
| 40 | var endings_merge = merging_prefab.instantiate() | ||
| 41 | endings_merge.name = "EndingsMerge" | ||
| 42 | endings_merge.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners")) | ||
| 43 | endings_merge.complete_at = ap.endings_requirement | ||
| 44 | root.get_node("/root/scene/Components").add_child.call_deferred(endings_merge) | ||
| 45 | new_door.senders.append(NodePath("/root/scene/Components/EndingsMerge")) | ||
| 46 | |||
| 47 | if ap.masteries_requirement == kALL_MASTERIES: | ||
| 48 | new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/MasteryListeners")) | ||
| 49 | new_door.excludeSenders.append( | ||
| 50 | NodePath("/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite") | ||
| 51 | ) | ||
| 52 | elif ap.masteries_requirement > 0: | ||
| 53 | if ap.endings_requirement == 0: | ||
| 54 | new_door.senderGroup.append( | ||
| 55 | NodePath("/root/scene/Meshes/Trophies/MasteryListeners") | ||
| 56 | ) | ||
| 57 | new_door.excludeSenders.append( | ||
| 58 | NodePath( | ||
| 59 | "/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite" | ||
| 60 | ) | ||
| 61 | ) | ||
| 62 | new_door.complete_at = ap.masteries_requirement | ||
| 63 | else: | ||
| 64 | var masteries_merge = merging_prefab.instantiate() | ||
| 65 | masteries_merge.name = "MasteriesMerge" | ||
| 66 | masteries_merge.senderGroup.append( | ||
| 67 | NodePath("/root/scene/Meshes/Trophies/MasteryListeners") | ||
| 68 | ) | ||
| 69 | masteries_merge.excludeSenders.append( | ||
| 70 | NodePath( | ||
| 71 | "/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite" | ||
| 72 | ) | ||
| 73 | ) | ||
| 74 | masteries_merge.complete_at = ap.masteries_requirement | ||
| 75 | root.get_node("/root/scene/Components").add_child.call_deferred(masteries_merge) | ||
| 76 | new_door.senders.append(NodePath("/root/scene/Components/MasteriesMerge")) | ||
| 77 | |||
| 78 | old_door.queue_free() | ||
| 79 | root.get_node("/root/scene/Components/Doors").add_child.call_deferred(new_door) | ||
| 80 | |||
| 81 | # Display White Ending requirements. | ||
| 82 | var ending_count = 0 | ||
| 83 | var mastery_count = 0 | ||
| 84 | for key in unlocks.data: | ||
| 85 | if unlocks.data[key] == "unlocked": | ||
| 86 | if key.ends_with("_ending") and key != "free_ending": | ||
| 87 | ending_count += 1 | ||
| 88 | elif key.ends_with("_mastery"): | ||
| 89 | mastery_count += 1 | ||
| 90 | |||
| 91 | var sign_prefab = preload("res://objects/nodes/sign.tscn") | ||
| 92 | var sign1 = sign_prefab.instantiate() | ||
| 93 | sign1.position = Vector3(87.5, 5, -42.01) | ||
| 94 | sign1.text = "Endings: %d/%d" % [ending_count, ap.endings_requirement] | ||
| 95 | root.get_node("/root/scene").add_child.call_deferred(sign1) | ||
| 96 | |||
| 97 | var sign2 = sign_prefab.instantiate() | ||
| 98 | sign2.position = Vector3(87.5, 5, -15.99) | ||
| 99 | sign2.rotation_degrees.y = 180 | ||
| 100 | sign2.text = "Masteries: %d/%d" % [mastery_count, ap.masteries_requirement] | ||
| 101 | root.get_node("/root/scene").add_child.call_deferred(sign2) | ||
| 102 | |||
| 103 | # Handle custom Mint Ending. | ||
| 104 | if ap.custom_mint_ending != "": | ||
| 105 | var panel_prefab = preload("res://objects/nodes/panel.tscn") | ||
| 106 | var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") | ||
| 107 | |||
| 108 | var mint_ending = root.get_node("/root/scene/Components/Endings/mint_ending") | ||
| 109 | |||
| 110 | var mint_panel = panel_prefab.instantiate() | ||
| 111 | mint_panel.name = "mint_panel" | ||
| 112 | mint_panel.clue = ap.custom_mint_ending | ||
| 113 | mint_panel.symbol = "" | ||
| 114 | mint_panel.answer = ap.custom_mint_ending | ||
| 115 | mint_panel.position = Vector3(-63, 3, -29) | ||
| 116 | mint_panel.rotation_degrees = Vector3(-45, 90, 0) | ||
| 117 | root.get_node("/root/scene").add_child.call_deferred(mint_panel) | ||
| 118 | |||
| 119 | var mint_tpl = tpl_prefab.instantiate() | ||
| 120 | mint_tpl.name = "mint_tpl" | ||
| 121 | mint_tpl.teleport_point = mint_ending.position | ||
| 122 | mint_tpl.teleport_rotate = mint_ending.rotation_degrees | ||
| 123 | mint_tpl.target_path = mint_ending | ||
| 124 | mint_tpl.senders.append(NodePath("/root/scene/mint_panel")) | ||
| 125 | root.get_node("/root/scene").add_child.call_deferred(mint_tpl) | ||
| 126 | |||
| 127 | var mint_tpl2 = tpl_prefab.instantiate() | ||
| 128 | mint_tpl2.name = "mint_tpl2" | ||
| 129 | mint_tpl2.teleport_point = Vector3(0, -1000, 0) | ||
| 130 | mint_tpl2.target_path = mint_panel | ||
| 131 | mint_tpl2.senders.append(NodePath("/root/scene/mint_panel")) | ||
| 132 | root.get_node("/root/scene").add_child.call_deferred(mint_tpl2) | ||
| 133 | |||
| 134 | mint_ending.position.y = -1000 | ||
| 135 | |||
| 136 | |||
| 137 | func _set_up_mastery_listener(root, name): | ||
| 138 | var prefab = preload("res://objects/nodes/listeners/unlockReaderListener.tscn") | ||
| 139 | var url = prefab.instantiate() | ||
| 140 | url.name = "unlockReaderListenerMastery_%s" % name | ||
| 141 | url.key = "%s_mastery" % name | ||
| 142 | url.value = "unlocked" | ||
| 143 | root.get_node("/root/scene/Meshes/Trophies/MasteryListeners").add_child.call_deferred(url) | ||
