namespace Mr.BrickAdventures.Progression; /// /// Stable identity of a Skill, matching the authored SkillData name that saves already /// reference. Identity only — the upgrade table and presentation stay in the authored asset. /// public readonly struct SkillId : IEquatable { public string Value { get; } private SkillId(string value) => Value = value; public static SkillId Of(string value) => string.IsNullOrWhiteSpace(value) ? throw new ArgumentException("A skill id cannot be blank.", nameof(value)) : new SkillId(value); public bool Equals(SkillId other) => string.Equals(Value, other.Value, StringComparison.Ordinal); public override bool Equals(object? obj) => obj is SkillId other && Equals(other); public override int GetHashCode() => StringComparer.Ordinal.GetHashCode(Value ?? string.Empty); public override string ToString() => Value; }