From c9ba0368fb2d738f4f785b5b9c4bec045c36bab7 Mon Sep 17 00:00:00 2001 From: IO Date: Wed, 3 Jul 2024 11:47:43 +0200 Subject: [PATCH] Fix a bug and add missing functionality relating to ExperienceTrait (#45) --- .../Parsers/Classes/ExperienceTraitParser.cs | 14 +++++--------- .../ScenarioModules/PersistentDataStore.cs | 4 ++++ .../Util/ConfigNodeUtil.cs | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/source/ContractConfigurator/ExpressionParser/Parsers/Classes/ExperienceTraitParser.cs b/source/ContractConfigurator/ExpressionParser/Parsers/Classes/ExperienceTraitParser.cs index 9567383a1..8b57610d6 100644 --- a/source/ContractConfigurator/ExpressionParser/Parsers/Classes/ExperienceTraitParser.cs +++ b/source/ContractConfigurator/ExpressionParser/Parsers/Classes/ExperienceTraitParser.cs @@ -88,7 +88,7 @@ public override bool EQ(ExperienceTrait a, ExperienceTrait b) return true; } - return a.TypeName == b.TypeName; + return a?.TypeName == b?.TypeName; } public override ExperienceTrait ParseIdentifier(Token token) @@ -110,17 +110,13 @@ public override ExperienceTrait ParseIdentifier(Token token) return null; } - for (int index = 0; index < GameDatabase.Instance.ExperienceConfigs.Categories.Count; ++index) + var result = ConfigNodeUtil.ParseExperienceTrait(identifier); + if (result == null) { - if (identifier == GameDatabase.Instance.ExperienceConfigs.Categories[index].Name) - { - Type type = KerbalRoster.GetExperienceTraitType(identifier) ?? typeof(ExperienceTrait); - return ExperienceTrait.Create(type, GameDatabase.Instance.ExperienceConfigs.Categories[index], null); - } + LoggingUtil.LogError(this, StringBuilderCache.Format("Unknown experience trait '{0}'.", identifier)); } - LoggingUtil.LogError(this, StringBuilderCache.Format("Unknown experience trait '{0}'.", identifier)); - return null; + return result; } } } diff --git a/source/ContractConfigurator/ScenarioModules/PersistentDataStore.cs b/source/ContractConfigurator/ScenarioModules/PersistentDataStore.cs index c0dee0250..4fe4f7a7b 100644 --- a/source/ContractConfigurator/ScenarioModules/PersistentDataStore.cs +++ b/source/ContractConfigurator/ScenarioModules/PersistentDataStore.cs @@ -245,6 +245,10 @@ public static string OutputValue(object value, out Type type) Biome b = (Biome)value; strValue = b.body.name + ";" + b.biome; } + else if (type == typeof(Experience.ExperienceTrait)) + { + strValue = ((Experience.ExperienceTrait)(value)).TypeName; + } else if (type.Name == "List`1") { strValue = "[ "; diff --git a/source/ContractConfigurator/Util/ConfigNodeUtil.cs b/source/ContractConfigurator/Util/ConfigNodeUtil.cs index 7823cc0da..db7259d13 100644 --- a/source/ContractConfigurator/Util/ConfigNodeUtil.cs +++ b/source/ContractConfigurator/Util/ConfigNodeUtil.cs @@ -394,6 +394,10 @@ public static T ParseSingleValue(string key, string stringValue, bool allowEx { value = (T)(object)ParseLaunchSiteValue(stringValue); } + else if (typeof(T) == typeof(Experience.ExperienceTrait)) + { + value = (T)(object)ParseExperienceTrait(stringValue); + } // Do newline conversions else if (typeof(T) == typeof(string)) { @@ -1073,6 +1077,20 @@ private static ProtoCrewMember ParseProtoCrewMemberValue(string name) return null; } + public static Experience.ExperienceTrait ParseExperienceTrait(string traitName) + { + for (int index = 0; index < GameDatabase.Instance.ExperienceConfigs.Categories.Count; ++index) + { + if (traitName == GameDatabase.Instance.ExperienceConfigs.Categories[index].Name) + { + Type type = KerbalRoster.GetExperienceTraitType(traitName) ?? typeof(Experience.ExperienceTrait); + return Experience.ExperienceTrait.Create(type, GameDatabase.Instance.ExperienceConfigs.Categories[index], null); + } + } + + return null; + } + private static void AddFoundKey(ConfigNode configNode, string key) { // Initialize the list