BasicEnemyMovement.gd 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. class_name BasicEnemyMovement
  2. extends Node
  3. @export var ledge_detection_cast: RayCast2D = null
  4. var can_move := true
  5. @export var auto_call := true
  6. @export var move_speed := 32
  7. @export var second_quest_speed := 36
  8. @onready var current_speed := move_speed
  9. @export var bounce_on_land := false
  10. @export var bounce_height := -200
  11. @export var visuals: Node2D
  12. @export var follow_player := false
  13. var can_hit := true
  14. var can_bounce := true
  15. var active := true
  16. func _ready() -> void:
  17. if owner is CharacterBody2D:
  18. owner.floor_constant_speed = true
  19. owner.floor_max_angle = 0.80
  20. func _physics_process(delta: float) -> void:
  21. if auto_call:
  22. handle_movement(delta)
  23. if visuals != null:
  24. visuals.scale.x = owner.direction
  25. func handle_movement(delta: float) -> void:
  26. if active == false: return
  27. if Global.second_quest and owner is Enemy:
  28. move_speed = second_quest_speed
  29. apply_gravity(delta)
  30. if owner.is_on_wall():
  31. wall_hit()
  32. elif ledge_detection_cast != null and owner.is_on_floor():
  33. ledge_detection_cast.floor_normal = owner.get_floor_normal()
  34. ledge_detection_cast.position.x = abs(ledge_detection_cast.position.x) * owner.direction
  35. if ledge_detection_cast.is_colliding() == false:
  36. wall_hit()
  37. if follow_player and owner.is_on_floor():
  38. player_direction_check()
  39. current_speed = abs(owner.velocity.x)
  40. if current_speed < move_speed:
  41. current_speed = move_speed
  42. if owner.is_on_floor():
  43. current_speed = move_speed
  44. if bounce_on_land:
  45. owner.velocity.y = bounce_height
  46. owner.velocity.x = (current_speed if can_move else 0) * owner.direction
  47. owner.move_and_slide()
  48. func apply_gravity(delta: float) -> void:
  49. owner.velocity.y += (Global.entity_gravity / delta) * delta
  50. owner.velocity.y = clamp(owner.velocity.y, -INF, Global.entity_max_fall_speed)
  51. func player_direction_check() -> void:
  52. var target_player = get_tree().get_first_node_in_group("Players")
  53. owner.direction = sign(target_player.global_position.x - owner.global_position.x)
  54. func wall_hit() -> void:
  55. if can_hit == false:
  56. return
  57. can_hit = false
  58. owner.direction *= -1
  59. await get_tree().create_timer(0.1, false).timeout
  60. can_hit = true