diff --git a/StarterNG/Classes/KeyboardConfig.cs b/StarterNG/Classes/KeyboardConfig.cs index f6a8c5e..840f7b5 100644 --- a/StarterNG/Classes/KeyboardConfig.cs +++ b/StarterNG/Classes/KeyboardConfig.cs @@ -88,6 +88,12 @@ public sealed class KeyboardConfig if (!string.IsNullOrEmpty(appData)) return Path.Combine(appData, "MaSzyna", "eu07_input-keyboard.ini"); } + else if (OperatingSystem.IsMacOS()) + { + string? home = Environment.GetEnvironmentVariable("HOME"); + if (!string.IsNullOrEmpty(home)) + return Path.Combine(home, "Library", "Application Support", "MaSzyna", "eu07_input-keyboard.ini"); + } else { string? home = Environment.GetEnvironmentVariable("HOME"); diff --git a/StarterNG/Classes/PresetStore.cs b/StarterNG/Classes/PresetStore.cs index 629905c..9d9ce65 100644 --- a/StarterNG/Classes/PresetStore.cs +++ b/StarterNG/Classes/PresetStore.cs @@ -27,16 +27,32 @@ public sealed class PresetCollection /// /// The user's vehicle/consist "warehouse": named trainset presets persisted as JSON. /// Stored under the per-user config directory so it survives reinstalls: -/// Windows: %appdata%\MaSzyna\starter\userpresets.json -/// Unix: ~/.config/MaSzyna/starter/userpresets.json -/// (both resolved via ). +/// Windows: %APPDATA%\MaSzyna\starter\userpresets.json +/// macOS: ~/Library/Application Support/MaSzyna/starter/userpresets.json +/// Linux: ~/.config/MaSzyna/starter/userpresets.json /// All operations are best-effort and never throw. /// public static class PresetStore { - public static string FilePath { get; } = Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), - "MaSzyna", "starter", "userpresets.json"); + private static string ResolvePath() + { + if (OperatingSystem.IsWindows()) + { + string appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + return Path.Combine(appData, "MaSzyna", "starter", "userpresets.json"); + } + if (OperatingSystem.IsMacOS()) + { + string home = Environment.GetEnvironmentVariable("HOME") ?? AppContext.BaseDirectory; + return Path.Combine(home, "Library", "Application Support", "MaSzyna", "starter", "userpresets.json"); + } + { + string home = Environment.GetEnvironmentVariable("HOME") ?? AppContext.BaseDirectory; + return Path.Combine(home, ".config", "MaSzyna", "starter", "userpresets.json"); + } + } + + public static string FilePath { get; } = ResolvePath(); // Source-generated metadata keeps (de)serialisation AOT/trim-safe, matching the // approach used for the vehicle database. diff --git a/StarterNG/Classes/Settings.cs b/StarterNG/Classes/Settings.cs index 4f57612..1624669 100644 --- a/StarterNG/Classes/Settings.cs +++ b/StarterNG/Classes/Settings.cs @@ -65,6 +65,7 @@ public sealed class Settings public int MaxCabTextureSize = 4096; // maxcabtexturesize public int TextureFiltering = 8; // anisotropicfiltering (1/2/4/8/16) public int Multisampling = 2; // multisampling (0-3) + public int DynamicLights = 7; // dynamiclights (0-7) public double DrawRangeFactor = 1.0; // gfx.drawrange.factor.max public bool VSync = true; // vsync public bool Smoke = true; // gfx.smoke @@ -144,6 +145,12 @@ public sealed class Settings if (!string.IsNullOrEmpty(appData)) return Path.Combine(appData, "MaSzyna", "eu07.ini"); } + else if (OperatingSystem.IsMacOS()) + { + string? home = Environment.GetEnvironmentVariable("HOME"); + if (!string.IsNullOrEmpty(home)) + return Path.Combine(home, "Library", "Application Support", "MaSzyna", "eu07.ini"); + } else { string? home = Environment.GetEnvironmentVariable("HOME"); @@ -312,6 +319,7 @@ public sealed class Settings MaxCabTextureSize = c.GetInt("maxcabtexturesize", 4096); TextureFiltering = c.GetInt("anisotropicfiltering", 8); Multisampling = Clamp(c.GetInt("multisampling", 2), 0, 3); + DynamicLights = Clamp(c.GetInt("dynamiclights", 7), 0, 7); DrawRangeFactor = c.GetDouble("gfx.drawrange.factor.max", 1.0); VSync = c.GetBool("vsync", true); Smoke = c.GetBool("gfx.smoke", true); @@ -403,6 +411,7 @@ public sealed class Settings c.SetInt("maxcabtexturesize", MaxCabTextureSize); c.SetInt("anisotropicfiltering", TextureFiltering); c.SetInt("multisampling", Multisampling); + c.SetInt("dynamiclights", DynamicLights); c.SetDouble("gfx.drawrange.factor.max", DrawRangeFactor); c.SetBool("vsync", VSync); c.SetBool("gfx.smoke", Smoke); diff --git a/StarterNG/Views/Settings.axaml b/StarterNG/Views/Settings.axaml index 46b8daf..ed46966 100644 --- a/StarterNG/Views/Settings.axaml +++ b/StarterNG/Views/Settings.axaml @@ -149,6 +149,11 @@ + + + + Maximum cabin texture resolution: Texture filtering quality: Multisampling: + Dynamic light sources: Rendering range: VSync Smoke display diff --git a/StarterNG/startercfg/lang/pl.xml b/StarterNG/startercfg/lang/pl.xml index de2087f..d5f036c 100644 --- a/StarterNG/startercfg/lang/pl.xml +++ b/StarterNG/startercfg/lang/pl.xml @@ -243,6 +243,7 @@ Maksymalna rozdzielczość tekstur kabiny: Jakość filtrowania tekstur: Multisampling: + Dynamiczne źródła światła: Zasięg renderowania: VSync Wyświetlanie dymu