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));
}
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));
}