about summary refs log tree commit diff stats
path: root/apworld/client/maps/control_center.gd
diff options
context:
space:
mode:
Diffstat (limited to 'apworld/client/maps/control_center.gd')
-rw-r--r--apworld/client/maps/control_center.gd143
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 @@
1const kALL_MASTERIES = 19
2
3
4func 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
137func _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)