From 606456f2408bed39f133221491e8faf4d472b803 Mon Sep 17 00:00:00 2001 From: siimav Date: Mon, 3 Feb 2025 20:32:37 +0200 Subject: [PATCH] Yell loudly when ProgramHandler state load fails --- Source/RP0/Programs/ProgramHandler.cs | 124 ++++++++++++++------------ 1 file changed, 67 insertions(+), 57 deletions(-) diff --git a/Source/RP0/Programs/ProgramHandler.cs b/Source/RP0/Programs/ProgramHandler.cs index 2010dc6d15f..8bf97267b96 100644 --- a/Source/RP0/Programs/ProgramHandler.cs +++ b/Source/RP0/Programs/ProgramHandler.cs @@ -135,84 +135,94 @@ public void OnDestroy() public override void OnLoad(ConfigNode node) { - base.OnLoad(node); - - if (Settings == null) + try { - Settings = new ProgramHandlerSettings(); - foreach (ConfigNode cn in GameDatabase.Instance.GetConfigNodes("PROGRAMHANDLERSETTINGS")) - ConfigNode.LoadObjectFromConfig(Settings, cn); - } + base.OnLoad(node); - EnsurePrograms(); + if (Settings == null) + { + Settings = new ProgramHandlerSettings(); + foreach (ConfigNode cn in GameDatabase.Instance.GetConfigNodes("PROGRAMHANDLERSETTINGS")) + ConfigNode.LoadObjectFromConfig(Settings, cn); + } - ConfigNode disableds = node.GetNode("DISABLEDPROGRAMS"); - if (disableds != null) - { - foreach (ConfigNode.Value v in disableds.values) + EnsurePrograms(); + + ConfigNode disableds = node.GetNode("DISABLEDPROGRAMS"); + if (disableds != null) { - DisabledPrograms.Add(v.name); + foreach (ConfigNode.Value v in disableds.values) + { + DisabledPrograms.Add(v.name); + } } - } - foreach (ConfigNode cn in node.GetNodes("ACTIVEPROGRAM")) - { - string progName = cn.GetValue(nameof(Program.name)); - Program programTemplate = Programs.FirstOrDefault(p => p.name == progName); - var program = new Program(programTemplate); - program.Load(cn); - ActivePrograms.Add(program); - } + foreach (ConfigNode cn in node.GetNodes("ACTIVEPROGRAM")) + { + string progName = cn.GetValue(nameof(Program.name)); + Program programTemplate = Programs.FirstOrDefault(p => p.name == progName) ?? throw new Exception("Failed to find ACTIVEPROGRAM " + progName); + var program = new Program(programTemplate); + program.Load(cn); + ActivePrograms.Add(program); + } - foreach (ConfigNode cn in node.GetNodes("COMPLETEDPROGRAM")) - { - string progName = cn.GetValue(nameof(Program.name)); - Program programTemplate = Programs.FirstOrDefault(p => p.name == progName); - var program = new Program(programTemplate); - program.Load(cn); - CompletedPrograms.Add(program); - } + foreach (ConfigNode cn in node.GetNodes("COMPLETEDPROGRAM")) + { + string progName = cn.GetValue(nameof(Program.name)); + Program programTemplate = Programs.FirstOrDefault(p => p.name == progName) ?? throw new Exception("Failed to find COMPLETEDPROGRAM " + progName); + var program = new Program(programTemplate); + program.Load(cn); + CompletedPrograms.Add(program); + } - _ready = true; // done BEFORE upgrading because we have to do hijinks there + _ready = true; // done BEFORE upgrading because we have to do hijinks there - if (LoadedSaveVersion < VERSION) - { - if (LoadedSaveVersion < 1) + if (LoadedSaveVersion < VERSION) { - List progs = new List(); - progs.AddRange(ActivePrograms); - progs.AddRange(CompletedPrograms); - foreach (var p in progs) + if (LoadedSaveVersion < 1) { - if (p.name == "CrewedOrbit") + List progs = new List(); + progs.AddRange(ActivePrograms); + progs.AddRange(CompletedPrograms); + foreach (var p in progs) { - DisabledPrograms.Add("CrewedOrbitEarly"); - DisabledPrograms.Add("CrewedOrbitAdv"); + if (p.name == "CrewedOrbit") + { + DisabledPrograms.Add("CrewedOrbitEarly"); + DisabledPrograms.Add("CrewedOrbitAdv"); - break; + break; + } } } - } - if (LoadedSaveVersion < 2) - { - _ready = false; - _upgrade_v02 = true; - // handled in OnLoadStrategiesComplete because we need to know what leaders are active - } - if (LoadedSaveVersion < 3) - { - foreach (var psm in ScenarioRunner.Instance.protoModules) + if (LoadedSaveVersion < 2) + { + _ready = false; + _upgrade_v02 = true; + // handled in OnLoadStrategiesComplete because we need to know what leaders are active + } + if (LoadedSaveVersion < 3) { - if (psm.moduleName == "StrategySystem" && psm.moduleValues.GetNode("DEACTIVATIONDATES") is ConfigNode cn) + foreach (var psm in ScenarioRunner.Instance.protoModules) { - ActivatedStrategies.Load(cn); - break; + if (psm.moduleName == "StrategySystem" && psm.moduleValues.GetNode("DEACTIVATIONDATES") is ConfigNode cn) + { + ActivatedStrategies.Load(cn); + break; + } } } } - } - LoadedSaveVersion = VERSION; + LoadedSaveVersion = VERSION; + } + catch (Exception ex) + { + Debug.LogException(ex); + PopupDialog.SpawnPopupDialog(new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), "RP0ProgramHandlerLoadErr", + $"SFS load failed", + "RP-1 encountered an error while trying to load the state of the programs.
Things will be seriously broken!
", "Understood", false, HighLogic.UISkin).HideGUIsWhilePopup(); + } } public void OnLoadStrategiesComplete()