about summary refs log tree commit diff stats
path: root/apworld/client/maps/control_center.gd
blob: 8e919ab717cd29184d936639d6210baab58c901c (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
const kALL_MASTERIES = 19


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"))

		if ap.masteries_requirement == kALL_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)

	# Display White Ending requirements.
	var ending_count = 0
	var mastery_count = 0
	for key in unlocks.data:
		if unlocks.data[key] == "unlocked":
			if key.ends_with("_ending") and key != "free_ending":
				ending_count += 1
			elif key.ends_with("_mastery"):
				mastery_count += 1

	var sign_prefab = preload("res://objects/nodes/sign.tscn")
	var sign1 = sign_prefab.instantiate()
	sign1.position = Vector3(87.5, 5, -42.01)
	sign1.text = "Endings: %d/%d" % [ending_count, ap.endings_requirement]
	root.get_node("/root/scene").add_child.call_deferred(sign1)

	var sign2 = sign_prefab.instantiate()
	sign2.position = Vector3(87.5, 5, -15.99)
	sign2.rotation_degrees.y = 180
	sign2.text = "Masteries: %d/%d" % [mastery_count, ap.masteries_requirement]
	root.get_node("/root/scene").add_child.call_deferred(sign2)

	# Handle custom Mint Ending.
	if ap.custom_mint_ending != "":
		var panel_prefab = preload("res://objects/nodes/panel.tscn")
		var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")

		var mint_ending = root.get_node("/root/scene/Components/Endings/mint_ending")

		var mint_panel = panel_prefab.instantiate()
		mint_panel.name = "mint_panel"
		mint_panel.clue = ap.custom_mint_ending
		mint_panel.symbol = ""
		mint_panel.answer = ap.custom_mint_ending
		mint_panel.position = Vector3(-63, 3, -29)
		mint_panel.rotation_degrees = Vector3(-45, 90, 0)
		root.get_node("/root/scene").add_child.call_deferred(mint_panel)

		var mint_tpl = tpl_prefab.instantiate()
		mint_tpl.name = "mint_tpl"
		mint_tpl.teleport_point = mint_ending.position
		mint_tpl.teleport_rotate = mint_ending.rotation_degrees
		mint_tpl.target_path = mint_ending
		mint_tpl.senders.append(NodePath("/root/scene/mint_panel"))
		root.get_node("/root/scene").add_child.call_deferred(mint_tpl)

		var mint_tpl2 = tpl_prefab.instantiate()
		mint_tpl2.name = "mint_tpl2"
		mint_tpl2.teleport_point = Vector3(0, -1000, 0)
		mint_tpl2.target_path = mint_panel
		mint_tpl2.senders.append(NodePath("/root/scene/mint_panel"))
		root.get_node("/root/scene").add_child.call_deferred(mint_tpl2)

		mint_ending.position.y = -1000


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)