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