grunk/src/world/world.gd

82 lines
1.9 KiB
GDScript3
Raw Normal View History

2025-03-22 17:16:17 -06:00
class_name World extends Node
## Access and flow control for the game world.
2025-04-19 10:11:10 -06:00
@export var pause_enabled := true
2025-04-21 18:07:11 -06:00
@export var save_path := "user://saved_game.tscn"
2025-04-19 10:11:10 -06:00
@export var manager: WorldManager
2025-04-10 18:29:00 -06:00
@export var spook_manager: SpookManager
@export_category("Game Scenes")
2025-03-22 17:16:17 -06:00
@export var initial_level: PackedScene
@export var pause_scene: PackedScene
2025-04-19 16:18:12 -06:00
@export var kill_screen_scene: PackedScene
var current_level: PackedScene
2025-03-22 17:16:17 -06:00
@onready var level_root: Node3D = %LevelRoot
@onready var ui_root: Control = %UIRoot
static var instance: World
func _ready() -> void:
World.instance = self
manager.alert_raised.connect(spook_manager.on_alert_raised)
manager.alert_cleared.connect(spook_manager.on_alert_cleared)
manager.player_dead.connect(on_player_death)
2025-03-22 17:16:17 -06:00
load_level(initial_level)
func _unhandled_input(event: InputEvent) -> void:
2025-04-19 10:11:10 -06:00
if event.is_action_pressed("pause") and pause_enabled:
2025-03-22 17:16:17 -06:00
pause()
func pause() -> void:
get_tree().paused = true
var pause_menu: Control = pause_scene.instantiate()
ui_root.add_child(pause_menu)
2025-03-22 19:16:52 -06:00
pause_menu.tree_exiting.connect(unpause)
2025-03-22 17:16:17 -06:00
func unpause() -> void:
get_tree().paused = false
func load_level(level: PackedScene) -> void:
for c: Node in level_root.get_children():
c.queue_free()
2025-04-19 16:18:12 -06:00
current_level = level
2025-03-22 17:16:17 -06:00
level_root.add_child(level.instantiate())
2025-04-19 16:18:12 -06:00
func on_player_death() -> void:
var kill_screen: Control = kill_screen_scene.instantiate()
kill_screen.tree_exiting.connect(on_game_over)
ui_root.add_child(kill_screen)
func on_game_over() -> void:
# TODO: reload from last checkpoint
# in the mean time, just reload the level
2025-04-21 18:07:11 -06:00
Game.instance.queue_scene(save_path)
func _reown_tree(node: Node) -> void:
for c: Node in node.get_children():
c.set_owner(self)
_reown_tree(c)
func save_progress() -> void:
# No way this works, right?
print("Preparing world for save...")
var save := PackedScene.new()
_reown_tree(self)
save.pack(self)
print("Writing save to ", save_path)
ResourceSaver.save(save, save_path)