using System.Collections; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Dataset; /// /// A variant of intended to specify a sequence of LocId strings /// without having to copy-paste a ton of LocId strings into the YAML. /// [Prototype] public sealed partial class LocalizedDatasetPrototype : IPrototype { /// /// Identifier for this prototype. /// [ViewVariables] [IdDataField] public string ID { get; private set; } = default!; /// /// Collection of LocId strings. /// [DataField] public LocalizedDatasetValues Values { get; private set; } = []; } [Serializable, NetSerializable] [DataDefinition] public sealed partial class LocalizedDatasetValues : IReadOnlyList { /// /// String prepended to the index number to generate each LocId string. /// For example, a prefix of tips-dataset- will generate tips-dataset-1, /// tips-dataset-2, etc. /// [DataField(required: true)] public string Prefix { get; private set; } = default!; /// /// How many values are in the dataset. /// [DataField(required: true)] public int Count { get; private set; } public string this[int index] { get { if (index > Count || index < 0) throw new IndexOutOfRangeException(); return Prefix + index; } } public IEnumerator GetEnumerator() { return new Enumerator(this); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public sealed class Enumerator : IEnumerator { private int _index = 0; // Whee, 1-indexing private readonly LocalizedDatasetValues _values; public Enumerator(LocalizedDatasetValues values) { _values = values; } public string Current => _values.Prefix + _index; object IEnumerator.Current => Current; public void Dispose() { } public bool MoveNext() { _index++; return _index <= _values.Count; } public void Reset() { _index = 0; } } }