about summary refs log tree commit diff stats
path: root/apworld/client/maps/control_center.gd
blob: de9ae4b55d63692b4c92081faad9e24a0ee22735 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
func on_map_load(root):
	var ap = global.get_node("Archipelago")

	# Remove the door blocking the trophy case.
	root.get_node("/root/scene/Components/Doors/entry_18").queue_free()

	# Set up mastery listeners for extra maps.
	_set_up_mastery_listener(root, "advanced")
	_set_up_mastery_listener(root, "charismatic")
	_set_up_mastery_listener(root, "crystalline")
	_set_up_mastery_listener(root, "fuzzy")
	_set_up_mastery_listener(root, "icarus")
	_set_up_mastery_listener(root, "stellar")

	if ap.endings_requirement != 12 or ap.masteries_requirement != 0:
		# Set up listeners for the potential White Ending requirements.
		var merging_prefab = preload("res://objects/nodes/listeners/mergingListener.tscn")

		var old_door = root.get_node("/root/scene/Components/Doors/entry_19")
		var new_door = old_door.duplicate()
		new_door.name = "entry_19_new"
		new_door.senders.clear()
		new_door.senderGroup.clear()
		new_door.excludeSenders.clear()

		if ap.endings_requirement == 12:
			new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners"))
		elif ap.endings_requirement > 0:
			if ap.masteries_requirement == 0:
				new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners"))
				new_door.complete_at = ap.endings_requirement
			else:
				var endings_merge = merging_prefab.instantiate()
				endings_merge.name = "EndingsMerge"
				endings_merge.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/Listeners"))
				endings_merge.complete_at = ap.endings_requirement
				root.get_node("/root/scene/Components").add_child.call_deferred(endings_merge)
				new_door.senders.append(NodePath("/root/scene/Components/EndingsMerge"))

		var max_masteries = 13 + ap.enable_gift_maps.size()
		if ap.enable_icarus:
			max_masteries += 1

		if ap.masteries_requirement == max_masteries:
			new_door.senderGroup.append(NodePath("/root/scene/Meshes/Trophies/MasteryListeners"))
			new_door.excludeSenders.append(
				NodePath("/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite")
			)
		elif ap.masteries_requirement > 0:
			if ap.endings_requirement == 0:
				new_door.senderGroup.append(
					NodePath("/root/scene/Meshes/Trophies/MasteryListeners")
				)
				new_door.excludeSenders.append(
					NodePath(
						"/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite"
					)
				)
				new_door.complete_at = ap.masteries_requirement
			else:
				var masteries_merge = merging_prefab.instantiate()
				masteries_merge.name = "MasteriesMerge"
				masteries_merge.senderGroup.append(
					NodePath("/root/scene/Meshes/Trophies/MasteryListeners")
				)
				masteries_merge.excludeSenders.append(
					NodePath(
						"/root/scene/Meshes/Trophies/MasteryListeners/unlockReaderListenerWhite"
					)
				)
				masteries_merge.complete_at = ap.masteries_requirement
				root.get_node("/root/scene/Components").add_child.call_deferred(masteries_merge)
				new_door.senders.append(NodePath("/root/scene/Components/MasteriesMerge"))

		old_door.queue_free()
		root.get_node("/root/scene/Components/Doors").add_child.call_deferred(new_door)


func _set_up_mastery_listener(root, name):
	var prefab = preload("res://objects/nodes/listeners/unlockReaderListener.tscn")
	var url = prefab.instantiate()
	url.name = "unlockReaderListenerMastery_%s" % name
	url.key = "%s_mastery" % name
	url.value = "unlocked"
	root.get_node("/root/scene/Meshes/Trophies/MasteryListeners").add_child.call_deferred(url)