45 lines
1.4 KiB
GDScript
45 lines
1.4 KiB
GDScript
extends Node
|
|
|
|
@export var spawn_scene: PackedScene
|
|
@export var spawn_count := 3
|
|
@export var thresholds: Array[float] = [0.85, 0.70, 0.55, 0.40, 0.25, 0.10]
|
|
|
|
var triggered: Array[bool] = []
|
|
|
|
@onready var parent: Node3D = get_parent()
|
|
@onready var health: Node = get_parent().get_node("Health")
|
|
|
|
func _ready() -> void:
|
|
triggered.resize(thresholds.size())
|
|
triggered.fill(false)
|
|
|
|
func _process(_delta: float) -> void:
|
|
if not spawn_scene or health.current_health <= 0:
|
|
return
|
|
var ratio: float = health.current_health / health.max_health
|
|
for i in range(thresholds.size()):
|
|
if not triggered[i] and ratio <= thresholds[i]:
|
|
triggered[i] = true
|
|
_spawn()
|
|
|
|
func _spawn() -> void:
|
|
var spawned: Array = []
|
|
for j in range(spawn_count):
|
|
var entity: Node = spawn_scene.instantiate()
|
|
var offset := Vector3(randf_range(-2, 2), 0, randf_range(-2, 2))
|
|
parent.get_parent().add_child(entity)
|
|
entity.global_position = parent.global_position + offset
|
|
if "spawn_position" in entity:
|
|
entity.spawn_position = parent.global_position
|
|
if "portal" in entity:
|
|
entity.portal = parent
|
|
spawned.append(entity)
|
|
var player: Node = get_tree().get_first_node_in_group("player")
|
|
if player:
|
|
var dist: float = parent.global_position.distance_to(player.global_position)
|
|
if dist <= 10.0:
|
|
for entity in spawned:
|
|
if entity.has_method("_engage"):
|
|
entity._engage(player)
|
|
EventBus.portal_spawn.emit(parent, spawned)
|