using XFEEDToolBox.Core.Models; namespace XFEEDToolBox.Core.Planning; public static class StationSourcePolicy { // Journal and public-catalog spellings are kept together. In particular SurfaceStation // is a settlement, and a construction depot is not evidence of a completed starport. // Source: https://github.com/EDCD/EDDI/blob/develop/DataDefinitions/StationModel.cs public static StationSourceKinds Classify(Station station) { ArgumentNullException.ThrowIfNull(station); if (station.IsFleetCarrier) return StationSourceKinds.FleetCarrier; var type = Normalize(station.Type); return type switch { "fleetcarrier" or "carrier" or "squadroncarrier" or "strongholdcarrier" => StationSourceKinds.FleetCarrier, "coriolis" or "coriolisstarport" or "orbis" or "orbisstarport" or "ocellus" or "ocellusstarport" or "bernal" or "bernalstarport" or "dodec" or "dodecstarport" => StationSourceKinds.Starport, "station" or "starport" => station.IsPlanetary ? StationSourceKinds.PlanetaryPort : StationSourceKinds.Starport, "outpost" or "outpostscientific" or "civilianoutpost" or "commercialoutpost" or "industrialoutpost" or "militaryoutpost" or "miningoutpost" or "scientificoutpost" or "unknownoutpost" => StationSourceKinds.Outpost, "crateroutpost" or "craterport" or "planetaryoutpost" or "planetaryport" or "planetaryengineerbase" or "dockableplanetstation" => StationSourceKinds.PlanetaryPort, "onfootsettlement" or "odysseysettlement" or "settlement" or "planetarysettlement" or "surfacestation" or "unknownplanetary" => StationSourceKinds.Settlement, "asteroidbase" or "asteroidstation" => StationSourceKinds.AsteroidBase, "megaship" or "megashipcivilian" or "rescuemegaship" => StationSourceKinds.Megaship, "planetaryconstructiondepot" or "spaceconstructiondepot" or "shipdepot" or "gameplaypoi" => StationSourceKinds.Other, "" or "none" or "unknown" => StationSourceKinds.Unknown, _ => StationSourceKinds.Other }; } public static bool Allows(Station station, StationSourceKinds allowedKinds) => (allowedKinds & Classify(station)) != StationSourceKinds.None; // Fleet carriers provide large pads (Frontier's Fleet Carriers Content Reveal Recap, // 2020-04-02: eight large, four medium, four small pads). // https://store.steampowered.com/news/posts/?appids=359320&enddate=1586253728&feed=steam_community_announcements // Other source categories do not prove a pad size: // settlements, construction depots and megaships must retain their observed metadata. public static LandingPad EffectiveMaxLandingPad(Station station) => Classify(station) == StationSourceKinds.FleetCarrier ? LandingPad.Large : station.MaxLandingPad; private static string Normalize(string? value) => string.Concat((value ?? "").Where(char.IsLetterOrDigit)).ToLowerInvariant(); }