using System.Globalization; using System.Text.Json; namespace XFEEDToolBox.Core.Galaxy; /// The original special provider's radius and mode1 classification, /// bound to its actual cached navigation centre. Raw0 alone never means green. public sealed record GalaxyNativeColonisationHighlight(long CentreSystemAddress,int EligibilityStatus,float DistanceSquared,float RadiusSquared,IReadOnlyList RawRgb) { public const string Source="original-colonisation-highlight"; public bool Highlighted=>EligibilityStatus==0&&DistanceSquared<=RadiusSquared; public static GalaxyNativeColonisationHighlight? FromWire(JsonElement value) { if(value.ValueKind==JsonValueKind.Null)return null; try { if(value.ValueKind!=JsonValueKind.Object||value.GetProperty("source").GetString()!=Source|| value.GetProperty("centreSystemAddress").ValueKind!=JsonValueKind.String|| !long.TryParse(value.GetProperty("centreSystemAddress").GetString(),NumberStyles.None,CultureInfo.InvariantCulture,out var centre)||centre<=0||centre>=(1L<<55)) throw new InvalidDataException("原殖民高亮来源或中心地址无效。"); var status=value.GetProperty("eligibilityStatus").GetInt32();var distance=value.GetProperty("distanceSquared").GetSingle();var radius=value.GetProperty("radiusSquared").GetSingle(); var rgb=value.GetProperty("rawRgb"); if(status is <0 or >11||!float.IsFinite(distance)||distance<0||!float.IsFinite(radius)||radius<0||rgb.ValueKind!=JsonValueKind.Array||rgb.GetArrayLength()!=3) throw new InvalidDataException("原殖民高亮距离或分类无效。"); var colour=rgb.EnumerateArray().Select(v=>v.GetSingle()).ToArray(); if(colour.Any(v=>!float.IsFinite(v)||v<0))throw new InvalidDataException("原殖民高亮颜色无效。"); return new(centre,status,distance,radius,colour); } catch(Exception error)when(error is KeyNotFoundException or InvalidOperationException or FormatException or OverflowException) {throw new InvalidDataException("原殖民高亮回执无效。",error);} } } public sealed partial record GalaxyNativeSystemFacts { public GalaxyNativeColonisationHighlight? ColonisationHighlight {get;init;} public bool ColonisationHighlightRequested {get;init;} public int? ColonisationNormalStatus {get;init;} public bool ColonisationNormalStatusRequested {get;init;} } public sealed partial record GalaxyMapFilter { private static int? OriginalColonisationColourStatus(GalacticSystem system)=>system.Data.NativeFilterFacts is{} facts ?facts.ColonisationNormalStatusRequested?facts.ColonisationNormalStatus:facts.ColonisationStatus:null; private GalaxyRawColour? OriginalColonisationHighlight(GalacticSystem system)=>Mode==GalaxyMapMode.Colonisation&&Category==GalaxyFilterCategory.Colonisation&& system.Data.NativeFilterFacts is {ColonisationStatus:0,ColonisationHighlight:{Highlighted:true,RawRgb.Count:3} highlight}&& highlight.RawRgb.All(v=>float.IsFinite(v)&&v>=0)?new(highlight.RawRgb[0],highlight.RawRgb[1],highlight.RawRgb[2]):null; }