gae_wild_jam/scripts/enemy_base.gd

89 lines
2.4 KiB
GDScript

class_name EnemyBase
extends CharacterBody2D
@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D
@export var drop_table: Array[DropTable]
var is_dying = false
var is_hurt = false
var hits_remaining = 1
var speed
var witch
var player
var death_sound = preload("res://assets/music&sfx/sfx/hit2.wav")
var last_direction := Vector2.DOWN
signal died
var xp = 1
func _ready() -> void:
add_to_group("enemies")
died.connect(get_node("/root/Game/DropManager").on_enemy_died)
witch = get_node("/root/Game/Witch")
player = get_node("/root/Game/Player")
animated_sprite_2d.sprite_frames = animated_sprite_2d.sprite_frames.duplicate()
func die():
is_dying = true
collision_layer = 0
var death_anim: String
if abs(last_direction.x) >= abs(last_direction.y):
death_anim = "death_left" if last_direction.x < 0 else "death_right"
else:
death_anim = "death_up" if last_direction.y < 0 else "death_down"
animated_sprite_2d.sprite_frames.set_animation_loop(death_anim, false)
animated_sprite_2d.play(death_anim)
var player = AudioStreamPlayer.new()
add_child(player)
player.stream = death_sound
player.bus = "SFX"
player.play()
died.emit(self)
await animated_sprite_2d.animation_finished
queue_free()
func hit() -> void:
if is_dying or is_hurt:
return
hits_remaining -= 1
if hits_remaining <= 0:
die()
else:
_play_hurt()
func _play_hurt() -> void:
is_hurt = true
var hurt_anim: String
if abs(last_direction.x) >= abs(last_direction.y):
hurt_anim = "hurt_left" if last_direction.x < 0 else "hurt_right"
else:
hurt_anim = "hurt_up" if last_direction.y < 0 else "hurt_down"
animated_sprite_2d.sprite_frames.set_animation_loop(hurt_anim, false)
animated_sprite_2d.play(hurt_anim)
await animated_sprite_2d.animation_finished
is_hurt = false
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func _chase_witch() -> void:
var direction = Vector2(witch.global_position - global_position)
if direction != Vector2.ZERO:
last_direction = direction
velocity = direction * speed
velocity = direction * speed
if direction == Vector2.ZERO:
animated_sprite_2d.play("idle")
elif abs(direction.x) >= abs(direction.y):
if direction.x < 0:
animated_sprite_2d.play("walk_left")
else:
animated_sprite_2d.play("walk_right")
else:
if direction.y < 0:
animated_sprite_2d.play("walk_up")
else:
animated_sprite_2d.play("walk_down")
move_and_slide()