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