diff --git a/StarterNG.Tests/SettingsStoreTests.cs b/StarterNG.Tests/SettingsStoreTests.cs index 9b4c2b3..ba870a9 100644 --- a/StarterNG.Tests/SettingsStoreTests.cs +++ b/StarterNG.Tests/SettingsStoreTests.cs @@ -82,6 +82,32 @@ public class SettingsStoreTests Assert.Contains("lang zh", installation.Files.ReadAllText(UserIni)); } + [Fact] + public void The_consist_state_override_keeps_the_key_the_old_starter_used() + { + var installation = WithHome(new InMemoryFileSystem() + .WithFile(UserIni, "starter.batterydefault 2\n")); + + installation.SettingsStore.Load(); + Assert.Equal(ConsistReadyOverride.AlwaysReady, installation.SettingsStore.Settings.ReadyOverride); + + installation.SettingsStore.Settings.ReadyOverride = ConsistReadyOverride.AlwaysCold; + installation.SettingsStore.Save(); + + Assert.Contains("starter.batterydefault 1", installation.Files.ReadAllText(UserIni)); + } + + [Fact] + public void An_out_of_range_override_falls_back_to_leaving_the_scenery_alone() + { + var installation = WithHome(new InMemoryFileSystem() + .WithFile(UserIni, "starter.batterydefault 9\n")); + + installation.SettingsStore.Load(); + + Assert.Equal(ConsistReadyOverride.Scenery, installation.SettingsStore.Settings.ReadyOverride); + } + [Fact] public void A_first_run_falls_back_to_the_ini_shipped_with_the_installation() { diff --git a/StarterNG/Application/StartSimulation.cs b/StarterNG/Application/StartSimulation.cs index 18697c5..8e05d29 100644 --- a/StarterNG/Application/StartSimulation.cs +++ b/StarterNG/Application/StartSimulation.cs @@ -79,6 +79,18 @@ public sealed class StartSimulation if (scenery is null || trainset is null) return new SimulationStartResult(SimulationStartOutcome.NothingSelected); + // The depot checkbox is the consist's own state; this setting is a blanket + // override for people who always want the same thing, and it wins. + switch (_settings.Settings.ReadyOverride) + { + case ConsistReadyOverride.AlwaysCold: + trainset.ReadyToGo = false; + break; + case ConsistReadyOverride.AlwaysReady: + trainset.ReadyToGo = true; + break; + } + string? vehicle = TrainsetDisplay.UniquifyForLaunch(trainset, scenery, _state.StartingVehicleName) ?? StartableVehicle(trainset, _state.StartingVehicleName); _state.StartingVehicleName = vehicle; diff --git a/StarterNG/Domain/Settings/SimulatorSettings.cs b/StarterNG/Domain/Settings/SimulatorSettings.cs index 4aa48c2..a93169e 100644 --- a/StarterNG/Domain/Settings/SimulatorSettings.cs +++ b/StarterNG/Domain/Settings/SimulatorSettings.cs @@ -2,6 +2,9 @@ using System; namespace StarterNG.Domain.Settings; +// Values match the key eu07.ini has carried since the old starter. +public enum ConsistReadyOverride { Scenery = 0, AlwaysCold = 1, AlwaysReady = 2 } + public enum ExeProblem { None, NotFound, NotExecutable, WrongPlatform } public sealed class SimulatorSettings @@ -106,6 +109,8 @@ public sealed class SimulatorSettings public bool LargeThumbnails; public bool AutoExpandSceneryTree; + public ConsistReadyOverride ReadyOverride = ConsistReadyOverride.Scenery; + public bool ShowAiVehicles = true; public bool DrivableOnly = true; public bool ShowArchivalSceneries = true; diff --git a/StarterNG/Infrastructure/Settings/SettingsSerializer.cs b/StarterNG/Infrastructure/Settings/SettingsSerializer.cs index 38561aa..498a50f 100644 --- a/StarterNG/Infrastructure/Settings/SettingsSerializer.cs +++ b/StarterNG/Infrastructure/Settings/SettingsSerializer.cs @@ -136,6 +136,14 @@ public sealed class SettingsSerializer s.AutoCloseStarter = c.GetBool("starter.autoclose", false); s.LargeThumbnails = c.GetBool("starter.largethumbnails", false); s.AutoExpandSceneryTree = c.GetBool("starter.expandtree", false); + // An unrecognised value means "do not interfere" rather than the nearest + // state: clamping upwards would silently force every consist ready. + s.ReadyOverride = c.GetInt("starter.batterydefault", 0) switch + { + 1 => ConsistReadyOverride.AlwaysCold, + 2 => ConsistReadyOverride.AlwaysReady, + _ => ConsistReadyOverride.Scenery + }; s.ShowAiVehicles = c.GetBool("starter.show.ai", true); s.DrivableOnly = c.GetBool("starter.drivableonly", true); s.ShowArchivalSceneries = c.GetBool("starter.show.archival", true); @@ -264,6 +272,7 @@ public sealed class SettingsSerializer c.SetBool("starter.autoclose", s.AutoCloseStarter); c.SetBool("starter.largethumbnails", s.LargeThumbnails); c.SetBool("starter.expandtree", s.AutoExpandSceneryTree); + c.SetInt("starter.batterydefault", (int)s.ReadyOverride); c.SetBool("starter.show.ai", s.ShowAiVehicles); c.SetBool("starter.drivableonly", s.DrivableOnly); c.SetBool("starter.show.archival", s.ShowArchivalSceneries); diff --git a/StarterNG/Views/Depot/VehicleDetails.cs b/StarterNG/Views/Depot/VehicleDetails.cs index 7fe8475..4527826 100644 --- a/StarterNG/Views/Depot/VehicleDetails.cs +++ b/StarterNG/Views/Depot/VehicleDetails.cs @@ -12,6 +12,7 @@ using Avalonia.Media; using StarterNG.Classes; using StarterNG.Controls; using StarterNG.Domain; +using StarterNG.Domain.Settings; using StarterNG.Domain.Vehicles; using StarterNG.Application; @@ -579,14 +580,21 @@ public sealed class VehicleDetails private Control ReadyToGoRow() { var trainset = _consist.EditingTrainset; + var over = AppServices.Current.Settings.ReadyOverride; + bool overridden = over != ConsistReadyOverride.Scenery; + var ready = new CheckBox { Content = App.Loc["ConsistReady"], FontSize = 12, - IsEnabled = trainset is not null, - IsChecked = trainset?.ReadyToGo ?? false + IsEnabled = trainset is not null && !overridden, + IsChecked = overridden + ? over == ConsistReadyOverride.AlwaysReady + : trainset?.ReadyToGo ?? false }; - ToolTip.SetTip(ready, App.Loc["ConsistReadyDesc"]); + ToolTip.SetTip(ready, overridden + ? App.Loc["ConsistReadyOverridden"] + : App.Loc["ConsistReadyDesc"]); ready.IsCheckedChanged += (_, _) => { diff --git a/StarterNG/Views/Settings.axaml b/StarterNG/Views/Settings.axaml index cf176fe..d441d5a 100644 --- a/StarterNG/Views/Settings.axaml +++ b/StarterNG/Views/Settings.axaml @@ -118,6 +118,15 @@ + + + + + + + diff --git a/StarterNG/Views/Settings.axaml.cs b/StarterNG/Views/Settings.axaml.cs index 8e480cf..0676034 100644 --- a/StarterNG/Views/Settings.axaml.cs +++ b/StarterNG/Views/Settings.axaml.cs @@ -260,6 +260,7 @@ public partial class Settings : UserControl, ISettingsCapture AutoCloseStarterCb.IsChecked = s.AutoCloseStarter; LargeThumbnailsCb.IsChecked = s.LargeThumbnails; AutoExpandTreeCb.IsChecked = s.AutoExpandSceneryTree; + ReadyOverrideCb.SelectedIndex = (int)s.ReadyOverride; } finally { @@ -357,6 +358,7 @@ public partial class Settings : UserControl, ISettingsCapture s.AutoCloseStarter = IsChecked(AutoCloseStarterCb); s.LargeThumbnails = IsChecked(LargeThumbnailsCb); s.AutoExpandSceneryTree = IsChecked(AutoExpandTreeCb); + s.ReadyOverride = (ConsistReadyOverride)Math.Clamp(ReadyOverrideCb.SelectedIndex, 0, 2); } private void ComButton_OnClick(object? sender, RoutedEventArgs e) diff --git a/StarterNG/startercfg/lang/cz.xml b/StarterNG/startercfg/lang/cz.xml index 109f347..9332368 100644 --- a/StarterNG/startercfg/lang/cz.xml +++ b/StarterNG/startercfg/lang/cz.xml @@ -216,6 +216,12 @@ Náklad celé soupravy Consist ready to go The consist starts prepared: brake pipe charged, driver’s brake valve set, batteries closed. Unchecked it starts cold and braked. + Force the consist state on launch + Overrides the depot’s "consist ready to go" box for every scenario you start. + As authored + Always cold + Always ready + Overridden by "Force the consist state on launch" in Settings. Náhodný druh Maximální množství Náhodné množství diff --git a/StarterNG/startercfg/lang/en.xml b/StarterNG/startercfg/lang/en.xml index 4199795..2886e96 100644 --- a/StarterNG/startercfg/lang/en.xml +++ b/StarterNG/startercfg/lang/en.xml @@ -216,6 +216,12 @@ Whole-consist load Consist ready to go The consist starts prepared: brake pipe charged, driver’s brake valve set, batteries closed. Unchecked it starts cold and braked. + Force the consist state on launch + Overrides the depot’s "consist ready to go" box for every scenario you start. + As authored + Always cold + Always ready + Overridden by "Force the consist state on launch" in Settings. Random type Maximum amount Random amount diff --git a/StarterNG/startercfg/lang/hu.xml b/StarterNG/startercfg/lang/hu.xml index a8a22f4..d25ded6 100644 --- a/StarterNG/startercfg/lang/hu.xml +++ b/StarterNG/startercfg/lang/hu.xml @@ -216,6 +216,12 @@ A teljes szerelvény rakománya Consist ready to go The consist starts prepared: brake pipe charged, driver’s brake valve set, batteries closed. Unchecked it starts cold and braked. + Force the consist state on launch + Overrides the depot’s "consist ready to go" box for every scenario you start. + As authored + Always cold + Always ready + Overridden by "Force the consist state on launch" in Settings. Véletlen típus Legnagyobb mennyiség Véletlen mennyiség diff --git a/StarterNG/startercfg/lang/pl.xml b/StarterNG/startercfg/lang/pl.xml index b78f82c..80405e7 100644 --- a/StarterNG/startercfg/lang/pl.xml +++ b/StarterNG/startercfg/lang/pl.xml @@ -216,6 +216,12 @@ Ładunki zestawienia Skład gotowy do jazdy Skład startuje przygotowany: przewód główny napełniony, kran maszynisty ustawiony, akumulatory załączone. Odznaczony startuje zimny i zahamowany. + Wymuś stan składu przy starcie + Nadpisuje pole „Skład gotowy do jazdy” w zajezdni dla każdego uruchamianego scenariusza. + Jak w scenerii + Zawsze zimny + Zawsze gotowy + Nadpisane opcją „Wymuś stan składu przy starcie” w Ustawieniach. Losowy rodzaj Maksymalna ilość Losowa ilość diff --git a/StarterNG/startercfg/lang/ru.xml b/StarterNG/startercfg/lang/ru.xml index 1ecee1c..fbda204 100644 --- a/StarterNG/startercfg/lang/ru.xml +++ b/StarterNG/startercfg/lang/ru.xml @@ -216,6 +216,12 @@ Груз всего состава Consist ready to go The consist starts prepared: brake pipe charged, driver’s brake valve set, batteries closed. Unchecked it starts cold and braked. + Force the consist state on launch + Overrides the depot’s "consist ready to go" box for every scenario you start. + As authored + Always cold + Always ready + Overridden by "Force the consist state on launch" in Settings. Случайный тип Максимальное количество Случайное количество