diff --git a/CHANGES.txt b/CHANGES.txt index 20bc48dce..a9db622d9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ -Contract Configurator 1.30.6 +Contract Configurator 1.31.0 +- Add FirstName and LastName methods to Kerbal. +- Kerbals and Celestial Bodies used as strings now include the correct Lingoona gender suffixes. - Allow PNG/DSS to be auto-detected correctly in dialog boxes. Contract Configurator 1.30.5 diff --git a/source/ContractConfigurator/ExpressionParser/Parsers/Classes/CelestialBodyParser.cs b/source/ContractConfigurator/ExpressionParser/Parsers/Classes/CelestialBodyParser.cs index f9dd14b11..d4c8fca78 100644 --- a/source/ContractConfigurator/ExpressionParser/Parsers/Classes/CelestialBodyParser.cs +++ b/source/ContractConfigurator/ExpressionParser/Parsers/Classes/CelestialBodyParser.cs @@ -85,7 +85,6 @@ public static void RegisterMethods() cb.BiomeMap.Attributes.Select(att => new Biome(cb, att.name)).ToList() : new List())); RegisterMethod(new Method("Name", cb => cb?.name)); - RegisterMethod(new Method("DisplayName", cb => cb?.displayName)); RegisterMethod(new Method("Multiplier", cb => cb != null ? GameVariables.Instance.GetContractDestinationWeight(cb) : 1.0)); @@ -113,7 +112,7 @@ public override U ConvertType(CelestialBody value) { if (typeof(U) == typeof(string)) { - return (U)(object)value.CleanDisplayName(); + return (U)(object)value.displayName; } return base.ConvertType(value); } diff --git a/source/ContractConfigurator/ExpressionParser/Parsers/Classes/KerbalParser.cs b/source/ContractConfigurator/ExpressionParser/Parsers/Classes/KerbalParser.cs index 350757d6b..3d9d82dee 100644 --- a/source/ContractConfigurator/ExpressionParser/Parsers/Classes/KerbalParser.cs +++ b/source/ContractConfigurator/ExpressionParser/Parsers/Classes/KerbalParser.cs @@ -30,8 +30,8 @@ public static void RegisterMethods() RegisterMethod(new Method("RosterStatus", k => k == null ? ProtoCrewMember.RosterStatus.Dead : k.rosterStatus)); RegisterMethod(new Method("Type", k => k == null ? ProtoCrewMember.KerbalType.Applicant : k.kerbalType)); RegisterMethod(new Method("Gender", k => k == null ? ProtoCrewMember.Gender.Male : k.gender)); - RegisterMethod(new Method("DisplayName", k => k?.DisplayName())); RegisterMethod(new Method("FirstName", k => k?.FirstName())); + RegisterMethod(new Method("LastName", k => k?.LastName())); RegisterGlobalFunction(new Function>("AllKerbals", () => HighLogic.CurrentGame == null ? new List() : HighLogic.CurrentGame.CrewRoster.AllKerbals().Select(pcm => new Kerbal(pcm)).ToList(), false)); @@ -81,7 +81,7 @@ public override U ConvertType(Kerbal value) { if (typeof(U) == typeof(string)) { - return (U)(object)(value == null ? "" : value.ToString()); + return (U)(object)(value == null ? "" : value.DisplayName()); } return base.ConvertType(value); } diff --git a/source/ContractConfigurator/ExpressionParser/Wrappers/Kerbal.cs b/source/ContractConfigurator/ExpressionParser/Wrappers/Kerbal.cs index e6bb9fb01..e544e7dc3 100644 --- a/source/ContractConfigurator/ExpressionParser/Wrappers/Kerbal.cs +++ b/source/ContractConfigurator/ExpressionParser/Wrappers/Kerbal.cs @@ -191,13 +191,25 @@ public override string ToString() /// Gets the full name with the Lingoona gender extension, e.g. "Valentina Kerman^f" /// public string DisplayName() - => this.name + this.GetLingoonaExtension(); + { + return StringBuilderCache.Format("{0}{1}", name, GetLingoonaExtension()); + } /// - /// Gets the full name with the Lingoona gender extension, e.g. "Jebediah^m" + /// Gets the first name with the Lingoona gender extension, e.g. "Jebediah^m" /// public string FirstName() - => this.name.Split(new char[] { ' ' }).First() + this.GetLingoonaExtension(); + { + return StringBuilderCache.Format("{0}{1}", name.Substring(0, name.IndexOf(' ')), GetLingoonaExtension()); + } + + /// + /// Gets the last name with the Lingoona gender extension, e.g. "Kerman^m" + /// + public string LastName() + { + return StringBuilderCache.Format("{0}{1}", name.Substring(name.IndexOf(' ') + 1), GetLingoonaExtension()); + } /// /// Gets the Lingoona extension for the gender of the Kerbal. Ideally, we'd let @@ -240,7 +252,7 @@ public static Kerbal Load(ConfigNode node) return k; } } - + public static void RemoveKerbal(Kerbal kerbal) { if (kerbal.pcm != null) diff --git a/test/Expression.cfg b/test/Expression.cfg index 3f168db01..c2f8a72d9 100644 --- a/test/Expression.cfg +++ b/test/Expression.cfg @@ -61,6 +61,19 @@ CONTRACT_TYPE nospace = "RandomKerbalName(Male) and RandomKerbalName(Female) something something (spoilers)" space = " RandomKerbalName(Male) and RandomKerbalName(Female) something something (spoilers)" qtest = "quoted " + "test" + + firstName = @/k1.FirstName() + lastName = @/k2.LastName() + fullName = @/k2 + fullName2 = "The Kerbal is @/k2" + } + + DATA + { + type = Kerbal + + k1 = Valentina Kerman + k2 = NewKerbal() } DATA