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.gd219
1 files changed, 219 insertions, 0 deletions
diff --git a/apworld/client/player.gd b/apworld/client/player.gd new file mode 100644 index 0000000..dabc15d --- /dev/null +++ b/apworld/client/player.gd
@@ -0,0 +1,219 @@
1extends "res://scripts/nodes/player.gd"
2
3signal evaluate_solvability
4
5var compass
6
7
8func _ready():
9 var khl_script = load("res://scripts/nodes/keyHolderListener.gd")
10
11 var pause_menu = get_node("pause_menu")
12 pause_menu.layer = 3
13
14 var ap = global.get_node("Archipelago")
15 var gamedata = global.get_node("Gamedata")
16 var map_id = gamedata.map_id_by_name.get(global.map)
17 var map_data = gamedata.objects.get_maps()[map_id]
18
19 compass = global.get_node("Compass")
20 compass.visible = ap.show_compass
21
22 ap.start_batching_locations()
23
24 # Run map-specific initialization.
25 var map_script = ap.get_map_script(global.map)
26 if map_script != null:
27 map_script.on_map_load(get_tree().get_root())
28
29 ap.update_job_well_done_sign()
30
31 # Set up the RTE trigger, if there is one.
32 if map_data.has_rte_trigger_pos():
33 var oneShotListener_prefab = preload("res://objects/nodes/listeners/oneShotListener.tscn")
34 var triggerArea_prefab = preload("res://objects/nodes/triggerArea.tscn")
35 var unlockSetterListener_prefab = preload(
36 "res://objects/nodes/listeners/unlockSetterListener.tscn"
37 )
38
39 var triggerArea = triggerArea_prefab.instantiate()
40 triggerArea.name = "rte_triggerArea"
41 triggerArea.position = gamedata.vec3d_to_vector3(map_data.get_rte_trigger_pos())
42 triggerArea.scale = gamedata.vec3d_to_vector3(map_data.get_rte_trigger_scale())
43 get_parent().add_child.call_deferred(triggerArea)
44
45 var osl = oneShotListener_prefab.instantiate()
46 osl.name = "rte_osl"
47 osl.senders.append(NodePath("/root/scene/rte_triggerArea"))
48 get_parent().add_child.call_deferred(osl)
49
50 var usl = unlockSetterListener_prefab.instantiate()
51 usl.name = "rte_usl"
52 usl.key = "rte_%s" % global.map
53 usl.value = "unlocked"
54 usl.senders.append(NodePath("/root/scene/rte_osl"))
55 get_parent().add_child.call_deferred(usl)
56
57 # Set up door locations.
58 for door in gamedata.objects.get_doors():
59 if door.get_map_id() != map_id:
60 continue
61
62 if not door.has_ap_id():
63 continue
64
65 if (
66 not (door.has_legacy_location() and door.get_legacy_location())
67 and (
68 door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY
69 or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING
70 or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR
71 )
72 ):
73 continue
74
75 var locationListener = ap.SCRIPT_locationListener.new()
76 locationListener.location_id = door.get_ap_id()
77 locationListener.name = "locationListener_%d" % door.get_ap_id()
78
79 for panel_ref in door.get_panels():
80 var panel_data = gamedata.objects.get_panels()[panel_ref.get_panel()]
81 var panel_path = panel_data.get_path()
82
83 if panel_ref.has_answer():
84 for proxy in panel_data.get_proxies():
85 if proxy.get_answer() == panel_ref.get_answer():
86 panel_path = proxy.get_path()
87 break
88
89 locationListener.senders.append(NodePath("/root/scene/" + panel_path))
90
91 for keyholder_ref in door.get_keyholders():
92 var keyholder_data = gamedata.objects.get_keyholders()[keyholder_ref.get_keyholder()]
93
94 var khl = khl_script.new()
95 khl.name = (
96 "location_%d_keyholder_%d" % [door.get_ap_id(), keyholder_ref.get_keyholder()]
97 )
98 khl.answer = keyholder_ref.get_key()
99 khl.senders.append(NodePath("/root/scene/" + keyholder_data.get_path()))
100 get_parent().add_child.call_deferred(khl)
101
102 locationListener.senders.append(NodePath("../" + khl.name))
103
104 for sender in door.get_senders():
105 locationListener.senders.append(NodePath("/root/scene/" + sender))
106
107 if door.has_complete_at():
108 locationListener.complete_at = door.get_complete_at()
109
110 get_parent().add_child.call_deferred(locationListener)
111
112 # Set up letter locations.
113 for letter in gamedata.objects.get_letters():
114 var room = gamedata.objects.get_rooms()[letter.get_room_id()]
115 if room.get_map_id() != map_id:
116 continue
117
118 var locationListener = ap.SCRIPT_locationListener.new()
119 locationListener.location_id = letter.get_ap_id()
120 locationListener.name = "locationListener_%d" % letter.get_ap_id()
121 locationListener.senders.append(NodePath("/root/scene/" + letter.get_path()))
122
123 get_parent().add_child.call_deferred(locationListener)
124
125 if (
126 ap.get_letter_behavior(letter.get_key(), letter.has_level2() and letter.get_level2())
127 != ap.kLETTER_BEHAVIOR_VANILLA
128 ):
129 var scout = ap.scout_location(letter.get_ap_id())
130 if scout != null and not (scout["for_self"] and scout["flags"] & 4 != 0):
131 var collectable = get_tree().get_root().get_node("scene").get_node_or_null(
132 letter.get_path()
133 )
134 if collectable != null:
135 collectable.setScoutedText.call_deferred(scout["item"])
136
137 # Set up mastery locations.
138 for mastery in gamedata.objects.get_masteries():
139 var room = gamedata.objects.get_rooms()[mastery.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 = mastery.get_ap_id()
145 locationListener.name = "locationListener_%d" % mastery.get_ap_id()
146 locationListener.senders.append(NodePath("/root/scene/" + mastery.get_path()))
147
148 get_parent().add_child.call_deferred(locationListener)
149
150 # Set up ending locations.
151 for ending in gamedata.objects.get_endings():
152 var room = gamedata.objects.get_rooms()[ending.get_room_id()]
153 if room.get_map_id() != map_id:
154 continue
155
156 var locationListener = ap.SCRIPT_locationListener.new()
157 locationListener.location_id = ending.get_ap_id()
158 locationListener.name = "locationListener_%d" % ending.get_ap_id()
159 locationListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
160
161 get_parent().add_child.call_deferred(locationListener)
162
163 if ap.kEndingNameByVictoryValue.get(ap.victory_condition, null) == ending.get_name():
164 var victoryListener = ap.SCRIPT_victoryListener.new()
165 victoryListener.name = "victoryListener"
166 victoryListener.senders.append(NodePath("/root/scene/" + ending.get_path()))
167
168 get_parent().add_child.call_deferred(victoryListener)
169
170 # Set up keyholder locations, in keyholder sanity.
171 if ap.keyholder_sanity:
172 for keyholder in gamedata.objects.get_keyholders():
173 if not keyholder.has_key():
174 continue
175
176 var room = gamedata.objects.get_rooms()[keyholder.get_room_id()]
177 if room.get_map_id() != map_id:
178 continue
179
180 var locationListener = ap.SCRIPT_locationListener.new()
181 locationListener.location_id = keyholder.get_ap_id()
182 locationListener.name = "locationListener_%d" % keyholder.get_ap_id()
183
184 var khl = khl_script.new()
185 khl.name = "location_%d_keyholder" % keyholder.get_ap_id()
186 khl.answer = keyholder.get_key()
187 khl.senders.append(NodePath("/root/scene/" + keyholder.get_path()))
188 get_parent().add_child.call_deferred(khl)
189
190 locationListener.senders.append(NodePath("../" + khl.name))
191
192 get_parent().add_child.call_deferred(locationListener)
193
194 var minimap = ap.SCRIPT_minimap.new()
195 minimap.name = "Minimap"
196 minimap.visible = ap.show_minimap
197 get_parent().add_child.call_deferred(minimap)
198
199 if ap.music_mapping.has(global.map):
200 var song_setter = get_node_or_null("/root/scene/songSetter")
201 if song_setter:
202 song_setter.song_name = ap.music_mapping[global.map]
203 else:
204 var song_setter_prefab = preload("res://objects/nodes/songSetter.tscn")
205 song_setter = song_setter_prefab.instantiate()
206 song_setter.name = "songSetter"
207 song_setter.song_name = ap.music_mapping[global.map]
208 get_parent().add_child.call_deferred(song_setter)
209
210 super._ready()
211
212 await get_tree().process_frame
213 await get_tree().process_frame
214
215 ap.stop_batching_locations()
216
217
218func _process(_dt):
219 compass.update_rotation(global_rotation.y)