extends CharacterBody2D const EnemyDeathEffect = preload("res://Effects/EnemyDeathEffect.tscn") @export var ACCELERATION = 300 @export var MAX_SPEED = 50 @export var FRICTION = 200 @export var WANDER_TARGET_RANGE = 4 enum { IDLE, WANDER, CHASE } var knockback = Vector2.ZERO #var velocity = Vector2.ZERO var state = IDLE @onready var sprite = get_node("AnimatedSprite2D") @onready var stats = get_node("Stats") @onready var playerDetectionZone = get_node("PlayerDetectionZone") @onready var hurtbox = get_node("Hurtbox") @onready var softCollision = get_node("SoftCollision") @onready var wanderController = get_node("WanderController") @onready var animationPlayer = get_node("AnimationPlayer") func _ready(): state = pick_new_state([IDLE,WANDER]) func _physics_process(delta): knockback = knockback.move_toward(Vector2.ZERO, 200 * delta) set_velocity(knockback) move_and_slide() knockback = velocity match state: IDLE: velocity = velocity.move_toward(Vector2.ZERO, FRICTION * delta) seek_player() if wanderController.get_time_left() == 0: update_wander() WANDER: seek_player() if wanderController.get_time_left() == 0: update_wander() accelerate_towards_point(wanderController.target_position,delta) if global_position.distance_to(wanderController.target_position) <= WANDER_TARGET_RANGE: update_wander() CHASE: var player = playerDetectionZone.player if player != null: accelerate_towards_point(player.global_position,delta) else: state = IDLE sprite.flip_h = velocity.x < 0 if softCollision.is_colliding(): velocity += softCollision.get_push_vector() * delta * 400 set_velocity(velocity) move_and_slide() velocity = velocity func accelerate_towards_point(point,delta): var direction = global_position.direction_to(point) sprite.flip_h = velocity.x < 0 velocity = velocity.move_toward(direction * MAX_SPEED, ACCELERATION * delta) func update_wander(): state = pick_new_state([IDLE, WANDER]) wanderController.start_wander_timer(randf_range(1,3)) func seek_player(): if playerDetectionZone.can_see_player(): state = CHASE func pick_new_state(state_list): #return state_list.pick_random() state_list.shuffle() return state_list.pop_front() func _on_Hurtbox_area_entered(area): stats.health -= area.damage knockback = area.knockback_vector * 120 hurtbox.create_hit_effect() hurtbox.start_invincibility(0.4) #queue_free() # Replace with function body. func _on_Stats_no_health(): queue_free() var enemyDeathEffect = EnemyDeathEffect.instantiate() get_parent().add_child(enemyDeathEffect) enemyDeathEffect.global_position = global_position func _on_Hurtbox_invincibility_started(): animationPlayer.play("Start") func _on_Hurtbox_invincibility_ended(): animationPlayer.play("Stop")