From 75575991fadec3d64fe631c190454f9c4b0c9628 Mon Sep 17 00:00:00 2001 From: lucastucious Date: Thu, 31 Jul 2025 19:34:57 +0200 Subject: [PATCH] modloader prototype --- assetloader/assetloader.gd | 38 ++++++++++++++++++++++++++++++++++ assetloader/assetloader.gd.uid | 1 + autoloads/bootstrap.gd | 25 ++++++++++++++++++++++ autoloads/bootstrap.gd.uid | 1 + project.godot | 1 + 5 files changed, 66 insertions(+) create mode 100644 assetloader/assetloader.gd create mode 100644 assetloader/assetloader.gd.uid create mode 100644 autoloads/bootstrap.gd create mode 100644 autoloads/bootstrap.gd.uid diff --git a/assetloader/assetloader.gd b/assetloader/assetloader.gd new file mode 100644 index 0000000..3e090ce --- /dev/null +++ b/assetloader/assetloader.gd @@ -0,0 +1,38 @@ +extends Object +class_name AssetLoader + +const DEFAULT_ASSETS_PATH = "res://mods" + +## Path to the mods folder : [param res://mods] by default +## [br] +## (is not a const but should be treated as such, so the uppercase) +var ASSETS_PATH + +var critical_error := false + + +func _init() -> void: + ASSETS_PATH = ProjectSettings.get_setting("game/mods/mod_path", DEFAULT_ASSETS_PATH) + var dir := DirAccess.open(ASSETS_PATH) + if not dir: + push_error("AssetLoader: Mods folder not found at '%s'" % ASSETS_PATH) + _show_error_popup("Mods folder not found at '%s'" % ASSETS_PATH) + critical_error = true + return + var mod_folders := dir.get_directories() + + if mod_folders.is_empty(): + push_error("AssetLoader: Mods folder '%s' is empty — no mods to load." % ASSETS_PATH) + _show_error_popup("Mods folder '%s' is empty — no mods to load." % ASSETS_PATH) + critical_error = true + return + + +## This will show a native MessageBox on Windows, +## a native dialog on macOS, and GTK/QT dialog on Linux. +func _show_error_popup(message: String) -> void: + OS.alert("AssetLoader:"+message, "AssetLoader:Error") + + +func load_all(): + pass diff --git a/assetloader/assetloader.gd.uid b/assetloader/assetloader.gd.uid new file mode 100644 index 0000000..eeab77f --- /dev/null +++ b/assetloader/assetloader.gd.uid @@ -0,0 +1 @@ +uid://qkh5uvr4st7i diff --git a/autoloads/bootstrap.gd b/autoloads/bootstrap.gd new file mode 100644 index 0000000..0fd0c70 --- /dev/null +++ b/autoloads/bootstrap.gd @@ -0,0 +1,25 @@ +extends Node +## Should always be at the top of autoloads + + +func _ready() -> void: + var loader := AssetLoader.new() + # If there was a critical error, quit immediately + if loader.critical_error: + Engine.get_main_loop().quit(1) + return + loader.load_all() # TODO: Making it async + + # Otherwise, continue startup + _start_game() + + +## This will show a native MessageBox on Windows, +## a native dialog on macOS, and GTK/QT dialog on Linux. +func _show_error_popup(context:String, message: String) -> void: + OS.alert(context+":"+message, context+":Error") + + +func _start_game() -> void: + print("Game starting...") + #TODO: Load main menu or world scene diff --git a/autoloads/bootstrap.gd.uid b/autoloads/bootstrap.gd.uid new file mode 100644 index 0000000..c214557 --- /dev/null +++ b/autoloads/bootstrap.gd.uid @@ -0,0 +1 @@ +uid://bbmtxflx0ivgp diff --git a/project.godot b/project.godot index 551de92..90ad0aa 100644 --- a/project.godot +++ b/project.godot @@ -21,6 +21,7 @@ config/windows_native_icon="res://4589AD_icon.ico" [autoload] +Bootstrap="*res://autoloads/bootstrap.gd" DebugTools="*res://dev/debug_tools.tscn" [debug]