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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

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

namespace XFEEDToolBox.Plugin;

internal static unsafe partial class Navigation
{
    // Private allocated fixture only. It never starts a game, opens an
    // account, calls an original function, requests data, or installs a hook.
    static uint GalaxyAccountThargoidSelfTest()
    {
        var memory=Platform.Allocate(0x6000);if(memory==0)return 0;
        try
        {
            uint passed=0;var fakeImage=unchecked((nuint)0x140000000UL);var manager=memory;var owner=memory+0x800;
            var rows=memory+0x1000;var metadata=memory+0x2000;var buckets=memory+0x3000;var empty=memory+0x3100;var node=memory+0x4000;
            const ulong address=9007199254740995UL;
            Write(manager,fakeImage+0x55276B8);Write(manager+8,fakeImage+0x55276E8);Write(manager+0x70,fakeImage+0x5527890);Write(manager+0x10,owner);
            Write(manager+0x1A2,(byte)1);Write(manager+0x1A3,(byte)1);
            for(nuint group=0;group<6;group++)Write(manager+0x318+group*4,100u+(uint)group);
            Write(manager+0x510,2UL);Write(manager+0x520,2UL);Write(manager+0x528,rows);
            Write(rows,address);Write(rows+8,(byte)1);Write(rows+0x10,address+1);Write(rows+0x18,(byte)0);
            void Recommend(nuint group,nuint rank,ulong id,float progress)
            {Write(manager+0x330+group*0x50+rank*0x10,id);Write(manager+0x338+group*0x50+rank*0x10,progress);}
            Recommend(0,0,address+2,.75f);Recommend(0,1,address+3,.5f);Recommend(1,0,address+4,.6f);Recommend(2,0,address+5,.4f);
            bool Copy(out GalaxyAccountThargoid value)=>CopyGalaxyThargoidManager(manager,owner,fakeImage,metadata,out value);
            if(Copy(out var data)&&data.signals.Length==2&&data.signals[0].id==0&&data.signals[0].systemAddress==address&&
               data.signals[0].stronghold&&!data.signals[0].destroyed&&data.signals[1].destroyed&&
               data.signals[0].labelKey=="Maps_AntiXeno_Panel_Signal_System9007199254740995"&&
               data.states.Length==6&&data.states[0].state==33&&data.states[4].state==37&&data.states[4].count==104)passed|=1;
            if(data.recommended.Length==4&&data.recommended[0].id==33<<8&&data.recommended[1].id==(33<<8|1)&&
               data.recommended[2].state==34&&data.recommended[3].state==35&&data.recommended[0].progress==.75f)passed|=2;
            Write(manager+0x1A3,(byte)0);
            var pendingResponse=Copy(out data)&&!data.responseObserved&&data.states.All(state=>state.count is null)&&!data.complete&&data.signals.Length==2;
            Write(manager+0x1A3,(byte)1);Write(manager+0x1A2,(byte)0);
            if(pendingResponse&&Copy(out data)&&!data.metadataObserved&&data.states.All(state=>state.count is null)&&data.signals.Length==2)passed|=4;
            Write(manager+0x1A2,(byte)1);
            Write(manager+0x1A3,(byte)1);Write(manager+0x520,0UL);
            if(Copy(out data)&&data.signals.Length==0&&!data.complete)passed|=8;
            Write(manager+0x520,2UL);Write(manager+0x10,owner+8);
            if(!Copy(out _))passed|=16;
            Write(manager+0x10,owner);Write(manager+0x70,fakeImage+0x55278C0);
            if(!Copy(out _))passed|=32;
            Write(manager+0x70,fakeImage+0x5527890);Write(manager+0x510,8192UL);Write(manager+0x520,4097UL);
            if(!Copy(out _))passed|=64;
            Write(manager+0x510,1UL);Write(manager+0x520,2UL);
            if(!Copy(out _))passed|=128;
            Write(manager+0x510,2UL);Write(manager+0x1A2,(byte)2);
            if(!Copy(out _))passed|=256;
            Write(manager+0x1A2,(byte)1);Write(rows+8,(byte)2);
            if(!Copy(out _))passed|=512;
            Write(rows+8,(byte)1);Write(rows+0x10,address);
            if(!Copy(out _))passed|=1024;
            Write(rows+0x10,0x80000000000000UL);
            if(!Copy(out _))passed|=2048;
            Write(rows+0x10,address+1);Recommend(0,0,address+2,float.NaN);
            if(!Copy(out _))passed|=4096;
            Recommend(0,0,address+2,.25f);
            if(!Copy(out _))passed|=8192;
            Recommend(0,0,address+2,.75f);Recommend(0,1,0,float.NaN);Recommend(0,2,address+3,.99f);
            if(Copy(out data)&&data.recommended.Count(row=>row.state==33)==1&&data.recommended[0].rank==0)passed|=16384;
            Recommend(0,1,address+3,.5f);Recommend(0,2,0,0);
            Write(metadata,fakeImage+0x551A1B0);Write(metadata+0xA8,buckets);Write(metadata+0xB0,1UL);Write(metadata+0xC0,1UL);
            Write(metadata+0xC8,empty);Write(metadata+0xD0,1UL);Write(metadata+0xE0,0UL);Write(empty,empty);
            Write(buckets,node);Write(node,buckets);Write(node+8,address);Write(node+0x1E0,(byte)1);Write(node+0x1D8,3U);Write(node+0x1DC,5U);
            var before=Platform.ReadBytes(memory,0x6000);
            var known=Copy(out data)&&data.signals[0].affectedSystemsCount==8&&data.signals[1].affectedSystemsCount is null&&
                Platform.ReadBytes(memory,0x6000).AsSpan().SequenceEqual(before);
            Write(node+0x1D8,uint.MaxValue);
            if(known&&Copy(out data)&&data.signals[0].affectedSystemsCount is null)passed|=32768;
            return passed;
        }
        finally{Platform.Free(memory);}
    }
#if PLUGIN_NAVIGATION
    [UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyThargoidSelfTest")]
    internal static uint ExportGalaxyAccountThargoidSelfTest()=>RunTest(GalaxyAccountThargoidSelfTest);
#endif
}