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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

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

namespace XFEEDToolBox.Plugin;

internal static unsafe partial class Navigation
{
    static uint GalaxyRouteOptionsSelfTest()
    {
        static JsonElement Json(string text){using var d=JsonDocument.Parse(text);return d.RootElement.Clone();}
        static bool Reject(string text){try{ParseGameRouteOptions(Json(text));return false;}catch{return true;}}
        uint passed=0;
        if(ParseGameRouteOptions(Json("{}")) is null&&ParseGameRouteOptions(Json("{\"routeOptions\":null}")) is null&&
            ParseGameRouteOptions(Json("{\"routeOptions\":{}}")) is null)passed|=1;
        var selected=ParseGameRouteOptions(Json("{\"routeOptions\":{\"mode\":2,\"useJetConeBoost\":false,\"fsdBoostLevel\":3,\"virtualCargoMass\":12.5}}"));
        if(selected is{mode:2,useJetConeBoost:false,fsdBoostLevel:3,virtualCargoMass:12.5f,starClassMask:null}&&
            ParseGameRouteOptions(Json("{\"routeOptions\":{\"starClassMask\":0}}")) is{starClassMask:0}&&
            ParseGameRouteOptions(Json("{\"routeOptions\":{\"starClassMask\":65535}}")) is{starClassMask:65535})passed|=2;
        if(new[]{"{\"mode\":true}","{\"mode\":3}","{\"mode\":1,\"fsdBoostLevel\":2}","{\"mode\":2,\"fsdBoostLevel\":4}","{\"useJetConeBoost\":0}","{\"virtualCargoMass\":-1}","{\"virtualCargoMass\":2049}"}
            .Concat(new[]{"{\"starClassMask\":-1}","{\"starClassMask\":65536}","{\"starClassMask\":1.5}","{\"starClassMask\":\"32767\"}"})
            .All(s=>Reject("{\"routeOptions\":"+s+"}")))passed|=4;
        var memory=Platform.Allocate(0x30000);if(memory==0)return passed;
        try
        {
            var expectedImage=memory+0x10000-0x551FE98;var component=memory+0x1000;var main=component+0x30;
            var settings=memory+0x5000;var rows=memory+0x7000;var table=memory+0x12000;
            Write(component,expectedImage+0x551FE98);Write(expectedImage+0x551FE98,expectedImage+0x3A4C030);Write(main,expectedImage+0x551FFC0);
            Write(expectedImage+0x551FFC0+0xF0,expectedImage+0x3A6AEB0);Write(expectedImage+0x551FFC0+0xF8,expectedImage+0x3A6AFA0);
            Write(expectedImage+0x551FFC0+0x100,expectedImage+0x3A6AE10);Write(expectedImage+0x551FFC0+0x108,expectedImage+0x3A6AD80);
            Write(main+0x1B8,settings);Write(settings,table);Write(table+0x1F0,expectedImage+0x2601B60);Write(table+0x200,expectedImage+0x2646760);
            Write(settings+0x5F8,2);Write(settings+0x530,1u);Write(settings+0x560,0u);Write(settings+0x538,rows);Write(rows+0x54+29*4,1u);
            Write(main+0x5AC,1);Write(main+0x5B0,12.5f);Write(main+0x5B4,(byte)0);Write(main+0x5B8,2);
            bool Copy(out GameRouteOptionsSnapshot value)=>CopyGameRouteOptions(component,expectedImage,out _,out value);
            if(Copy(out var actual)&&actual==new GameRouteOptionsSnapshot(1,true,2,12.5f,false))passed|=8;
            Write(settings+0x5F8,1);var pending=!Copy(out _);Write(settings+0x5F8,2);Write(rows+0x54+29*4,0u);
            pending&=Copy(out actual)&&!actual.jetCone;Write(rows+0x54+29*4,2u);pending&=!Copy(out _);Write(rows+0x54+29*4,1u);
            if(pending)passed|=16;
            Write(settings+0x560,1u);var invalid=!Copy(out _);Write(settings+0x560,0u);Write(settings+0x530,129u);
            invalid&=!Copy(out _);Write(settings+0x530,1u);Write(expectedImage+0x551FFC0+0x100,expectedImage+0x3A6AE11);
            invalid&=!Copy(out _);Write(expectedImage+0x551FFC0+0x100,expectedImage+0x3A6AE10);if(invalid)passed|=32;
            Write(main+0x5AC,3);invalid=!Copy(out _);Write(main+0x5AC,1);Write(main+0x5B0,float.NaN);invalid&=!Copy(out _);Write(main+0x5B0,12.5f);
            Write(main+0x5B8,4);invalid&=!Copy(out _);Write(main+0x5B8,2);Write(main+0x5B4,(byte)2);invalid&=!Copy(out _);Write(main+0x5B4,(byte)0);
            var navigation=memory+0x9000;Write(navigation,expectedImage+0x552A9B8);Write(expectedImage+0x552A9B8+0x40,expectedImage+0x15DB8C0);
            Write(main+0x220,-1);Write(main+0x228,navigation);Write(navigation+0x168,3);
            invalid&=!GameRouteOptionsAllowed(main,expectedImage,new(1,null,null,null))&&GameRouteOptionsAllowed(main,expectedImage,new(null,true,null,null));
            Write(navigation+0x168,1);invalid&=!GameRouteOptionsAllowed(main,expectedImage,new(null,true,null,null));
            Write(navigation+0x168,0);invalid&=GameRouteOptionsAllowed(main,expectedImage,new(1,null,null,null));Write(main+0x220,0);
            if(invalid)passed|=64;
            var before=new byte[0x30000];Marshal.Copy((nint)memory,before,0,before.Length);var copied=Copy(out _);var after=new byte[before.Length];Marshal.Copy((nint)memory,after,0,after.Length);
            if(copied&&before.SequenceEqual(after))passed|=128;
        }
        catch{}
        finally{Platform.Free(memory);}
        return passed;
    }
    [UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyRouteOptionsSelfTest")]
    public static uint ExportGalaxyRouteOptionsSelfTest()=>GalaxyRouteOptionsSelfTest();
}