about summary refs log tree commit diff stats
path: root/apworld/client
diff options
context:
space:
mode:
Diffstat (limited to 'apworld/client')
-rw-r--r--apworld/client/allowNumbers.gd10
-rw-r--r--apworld/client/gamedata.gd6
-rw-r--r--apworld/client/main.gd13
-rw-r--r--apworld/client/manager.gd7
-rw-r--r--apworld/client/player.gd177
5 files changed, 210 insertions, 3 deletions
diff --git a/apworld/client/allowNumbers.gd b/apworld/client/allowNumbers.gd new file mode 100644 index 0000000..d958b50 --- /dev/null +++ b/apworld/client/allowNumbers.gd
@@ -0,0 +1,10 @@
1extends "res://scripts/nodes/allowNumbers.gd"
2
3
4func _readier():
5 var ap = global.get_node("Archipelago")
6 var gamedata = global.get_node("Gamedata")
7
8 var item_id = gamedata.objects.get_special_ids()["Numbers"]
9 if ap.client.getItemAmount(item_id) >= 1:
10 global.allow_numbers = true
diff --git a/apworld/client/gamedata.gd b/apworld/client/gamedata.gd index 9305003..3a35125 100644 --- a/apworld/client/gamedata.gd +++ b/apworld/client/gamedata.gd
@@ -221,7 +221,11 @@ func _get_generated_door_location_name(door):
221 if door.get_type() != SCRIPT_proto.DoorType.STANDARD: 221 if door.get_type() != SCRIPT_proto.DoorType.STANDARD:
222 return null 222 return null
223 223
224 if door.get_keyholders().size() > 0 or door.get_endings().size() > 0 or door.has_complete_at(): 224 if (
225 door.get_keyholders().size() > 0
226 or (door.has_white_ending() and door.get_white_ending())
227 or door.has_complete_at()
228 ):
225 return null 229 return null
226 230
227 if door.get_panels().size() > 4: 231 if door.get_panels().size() > 4:
diff --git a/apworld/client/main.gd b/apworld/client/main.gd index 3a62f81..a543678 100644 --- a/apworld/client/main.gd +++ b/apworld/client/main.gd
@@ -36,6 +36,7 @@ func _ready():
36 global.add_child(ap_instance) 36 global.add_child(ap_instance)
37 37
38 # Let's also inject any scripts we need to inject now. 38 # Let's also inject any scripts we need to inject now.
39 installScriptExtension(runtime.load_script("allowNumbers.gd"))
39 installScriptExtension(runtime.load_script("animationListener.gd")) 40 installScriptExtension(runtime.load_script("animationListener.gd"))
40 installScriptExtension(runtime.load_script("collectable.gd")) 41 installScriptExtension(runtime.load_script("collectable.gd"))
41 installScriptExtension(runtime.load_script("door.gd")) 42 installScriptExtension(runtime.load_script("door.gd"))
@@ -83,6 +84,13 @@ func _ready():
83 compass_overlay_instance.SCRIPT_compass = runtime.load_script("compass.gd") 84 compass_overlay_instance.SCRIPT_compass = runtime.load_script("compass.gd")
84 global.add_child(compass_overlay_instance) 85 global.add_child(compass_overlay_instance)
85 86
87 unlocks.data["advanced_mastery"] = ""
88 unlocks.data["charismatic_mastery"] = ""
89 unlocks.data["crystalline_mastery"] = ""
90 unlocks.data["fuzzy_mastery"] = ""
91 unlocks.data["icarus_mastery"] = ""
92 unlocks.data["stellar_mastery"] = ""
93
86 var ap = global.get_node("Archipelago") 94 var ap = global.get_node("Archipelago")
87 var gamedata = global.get_node("Gamedata") 95 var gamedata = global.get_node("Gamedata")
88 ap.ap_connected.connect(connectionSuccessful) 96 ap.ap_connected.connect(connectionSuccessful)
@@ -224,11 +232,11 @@ func startGame():
224 232
225 unlocks.resetCollectables() 233 unlocks.resetCollectables()
226 unlocks.resetData() 234 unlocks.resetData()
235 unlocks.loadCollectables()
236 unlocks.loadData()
227 237
228 ap.setup_keys() 238 ap.setup_keys()
229 239
230 unlocks.loadCollectables()
231 unlocks.loadData()
232 unlocks.unlockKey("capslock", 1) 240 unlocks.unlockKey("capslock", 1)
233 241
234 if ap.shuffle_worldports: 242 if ap.shuffle_worldports:
@@ -237,6 +245,7 @@ func startGame():
237 settings.worldport_fades = "never" 245 settings.worldport_fades = "never"
238 246
239 clearResourceCache("res://objects/meshes/gridDoor.tscn") 247 clearResourceCache("res://objects/meshes/gridDoor.tscn")
248 clearResourceCache("res://objects/nodes/allowNumbers.tscn")
240 clearResourceCache("res://objects/nodes/collectable.tscn") 249 clearResourceCache("res://objects/nodes/collectable.tscn")
241 clearResourceCache("res://objects/nodes/door.tscn") 250 clearResourceCache("res://objects/nodes/door.tscn")
242 clearResourceCache("res://objects/nodes/keyHolder.tscn") 251 clearResourceCache("res://objects/nodes/keyHolder.tscn")
diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index 41ab648..aa07559 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd
@@ -65,7 +65,9 @@ var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2
65var daedalus_roof_access = false 65var daedalus_roof_access = false
66var enable_gift_maps = [] 66var enable_gift_maps = []
67var enable_icarus = false 67var enable_icarus = false
68var endings_requirement = 0
68var keyholder_sanity = false 69var keyholder_sanity = false
70var masteries_requirement = 0
69var port_pairings = {} 71var port_pairings = {}
70var shuffle_control_center_colors = false 72var shuffle_control_center_colors = false
71var shuffle_doors = false 73var shuffle_doors = false
@@ -259,6 +261,9 @@ func _process_item(item, amount):
259 if item_id == gamedata.objects.get_special_ids()["A Job Well Done"]: 261 if item_id == gamedata.objects.get_special_ids()["A Job Well Done"]:
260 update_job_well_done_sign() 262 update_job_well_done_sign()
261 263
264 if item_id == gamedata.objects.get_special_ids()["Numbers"] and global.map == "the_fuzzy":
265 global.allow_numbers = true
266
262 # Show a message about the item if it's new. 267 # Show a message about the item if it's new.
263 if int(item["index"]) > _last_new_item: 268 if int(item["index"]) > _last_new_item:
264 _last_new_item = int(item["index"]) 269 _last_new_item = int(item["index"])
@@ -443,7 +448,9 @@ func _client_connected(slot_data):
443 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) 448 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false))
444 enable_gift_maps = slot_data.get("enable_gift_maps", []) 449 enable_gift_maps = slot_data.get("enable_gift_maps", [])
445 enable_icarus = bool(slot_data.get("enable_icarus", false)) 450 enable_icarus = bool(slot_data.get("enable_icarus", false))
451 endings_requirement = int(slot_data.get("endings_requirement", 0))
446 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) 452 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false))
453 masteries_requirement = int(slot_data.get("masteries_requirement", 0))
447 shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false)) 454 shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false))
448 shuffle_doors = bool(slot_data.get("shuffle_doors", false)) 455 shuffle_doors = bool(slot_data.get("shuffle_doors", false))
449 shuffle_gallery_paintings = bool(slot_data.get("shuffle_gallery_paintings", false)) 456 shuffle_gallery_paintings = bool(slot_data.get("shuffle_gallery_paintings", false))
diff --git a/apworld/client/player.gd b/apworld/client/player.gd index 789d1b7..712a59b 100644 --- a/apworld/client/player.gd +++ b/apworld/client/player.gd
@@ -19,6 +19,85 @@ func _ready():
19 19
20 ap.start_batching_locations() 20 ap.start_batching_locations()
21 21
22 if global.map == "control_center":
23 get_node("/root/scene/Components/Doors/entry_18").queue_free()
24
25 _set_up_mastery_listener("advanced")
26 _set_up_mastery_listener("charismatic")
27 _set_up_mastery_listener("crystalline")
28 _set_up_mastery_listener("fuzzy")
29 _set_up_mastery_listener("icarus")
30 _set_up_mastery_listener("stellar")
31
32 if ap.endings_requirement != 12 or ap.masteries_requirement != 0:
33 # Set up listeners for the potential White Ending requirements.
34 var merging_prefab = preload("res://objects/nodes/listeners/mergingListener.tscn")
35
36 var old_door = get_node("/root/scene/Components/Doors/entry_19")
37 var new_door = old_door.duplicate()
38 new_door.name = "entry_19_new"
39 new_door.senders.clear()
40 new_door.senderGroup.clear()
41 new_door.excludeSenders.clear()
42
43 if ap.endings_requirement == 12:
44 new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners"))
45 elif ap.endings_requirement > 0:
46 if ap.masteries_requirement == 0:
47 new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners"))
48 new_door.complete_at = ap.endings_requirement
49 else:
50 var endings_merge = merging_prefab.instantiate()
51 endings_merge.name = "EndingsMerge"
52 endings_merge.senderGroup.append(
53 NodePath("/root/scene/Meshes/Trophies/Listeners")
54 )
55 endings_merge.complete_at = ap.endings_requirement
56 get_node("/root/scene/Components").add_child.call_deferred(endings_merge)
57 new_door.senders.append(NodePath("/root/scene/Components/EndingsMerge"))
58
59 var max_masteries = 13 + ap.enable_gift_maps.size()
60 if ap.enable_icarus:
61 max_masteries += 1
62
63 if ap.masteries_requirement == max_masteries:
64 new_door.senderGroup.append(
65 NodePath("/root/scene/Meshes/Trophies/MasteryListeners")
66 )
67 new_door.excludeSenders.append(
68 NodePath(
69 "/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite"
70 )
71 )
72 elif ap.masteries_requirement > 0:
73 if ap.endings_requirement == 0:
74 new_door.senderGroup.append(
75 NodePath("/root/scene/Meshes/Trophies/MasteryListeners")
76 )
77 new_door.excludeSenders.append(
78 NodePath(
79 "/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite"
80 )
81 )
82 new_door.complete_at = ap.masteries_requirement
83 else:
84 var masteries_merge = merging_prefab.instantiate()
85 masteries_merge.name = "MasteriesMerge"
86 masteries_merge.senderGroup.append(
87 NodePath("/root/scene/Meshes/Trophies/MasteryListeners")
88 )
89 masteries_merge.excludeSenders.append(
90 NodePath(
91 "/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite"
92 )
93 )
94 masteries_merge.complete_at = ap.masteries_requirement
95 get_node("/root/scene/Components").add_child.call_deferred(masteries_merge)
96 new_door.senders.append(NodePath("/root/scene/Components/MasteriesMerge"))
97
98 old_door.queue_free()
99 get_node("/root/scene/Components/Doors").add_child.call_deferred(new_door)
100
22 # Block off roof access in Daedalus. 101 # Block off roof access in Daedalus.
23 if global.map == "daedalus" and not ap.daedalus_roof_access: 102 if global.map == "daedalus" and not ap.daedalus_roof_access:
24 _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49) 103 _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49)
@@ -141,6 +220,29 @@ func _ready():
141 q_wpl.senders.append(NodePath("../QPanel")) 220 q_wpl.senders.append(NodePath("../QPanel"))
142 giftmap_parent.add_child.call_deferred(q_wpl) 221 giftmap_parent.add_child.call_deferred(q_wpl)
143 222
223 if ap.enable_gift_maps.has("The Fuzzy"):
224 var gongus_panel = panel_prefab.instantiate()
225 gongus_panel.name = "GongusPanel"
226 gongus_panel.answer = "gongus"
227 gongus_panel.position = Vector3(33.5, -260, 5.5)
228 giftmap_panel.proxies.append(NodePath("../GongusPanel"))
229 giftmap_parent.add_child.call_deferred(gongus_panel)
230
231 var kiwi_panel = panel_prefab.instantiate()
232 kiwi_panel.name = "KiwiPanel"
233 kiwi_panel.answer = "kiwi"
234 kiwi_panel.position = Vector3(33.5, -270, 5.5)
235 giftmap_panel.proxies.append(NodePath("../KiwiPanel"))
236 giftmap_parent.add_child.call_deferred(kiwi_panel)
237
238 var fuzzy_wpl = wpl_prefab.instantiate()
239 fuzzy_wpl.name = "FuzzyWpl"
240 fuzzy_wpl.exit = "the_fuzzy"
241 fuzzy_wpl.senders.append(NodePath("../GongusPanel"))
242 fuzzy_wpl.senders.append(NodePath("../KiwiPanel"))
243 fuzzy_wpl.complete_at = 1
244 giftmap_parent.add_child.call_deferred(fuzzy_wpl)
245
144 if ap.enable_gift_maps.has("The Stellar"): 246 if ap.enable_gift_maps.has("The Stellar"):
145 var hatkirby_panel = panel_prefab.instantiate() 247 var hatkirby_panel = panel_prefab.instantiate()
146 hatkirby_panel.name = "HatkirbyPanel" 248 hatkirby_panel.name = "HatkirbyPanel"
@@ -297,6 +399,7 @@ func _ready():
297 var collectable_prefab = preload("res://objects/nodes/collectable.tscn") 399 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
298 var saver_prefab = preload("res://objects/nodes/saver.tscn") 400 var saver_prefab = preload("res://objects/nodes/saver.tscn")
299 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") 401 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
402 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
300 403
301 var mastery = collectable_prefab.instantiate() 404 var mastery = collectable_prefab.instantiate()
302 mastery.name = "collectable" 405 mastery.name = "collectable"
@@ -314,6 +417,13 @@ func _ready():
314 tpl.nested = true 417 tpl.nested = true
315 mastery.add_child.call_deferred(tpl) 418 mastery.add_child.call_deferred(tpl)
316 419
420 var usl = usl_prefab.instantiate()
421 usl.name = "unlockSetterListenerMastery"
422 usl.key = "icarus_mastery"
423 usl.value = "unlocked"
424 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
425 get_node("/root/scene/Components").add_child.call_deferred(usl)
426
317 var saver = saver_prefab.instantiate() 427 var saver = saver_prefab.instantiate()
318 saver.name = "saver_collectables" 428 saver.name = "saver_collectables"
319 saver.type = "collectables" 429 saver.type = "collectables"
@@ -325,6 +435,7 @@ func _ready():
325 var collectable_prefab = preload("res://objects/nodes/collectable.tscn") 435 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
326 var saver_prefab = preload("res://objects/nodes/saver.tscn") 436 var saver_prefab = preload("res://objects/nodes/saver.tscn")
327 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") 437 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
438 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
328 439
329 var mastery = collectable_prefab.instantiate() 440 var mastery = collectable_prefab.instantiate()
330 mastery.name = "collectable" 441 mastery.name = "collectable"
@@ -343,6 +454,13 @@ func _ready():
343 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_31")) 454 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_31"))
344 mastery.add_child.call_deferred(tpl) 455 mastery.add_child.call_deferred(tpl)
345 456
457 var usl = usl_prefab.instantiate()
458 usl.name = "unlockSetterListenerMastery"
459 usl.key = "advanced_mastery"
460 usl.value = "unlocked"
461 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
462 get_node("/root/scene/Components").add_child.call_deferred(usl)
463
346 var saver = saver_prefab.instantiate() 464 var saver = saver_prefab.instantiate()
347 saver.name = "saver_collectables" 465 saver.name = "saver_collectables"
348 saver.type = "collectables" 466 saver.type = "collectables"
@@ -353,6 +471,7 @@ func _ready():
353 if global.map == "the_charismatic": 471 if global.map == "the_charismatic":
354 var collectable_prefab = preload("res://objects/nodes/collectable.tscn") 472 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
355 var saver_prefab = preload("res://objects/nodes/saver.tscn") 473 var saver_prefab = preload("res://objects/nodes/saver.tscn")
474 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
356 475
357 var mastery = collectable_prefab.instantiate() 476 var mastery = collectable_prefab.instantiate()
358 mastery.name = "collectable" 477 mastery.name = "collectable"
@@ -362,6 +481,13 @@ func _ready():
362 mastery.material_override = load("res://assets/materials/gold.material") 481 mastery.material_override = load("res://assets/materials/gold.material")
363 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery) 482 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
364 483
484 var usl = usl_prefab.instantiate()
485 usl.name = "unlockSetterListenerMastery"
486 usl.key = "charismatic_mastery"
487 usl.value = "unlocked"
488 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
489 get_node("/root/scene/Components").add_child.call_deferred(usl)
490
365 var saver = saver_prefab.instantiate() 491 var saver = saver_prefab.instantiate()
366 saver.name = "saver_collectables" 492 saver.name = "saver_collectables"
367 saver.type = "collectables" 493 saver.type = "collectables"
@@ -373,6 +499,7 @@ func _ready():
373 var collectable_prefab = preload("res://objects/nodes/collectable.tscn") 499 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
374 var saver_prefab = preload("res://objects/nodes/saver.tscn") 500 var saver_prefab = preload("res://objects/nodes/saver.tscn")
375 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") 501 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
502 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
376 503
377 var mastery = collectable_prefab.instantiate() 504 var mastery = collectable_prefab.instantiate()
378 mastery.name = "collectable" 505 mastery.name = "collectable"
@@ -389,6 +516,39 @@ func _ready():
389 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_3")) 516 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_3"))
390 mastery.add_child.call_deferred(tpl) 517 mastery.add_child.call_deferred(tpl)
391 518
519 var usl = usl_prefab.instantiate()
520 usl.name = "unlockSetterListenerMastery"
521 usl.key = "crystalline_mastery"
522 usl.value = "unlocked"
523 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
524 get_node("/root/scene/Components").add_child.call_deferred(usl)
525
526 var saver = saver_prefab.instantiate()
527 saver.name = "saver_collectables"
528 saver.type = "collectables"
529 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
530 get_node("/root/scene").add_child.call_deferred(saver)
531
532 # Add the mastery to The Fuzzy.
533 if global.map == "the_fuzzy":
534 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
535 var saver_prefab = preload("res://objects/nodes/saver.tscn")
536 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
537
538 var mastery = collectable_prefab.instantiate()
539 mastery.name = "collectable"
540 mastery.position = Vector3(0, 2, -20)
541 mastery.unlock_type = "smiley"
542 mastery.material_override = load("res://assets/materials/gold.material")
543 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
544
545 var usl = usl_prefab.instantiate()
546 usl.name = "unlockSetterListenerMastery"
547 usl.key = "fuzzy_mastery"
548 usl.value = "unlocked"
549 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
550 get_node("/root/scene/Components").add_child.call_deferred(usl)
551
392 var saver = saver_prefab.instantiate() 552 var saver = saver_prefab.instantiate()
393 saver.name = "saver_collectables" 553 saver.name = "saver_collectables"
394 saver.type = "collectables" 554 saver.type = "collectables"
@@ -399,6 +559,7 @@ func _ready():
399 if global.map == "the_stellar": 559 if global.map == "the_stellar":
400 var collectable_prefab = preload("res://objects/nodes/collectable.tscn") 560 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
401 var saver_prefab = preload("res://objects/nodes/saver.tscn") 561 var saver_prefab = preload("res://objects/nodes/saver.tscn")
562 var usl_prefab = preload("res://objects/nodes/listeners/unlockSetterListener.tscn")
402 563
403 var collectables = Node.new() 564 var collectables = Node.new()
404 collectables.name = "Collectables" 565 collectables.name = "Collectables"
@@ -412,6 +573,13 @@ func _ready():
412 collectables.add_child.call_deferred(mastery) 573 collectables.add_child.call_deferred(mastery)
413 get_node("/root/scene/Components").add_child.call_deferred(collectables) 574 get_node("/root/scene/Components").add_child.call_deferred(collectables)
414 575
576 var usl = usl_prefab.instantiate()
577 usl.name = "unlockSetterListenerMastery"
578 usl.key = "stellar_mastery"
579 usl.value = "unlocked"
580 usl.senders.append(NodePath("/root/scene/Components/Collectables/collectable"))
581 get_node("/root/scene/Components").add_child.call_deferred(usl)
582
415 var saver = saver_prefab.instantiate() 583 var saver = saver_prefab.instantiate()
416 saver.name = "saver_collectables" 584 saver.name = "saver_collectables"
417 saver.type = "collectables" 585 saver.type = "collectables"
@@ -585,5 +753,14 @@ func _set_up_invis_wall(x, y, z, sx, sy, sz):
585 get_parent().add_child.call_deferred(newwall) 753 get_parent().add_child.call_deferred(newwall)
586 754
587 755
756func _set_up_mastery_listener(name):
757 var prefab = preload("res://objects/nodes/listeners/unlockReaderListener.tscn")
758 var url = prefab.instantiate()
759 url.name = "unlockReaderListenerMastery_%s" % name
760 url.key = "%s_mastery" % name
761 url.value = "unlocked"
762 get_node("/root/scene/Meshes/Trophies/MasteryListeners").add_child.call_deferred(url)
763
764
588func _process(_dt): 765func _process(_dt):
589 compass.update_rotation(global_rotation.y) 766 compass.update_rotation(global_rotation.y)