using System; using System.Collections.Generic; namespace StardewModdingAPI.Framework { /// An extension of that correctly handles non-semantic versions used by Stardew Valley. internal class GameVersion : Toolkit.SemanticVersion { /********* ** Private methods *********/ /// A mapping of game to semantic versions. private static readonly IDictionary VersionMap = new Dictionary(StringComparer.OrdinalIgnoreCase) { ["1.0"] = "1.0.0", ["1.01"] = "1.0.1", ["1.02"] = "1.0.2", ["1.03"] = "1.0.3", ["1.04"] = "1.0.4", ["1.05"] = "1.0.5", ["1.051"] = "1.0.5.1", ["1.051b"] = "1.0.5.2", ["1.06"] = "1.0.6", ["1.07"] = "1.0.7", ["1.07a"] = "1.0.7.1", ["1.08"] = "1.0.8", ["1.1"] = "1.1.0", ["1.2"] = "1.2.0", ["1.11"] = "1.1.1" }; /********* ** Public methods *********/ /// Construct an instance. /// The game version string. public GameVersion(string version) : base(GameVersion.GetSemanticVersionString(version), allowNonStandard: true) { } /// public override string ToString() { return GameVersion.GetGameVersionString(base.ToString()); } /********* ** Private methods *********/ /// Convert a game version string to a semantic version string. /// The game version string. private static string GetSemanticVersionString(string gameVersion) { // mapped version return GameVersion.VersionMap.TryGetValue(gameVersion, out string? semanticVersion) ? semanticVersion : gameVersion; } /// Convert a semantic version string to the equivalent game version string. /// The semantic version string. private static string GetGameVersionString(string semanticVersion) { foreach ((string gameVersion, string equivalentSemanticVersion) in GameVersion.VersionMap) { if (equivalentSemanticVersion.Equals(semanticVersion, StringComparison.OrdinalIgnoreCase)) return gameVersion; } return semanticVersion; } } }