Door.gd 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. class_name Door
  2. extends Node2D
  3. @export_range(0, 99) var door_id := 0
  4. @export_enum("0", "1", "2", "3", "4") var sublevel_id := 0
  5. @export var locked := false
  6. @export var start_locked := false
  7. signal updated
  8. static var exiting_door_id := -1
  9. var can_enter := true
  10. static var door_found := false
  11. static var unlocked_doors := []
  12. static var same_scene_exiting_door: Door = null
  13. func _ready() -> void:
  14. if start_locked:
  15. locked = true
  16. if locked:
  17. check_if_unlocked(false)
  18. func _physics_process(_delta: float) -> void:
  19. for i in $PlayerDetection.get_overlapping_areas():
  20. if i.owner is Player and can_enter:
  21. if Global.player_action_just_pressed("move_up", i.owner.player_id) and i.owner.is_on_floor():
  22. if locked:
  23. if KeyItem.total_collected > 0:
  24. unlock_door(i.owner)
  25. else:
  26. AudioManager.play_sfx("door_locked", global_position)
  27. $Sprite.play("Locked")
  28. $AnimationPlayer.play("Locked")
  29. else:
  30. player_enter(i.owner)
  31. func check_if_unlocked(do_animation := true) -> void:
  32. if locked:
  33. if unlocked_doors.has(door_id):
  34. locked = false
  35. $Sprite.play("Idle")
  36. if do_animation:
  37. $AnimationPlayer.play("Unlock")
  38. func run_door_check() -> void:
  39. if same_scene_exiting_door != null:
  40. if same_scene_exiting_door != self and exiting_door_id == door_id:
  41. door_found = true
  42. for i in get_tree().get_nodes_in_group("Players"):
  43. player_exit(i)
  44. return
  45. else:
  46. if exiting_door_id == door_id:
  47. door_found = true
  48. for i in get_tree().get_nodes_in_group("Players"):
  49. player_exit(i)
  50. return
  51. await get_tree().physics_frame
  52. if door_found == false:
  53. for i in get_tree().get_nodes_in_group("Players"):
  54. player_exit(i)
  55. func unlock_door(player: Player) -> void:
  56. AudioManager.play_sfx("door_unlock", global_position)
  57. Global.p_switch_timer_paused = true
  58. KeyItem.total_collected -= 1
  59. freeze_player(player)
  60. $Sprite.play("Idle")
  61. unlocked_doors.append(door_id)
  62. get_tree().call_group("Doors", "check_if_unlocked", true)
  63. $AnimationPlayer.play("Unlock")
  64. await get_tree().create_timer(0.5, false).timeout
  65. player_enter(player)
  66. func player_exit(player: Player) -> void:
  67. exiting_door_id = -1
  68. can_enter = false
  69. LevelEditor.play_door_transition = false
  70. same_scene_exiting_door = null
  71. player.global_position = global_position
  72. player.recenter_camera()
  73. $Sprite.play("Close")
  74. await get_tree().create_timer(0.2, false).timeout
  75. $Sprite.play("Close")
  76. player.state_machine.transition_to("Normal")
  77. AudioManager.play_sfx("door_close", global_position)
  78. can_enter = true
  79. Global.p_switch_timer_paused = false
  80. func player_enter(player: Player) -> void:
  81. Global.p_switch_timer_paused = true
  82. can_enter = false
  83. door_found = false
  84. exiting_door_id = door_id
  85. freeze_player(player)
  86. $Sprite.play("Open")
  87. LevelEditor.play_door_transition = true
  88. AudioManager.play_sfx("door_open", global_position)
  89. await get_tree().create_timer(0.5, false).timeout
  90. if Global.level_editor.sub_level_id == sublevel_id:
  91. Global.do_fake_transition()
  92. if Global.fade_transition:
  93. await get_tree().create_timer(0.25, false).timeout
  94. same_scene_exiting_door = self
  95. for i in get_tree().get_nodes_in_group("Doors"):
  96. i.run_door_check()
  97. else:
  98. same_scene_exiting_door = null
  99. Global.level_editor.transition_to_sublevel(sublevel_id)
  100. $Sprite.play("Idle")
  101. can_enter = true
  102. func freeze_player(player: Player) -> void:
  103. player.state_machine.transition_to("Freeze")
  104. player.sprite.play("Idle")
  105. player.velocity = Vector2.ZERO