about summary refs log tree commit diff stats
path: root/client/Archipelago/player.gd
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2025-09-25 12:09:50 -0400
committerStar Rauchenberger <fefferburbia@gmail.com>2025-09-25 12:09:50 -0400
commit3f53502a5907ed1982d28a392c54331f0c1c2c42 (patch)
tree1dd087464d0fba1c35feaab0cee357fca6f2763c /client/Archipelago/player.gd
parentfb220e1c75e72a536c19aa1283f905850a91cf44 (diff)
downloadlingo2-archipelago-3f53502a5907ed1982d28a392c54331f0c1c2c42.tar.gz
lingo2-archipelago-3f53502a5907ed1982d28a392c54331f0c1c2c42.tar.bz2
lingo2-archipelago-3f53502a5907ed1982d28a392c54331f0c1c2c42.zip
Move the client into the apworld
Only works on source right now, not as an apworld.
Diffstat (limited to 'client/Archipelago/player.gd')
-rw-r--r--client/Archipelago/player.gd369
1 files changed, 0 insertions, 369 deletions
diff --git a/client/Archipelago/player.gd b/client/Archipelago/player.gd deleted file mode 100644 index e58f1bc..0000000 --- a/client/Archipelago/player.gd +++ /dev/null
@@ -1,369 +0,0 @@
1extends "res://scripts/nodes/player.gd"
2
3const kEndingNameByVictoryValue = {
4 0: "GRAY",
5 1: "PURPLE",
6 2: "MINT",
7 3: "BLACK",
8 4: "BLUE",
9 5: "CYAN",
10 6: "RED",
11 7: "PLUM",
12 8: "ORANGE",
13 9: "GOLD",
14 10: "YELLOW",
15 11: "GREEN",
16 12: "WHITE",
17}
18
19signal evaluate_solvability
20
21var compass
22
23
24func _ready():
25 var khl_script = load("res://scripts/nodes/keyHolderListener.gd")
26
27 var pause_menu = get_node("pause_menu")
28 pause_menu.layer = 3
29
30 var ap = global.get_node("Archipelago")
31 var gamedata = global.get_node("Gamedata")
32
33 compass = global.get_node("Compass")
34 compass.visible = ap.show_compass
35
36 ap.start_batching_locations()
37
38 # Set up door locations.
39 var map_id = gamedata.map_id_by_name.get(global.map)
40 for door in gamedata.objects.get_doors():
41 if door.get_map_id() != map_id:
42 continue
43
44 if not door.has_ap_id():
45 continue
46
47 if (
48 door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY
49 or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING
50 ):
51 continue
52
53 var locationListener = ap.SCRIPT_locationListener.new()
54 locationListener.location_id = door.get_ap_id()
55 locationListener.name = "locationListener_%d" % door.get_ap_id()
56
57 for panel_ref in door.get_panels():
58 var panel_data = gamedata.objects.get_panels()[panel_ref.get_panel()]
59 var panel_path = panel_data.get_path()
60
61 if panel_ref.has_answer():
62 for proxy in panel_data.get_proxies():
63 if proxy.get_answer() == panel_ref.get_answer():
64 panel_path = proxy.get_path()
65 break
66
67 locationListener.senders.append(NodePath("/root/scene/" + panel_path))
68
69 for keyholder_ref in door.get_keyholders():
70 var keyholder_data = gamedata.objects.get_keyholders()[keyholder_ref.get_keyholder()]
71
72 var khl = khl_script.new()
73 khl.name = (
74 "location_%d_keyholder_%d" % [door.get_ap_id(), keyholder_ref.get_keyholder()]
75 )
76 khl.answer = keyholder_ref.get_key()
77 khl.senders.append(NodePath("/root/scene/" + keyholder_data.get_path()))
78 get_parent().add_child.call_deferred(khl)
79
80 locationListener.senders.append(NodePath("../" + khl.name))
81
82 for sender in door.get_senders():
83 locationListener.senders.append(NodePath("/root/scene/" + sender))
84
85 if door.has_complete_at():
86 locationListener.complete_at = door.get_complete_at()
87
88 get_parent().add_child.call_deferred(locationListener)
89
90 # Set up letter locations.
91 for letter in gamedata.objects.get_letters():
92 var room = gamedata.objects.get_rooms()[letter.get_room_id()]
93 if room.get_map_id() != map_id:
94 continue
95
96 var locationListener = ap.SCRIPT_locationListener.new()
97 locationListener.location_id = letter.get_ap_id()
98 locationListener.name = "locationListener_%d" % letter.get_ap_id()
99 locationListener.senders.append(NodePath("/root/scene/" + letter.get_path()))
100
101 get_parent().add_child.call_deferred(locationListener)
102
103 if (
104 ap.get_letter_behavior(letter.get_key(), letter.has_level2() and letter.get_level2())
105 != ap.kLETTER_BEHAVIOR_VANILLA
106 ):
107 var scout = ap.scout_location(letter.get_ap_id())
108 if (
109 scout != null
110 and not (scout["player"] == ap.client._slot and scout["flags"] & 4 != 0)
111 ):
112 var item_name = "Unknown"
113 var item_player_game = ap.client._game_by_player[float(scout["player"])]
114 if ap.client._item_id_to_name[item_player_game].has(scout["item"]):
115 item_name = ap.client._item_id_to_name[item_player_game][scout["item"]]
116
117 var collectable = get_tree().get_root().get_node("scene").get_node_or_null(
118 letter.get_path()
119 )
120 if collectable != null:
121 collectable.setScoutedText.call_deferred(item_name)
122
123 # Set up mastery locations.
124 for mastery in gamedata.objects.get_masteries():
125 var room = gamedata.objects.get_rooms()[mastery.get_room_id()]
126 if room.get_map_id() != map_id:
127 continue
128
129 var locationListener = ap.SCRIPT_locationListener.new()
130 locationListener.location_id = mastery.get_ap_id()
131 locationListener.name = "locationListener_%d" % mastery.get_ap_id()
132 locationListener.senders.append(NodePath("/root/scene/" + mastery.get_path()))
133
134 get_parent().add_child.call_deferred(locationListener)
135
136 # Set up ending locations.
137 for ending in gamedata.objects.get_endings():
138 var room = gamedata.objects.get_rooms()[ending.get_room_id()]
139 if room.get_map_id() != map_id:
140 continue
141
142 var locationListener = ap.SCRIPT_locationListener.new()
143 locationListener.location_id = ending.get_ap_id()
144 locationListener.name = "locationListener_%d" % ending.get_ap_id()
145 locationListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
146
147 get_parent().add_child.call_deferred(locationListener)
148
149 if kEndingNameByVictoryValue.get(ap.victory_condition, null) == ending.get_name():
150 var victoryListener = ap.SCRIPT_victoryListener.new()
151 victoryListener.name = "victoryListener"
152 victoryListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
153
154 get_parent().add_child.call_deferred(victoryListener)
155
156 # Set up keyholder locations, in keyholder sanity.
157 if ap.keyholder_sanity:
158 for keyholder in gamedata.objects.get_keyholders():
159 if not keyholder.has_key():
160 continue
161
162 var room = gamedata.objects.get_rooms()[keyholder.get_room_id()]
163 if room.get_map_id() != map_id:
164 continue
165
166 var locationListener = ap.SCRIPT_locationListener.new()
167 locationListener.location_id = keyholder.get_ap_id()
168 locationListener.name = "locationListener_%d" % keyholder.get_ap_id()
169
170 var khl = khl_script.new()
171 khl.name = "location_%d_keyholder" % keyholder.get_ap_id()
172 khl.answer = keyholder.get_key()
173 khl.senders.append(NodePath("/root/scene/" + keyholder.get_path()))
174 get_parent().add_child.call_deferred(khl)
175
176 locationListener.senders.append(NodePath("../" + khl.name))
177
178 get_parent().add_child.call_deferred(locationListener)
179
180 # Block off roof access in Daedalus.
181 if global.map == "daedalus" and not ap.daedalus_roof_access:
182 _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49)
183 _set_up_invis_wall(51.5, 11, -17, 16, 10, 1)
184 _set_up_invis_wall(46, 10, -9.5, 1, 10, 10)
185 _set_up_invis_wall(67.5, 11, 17, 16, 10, 1)
186 _set_up_invis_wall(50.5, 11, 14, 10, 10, 1)
187 _set_up_invis_wall(39, 10, 18.5, 1, 10, 22)
188 _set_up_invis_wall(20, 15, 18.5, 1, 10, 16)
189 _set_up_invis_wall(11.5, 15, 3, 32, 10, 1)
190 _set_up_invis_wall(11.5, 16, -20, 14, 20, 1)
191 _set_up_invis_wall(14, 16, -26.5, 1, 20, 4)
192 _set_up_invis_wall(28.5, 20.5, -26.5, 1, 15, 25)
193 _set_up_invis_wall(40.5, 20.5, -11, 30, 15, 1)
194 _set_up_invis_wall(50.5, 15, 5.5, 7, 10, 1)
195 _set_up_invis_wall(83.5, 33.5, 5.5, 1, 7, 11)
196 _set_up_invis_wall(83.5, 33.5, -5.5, 1, 7, 11)
197
198 var warp_exit_prefab = preload("res://objects/nodes/exit.tscn")
199 var warp_exit = warp_exit_prefab.instantiate()
200 warp_exit.name = "roof_access_blocker_warp_exit"
201 warp_exit.position = Vector3(58, 10, 0)
202 warp_exit.rotation_degrees.y = 90
203 get_parent().add_child.call_deferred(warp_exit)
204
205 var warp_enter_prefab = preload("res://objects/nodes/teleportAuto.tscn")
206 var warp_enter = warp_enter_prefab.instantiate()
207 warp_enter.target = warp_exit
208 warp_enter.position = Vector3(76.5, 30, 1)
209 warp_enter.scale = Vector3(4, 1.5, 1)
210 warp_enter.rotation_degrees.y = 90
211 get_parent().add_child.call_deferred(warp_enter)
212
213 if global.map == "the_entry":
214 # Remove door behind X1.
215 var door_node = get_tree().get_root().get_node("/root/scene/Components/Doors/exit_1")
216 door_node.handleTriggered()
217
218 # Display win condition.
219 var sign_prefab = preload("res://objects/nodes/sign.tscn")
220 var sign1 = sign_prefab.instantiate()
221 sign1.position = Vector3(-7, 5, -15.01)
222 sign1.text = "victory"
223 get_parent().add_child.call_deferred(sign1)
224
225 var sign2 = sign_prefab.instantiate()
226 sign2.position = Vector3(-7, 4, -15.01)
227 sign2.text = "%s ending" % kEndingNameByVictoryValue.get(ap.victory_condition, "?")
228
229 var sign2_color = kEndingNameByVictoryValue.get(ap.victory_condition, "coral").to_lower()
230 if sign2_color == "white":
231 sign2_color = "silver"
232
233 sign2.material = load("res://assets/materials/%s.material" % sign2_color)
234 get_parent().add_child.call_deferred(sign2)
235
236 # Add the strict purple ending validation.
237 if global.map == "the_sun_temple" and ap.strict_purple_ending:
238 var panel_prefab = preload("res://objects/nodes/panel.tscn")
239 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
240 var reverse_prefab = preload("res://objects/nodes/listeners/reversingListener.tscn")
241
242 var previous_panel = null
243 var next_y = -100
244 var words = ["quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
245 for word in words:
246 var panel = panel_prefab.instantiate()
247 panel.position = Vector3(0, next_y, 0)
248 next_y -= 10
249 panel.clue = word
250 panel.symbol = ""
251 panel.answer = word
252 panel.name = "EndCheck_%s" % word
253
254 var tpl = tpl_prefab.instantiate()
255 tpl.teleport_point = Vector3(0, 1, 0)
256 tpl.teleport_rotate = Vector3(-45, 180, 0)
257 tpl.target_path = panel
258 tpl.name = "Teleport"
259
260 if previous_panel == null:
261 tpl.senders.append(NodePath("/root/scene/Panels/End/panel_24"))
262 else:
263 tpl.senders.append(NodePath("../../%s" % previous_panel.name))
264
265 var reversing = reverse_prefab.instantiate()
266 reversing.senders.append(NodePath(".."))
267 reversing.name = "Reversing"
268 tpl.senders.append(NodePath("../Reversing"))
269
270 panel.add_child.call_deferred(tpl)
271 panel.add_child.call_deferred(reversing)
272 get_parent().get_node("Panels").add_child.call_deferred(panel)
273
274 previous_panel = panel
275
276 # Duplicate the doors that usually wait on EQUINOX. We can't set the senders
277 # here for some reason so we actually set them in the door ready function.
278 var endplat = get_node("/root/scene/Components/Doors/EndPlatform")
279 var endplat2 = endplat.duplicate()
280 endplat2.name = "spe_EndPlatform"
281 endplat.get_parent().add_child.call_deferred(endplat2)
282 endplat.queue_free()
283
284 var entry2 = get_node("/root/scene/Components/Doors/entry_2")
285 var entry22 = entry2.duplicate()
286 entry22.name = "spe_entry_2"
287 entry2.get_parent().add_child.call_deferred(entry22)
288 entry2.queue_free()
289
290 # Add the strict cyan ending validation.
291 if global.map == "the_parthenon" and ap.strict_cyan_ending:
292 var panel_prefab = preload("res://objects/nodes/panel.tscn")
293 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
294 var reverse_prefab = preload("res://objects/nodes/listeners/reversingListener.tscn")
295
296 var previous_panel = null
297 var next_y = -100
298 var words = ["quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
299 for word in words:
300 var panel = panel_prefab.instantiate()
301 panel.position = Vector3(0, next_y, 0)
302 next_y -= 10
303 panel.clue = word
304 panel.symbol = "."
305 panel.answer = "%s%s" % [word, word]
306 panel.name = "EndCheck_%s" % word
307
308 var tpl = tpl_prefab.instantiate()
309 tpl.teleport_point = Vector3(0, 1, -11)
310 tpl.teleport_rotate = Vector3(-45, 0, 0)
311 tpl.target_path = panel
312 tpl.name = "Teleport"
313
314 if previous_panel == null:
315 tpl.senderGroup.append(NodePath("/root/scene/Panels/Rulers"))
316 else:
317 tpl.senders.append(NodePath("../../%s" % previous_panel.name))
318
319 var reversing = reverse_prefab.instantiate()
320 reversing.senders.append(NodePath(".."))
321 reversing.name = "Reversing"
322 tpl.senders.append(NodePath("../Reversing"))
323
324 panel.add_child.call_deferred(tpl)
325 panel.add_child.call_deferred(reversing)
326 get_parent().get_node("Panels").add_child.call_deferred(panel)
327
328 previous_panel = panel
329
330 # Duplicate the door that usually waits on the rulers. We can't set the
331 # senders here for some reason so we actually set them in the door ready
332 # function.
333 var entry1 = get_node("/root/scene/Components/Doors/entry_1")
334 var entry12 = entry1.duplicate()
335 entry12.name = "spe_entry_1"
336 entry1.get_parent().add_child.call_deferred(entry12)
337 entry1.queue_free()
338
339 var minimap = ap.SCRIPT_minimap.new()
340 minimap.name = "Minimap"
341 get_parent().add_child.call_deferred(minimap)
342
343 super._ready()
344
345 await get_tree().process_frame
346 await get_tree().process_frame
347
348 ap.stop_batching_locations()
349
350
351func _set_up_invis_wall(x, y, z, sx, sy, sz):
352 var prefab = preload("res://objects/nodes/block.tscn")
353 var newwall = prefab.instantiate()
354 newwall.position.x = x
355 newwall.position.y = y
356 newwall.position.z = z
357 newwall.scale.x = sz
358 newwall.scale.y = sy
359 newwall.scale.z = sx
360 newwall.set_surface_override_material(0, preload("res://assets/materials/blackMatte.material"))
361 newwall.visibility_range_end = 3
362 newwall.visibility_range_end_margin = 1
363 newwall.visibility_range_fade_mode = RenderingServer.VISIBILITY_RANGE_FADE_SELF
364 newwall.skeleton = ".."
365 get_parent().add_child.call_deferred(newwall)
366
367
368func _process(_dt):
369 compass.update_rotation(global_rotation.y)