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>
/// One coherent original metadata descriptor or an explicitly marked ready
/// classifier default. Neither proves full catalogue coverage. Numeric namespaces stay intact;
/// an unrecognised future enum is not converted to None or zero population.
/// </summary>
public sealed record GalaxyNativeBasicSystemFacts(ulong Population,uint GovernmentId,uint PrimaryEconomyId,
    uint SecondaryEconomyId,uint FactionStateId,ulong AllegianceId,byte SecurityValue)
{
    public string? AllegianceKey {get;init;}
    /// <summary>Original ready classifier fallback for a confirmed absent row;
    /// zero here is its classification input, not a measured global population.</summary>
    public bool Defaulted {get;init;}
    public string? Government=>GovernmentId<(uint)Governments.Length?Governments[GovernmentId]:null;
    public string? PrimaryEconomy=>PrimaryEconomyId<(uint)Economies.Length?Economies[PrimaryEconomyId]:null;
    public string? SecondaryEconomy=>SecondaryEconomyId<(uint)Economies.Length?Economies[SecondaryEconomyId]:null;
    public string? BaseFactionState=>FactionStateId<(uint)FactionStates.Length&&FactionStateId!=14?FactionStates[FactionStateId]:null;
    public long? PopulationForFilter=>Population<=long.MaxValue?(long)Population:null;

    // Exact old1C40B90; its integer is preserved independently of public
    // security names. Government None1/Anarchy2 always yields class0.
    public int? SecurityClass=>GovernmentId>18?null:GovernmentId is 1 or 2?0:SecurityValue<40?2:SecurityValue<80?3:4;
    // Original Security constructor3AD0BF0 keys the same class0/2/3/4
    // by these resource names. Palette row order is not the numeric enum.
    public string? SecurityKey=>SecurityClass switch
    {0=>"Anarchy",2=>"LowSecurity",3=>"MediumSecurity",4=>"HighSecurity",_=>null};

    public static GalaxyNativeBasicSystemFacts? FromWire(JsonElement value)
    {
        if(value.ValueKind==JsonValueKind.Null)return null;
        if(value.ValueKind!=JsonValueKind.Object)throw new InvalidDataException("原基础星系资料回执无效。");
        ulong Exact(string key)
        {
            if(!value.TryGetProperty(key,out var field)||field.ValueKind!=JsonValueKind.String||
               !ulong.TryParse(field.GetString(),NumberStyles.None,CultureInfo.InvariantCulture,out var result))
                throw new InvalidDataException("原基础星系64位资料无效:"+key);
            return result;
        }
        uint Enum(string key)=>value.TryGetProperty(key,out var field)&&field.ValueKind==JsonValueKind.Number&&field.TryGetUInt32(out var number)
            ?number:throw new InvalidDataException("原基础星系枚举资料无效:"+key);
        var security=Enum("securityValue");if(security>byte.MaxValue)throw new InvalidDataException("原基础星系安全原值无效。");
        string? allegiance=null,rawAllegiance=null;
        if(value.TryGetProperty("allegianceKey",out var key)&&key.ValueKind!=JsonValueKind.Null)
        {
            if(key.ValueKind!=JsonValueKind.String)throw new InvalidDataException("原阵营定义名称无效。");
            rawAllegiance=key.GetString();allegiance=KnownAllegiance(rawAllegiance);
        }
        var defaulted=false;
        if(value.TryGetProperty("defaulted",out var fallback))
        {
            if(fallback.ValueKind is not(JsonValueKind.True or JsonValueKind.False))throw new InvalidDataException("原基础星系分类来源无效。");
            defaulted=fallback.GetBoolean();
        }
        var result=new GalaxyNativeBasicSystemFacts(Exact("population"),Enum("governmentId"),Enum("primaryEconomyId"),Enum("secondaryEconomyId"),Enum("factionStateId"),Exact("allegianceId"),(byte)security)
            {AllegianceKey=allegiance,Defaulted=defaulted};
        if(defaulted&&(result.Population!=0||result.GovernmentId!=1||result.PrimaryEconomyId!=1||result.SecondaryEconomyId!=1||
            result.FactionStateId!=0||result.AllegianceId!=ulong.MaxValue||result.SecurityValue!=0||rawAllegiance is not(null or "None")))
            throw new InvalidDataException("原缺行分类默认值不一致。");
        return defaulted?result with{AllegianceKey="None"}:result;
    }
    public static string? KnownAllegiance(string? key)=>key is "None" or "Federation" or "Empire" or "Alliance" or "Independent"?key:null;

    // Generated from the pinned original enum table and actual current map-AS
    // FactionStates constants, never public website numeric ordering.
    private static readonly string[] Governments=["Undefined","None","Anarchy","Colony","Democracy","Imperial","Corporate","Communism","Feudal","Dictatorship","Theocracy","Cooperative","Patronage","Confederacy","PrisonColony","Engineer","Prison","Carrier","Megaconstruction"];
    private static readonly string[] Economies=["Undefined","None","Extraction","Agriculture","Industrial","Service","HighTech","Refinery","Military","Corporate","Governmental","Financial","Terraforming","Construction","Educational","Research","Monastic","Health","Penal","Retail","Tourism","Hospitality","Colony","Engineer","Damaged","Rescue","Repair","Prison","Carrier"];
    private static readonly string[] FactionStates=["None","Boom","Bust","CivilUnrest","CivilWar","Famine","Outbreak","Expansion","War","Lockdown","Election","Retreat","Investment","Infested","Unknown","Incursion","InfestedCured","CivilLiberty","PirateAttack","InfrastructureFailure","PublicHoliday","NaturalDisaster","Aid","Colonisation","Drought","Revolution","ColdWar","TechnologicalLeap","TradeWar","TerroristAttack","HistoricEvent","IncursionPending","Blight","Thargoid_Probing","Thargoid_Harvest","Thargoid_Controlled","Thargoid_Stronghold","Thargoid_Recovery","Pseudo_HumanControlled","Pseudo_Unpopulated"];
}