grunk/src/world/spook_manager/spook_manager.gd
2025-04-19 09:49:07 -06:00

81 lines
2.3 KiB
GDScript

class_name SpookManager extends Resource
## A strategy for handling horror elements through the level.
const SPAWN_GROUP := "BeastSpawnPoint"
@export var grunkbeast_scene: PackedScene
var debug_set_alert_level: int:
set = _on_alert_raised
func _init() -> void:
Game.manager.alert_raised.connect(_on_alert_raised)
Game.manager.alert_cleared.connect(_on_alert_cleared)
func _spawn_beast_at_point(spawn_point: Node3D) -> void:
print_debug("Spawning active beast at ", spawn_point.global_position)
var beast: GrunkBeast = grunkbeast_scene.instantiate()
spawn_point.add_child(beast)
## Spawn a beast somewhere the player isn't looking.
func spawn_beast() -> void:
var spawn_point := SceneTools.pick_unseen_from_group(SPAWN_GROUP)
if not spawn_point:
print_debug("Couldn't find a hidden spawn point... Picking one at random.")
var nodes := Game.manager.get_tree().get_nodes_in_group(SPAWN_GROUP)
if not nodes:
print_debug("Oh that's why. There aren't any spawn points. Complain to a developer.")
return
@warning_ignore("unsafe_cast")
spawn_point = nodes.pick_random() as Node3D
_spawn_beast_at_point(spawn_point)
## Spawn beasts at _every_ spawn point the player can't see.
func spawn_many_beasts() -> void:
var nodes := Game.manager.get_tree().get_nodes_in_group(SPAWN_GROUP)
for node: Node in nodes:
var target := node as Node3D
if is_instance_valid(target) and not SceneTools.player_can_see(target.global_position):
_spawn_beast_at_point(target)
func _on_alert_raised(new_level: int) -> void:
match new_level:
0:
# LEVEL 0: UNAWARE
pass
1:
# LEVEL 1: PASSIVE
# Beast avoids the player.
# Set up meet-spook.
# Get closest MeetSpook point to player.
if Player.instance:
var closest := SceneTools.closest_in_group(Player.instance, MeetSpook.GROUP)
(closest as MeetSpook).prepare()
2:
# LEVEL 2: AGGRESSIVE
# Beast pursues player on sight.
spawn_beast()
3:
# LEVEL 3: PREDATORY
# Beast pursues player relentlessly.
# The logic for this behavior change is handled directly in the GrunkBeast AI.
pass
4:
# LEVEL 4: SWARMING
# Many beasts spawn, overwhelming the player.
spawn_many_beasts()
5:
# LEVEL 5: FUN
# Just kill that fool!
pass # TODO
func _on_alert_cleared() -> void:
pass # TODO