extends Area2D @onready var player : CharacterBody2D = get_tree().get_root().get_node_or_null("main/Player") var target : CharacterBody2D # Base stats var speed = 100 var damage = 1 # Aggro range determines at which distance the ghost targets the player, # Chase range determines at which distance the ghost stops pursuing the player. var aggro_range = 900 var chase_range = 1400 var current_knockback = Vector2.ZERO var knockback_weight = 800 func _ready() -> void: $AnimatedSprite2D.play("default") func _process(delta: float) -> void: if !is_instance_valid(player): return var dist = (position - player.position).length() # Set target based on aggression range and whether target is already set if(dist > chase_range): target = null elif(target == null and dist <= aggro_range): target = player # Move towards the target at constant speed if(target!=null): var motion = -(position - target.position).normalized() * speed self.position += motion * delta * min(1, dist/(motion.length()*delta)) # Process knockback self.position += current_knockback * delta current_knockback = current_knockback/pow(1.3, 60*delta) if(self.overlaps_body(player)): player.hurt(damage, self.global_position-player.global_position) func _on_death(): # First free all other children, then wait for Death Sound to finish for child in get_children(): if not child is AudioStreamPlayer2D: child.queue_free() await $HurtSound.finished self.queue_free() func _on_damage_taken(_damage : int, dir: Vector2, _id): current_knockback = - dir * knockback_weight $HurtSound.play()