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.gd428
1 files changed, 10 insertions, 418 deletions
diff --git a/apworld/client/player.gd b/apworld/client/player.gd index 789d1b7..5fac9fd 100644 --- a/apworld/client/player.gd +++ b/apworld/client/player.gd
@@ -19,404 +19,10 @@ func _ready():
19 19
20 ap.start_batching_locations() 20 ap.start_batching_locations()
21 21
22 # Block off roof access in Daedalus. 22 # Run map-specific initialization.
23 if global.map == "daedalus" and not ap.daedalus_roof_access: 23 var map_script = ap.get_map_script(global.map)
24 _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49) 24 if map_script != null:
25 _set_up_invis_wall(51.5, 11, -17, 16, 10, 1) 25 map_script.on_map_load(get_tree().get_root())
26 _set_up_invis_wall(46, 10, -9.5, 1, 10, 10)
27 _set_up_invis_wall(67.5, 11, 17, 16, 10, 1)
28 _set_up_invis_wall(50.5, 11, 14, 10, 10, 1)
29 _set_up_invis_wall(39, 10, 18.5, 1, 10, 22)
30 _set_up_invis_wall(20, 15, 18.5, 1, 10, 16)
31 _set_up_invis_wall(11.5, 15, 3, 32, 10, 1)
32 _set_up_invis_wall(11.5, 16, -20, 14, 20, 1)
33 _set_up_invis_wall(14, 16, -26.5, 1, 20, 4)
34 _set_up_invis_wall(28.5, 20.5, -26.5, 1, 15, 25)
35 _set_up_invis_wall(40.5, 20.5, -11, 30, 15, 1)
36 _set_up_invis_wall(50.5, 15, 5.5, 7, 10, 1)
37 _set_up_invis_wall(83.5, 33.5, 5.5, 1, 7, 11)
38 _set_up_invis_wall(83.5, 33.5, -5.5, 1, 7, 11)
39
40 var warp_exit_prefab = preload("res://objects/nodes/exit.tscn")
41 var warp_exit = warp_exit_prefab.instantiate()
42 warp_exit.name = "roof_access_blocker_warp_exit"
43 warp_exit.position = Vector3(58, 10, 0)
44 warp_exit.rotation_degrees.y = 90
45 get_parent().add_child.call_deferred(warp_exit)
46
47 var warp_enter_prefab = preload("res://objects/nodes/teleportAuto.tscn")
48 var warp_enter = warp_enter_prefab.instantiate()
49 warp_enter.target = warp_exit
50 warp_enter.position = Vector3(76.5, 30, 1)
51 warp_enter.scale = Vector3(4, 1.5, 1)
52 warp_enter.rotation_degrees.y = 90
53 get_parent().add_child.call_deferred(warp_enter)
54
55 if global.map == "the_entry":
56 # Remove door behind X1.
57 var door_node = get_tree().get_root().get_node("/root/scene/Components/Doors/exit_1")
58 door_node.handleTriggered()
59
60 # Display win condition.
61 var sign_prefab = preload("res://objects/nodes/sign.tscn")
62 var sign1 = sign_prefab.instantiate()
63 sign1.position = Vector3(-7, 5, -15.01)
64 sign1.text = "victory"
65 get_parent().add_child.call_deferred(sign1)
66
67 var sign2 = sign_prefab.instantiate()
68 sign2.position = Vector3(-7, 4, -15.01)
69 sign2.text = "%s ending" % ap.kEndingNameByVictoryValue.get(ap.victory_condition, "?")
70
71 var sign2_color = ap.kEndingNameByVictoryValue.get(ap.victory_condition, "coral").to_lower()
72 if sign2_color == "white":
73 sign2_color = "silver"
74
75 sign2.material = load("res://assets/materials/%s.material" % sign2_color)
76 get_parent().add_child.call_deferred(sign2)
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 if ap.enable_gift_maps.has("The Stellar"):
145 var hatkirby_panel = panel_prefab.instantiate()
146 hatkirby_panel.name = "HatkirbyPanel"
147 hatkirby_panel.answer = "hatkirby"
148 hatkirby_panel.position = Vector3(33.5, -230, 5.5)
149 giftmap_panel.proxies.append(NodePath("../HatkirbyPanel"))
150 giftmap_parent.add_child.call_deferred(hatkirby_panel)
151
152 var kirby_panel = panel_prefab.instantiate()
153 kirby_panel.name = "KirbyPanel"
154 kirby_panel.answer = "kirby"
155 kirby_panel.position = Vector3(33.5, -240, 5.5)
156 giftmap_panel.proxies.append(NodePath("../KirbyPanel"))
157 giftmap_parent.add_child.call_deferred(kirby_panel)
158
159 var star_panel = panel_prefab.instantiate()
160 star_panel.name = "StarPanel"
161 star_panel.answer = "star"
162 star_panel.position = Vector3(33.5, -250, 5.5)
163 giftmap_panel.proxies.append(NodePath("../StarPanel"))
164 giftmap_parent.add_child.call_deferred(star_panel)
165
166 var stellar_wpl = wpl_prefab.instantiate()
167 stellar_wpl.name = "StellarWpl"
168 stellar_wpl.exit = "the_stellar"
169 stellar_wpl.senders.append(NodePath("../HatkirbyPanel"))
170 stellar_wpl.senders.append(NodePath("../KirbyPanel"))
171 stellar_wpl.senders.append(NodePath("../StarPanel"))
172 stellar_wpl.complete_at = 1
173 giftmap_parent.add_child.call_deferred(stellar_wpl)
174
175 giftmap_parent.add_child.call_deferred(giftmap_panel)
176
177 var giftmap_tpl = tpl_prefab.instantiate()
178 giftmap_tpl.name = "PanelTeleporter"
179 giftmap_tpl.teleport_point = Vector3(33.5, 1, 5.5)
180 giftmap_tpl.teleport_rotate = Vector3(-45, 0, 0)
181 giftmap_tpl.target_path = giftmap_panel
182 giftmap_tpl.senders.append(
183 NodePath("/root/scene/Components/Listeners/unlockReaderListenerDoubles")
184 )
185 giftmap_parent.add_child.call_deferred(giftmap_tpl)
186
187 # Add the strict purple ending validation.
188 if global.map == "the_sun_temple" and ap.strict_purple_ending:
189 var panel_prefab = preload("res://objects/nodes/panel.tscn")
190 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
191 var reverse_prefab = preload("res://objects/nodes/listeners/reversingListener.tscn")
192
193 var previous_panel = null
194 var next_y = -100
195 var words = ["quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
196 for word in words:
197 var panel = panel_prefab.instantiate()
198 panel.position = Vector3(0, next_y, 0)
199 next_y -= 10
200 panel.clue = word
201 panel.symbol = ""
202 panel.answer = word
203 panel.name = "EndCheck_%s" % word
204
205 var tpl = tpl_prefab.instantiate()
206 tpl.teleport_point = Vector3(0, 1, 0)
207 tpl.teleport_rotate = Vector3(-45, 180, 0)
208 tpl.target_path = panel
209 tpl.name = "Teleport"
210
211 if previous_panel == null:
212 tpl.senders.append(NodePath("/root/scene/Panels/End/panel_24"))
213 else:
214 tpl.senders.append(NodePath("../../%s" % previous_panel.name))
215
216 var reversing = reverse_prefab.instantiate()
217 reversing.senders.append(NodePath(".."))
218 reversing.name = "Reversing"
219 tpl.senders.append(NodePath("../Reversing"))
220
221 panel.add_child.call_deferred(tpl)
222 panel.add_child.call_deferred(reversing)
223 get_parent().get_node("Panels").add_child.call_deferred(panel)
224
225 previous_panel = panel
226
227 # Duplicate the doors that usually wait on EQUINOX. We can't set the senders
228 # here for some reason so we actually set them in the door ready function.
229 var endplat = get_node("/root/scene/Components/Doors/EndPlatform")
230 var endplat2 = endplat.duplicate()
231 endplat2.name = "spe_EndPlatform"
232 endplat.get_parent().add_child.call_deferred(endplat2)
233 endplat.queue_free()
234
235 var entry2 = get_node("/root/scene/Components/Doors/entry_2")
236 var entry22 = entry2.duplicate()
237 entry22.name = "spe_entry_2"
238 entry2.get_parent().add_child.call_deferred(entry22)
239 entry2.queue_free()
240
241 # Add the strict cyan ending validation.
242 if global.map == "the_parthenon" and ap.strict_cyan_ending:
243 var panel_prefab = preload("res://objects/nodes/panel.tscn")
244 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
245 var reverse_prefab = preload("res://objects/nodes/listeners/reversingListener.tscn")
246
247 var previous_panel = null
248 var next_y = -100
249 var words = ["quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
250 for word in words:
251 var panel = panel_prefab.instantiate()
252 panel.position = Vector3(0, next_y, 0)
253 next_y -= 10
254 panel.clue = word
255 panel.symbol = "."
256 panel.answer = "%s%s" % [word, word]
257 panel.name = "EndCheck_%s" % word
258
259 var tpl = tpl_prefab.instantiate()
260 tpl.teleport_point = Vector3(0, 1, -11)
261 tpl.teleport_rotate = Vector3(-45, 0, 0)
262 tpl.target_path = panel
263 tpl.name = "Teleport"
264
265 if previous_panel == null:
266 tpl.senderGroup.append(NodePath("/root/scene/Panels/Rulers"))
267 else:
268 tpl.senders.append(NodePath("../../%s" % previous_panel.name))
269
270 var reversing = reverse_prefab.instantiate()
271 reversing.senders.append(NodePath(".."))
272 reversing.name = "Reversing"
273 tpl.senders.append(NodePath("../Reversing"))
274
275 panel.add_child.call_deferred(tpl)
276 panel.add_child.call_deferred(reversing)
277 get_parent().get_node("Panels").add_child.call_deferred(panel)
278
279 previous_panel = panel
280
281 # Duplicate the door that usually waits on the rulers. We can't set the
282 # senders here for some reason so we actually set them in the door ready
283 # function.
284 var entry1 = get_node("/root/scene/Components/Doors/entry_1")
285 var entry12 = entry1.duplicate()
286 entry12.name = "spe_entry_1"
287 entry1.get_parent().add_child.call_deferred(entry12)
288 entry1.queue_free()
289
290 # Move the Plaza RTE trigger outside of the turtle.
291 if global.map == "the_plaza":
292 var rte_trigger = get_node("/root/scene/Components/Warps/triggerArea")
293 rte_trigger.position.z = 0
294
295 # Add the mastery to Icarus.
296 if global.map == "icarus" and ap.enable_icarus:
297 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
298 var saver_prefab = preload("res://objects/nodes/saver.tscn")
299 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
300
301 var mastery = collectable_prefab.instantiate()
302 mastery.name = "collectable"
303 mastery.position = Vector3(0, -2000, 0)
304 mastery.unlock_type = "smiley"
305 mastery.material_override = load("res://assets/materials/gold.material")
306 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
307
308 var tpl = tpl_prefab.instantiate()
309 tpl.teleport_point = Vector3(56.25, 0, -5.5)
310 tpl.teleport_rotate = Vector3(0, 0, 0)
311 tpl.target_path = mastery
312 tpl.name = "Teleport"
313 tpl.senderGroup.append(NodePath("/root/scene/Panels"))
314 tpl.nested = true
315 mastery.add_child.call_deferred(tpl)
316
317 var saver = saver_prefab.instantiate()
318 saver.name = "saver_collectables"
319 saver.type = "collectables"
320 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
321 get_node("/root/scene").add_child.call_deferred(saver)
322
323 # Add the mastery to The Advanced.
324 if global.map == "the_advanced":
325 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
326 var saver_prefab = preload("res://objects/nodes/saver.tscn")
327 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
328
329 var mastery = collectable_prefab.instantiate()
330 mastery.name = "collectable"
331 mastery.position = Vector3(0, -200, -5)
332 mastery.unlock_type = "smiley"
333 mastery.material_override = load("res://assets/materials/gold.material")
334 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
335
336 var tpl = tpl_prefab.instantiate()
337 tpl.teleport_point = Vector3(0, 2, -5)
338 tpl.teleport_rotate = Vector3(0, 0, 0)
339 tpl.target_path = mastery
340 tpl.name = "Teleport"
341 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_29"))
342 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_30"))
343 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_31"))
344 mastery.add_child.call_deferred(tpl)
345
346 var saver = saver_prefab.instantiate()
347 saver.name = "saver_collectables"
348 saver.type = "collectables"
349 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
350 get_node("/root/scene").add_child.call_deferred(saver)
351
352 # Add the mastery to The Charismatic.
353 if global.map == "the_charismatic":
354 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
355 var saver_prefab = preload("res://objects/nodes/saver.tscn")
356
357 var mastery = collectable_prefab.instantiate()
358 mastery.name = "collectable"
359 mastery.position = Vector3(-17, 2, -29)
360 mastery.rotation_degrees = Vector3(0, 45, 0)
361 mastery.unlock_type = "smiley"
362 mastery.material_override = load("res://assets/materials/gold.material")
363 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
364
365 var saver = saver_prefab.instantiate()
366 saver.name = "saver_collectables"
367 saver.type = "collectables"
368 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
369 get_node("/root/scene").add_child.call_deferred(saver)
370
371 # Add the mastery to The Crystalline.
372 if global.map == "the_crystalline":
373 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
374 var saver_prefab = preload("res://objects/nodes/saver.tscn")
375 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
376
377 var mastery = collectable_prefab.instantiate()
378 mastery.name = "collectable"
379 mastery.position = Vector3(0, 13, 37)
380 mastery.unlock_type = "smiley"
381 mastery.material_override = load("res://assets/materials/gold.material")
382 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
383
384 var tpl = tpl_prefab.instantiate()
385 tpl.teleport_point = Vector3(0, 11.5, -20)
386 tpl.teleport_rotate = Vector3(0, 0, 180)
387 tpl.target_path = mastery
388 tpl.name = "Teleport"
389 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_3"))
390 mastery.add_child.call_deferred(tpl)
391
392 var saver = saver_prefab.instantiate()
393 saver.name = "saver_collectables"
394 saver.type = "collectables"
395 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
396 get_node("/root/scene").add_child.call_deferred(saver)
397
398 # Add the mastery to The Stellar.
399 if global.map == "the_stellar":
400 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
401 var saver_prefab = preload("res://objects/nodes/saver.tscn")
402
403 var collectables = Node.new()
404 collectables.name = "Collectables"
405
406 var mastery = collectable_prefab.instantiate()
407 mastery.name = "collectable"
408 mastery.position = Vector3(2, 2, -31)
409 mastery.rotation_degrees = Vector3(0, 90, 0)
410 mastery.unlock_type = "smiley"
411 mastery.material_override = load("res://assets/materials/gold.material")
412 collectables.add_child.call_deferred(mastery)
413 get_node("/root/scene/Components").add_child.call_deferred(collectables)
414
415 var saver = saver_prefab.instantiate()
416 saver.name = "saver_collectables"
417 saver.type = "collectables"
418 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
419 get_node("/root/scene").add_child.call_deferred(saver)
420 26
421 ap.update_job_well_done_sign() 27 ap.update_job_well_done_sign()
422 28
@@ -430,9 +36,12 @@ func _ready():
430 continue 36 continue
431 37
432 if ( 38 if (
433 door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY 39 not (door.has_legacy_location() and door.get_legacy_location())
434 or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING 40 and (
435 or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR 41 door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY
42 or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING
43 or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR
44 )
436 ): 45 ):
437 continue 46 continue
438 47
@@ -568,22 +177,5 @@ func _ready():
568 ap.stop_batching_locations() 177 ap.stop_batching_locations()
569 178
570 179
571func _set_up_invis_wall(x, y, z, sx, sy, sz):
572 var prefab = preload("res://objects/nodes/block.tscn")
573 var newwall = prefab.instantiate()
574 newwall.position.x = x
575 newwall.position.y = y
576 newwall.position.z = z
577 newwall.scale.x = sz
578 newwall.scale.y = sy
579 newwall.scale.z = sx
580 newwall.set_surface_override_material(0, preload("res://assets/materials/blackMatte.material"))
581 newwall.visibility_range_end = 3
582 newwall.visibility_range_end_margin = 1
583 newwall.visibility_range_fade_mode = RenderingServer.VISIBILITY_RANGE_FADE_SELF
584 newwall.skeleton = ".."
585 get_parent().add_child.call_deferred(newwall)
586
587
588func _process(_dt): 180func _process(_dt):
589 compass.update_rotation(global_rotation.y) 181 compass.update_rotation(global_rotation.y)