XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEEliteDangerous.Core;

/// <summary>Explicit private storage and transfer metadata, separate from installed modules and ship cargo.</summary>
public sealed record NativeStoredModule
{
    public required uint SlotId{get;init;}
    public required string SystemName{get;init;}
    public required ulong MarketId{get;init;}
    public required bool InTransit{get;init;}
    public required ulong TransferTime{get;init;}
    public required long Value{get;init;}
    public required NativeModuleSnapshot Module{get;init;}
    internal object Public()=>new{slot_id=SlotId,system_name=SystemName,marketId=MarketId,inTransit=InTransit,transferTime=TransferTime,value=Value,
        module=NativeSavegameDocument.ModuleDocument(Module)};
    internal static void Validate(IReadOnlyList<NativeStoredModule>? entries,NativeSavegameCatalogue catalogue)
    {
        if(entries is null||entries.Count>1024||entries.Any(value=>value is null)||entries.Select(value=>value.SlotId).Distinct().Count()!=entries.Count)
            throw new ArgumentException("Invalid native stored-module entries.");
        foreach(var entry in entries)
        {
            if(string.IsNullOrWhiteSpace(entry.SystemName)||entry.SystemName.Length>200||entry.SystemName.Any(char.IsControl)||entry.Value<0
                ||entry.Module is not {} module||module.Priority>4||module.HealthMillion>1_000_000||module.Id==0
                ||!catalogue.Modules.Any(definition=>definition.Id==module.Id&&definition.Name==module.Name))
                throw new ArgumentException("Invalid native stored-module metadata or resource identity.");
            if(module.Default is {} original&&!catalogue.Modules.Any(definition=>definition.Id==original.Id&&definition.Name==original.Name))
                throw new ArgumentException("Invalid native stored-module default resource.");
        }
    }
}