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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

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

namespace XFEEDToolBox.Core.Galaxy;

public sealed record GalaxyMarkerDisplayOption(string Key,string Label,string OriginalSetting);
public static class GalaxyMarkerDisplayOptions
{
    // Original scalar display flags are independent of target queries.
    public static IReadOnlyList<GalaxyMarkerDisplayOption> All {get;}=[
        new("bookmark","个人书签","BookmarkMarkers"),new("squadronbookmark","中队书签","SquadronBookmarkMarkers"),
        new("friend","好友","FriendMarkers"),new("wing","队伍","WingMarkers"),
        new("mission","任务","MissionMarkers"),new("ship","停放飞船","ShipMarkers"),
        new("communitygoal","社区活动","CommunityGoalMarkers"),new("engineer","工程师","EngineerMarkers"),
        new("fleetcarrier","舰队航母","FleetCarrierMarkers"),new("drydock","干船坞","DryDockMarkers"),
        new("starterzone","新手区","StarterZoneMarkers"),new("conflictzone","冲突区","ConflictZoneMarkers"),
        new("rescuemegaship","救援巨型船","RescueMegashipMarkers"),new("navigation","导航","NavigationMarkers"),
        new("damaged","受损星港","TypeDMarkers"),new("repairing","维修中的星港","TypeRMarkers"),
        new("underattack","遭受攻击的星港","TypeUMarkers"),new("abandoned","废弃星港","TypeAMarkers")];
    public static IReadOnlySet<string>? Import(IReadOnlyDictionary<string,string> options,IReadOnlySet<string>? current)
    {
        if(!All.Any(o=>options.ContainsKey(o.OriginalSetting)))return current;
        var visible=current is null?All.Select(o=>o.Key).ToHashSet(StringComparer.Ordinal):new HashSet<string>(current,StringComparer.Ordinal);
        foreach(var option in All)if(options.TryGetValue(option.OriginalSetting,out var value))
        {
            if(value=="1")visible.Add(option.Key);else if(value=="0")visible.Remove(option.Key);
            else throw new InvalidDataException("原游戏标记显示开关无效:"+option.OriginalSetting);
        }
        return visible.Count==All.Count?null:visible;
    }
}

public sealed partial record GalaxyMapFilter
{
    [JsonConverter(typeof(GalaxyQueryProofsConverter))]
    public IReadOnlySet<string>? VisibleMarkerCategories {get;init;}
    public bool IsMarkerVisible(string category)=>ShowMarkers&&(VisibleMarkerCategories is null||VisibleMarkerCategories.Contains(category));
}