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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using XFEEDToolBox.Core.Localization;
namespace XFEEDToolBox.Core.Outfitting;

public sealed record RefitModuleType(string Key,string Name,string OriginalName,string IconItem,int Models)
{
    public string Detail=>$"{Models} 个可选规格";
}

public static class RefitModuleBrowser
{
    // Outfitting groups use the game's category icons and the installed Chinese UI labels,
    // rather than treating the display name of every Powerplay / technology variant as a category.
    private sealed record WeaponGroup(string Key,string Name,string English,string Icon);
    private static readonly WeaponGroup[] WeaponGroups=[
        new("beam","光束激光","Beam Lasers","beamlaser"),new("cannon","加农炮","Cannons","cannon"),
        new("multicannon","多管机炮","Multi-Cannons","multicannon"),new("experimental","实验性","Experimental","experimentalweapon"),
        new("missile","导弹","Missiles","missile"),new("burst","爆发激光","Burst Lasers","burstlaser"),
        new("rail","电磁炮","Rail Guns","railgun"),new("mine","空雷","Mines","mine"),
        new("pulse","脉冲激光","Pulse Lasers","pulselaser"),new("mining","采矿工具","Mining Tools","mininglaser"),
        new("fragment","霰弹炮","Fragment Cannons","fragcannon"),new("torpedo","鱼雷","Torpedoes","torpedo")];
    public static string TypeKey(ModuleDefinition definition)
    {
        if(definition.Category!="hardpoint")return definition.Name;
        var item=definition.Item.ToLowerInvariant();var name=definition.Name;
        var group=item.Contains("mining")||name is "Abrasion Blaster" or "Seismic Charge Launcher" or "Sub-Surface Displacement Missile" or "Sub-Surface Extraction Missile"?"mining":
            name.Contains("Missile Rack",StringComparison.OrdinalIgnoreCase)||name=="Rocket Propelled FSD Disruptor"?"missile":
            name.Contains("Torpedo",StringComparison.OrdinalIgnoreCase)?"torpedo":
            item.Contains("minelauncher")||name.Contains("Mine Launcher",StringComparison.OrdinalIgnoreCase)?"mine":
            item.StartsWith("hpt_pulselaserburst_")||item.StartsWith("hpt_burstlaser_")?"burst":
            item.StartsWith("hpt_pulselaser_")?"pulse":item.StartsWith("hpt_beamlaser_")?"beam":
            item.StartsWith("hpt_multicannon_")?"multicannon":item.StartsWith("hpt_cannon_")?"cannon":
            item.StartsWith("hpt_slugshot_")||name.Contains("Frag-Cannon",StringComparison.OrdinalIgnoreCase)?"fragment":
            item.StartsWith("hpt_railgun_")?"rail":"experimental";
        return "weapon."+group;
    }
    public static IReadOnlyList<RefitModuleChoice> Compatible(ShipRefitDocument document,RefitSlot slot,IEnumerable<RefitModuleChoice> choices,OutfittingCatalog catalog,string search="",bool ownedOnly=false)
    {
        var occupied=document.Slots.Where(s=>s.Slot!=slot.Slot&&s.Module is not null&&s.InstanceKey.Length>0).Select(s=>s.InstanceKey).ToHashSet(StringComparer.OrdinalIgnoreCase);
        return choices.Where(c=>(!ownedOnly||c.Owned)&&(!c.Owned||!occupied.Contains(c.InstanceKey))&&ShipRefit.Fits(document,slot,c.Definition,catalog)&&
            (search.Length==0||c.Display.Contains(search,StringComparison.OrdinalIgnoreCase)||c.OriginalName.Contains(search,StringComparison.OrdinalIgnoreCase)||c.Definition.Item.Contains(search,StringComparison.OrdinalIgnoreCase)))
            .OrderByDescending(c=>c.Definition.Size).ThenBy(c=>c.Definition.Rating).ThenBy(c=>c.Definition.Mount).ThenByDescending(c=>c.Owned).ToArray();
    }
    public static IReadOnlyList<RefitModuleType> Types(IEnumerable<RefitModuleChoice> choices)=>choices.GroupBy(c=>TypeKey(c.Definition),StringComparer.OrdinalIgnoreCase)
        .Select(group=>
        {
            var category=group.Key.StartsWith("weapon.")?WeaponGroups.Single(g=>g.Key==group.Key[7..]):null;
            return new RefitModuleType(group.Key,category?.Name??ChineseNames.Translate(group.Key),category?.English??group.Key,
                category is null?group.First().Definition.Item:"module_category_"+category.Icon+"_icon",group.Select(c=>c.Definition.Item).Distinct().Count());
        })
        .OrderBy(g=>g.Key.StartsWith("weapon.")?Array.FindIndex(WeaponGroups,w=>w.Key==g.Key[7..]):int.MaxValue).ThenBy(g=>g.Name,StringComparer.CurrentCulture).ToArray();
}