extends KinematicBody2D 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 = $AnimatedSprite onready var stats = $Stats onready var playerDetectionZone = $PlayerDetectionZone onready var hurtbox = $Hurtbox onready var softCollision = $SoftCollision onready var wanderController = $WanderController onready var animationPlayer = $AnimationPlayer func _ready(): state = pick_new_state([IDLE,WANDER]) func _physics_process(delta): knockback = knockback.move_toward(Vector2.ZERO, 200 * delta) knockback = move_and_slide(knockback) 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 velocity = move_and_slide(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(rand_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.instance() 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")