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-22 16:00:55 -06:00
|
|
|
@export var save_path_fmt := "user://{0}.state.res"
|
2025-04-19 10:11:10 -06:00
|
|
|
|
2025-04-21 16:48:08 -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
|
2025-04-22 13:59:24 -06:00
|
|
|
@onready var save_icon: MarginContainer = %SaveIcon
|
2025-03-22 17:16:17 -06:00
|
|
|
|
|
|
|
static var instance: World
|
|
|
|
|
|
|
|
|
|
|
|
func _ready() -> void:
|
|
|
|
World.instance = self
|
2025-04-21 16:48:08 -06:00
|
|
|
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
|
|
|
|
|
|
|
|
|
2025-04-22 16:00:55 -06:00
|
|
|
func _get_level_id(level: PackedScene) -> String:
|
|
|
|
if level.resource_path:
|
|
|
|
var file := level.resource_path.get_file()
|
|
|
|
if file:
|
|
|
|
return file
|
|
|
|
return level.resource_path
|
|
|
|
return "level"
|
|
|
|
|
|
|
|
|
|
|
|
func _get_save_path(level: PackedScene) -> String:
|
|
|
|
return save_path_fmt.format([_get_level_id(level)])
|
|
|
|
|
|
|
|
|
2025-04-22 12:08:09 -06:00
|
|
|
func load_level(level: PackedScene, save: SaveState = null) -> void:
|
2025-03-22 17:16:17 -06:00
|
|
|
for c: Node in level_root.get_children():
|
|
|
|
c.queue_free()
|
2025-04-22 12:08:09 -06:00
|
|
|
level_root.remove_child(c)
|
2025-04-19 16:18:12 -06:00
|
|
|
current_level = level
|
2025-04-22 12:08:09 -06:00
|
|
|
print("Instantiating level from ", level.resource_path)
|
|
|
|
var level_instance := level.instantiate()
|
|
|
|
level_root.add_child(level_instance)
|
|
|
|
if save:
|
|
|
|
save.load_to_world(self)
|
|
|
|
print("Done!")
|
2025-04-22 15:26:55 -06:00
|
|
|
spook_manager.after_level_init()
|
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)
|
|
|
|
|
|
|
|
|
2025-04-22 12:08:09 -06:00
|
|
|
func _reload_saved(save: SaveState) -> void:
|
|
|
|
load_level(current_level, save)
|
2025-04-21 18:07:11 -06:00
|
|
|
|
|
|
|
|
2025-04-22 12:08:09 -06:00
|
|
|
func on_game_over() -> void:
|
|
|
|
# reload the level from the last save
|
2025-04-22 16:00:55 -06:00
|
|
|
var save_path := _get_save_path(current_level)
|
2025-04-22 12:08:09 -06:00
|
|
|
if ResourceLoader.exists(save_path):
|
|
|
|
Game.instance.queue_load(save_path).finally(_reload_saved)
|
|
|
|
else:
|
|
|
|
load_level(current_level)
|
2025-04-21 18:07:11 -06:00
|
|
|
|
|
|
|
|
|
|
|
func save_progress() -> void:
|
2025-04-22 12:08:09 -06:00
|
|
|
print("Preparing save state...")
|
2025-04-22 13:59:24 -06:00
|
|
|
save_icon.show()
|
2025-04-22 12:08:09 -06:00
|
|
|
var save := SaveState.serialize(self)
|
2025-04-22 16:00:55 -06:00
|
|
|
var save_path := _get_save_path(current_level)
|
2025-04-21 18:07:11 -06:00
|
|
|
print("Writing save to ", save_path)
|
|
|
|
ResourceSaver.save(save, save_path)
|
2025-04-22 13:59:24 -06:00
|
|
|
save_icon.hide()
|
2025-04-22 12:08:09 -06:00
|
|
|
print("Done!")
|