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.gd139
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 @@
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 != 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
133func _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)