XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Globalization;
using System.Text.Json;

namespace XFEEDToolBox.Core.Galaxy;

/// <summary>The original special provider's radius and mode1 classification,
/// bound to its actual cached navigation centre. Raw0 alone never means green.</summary>
public sealed record GalaxyNativeColonisationHighlight(long CentreSystemAddress,int EligibilityStatus,float DistanceSquared,float RadiusSquared,IReadOnlyList<float> 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;
}