diff --git a/.editorconfig b/.editorconfig
index aeff653..a52f493 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -13,9 +13,6 @@ indent_style = space
# C# files
[*.cs]
-# Nullable reference types
-csharp_nullable_reference_types = enable
-
# Naming conventions
dotnet_naming_rule.async_methods_end_in_async.severity = suggestion
dotnet_naming_rule.async_methods_end_in_async.symbols = async_methods
@@ -27,6 +24,16 @@ dotnet_naming_symbols.async_methods.required_modifiers = async
dotnet_naming_style.end_in_async.required_suffix = Async
dotnet_naming_style.end_in_async.capitalization = pascal_case
+# Constants are UPPERCASE
+dotnet_naming_rule.constants_should_be_upper_case.severity = suggestion
+dotnet_naming_rule.constants_should_be_upper_case.symbols = constants
+dotnet_naming_rule.constants_should_be_upper_case.style = constant_style
+
+dotnet_naming_symbols.constants.applicable_kinds = field, local
+dotnet_naming_symbols.constants.required_modifiers = const
+
+dotnet_naming_style.constant_style.capitalization = all_upper
+
# Formatting
csharp_new_line_before_open_brace = all
csharp_indent_case_contents = true
diff --git a/CyberBits.slnx b/CyberBits.slnx
index 0b2c74c..0dc5250 100644
--- a/CyberBits.slnx
+++ b/CyberBits.slnx
@@ -1,8 +1,9 @@
-
-
-
+
+
+
+
diff --git a/CyberBits/FileFetcher.cs b/CyberBits/FileFetcher.cs
index 05daf5e..9095a2e 100644
--- a/CyberBits/FileFetcher.cs
+++ b/CyberBits/FileFetcher.cs
@@ -1,10 +1,31 @@
namespace Cyberbits;
-public class FileFetcher
+public static class FileFetcher
{
- public static string LoadTextFile(string filename)
+ public static string LoadTextFile(string filename, bool userDir = false)
{
- using var file = FileAccess.Open($"res://{filename}", FileAccess.ModeFlags.Read);
- return file.GetAsText();
+ var location = "res";
+
+ if (userDir)
+ location = "user";
+
+ using var file = FileAccess.Open($"{location}://{filename}", FileAccess.ModeFlags.Read);
+ var contents = file.GetAsText();
+
+ file.Close();
+ return contents;
}
-}
\ No newline at end of file
+
+ public static ConfigFile LoadConfig(string filename, bool userDir = false)
+ {
+ var config = new ConfigFile();
+
+// Load data from a file.
+ var err = config.Load(LoadTextFile(filename, userDir));
+
+ if (err != Error.Ok)
+ sys.Environment.Exit(sys.Environment.ExitCode);
+
+ return config;
+ }
+}
diff --git a/CyberBits/GlobalUsing.cs b/CyberBits/GlobalUsing.cs
index 5de1e39..58cb42d 100644
--- a/CyberBits/GlobalUsing.cs
+++ b/CyberBits/GlobalUsing.cs
@@ -1,5 +1,10 @@
+// System
global using System;
+global using sys = System;
global using System.Text.Json;
global using System.Text.Json.Serialization;
+
+// Godot
global using Godot;
+global using Godot.Collections;
global using Engine = twodog.Engine;
diff --git a/CyberBits/Program.cs b/CyberBits/Program.cs
index 14bd6df..f4addae 100644
--- a/CyberBits/Program.cs
+++ b/CyberBits/Program.cs
@@ -6,38 +6,40 @@ using var godot = engine.Start();
// Load a scene
var scene = GD.Load("res://main.tscn");
engine.Tree.Root.AddChild(scene.Instantiate());
+var load = engine.Tree.CurrentScene;
-var bitsImage = engine.Tree.CurrentScene.GetNode("BitsImage");
-var bitsSelection = engine.Tree.CurrentScene.GetNode("BitsSelection");
-var unlockedFeat = engine.Tree.CurrentScene.GetNode