using System.Runtime.InteropServices;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
static uint GalaxyPowerInfluenceSelfTest()
{
var memory=Platform.Allocate(0x6000000);if(memory==0)return 0;
try
{
var expected=memory;var manager=memory+0x1000;var service=manager+0x58;var owner=memory+0x2000;
var navigation=memory+0x3000+0x58;var metadata=memory+0x4000;var obj=memory+0x5000;var compact=memory+0x6000;
var genericNode=memory+0x7000;var buckets=memory+0x8000;var empty=memory+0x8100;
var storage=memory+0xA000;var definitions=memory+0xC000;var colours=memory+0xE000;
var provider=memory+0x10000;var config=memory+0x11000;var block=memory+0x12000;
var component=memory+0x14000;var main=component+0x30;var settings=memory+0x16000;var settingRows=memory+0x17000;var settingVt=memory+0x18000;
var controller=memory+0x19000;var type=controller+0x28;var registry=memory+0x1A000;var regMeta=memory+0x1B000;var regSlots=memory+0x1C000;var regArray=memory+0x1D000;
const ulong centre=9007199254740995,target=9007199254741119;
Write(manager,expected+0x51BB4D0);Write(manager+8,expected+0x51BB500);Write(manager+0x10,owner);Write(service,expected+0x51BB600);
Write(service+0x308,(byte)1);Write(service+0x309,(byte)1);Write(service+0x30A,(byte)1);Write(service+0x3E8,100f);
Write(navigation,expected+0x552A9B8);Write(expected+0x552A9B8+0x50,expected+0x21E8CB0);Write(navigation-0x48,owner);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,expected+0x551A1B0);Write(metadata+0xA8,buckets);Write(metadata+0xB0,1UL);Write(metadata+0xC0,1UL);
Write(metadata+0xC8,empty);Write(metadata+0xD0,1UL);Write(empty,empty);Write(buckets,genericNode);Write(genericNode,buckets);
Write(genericNode+8,target);Write(genericNode+0x40,memory+0x9000);
Write(service+0x330,2UL);Write(service+0x338,definitions);Write(definitions+0x1B8,10f);Write(definitions+0x260+0x1B8,6f);
Write(service+0x3C8,2UL);Write(service+0x3D0,8UL);Write(service+0x3D8,storage);
nuint Put(ulong address,ulong power,int state)
{
var slot=GalaxyFactHash(address)&7;
while((Read<ulong>(storage)&(1UL<<(int)slot))!=0)slot=(slot+1)&7;
Write(storage,Read<ulong>(storage)|(1UL<<(int)slot));var node=storage+16+(nuint)slot*0x180;
Write(node,address);Write(node+0x10,power);Write(node+0x1C,state);return node;
}
var centreNode=Put(centre,0,1);var candidateNode=Put(target,0,0);
Write(provider,expected+0x552E598);Write(expected+0x552E598+0x20,expected+0x3B3E510);
Write(expected+0x552E598+0x40,expected+0x3AF6BA0);Write(expected+0x552E598+0x68,expected+0x3B27590);
Write(provider+0x78,service);Write(provider+0x168,navigation);Write(provider+0x170,obj);Write(provider+0x180,100f);
Write(provider+0x160,(byte)1);Write(provider+0x1B0,(byte)1);Write(provider+0x1A8,centre);Write(provider+0x1C0,10f);
Write(provider+0x1A0,2f);Write(provider+0x10,config);Write(config+0x148,.25f);Write(provider+0xF0,2UL);Write(provider+0xF8,colours);
Write(colours,.2f);Write(colours+4,.4f);Write(colours+8,1.5f);Write(colours+0x18,.7f);Write(colours+0x1C,.8f);Write(colours+0x20,.9f);
Write(component,expected+0x551FE98);Write(expected+0x551FE98,expected+0x3A4C030);Write(main,expected+0x551FFC0);
Write(expected+0x551FFC0+0xF0,expected+0x3A6AEB0);Write(expected+0x551FFC0+0xF8,expected+0x3A6AFA0);
Write(expected+0x551FFC0+0x100,expected+0x3A6AE10);Write(expected+0x551FFC0+0x108,expected+0x3A6AD80);
Write(main+0x1B8,settings);Write(settings,settingVt);Write(settingVt+0x1F0,expected+0x2601B60);Write(settingVt+0x200,expected+0x2646760);
Write(settings+0x5F8,2);Write(settings+0x530,1U);Write(settings+0x538,settingRows);Write(settingRows+0x54+29*4,1U);
Write(main+0x5AC,1);Write(main+0x5B0,0f);Write(main+0x5B4,(byte)0);Write(main+0x5B8,0);Write(main+0x280,-1);Write(main+0x288,type);
Write(type,expected+0x552D788);Write(controller,expected+0x552D5C0);Write(controller+0x3B0,block);Write(controller+0x3B8,provider);Write(block+8,1);Write(block+0xC,1);
Write(expected+0x5FDB224,17U);Write(registry+0x10,regMeta);Write(registry+0x18,regArray);Write(regMeta+0x18,1UL);Write(regMeta+0x30,regSlots);Write(regSlots+17*16,0UL);Write(regArray,component);
if(!CopyGalaxyPowerOuterContext(service,owner,navigation,metadata,expected,[0,0,0],out var outer)||
!TryCreateGalaxyPowerInfluenceContext(outer,new(){registry=registry},out var context)||context is null)return 0;
double[] Point(float delta)=>[outer.centrePosition.x+delta,outer.centrePosition.y,outer.centrePosition.z];
bool Copy(float delta,out GalaxyPowerInfluenceFact? fact)=>CopyGalaxyPowerInfluence(context,target,Point(delta),out fact);
var before=Platform.ReadBytes(memory,0x20000);uint passed=0;
if(Copy(5,out var first)&&first is{eligible:true,kind:0}&&first.fromSystemAddress==centre&&first.toSystemAddress==target&&
first.linearRgb!.SequenceEqual(new[]{.2f,.4f,1.5f})&&first.phase==GalaxyPowerInfluenceInitialPhase(target)-.5f)passed|=1;
if(Copy(10,out var edge)&&edge is{eligible:false}&&Copy(10.03125f,out edge)&&edge is{eligible:false})passed|=2;
Write(candidateNode+0x1C,1);var both=Copy(5,out var same)&&same is{eligible:false};Write(provider+0x1C0,0f);
if(TryCreateGalaxyPowerInfluenceContext(outer,new(){registry=registry},out var reversed)&&reversed is not null&&
CopyGalaxyPowerInfluence(reversed,target,Point(5),out var reverse)&&reverse is{eligible:true,kind:1}&&reverse.fromSystemAddress==target&&reverse.toSystemAddress==centre&&both)passed|=4;
Write(provider+0x1C0,10f);Write(candidateNode+0x1C,0);Write(centreNode+0x1C,1);
Write(provider+0x1C0,0f);Write(candidateNode+0x1C,1);Write(candidateNode+0x10,1UL);
var different=TryCreateGalaxyPowerInfluenceContext(outer,new(){registry=registry},out reversed)&&reversed is not null&&
CopyGalaxyPowerInfluence(reversed,target,Point(5),out same)&&same is{eligible:false};
Write(candidateNode+0x10,0UL);Write(centreNode+0x1C,0);
if(different&&reversed is not null&&CopyGalaxyPowerInfluence(reversed,target,Point(5),out same)&&same is{eligible:true,kind:0})passed|=8;
Write(centreNode+0x1C,1);Write(candidateNode+0x1C,0);Write(provider+0x1C0,10f);
Write(provider+0x1B0,(byte)0);var pending=!Copy(5,out _);Write(provider+0x1B0,(byte)1);Write(expected+0x5FDB275,(byte)1);
if(pending&&!Copy(5,out _))passed|=16;Write(expected+0x5FDB275,(byte)0);
Write(candidateNode+0x1C,5);var invalid=!Copy(5,out _);Write(candidateNode+0x1C,0);Write(provider+0x1A0,3f);
if(invalid&&!Copy(5,out _))passed|=32;Write(provider+0x1A0,2f);
Write(colours,float.NaN);var badColour=!Copy(5,out _);Write(colours,.2f);Write(expected+0x552E598+0x68,expected+0x3B27591);
if(badColour&&!Copy(5,out _))passed|=64;Write(expected+0x552E598+0x68,expected+0x3B27590);
if(Copy(5,out _)&&Platform.ReadBytes(memory,0x20000).AsSpan().SequenceEqual(before)&&
GalaxyPowerInfluenceDescription(first)?["fromSystemAddress"]?.GetValue<string>()==centre.ToString()&&
GalaxyPowerInfluenceDescription(new(false,0,0,null,null,null,0,0,0,0))?.Count==2)passed|=128;
return passed;
}
catch{return 0;}
finally{Platform.Free(memory);}
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyPowerInfluenceSelfTest")]
internal static uint ExportGalaxyPowerInfluenceSelfTest()=>RunTest(GalaxyPowerInfluenceSelfTest);
#endif
}
using System.Runtime.InteropServices;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
static uint GalaxyPowerInfluenceSelfTest()
{
var memory=Platform.Allocate(0x6000000);if(memory==0)return 0;
try
{
var expected=memory;var manager=memory+0x1000;var service=manager+0x58;var owner=memory+0x2000;
var navigation=memory+0x3000+0x58;var metadata=memory+0x4000;var obj=memory+0x5000;var compact=memory+0x6000;
var genericNode=memory+0x7000;var buckets=memory+0x8000;var empty=memory+0x8100;
var storage=memory+0xA000;var definitions=memory+0xC000;var colours=memory+0xE000;
var provider=memory+0x10000;var config=memory+0x11000;var block=memory+0x12000;
var component=memory+0x14000;var main=component+0x30;var settings=memory+0x16000;var settingRows=memory+0x17000;var settingVt=memory+0x18000;
var controller=memory+0x19000;var type=controller+0x28;var registry=memory+0x1A000;var regMeta=memory+0x1B000;var regSlots=memory+0x1C000;var regArray=memory+0x1D000;
const ulong centre=9007199254740995,target=9007199254741119;
Write(manager,expected+0x51BB4D0);Write(manager+8,expected+0x51BB500);Write(manager+0x10,owner);Write(service,expected+0x51BB600);
Write(service+0x308,(byte)1);Write(service+0x309,(byte)1);Write(service+0x30A,(byte)1);Write(service+0x3E8,100f);
Write(navigation,expected+0x552A9B8);Write(expected+0x552A9B8+0x50,expected+0x21E8CB0);Write(navigation-0x48,owner);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,expected+0x551A1B0);Write(metadata+0xA8,buckets);Write(metadata+0xB0,1UL);Write(metadata+0xC0,1UL);
Write(metadata+0xC8,empty);Write(metadata+0xD0,1UL);Write(empty,empty);Write(buckets,genericNode);Write(genericNode,buckets);
Write(genericNode+8,target);Write(genericNode+0x40,memory+0x9000);
Write(service+0x330,2UL);Write(service+0x338,definitions);Write(definitions+0x1B8,10f);Write(definitions+0x260+0x1B8,6f);
Write(service+0x3C8,2UL);Write(service+0x3D0,8UL);Write(service+0x3D8,storage);
nuint Put(ulong address,ulong power,int state)
{
var slot=GalaxyFactHash(address)&7;
while((Read<ulong>(storage)&(1UL<<(int)slot))!=0)slot=(slot+1)&7;
Write(storage,Read<ulong>(storage)|(1UL<<(int)slot));var node=storage+16+(nuint)slot*0x180;
Write(node,address);Write(node+0x10,power);Write(node+0x1C,state);return node;
}
var centreNode=Put(centre,0,1);var candidateNode=Put(target,0,0);
Write(provider,expected+0x552E598);Write(expected+0x552E598+0x20,expected+0x3B3E510);
Write(expected+0x552E598+0x40,expected+0x3AF6BA0);Write(expected+0x552E598+0x68,expected+0x3B27590);
Write(provider+0x78,service);Write(provider+0x168,navigation);Write(provider+0x170,obj);Write(provider+0x180,100f);
Write(provider+0x160,(byte)1);Write(provider+0x1B0,(byte)1);Write(provider+0x1A8,centre);Write(provider+0x1C0,10f);
Write(provider+0x1A0,2f);Write(provider+0x10,config);Write(config+0x148,.25f);Write(provider+0xF0,2UL);Write(provider+0xF8,colours);
Write(colours,.2f);Write(colours+4,.4f);Write(colours+8,1.5f);Write(colours+0x18,.7f);Write(colours+0x1C,.8f);Write(colours+0x20,.9f);
Write(component,expected+0x551FE98);Write(expected+0x551FE98,expected+0x3A4C030);Write(main,expected+0x551FFC0);
Write(expected+0x551FFC0+0xF0,expected+0x3A6AEB0);Write(expected+0x551FFC0+0xF8,expected+0x3A6AFA0);
Write(expected+0x551FFC0+0x100,expected+0x3A6AE10);Write(expected+0x551FFC0+0x108,expected+0x3A6AD80);
Write(main+0x1B8,settings);Write(settings,settingVt);Write(settingVt+0x1F0,expected+0x2601B60);Write(settingVt+0x200,expected+0x2646760);
Write(settings+0x5F8,2);Write(settings+0x530,1U);Write(settings+0x538,settingRows);Write(settingRows+0x54+29*4,1U);
Write(main+0x5AC,1);Write(main+0x5B0,0f);Write(main+0x5B4,(byte)0);Write(main+0x5B8,0);Write(main+0x280,-1);Write(main+0x288,type);
Write(type,expected+0x552D788);Write(controller,expected+0x552D5C0);Write(controller+0x3B0,block);Write(controller+0x3B8,provider);Write(block+8,1);Write(block+0xC,1);
Write(expected+0x5FDB224,17U);Write(registry+0x10,regMeta);Write(registry+0x18,regArray);Write(regMeta+0x18,1UL);Write(regMeta+0x30,regSlots);Write(regSlots+17*16,0UL);Write(regArray,component);
if(!CopyGalaxyPowerOuterContext(service,owner,navigation,metadata,expected,[0,0,0],out var outer)||
!TryCreateGalaxyPowerInfluenceContext(outer,new(){registry=registry},out var context)||context is null)return 0;
double[] Point(float delta)=>[outer.centrePosition.x+delta,outer.centrePosition.y,outer.centrePosition.z];
bool Copy(float delta,out GalaxyPowerInfluenceFact? fact)=>CopyGalaxyPowerInfluence(context,target,Point(delta),out fact);
var before=Platform.ReadBytes(memory,0x20000);uint passed=0;
if(Copy(5,out var first)&&first is{eligible:true,kind:0}&&first.fromSystemAddress==centre&&first.toSystemAddress==target&&
first.linearRgb!.SequenceEqual(new[]{.2f,.4f,1.5f})&&first.phase==GalaxyPowerInfluenceInitialPhase(target)-.5f)passed|=1;
if(Copy(10,out var edge)&&edge is{eligible:false}&&Copy(10.03125f,out edge)&&edge is{eligible:false})passed|=2;
Write(candidateNode+0x1C,1);var both=Copy(5,out var same)&&same is{eligible:false};Write(provider+0x1C0,0f);
if(TryCreateGalaxyPowerInfluenceContext(outer,new(){registry=registry},out var reversed)&&reversed is not null&&
CopyGalaxyPowerInfluence(reversed,target,Point(5),out var reverse)&&reverse is{eligible:true,kind:1}&&reverse.fromSystemAddress==target&&reverse.toSystemAddress==centre&&both)passed|=4;
Write(provider+0x1C0,10f);Write(candidateNode+0x1C,0);Write(centreNode+0x1C,1);
Write(provider+0x1C0,0f);Write(candidateNode+0x1C,1);Write(candidateNode+0x10,1UL);
var different=TryCreateGalaxyPowerInfluenceContext(outer,new(){registry=registry},out reversed)&&reversed is not null&&
CopyGalaxyPowerInfluence(reversed,target,Point(5),out same)&&same is{eligible:false};
Write(candidateNode+0x10,0UL);Write(centreNode+0x1C,0);
if(different&&reversed is not null&&CopyGalaxyPowerInfluence(reversed,target,Point(5),out same)&&same is{eligible:true,kind:0})passed|=8;
Write(centreNode+0x1C,1);Write(candidateNode+0x1C,0);Write(provider+0x1C0,10f);
Write(provider+0x1B0,(byte)0);var pending=!Copy(5,out _);Write(provider+0x1B0,(byte)1);Write(expected+0x5FDB275,(byte)1);
if(pending&&!Copy(5,out _))passed|=16;Write(expected+0x5FDB275,(byte)0);
Write(candidateNode+0x1C,5);var invalid=!Copy(5,out _);Write(candidateNode+0x1C,0);Write(provider+0x1A0,3f);
if(invalid&&!Copy(5,out _))passed|=32;Write(provider+0x1A0,2f);
Write(colours,float.NaN);var badColour=!Copy(5,out _);Write(colours,.2f);Write(expected+0x552E598+0x68,expected+0x3B27591);
if(badColour&&!Copy(5,out _))passed|=64;Write(expected+0x552E598+0x68,expected+0x3B27590);
if(Copy(5,out _)&&Platform.ReadBytes(memory,0x20000).AsSpan().SequenceEqual(before)&&
GalaxyPowerInfluenceDescription(first)?["fromSystemAddress"]?.GetValue<string>()==centre.ToString()&&
GalaxyPowerInfluenceDescription(new(false,0,0,null,null,null,0,0,0,0))?.Count==2)passed|=128;
return passed;
}
catch{return 0;}
finally{Platform.Free(memory);}
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyPowerInfluenceSelfTest")]
internal static uint ExportGalaxyPowerInfluenceSelfTest()=>RunTest(GalaxyPowerInfluenceSelfTest);
#endif
}