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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEEDToolBox.Core.Galaxy;

public enum GalaxyOriginalSizeFormula { Uniform,Population,Commodity,Colonisation }
public readonly record struct GalaxyOriginalSizeOption(GalaxyFilterCategory Category,GalaxyOriginalSizeFormula Formula,bool CurrentPanelOption);

/// <summary>Saved visualisation IDs and the current map's independent size control are different lists.</summary>
public static class GalaxyOriginalSizeOptions
{
    // Current GMSizeFilterComponent has one population checkbox, not a list of
    // all saved visualisation IDs. Its unchecked state selects uniform size.
    public static IReadOnlyList<GalaxyFilterCategory> CurrentPanelCategories {get;}=
        Array.AsReadOnly(new[]{GalaxyFilterCategory.None,GalaxyFilterCategory.Population});
    public const float ColonisationExcludedMultiplier=.6000000238418579f;

    public static GalaxyOriginalSizeOption? ForCategory(GalaxyFilterCategory category)=>category switch
    {
        GalaxyFilterCategory.None=>new(category,GalaxyOriginalSizeFormula.Uniform,true),
        GalaxyFilterCategory.Population=>new(category,GalaxyOriginalSizeFormula.Population,true),
        GalaxyFilterCategory.Commodity=>new(category,GalaxyOriginalSizeFormula.Commodity,false),
        GalaxyFilterCategory.Colonisation=>new(category,GalaxyOriginalSizeFormula.Colonisation,false),
        GalaxyFilterCategory.Allegiance or GalaxyFilterCategory.Government or GalaxyFilterCategory.Economy or
        GalaxyFilterCategory.StarClass or GalaxyFilterCategory.State or GalaxyFilterCategory.Security or
        GalaxyFilterCategory.Visited or GalaxyFilterCategory.Civilization or GalaxyFilterCategory.Services or
        GalaxyFilterCategory.FleetCarrier or GalaxyFilterCategory.Exploration or GalaxyFilterCategory.TradeData
            =>new(category,GalaxyOriginalSizeFormula.Uniform,false),
        _=>null
    };
}

public sealed partial record GalaxyMapFilter
{
    public bool RequestsOriginalColonisationSize=>Mode!=GalaxyMapMode.Realistic&&SizeCategory==GalaxyFilterCategory.Colonisation;

    /// <summary>Original selected size; null is unavailable evidence, never a guessed category formula.</summary>
    public float? SelectedOriginalSize(GalacticSystem system)=>GalaxyOriginalSizeOptions.ForCategory(SizeCategory)?.Formula switch
    {
        GalaxyOriginalSizeFormula.Uniform=>GalaxyOriginalAppearance.DefaultSize,
        GalaxyOriginalSizeFormula.Population=>PopulationValue(system) is {} p
            ?p<PopulationMinimum?0:GalaxyOriginalAppearance.PopulationSizeMinimum+(float)PopulationFraction(p)*(GalaxyOriginalAppearance.PopulationSizeMaximum-GalaxyOriginalAppearance.PopulationSizeMinimum):null,
        GalaxyOriginalSizeFormula.Commodity=>CommodityStyle(system)?.Size,
        // Original 3B27F00 calls 3B1A200: raw candidate statuses5/6 become
        // classification1. Only that branch multiplies config+188 by base+64.
        GalaxyOriginalSizeFormula.Colonisation=>OriginalColonisationColourStatus(system) is >=0 and <=15 and var status
            ?GalaxyOriginalAppearance.DefaultSize*(status is 5 or 6?GalaxyOriginalSizeOptions.ColonisationExcludedMultiplier:1):null,
        _=>null
    };
}