Files
2025-09-13 16:30:32 +01:00

76 lines
2.1 KiB
GDScript

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