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 }