| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- class_name BasicEnemyMovement
- extends Node
- @export var ledge_detection_cast: RayCast2D = null
- var can_move := true
- @export var auto_call := true
- @export var move_speed := 32
- @export var second_quest_speed := 36
- @onready var current_speed := move_speed
- @export var bounce_on_land := false
- @export var bounce_height := -200
- @export var visuals: Node2D
- @export var follow_player := false
- var can_hit := true
- var can_bounce := true
- var active := true
- func _ready() -> void:
- if owner is CharacterBody2D:
- owner.floor_constant_speed = true
- owner.floor_max_angle = 0.80
- func _physics_process(delta: float) -> void:
- if auto_call:
- handle_movement(delta)
- if visuals != null:
- visuals.scale.x = owner.direction
- func handle_movement(delta: float) -> void:
- if active == false: return
- if Global.second_quest and owner is Enemy:
- move_speed = second_quest_speed
- apply_gravity(delta)
- if owner.is_on_wall():
- wall_hit()
- elif ledge_detection_cast != null and owner.is_on_floor():
- ledge_detection_cast.floor_normal = owner.get_floor_normal()
- ledge_detection_cast.position.x = abs(ledge_detection_cast.position.x) * owner.direction
- if ledge_detection_cast.is_colliding() == false:
- wall_hit()
- if follow_player and owner.is_on_floor():
- player_direction_check()
- current_speed = abs(owner.velocity.x)
- if current_speed < move_speed:
- current_speed = move_speed
- if owner.is_on_floor():
- current_speed = move_speed
- if bounce_on_land:
- owner.velocity.y = bounce_height
- owner.velocity.x = (current_speed if can_move else 0) * owner.direction
- owner.move_and_slide()
- func apply_gravity(delta: float) -> void:
- owner.velocity.y += (Global.entity_gravity / delta) * delta
- owner.velocity.y = clamp(owner.velocity.y, -INF, Global.entity_max_fall_speed)
- func player_direction_check() -> void:
- var target_player = get_tree().get_first_node_in_group("Players")
- owner.direction = sign(target_player.global_position.x - owner.global_position.x)
- func wall_hit() -> void:
- if can_hit == false:
- return
- can_hit = false
- owner.direction *= -1
- await get_tree().create_timer(0.1, false).timeout
- can_hit = true
|