Vine.gd 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. class_name Vine
  2. extends Node2D
  3. @export var top_point := -256
  4. const SPEED := 32.0
  5. @onready var collision: CollisionShape2D = $Hitbox/Collision
  6. @onready var visuals: NinePatchRect = $Visuals
  7. @onready var hitbox: Area2D = $Hitbox
  8. @export var cutscene = false
  9. @export var can_tele := true
  10. var can_stop := true
  11. signal stopped
  12. func _ready() -> void:
  13. global_position.y -= 1
  14. if cutscene:
  15. do_cutscene()
  16. func do_cutscene() -> void:
  17. for i in get_tree().get_nodes_in_group("Players"):
  18. i.global_position = global_position + Vector2(0, 24)
  19. i.hide()
  20. i.state_machine.transition_to("Freeze")
  21. await stopped
  22. for i: Player in get_tree().get_nodes_in_group("Players"):
  23. i.show()
  24. for x in [1, 2]:
  25. i.set_collision_mask_value(x, false)
  26. i.state_machine.transition_to("Climb", {"Vine" = self, "Cutscene" = true})
  27. var climb_state = i.get_node("States/Climb")
  28. climb_state.climb_direction = -1
  29. await get_tree().create_timer(1.5, false).timeout
  30. i.direction = -1
  31. climb_state.climb_direction = 0
  32. await get_tree().create_timer(0.5, false).timeout
  33. i.state_machine.transition_to("Normal")
  34. for x in [1, 2]:
  35. i.set_collision_mask_value(x, true)
  36. func _physics_process(delta: float) -> void:
  37. if global_position.y >= top_point:
  38. global_position.y -= SPEED * delta
  39. visuals.size.y += SPEED * delta
  40. collision.shape.size.y += SPEED * delta
  41. collision.position.y += (SPEED / 2) * delta
  42. elif can_stop:
  43. can_stop = false
  44. stopped.emit()
  45. handle_player_interaction(delta)
  46. $WarpHitbox/CollisionShape2D.set_deferred("disabled", global_position.y > top_point)
  47. func handle_player_interaction(delta: float) -> void:
  48. for i in hitbox.get_overlapping_areas():
  49. if i.owner is Player:
  50. if Global.player_action_pressed("move_up", i.owner.player_id) and i.owner.state_machine.state.name == "Normal":
  51. i.owner.state_machine.transition_to("Climb", {"Vine": self})
  52. elif i.owner.state_machine.state.name == "Climb" and global_position.y >= top_point:
  53. i.owner.global_position.y -= SPEED * delta
  54. func on_player_entered(_player: Player) -> void:
  55. if can_tele == false:
  56. return
  57. Level.in_vine_level = true
  58. Level.vine_return_level = Global.current_level.scene_file_path
  59. Global.transition_to_scene(Level.vine_warp_level)
  60. func on_area_exited(area: Area2D) -> void:
  61. if area.owner is Player:
  62. if area.owner.state_machine.state.name == "Climb":
  63. area.owner.state_machine.transition_to("Normal")