using System.Runtime.InteropServices;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
static uint GalaxyPowerOuterSelfTest()
{
var memory=Platform.Allocate(0x20000);if(memory==0)return 0;
try
{
// Only private allocations. The two expected navigation vtables
// are inside this allocation; no game code pointer is invoked.
var expectedImage=memory+0x10000-0x552A9B8;var manager=memory+0x1000;var service=manager+0x58;
var owner=memory+0x2000;var navigation=memory+0x3000+0x58;var navigationOwner=memory+0x2200;
var metadata=memory+0x4000;var obj=memory+0x5000;var compact=memory+0x6000;var node=memory+0x7000;
var buckets=memory+0x8000;var empty=memory+0x8100;const ulong centre=9007199254740995UL,target=9007199254741119UL;
Write(manager,expectedImage+0x51BB4D0);Write(manager+8,expectedImage+0x51BB500);Write(service,expectedImage+0x51BB600);Write(manager+0x10,owner);
Write(service+0x308,(byte)1);Write(service+0x309,(byte)1);Write(service+0x30A,(byte)1);Write(service+0x3E8,100f);
Write(navigation,expectedImage+0x552A9B8);Write(expectedImage+0x552A9B8+0x50,expectedImage+0x21E8CB0);
Write(navigation-0x48,navigationOwner);Write(navigation+0x2B0,obj);
Write(obj+0x20,2U);Write(obj+0x28,centre);Write(obj+0x38,compact);Write(compact,centre);
Write(compact+0x42,(ushort)64);Write(compact+0x44,(ushort)96);Write(compact+0x46,(ushort)128);
Write(metadata,expectedImage+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,target);Write(node+0x40,memory+0x9000);
bool Context(out GalaxyPowerOuterContext value)=>CopyGalaxyPowerOuterContext(service,owner,navigation,metadata,expectedImage,[0,0,0],out value);
uint passed=0;
if(!Context(out var context))return 0;
double[] Point(double delta=0)=>[context.centrePosition.x+delta,context.centrePosition.y,context.centrePosition.z];
bool Visible(double delta,out bool? value)=>CopyGalaxyPowerOuterVisible(context,target,Point(delta),out value);
if(context.centreSystemAddress==centre&&context.radius==100&&context.centreOffsetX==64&&context.source=="original-power-outer-activities-context")passed|=1;
if(Visible(0,out var visible)&&visible==true)passed|=2;
if(Visible(100,out visible)&&visible==true&&Visible(100.03125,out visible)&&visible==false)passed|=4;
if(CopyGalaxyPowerOuterVisible(context,target+1,Point(),out visible)&&visible is null)passed|=8;
Write(node+0x40,(nuint)0);
if(Visible(0,out visible)&&visible==false)passed|=16;
Write(node+0x40,memory+0x9000);Write(node+0x1E0,(byte)1);var states=true;
foreach(var state in new[]{0,33,34,35,36,37,38,39})
{Write(node+0x170,state);states&=Visible(0,out visible)&&visible==(state is 0 or 33 or 37 or 39);}
if(states)passed|=32;
Write(service+0x30A,(byte)0);
if(!Context(out _)&&!Visible(0,out visible)&&visible is null)passed|=64;
Write(service+0x30A,(byte)1);Write(node+0x170,-1);
var badState=Visible(0,out visible)&&visible is null;Write(node+0x1E0,(byte)2);
if(badState&&Visible(0,out visible)&&visible is null)passed|=128;
Write(node+0x1E0,(byte)0);Write(navigation+0x2B0,(nuint)0);
if(!Visible(0,out visible)&&visible is null)passed|=256;
Write(navigation+0x2B0,obj);Write(compact+0x42,(ushort)65);
if(!Visible(0,out visible)&&visible is null)passed|=512;
Write(compact+0x42,(ushort)64);Write(service+0x3E8,101f);
if(!Visible(0,out visible)&&visible is null)passed|=1024;
Write(service+0x3E8,100f);Write(navigation-0x48,navigationOwner+8);
if(!Visible(0,out visible)&&visible is null)passed|=2048;
Write(navigation-0x48,navigationOwner);
if(!CopyGalaxyPowerOuterVisible(context,target,[double.NaN,0,0],out visible)&&visible is null&&
!CopyGalaxyPowerOuterVisible(context,0,Point(),out visible)&&visible is null)passed|=4096;
Write(navigation,expectedImage+0x552AE60);Write(expectedImage+0x552AE60+0x50,expectedImage+0x56FCB0);Write(navigation+0xD8,obj);
if(Context(out var alternate)&&alternate.centreSystemAddress==centre&&CopyGalaxyPowerOuterVisible(alternate,target,Point(),out visible)&&visible==true)passed|=8192;
Write(navigation,expectedImage+0x552A9B8);
if(CopyGalaxyPowerOuterContext(service,owner,navigation,0,expectedImage,[0,0,0],out var missing)&&
CopyGalaxyPowerOuterVisible(missing,target,Point(),out visible)&&visible is null&&
CopyGalaxyPowerOuterVisible(missing,target,Point(101),out visible)&&visible==false)passed|=16384;
var before=Platform.ReadBytes(memory,0x20000);var noWrites=Context(out _)&&Visible(0,out visible)&&visible==true&&
Platform.ReadBytes(memory,0x20000).AsSpan().SequenceEqual(before);
Write(service+0x3E8,0f);if(noWrites&&!Context(out _))passed|=32768;
return passed;
}
finally{Platform.Free(memory);}
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyPowerOuterSelfTest")]
internal static uint ExportGalaxyPowerOuterSelfTest()=>RunTest(GalaxyPowerOuterSelfTest);
#endif
}
using System.Runtime.InteropServices;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
static uint GalaxyPowerOuterSelfTest()
{
var memory=Platform.Allocate(0x20000);if(memory==0)return 0;
try
{
// Only private allocations. The two expected navigation vtables
// are inside this allocation; no game code pointer is invoked.
var expectedImage=memory+0x10000-0x552A9B8;var manager=memory+0x1000;var service=manager+0x58;
var owner=memory+0x2000;var navigation=memory+0x3000+0x58;var navigationOwner=memory+0x2200;
var metadata=memory+0x4000;var obj=memory+0x5000;var compact=memory+0x6000;var node=memory+0x7000;
var buckets=memory+0x8000;var empty=memory+0x8100;const ulong centre=9007199254740995UL,target=9007199254741119UL;
Write(manager,expectedImage+0x51BB4D0);Write(manager+8,expectedImage+0x51BB500);Write(service,expectedImage+0x51BB600);Write(manager+0x10,owner);
Write(service+0x308,(byte)1);Write(service+0x309,(byte)1);Write(service+0x30A,(byte)1);Write(service+0x3E8,100f);
Write(navigation,expectedImage+0x552A9B8);Write(expectedImage+0x552A9B8+0x50,expectedImage+0x21E8CB0);
Write(navigation-0x48,navigationOwner);Write(navigation+0x2B0,obj);
Write(obj+0x20,2U);Write(obj+0x28,centre);Write(obj+0x38,compact);Write(compact,centre);
Write(compact+0x42,(ushort)64);Write(compact+0x44,(ushort)96);Write(compact+0x46,(ushort)128);
Write(metadata,expectedImage+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,target);Write(node+0x40,memory+0x9000);
bool Context(out GalaxyPowerOuterContext value)=>CopyGalaxyPowerOuterContext(service,owner,navigation,metadata,expectedImage,[0,0,0],out value);
uint passed=0;
if(!Context(out var context))return 0;
double[] Point(double delta=0)=>[context.centrePosition.x+delta,context.centrePosition.y,context.centrePosition.z];
bool Visible(double delta,out bool? value)=>CopyGalaxyPowerOuterVisible(context,target,Point(delta),out value);
if(context.centreSystemAddress==centre&&context.radius==100&&context.centreOffsetX==64&&context.source=="original-power-outer-activities-context")passed|=1;
if(Visible(0,out var visible)&&visible==true)passed|=2;
if(Visible(100,out visible)&&visible==true&&Visible(100.03125,out visible)&&visible==false)passed|=4;
if(CopyGalaxyPowerOuterVisible(context,target+1,Point(),out visible)&&visible is null)passed|=8;
Write(node+0x40,(nuint)0);
if(Visible(0,out visible)&&visible==false)passed|=16;
Write(node+0x40,memory+0x9000);Write(node+0x1E0,(byte)1);var states=true;
foreach(var state in new[]{0,33,34,35,36,37,38,39})
{Write(node+0x170,state);states&=Visible(0,out visible)&&visible==(state is 0 or 33 or 37 or 39);}
if(states)passed|=32;
Write(service+0x30A,(byte)0);
if(!Context(out _)&&!Visible(0,out visible)&&visible is null)passed|=64;
Write(service+0x30A,(byte)1);Write(node+0x170,-1);
var badState=Visible(0,out visible)&&visible is null;Write(node+0x1E0,(byte)2);
if(badState&&Visible(0,out visible)&&visible is null)passed|=128;
Write(node+0x1E0,(byte)0);Write(navigation+0x2B0,(nuint)0);
if(!Visible(0,out visible)&&visible is null)passed|=256;
Write(navigation+0x2B0,obj);Write(compact+0x42,(ushort)65);
if(!Visible(0,out visible)&&visible is null)passed|=512;
Write(compact+0x42,(ushort)64);Write(service+0x3E8,101f);
if(!Visible(0,out visible)&&visible is null)passed|=1024;
Write(service+0x3E8,100f);Write(navigation-0x48,navigationOwner+8);
if(!Visible(0,out visible)&&visible is null)passed|=2048;
Write(navigation-0x48,navigationOwner);
if(!CopyGalaxyPowerOuterVisible(context,target,[double.NaN,0,0],out visible)&&visible is null&&
!CopyGalaxyPowerOuterVisible(context,0,Point(),out visible)&&visible is null)passed|=4096;
Write(navigation,expectedImage+0x552AE60);Write(expectedImage+0x552AE60+0x50,expectedImage+0x56FCB0);Write(navigation+0xD8,obj);
if(Context(out var alternate)&&alternate.centreSystemAddress==centre&&CopyGalaxyPowerOuterVisible(alternate,target,Point(),out visible)&&visible==true)passed|=8192;
Write(navigation,expectedImage+0x552A9B8);
if(CopyGalaxyPowerOuterContext(service,owner,navigation,0,expectedImage,[0,0,0],out var missing)&&
CopyGalaxyPowerOuterVisible(missing,target,Point(),out visible)&&visible is null&&
CopyGalaxyPowerOuterVisible(missing,target,Point(101),out visible)&&visible==false)passed|=16384;
var before=Platform.ReadBytes(memory,0x20000);var noWrites=Context(out _)&&Visible(0,out visible)&&visible==true&&
Platform.ReadBytes(memory,0x20000).AsSpan().SequenceEqual(before);
Write(service+0x3E8,0f);if(noWrites&&!Context(out _))passed|=32768;
return passed;
}
finally{Platform.Free(memory);}
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyPowerOuterSelfTest")]
internal static uint ExportGalaxyPowerOuterSelfTest()=>RunTest(GalaxyPowerOuterSelfTest);
#endif
}