80 lines
2.3 KiB
GDScript
80 lines
2.3 KiB
GDScript
extends "res://objects/enemy/enemy.gd"
|
|
|
|
const Explosion = preload("res://objects/enemy/explosion.tscn")
|
|
|
|
export var linked_shard: int
|
|
|
|
onready var chain = $Chain
|
|
onready var hitbox = $Hitbox
|
|
onready var respawn_time: float = 1.0
|
|
onready var ground_cast = $GroundCast
|
|
|
|
var no_explosion := false
|
|
var die_flag := false
|
|
|
|
func _ready():
|
|
ground_cast.force_raycast_update()
|
|
if ground_cast.is_colliding():
|
|
chain.points[1].y = chain.to_local(ground_cast.get_collision_point()).y
|
|
|
|
func _process(delta):
|
|
chain.points[0].x = hitbox.position.x
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if Game.shards_collected[linked_shard] and not die_flag:
|
|
die_flag = true
|
|
kill_for_real()
|
|
|
|
func _on_Hitbox_area_entered(area):
|
|
if no_explosion:
|
|
return
|
|
if area.is_in_group("explosion"):
|
|
var timer = get_tree().create_timer(0.2, false)
|
|
timer.connect("timeout", self, "die")
|
|
if area.is_in_group("player_hitbox"):
|
|
var explosion = Explosion.instance()
|
|
explosion.global_position = hitbox.global_position
|
|
get_parent().get_parent().call_deferred("add_child", explosion)
|
|
die()
|
|
|
|
func die():
|
|
no_explosion = true
|
|
if Game.shards_collected[linked_shard]:
|
|
kill_for_real()
|
|
return
|
|
if blood:
|
|
var death_particles = DeathParticles.instance()
|
|
death_particles.global_position = hitbox.global_position
|
|
death_particles.emitting = true
|
|
get_parent().get_parent().add_child(death_particles)
|
|
$Hitbox/Sprite.visible = false
|
|
$Hitbox/CollisionShape2D.disabled = true
|
|
hitbox.monitorable = false
|
|
hitbox.monitoring = false
|
|
Audio.play_sound(death_sound, Audio.ac_die)
|
|
yield(get_tree().create_timer(respawn_time, false), "timeout")
|
|
$Hitbox/CollisionShape2D.disabled = false
|
|
$Hitbox/Sprite.visible = true
|
|
hitbox.monitorable = true
|
|
hitbox.monitoring = true
|
|
no_explosion = false
|
|
|
|
func kill_for_real():
|
|
hitbox.visible = false
|
|
hitbox.monitorable = false
|
|
hitbox.monitoring = false
|
|
$Hitbox/CollisionShape2D.disabled = true
|
|
if blood:
|
|
var dist := 0.0
|
|
while(true):
|
|
var death_particles = DeathParticles.instance()
|
|
death_particles.global_position = hitbox.global_position + Vector2(0.0, dist)
|
|
death_particles.emitting = true
|
|
get_parent().get_parent().add_child(death_particles)
|
|
if dist < hitbox.to_local(ground_cast.get_collision_point()).y:
|
|
dist += 8.0
|
|
yield(get_tree().create_timer(0.05, false), "timeout")
|
|
Audio.play_sound(death_sound, Audio.ac_die)
|
|
else:
|
|
break
|
|
queue_free()
|