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.gd451
1 files changed, 316 insertions, 135 deletions
diff --git a/apworld/client/player.gd b/apworld/client/player.gd index 1330e24..8aee21a 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,84 @@ 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 tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
82 var wpl_prefab = preload("res://objects/nodes/listeners/worldportListener.tscn")
83
84 var giftmap_parent = Node.new()
85 giftmap_parent.name = "GiftMapEntrance"
86 get_node("/root/scene/Components").add_child.call_deferred(giftmap_parent)
87
88 var symbolless_player = ""
89 for i in range(ap.client.ap_user.length()):
90 if "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(
91 ap.client.ap_user[i]
92 ):
93 symbolless_player = symbolless_player + ap.client.ap_user[i].to_lower()
94
95 var giftmap_panel = panel_prefab.instantiate()
96 giftmap_panel.name = "Panel"
97 giftmap_panel.position = Vector3(33.5, -190, 5.5)
98 giftmap_panel.rotation_degrees = Vector3(-45, 0, 0)
99 giftmap_panel.clue = "player"
100 giftmap_panel.answer = symbolless_player
101
102 if ap.enable_gift_maps.has("The Advanced"):
103 var icely_panel = panel_prefab.instantiate()
104 icely_panel.name = "IcelyPanel"
105 icely_panel.answer = "icely"
106 icely_panel.position = Vector3(33.5, -200, 5.5)
107 giftmap_panel.proxies.append(NodePath("../IcelyPanel"))
108 giftmap_parent.add_child.call_deferred(icely_panel)
109
110 var icely_wpl = wpl_prefab.instantiate()
111 icely_wpl.name = "IcelyWpl"
112 icely_wpl.exit = "the_advanced"
113 icely_wpl.senders.append(NodePath("../IcelyPanel"))
114 giftmap_parent.add_child.call_deferred(icely_wpl)
115
116 if ap.enable_gift_maps.has("The Charismatic"):
117 var souvey_panel = panel_prefab.instantiate()
118 souvey_panel.name = "SouveyPanel"
119 souvey_panel.answer = "souvey"
120 souvey_panel.position = Vector3(33.5, -210, 5.5)
121 giftmap_panel.proxies.append(NodePath("../SouveyPanel"))
122 giftmap_parent.add_child.call_deferred(souvey_panel)
123
124 var souvey_wpl = wpl_prefab.instantiate()
125 souvey_wpl.name = "SouveyWpl"
126 souvey_wpl.exit = "the_charismatic"
127 souvey_wpl.senders.append(NodePath("../SouveyPanel"))
128 giftmap_parent.add_child.call_deferred(souvey_wpl)
129
130 if ap.enable_gift_maps.has("The Crystalline"):
131 var q_panel = panel_prefab.instantiate()
132 q_panel.name = "QPanel"
133 q_panel.answer = "q"
134 q_panel.position = Vector3(33.5, -220, 5.5)
135 giftmap_panel.proxies.append(NodePath("../QPanel"))
136 giftmap_parent.add_child.call_deferred(q_panel)
137
138 var q_wpl = wpl_prefab.instantiate()
139 q_wpl.name = "QWpl"
140 q_wpl.exit = "the_crystalline"
141 q_wpl.senders.append(NodePath("../QPanel"))
142 giftmap_parent.add_child.call_deferred(q_wpl)
143
144 giftmap_parent.add_child.call_deferred(giftmap_panel)
145
146 var giftmap_tpl = tpl_prefab.instantiate()
147 giftmap_tpl.name = "PanelTeleporter"
148 giftmap_tpl.teleport_point = Vector3(33.5, 1, 5.5)
149 giftmap_tpl.teleport_rotate = Vector3(-45, 0, 0)
150 giftmap_tpl.target_path = giftmap_panel
151 giftmap_tpl.senders.append(
152 NodePath("/root/scene/Components/Listeners/unlockReaderListenerDoubles")
153 )
154 giftmap_parent.add_child.call_deferred(giftmap_tpl)
155
213 # Add the strict purple ending validation. 156 # Add the strict purple ending validation.
214 if global.map == "the_sun_temple" and ap.strict_purple_ending: 157 if global.map == "the_sun_temple" and ap.strict_purple_ending:
215 var panel_prefab = preload("res://objects/nodes/panel.tscn") 158 var panel_prefab = preload("res://objects/nodes/panel.tscn")
@@ -318,8 +261,246 @@ func _ready():
318 var rte_trigger = get_node("/root/scene/Components/Warps/triggerArea") 261 var rte_trigger = get_node("/root/scene/Components/Warps/triggerArea")
319 rte_trigger.position.z = 0 262 rte_trigger.position.z = 0
320 263
264 # Add the mastery to Icarus.
265 if global.map == "icarus" and ap.enable_icarus:
266 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
267 var saver_prefab = preload("res://objects/nodes/saver.tscn")
268 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
269
270 var mastery = collectable_prefab.instantiate()
271 mastery.name = "collectable"
272 mastery.position = Vector3(0, -2000, 0)
273 mastery.unlock_type = "smiley"
274 mastery.material_override = load("res://assets/materials/gold.material")
275 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
276
277 var tpl = tpl_prefab.instantiate()
278 tpl.teleport_point = Vector3(56.25, 0, -5.5)
279 tpl.teleport_rotate = Vector3(0, 0, 0)
280 tpl.target_path = mastery
281 tpl.name = "Teleport"
282 tpl.senderGroup.append(NodePath("/root/scene/Panels"))
283 tpl.nested = true
284 mastery.add_child.call_deferred(tpl)
285
286 var saver = saver_prefab.instantiate()
287 saver.name = "saver_collectables"
288 saver.type = "collectables"
289 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
290 get_node("/root/scene").add_child.call_deferred(saver)
291
292 # Add the mastery to The Advanced.
293 if global.map == "the_advanced":
294 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
295 var saver_prefab = preload("res://objects/nodes/saver.tscn")
296 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
297
298 var mastery = collectable_prefab.instantiate()
299 mastery.name = "collectable"
300 mastery.position = Vector3(0, -200, -5)
301 mastery.unlock_type = "smiley"
302 mastery.material_override = load("res://assets/materials/gold.material")
303 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
304
305 var tpl = tpl_prefab.instantiate()
306 tpl.teleport_point = Vector3(0, 2, -5)
307 tpl.teleport_rotate = Vector3(0, 0, 0)
308 tpl.target_path = mastery
309 tpl.name = "Teleport"
310 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_29"))
311 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_30"))
312 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_31"))
313 mastery.add_child.call_deferred(tpl)
314
315 var saver = saver_prefab.instantiate()
316 saver.name = "saver_collectables"
317 saver.type = "collectables"
318 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
319 get_node("/root/scene").add_child.call_deferred(saver)
320
321 # Add the mastery to The Charismatic.
322 if global.map == "the_charismatic":
323 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
324 var saver_prefab = preload("res://objects/nodes/saver.tscn")
325
326 var mastery = collectable_prefab.instantiate()
327 mastery.name = "collectable"
328 mastery.position = Vector3(-17, 2, -29)
329 mastery.rotation_degrees = Vector3(0, 45, 0)
330 mastery.unlock_type = "smiley"
331 mastery.material_override = load("res://assets/materials/gold.material")
332 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
333
334 var saver = saver_prefab.instantiate()
335 saver.name = "saver_collectables"
336 saver.type = "collectables"
337 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
338 get_node("/root/scene").add_child.call_deferred(saver)
339
340 # Add the mastery to The Crystalline.
341 if global.map == "the_crystalline":
342 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
343 var saver_prefab = preload("res://objects/nodes/saver.tscn")
344 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
345
346 var mastery = collectable_prefab.instantiate()
347 mastery.name = "collectable"
348 mastery.position = Vector3(0, 13, 37)
349 mastery.unlock_type = "smiley"
350 mastery.material_override = load("res://assets/materials/gold.material")
351 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
352
353 var tpl = tpl_prefab.instantiate()
354 tpl.teleport_point = Vector3(0, 11.5, -20)
355 tpl.teleport_rotate = Vector3(0, 0, 180)
356 tpl.target_path = mastery
357 tpl.name = "Teleport"
358 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_3"))
359 mastery.add_child.call_deferred(tpl)
360
361 var saver = saver_prefab.instantiate()
362 saver.name = "saver_collectables"
363 saver.type = "collectables"
364 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
365 get_node("/root/scene").add_child.call_deferred(saver)
366
321 ap.update_job_well_done_sign() 367 ap.update_job_well_done_sign()
322 368
369 # Set up door locations.
370 var map_id = gamedata.map_id_by_name.get(global.map)
371 for door in gamedata.objects.get_doors():
372 if door.get_map_id() != map_id:
373 continue
374
375 if not door.has_ap_id():
376 continue
377
378 if (
379 door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY
380 or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING
381 or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR
382 ):
383 continue
384
385 var locationListener = ap.SCRIPT_locationListener.new()
386 locationListener.location_id = door.get_ap_id()
387 locationListener.name = "locationListener_%d" % door.get_ap_id()
388
389 for panel_ref in door.get_panels():
390 var panel_data = gamedata.objects.get_panels()[panel_ref.get_panel()]
391 var panel_path = panel_data.get_path()
392
393 if panel_ref.has_answer():
394 for proxy in panel_data.get_proxies():
395 if proxy.get_answer() == panel_ref.get_answer():
396 panel_path = proxy.get_path()
397 break
398
399 locationListener.senders.append(NodePath("/root/scene/" + panel_path))
400
401 for keyholder_ref in door.get_keyholders():
402 var keyholder_data = gamedata.objects.get_keyholders()[keyholder_ref.get_keyholder()]
403
404 var khl = khl_script.new()
405 khl.name = (
406 "location_%d_keyholder_%d" % [door.get_ap_id(), keyholder_ref.get_keyholder()]
407 )
408 khl.answer = keyholder_ref.get_key()
409 khl.senders.append(NodePath("/root/scene/" + keyholder_data.get_path()))
410 get_parent().add_child.call_deferred(khl)
411
412 locationListener.senders.append(NodePath("../" + khl.name))
413
414 for sender in door.get_senders():
415 locationListener.senders.append(NodePath("/root/scene/" + sender))
416
417 if door.has_complete_at():
418 locationListener.complete_at = door.get_complete_at()
419
420 get_parent().add_child.call_deferred(locationListener)
421
422 # Set up letter locations.
423 for letter in gamedata.objects.get_letters():
424 var room = gamedata.objects.get_rooms()[letter.get_room_id()]
425 if room.get_map_id() != map_id:
426 continue
427
428 var locationListener = ap.SCRIPT_locationListener.new()
429 locationListener.location_id = letter.get_ap_id()
430 locationListener.name = "locationListener_%d" % letter.get_ap_id()
431 locationListener.senders.append(NodePath("/root/scene/" + letter.get_path()))
432
433 get_parent().add_child.call_deferred(locationListener)
434
435 if (
436 ap.get_letter_behavior(letter.get_key(), letter.has_level2() and letter.get_level2())
437 != ap.kLETTER_BEHAVIOR_VANILLA
438 ):
439 var scout = ap.scout_location(letter.get_ap_id())
440 if scout != null and not (scout["for_self"] and scout["flags"] & 4 != 0):
441 var collectable = get_tree().get_root().get_node("scene").get_node_or_null(
442 letter.get_path()
443 )
444 if collectable != null:
445 collectable.setScoutedText.call_deferred(scout["item"])
446
447 # Set up mastery locations.
448 for mastery in gamedata.objects.get_masteries():
449 var room = gamedata.objects.get_rooms()[mastery.get_room_id()]
450 if room.get_map_id() != map_id:
451 continue
452
453 var locationListener = ap.SCRIPT_locationListener.new()
454 locationListener.location_id = mastery.get_ap_id()
455 locationListener.name = "locationListener_%d" % mastery.get_ap_id()
456 locationListener.senders.append(NodePath("/root/scene/" + mastery.get_path()))
457
458 get_parent().add_child.call_deferred(locationListener)
459
460 # Set up ending locations.
461 for ending in gamedata.objects.get_endings():
462 var room = gamedata.objects.get_rooms()[ending.get_room_id()]
463 if room.get_map_id() != map_id:
464 continue
465
466 var locationListener = ap.SCRIPT_locationListener.new()
467 locationListener.location_id = ending.get_ap_id()
468 locationListener.name = "locationListener_%d" % ending.get_ap_id()
469 locationListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
470
471 get_parent().add_child.call_deferred(locationListener)
472
473 if ap.kEndingNameByVictoryValue.get(ap.victory_condition, null) == ending.get_name():
474 var victoryListener = ap.SCRIPT_victoryListener.new()
475 victoryListener.name = "victoryListener"
476 victoryListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
477
478 get_parent().add_child.call_deferred(victoryListener)
479
480 # Set up keyholder locations, in keyholder sanity.
481 if ap.keyholder_sanity:
482 for keyholder in gamedata.objects.get_keyholders():
483 if not keyholder.has_key():
484 continue
485
486 var room = gamedata.objects.get_rooms()[keyholder.get_room_id()]
487 if room.get_map_id() != map_id:
488 continue
489
490 var locationListener = ap.SCRIPT_locationListener.new()
491 locationListener.location_id = keyholder.get_ap_id()
492 locationListener.name = "locationListener_%d" % keyholder.get_ap_id()
493
494 var khl = khl_script.new()
495 khl.name = "location_%d_keyholder" % keyholder.get_ap_id()
496 khl.answer = keyholder.get_key()
497 khl.senders.append(NodePath("/root/scene/" + keyholder.get_path()))
498 get_parent().add_child.call_deferred(khl)
499
500 locationListener.senders.append(NodePath("../" + khl.name))
501
502 get_parent().add_child.call_deferred(locationListener)
503
323 var minimap = ap.SCRIPT_minimap.new() 504 var minimap = ap.SCRIPT_minimap.new()
324 minimap.name = "Minimap" 505 minimap.name = "Minimap"
325 minimap.visible = ap.show_minimap 506 minimap.visible = ap.show_minimap