namespace MultiversalDiplomacy.Model; /// /// Represents a single province as it exists across all timelines. /// public class Province { /// /// The province's full human-readable name. /// public string Name { get; } /// /// The province's shorthand abbreviation. /// public string[] Abbreviations { get; } /// /// Whether the province contains a supply center. /// public bool IsSupplyCenter { get; } /// /// Whether the province contains a time center. /// public bool IsTimeCenter { get; } /// /// The occupiable locations in this province. Only one location can be occupied at a time. /// public IEnumerable Locations => LocationList; private List LocationList { get; set; } /// /// The province's name and abbreviations as a single enumeration. /// public IEnumerable AllNames => Abbreviations.Append(Name); public Province(string name, string[] abbreviations, bool isSupply, bool isTime) { this.Name = name; this.Abbreviations = abbreviations; this.IsSupplyCenter = isSupply; this.IsTimeCenter = isTime; this.LocationList = []; } public override string ToString() { return this.Name; } /// /// Whether a name is the name or abbreviation of this province. /// public bool Is(string name) => name.EqualsAnyCase(Name) || Abbreviations.Any(name.EqualsAnyCase); /// /// Create a new province with no supply center. /// public static Province Empty(string name, params string[] abbreviations) => new(name, abbreviations, isSupply: false, isTime: false); /// /// Create a new province with a supply center. /// public static Province Supply(string name, params string[] abbreviations) => new(name, abbreviations, isSupply: true, isTime: false); /// /// Create a new province with a time center. /// public static Province Time(string name, params string[] abbreviations) => new(name, abbreviations, isSupply: true, isTime: true); /// /// Create a new land location in this province. /// public Province AddLandLocation() { Location location = new(this, "land", "l", LocationType.Land); this.LocationList.Add(location); return this; } /// /// Create a new ocean location. /// public Province AddOceanLocation() { Location location = new(this, "water", "w", LocationType.Water); this.LocationList.Add(location); return this; } /// /// Create a new coastal location. Coastal locations must have names to disambiguate them /// from the single land location in coastal provinces. /// public Province AddCoastLocation(string name, string abbreviation) { Location location = new(this, name, abbreviation, LocationType.Water); this.LocationList.Add(location); return this; } }