grunk/src/world/world.gd
2025-04-25 10:16:28 -06:00

99 lines
2.5 KiB
GDScript

class_name World extends Node
## Access and flow control for the game world.
@export var pause_enabled := true
@export var save_state: SaveState
@export var manager: WorldManager
@export var spook_manager: SpookManager
@export_category("Game Scenes")
@export var initial_level: PackedScene
@export var pause_scene: PackedScene
@export var kill_screen_scene: PackedScene
@export var save_icon_scene: PackedScene
var current_level_scene: PackedScene
var current_level: Level
@onready var level_root: Node3D = %LevelRoot
@onready var ui_root: Control = %UIRoot
@onready var save_icon_container: MarginContainer = %SaveIconContainer
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)
if initial_level:
load_level(initial_level)
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("pause") and pause_enabled:
pause()
func pause() -> void:
get_tree().paused = true
var pause_menu: Control = pause_scene.instantiate()
ui_root.add_child(pause_menu)
pause_menu.tree_exiting.connect(unpause)
func unpause() -> void:
get_tree().paused = false
func load_level(level: PackedScene) -> void:
for c: Node in level_root.get_children():
c.queue_free()
level_root.remove_child(c)
current_level_scene = level
print("Instantiating level from ", level.resource_path)
current_level = level.instantiate()
level_root.add_child(current_level)
if save_state:
save_state.load_to_world(self)
print("Done!")
spook_manager.after_level_init()
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 _reload_saved(save: SaveState) -> void:
save_state = save
load_level(current_level_scene)
func on_game_over() -> void:
# reload the level from the last save
var save_path := current_level.get_save_path()
if FileAccess.file_exists(save_path):
Game.instance.queue_load(save_path, ResourceLoader.CACHE_MODE_REPLACE_DEEP).finally(
_reload_saved
)
else:
load_level(current_level_scene)
func save_progress() -> void:
print("Preparing save state...")
save_icon_container.add_child(save_icon_scene.instantiate())
var save := SaveState.serialize(self)
var save_path := current_level.get_save_path()
print("Writing save to ", save_path)
ResourceSaver.save(save, save_path)
print("Done!")