about summary refs log tree commit diff stats
path: root/apworld/client/player.gd
diff options
context:
space:
mode:
Diffstat (limited to 'apworld/client/player.gd')
-rw-r--r--apworld/client/player.gd343
1 files changed, 208 insertions, 135 deletions
diff --git a/apworld/client/player.gd b/apworld/client/player.gd index b73f61e..43bf758 100644 --- a/apworld/client/player.gd +++ b/apworld/client/player.gd
@@ -19,141 +19,6 @@ func _ready():
19 19
20 ap.start_batching_locations() 20 ap.start_batching_locations()
21 21
22 # Set up door locations.
23 var map_id = gamedata.map_id_by_name.get(global.map)
24 for door in gamedata.objects.get_doors():
25 if door.get_map_id() != map_id:
26 continue
27
28 if not door.has_ap_id():
29 continue
30
31 if (
32 door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY
33 or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING
34 or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR
35 ):
36 continue
37
38 var locationListener = ap.SCRIPT_locationListener.new()
39 locationListener.location_id = door.get_ap_id()
40 locationListener.name = "locationListener_%d" % door.get_ap_id()
41
42 for panel_ref in door.get_panels():
43 var panel_data = gamedata.objects.get_panels()[panel_ref.get_panel()]
44 var panel_path = panel_data.get_path()
45
46 if panel_ref.has_answer():
47 for proxy in panel_data.get_proxies():
48 if proxy.get_answer() == panel_ref.get_answer():
49 panel_path = proxy.get_path()
50 break
51
52 locationListener.senders.append(NodePath("/root/scene/" + panel_path))
53
54 for keyholder_ref in door.get_keyholders():
55 var keyholder_data = gamedata.objects.get_keyholders()[keyholder_ref.get_keyholder()]
56
57 var khl = khl_script.new()
58 khl.name = (
59 "location_%d_keyholder_%d" % [door.get_ap_id(), keyholder_ref.get_keyholder()]
60 )
61 khl.answer = keyholder_ref.get_key()
62 khl.senders.append(NodePath("/root/scene/" + keyholder_data.get_path()))
63 get_parent().add_child.call_deferred(khl)
64
65 locationListener.senders.append(NodePath("../" + khl.name))
66
67 for sender in door.get_senders():
68 locationListener.senders.append(NodePath("/root/scene/" + sender))
69
70 if door.has_complete_at():
71 locationListener.complete_at = door.get_complete_at()
72
73 get_parent().add_child.call_deferred(locationListener)
74
75 # Set up letter locations.
76 for letter in gamedata.objects.get_letters():
77 var room = gamedata.objects.get_rooms()[letter.get_room_id()]
78 if room.get_map_id() != map_id:
79 continue
80
81 var locationListener = ap.SCRIPT_locationListener.new()
82 locationListener.location_id = letter.get_ap_id()
83 locationListener.name = "locationListener_%d" % letter.get_ap_id()
84 locationListener.senders.append(NodePath("/root/scene/" + letter.get_path()))
85
86 get_parent().add_child.call_deferred(locationListener)
87
88 if (
89 ap.get_letter_behavior(letter.get_key(), letter.has_level2() and letter.get_level2())
90 != ap.kLETTER_BEHAVIOR_VANILLA
91 ):
92 var scout = ap.scout_location(letter.get_ap_id())
93 if scout != null and not (scout["for_self"] and scout["flags"] & 4 != 0):
94 var collectable = get_tree().get_root().get_node("scene").get_node_or_null(
95 letter.get_path()
96 )
97 if collectable != null:
98 collectable.setScoutedText.call_deferred(scout["item"])
99
100 # Set up mastery locations.
101 for mastery in gamedata.objects.get_masteries():
102 var room = gamedata.objects.get_rooms()[mastery.get_room_id()]
103 if room.get_map_id() != map_id:
104 continue
105
106 var locationListener = ap.SCRIPT_locationListener.new()
107 locationListener.location_id = mastery.get_ap_id()
108 locationListener.name = "locationListener_%d" % mastery.get_ap_id()
109 locationListener.senders.append(NodePath("/root/scene/" + mastery.get_path()))
110
111 get_parent().add_child.call_deferred(locationListener)
112
113 # Set up ending locations.
114 for ending in gamedata.objects.get_endings():
115 var room = gamedata.objects.get_rooms()[ending.get_room_id()]
116 if room.get_map_id() != map_id:
117 continue
118
119 var locationListener = ap.SCRIPT_locationListener.new()
120 locationListener.location_id = ending.get_ap_id()
121 locationListener.name = "locationListener_%d" % ending.get_ap_id()
122 locationListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
123
124 get_parent().add_child.call_deferred(locationListener)
125
126 if ap.kEndingNameByVictoryValue.get(ap.victory_condition, null) == ending.get_name():
127 var victoryListener = ap.SCRIPT_victoryListener.new()
128 victoryListener.name = "victoryListener"
129 victoryListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
130
131 get_parent().add_child.call_deferred(victoryListener)
132
133 # Set up keyholder locations, in keyholder sanity.
134 if ap.keyholder_sanity:
135 for keyholder in gamedata.objects.get_keyholders():
136 if not keyholder.has_key():
137 continue
138
139 var room = gamedata.objects.get_rooms()[keyholder.get_room_id()]
140 if room.get_map_id() != map_id:
141 continue
142
143 var locationListener = ap.SCRIPT_locationListener.new()
144 locationListener.location_id = keyholder.get_ap_id()
145 locationListener.name = "locationListener_%d" % keyholder.get_ap_id()
146
147 var khl = khl_script.new()
148 khl.name = "location_%d_keyholder" % keyholder.get_ap_id()
149 khl.answer = keyholder.get_key()
150 khl.senders.append(NodePath("/root/scene/" + keyholder.get_path()))
151 get_parent().add_child.call_deferred(khl)
152
153 locationListener.senders.append(NodePath("../" + khl.name))
154
155 get_parent().add_child.call_deferred(locationListener)
156
157 # Block off roof access in Daedalus. 22 # Block off roof access in Daedalus.
158 if global.map == "daedalus" and not ap.daedalus_roof_access: 23 if global.map == "daedalus" and not ap.daedalus_roof_access:
159 _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49) 24 _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49)
@@ -210,6 +75,45 @@ func _ready():
210 sign2.material = load("res://assets/materials/%s.material" % sign2_color) 75 sign2.material = load("res://assets/materials/%s.material" % sign2_color)
211 get_parent().add_child.call_deferred(sign2) 76 get_parent().add_child.call_deferred(sign2)
212 77
78 # Add the gift map entry panel if needed.
79 if not ap.enable_gift_maps.is_empty():
80 var panel_prefab = preload("res://objects/nodes/panel.tscn")
81 var wpl_prefab = preload("res://objects/nodes/listeners/worldportListener.tscn")
82
83 var giftmap_parent = Node.new()
84 giftmap_parent.name = "GiftMapEntrance"
85 get_node("/root/scene/Components").add_child.call_deferred(giftmap_parent)
86
87 var symbolless_player = ""
88 for i in range(ap.client.ap_user.length()):
89 if "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(
90 ap.client.ap_user[i]
91 ):
92 symbolless_player = symbolless_player + ap.client.ap_user[i].to_lower()
93
94 var giftmap_panel = panel_prefab.instantiate()
95 giftmap_panel.name = "Panel"
96 giftmap_panel.position = Vector3(33.5, 1, 5.5)
97 giftmap_panel.rotation_degrees = Vector3(-45, 0, 0)
98 giftmap_panel.clue = "player"
99 giftmap_panel.answer = symbolless_player
100
101 if ap.enable_gift_maps.has("The Advanced"):
102 var icely_panel = panel_prefab.instantiate()
103 icely_panel.name = "IcelyPanel"
104 icely_panel.answer = "icely"
105 icely_panel.position = Vector3(33.5, -200, 5.5)
106 giftmap_panel.proxies.append(NodePath("../IcelyPanel"))
107 giftmap_parent.add_child.call_deferred(icely_panel)
108
109 var icely_wpl = wpl_prefab.instantiate()
110 icely_wpl.name = "IcelyWpl"
111 icely_wpl.exit = "the_advanced"
112 icely_wpl.senders.append(NodePath("../IcelyPanel"))
113 giftmap_parent.add_child.call_deferred(icely_wpl)
114
115 giftmap_parent.add_child.call_deferred(giftmap_panel)
116
213 # Add the strict purple ending validation. 117 # Add the strict purple ending validation.
214 if global.map == "the_sun_temple" and ap.strict_purple_ending: 118 if global.map == "the_sun_temple" and ap.strict_purple_ending:
215 var panel_prefab = preload("res://objects/nodes/panel.tscn") 119 var panel_prefab = preload("res://objects/nodes/panel.tscn")
@@ -313,8 +217,177 @@ func _ready():
313 entry1.get_parent().add_child.call_deferred(entry12) 217 entry1.get_parent().add_child.call_deferred(entry12)
314 entry1.queue_free() 218 entry1.queue_free()
315 219
220 # Move the Plaza RTE trigger outside of the turtle.
221 if global.map == "the_plaza":
222 var rte_trigger = get_node("/root/scene/Components/Warps/triggerArea")
223 rte_trigger.position.z = 0
224
225 # Add the mastery to The Advanced.
226 if global.map == "the_advanced":
227 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
228 var saver_prefab = preload("res://objects/nodes/saver.tscn")
229 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
230
231 var mastery = collectable_prefab.instantiate()
232 mastery.name = "collectable"
233 mastery.position = Vector3(0, -200, -5)
234 mastery.unlock_type = "smiley"
235 mastery.material_override = load("res://assets/materials/gold.material")
236 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
237
238 var tpl = tpl_prefab.instantiate()
239 tpl.teleport_point = Vector3(0, 2, -5)
240 tpl.teleport_rotate = Vector3(0, 0, 0)
241 tpl.target_path = mastery
242 tpl.name = "Teleport"
243 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_29"))
244 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_30"))
245 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_31"))
246 mastery.add_child.call_deferred(tpl)
247
248 var saver = saver_prefab.instantiate()
249 saver.name = "saver_collectables"
250 saver.type = "collectables"
251 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
252 get_node("/root/scene").add_child.call_deferred(saver)
253
316 ap.update_job_well_done_sign() 254 ap.update_job_well_done_sign()
317 255
256 # Set up door locations.
257 var map_id = gamedata.map_id_by_name.get(global.map)
258 for door in gamedata.objects.get_doors():
259 if door.get_map_id() != map_id:
260 continue
261
262 if not door.has_ap_id():
263 continue
264
265 if (
266 door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY
267 or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING
268 or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR
269 ):
270 continue
271
272 var locationListener = ap.SCRIPT_locationListener.new()
273 locationListener.location_id = door.get_ap_id()
274 locationListener.name = "locationListener_%d" % door.get_ap_id()
275
276 for panel_ref in door.get_panels():
277 var panel_data = gamedata.objects.get_panels()[panel_ref.get_panel()]
278 var panel_path = panel_data.get_path()
279
280 if panel_ref.has_answer():
281 for proxy in panel_data.get_proxies():
282 if proxy.get_answer() == panel_ref.get_answer():
283 panel_path = proxy.get_path()
284 break
285
286 locationListener.senders.append(NodePath("/root/scene/" + panel_path))
287
288 for keyholder_ref in door.get_keyholders():
289 var keyholder_data = gamedata.objects.get_keyholders()[keyholder_ref.get_keyholder()]
290
291 var khl = khl_script.new()
292 khl.name = (
293 "location_%d_keyholder_%d" % [door.get_ap_id(), keyholder_ref.get_keyholder()]
294 )
295 khl.answer = keyholder_ref.get_key()
296 khl.senders.append(NodePath("/root/scene/" + keyholder_data.get_path()))
297 get_parent().add_child.call_deferred(khl)
298
299 locationListener.senders.append(NodePath("../" + khl.name))
300
301 for sender in door.get_senders():
302 locationListener.senders.append(NodePath("/root/scene/" + sender))
303
304 if door.has_complete_at():
305 locationListener.complete_at = door.get_complete_at()
306
307 get_parent().add_child.call_deferred(locationListener)
308
309 # Set up letter locations.
310 for letter in gamedata.objects.get_letters():
311 var room = gamedata.objects.get_rooms()[letter.get_room_id()]
312 if room.get_map_id() != map_id:
313 continue
314
315 var locationListener = ap.SCRIPT_locationListener.new()
316 locationListener.location_id = letter.get_ap_id()
317 locationListener.name = "locationListener_%d" % letter.get_ap_id()
318 locationListener.senders.append(NodePath("/root/scene/" + letter.get_path()))
319
320 get_parent().add_child.call_deferred(locationListener)
321
322 if (
323 ap.get_letter_behavior(letter.get_key(), letter.has_level2() and letter.get_level2())
324 != ap.kLETTER_BEHAVIOR_VANILLA
325 ):
326 var scout = ap.scout_location(letter.get_ap_id())
327 if scout != null and not (scout["for_self"] and scout["flags"] & 4 != 0):
328 var collectable = get_tree().get_root().get_node("scene").get_node_or_null(
329 letter.get_path()
330 )
331 if collectable != null:
332 collectable.setScoutedText.call_deferred(scout["item"])
333
334 # Set up mastery locations.
335 for mastery in gamedata.objects.get_masteries():
336 var room = gamedata.objects.get_rooms()[mastery.get_room_id()]
337 if room.get_map_id() != map_id:
338 continue
339
340 var locationListener = ap.SCRIPT_locationListener.new()
341 locationListener.location_id = mastery.get_ap_id()
342 locationListener.name = "locationListener_%d" % mastery.get_ap_id()
343 locationListener.senders.append(NodePath("/root/scene/" + mastery.get_path()))
344
345 get_parent().add_child.call_deferred(locationListener)
346
347 # Set up ending locations.
348 for ending in gamedata.objects.get_endings():
349 var room = gamedata.objects.get_rooms()[ending.get_room_id()]
350 if room.get_map_id() != map_id:
351 continue
352
353 var locationListener = ap.SCRIPT_locationListener.new()
354 locationListener.location_id = ending.get_ap_id()
355 locationListener.name = "locationListener_%d" % ending.get_ap_id()
356 locationListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
357
358 get_parent().add_child.call_deferred(locationListener)
359
360 if ap.kEndingNameByVictoryValue.get(ap.victory_condition, null) == ending.get_name():
361 var victoryListener = ap.SCRIPT_victoryListener.new()
362 victoryListener.name = "victoryListener"
363 victoryListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
364
365 get_parent().add_child.call_deferred(victoryListener)
366
367 # Set up keyholder locations, in keyholder sanity.
368 if ap.keyholder_sanity:
369 for keyholder in gamedata.objects.get_keyholders():
370 if not keyholder.has_key():
371 continue
372
373 var room = gamedata.objects.get_rooms()[keyholder.get_room_id()]
374 if room.get_map_id() != map_id:
375 continue
376
377 var locationListener = ap.SCRIPT_locationListener.new()
378 locationListener.location_id = keyholder.get_ap_id()
379 locationListener.name = "locationListener_%d" % keyholder.get_ap_id()
380
381 var khl = khl_script.new()
382 khl.name = "location_%d_keyholder" % keyholder.get_ap_id()
383 khl.answer = keyholder.get_key()
384 khl.senders.append(NodePath("/root/scene/" + keyholder.get_path()))
385 get_parent().add_child.call_deferred(khl)
386
387 locationListener.senders.append(NodePath("../" + khl.name))
388
389 get_parent().add_child.call_deferred(locationListener)
390
318 var minimap = ap.SCRIPT_minimap.new() 391 var minimap = ap.SCRIPT_minimap.new()
319 minimap.name = "Minimap" 392 minimap.name = "Minimap"
320 minimap.visible = ap.show_minimap 393 minimap.visible = ap.show_minimap