The_Dark_Side_of_Earth/enemies/ghost/ghost.gd

53 lines
1.6 KiB
GDScript

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()