hero-mark-2/objects/enemy/mine.gd
2025-07-17 18:28:42 -06:00

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