diff --git a/Automata.sln b/Nexus.sln
similarity index 75%
rename from Automata.sln
rename to Nexus.sln
index 26c298e..05014f4 100644
--- a/Automata.sln
+++ b/Nexus.sln
@@ -5,29 +5,39 @@ VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automata.Core", "src\Automata.Core\Automata.Core.csproj", "{6432F6A5-11A0-4960-AFFC-E810D4325C35}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Core", "src\Nexus.Core\Nexus.Core.csproj", "{A31E6F94-A702-4B58-8317-83658E556B5C}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automata.Game", "src\Automata.Game\Automata.Game.csproj", "{97B8362D-777C-4ED1-B964-D6598B333E4C}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.GameOffsets", "src\Nexus.GameOffsets\Nexus.GameOffsets.csproj", "{C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automata.Screen", "src\Automata.Screen\Automata.Screen.csproj", "{F92C5EA2-8999-41BC-9B28-D52AD5F3542C}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Memory", "src\Nexus.Memory\Nexus.Memory.csproj", "{B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automata.Items", "src\Automata.Items\Automata.Items.csproj", "{9CAB0D49-1E24-4F76-ABF8-9A5ED6819F00}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Input", "src\Nexus.Input\Nexus.Input.csproj", "{E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automata.Trade", "src\Automata.Trade\Automata.Trade.csproj", "{8F73A696-EB54-4C6F-9603-5A6BAC5D334A}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Systems", "src\Nexus.Systems\Nexus.Systems.csproj", "{95AC4C34-26A0-4D7F-A712-375EB28B54B8}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automata.Log", "src\Automata.Log\Automata.Log.csproj", "{B68D787D-7A83-4D8F-9F10-0B72C2E99B49}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Pathfinding", "src\Nexus.Pathfinding\Nexus.Pathfinding.csproj", "{F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automata.Bot", "src\Automata.Bot\Automata.Bot.csproj", "{188C4F87-153F-4182-B816-9FB56F08CF3A}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Data", "src\Nexus.Data\Nexus.Data.csproj", "{1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automata.Inventory", "src\Automata.Inventory\Automata.Inventory.csproj", "{F186DDC8-6843-43E9-8BD3-9F914C5E784E}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Engine", "src\Nexus.Engine\Nexus.Engine.csproj", "{C2E97306-20E4-4A69-A7AB-541A72614C76}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automata.Ui", "src\Automata.Ui\Automata.Ui.csproj", "{859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Game", "src\Nexus.Game\Nexus.Game.csproj", "{97B8362D-777C-4ED1-B964-D6598B333E4C}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automata.Navigation", "src\Automata.Navigation\Automata.Navigation.csproj", "{D3F7A2E1-9B4C-4E8D-A6F5-1C2D3E4F5A6B}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Screen", "src\Nexus.Screen\Nexus.Screen.csproj", "{F92C5EA2-8999-41BC-9B28-D52AD5F3542C}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roboto.Memory", "src\Roboto.Memory\Roboto.Memory.csproj", "{B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Items", "src\Nexus.Items\Nexus.Items.csproj", "{9CAB0D49-1E24-4F76-ABF8-9A5ED6819F00}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roboto.GameOffsets", "src\Roboto.GameOffsets\Roboto.GameOffsets.csproj", "{C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Trade", "src\Nexus.Trade\Nexus.Trade.csproj", "{8F73A696-EB54-4C6F-9603-5A6BAC5D334A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Log", "src\Nexus.Log\Nexus.Log.csproj", "{B68D787D-7A83-4D8F-9F10-0B72C2E99B49}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Bot", "src\Nexus.Bot\Nexus.Bot.csproj", "{188C4F87-153F-4182-B816-9FB56F08CF3A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Inventory", "src\Nexus.Inventory\Nexus.Inventory.csproj", "{F186DDC8-6843-43E9-8BD3-9F914C5E784E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Navigation", "src\Nexus.Navigation\Nexus.Navigation.csproj", "{D3F7A2E1-9B4C-4E8D-A6F5-1C2D3E4F5A6B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Ui", "src\Nexus.Ui\Nexus.Ui.csproj", "{859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lib", "lib", "{652F700E-4F84-4E66-BD62-717D3A8D6FBC}"
EndProject
@@ -47,19 +57,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sidekick.Data", "lib\Sideki
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sidekick.Data.Builder", "lib\Sidekick\src\Sidekick.Data.Builder\Sidekick.Data.Builder.csproj", "{E5C26A34-5EDF-488B-93C7-F8738F2CEB97}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "roboto", "roboto", "{D1A2B3C4-E5F6-7890-ABCD-EF1234567890}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roboto.Core", "src\Roboto.Core\Roboto.Core.csproj", "{A31E6F94-A702-4B58-8317-83658E556B5C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roboto.Input", "src\Roboto.Input\Roboto.Input.csproj", "{E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roboto.Systems", "src\Roboto.Systems\Roboto.Systems.csproj", "{95AC4C34-26A0-4D7F-A712-375EB28B54B8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roboto.Engine", "src\Roboto.Engine\Roboto.Engine.csproj", "{C2E97306-20E4-4A69-A7AB-541A72614C76}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roboto.Navigation", "src\Roboto.Navigation\Roboto.Navigation.csproj", "{F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Roboto.Data", "src\Roboto.Data\Roboto.Data.csproj", "{1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus.Simulator", "src\Nexus.Simulator\Nexus.Simulator.csproj", "{9198C826-9356-4763-87EF-BBC7166B745B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -70,10 +68,38 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {6432F6A5-11A0-4960-AFFC-E810D4325C35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6432F6A5-11A0-4960-AFFC-E810D4325C35}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6432F6A5-11A0-4960-AFFC-E810D4325C35}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6432F6A5-11A0-4960-AFFC-E810D4325C35}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A31E6F94-A702-4B58-8317-83658E556B5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A31E6F94-A702-4B58-8317-83658E556B5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A31E6F94-A702-4B58-8317-83658E556B5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A31E6F94-A702-4B58-8317-83658E556B5C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {95AC4C34-26A0-4D7F-A712-375EB28B54B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {95AC4C34-26A0-4D7F-A712-375EB28B54B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {95AC4C34-26A0-4D7F-A712-375EB28B54B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {95AC4C34-26A0-4D7F-A712-375EB28B54B8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C2E97306-20E4-4A69-A7AB-541A72614C76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C2E97306-20E4-4A69-A7AB-541A72614C76}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C2E97306-20E4-4A69-A7AB-541A72614C76}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C2E97306-20E4-4A69-A7AB-541A72614C76}.Release|Any CPU.Build.0 = Release|Any CPU
{97B8362D-777C-4ED1-B964-D6598B333E4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{97B8362D-777C-4ED1-B964-D6598B333E4C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{97B8362D-777C-4ED1-B964-D6598B333E4C}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -102,22 +128,14 @@ Global
{F186DDC8-6843-43E9-8BD3-9F914C5E784E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F186DDC8-6843-43E9-8BD3-9F914C5E784E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F186DDC8-6843-43E9-8BD3-9F914C5E784E}.Release|Any CPU.Build.0 = Release|Any CPU
- {859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3}.Release|Any CPU.Build.0 = Release|Any CPU
{D3F7A2E1-9B4C-4E8D-A6F5-1C2D3E4F5A6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D3F7A2E1-9B4C-4E8D-A6F5-1C2D3E4F5A6B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D3F7A2E1-9B4C-4E8D-A6F5-1C2D3E4F5A6B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D3F7A2E1-9B4C-4E8D-A6F5-1C2D3E4F5A6B}.Release|Any CPU.Build.0 = Release|Any CPU
- {B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B}.Release|Any CPU.Build.0 = Release|Any CPU
- {C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3}.Release|Any CPU.Build.0 = Release|Any CPU
{B858F6F2-389F-475A-87FE-E4E01DA3E948}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B858F6F2-389F-475A-87FE-E4E01DA3E948}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B858F6F2-389F-475A-87FE-E4E01DA3E948}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -150,33 +168,20 @@ Global
{E5C26A34-5EDF-488B-93C7-F8738F2CEB97}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E5C26A34-5EDF-488B-93C7-F8738F2CEB97}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5C26A34-5EDF-488B-93C7-F8738F2CEB97}.Release|Any CPU.Build.0 = Release|Any CPU
- {A31E6F94-A702-4B58-8317-83658E556B5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A31E6F94-A702-4B58-8317-83658E556B5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A31E6F94-A702-4B58-8317-83658E556B5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A31E6F94-A702-4B58-8317-83658E556B5C}.Release|Any CPU.Build.0 = Release|Any CPU
- {E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A}.Release|Any CPU.Build.0 = Release|Any CPU
- {95AC4C34-26A0-4D7F-A712-375EB28B54B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {95AC4C34-26A0-4D7F-A712-375EB28B54B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {95AC4C34-26A0-4D7F-A712-375EB28B54B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {95AC4C34-26A0-4D7F-A712-375EB28B54B8}.Release|Any CPU.Build.0 = Release|Any CPU
- {C2E97306-20E4-4A69-A7AB-541A72614C76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C2E97306-20E4-4A69-A7AB-541A72614C76}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C2E97306-20E4-4A69-A7AB-541A72614C76}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C2E97306-20E4-4A69-A7AB-541A72614C76}.Release|Any CPU.Build.0 = Release|Any CPU
- {F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D}.Release|Any CPU.Build.0 = Release|Any CPU
- {1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9198C826-9356-4763-87EF-BBC7166B745B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9198C826-9356-4763-87EF-BBC7166B745B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9198C826-9356-4763-87EF-BBC7166B745B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9198C826-9356-4763-87EF-BBC7166B745B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {6432F6A5-11A0-4960-AFFC-E810D4325C35} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
+ {A31E6F94-A702-4B58-8317-83658E556B5C} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
+ {C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
+ {B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
+ {E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
+ {95AC4C34-26A0-4D7F-A712-375EB28B54B8} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
+ {F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
+ {1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
+ {C2E97306-20E4-4A69-A7AB-541A72614C76} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
{97B8362D-777C-4ED1-B964-D6598B333E4C} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
{F92C5EA2-8999-41BC-9B28-D52AD5F3542C} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
{9CAB0D49-1E24-4F76-ABF8-9A5ED6819F00} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
@@ -184,10 +189,8 @@ Global
{B68D787D-7A83-4D8F-9F10-0B72C2E99B49} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
{188C4F87-153F-4182-B816-9FB56F08CF3A} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
{F186DDC8-6843-43E9-8BD3-9F914C5E784E} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
- {859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
{D3F7A2E1-9B4C-4E8D-A6F5-1C2D3E4F5A6B} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
- {B7E3F1A2-4D5C-6E7F-8A9B-0C1D2E3F4A5B} = {D1A2B3C4-E5F6-7890-ABCD-EF1234567890}
- {C8D9E0F1-2A3B-4C5D-6E7F-8A9B0C1D2E3F} = {D1A2B3C4-E5F6-7890-ABCD-EF1234567890}
+ {859F870E-F013-4C2B-AFEC-7A8C6A5FE3F3} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
{B858F6F2-389F-475A-87FE-E4E01DA3E948} = {652F700E-4F84-4E66-BD62-717D3A8D6FBC}
{6FEA655D-18E4-4DA1-839F-A41433B03FBB} = {652F700E-4F84-4E66-BD62-717D3A8D6FBC}
{74FD0F88-86BC-49AE-9A16-136D92A10090} = {652F700E-4F84-4E66-BD62-717D3A8D6FBC}
@@ -196,12 +199,6 @@ Global
{8CEE036C-A229-4F22-BD0E-D7CDAE13E54F} = {652F700E-4F84-4E66-BD62-717D3A8D6FBC}
{9428D5D4-4061-467A-BD26-C1FEED95E8E6} = {652F700E-4F84-4E66-BD62-717D3A8D6FBC}
{E5C26A34-5EDF-488B-93C7-F8738F2CEB97} = {652F700E-4F84-4E66-BD62-717D3A8D6FBC}
- {D1A2B3C4-E5F6-7890-ABCD-EF1234567890} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
- {A31E6F94-A702-4B58-8317-83658E556B5C} = {D1A2B3C4-E5F6-7890-ABCD-EF1234567890}
- {E61E96C5-3DE7-4B31-A7AD-CCA99BEF8E4A} = {D1A2B3C4-E5F6-7890-ABCD-EF1234567890}
- {95AC4C34-26A0-4D7F-A712-375EB28B54B8} = {D1A2B3C4-E5F6-7890-ABCD-EF1234567890}
- {C2E97306-20E4-4A69-A7AB-541A72614C76} = {D1A2B3C4-E5F6-7890-ABCD-EF1234567890}
- {F4B5C6D7-E8F9-0A1B-2C3D-4E5F6A7B8C9D} = {D1A2B3C4-E5F6-7890-ABCD-EF1234567890}
- {1A2B3C4D-5E6F-7A8B-9C0D-E1F2A3B4C5D6} = {D1A2B3C4-E5F6-7890-ABCD-EF1234567890}
+ {9198C826-9356-4763-87EF-BBC7166B745B} = {67A27DFE-D2C5-479D-86FE-7E156BD0CFAA}
EndGlobalSection
EndGlobal
diff --git a/imgui.ini b/imgui.ini
new file mode 100644
index 0000000..6e55fd4
--- /dev/null
+++ b/imgui.ini
@@ -0,0 +1,15 @@
+[Window][Debug##Default]
+Pos=60,60
+Size=400,400
+Collapsed=0
+
+[Window][Simulator Controls]
+Pos=60,60
+Size=219,425
+Collapsed=0
+
+[Window][Simulator]
+Pos=11,220
+Size=1200,681
+Collapsed=0
+
diff --git a/src/Automata.Bot/Automata.Bot.csproj b/src/Automata.Bot/Automata.Bot.csproj
deleted file mode 100644
index 77ae1f4..0000000
--- a/src/Automata.Bot/Automata.Bot.csproj
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- net8.0-windows10.0.19041.0
- enable
- enable
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Automata.Inventory/Automata.Inventory.csproj b/src/Automata.Inventory/Automata.Inventory.csproj
deleted file mode 100644
index bfb3ac5..0000000
--- a/src/Automata.Inventory/Automata.Inventory.csproj
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
- net8.0-windows10.0.19041.0
- enable
- enable
-
-
-
-
-
-
-
-
diff --git a/src/Automata.Bot/AtlasExecutor.cs b/src/Nexus.Bot/AtlasExecutor.cs
similarity index 98%
rename from src/Automata.Bot/AtlasExecutor.cs
rename to src/Nexus.Bot/AtlasExecutor.cs
index 2f4e307..65ff5c0 100644
--- a/src/Automata.Bot/AtlasExecutor.cs
+++ b/src/Nexus.Bot/AtlasExecutor.cs
@@ -1,11 +1,11 @@
-using Automata.Core;
-using Automata.Game;
-using Automata.Inventory;
-using Automata.Navigation;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Inventory;
+using Nexus.Navigation;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
///
/// Captures the full endgame atlas as a panorama image.
diff --git a/src/Automata.Bot/BotOrchestrator.cs b/src/Nexus.Bot/BotOrchestrator.cs
similarity index 99%
rename from src/Automata.Bot/BotOrchestrator.cs
rename to src/Nexus.Bot/BotOrchestrator.cs
index 708f005..ab2ca51 100644
--- a/src/Automata.Bot/BotOrchestrator.cs
+++ b/src/Nexus.Bot/BotOrchestrator.cs
@@ -1,13 +1,13 @@
-using Automata.Core;
-using Automata.Game;
-using Automata.Inventory;
-using Automata.GameLog;
-using Automata.Navigation;
-using Automata.Screen;
-using Automata.Trade;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Inventory;
+using Nexus.GameLog;
+using Nexus.Navigation;
+using Nexus.Screen;
+using Nexus.Trade;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
public class BotStatus
{
diff --git a/src/Automata.Bot/CombatManager.cs b/src/Nexus.Bot/CombatManager.cs
similarity index 98%
rename from src/Automata.Bot/CombatManager.cs
rename to src/Nexus.Bot/CombatManager.cs
index d494cde..44ce7cf 100644
--- a/src/Automata.Bot/CombatManager.cs
+++ b/src/Nexus.Bot/CombatManager.cs
@@ -1,10 +1,10 @@
using System.Diagnostics;
-using Automata.Core;
-using Automata.Game;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
///
/// Manages the attack state machine (click → hold) with mana monitoring and flask usage.
diff --git a/src/Automata.Bot/CraftingExecutor.cs b/src/Nexus.Bot/CraftingExecutor.cs
similarity index 98%
rename from src/Automata.Bot/CraftingExecutor.cs
rename to src/Nexus.Bot/CraftingExecutor.cs
index 3ba22e0..e7add43 100644
--- a/src/Automata.Bot/CraftingExecutor.cs
+++ b/src/Nexus.Bot/CraftingExecutor.cs
@@ -1,9 +1,9 @@
-using Automata.Core;
-using Automata.Game;
-using Automata.Items;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Items;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
public class CraftingExecutor
{
diff --git a/src/Automata.Bot/DiamondExecutor.cs b/src/Nexus.Bot/DiamondExecutor.cs
similarity index 98%
rename from src/Automata.Bot/DiamondExecutor.cs
rename to src/Nexus.Bot/DiamondExecutor.cs
index 590a58f..fd1ab7f 100644
--- a/src/Automata.Bot/DiamondExecutor.cs
+++ b/src/Nexus.Bot/DiamondExecutor.cs
@@ -1,12 +1,12 @@
using System.Collections.Concurrent;
-using Automata.Core;
-using Automata.Game;
-using Automata.Inventory;
-using Automata.Screen;
-using Automata.Trade;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Inventory;
+using Nexus.Screen;
+using Nexus.Trade;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
public class DiamondExecutor
{
diff --git a/src/Automata.Bot/FlaskManager.cs b/src/Nexus.Bot/FlaskManager.cs
similarity index 96%
rename from src/Automata.Bot/FlaskManager.cs
rename to src/Nexus.Bot/FlaskManager.cs
index 476b4b7..591a043 100644
--- a/src/Automata.Bot/FlaskManager.cs
+++ b/src/Nexus.Bot/FlaskManager.cs
@@ -1,9 +1,9 @@
using System.Diagnostics;
-using Automata.Game;
-using Automata.Screen;
+using Nexus.Game;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
///
/// Monitors life/mana and presses flask keys when they drop below thresholds.
diff --git a/src/Automata.Bot/GameExecutor.cs b/src/Nexus.Bot/GameExecutor.cs
similarity index 98%
rename from src/Automata.Bot/GameExecutor.cs
rename to src/Nexus.Bot/GameExecutor.cs
index 1f7386e..4f6ebe6 100644
--- a/src/Automata.Bot/GameExecutor.cs
+++ b/src/Nexus.Bot/GameExecutor.cs
@@ -1,11 +1,11 @@
using System.Diagnostics;
-using Automata.Core;
-using Automata.Game;
-using Automata.Inventory;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Inventory;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
///
/// Base class for game executors that interact with the game world.
diff --git a/src/Automata.Bot/KulemakExecutor.cs b/src/Nexus.Bot/KulemakExecutor.cs
similarity index 99%
rename from src/Automata.Bot/KulemakExecutor.cs
rename to src/Nexus.Bot/KulemakExecutor.cs
index 1abd402..e97088a 100644
--- a/src/Automata.Bot/KulemakExecutor.cs
+++ b/src/Nexus.Bot/KulemakExecutor.cs
@@ -1,12 +1,12 @@
-using Automata.Core;
-using Automata.Game;
-using Automata.GameLog;
-using Automata.Inventory;
-using Automata.Navigation;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.GameLog;
+using Nexus.Inventory;
+using Nexus.Navigation;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
///
/// Kulemak-specific boss run executor: scripted 4-phase + ring fight,
diff --git a/src/Automata.Bot/MappingExecutor.cs b/src/Nexus.Bot/MappingExecutor.cs
similarity index 99%
rename from src/Automata.Bot/MappingExecutor.cs
rename to src/Nexus.Bot/MappingExecutor.cs
index a8979ea..88ed649 100644
--- a/src/Automata.Bot/MappingExecutor.cs
+++ b/src/Nexus.Bot/MappingExecutor.cs
@@ -1,13 +1,13 @@
using System.Diagnostics;
-using Automata.Core;
-using Automata.Game;
-using Automata.GameLog;
-using Automata.Inventory;
-using Automata.Navigation;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.GameLog;
+using Nexus.Inventory;
+using Nexus.Navigation;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
///
/// Shared infrastructure for any map/boss activity: combat loop, WASD navigation,
diff --git a/src/Nexus.Bot/Nexus.Bot.csproj b/src/Nexus.Bot/Nexus.Bot.csproj
new file mode 100644
index 0000000..d2d07a4
--- /dev/null
+++ b/src/Nexus.Bot/Nexus.Bot.csproj
@@ -0,0 +1,17 @@
+
+
+ net8.0-windows10.0.19041.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Automata.Bot/ScrapExecutor.cs b/src/Nexus.Bot/ScrapExecutor.cs
similarity index 97%
rename from src/Automata.Bot/ScrapExecutor.cs
rename to src/Nexus.Bot/ScrapExecutor.cs
index 3631265..dc4f051 100644
--- a/src/Automata.Bot/ScrapExecutor.cs
+++ b/src/Nexus.Bot/ScrapExecutor.cs
@@ -1,11 +1,11 @@
-using Automata.Core;
-using Automata.Game;
-using Automata.Inventory;
-using Automata.Screen;
-using Automata.Trade;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Inventory;
+using Nexus.Screen;
+using Nexus.Trade;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
public class ScrapExecutor
{
diff --git a/src/Automata.Bot/TradeExecutor.cs b/src/Nexus.Bot/TradeExecutor.cs
similarity index 97%
rename from src/Automata.Bot/TradeExecutor.cs
rename to src/Nexus.Bot/TradeExecutor.cs
index dfb1a34..acac3ce 100644
--- a/src/Automata.Bot/TradeExecutor.cs
+++ b/src/Nexus.Bot/TradeExecutor.cs
@@ -1,11 +1,11 @@
-using Automata.Core;
-using Automata.Game;
-using Automata.Inventory;
-using Automata.Screen;
-using Automata.Trade;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Inventory;
+using Nexus.Screen;
+using Nexus.Trade;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
public class TradeExecutor
{
diff --git a/src/Automata.Bot/TradeQueue.cs b/src/Nexus.Bot/TradeQueue.cs
similarity index 97%
rename from src/Automata.Bot/TradeQueue.cs
rename to src/Nexus.Bot/TradeQueue.cs
index 5521247..7ae9387 100644
--- a/src/Automata.Bot/TradeQueue.cs
+++ b/src/Nexus.Bot/TradeQueue.cs
@@ -1,7 +1,7 @@
-using Automata.Core;
+using Nexus.Core;
using Serilog;
-namespace Automata.Bot;
+namespace Nexus.Bot;
public class TradeQueue
{
diff --git a/src/Roboto.Core/ActionQueue.cs b/src/Nexus.Core/ActionQueue.cs
similarity index 99%
rename from src/Roboto.Core/ActionQueue.cs
rename to src/Nexus.Core/ActionQueue.cs
index 0d3a4fd..377c87b 100644
--- a/src/Roboto.Core/ActionQueue.cs
+++ b/src/Nexus.Core/ActionQueue.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public class ActionQueue
{
diff --git a/src/Roboto.Core/Actions.cs b/src/Nexus.Core/Actions.cs
similarity index 97%
rename from src/Roboto.Core/Actions.cs
rename to src/Nexus.Core/Actions.cs
index 9bd6e4b..453c5f5 100644
--- a/src/Roboto.Core/Actions.cs
+++ b/src/Nexus.Core/Actions.cs
@@ -1,6 +1,6 @@
using System.Numerics;
-namespace Roboto.Core;
+namespace Nexus.Core;
public enum ClickType { Left, Right, Middle }
public enum KeyActionType { Press, Down, Up }
diff --git a/src/Roboto.Core/BotConfig.cs b/src/Nexus.Core/BotConfig.cs
similarity index 97%
rename from src/Roboto.Core/BotConfig.cs
rename to src/Nexus.Core/BotConfig.cs
index 230c502..e06fe25 100644
--- a/src/Roboto.Core/BotConfig.cs
+++ b/src/Nexus.Core/BotConfig.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public class BotConfig
{
diff --git a/src/Roboto.Core/Buff.cs b/src/Nexus.Core/Buff.cs
similarity index 89%
rename from src/Roboto.Core/Buff.cs
rename to src/Nexus.Core/Buff.cs
index e80ba65..85aab5a 100644
--- a/src/Roboto.Core/Buff.cs
+++ b/src/Nexus.Core/Buff.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public record Buff
{
diff --git a/src/Roboto.Core/CharacterProfile.cs b/src/Nexus.Core/CharacterProfile.cs
similarity index 98%
rename from src/Roboto.Core/CharacterProfile.cs
rename to src/Nexus.Core/CharacterProfile.cs
index 8518c32..b592d32 100644
--- a/src/Roboto.Core/CharacterProfile.cs
+++ b/src/Nexus.Core/CharacterProfile.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public class CharacterProfile
{
diff --git a/src/Roboto.Core/CombatSettings.cs b/src/Nexus.Core/CombatSettings.cs
similarity index 93%
rename from src/Roboto.Core/CombatSettings.cs
rename to src/Nexus.Core/CombatSettings.cs
index 02cf2a9..a511432 100644
--- a/src/Roboto.Core/CombatSettings.cs
+++ b/src/Nexus.Core/CombatSettings.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public class CombatSettings
{
diff --git a/src/Automata.Core/ConfigStore.cs b/src/Nexus.Core/ConfigStore.cs
similarity index 99%
rename from src/Automata.Core/ConfigStore.cs
rename to src/Nexus.Core/ConfigStore.cs
index 6c93261..d0fef6d 100644
--- a/src/Automata.Core/ConfigStore.cs
+++ b/src/Nexus.Core/ConfigStore.cs
@@ -2,7 +2,7 @@ using System.Text.Json;
using System.Text.Json.Serialization;
using Serilog;
-namespace Automata.Core;
+namespace Nexus.Core;
public class SavedLink
{
diff --git a/src/Automata.Core/Delays.cs b/src/Nexus.Core/Delays.cs
similarity index 92%
rename from src/Automata.Core/Delays.cs
rename to src/Nexus.Core/Delays.cs
index 01b9f16..907aad0 100644
--- a/src/Automata.Core/Delays.cs
+++ b/src/Nexus.Core/Delays.cs
@@ -1,4 +1,4 @@
-namespace Automata.Core;
+namespace Nexus.Core;
public static class Delays
{
diff --git a/src/Roboto.Core/EntitySnapshot.cs b/src/Nexus.Core/EntitySnapshot.cs
similarity index 98%
rename from src/Roboto.Core/EntitySnapshot.cs
rename to src/Nexus.Core/EntitySnapshot.cs
index 7ede015..4e4900d 100644
--- a/src/Roboto.Core/EntitySnapshot.cs
+++ b/src/Nexus.Core/EntitySnapshot.cs
@@ -1,6 +1,6 @@
using System.Numerics;
-namespace Roboto.Core;
+namespace Nexus.Core;
public enum EntityCategory
{
diff --git a/src/Roboto.Core/Enums.cs b/src/Nexus.Core/Enums.cs
similarity index 93%
rename from src/Roboto.Core/Enums.cs
rename to src/Nexus.Core/Enums.cs
index 1f8821c..1a41bea 100644
--- a/src/Roboto.Core/Enums.cs
+++ b/src/Nexus.Core/Enums.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public enum DangerLevel
{
diff --git a/src/Roboto.Core/FlaskSettings.cs b/src/Nexus.Core/FlaskSettings.cs
similarity index 93%
rename from src/Roboto.Core/FlaskSettings.cs
rename to src/Nexus.Core/FlaskSettings.cs
index 8b7da24..39dbf6d 100644
--- a/src/Roboto.Core/FlaskSettings.cs
+++ b/src/Nexus.Core/FlaskSettings.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public class FlaskSettings
{
diff --git a/src/Roboto.Core/FlaskState.cs b/src/Nexus.Core/FlaskState.cs
similarity index 91%
rename from src/Roboto.Core/FlaskState.cs
rename to src/Nexus.Core/FlaskState.cs
index 6a4c074..3576f0e 100644
--- a/src/Roboto.Core/FlaskState.cs
+++ b/src/Nexus.Core/FlaskState.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public record FlaskState
{
diff --git a/src/Roboto.Core/GameState.cs b/src/Nexus.Core/GameState.cs
similarity index 98%
rename from src/Roboto.Core/GameState.cs
rename to src/Nexus.Core/GameState.cs
index 37b4fca..7baf4c7 100644
--- a/src/Roboto.Core/GameState.cs
+++ b/src/Nexus.Core/GameState.cs
@@ -1,6 +1,6 @@
using System.Numerics;
-namespace Roboto.Core;
+namespace Nexus.Core;
public class GameState
{
diff --git a/src/Roboto.Core/GroundEffect.cs b/src/Nexus.Core/GroundEffect.cs
similarity index 92%
rename from src/Roboto.Core/GroundEffect.cs
rename to src/Nexus.Core/GroundEffect.cs
index ab7f3f8..f14f752 100644
--- a/src/Roboto.Core/GroundEffect.cs
+++ b/src/Nexus.Core/GroundEffect.cs
@@ -1,6 +1,6 @@
using System.Numerics;
-namespace Roboto.Core;
+namespace Nexus.Core;
public record GroundEffect
{
diff --git a/src/Automata.Core/Helpers.cs b/src/Nexus.Core/Helpers.cs
similarity index 95%
rename from src/Automata.Core/Helpers.cs
rename to src/Nexus.Core/Helpers.cs
index 19f5205..48b3c16 100644
--- a/src/Automata.Core/Helpers.cs
+++ b/src/Nexus.Core/Helpers.cs
@@ -1,4 +1,4 @@
-namespace Automata.Core;
+namespace Nexus.Core;
public static class Helpers
{
diff --git a/src/Roboto.Core/IInputController.cs b/src/Nexus.Core/IInputController.cs
similarity index 95%
rename from src/Roboto.Core/IInputController.cs
rename to src/Nexus.Core/IInputController.cs
index 24f9b86..394e3c1 100644
--- a/src/Roboto.Core/IInputController.cs
+++ b/src/Nexus.Core/IInputController.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public interface IInputController
{
diff --git a/src/Roboto.Core/ISystem.cs b/src/Nexus.Core/ISystem.cs
similarity index 88%
rename from src/Roboto.Core/ISystem.cs
rename to src/Nexus.Core/ISystem.cs
index 05b4564..e904755 100644
--- a/src/Roboto.Core/ISystem.cs
+++ b/src/Nexus.Core/ISystem.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public interface ISystem
{
diff --git a/src/Automata.Core/LinkManager.cs b/src/Nexus.Core/LinkManager.cs
similarity index 99%
rename from src/Automata.Core/LinkManager.cs
rename to src/Nexus.Core/LinkManager.cs
index 7915a9a..32f0ec2 100644
--- a/src/Automata.Core/LinkManager.cs
+++ b/src/Nexus.Core/LinkManager.cs
@@ -1,6 +1,6 @@
using Serilog;
-namespace Automata.Core;
+namespace Nexus.Core;
public class TradeLink
{
diff --git a/src/Automata.Core/Logging.cs b/src/Nexus.Core/Logging.cs
similarity index 95%
rename from src/Automata.Core/Logging.cs
rename to src/Nexus.Core/Logging.cs
index bd4f173..742b887 100644
--- a/src/Automata.Core/Logging.cs
+++ b/src/Nexus.Core/Logging.cs
@@ -1,7 +1,7 @@
using Serilog;
using Serilog.Events;
-namespace Automata.Core;
+namespace Nexus.Core;
public static class Logging
{
diff --git a/src/Automata.Core/ModPoolService.cs b/src/Nexus.Core/ModPoolService.cs
similarity index 99%
rename from src/Automata.Core/ModPoolService.cs
rename to src/Nexus.Core/ModPoolService.cs
index 4aeeddc..4000c1f 100644
--- a/src/Automata.Core/ModPoolService.cs
+++ b/src/Nexus.Core/ModPoolService.cs
@@ -2,7 +2,7 @@ using System.Net.Http;
using System.Text.Json;
using Serilog;
-namespace Automata.Core;
+namespace Nexus.Core;
public class ModPoolService
{
diff --git a/src/Automata.Core/Automata.Core.csproj b/src/Nexus.Core/Nexus.Core.csproj
similarity index 86%
rename from src/Automata.Core/Automata.Core.csproj
rename to src/Nexus.Core/Nexus.Core.csproj
index 5aff918..4aadc25 100644
--- a/src/Automata.Core/Automata.Core.csproj
+++ b/src/Nexus.Core/Nexus.Core.csproj
@@ -8,6 +8,6 @@
-
+
diff --git a/src/Roboto.Core/PlayerState.cs b/src/Nexus.Core/PlayerState.cs
similarity index 98%
rename from src/Roboto.Core/PlayerState.cs
rename to src/Nexus.Core/PlayerState.cs
index 1db0729..bcd5f66 100644
--- a/src/Roboto.Core/PlayerState.cs
+++ b/src/Nexus.Core/PlayerState.cs
@@ -1,6 +1,6 @@
using System.Numerics;
-namespace Roboto.Core;
+namespace Nexus.Core;
public record PlayerState
{
diff --git a/src/Automata.Core/Poe2ScoutClient.cs b/src/Nexus.Core/Poe2ScoutClient.cs
similarity index 98%
rename from src/Automata.Core/Poe2ScoutClient.cs
rename to src/Nexus.Core/Poe2ScoutClient.cs
index 51c07ff..8422d9d 100644
--- a/src/Automata.Core/Poe2ScoutClient.cs
+++ b/src/Nexus.Core/Poe2ScoutClient.cs
@@ -1,7 +1,7 @@
using System.Text.Json;
using Serilog;
-namespace Automata.Core;
+namespace Nexus.Core;
public static class Poe2ScoutClient
{
diff --git a/src/Roboto.Core/ProfileManager.cs b/src/Nexus.Core/ProfileManager.cs
similarity index 99%
rename from src/Roboto.Core/ProfileManager.cs
rename to src/Nexus.Core/ProfileManager.cs
index 3130296..868d2d5 100644
--- a/src/Roboto.Core/ProfileManager.cs
+++ b/src/Nexus.Core/ProfileManager.cs
@@ -1,7 +1,7 @@
using System.Text.Json;
using System.Text.Json.Serialization;
-namespace Roboto.Core;
+namespace Nexus.Core;
public class ProfileConfig
{
diff --git a/src/Roboto.Core/QuestInfo.cs b/src/Nexus.Core/QuestInfo.cs
similarity index 96%
rename from src/Roboto.Core/QuestInfo.cs
rename to src/Nexus.Core/QuestInfo.cs
index 1f75fc2..c62de53 100644
--- a/src/Roboto.Core/QuestInfo.cs
+++ b/src/Nexus.Core/QuestInfo.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public class QuestInfo
{
diff --git a/src/Roboto.Core/QuestProgress.cs b/src/Nexus.Core/QuestProgress.cs
similarity index 96%
rename from src/Roboto.Core/QuestProgress.cs
rename to src/Nexus.Core/QuestProgress.cs
index 56a76cc..3929f78 100644
--- a/src/Roboto.Core/QuestProgress.cs
+++ b/src/Nexus.Core/QuestProgress.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public record QuestProgress
{
diff --git a/src/Automata.Core/RePoETypes.cs b/src/Nexus.Core/RePoETypes.cs
similarity index 98%
rename from src/Automata.Core/RePoETypes.cs
rename to src/Nexus.Core/RePoETypes.cs
index d62f665..9034de7 100644
--- a/src/Automata.Core/RePoETypes.cs
+++ b/src/Nexus.Core/RePoETypes.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Automata.Core;
+namespace Nexus.Core;
public class RePoEMod
{
diff --git a/src/Roboto.Core/SkillProfile.cs b/src/Nexus.Core/SkillProfile.cs
similarity index 99%
rename from src/Roboto.Core/SkillProfile.cs
rename to src/Nexus.Core/SkillProfile.cs
index 0c6a890..481d0d3 100644
--- a/src/Roboto.Core/SkillProfile.cs
+++ b/src/Nexus.Core/SkillProfile.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public enum SkillInputType { KeyPress, LeftClick, RightClick, MiddleClick }
diff --git a/src/Roboto.Core/SkillState.cs b/src/Nexus.Core/SkillState.cs
similarity index 97%
rename from src/Roboto.Core/SkillState.cs
rename to src/Nexus.Core/SkillState.cs
index 6168749..2205d36 100644
--- a/src/Roboto.Core/SkillState.cs
+++ b/src/Nexus.Core/SkillState.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public record SkillState
{
diff --git a/src/Automata.Core/StashCalibration.cs b/src/Nexus.Core/StashCalibration.cs
similarity index 95%
rename from src/Automata.Core/StashCalibration.cs
rename to src/Nexus.Core/StashCalibration.cs
index 587b8b6..98f1cda 100644
--- a/src/Automata.Core/StashCalibration.cs
+++ b/src/Nexus.Core/StashCalibration.cs
@@ -1,4 +1,4 @@
-namespace Automata.Core;
+namespace Nexus.Core;
public class StashTabInfo
{
diff --git a/src/Roboto.Core/TargetSelection.cs b/src/Nexus.Core/TargetSelection.cs
similarity index 82%
rename from src/Roboto.Core/TargetSelection.cs
rename to src/Nexus.Core/TargetSelection.cs
index fbcc872..02d3309 100644
--- a/src/Roboto.Core/TargetSelection.cs
+++ b/src/Nexus.Core/TargetSelection.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public enum TargetSelection
{
diff --git a/src/Roboto.Core/TerrainQuery.cs b/src/Nexus.Core/TerrainQuery.cs
similarity index 99%
rename from src/Roboto.Core/TerrainQuery.cs
rename to src/Nexus.Core/TerrainQuery.cs
index df403b6..87ed1da 100644
--- a/src/Roboto.Core/TerrainQuery.cs
+++ b/src/Nexus.Core/TerrainQuery.cs
@@ -1,6 +1,6 @@
using System.Numerics;
-namespace Roboto.Core;
+namespace Nexus.Core;
///
/// Terrain line-of-sight and walkable direction queries on the walkability grid.
diff --git a/src/Roboto.Core/ThreatMap.cs b/src/Nexus.Core/ThreatMap.cs
similarity index 95%
rename from src/Roboto.Core/ThreatMap.cs
rename to src/Nexus.Core/ThreatMap.cs
index 79e0214..bfeac13 100644
--- a/src/Roboto.Core/ThreatMap.cs
+++ b/src/Nexus.Core/ThreatMap.cs
@@ -1,6 +1,6 @@
using System.Numerics;
-namespace Roboto.Core;
+namespace Nexus.Core;
public class ThreatMap
{
diff --git a/src/Automata.Core/Types.cs b/src/Nexus.Core/Types.cs
similarity index 99%
rename from src/Automata.Core/Types.cs
rename to src/Nexus.Core/Types.cs
index 69a4deb..972159c 100644
--- a/src/Automata.Core/Types.cs
+++ b/src/Nexus.Core/Types.cs
@@ -1,4 +1,4 @@
-namespace Automata.Core;
+namespace Nexus.Core;
public record Region(int X, int Y, int Width, int Height);
diff --git a/src/Roboto.Core/UiQuestInfo.cs b/src/Nexus.Core/UiQuestInfo.cs
similarity index 93%
rename from src/Roboto.Core/UiQuestInfo.cs
rename to src/Nexus.Core/UiQuestInfo.cs
index e120874..6c0aa1c 100644
--- a/src/Roboto.Core/UiQuestInfo.cs
+++ b/src/Nexus.Core/UiQuestInfo.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
///
/// Active quest info as displayed in the game UI.
diff --git a/src/Roboto.Core/WalkabilitySnapshot.cs b/src/Nexus.Core/WalkabilitySnapshot.cs
similarity index 93%
rename from src/Roboto.Core/WalkabilitySnapshot.cs
rename to src/Nexus.Core/WalkabilitySnapshot.cs
index bf4dfb0..cb1fecc 100644
--- a/src/Roboto.Core/WalkabilitySnapshot.cs
+++ b/src/Nexus.Core/WalkabilitySnapshot.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Core;
+namespace Nexus.Core;
public record WalkabilitySnapshot
{
diff --git a/src/Roboto.Core/WorldToScreen.cs b/src/Nexus.Core/WorldToScreen.cs
similarity index 97%
rename from src/Roboto.Core/WorldToScreen.cs
rename to src/Nexus.Core/WorldToScreen.cs
index 33f12d0..96e5a76 100644
--- a/src/Roboto.Core/WorldToScreen.cs
+++ b/src/Nexus.Core/WorldToScreen.cs
@@ -1,6 +1,6 @@
using System.Numerics;
-namespace Roboto.Core;
+namespace Nexus.Core;
public static class WorldToScreen
{
diff --git a/src/Roboto.Data/AreaGraph.cs b/src/Nexus.Data/AreaGraph.cs
similarity index 99%
rename from src/Roboto.Data/AreaGraph.cs
rename to src/Nexus.Data/AreaGraph.cs
index 4e5aaf4..c7d57f5 100644
--- a/src/Roboto.Data/AreaGraph.cs
+++ b/src/Nexus.Data/AreaGraph.cs
@@ -1,6 +1,6 @@
using System.Text.Json;
-namespace Roboto.Data;
+namespace Nexus.Data;
public record AreaNode(
string Id,
diff --git a/src/Roboto.Data/AreaNameLookup.cs b/src/Nexus.Data/AreaNameLookup.cs
similarity index 98%
rename from src/Roboto.Data/AreaNameLookup.cs
rename to src/Nexus.Data/AreaNameLookup.cs
index 7e7ca68..34bb3ae 100644
--- a/src/Roboto.Data/AreaNameLookup.cs
+++ b/src/Nexus.Data/AreaNameLookup.cs
@@ -1,6 +1,6 @@
using System.Text.Json;
-namespace Roboto.Data;
+namespace Nexus.Data;
///
/// Resolves area IDs (e.g. "G1_4") to display names (e.g. "The Grelwood")
diff --git a/src/Roboto.Data/EntityClassifier.cs b/src/Nexus.Data/EntityClassifier.cs
similarity index 98%
rename from src/Roboto.Data/EntityClassifier.cs
rename to src/Nexus.Data/EntityClassifier.cs
index c390fed..cebf3e5 100644
--- a/src/Roboto.Data/EntityClassifier.cs
+++ b/src/Nexus.Data/EntityClassifier.cs
@@ -1,6 +1,6 @@
-using Roboto.Core;
+using Nexus.Core;
-namespace Roboto.Data;
+namespace Nexus.Data;
///
/// Classifies entities from path + component data into EntityCategory.
diff --git a/src/Roboto.Data/EntityMapper.cs b/src/Nexus.Data/EntityMapper.cs
similarity index 96%
rename from src/Roboto.Data/EntityMapper.cs
rename to src/Nexus.Data/EntityMapper.cs
index d1edf12..6234a1e 100644
--- a/src/Roboto.Data/EntityMapper.cs
+++ b/src/Nexus.Data/EntityMapper.cs
@@ -1,8 +1,8 @@
using System.Numerics;
-using Roboto.Core;
-using MemEntity = Roboto.Memory.Entity;
+using Nexus.Core;
+using MemEntity = Nexus.Memory.Entity;
-namespace Roboto.Data;
+namespace Nexus.Data;
///
/// Maps raw Memory.Entity → Core.EntitySnapshot. Single source of truth for entity mapping.
diff --git a/src/Roboto.Data/GameDataCache.cs b/src/Nexus.Data/GameDataCache.cs
similarity index 98%
rename from src/Roboto.Data/GameDataCache.cs
rename to src/Nexus.Data/GameDataCache.cs
index 0ca85c0..5859878 100644
--- a/src/Roboto.Data/GameDataCache.cs
+++ b/src/Nexus.Data/GameDataCache.cs
@@ -1,8 +1,8 @@
using System.Numerics;
-using Roboto.Core;
-using Roboto.Memory;
+using Nexus.Core;
+using Nexus.Memory;
-namespace Roboto.Data;
+namespace Nexus.Data;
///
/// Immutable snapshot of player position for lock-free cross-thread reads.
diff --git a/src/Roboto.Data/GameStateEnricher.cs b/src/Nexus.Data/GameStateEnricher.cs
similarity index 98%
rename from src/Roboto.Data/GameStateEnricher.cs
rename to src/Nexus.Data/GameStateEnricher.cs
index 3112e60..1cb35fb 100644
--- a/src/Roboto.Data/GameStateEnricher.cs
+++ b/src/Nexus.Data/GameStateEnricher.cs
@@ -1,7 +1,7 @@
using System.Numerics;
-using Roboto.Core;
+using Nexus.Core;
-namespace Roboto.Data;
+namespace Nexus.Data;
///
/// Computes all derived fields on GameState once per tick.
diff --git a/src/Roboto.Data/MemoryPoller.cs b/src/Nexus.Data/MemoryPoller.cs
similarity index 99%
rename from src/Roboto.Data/MemoryPoller.cs
rename to src/Nexus.Data/MemoryPoller.cs
index ef46ffe..8fda25e 100644
--- a/src/Roboto.Data/MemoryPoller.cs
+++ b/src/Nexus.Data/MemoryPoller.cs
@@ -1,10 +1,10 @@
using System.Diagnostics;
using System.Numerics;
-using Roboto.Memory;
-using Roboto.Core;
+using Nexus.Memory;
+using Nexus.Core;
using Serilog;
-namespace Roboto.Data;
+namespace Nexus.Data;
///
/// Owns the memory read thread. Runs a two-tier loop:
@@ -28,7 +28,7 @@ public sealed class MemoryPoller : IDisposable
private nint _playerLifeAddr;
private nint _inGameStateAddr;
private nint _controllerAddr;
- private Roboto.Memory.GameOffsets? _offsets;
+ private Nexus.Memory.GameOffsets? _offsets;
private ProcessMemory? _mem;
private int _hotHz;
@@ -64,7 +64,7 @@ public sealed class MemoryPoller : IDisposable
_thread = new Thread(PollLoop)
{
- Name = "Roboto.MemoryPoller",
+ Name = "Nexus.MemoryPoller",
IsBackground = true,
};
_thread.Start();
diff --git a/src/Roboto.Data/Roboto.Data.csproj b/src/Nexus.Data/Nexus.Data.csproj
similarity index 70%
rename from src/Roboto.Data/Roboto.Data.csproj
rename to src/Nexus.Data/Nexus.Data.csproj
index 38208e6..0d85deb 100644
--- a/src/Roboto.Data/Roboto.Data.csproj
+++ b/src/Nexus.Data/Nexus.Data.csproj
@@ -8,7 +8,7 @@
-
-
+
+
diff --git a/src/Automata.Game/ClipboardHelper.cs b/src/Nexus.Game/ClipboardHelper.cs
similarity index 99%
rename from src/Automata.Game/ClipboardHelper.cs
rename to src/Nexus.Game/ClipboardHelper.cs
index c895916..dc2e3c4 100644
--- a/src/Automata.Game/ClipboardHelper.cs
+++ b/src/Nexus.Game/ClipboardHelper.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
using System.Text;
-namespace Automata.Game;
+namespace Nexus.Game;
///
/// Win32 clipboard access without WinForms dependency.
diff --git a/src/Automata.Game/GameController.cs b/src/Nexus.Game/GameController.cs
similarity index 98%
rename from src/Automata.Game/GameController.cs
rename to src/Nexus.Game/GameController.cs
index 5b82b3c..abbc59c 100644
--- a/src/Automata.Game/GameController.cs
+++ b/src/Nexus.Game/GameController.cs
@@ -1,7 +1,7 @@
-using Automata.Core;
+using Nexus.Core;
using Serilog;
-namespace Automata.Game;
+namespace Nexus.Game;
public class GameController : IGameController
{
diff --git a/src/Automata.Game/IGameController.cs b/src/Nexus.Game/IGameController.cs
similarity index 97%
rename from src/Automata.Game/IGameController.cs
rename to src/Nexus.Game/IGameController.cs
index 9359f16..5b3984d 100644
--- a/src/Automata.Game/IGameController.cs
+++ b/src/Nexus.Game/IGameController.cs
@@ -1,4 +1,4 @@
-namespace Automata.Game;
+namespace Nexus.Game;
public interface IGameController
{
diff --git a/src/Automata.Game/InputSender.cs b/src/Nexus.Game/InputSender.cs
similarity index 99%
rename from src/Automata.Game/InputSender.cs
rename to src/Nexus.Game/InputSender.cs
index 4942aeb..b2c6c22 100644
--- a/src/Automata.Game/InputSender.cs
+++ b/src/Nexus.Game/InputSender.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Automata.Core;
+using Nexus.Core;
-namespace Automata.Game;
+namespace Nexus.Game;
public class InputSender
{
diff --git a/src/Automata.Game/Automata.Game.csproj b/src/Nexus.Game/Nexus.Game.csproj
similarity index 80%
rename from src/Automata.Game/Automata.Game.csproj
rename to src/Nexus.Game/Nexus.Game.csproj
index fa49371..2a268b4 100644
--- a/src/Automata.Game/Automata.Game.csproj
+++ b/src/Nexus.Game/Nexus.Game.csproj
@@ -6,6 +6,6 @@
true
-
+
diff --git a/src/Automata.Game/WindowManager.cs b/src/Nexus.Game/WindowManager.cs
similarity index 99%
rename from src/Automata.Game/WindowManager.cs
rename to src/Nexus.Game/WindowManager.cs
index f593cfb..168252d 100644
--- a/src/Automata.Game/WindowManager.cs
+++ b/src/Nexus.Game/WindowManager.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
using Serilog;
-namespace Automata.Game;
+namespace Nexus.Game;
public class WindowManager
{
diff --git a/src/Roboto.GameOffsets/Components/Actor.cs b/src/Nexus.GameOffsets/Components/Actor.cs
similarity index 90%
rename from src/Roboto.GameOffsets/Components/Actor.cs
rename to src/Nexus.GameOffsets/Components/Actor.cs
index e95c6cb..a933bcd 100644
--- a/src/Roboto.GameOffsets/Components/Actor.cs
+++ b/src/Nexus.GameOffsets/Components/Actor.cs
@@ -1,4 +1,4 @@
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
///
/// Actor component offsets — confirmed from ExileCore2.
diff --git a/src/Roboto.GameOffsets/Components/ActorDeployedEntity.cs b/src/Nexus.GameOffsets/Components/ActorDeployedEntity.cs
similarity index 89%
rename from src/Roboto.GameOffsets/Components/ActorDeployedEntity.cs
rename to src/Nexus.GameOffsets/Components/ActorDeployedEntity.cs
index cfd3811..648cf78 100644
--- a/src/Roboto.GameOffsets/Components/ActorDeployedEntity.cs
+++ b/src/Nexus.GameOffsets/Components/ActorDeployedEntity.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// A deployed entity (totem, mine, etc.).
[StructLayout(LayoutKind.Sequential, Pack = 1)]
diff --git a/src/Roboto.GameOffsets/Components/ActorSkill.cs b/src/Nexus.GameOffsets/Components/ActorSkill.cs
similarity index 96%
rename from src/Roboto.GameOffsets/Components/ActorSkill.cs
rename to src/Nexus.GameOffsets/Components/ActorSkill.cs
index 5000be5..1c27db5 100644
--- a/src/Roboto.GameOffsets/Components/ActorSkill.cs
+++ b/src/Nexus.GameOffsets/Components/ActorSkill.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
///
/// An entry in the ActiveSkills vector: shared_ptr pair (0x10 bytes).
diff --git a/src/Roboto.GameOffsets/Components/ActorSkillCooldown.cs b/src/Nexus.GameOffsets/Components/ActorSkillCooldown.cs
similarity index 92%
rename from src/Roboto.GameOffsets/Components/ActorSkillCooldown.cs
rename to src/Nexus.GameOffsets/Components/ActorSkillCooldown.cs
index d0f242c..819224f 100644
--- a/src/Roboto.GameOffsets/Components/ActorSkillCooldown.cs
+++ b/src/Nexus.GameOffsets/Components/ActorSkillCooldown.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
///
/// Cooldown state for a skill. Entries in Actor+0xB18 vector.
diff --git a/src/Roboto.GameOffsets/Components/ActorVaalSkill.cs b/src/Nexus.GameOffsets/Components/ActorVaalSkill.cs
similarity index 91%
rename from src/Roboto.GameOffsets/Components/ActorVaalSkill.cs
rename to src/Nexus.GameOffsets/Components/ActorVaalSkill.cs
index 3cdd359..93c08fc 100644
--- a/src/Roboto.GameOffsets/Components/ActorVaalSkill.cs
+++ b/src/Nexus.GameOffsets/Components/ActorVaalSkill.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Vaal soul tracking.
[StructLayout(LayoutKind.Explicit, Pack = 1)]
diff --git a/src/Roboto.GameOffsets/Components/Animated.cs b/src/Nexus.GameOffsets/Components/Animated.cs
similarity index 90%
rename from src/Roboto.GameOffsets/Components/Animated.cs
rename to src/Nexus.GameOffsets/Components/Animated.cs
index 3766d1a..2425ff4 100644
--- a/src/Roboto.GameOffsets/Components/Animated.cs
+++ b/src/Nexus.GameOffsets/Components/Animated.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Animated component — reference to the animated entity.
[StructLayout(LayoutKind.Explicit, Size = 0x300)]
diff --git a/src/Roboto.GameOffsets/Components/Buffs.cs b/src/Nexus.GameOffsets/Components/Buffs.cs
similarity index 90%
rename from src/Roboto.GameOffsets/Components/Buffs.cs
rename to src/Nexus.GameOffsets/Components/Buffs.cs
index 761392d..db335f9 100644
--- a/src/Roboto.GameOffsets/Components/Buffs.cs
+++ b/src/Nexus.GameOffsets/Components/Buffs.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Buffs component — active status effects.
[StructLayout(LayoutKind.Explicit, Size = 0x178)]
diff --git a/src/Roboto.GameOffsets/Components/Charges.cs b/src/Nexus.GameOffsets/Components/Charges.cs
similarity index 93%
rename from src/Roboto.GameOffsets/Components/Charges.cs
rename to src/Nexus.GameOffsets/Components/Charges.cs
index c2231b2..4f84081 100644
--- a/src/Roboto.GameOffsets/Components/Charges.cs
+++ b/src/Nexus.GameOffsets/Components/Charges.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Charges component — flask/skill charges.
[StructLayout(LayoutKind.Explicit, Size = 0x20)]
diff --git a/src/Roboto.GameOffsets/Components/Chest.cs b/src/Nexus.GameOffsets/Components/Chest.cs
similarity index 94%
rename from src/Roboto.GameOffsets/Components/Chest.cs
rename to src/Nexus.GameOffsets/Components/Chest.cs
index b86d397..688fffa 100644
--- a/src/Roboto.GameOffsets/Components/Chest.cs
+++ b/src/Nexus.GameOffsets/Components/Chest.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Chest component.
[StructLayout(LayoutKind.Explicit, Size = 0x170)]
diff --git a/src/Roboto.GameOffsets/Components/ComponentHeader.cs b/src/Nexus.GameOffsets/Components/ComponentHeader.cs
similarity index 87%
rename from src/Roboto.GameOffsets/Components/ComponentHeader.cs
rename to src/Nexus.GameOffsets/Components/ComponentHeader.cs
index f0f6910..2db11b0 100644
--- a/src/Roboto.GameOffsets/Components/ComponentHeader.cs
+++ b/src/Nexus.GameOffsets/Components/ComponentHeader.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Common header at the start of every component.
[StructLayout(LayoutKind.Explicit, Size = 0x10)]
diff --git a/src/Roboto.GameOffsets/Components/Life.cs b/src/Nexus.GameOffsets/Components/Life.cs
similarity index 95%
rename from src/Roboto.GameOffsets/Components/Life.cs
rename to src/Nexus.GameOffsets/Components/Life.cs
index f85275b..2b4e4f1 100644
--- a/src/Roboto.GameOffsets/Components/Life.cs
+++ b/src/Nexus.GameOffsets/Components/Life.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Life component — contains Health, Mana, and ES vitals.
[StructLayout(LayoutKind.Explicit, Size = 0x268)]
diff --git a/src/Roboto.GameOffsets/Components/Mods.cs b/src/Nexus.GameOffsets/Components/Mods.cs
similarity index 91%
rename from src/Roboto.GameOffsets/Components/Mods.cs
rename to src/Nexus.GameOffsets/Components/Mods.cs
index 9184a09..20e901b 100644
--- a/src/Roboto.GameOffsets/Components/Mods.cs
+++ b/src/Nexus.GameOffsets/Components/Mods.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Mods component — ModsAndObjectMagicProperties inline at +0x00. Rarity at +0x94.
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x1A0)]
diff --git a/src/Roboto.GameOffsets/Components/Player.cs b/src/Nexus.GameOffsets/Components/Player.cs
similarity index 87%
rename from src/Roboto.GameOffsets/Components/Player.cs
rename to src/Nexus.GameOffsets/Components/Player.cs
index 7fa7af5..74c0e35 100644
--- a/src/Roboto.GameOffsets/Components/Player.cs
+++ b/src/Nexus.GameOffsets/Components/Player.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Player component — name, XP, level.
[StructLayout(LayoutKind.Explicit, Size = 0x208)]
diff --git a/src/Roboto.GameOffsets/Components/Positioned.cs b/src/Nexus.GameOffsets/Components/Positioned.cs
similarity index 90%
rename from src/Roboto.GameOffsets/Components/Positioned.cs
rename to src/Nexus.GameOffsets/Components/Positioned.cs
index be35bda..21da95a 100644
--- a/src/Roboto.GameOffsets/Components/Positioned.cs
+++ b/src/Nexus.GameOffsets/Components/Positioned.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Positioned component — reaction (friendly/hostile/neutral).
[StructLayout(LayoutKind.Explicit, Size = 0x1E8)]
diff --git a/src/Roboto.GameOffsets/Components/Render.cs b/src/Nexus.GameOffsets/Components/Render.cs
similarity index 93%
rename from src/Roboto.GameOffsets/Components/Render.cs
rename to src/Nexus.GameOffsets/Components/Render.cs
index 7301451..c7f868d 100644
--- a/src/Roboto.GameOffsets/Components/Render.cs
+++ b/src/Nexus.GameOffsets/Components/Render.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Render component — world position, bounds, terrain height.
[StructLayout(LayoutKind.Explicit, Size = 0x1B0)]
diff --git a/src/Roboto.GameOffsets/Components/Shrine.cs b/src/Nexus.GameOffsets/Components/Shrine.cs
similarity index 88%
rename from src/Roboto.GameOffsets/Components/Shrine.cs
rename to src/Nexus.GameOffsets/Components/Shrine.cs
index 680efe4..45968ab 100644
--- a/src/Roboto.GameOffsets/Components/Shrine.cs
+++ b/src/Nexus.GameOffsets/Components/Shrine.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Shrine component.
[StructLayout(LayoutKind.Explicit, Size = 0x28)]
diff --git a/src/Roboto.GameOffsets/Components/StateMachine.cs b/src/Nexus.GameOffsets/Components/StateMachine.cs
similarity index 86%
rename from src/Roboto.GameOffsets/Components/StateMachine.cs
rename to src/Nexus.GameOffsets/Components/StateMachine.cs
index d912bf7..2ce904b 100644
--- a/src/Roboto.GameOffsets/Components/StateMachine.cs
+++ b/src/Nexus.GameOffsets/Components/StateMachine.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// StateMachine component — entity state management.
[StructLayout(LayoutKind.Explicit, Size = 0x178)]
diff --git a/src/Roboto.GameOffsets/Components/Stats.cs b/src/Nexus.GameOffsets/Components/Stats.cs
similarity index 91%
rename from src/Roboto.GameOffsets/Components/Stats.cs
rename to src/Nexus.GameOffsets/Components/Stats.cs
index 5f74b43..c6b43db 100644
--- a/src/Roboto.GameOffsets/Components/Stats.cs
+++ b/src/Nexus.GameOffsets/Components/Stats.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Stats component — item stats, weapon index, shapeshift.
[StructLayout(LayoutKind.Explicit, Size = 0x180)]
diff --git a/src/Roboto.GameOffsets/Components/Targetable.cs b/src/Nexus.GameOffsets/Components/Targetable.cs
similarity index 94%
rename from src/Roboto.GameOffsets/Components/Targetable.cs
rename to src/Nexus.GameOffsets/Components/Targetable.cs
index bc74585..3dfdb4e 100644
--- a/src/Roboto.GameOffsets/Components/Targetable.cs
+++ b/src/Nexus.GameOffsets/Components/Targetable.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Targetable component — whether entity can be targeted/highlighted.
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x58)]
diff --git a/src/Roboto.GameOffsets/Components/Transitionable.cs b/src/Nexus.GameOffsets/Components/Transitionable.cs
similarity index 89%
rename from src/Roboto.GameOffsets/Components/Transitionable.cs
rename to src/Nexus.GameOffsets/Components/Transitionable.cs
index 25ec8d9..79f4f24 100644
--- a/src/Roboto.GameOffsets/Components/Transitionable.cs
+++ b/src/Nexus.GameOffsets/Components/Transitionable.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// Transitionable component — area transition state.
[StructLayout(LayoutKind.Explicit, Size = 0x128)]
diff --git a/src/Roboto.GameOffsets/Components/TriggerableBlockage.cs b/src/Nexus.GameOffsets/Components/TriggerableBlockage.cs
similarity index 90%
rename from src/Roboto.GameOffsets/Components/TriggerableBlockage.cs
rename to src/Nexus.GameOffsets/Components/TriggerableBlockage.cs
index 4268448..90d1b82 100644
--- a/src/Roboto.GameOffsets/Components/TriggerableBlockage.cs
+++ b/src/Nexus.GameOffsets/Components/TriggerableBlockage.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// TriggerableBlockage component — door/gate blocked state.
[StructLayout(LayoutKind.Explicit, Size = 0x38)]
diff --git a/src/Roboto.GameOffsets/Components/WorldItem.cs b/src/Nexus.GameOffsets/Components/WorldItem.cs
similarity index 91%
rename from src/Roboto.GameOffsets/Components/WorldItem.cs
rename to src/Nexus.GameOffsets/Components/WorldItem.cs
index ed39760..cf462e8 100644
--- a/src/Roboto.GameOffsets/Components/WorldItem.cs
+++ b/src/Nexus.GameOffsets/Components/WorldItem.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Components;
+namespace Nexus.GameOffsets.Components;
/// WorldItem component — contains pointer to inner item entity at +0x28 (TBD from diagnostic).
[StructLayout(LayoutKind.Explicit, Size = 0x30)]
diff --git a/src/Roboto.GameOffsets/Entities/Entity.cs b/src/Nexus.GameOffsets/Entities/Entity.cs
similarity index 96%
rename from src/Roboto.GameOffsets/Entities/Entity.cs
rename to src/Nexus.GameOffsets/Entities/Entity.cs
index c6b7a00..d2ebfa5 100644
--- a/src/Roboto.GameOffsets/Entities/Entity.cs
+++ b/src/Nexus.GameOffsets/Entities/Entity.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.Entities;
+namespace Nexus.GameOffsets.Entities;
/// Item struct — wraps an entity pointer for inventory items.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
diff --git a/src/Roboto.GameOffsets/Entities/EntityTreeNode.cs b/src/Nexus.GameOffsets/Entities/EntityTreeNode.cs
similarity index 97%
rename from src/Roboto.GameOffsets/Entities/EntityTreeNode.cs
rename to src/Nexus.GameOffsets/Entities/EntityTreeNode.cs
index 9b9e0cd..a37cd6e 100644
--- a/src/Roboto.GameOffsets/Entities/EntityTreeNode.cs
+++ b/src/Nexus.GameOffsets/Entities/EntityTreeNode.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Entities;
+namespace Nexus.GameOffsets.Entities;
/// MSVC std::map tree node for entity storage. Red-black tree node layout.
[StructLayout(LayoutKind.Explicit, Size = 0x30)]
diff --git a/src/Roboto.GameOffsets/Natives/StdBucket.cs b/src/Nexus.GameOffsets/Natives/StdBucket.cs
similarity index 87%
rename from src/Roboto.GameOffsets/Natives/StdBucket.cs
rename to src/Nexus.GameOffsets/Natives/StdBucket.cs
index 94f2b84..ee515de 100644
--- a/src/Roboto.GameOffsets/Natives/StdBucket.cs
+++ b/src/Nexus.GameOffsets/Natives/StdBucket.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Natives;
+namespace Nexus.GameOffsets.Natives;
/// Bucket structure used in hash containers.
[StructLayout(LayoutKind.Explicit, Size = 0x20)]
diff --git a/src/Roboto.GameOffsets/Natives/StdList.cs b/src/Nexus.GameOffsets/Natives/StdList.cs
similarity index 94%
rename from src/Roboto.GameOffsets/Natives/StdList.cs
rename to src/Nexus.GameOffsets/Natives/StdList.cs
index a1284c7..97dc432 100644
--- a/src/Roboto.GameOffsets/Natives/StdList.cs
+++ b/src/Nexus.GameOffsets/Natives/StdList.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Natives;
+namespace Nexus.GameOffsets.Natives;
/// MSVC std::list layout: head node pointer + size.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
diff --git a/src/Roboto.GameOffsets/Natives/StdMap.cs b/src/Nexus.GameOffsets/Natives/StdMap.cs
similarity index 96%
rename from src/Roboto.GameOffsets/Natives/StdMap.cs
rename to src/Nexus.GameOffsets/Natives/StdMap.cs
index 6195ad1..fac819a 100644
--- a/src/Roboto.GameOffsets/Natives/StdMap.cs
+++ b/src/Nexus.GameOffsets/Natives/StdMap.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Natives;
+namespace Nexus.GameOffsets.Natives;
/// MSVC std::map layout: head node pointer + size.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
diff --git a/src/Roboto.GameOffsets/Natives/StdTuple.cs b/src/Nexus.GameOffsets/Natives/StdTuple.cs
similarity index 92%
rename from src/Roboto.GameOffsets/Natives/StdTuple.cs
rename to src/Nexus.GameOffsets/Natives/StdTuple.cs
index 2258e00..6d55f8a 100644
--- a/src/Roboto.GameOffsets/Natives/StdTuple.cs
+++ b/src/Nexus.GameOffsets/Natives/StdTuple.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Natives;
+namespace Nexus.GameOffsets.Natives;
/// 2D tuple (e.g., terrain dimensions).
[StructLayout(LayoutKind.Sequential, Pack = 1)]
diff --git a/src/Roboto.GameOffsets/Natives/StdVector.cs b/src/Nexus.GameOffsets/Natives/StdVector.cs
similarity index 90%
rename from src/Roboto.GameOffsets/Natives/StdVector.cs
rename to src/Nexus.GameOffsets/Natives/StdVector.cs
index beeb591..3e3028f 100644
--- a/src/Roboto.GameOffsets/Natives/StdVector.cs
+++ b/src/Nexus.GameOffsets/Natives/StdVector.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Natives;
+namespace Nexus.GameOffsets.Natives;
/// MSVC std::vector layout: begin/end/capacity pointers.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
diff --git a/src/Roboto.GameOffsets/Natives/StdWString.cs b/src/Nexus.GameOffsets/Natives/StdWString.cs
similarity index 95%
rename from src/Roboto.GameOffsets/Natives/StdWString.cs
rename to src/Nexus.GameOffsets/Natives/StdWString.cs
index 0587dfb..cc38300 100644
--- a/src/Roboto.GameOffsets/Natives/StdWString.cs
+++ b/src/Nexus.GameOffsets/Natives/StdWString.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.Natives;
+namespace Nexus.GameOffsets.Natives;
/// MSVC std::wstring (basic_string<wchar_t>) with SSO.
[StructLayout(LayoutKind.Explicit, Size = 0x20)]
diff --git a/src/Roboto.GameOffsets/Natives/Util.cs b/src/Nexus.GameOffsets/Natives/Util.cs
similarity index 86%
rename from src/Roboto.GameOffsets/Natives/Util.cs
rename to src/Nexus.GameOffsets/Natives/Util.cs
index e4972ca..2cd77ef 100644
--- a/src/Roboto.GameOffsets/Natives/Util.cs
+++ b/src/Nexus.GameOffsets/Natives/Util.cs
@@ -1,4 +1,4 @@
-namespace Roboto.GameOffsets.Natives;
+namespace Nexus.GameOffsets.Natives;
public static class Util
{
diff --git a/src/Roboto.GameOffsets/Roboto.GameOffsets.csproj b/src/Nexus.GameOffsets/Nexus.GameOffsets.csproj
similarity index 100%
rename from src/Roboto.GameOffsets/Roboto.GameOffsets.csproj
rename to src/Nexus.GameOffsets/Nexus.GameOffsets.csproj
diff --git a/src/Roboto.GameOffsets/States/AreaInstance.cs b/src/Nexus.GameOffsets/States/AreaInstance.cs
similarity index 97%
rename from src/Roboto.GameOffsets/States/AreaInstance.cs
rename to src/Nexus.GameOffsets/States/AreaInstance.cs
index 6e02ac2..7c6afe4 100644
--- a/src/Roboto.GameOffsets/States/AreaInstance.cs
+++ b/src/Nexus.GameOffsets/States/AreaInstance.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.States;
+namespace Nexus.GameOffsets.States;
/// AreaInstance (IngameData) — current area data, entities, terrain.
[StructLayout(LayoutKind.Explicit, Size = 0xCD0)]
diff --git a/src/Roboto.GameOffsets/States/AreaLoading.cs b/src/Nexus.GameOffsets/States/AreaLoading.cs
similarity index 94%
rename from src/Roboto.GameOffsets/States/AreaLoading.cs
rename to src/Nexus.GameOffsets/States/AreaLoading.cs
index 6774c68..af34573 100644
--- a/src/Roboto.GameOffsets/States/AreaLoading.cs
+++ b/src/Nexus.GameOffsets/States/AreaLoading.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.States;
+namespace Nexus.GameOffsets.States;
/// AreaLoading state — loading screen info.
[StructLayout(LayoutKind.Explicit, Size = 0xE58)]
diff --git a/src/Roboto.GameOffsets/States/ImportantUiElements.cs b/src/Nexus.GameOffsets/States/ImportantUiElements.cs
similarity index 95%
rename from src/Roboto.GameOffsets/States/ImportantUiElements.cs
rename to src/Nexus.GameOffsets/States/ImportantUiElements.cs
index b636ed3..ff5e83e 100644
--- a/src/Roboto.GameOffsets/States/ImportantUiElements.cs
+++ b/src/Nexus.GameOffsets/States/ImportantUiElements.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.States;
+namespace Nexus.GameOffsets.States;
/// Important UI element pointers within InGameState.
[StructLayout(LayoutKind.Explicit, Size = 0x740)]
diff --git a/src/Roboto.GameOffsets/States/InGameState.cs b/src/Nexus.GameOffsets/States/InGameState.cs
similarity index 96%
rename from src/Roboto.GameOffsets/States/InGameState.cs
rename to src/Nexus.GameOffsets/States/InGameState.cs
index ff49244..f3a657f 100644
--- a/src/Roboto.GameOffsets/States/InGameState.cs
+++ b/src/Nexus.GameOffsets/States/InGameState.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.GameOffsets.States;
+namespace Nexus.GameOffsets.States;
/// InGameState — the main in-game state containing all sub-structures.
[StructLayout(LayoutKind.Explicit, Size = 0x310)]
diff --git a/src/Roboto.GameOffsets/States/Inventory.cs b/src/Nexus.GameOffsets/States/Inventory.cs
similarity index 95%
rename from src/Roboto.GameOffsets/States/Inventory.cs
rename to src/Nexus.GameOffsets/States/Inventory.cs
index 81d0acc..b0bb0a1 100644
--- a/src/Roboto.GameOffsets/States/Inventory.cs
+++ b/src/Nexus.GameOffsets/States/Inventory.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.States;
+namespace Nexus.GameOffsets.States;
/// Pre-inventory wrapper — contains the actual inventory pointer.
[StructLayout(LayoutKind.Explicit, Size = 0x10)]
diff --git a/src/Roboto.GameOffsets/States/ServerData.cs b/src/Nexus.GameOffsets/States/ServerData.cs
similarity index 91%
rename from src/Roboto.GameOffsets/States/ServerData.cs
rename to src/Nexus.GameOffsets/States/ServerData.cs
index de1e35c..705d811 100644
--- a/src/Roboto.GameOffsets/States/ServerData.cs
+++ b/src/Nexus.GameOffsets/States/ServerData.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Natives;
-namespace Roboto.GameOffsets.States;
+namespace Nexus.GameOffsets.States;
/// ServerData — player server-side data.
[StructLayout(LayoutKind.Explicit, Size = 0x58)]
diff --git a/src/Roboto.GameOffsets/States/WorldData.cs b/src/Nexus.GameOffsets/States/WorldData.cs
similarity index 97%
rename from src/Roboto.GameOffsets/States/WorldData.cs
rename to src/Nexus.GameOffsets/States/WorldData.cs
index badd798..80a131b 100644
--- a/src/Roboto.GameOffsets/States/WorldData.cs
+++ b/src/Nexus.GameOffsets/States/WorldData.cs
@@ -1,7 +1,7 @@
using System.Runtime.InteropServices;
using System.Numerics;
-namespace Roboto.GameOffsets.States;
+namespace Nexus.GameOffsets.States;
/// WorldData — world area details and camera.
[StructLayout(LayoutKind.Explicit, Size = 0xA8)]
diff --git a/src/Roboto.Input/Humanizer.cs b/src/Nexus.Input/Humanizer.cs
similarity index 98%
rename from src/Roboto.Input/Humanizer.cs
rename to src/Nexus.Input/Humanizer.cs
index 36a56ab..668b73d 100644
--- a/src/Roboto.Input/Humanizer.cs
+++ b/src/Nexus.Input/Humanizer.cs
@@ -1,6 +1,6 @@
-using Roboto.Core;
+using Nexus.Core;
-namespace Roboto.Input;
+namespace Nexus.Input;
public sealed class Humanizer
{
diff --git a/src/Roboto.Input/InterceptionInputController.cs b/src/Nexus.Input/InterceptionInputController.cs
similarity index 99%
rename from src/Roboto.Input/InterceptionInputController.cs
rename to src/Nexus.Input/InterceptionInputController.cs
index e4e1ff1..12dfcae 100644
--- a/src/Roboto.Input/InterceptionInputController.cs
+++ b/src/Nexus.Input/InterceptionInputController.cs
@@ -1,9 +1,9 @@
using System.Runtime.InteropServices;
using InputInterceptorNS;
-using Roboto.Core;
+using Nexus.Core;
using Serilog;
-namespace Roboto.Input;
+namespace Nexus.Input;
public sealed partial class InterceptionInputController : IInputController, IDisposable
{
diff --git a/src/Roboto.Input/Roboto.Input.csproj b/src/Nexus.Input/Nexus.Input.csproj
similarity index 89%
rename from src/Roboto.Input/Roboto.Input.csproj
rename to src/Nexus.Input/Nexus.Input.csproj
index d216727..a8e735e 100644
--- a/src/Roboto.Input/Roboto.Input.csproj
+++ b/src/Nexus.Input/Nexus.Input.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/src/Roboto.Input/ScanCodes.cs b/src/Nexus.Input/ScanCodes.cs
similarity index 98%
rename from src/Roboto.Input/ScanCodes.cs
rename to src/Nexus.Input/ScanCodes.cs
index d0432ba..959b878 100644
--- a/src/Roboto.Input/ScanCodes.cs
+++ b/src/Nexus.Input/ScanCodes.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Input;
+namespace Nexus.Input;
///
/// Hardware scan codes for keyboard input via Interception driver.
diff --git a/src/Roboto.Input/SendInputController.cs b/src/Nexus.Input/SendInputController.cs
similarity index 99%
rename from src/Roboto.Input/SendInputController.cs
rename to src/Nexus.Input/SendInputController.cs
index 242cb31..8e4ed9d 100644
--- a/src/Roboto.Input/SendInputController.cs
+++ b/src/Nexus.Input/SendInputController.cs
@@ -1,8 +1,8 @@
using System.Runtime.InteropServices;
-using Roboto.Core;
+using Nexus.Core;
using Serilog;
-namespace Roboto.Input;
+namespace Nexus.Input;
///
/// Fallback input controller using Win32 SendInput with KEYEVENTF_SCANCODE.
diff --git a/src/Roboto.Input/interception.dll b/src/Nexus.Input/interception.dll
similarity index 100%
rename from src/Roboto.Input/interception.dll
rename to src/Nexus.Input/interception.dll
diff --git a/src/Automata.Inventory/IInventoryManager.cs b/src/Nexus.Inventory/IInventoryManager.cs
similarity index 94%
rename from src/Automata.Inventory/IInventoryManager.cs
rename to src/Nexus.Inventory/IInventoryManager.cs
index ee1a93d..9817755 100644
--- a/src/Automata.Inventory/IInventoryManager.cs
+++ b/src/Nexus.Inventory/IInventoryManager.cs
@@ -1,7 +1,7 @@
-using Automata.Core;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Screen;
-namespace Automata.Inventory;
+namespace Nexus.Inventory;
public interface IInventoryManager
{
diff --git a/src/Automata.Inventory/InventoryManager.cs b/src/Nexus.Inventory/InventoryManager.cs
similarity index 99%
rename from src/Automata.Inventory/InventoryManager.cs
rename to src/Nexus.Inventory/InventoryManager.cs
index 1e31c55..c68dc31 100644
--- a/src/Automata.Inventory/InventoryManager.cs
+++ b/src/Nexus.Inventory/InventoryManager.cs
@@ -1,10 +1,10 @@
-using Automata.Core;
-using Automata.Game;
-using Automata.GameLog;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.GameLog;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Inventory;
+namespace Nexus.Inventory;
public class InventoryManager : IInventoryManager
{
diff --git a/src/Automata.Inventory/InventoryTracker.cs b/src/Nexus.Inventory/InventoryTracker.cs
similarity index 98%
rename from src/Automata.Inventory/InventoryTracker.cs
rename to src/Nexus.Inventory/InventoryTracker.cs
index ef33f4f..562fc63 100644
--- a/src/Automata.Inventory/InventoryTracker.cs
+++ b/src/Nexus.Inventory/InventoryTracker.cs
@@ -1,8 +1,8 @@
-using Automata.Core;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Inventory;
+namespace Nexus.Inventory;
public class PlacedItem
{
diff --git a/src/Nexus.Inventory/Nexus.Inventory.csproj b/src/Nexus.Inventory/Nexus.Inventory.csproj
new file mode 100644
index 0000000..6d2333c
--- /dev/null
+++ b/src/Nexus.Inventory/Nexus.Inventory.csproj
@@ -0,0 +1,13 @@
+
+
+ net8.0-windows10.0.19041.0
+ enable
+ enable
+
+
+
+
+
+
+
+
diff --git a/src/Automata.Inventory/StashCalibrator.cs b/src/Nexus.Inventory/StashCalibrator.cs
similarity index 98%
rename from src/Automata.Inventory/StashCalibrator.cs
rename to src/Nexus.Inventory/StashCalibrator.cs
index 657f9d6..8c2e576 100644
--- a/src/Automata.Inventory/StashCalibrator.cs
+++ b/src/Nexus.Inventory/StashCalibrator.cs
@@ -1,9 +1,9 @@
-using Automata.Core;
-using Automata.Game;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Inventory;
+namespace Nexus.Inventory;
public class StashCalibrator
{
diff --git a/src/Automata.Items/ItemReader.cs b/src/Nexus.Items/ItemReader.cs
similarity index 96%
rename from src/Automata.Items/ItemReader.cs
rename to src/Nexus.Items/ItemReader.cs
index 7475780..06b9c37 100644
--- a/src/Automata.Items/ItemReader.cs
+++ b/src/Nexus.Items/ItemReader.cs
@@ -1,10 +1,10 @@
-using Automata.Core;
-using Automata.Game;
+using Nexus.Core;
+using Nexus.Game;
using Sidekick.Apis.Poe.Items;
using Sidekick.Apis.Poe.Trade.Parser;
using Serilog;
-namespace Automata.Items;
+namespace Nexus.Items;
///
/// Reads item data by hovering and pressing Ctrl+C to copy item text to clipboard.
diff --git a/src/Automata.Items/Automata.Items.csproj b/src/Nexus.Items/Nexus.Items.csproj
similarity index 76%
rename from src/Automata.Items/Automata.Items.csproj
rename to src/Nexus.Items/Nexus.Items.csproj
index 014b17a..69f3196 100644
--- a/src/Automata.Items/Automata.Items.csproj
+++ b/src/Nexus.Items/Nexus.Items.csproj
@@ -5,8 +5,8 @@
enable
-
-
+
+
diff --git a/src/Automata.Items/SidekickBootstrapper.cs b/src/Nexus.Items/SidekickBootstrapper.cs
similarity index 98%
rename from src/Automata.Items/SidekickBootstrapper.cs
rename to src/Nexus.Items/SidekickBootstrapper.cs
index 8b3b215..7cf81a5 100644
--- a/src/Automata.Items/SidekickBootstrapper.cs
+++ b/src/Nexus.Items/SidekickBootstrapper.cs
@@ -9,7 +9,7 @@ using Sidekick.Common.Settings;
using Sidekick.Data;
using Serilog;
-namespace Automata.Items;
+namespace Nexus.Items;
///
/// Bootstraps a minimal Sidekick DI container for item parsing.
diff --git a/src/Automata.Items/SidekickSettingsStub.cs b/src/Nexus.Items/SidekickSettingsStub.cs
similarity index 98%
rename from src/Automata.Items/SidekickSettingsStub.cs
rename to src/Nexus.Items/SidekickSettingsStub.cs
index 4a8a54b..9dfa7fe 100644
--- a/src/Automata.Items/SidekickSettingsStub.cs
+++ b/src/Nexus.Items/SidekickSettingsStub.cs
@@ -1,6 +1,6 @@
using Sidekick.Common.Settings;
-namespace Automata.Items;
+namespace Nexus.Items;
///
/// Minimal ISettingsService returning defaults for Sidekick initialization.
diff --git a/src/Roboto.Memory/Diagnostics/MemoryDiagnostics.cs b/src/Nexus.Memory/Diagnostics/MemoryDiagnostics.cs
similarity index 99%
rename from src/Roboto.Memory/Diagnostics/MemoryDiagnostics.cs
rename to src/Nexus.Memory/Diagnostics/MemoryDiagnostics.cs
index 95c9df4..41e9204 100644
--- a/src/Roboto.Memory/Diagnostics/MemoryDiagnostics.cs
+++ b/src/Nexus.Memory/Diagnostics/MemoryDiagnostics.cs
@@ -3,10 +3,10 @@ using System.Drawing.Imaging;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Text;
-using Roboto.Memory.Objects;
+using Nexus.Memory.Objects;
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Diagnostic and scan methods extracted from GameMemoryReader.
@@ -7583,7 +7583,7 @@ public sealed class MemoryDiagnostics
var modsPtr = _ctx.Memory.ReadPointer(iFirst + modsIdx * 8);
if (modsPtr != 0)
{
- var mods = _ctx.Memory.Read(modsPtr);
+ var mods = _ctx.Memory.Read(modsPtr);
sb.AppendLine($" Mods.Rarity: {mods.Rarity}");
}
}
diff --git a/src/Roboto.Memory/Diagnostics/QuestNameLookup.cs b/src/Nexus.Memory/Diagnostics/QuestNameLookup.cs
similarity index 98%
rename from src/Roboto.Memory/Diagnostics/QuestNameLookup.cs
rename to src/Nexus.Memory/Diagnostics/QuestNameLookup.cs
index 3cda3e9..cae14b4 100644
--- a/src/Roboto.Memory/Diagnostics/QuestNameLookup.cs
+++ b/src/Nexus.Memory/Diagnostics/QuestNameLookup.cs
@@ -1,7 +1,7 @@
using System.Text.Json;
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Loads quest name mappings from a JSON file (generated by tools/dump_quest_names.py).
diff --git a/src/Roboto.Memory/Files/DatFile.cs b/src/Nexus.Memory/Files/DatFile.cs
similarity index 99%
rename from src/Roboto.Memory/Files/DatFile.cs
rename to src/Nexus.Memory/Files/DatFile.cs
index a3fde7c..e220a22 100644
--- a/src/Roboto.Memory/Files/DatFile.cs
+++ b/src/Nexus.Memory/Files/DatFile.cs
@@ -1,6 +1,6 @@
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Generic wrapper for a single .dat table. Bulk-reads all rows in one RPM call,
diff --git a/src/Roboto.Memory/Files/FileRootScanner.cs b/src/Nexus.Memory/Files/FileRootScanner.cs
similarity index 99%
rename from src/Roboto.Memory/Files/FileRootScanner.cs
rename to src/Nexus.Memory/Files/FileRootScanner.cs
index 7287154..12beda1 100644
--- a/src/Roboto.Memory/Files/FileRootScanner.cs
+++ b/src/Nexus.Memory/Files/FileRootScanner.cs
@@ -1,7 +1,7 @@
using System.Text;
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Info about a discovered .dat file in memory: first record address, row size, and row count.
diff --git a/src/Roboto.Memory/Files/FilesContainer.cs b/src/Nexus.Memory/Files/FilesContainer.cs
similarity index 99%
rename from src/Roboto.Memory/Files/FilesContainer.cs
rename to src/Nexus.Memory/Files/FilesContainer.cs
index f94957c..07c37c9 100644
--- a/src/Roboto.Memory/Files/FilesContainer.cs
+++ b/src/Nexus.Memory/Files/FilesContainer.cs
@@ -1,6 +1,6 @@
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Facade for all in-memory .dat file access. Owns the
diff --git a/src/Roboto.Memory/Files/IDatRowParser.cs b/src/Nexus.Memory/Files/IDatRowParser.cs
similarity index 97%
rename from src/Roboto.Memory/Files/IDatRowParser.cs
rename to src/Nexus.Memory/Files/IDatRowParser.cs
index e72cbea..be9a8fb 100644
--- a/src/Roboto.Memory/Files/IDatRowParser.cs
+++ b/src/Nexus.Memory/Files/IDatRowParser.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Stateless parser for a single .dat row schema. One implementation per .dat file type.
diff --git a/src/Roboto.Memory/Files/MapPinRow.cs b/src/Nexus.Memory/Files/MapPinRow.cs
similarity index 98%
rename from src/Roboto.Memory/Files/MapPinRow.cs
rename to src/Nexus.Memory/Files/MapPinRow.cs
index 995c7a2..92e44e3 100644
--- a/src/Roboto.Memory/Files/MapPinRow.cs
+++ b/src/Nexus.Memory/Files/MapPinRow.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Parsed row from MapPins.dat.
diff --git a/src/Roboto.Memory/Files/QuestRow.cs b/src/Nexus.Memory/Files/QuestRow.cs
similarity index 98%
rename from src/Roboto.Memory/Files/QuestRow.cs
rename to src/Nexus.Memory/Files/QuestRow.cs
index 321e9b4..7d907f2 100644
--- a/src/Roboto.Memory/Files/QuestRow.cs
+++ b/src/Nexus.Memory/Files/QuestRow.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Parsed row from Quest.dat. Fields mirror the in-memory Quest object layout.
diff --git a/src/Roboto.Memory/Files/QuestStateRow.cs b/src/Nexus.Memory/Files/QuestStateRow.cs
similarity index 99%
rename from src/Roboto.Memory/Files/QuestStateRow.cs
rename to src/Nexus.Memory/Files/QuestStateRow.cs
index 555b725..991d816 100644
--- a/src/Roboto.Memory/Files/QuestStateRow.cs
+++ b/src/Nexus.Memory/Files/QuestStateRow.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Parsed row from QuestStates.dat (208 bytes per row).
diff --git a/src/Roboto.Memory/Files/WorldAreaRow.cs b/src/Nexus.Memory/Files/WorldAreaRow.cs
similarity index 99%
rename from src/Roboto.Memory/Files/WorldAreaRow.cs
rename to src/Nexus.Memory/Files/WorldAreaRow.cs
index ef95113..cb47a02 100644
--- a/src/Roboto.Memory/Files/WorldAreaRow.cs
+++ b/src/Nexus.Memory/Files/WorldAreaRow.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Parsed row from WorldAreas.dat (same layout as AreaTemplate offsets).
diff --git a/src/Roboto.Memory/GameMemoryReader.cs b/src/Nexus.Memory/GameMemoryReader.cs
similarity index 99%
rename from src/Roboto.Memory/GameMemoryReader.cs
rename to src/Nexus.Memory/GameMemoryReader.cs
index acf3743..9fb6667 100644
--- a/src/Roboto.Memory/GameMemoryReader.cs
+++ b/src/Nexus.Memory/GameMemoryReader.cs
@@ -1,8 +1,8 @@
using System.Numerics;
-using Roboto.Memory.Objects;
+using Nexus.Memory.Objects;
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
public class GameMemoryReader : IDisposable
{
diff --git a/src/Roboto.Memory/GameOffsets.cs b/src/Nexus.Memory/GameOffsets.cs
similarity index 99%
rename from src/Roboto.Memory/GameOffsets.cs
rename to src/Nexus.Memory/GameOffsets.cs
index 283783d..ac0828c 100644
--- a/src/Roboto.Memory/GameOffsets.cs
+++ b/src/Nexus.Memory/GameOffsets.cs
@@ -3,7 +3,7 @@ using System.Text.Json;
using System.Text.Json.Serialization;
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Reads/writes int as hex strings ("0x1A8") or plain numbers (424).
diff --git a/src/Roboto.Memory/GameStateReader.cs b/src/Nexus.Memory/GameStateReader.cs
similarity index 99%
rename from src/Roboto.Memory/GameStateReader.cs
rename to src/Nexus.Memory/GameStateReader.cs
index 71ab564..a2d536a 100644
--- a/src/Roboto.Memory/GameStateReader.cs
+++ b/src/Nexus.Memory/GameStateReader.cs
@@ -1,6 +1,6 @@
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Resolves GameState → Controller → InGameState, reads state slots, loading/escape state.
diff --git a/src/Roboto.Memory/Infrastructure/ComponentReader.cs b/src/Nexus.Memory/Infrastructure/ComponentReader.cs
similarity index 99%
rename from src/Roboto.Memory/Infrastructure/ComponentReader.cs
rename to src/Nexus.Memory/Infrastructure/ComponentReader.cs
index 2da856d..eea5517 100644
--- a/src/Roboto.Memory/Infrastructure/ComponentReader.cs
+++ b/src/Nexus.Memory/Infrastructure/ComponentReader.cs
@@ -1,9 +1,9 @@
using System.Text;
-using Roboto.GameOffsets.Components;
-using Roboto.GameOffsets.Natives;
+using Nexus.GameOffsets.Components;
+using Nexus.GameOffsets.Natives;
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Reads entity components via ECS: component list discovery, vitals, position, component lookup.
diff --git a/src/Roboto.Memory/Infrastructure/MemoryContext.cs b/src/Nexus.Memory/Infrastructure/MemoryContext.cs
similarity index 98%
rename from src/Roboto.Memory/Infrastructure/MemoryContext.cs
rename to src/Nexus.Memory/Infrastructure/MemoryContext.cs
index dc42940..9baee9e 100644
--- a/src/Roboto.Memory/Infrastructure/MemoryContext.cs
+++ b/src/Nexus.Memory/Infrastructure/MemoryContext.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Shared state for all memory reader classes. Holds the process handle, offsets, registry,
diff --git a/src/Roboto.Memory/Infrastructure/MemoryProfiler.cs b/src/Nexus.Memory/Infrastructure/MemoryProfiler.cs
similarity index 98%
rename from src/Roboto.Memory/Infrastructure/MemoryProfiler.cs
rename to src/Nexus.Memory/Infrastructure/MemoryProfiler.cs
index e7d5626..390a8e8 100644
--- a/src/Roboto.Memory/Infrastructure/MemoryProfiler.cs
+++ b/src/Nexus.Memory/Infrastructure/MemoryProfiler.cs
@@ -1,6 +1,6 @@
using System.Collections.Concurrent;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Thread-static section profiler for memory reads. When enabled, attributes each
diff --git a/src/Roboto.Memory/Infrastructure/MsvcStringReader.cs b/src/Nexus.Memory/Infrastructure/MsvcStringReader.cs
similarity index 99%
rename from src/Roboto.Memory/Infrastructure/MsvcStringReader.cs
rename to src/Nexus.Memory/Infrastructure/MsvcStringReader.cs
index c1b0014..110dcf0 100644
--- a/src/Roboto.Memory/Infrastructure/MsvcStringReader.cs
+++ b/src/Nexus.Memory/Infrastructure/MsvcStringReader.cs
@@ -1,6 +1,6 @@
using System.Text;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Reads MSVC std::string and std::wstring from process memory.
diff --git a/src/Roboto.Memory/Infrastructure/Native.cs b/src/Nexus.Memory/Infrastructure/Native.cs
similarity index 98%
rename from src/Roboto.Memory/Infrastructure/Native.cs
rename to src/Nexus.Memory/Infrastructure/Native.cs
index 1294226..105c02e 100644
--- a/src/Roboto.Memory/Infrastructure/Native.cs
+++ b/src/Nexus.Memory/Infrastructure/Native.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
internal static partial class Native
{
diff --git a/src/Roboto.Memory/Infrastructure/ObjectRegistry.cs b/src/Nexus.Memory/Infrastructure/ObjectRegistry.cs
similarity index 99%
rename from src/Roboto.Memory/Infrastructure/ObjectRegistry.cs
rename to src/Nexus.Memory/Infrastructure/ObjectRegistry.cs
index 020ed1c..92f8cb5 100644
--- a/src/Roboto.Memory/Infrastructure/ObjectRegistry.cs
+++ b/src/Nexus.Memory/Infrastructure/ObjectRegistry.cs
@@ -1,7 +1,7 @@
using System.Text.Json;
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Persistent registry of discovered strings, organized by category.
diff --git a/src/Roboto.Memory/Infrastructure/PatternScanner.cs b/src/Nexus.Memory/Infrastructure/PatternScanner.cs
similarity index 99%
rename from src/Roboto.Memory/Infrastructure/PatternScanner.cs
rename to src/Nexus.Memory/Infrastructure/PatternScanner.cs
index 379d880..ce3e9c7 100644
--- a/src/Roboto.Memory/Infrastructure/PatternScanner.cs
+++ b/src/Nexus.Memory/Infrastructure/PatternScanner.cs
@@ -1,6 +1,6 @@
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
public sealed class PatternScanner
{
diff --git a/src/Roboto.Memory/Infrastructure/ProcessMemory.cs b/src/Nexus.Memory/Infrastructure/ProcessMemory.cs
similarity index 99%
rename from src/Roboto.Memory/Infrastructure/ProcessMemory.cs
rename to src/Nexus.Memory/Infrastructure/ProcessMemory.cs
index 1f1d1e4..72a9435 100644
--- a/src/Roboto.Memory/Infrastructure/ProcessMemory.cs
+++ b/src/Nexus.Memory/Infrastructure/ProcessMemory.cs
@@ -2,7 +2,7 @@ using System.Diagnostics;
using System.Runtime.CompilerServices;
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
public sealed class ProcessMemory : IDisposable
{
diff --git a/src/Roboto.Memory/Infrastructure/RttiResolver.cs b/src/Nexus.Memory/Infrastructure/RttiResolver.cs
similarity index 98%
rename from src/Roboto.Memory/Infrastructure/RttiResolver.cs
rename to src/Nexus.Memory/Infrastructure/RttiResolver.cs
index 0337b4f..a1b02fc 100644
--- a/src/Roboto.Memory/Infrastructure/RttiResolver.cs
+++ b/src/Nexus.Memory/Infrastructure/RttiResolver.cs
@@ -1,6 +1,6 @@
using System.Text;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Resolves MSVC x64 RTTI type names from vtable addresses and classifies pointers.
diff --git a/src/Roboto.Memory/Roboto.Memory.csproj b/src/Nexus.Memory/Nexus.Memory.csproj
similarity index 84%
rename from src/Roboto.Memory/Roboto.Memory.csproj
rename to src/Nexus.Memory/Nexus.Memory.csproj
index ebdf0c2..d43d983 100644
--- a/src/Roboto.Memory/Roboto.Memory.csproj
+++ b/src/Nexus.Memory/Nexus.Memory.csproj
@@ -10,6 +10,6 @@
-
+
diff --git a/src/Roboto.Memory/Objects/AreaInstance.cs b/src/Nexus.Memory/Objects/AreaInstance.cs
similarity index 99%
rename from src/Roboto.Memory/Objects/AreaInstance.cs
rename to src/Nexus.Memory/Objects/AreaInstance.cs
index 644e605..0c7fb53 100644
--- a/src/Roboto.Memory/Objects/AreaInstance.cs
+++ b/src/Nexus.Memory/Objects/AreaInstance.cs
@@ -1,6 +1,6 @@
-using Roboto.Memory;
+using Nexus.Memory;
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Reads fields from the AreaInstance (IngameData) address.
diff --git a/src/Roboto.Memory/Objects/AreaLoading.cs b/src/Nexus.Memory/Objects/AreaLoading.cs
similarity index 94%
rename from src/Roboto.Memory/Objects/AreaLoading.cs
rename to src/Nexus.Memory/Objects/AreaLoading.cs
index 37f93b2..de10f14 100644
--- a/src/Roboto.Memory/Objects/AreaLoading.cs
+++ b/src/Nexus.Memory/Objects/AreaLoading.cs
@@ -1,6 +1,6 @@
-using Roboto.Memory;
+using Nexus.Memory;
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Reads AreaLoading state (slot 0). Individual field reads — the full struct is 3672B, wasteful to bulk-read.
diff --git a/src/Roboto.Memory/Objects/AreaTemplate.cs b/src/Nexus.Memory/Objects/AreaTemplate.cs
similarity index 98%
rename from src/Roboto.Memory/Objects/AreaTemplate.cs
rename to src/Nexus.Memory/Objects/AreaTemplate.cs
index 2ee258d..7337936 100644
--- a/src/Roboto.Memory/Objects/AreaTemplate.cs
+++ b/src/Nexus.Memory/Objects/AreaTemplate.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Reads AreaTemplate fields from WorldData → WorldAreaDetailsPtr.
diff --git a/src/Roboto.Memory/Objects/EntityList.cs b/src/Nexus.Memory/Objects/EntityList.cs
similarity index 99%
rename from src/Roboto.Memory/Objects/EntityList.cs
rename to src/Nexus.Memory/Objects/EntityList.cs
index c7dc3f4..bfd8f98 100644
--- a/src/Roboto.Memory/Objects/EntityList.cs
+++ b/src/Nexus.Memory/Objects/EntityList.cs
@@ -1,8 +1,8 @@
-using Roboto.Memory;
-using Roboto.GameOffsets.Components;
-using Roboto.GameOffsets.Entities;
+using Nexus.Memory;
+using Nexus.GameOffsets.Components;
+using Nexus.GameOffsets.Entities;
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Reads entity list from AreaInstance's std::map red-black tree.
diff --git a/src/Roboto.Memory/Objects/GameStateType.cs b/src/Nexus.Memory/Objects/GameStateType.cs
similarity index 95%
rename from src/Roboto.Memory/Objects/GameStateType.cs
rename to src/Nexus.Memory/Objects/GameStateType.cs
index 421b04f..254083c 100644
--- a/src/Roboto.Memory/Objects/GameStateType.cs
+++ b/src/Nexus.Memory/Objects/GameStateType.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Game state types by slot index. Order must match the state array in the controller.
diff --git a/src/Roboto.Memory/Objects/GameStates.cs b/src/Nexus.Memory/Objects/GameStates.cs
similarity index 99%
rename from src/Roboto.Memory/Objects/GameStates.cs
rename to src/Nexus.Memory/Objects/GameStates.cs
index 1c35d2c..1089229 100644
--- a/src/Roboto.Memory/Objects/GameStates.cs
+++ b/src/Nexus.Memory/Objects/GameStates.cs
@@ -1,6 +1,6 @@
-using Roboto.Memory;
+using Nexus.Memory;
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Root state orchestrator. Reads controller from GameStateBase, resolves state slot pointers,
diff --git a/src/Roboto.Memory/Objects/InGameState.cs b/src/Nexus.Memory/Objects/InGameState.cs
similarity index 95%
rename from src/Roboto.Memory/Objects/InGameState.cs
rename to src/Nexus.Memory/Objects/InGameState.cs
index 87e678c..080b1b3 100644
--- a/src/Roboto.Memory/Objects/InGameState.cs
+++ b/src/Nexus.Memory/Objects/InGameState.cs
@@ -1,7 +1,7 @@
-using Roboto.Memory;
-using IgsStruct = Roboto.GameOffsets.States.InGameState;
+using Nexus.Memory;
+using IgsStruct = Nexus.GameOffsets.States.InGameState;
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Reads InGameState struct (784B, 1 RPM instead of 4 individual reads).
diff --git a/src/Roboto.Memory/Objects/PlayerSkills.cs b/src/Nexus.Memory/Objects/PlayerSkills.cs
similarity index 98%
rename from src/Roboto.Memory/Objects/PlayerSkills.cs
rename to src/Nexus.Memory/Objects/PlayerSkills.cs
index ba1dff8..68e11aa 100644
--- a/src/Roboto.Memory/Objects/PlayerSkills.cs
+++ b/src/Nexus.Memory/Objects/PlayerSkills.cs
@@ -1,7 +1,7 @@
-using Roboto.Memory;
-using Roboto.GameOffsets.Components;
+using Nexus.Memory;
+using Nexus.GameOffsets.Components;
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Reads active skills from the local player's Actor component.
diff --git a/src/Roboto.Memory/Objects/QuestFlags.cs b/src/Nexus.Memory/Objects/QuestFlags.cs
similarity index 99%
rename from src/Roboto.Memory/Objects/QuestFlags.cs
rename to src/Nexus.Memory/Objects/QuestFlags.cs
index 969ee14..dc15645 100644
--- a/src/Roboto.Memory/Objects/QuestFlags.cs
+++ b/src/Nexus.Memory/Objects/QuestFlags.cs
@@ -1,7 +1,7 @@
-using Roboto.Memory;
+using Nexus.Memory;
using Serilog;
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Reads quest flags from ServerData → PlayerServerData → QuestFlags.
diff --git a/src/Roboto.Memory/Objects/Terrain.cs b/src/Nexus.Memory/Objects/Terrain.cs
similarity index 98%
rename from src/Roboto.Memory/Objects/Terrain.cs
rename to src/Nexus.Memory/Objects/Terrain.cs
index c9fe865..8c18033 100644
--- a/src/Roboto.Memory/Objects/Terrain.cs
+++ b/src/Nexus.Memory/Objects/Terrain.cs
@@ -1,8 +1,8 @@
-using Roboto.Memory;
+using Nexus.Memory;
using Serilog;
-using TerrainStruct = Roboto.GameOffsets.States.Terrain;
+using TerrainStruct = Nexus.GameOffsets.States.Terrain;
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Reads terrain walkability grid from AreaInstance.
diff --git a/src/Roboto.Memory/Objects/UIElements.cs b/src/Nexus.Memory/Objects/UIElements.cs
similarity index 99%
rename from src/Roboto.Memory/Objects/UIElements.cs
rename to src/Nexus.Memory/Objects/UIElements.cs
index 1bcf01b..d0672a7 100644
--- a/src/Roboto.Memory/Objects/UIElements.cs
+++ b/src/Nexus.Memory/Objects/UIElements.cs
@@ -1,6 +1,6 @@
using System.Text;
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Reads the UIElement tree from InGameState → UiRootStruct → GameUi.
diff --git a/src/Roboto.Memory/Objects/WorldData.cs b/src/Nexus.Memory/Objects/WorldData.cs
similarity index 94%
rename from src/Roboto.Memory/Objects/WorldData.cs
rename to src/Nexus.Memory/Objects/WorldData.cs
index 3f4ad12..e04ca65 100644
--- a/src/Roboto.Memory/Objects/WorldData.cs
+++ b/src/Nexus.Memory/Objects/WorldData.cs
@@ -1,8 +1,8 @@
using System.Numerics;
-using Roboto.Memory;
-using WdStruct = Roboto.GameOffsets.States.WorldData;
+using Nexus.Memory;
+using WdStruct = Nexus.GameOffsets.States.WorldData;
-namespace Roboto.Memory.Objects;
+namespace Nexus.Memory.Objects;
///
/// Reads WorldData struct (168B, 1 RPM) and resolves the camera matrix.
diff --git a/src/Roboto.Memory/QuestStateLookup.cs b/src/Nexus.Memory/QuestStateLookup.cs
similarity index 99%
rename from src/Roboto.Memory/QuestStateLookup.cs
rename to src/Nexus.Memory/QuestStateLookup.cs
index aa67409..3b8beed 100644
--- a/src/Roboto.Memory/QuestStateLookup.cs
+++ b/src/Nexus.Memory/QuestStateLookup.cs
@@ -1,6 +1,6 @@
using Serilog;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Builds a (questDatRowPtr, stateId) → text lookup from QuestStates.dat.
diff --git a/src/Roboto.Memory/RemoteObject.cs b/src/Nexus.Memory/RemoteObject.cs
similarity index 97%
rename from src/Roboto.Memory/RemoteObject.cs
rename to src/Nexus.Memory/RemoteObject.cs
index 6afc901..cdffe06 100644
--- a/src/Roboto.Memory/RemoteObject.cs
+++ b/src/Nexus.Memory/RemoteObject.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Base class for state objects that read a section of game memory.
diff --git a/src/Roboto.Memory/Snapshots/ConnectedAreaInfo.cs b/src/Nexus.Memory/Snapshots/ConnectedAreaInfo.cs
similarity index 94%
rename from src/Roboto.Memory/Snapshots/ConnectedAreaInfo.cs
rename to src/Nexus.Memory/Snapshots/ConnectedAreaInfo.cs
index 02edeb3..7e752ea 100644
--- a/src/Roboto.Memory/Snapshots/ConnectedAreaInfo.cs
+++ b/src/Nexus.Memory/Snapshots/ConnectedAreaInfo.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Lightweight connected area info from WorldAreas.dat for the snapshot.
diff --git a/src/Roboto.Memory/Snapshots/Entity.cs b/src/Nexus.Memory/Snapshots/Entity.cs
similarity index 99%
rename from src/Roboto.Memory/Snapshots/Entity.cs
rename to src/Nexus.Memory/Snapshots/Entity.cs
index 782acd6..a77a27a 100644
--- a/src/Roboto.Memory/Snapshots/Entity.cs
+++ b/src/Nexus.Memory/Snapshots/Entity.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
public enum EntityType
{
diff --git a/src/Roboto.Memory/Snapshots/GameStateSnapshot.cs b/src/Nexus.Memory/Snapshots/GameStateSnapshot.cs
similarity index 98%
rename from src/Roboto.Memory/Snapshots/GameStateSnapshot.cs
rename to src/Nexus.Memory/Snapshots/GameStateSnapshot.cs
index 2a5396c..5622202 100644
--- a/src/Roboto.Memory/Snapshots/GameStateSnapshot.cs
+++ b/src/Nexus.Memory/Snapshots/GameStateSnapshot.cs
@@ -1,7 +1,7 @@
using System.Numerics;
-using Roboto.Memory.Objects;
+using Nexus.Memory.Objects;
-namespace Roboto.Memory;
+namespace Nexus.Memory;
public class GameStateSnapshot
{
diff --git a/src/Roboto.Memory/Snapshots/QuestLinkedEntry.cs b/src/Nexus.Memory/Snapshots/QuestLinkedEntry.cs
similarity index 98%
rename from src/Roboto.Memory/Snapshots/QuestLinkedEntry.cs
rename to src/Nexus.Memory/Snapshots/QuestLinkedEntry.cs
index 7c6d285..7574e2d 100644
--- a/src/Roboto.Memory/Snapshots/QuestLinkedEntry.cs
+++ b/src/Nexus.Memory/Snapshots/QuestLinkedEntry.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// A quest entry from the GameUi linked lists.
diff --git a/src/Roboto.Memory/Snapshots/QuestSnapshot.cs b/src/Nexus.Memory/Snapshots/QuestSnapshot.cs
similarity index 88%
rename from src/Roboto.Memory/Snapshots/QuestSnapshot.cs
rename to src/Nexus.Memory/Snapshots/QuestSnapshot.cs
index 3d902f2..20de386 100644
--- a/src/Roboto.Memory/Snapshots/QuestSnapshot.cs
+++ b/src/Nexus.Memory/Snapshots/QuestSnapshot.cs
@@ -1,8 +1,8 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Lightweight quest data from ServerData quest flags.
-/// Stored in GameStateSnapshot; mapped to Roboto.Core.QuestProgress in the Data layer.
+/// Stored in GameStateSnapshot; mapped to Nexus.Core.QuestProgress in the Data layer.
///
public sealed class QuestSnapshot
{
diff --git a/src/Roboto.Memory/Snapshots/QuestStateEntry.cs b/src/Nexus.Memory/Snapshots/QuestStateEntry.cs
similarity index 93%
rename from src/Roboto.Memory/Snapshots/QuestStateEntry.cs
rename to src/Nexus.Memory/Snapshots/QuestStateEntry.cs
index 8675b0b..1caf5a1 100644
--- a/src/Roboto.Memory/Snapshots/QuestStateEntry.cs
+++ b/src/Nexus.Memory/Snapshots/QuestStateEntry.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// A quest state entry from the AreaInstance quest state container.
diff --git a/src/Roboto.Memory/Snapshots/SkillSnapshot.cs b/src/Nexus.Memory/Snapshots/SkillSnapshot.cs
similarity index 92%
rename from src/Roboto.Memory/Snapshots/SkillSnapshot.cs
rename to src/Nexus.Memory/Snapshots/SkillSnapshot.cs
index 851e54d..cee55a1 100644
--- a/src/Roboto.Memory/Snapshots/SkillSnapshot.cs
+++ b/src/Nexus.Memory/Snapshots/SkillSnapshot.cs
@@ -1,8 +1,8 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Lightweight skill data from the Actor component's ActiveSkills vector.
-/// Stored in GameStateSnapshot; mapped to Roboto.Core.SkillState in the Data layer.
+/// Stored in GameStateSnapshot; mapped to Nexus.Core.SkillState in the Data layer.
///
public sealed class SkillSnapshot
{
diff --git a/src/Roboto.Memory/Snapshots/UIElementNode.cs b/src/Nexus.Memory/Snapshots/UIElementNode.cs
similarity index 95%
rename from src/Roboto.Memory/Snapshots/UIElementNode.cs
rename to src/Nexus.Memory/Snapshots/UIElementNode.cs
index f7325a4..0b93c1f 100644
--- a/src/Roboto.Memory/Snapshots/UIElementNode.cs
+++ b/src/Nexus.Memory/Snapshots/UIElementNode.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// Lightweight snapshot of a single UIElement from the game's UI tree.
diff --git a/src/Roboto.Memory/Snapshots/UiQuestEntry.cs b/src/Nexus.Memory/Snapshots/UiQuestEntry.cs
similarity index 96%
rename from src/Roboto.Memory/Snapshots/UiQuestEntry.cs
rename to src/Nexus.Memory/Snapshots/UiQuestEntry.cs
index 5516512..8ce2b6d 100644
--- a/src/Roboto.Memory/Snapshots/UiQuestEntry.cs
+++ b/src/Nexus.Memory/Snapshots/UiQuestEntry.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
///
/// A quest group from the UI element tree (one per quest_display).
diff --git a/src/Roboto.Memory/Snapshots/WalkabilityGrid.cs b/src/Nexus.Memory/Snapshots/WalkabilityGrid.cs
similarity index 94%
rename from src/Roboto.Memory/Snapshots/WalkabilityGrid.cs
rename to src/Nexus.Memory/Snapshots/WalkabilityGrid.cs
index 4b52073..22f5453 100644
--- a/src/Roboto.Memory/Snapshots/WalkabilityGrid.cs
+++ b/src/Nexus.Memory/Snapshots/WalkabilityGrid.cs
@@ -1,4 +1,4 @@
-namespace Roboto.Memory;
+namespace Nexus.Memory;
public sealed class WalkabilityGrid
{
diff --git a/src/Automata.Navigation/AtlasPanorama.cs b/src/Nexus.Navigation/AtlasPanorama.cs
similarity index 99%
rename from src/Automata.Navigation/AtlasPanorama.cs
rename to src/Nexus.Navigation/AtlasPanorama.cs
index 354baa6..b4a90b8 100644
--- a/src/Automata.Navigation/AtlasPanorama.cs
+++ b/src/Nexus.Navigation/AtlasPanorama.cs
@@ -1,10 +1,10 @@
using System.Diagnostics;
using OpenCvSharp;
-using Automata.Core;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Navigation;
+namespace Nexus.Navigation;
public record AtlasProgress(int TilesCaptured, int Row, string Phase);
diff --git a/src/Automata.Navigation/IconDetector.cs b/src/Nexus.Navigation/IconDetector.cs
similarity index 99%
rename from src/Automata.Navigation/IconDetector.cs
rename to src/Nexus.Navigation/IconDetector.cs
index 9312879..a466d36 100644
--- a/src/Automata.Navigation/IconDetector.cs
+++ b/src/Nexus.Navigation/IconDetector.cs
@@ -1,7 +1,7 @@
using OpenCvSharp;
using Serilog;
-namespace Automata.Navigation;
+namespace Nexus.Navigation;
///
/// Detects minimap icons (doors, checkpoints) via template matching.
diff --git a/src/Automata.Navigation/MinimapCapture.cs b/src/Nexus.Navigation/MinimapCapture.cs
similarity index 99%
rename from src/Automata.Navigation/MinimapCapture.cs
rename to src/Nexus.Navigation/MinimapCapture.cs
index e7e3093..f0aae8e 100644
--- a/src/Automata.Navigation/MinimapCapture.cs
+++ b/src/Nexus.Navigation/MinimapCapture.cs
@@ -1,10 +1,10 @@
using OpenCvSharp;
-using Automata.Screen;
+using Nexus.Screen;
using Serilog;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
using Size = OpenCvSharp.Size;
-namespace Automata.Navigation;
+namespace Nexus.Navigation;
public class MinimapCapture : IFrameConsumer, IDisposable
{
diff --git a/src/Automata.Navigation/NavigationExecutor.cs b/src/Nexus.Navigation/NavigationExecutor.cs
similarity index 99%
rename from src/Automata.Navigation/NavigationExecutor.cs
rename to src/Nexus.Navigation/NavigationExecutor.cs
index a179164..da36c11 100644
--- a/src/Automata.Navigation/NavigationExecutor.cs
+++ b/src/Nexus.Navigation/NavigationExecutor.cs
@@ -1,11 +1,11 @@
using System.Diagnostics;
using OpenCvSharp;
-using Automata.Core;
-using Automata.Game;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Navigation;
+namespace Nexus.Navigation;
public class NavigationExecutor : IDisposable
{
diff --git a/src/Automata.Navigation/NavigationTypes.cs b/src/Nexus.Navigation/NavigationTypes.cs
similarity index 99%
rename from src/Automata.Navigation/NavigationTypes.cs
rename to src/Nexus.Navigation/NavigationTypes.cs
index 65080af..884a833 100644
--- a/src/Automata.Navigation/NavigationTypes.cs
+++ b/src/Nexus.Navigation/NavigationTypes.cs
@@ -1,7 +1,7 @@
-using Automata.Core;
+using Nexus.Core;
using OpenCvSharp;
-namespace Automata.Navigation;
+namespace Nexus.Navigation;
public enum MinimapMode
{
diff --git a/src/Automata.Navigation/Automata.Navigation.csproj b/src/Nexus.Navigation/Nexus.Navigation.csproj
similarity index 73%
rename from src/Automata.Navigation/Automata.Navigation.csproj
rename to src/Nexus.Navigation/Nexus.Navigation.csproj
index 29698e6..bd3c70c 100644
--- a/src/Automata.Navigation/Automata.Navigation.csproj
+++ b/src/Nexus.Navigation/Nexus.Navigation.csproj
@@ -12,8 +12,8 @@
-
-
-
+
+
+
diff --git a/src/Automata.Navigation/PathFinder.cs b/src/Nexus.Navigation/PathFinder.cs
similarity index 99%
rename from src/Automata.Navigation/PathFinder.cs
rename to src/Nexus.Navigation/PathFinder.cs
index 9445e81..2988fbd 100644
--- a/src/Automata.Navigation/PathFinder.cs
+++ b/src/Nexus.Navigation/PathFinder.cs
@@ -1,7 +1,7 @@
using OpenCvSharp;
using Serilog;
-namespace Automata.Navigation;
+namespace Nexus.Navigation;
///
/// Last BFS result for visualization.
diff --git a/src/Automata.Navigation/PerspectiveCalibrator.cs b/src/Nexus.Navigation/PerspectiveCalibrator.cs
similarity index 99%
rename from src/Automata.Navigation/PerspectiveCalibrator.cs
rename to src/Nexus.Navigation/PerspectiveCalibrator.cs
index 1f3ab8f..8d6da04 100644
--- a/src/Automata.Navigation/PerspectiveCalibrator.cs
+++ b/src/Nexus.Navigation/PerspectiveCalibrator.cs
@@ -1,9 +1,9 @@
using OpenCvSharp;
-using Automata.Core;
-using Automata.Screen;
+using Nexus.Core;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Navigation;
+namespace Nexus.Navigation;
public record CalibrationResult(float BestFactor, double BestConfidence, Dictionary AllResults);
diff --git a/src/Automata.Navigation/StuckDetector.cs b/src/Nexus.Navigation/StuckDetector.cs
similarity index 96%
rename from src/Automata.Navigation/StuckDetector.cs
rename to src/Nexus.Navigation/StuckDetector.cs
index 5dd02c5..3168233 100644
--- a/src/Automata.Navigation/StuckDetector.cs
+++ b/src/Nexus.Navigation/StuckDetector.cs
@@ -1,4 +1,4 @@
-namespace Automata.Navigation;
+namespace Nexus.Navigation;
///
/// Detects when the player hasn't moved significantly over a window of frames.
diff --git a/src/Automata.Navigation/WallColorTracker.cs b/src/Nexus.Navigation/WallColorTracker.cs
similarity index 99%
rename from src/Automata.Navigation/WallColorTracker.cs
rename to src/Nexus.Navigation/WallColorTracker.cs
index a28d810..d9e9896 100644
--- a/src/Automata.Navigation/WallColorTracker.cs
+++ b/src/Nexus.Navigation/WallColorTracker.cs
@@ -1,7 +1,7 @@
using OpenCvSharp;
using Serilog;
-namespace Automata.Navigation;
+namespace Nexus.Navigation;
///
/// Tracks HSV distribution of confirmed wall pixels and computes an adaptive
diff --git a/src/Automata.Navigation/WorldMap.cs b/src/Nexus.Navigation/WorldMap.cs
similarity index 99%
rename from src/Automata.Navigation/WorldMap.cs
rename to src/Nexus.Navigation/WorldMap.cs
index 4435fd5..922cbd2 100644
--- a/src/Automata.Navigation/WorldMap.cs
+++ b/src/Nexus.Navigation/WorldMap.cs
@@ -2,7 +2,7 @@ using System.Diagnostics;
using OpenCvSharp;
using Serilog;
-namespace Automata.Navigation;
+namespace Nexus.Navigation;
public class WorldMap : IDisposable
{
diff --git a/src/Roboto.Navigation/NavigationController.cs b/src/Nexus.Pathfinding/NavigationController.cs
similarity index 99%
rename from src/Roboto.Navigation/NavigationController.cs
rename to src/Nexus.Pathfinding/NavigationController.cs
index 4a88f65..831d587 100644
--- a/src/Roboto.Navigation/NavigationController.cs
+++ b/src/Nexus.Pathfinding/NavigationController.cs
@@ -1,8 +1,8 @@
using System.Numerics;
-using Roboto.Core;
+using Nexus.Core;
using Serilog;
-namespace Roboto.Navigation;
+namespace Nexus.Pathfinding;
public enum NavMode
{
diff --git a/src/Roboto.Navigation/Roboto.Navigation.csproj b/src/Nexus.Pathfinding/Nexus.Pathfinding.csproj
similarity index 83%
rename from src/Roboto.Navigation/Roboto.Navigation.csproj
rename to src/Nexus.Pathfinding/Nexus.Pathfinding.csproj
index bcebb88..60b2b65 100644
--- a/src/Roboto.Navigation/Roboto.Navigation.csproj
+++ b/src/Nexus.Pathfinding/Nexus.Pathfinding.csproj
@@ -8,6 +8,6 @@
-
+
diff --git a/src/Roboto.Navigation/PathFinder.cs b/src/Nexus.Pathfinding/PathFinder.cs
similarity index 99%
rename from src/Roboto.Navigation/PathFinder.cs
rename to src/Nexus.Pathfinding/PathFinder.cs
index 4b5e4b6..cbc05c9 100644
--- a/src/Roboto.Navigation/PathFinder.cs
+++ b/src/Nexus.Pathfinding/PathFinder.cs
@@ -1,8 +1,8 @@
using System.Numerics;
-using Roboto.Core;
+using Nexus.Core;
using Serilog;
-namespace Roboto.Navigation;
+namespace Nexus.Pathfinding;
public static class PathFinder
{
diff --git a/src/Automata.Screen/BossDetector.cs b/src/Nexus.Screen/BossDetector.cs
similarity index 99%
rename from src/Automata.Screen/BossDetector.cs
rename to src/Nexus.Screen/BossDetector.cs
index 2fb6f31..c0e80ff 100644
--- a/src/Automata.Screen/BossDetector.cs
+++ b/src/Nexus.Screen/BossDetector.cs
@@ -1,8 +1,8 @@
using OpenCvSharp;
using Serilog;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
-namespace Automata.Screen;
+namespace Nexus.Screen;
///
/// Detects bosses using YOLO running on a background thread.
diff --git a/src/Automata.Screen/DaemonTypes.cs b/src/Nexus.Screen/DaemonTypes.cs
similarity index 97%
rename from src/Automata.Screen/DaemonTypes.cs
rename to src/Nexus.Screen/DaemonTypes.cs
index f149805..fd27194 100644
--- a/src/Automata.Screen/DaemonTypes.cs
+++ b/src/Nexus.Screen/DaemonTypes.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public class OcrWord
{
@@ -49,7 +49,7 @@ public class DiffOcrResponse
{
public string Text { get; set; } = "";
public List Lines { get; set; } = [];
- public Automata.Core.Region? Region { get; set; }
+ public Nexus.Core.Region? Region { get; set; }
}
public class TemplateMatchResult
diff --git a/src/Automata.Screen/DesktopDuplication.cs b/src/Nexus.Screen/DesktopDuplication.cs
similarity index 98%
rename from src/Automata.Screen/DesktopDuplication.cs
rename to src/Nexus.Screen/DesktopDuplication.cs
index 4d81bcf..40b4e39 100644
--- a/src/Automata.Screen/DesktopDuplication.cs
+++ b/src/Nexus.Screen/DesktopDuplication.cs
@@ -5,9 +5,9 @@ using SharpGen.Runtime;
using Vortice.Direct3D;
using Vortice.Direct3D11;
using Vortice.DXGI;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public sealed class DesktopDuplication : IScreenCapture
{
diff --git a/src/Automata.Screen/DetectGridHandler.cs b/src/Nexus.Screen/DetectGridHandler.cs
similarity index 98%
rename from src/Automata.Screen/DetectGridHandler.cs
rename to src/Nexus.Screen/DetectGridHandler.cs
index ab4b4f0..581076c 100644
--- a/src/Automata.Screen/DetectGridHandler.cs
+++ b/src/Nexus.Screen/DetectGridHandler.cs
@@ -1,10 +1,10 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using Serilog;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
class DetectGridHandler
{
diff --git a/src/Automata.Screen/DetectionTypes.cs b/src/Nexus.Screen/DetectionTypes.cs
similarity index 95%
rename from src/Automata.Screen/DetectionTypes.cs
rename to src/Nexus.Screen/DetectionTypes.cs
index 2ada4bf..4252710 100644
--- a/src/Automata.Screen/DetectionTypes.cs
+++ b/src/Nexus.Screen/DetectionTypes.cs
@@ -1,4 +1,4 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
public record DetectedEnemy(
float Confidence,
diff --git a/src/Automata.Screen/DiffCropHandler.cs b/src/Nexus.Screen/DiffCropHandler.cs
similarity index 99%
rename from src/Automata.Screen/DiffCropHandler.cs
rename to src/Nexus.Screen/DiffCropHandler.cs
index acd300f..4b3781a 100644
--- a/src/Automata.Screen/DiffCropHandler.cs
+++ b/src/Nexus.Screen/DiffCropHandler.cs
@@ -1,10 +1,10 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using Serilog;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
class DiffCropHandler
{
diff --git a/src/Automata.Screen/EdgeCropHandler.cs b/src/Nexus.Screen/EdgeCropHandler.cs
similarity index 99%
rename from src/Automata.Screen/EdgeCropHandler.cs
rename to src/Nexus.Screen/EdgeCropHandler.cs
index 6fbe46b..301390f 100644
--- a/src/Automata.Screen/EdgeCropHandler.cs
+++ b/src/Nexus.Screen/EdgeCropHandler.cs
@@ -1,10 +1,10 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using Serilog;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
class EdgeCropHandler
{
diff --git a/src/Automata.Screen/EnemyDetector.cs b/src/Nexus.Screen/EnemyDetector.cs
similarity index 98%
rename from src/Automata.Screen/EnemyDetector.cs
rename to src/Nexus.Screen/EnemyDetector.cs
index 37727bf..2e1406a 100644
--- a/src/Automata.Screen/EnemyDetector.cs
+++ b/src/Nexus.Screen/EnemyDetector.cs
@@ -1,9 +1,9 @@
using OpenCvSharp;
-using Automata.Core;
+using Nexus.Core;
using Serilog;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
-namespace Automata.Screen;
+namespace Nexus.Screen;
///
/// Detects enemies on screen using two-stage approach:
diff --git a/src/Automata.Screen/FramePipeline.cs b/src/Nexus.Screen/FramePipeline.cs
similarity index 97%
rename from src/Automata.Screen/FramePipeline.cs
rename to src/Nexus.Screen/FramePipeline.cs
index e8734e5..b5e52cf 100644
--- a/src/Automata.Screen/FramePipeline.cs
+++ b/src/Nexus.Screen/FramePipeline.cs
@@ -1,4 +1,4 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
public class FramePipeline : IDisposable
{
diff --git a/src/Automata.Screen/FramePipelineService.cs b/src/Nexus.Screen/FramePipelineService.cs
similarity index 96%
rename from src/Automata.Screen/FramePipelineService.cs
rename to src/Nexus.Screen/FramePipelineService.cs
index b213661..42e5362 100644
--- a/src/Automata.Screen/FramePipelineService.cs
+++ b/src/Nexus.Screen/FramePipelineService.cs
@@ -1,6 +1,6 @@
using Serilog;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public class FramePipelineService : IDisposable
{
diff --git a/src/Automata.Screen/FrameSaver.cs b/src/Nexus.Screen/FrameSaver.cs
similarity index 98%
rename from src/Automata.Screen/FrameSaver.cs
rename to src/Nexus.Screen/FrameSaver.cs
index 2eb2c88..3e7831c 100644
--- a/src/Automata.Screen/FrameSaver.cs
+++ b/src/Nexus.Screen/FrameSaver.cs
@@ -1,8 +1,8 @@
using OpenCvSharp;
using Serilog;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
-namespace Automata.Screen;
+namespace Nexus.Screen;
///
/// Saves full-screen frames as JPEGs for YOLO training data collection.
diff --git a/src/Automata.Screen/GameStateDetector.cs b/src/Nexus.Screen/GameStateDetector.cs
similarity index 95%
rename from src/Automata.Screen/GameStateDetector.cs
rename to src/Nexus.Screen/GameStateDetector.cs
index 89be1bd..5061e17 100644
--- a/src/Automata.Screen/GameStateDetector.cs
+++ b/src/Nexus.Screen/GameStateDetector.cs
@@ -1,7 +1,7 @@
-using Automata.Core;
+using Nexus.Core;
using Serilog;
-namespace Automata.Screen;
+namespace Nexus.Screen;
///
/// Classifies the current game UI state by probing known pixel positions on each frame.
diff --git a/src/Automata.Screen/GdiCapture.cs b/src/Nexus.Screen/GdiCapture.cs
similarity index 95%
rename from src/Automata.Screen/GdiCapture.cs
rename to src/Nexus.Screen/GdiCapture.cs
index ff72148..0a6313c 100644
--- a/src/Automata.Screen/GdiCapture.cs
+++ b/src/Nexus.Screen/GdiCapture.cs
@@ -3,9 +3,9 @@ using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using OpenCvSharp;
using OpenCvSharp.Extensions;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public sealed class GdiCapture : IScreenCapture
{
diff --git a/src/Automata.Screen/GridHandler.cs b/src/Nexus.Screen/GridHandler.cs
similarity index 99%
rename from src/Automata.Screen/GridHandler.cs
rename to src/Nexus.Screen/GridHandler.cs
index 6943bcd..7a5c3ba 100644
--- a/src/Automata.Screen/GridHandler.cs
+++ b/src/Nexus.Screen/GridHandler.cs
@@ -1,8 +1,8 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
using System.Drawing;
using Serilog;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
public class GridHandler
{
diff --git a/src/Automata.Screen/GridReader.cs b/src/Nexus.Screen/GridReader.cs
similarity index 98%
rename from src/Automata.Screen/GridReader.cs
rename to src/Nexus.Screen/GridReader.cs
index 0a9285d..8be4fd0 100644
--- a/src/Automata.Screen/GridReader.cs
+++ b/src/Nexus.Screen/GridReader.cs
@@ -1,7 +1,7 @@
-using Automata.Core;
+using Nexus.Core;
using Serilog;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public class GridLayout
{
diff --git a/src/Automata.Screen/HudReader.cs b/src/Nexus.Screen/HudReader.cs
similarity index 98%
rename from src/Automata.Screen/HudReader.cs
rename to src/Nexus.Screen/HudReader.cs
index 3e60e93..2fe83ed 100644
--- a/src/Automata.Screen/HudReader.cs
+++ b/src/Nexus.Screen/HudReader.cs
@@ -1,9 +1,9 @@
using OpenCvSharp;
-using Automata.Core;
+using Nexus.Core;
using Serilog;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public record HudSnapshot
{
diff --git a/src/Automata.Screen/IFrameConsumer.cs b/src/Nexus.Screen/IFrameConsumer.cs
similarity index 73%
rename from src/Automata.Screen/IFrameConsumer.cs
rename to src/Nexus.Screen/IFrameConsumer.cs
index b7089c6..ca96ebb 100644
--- a/src/Automata.Screen/IFrameConsumer.cs
+++ b/src/Nexus.Screen/IFrameConsumer.cs
@@ -1,4 +1,4 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
public interface IFrameConsumer
{
diff --git a/src/Automata.Screen/IOcrEngine.cs b/src/Nexus.Screen/IOcrEngine.cs
similarity index 83%
rename from src/Automata.Screen/IOcrEngine.cs
rename to src/Nexus.Screen/IOcrEngine.cs
index 6822e5c..a66bf7b 100644
--- a/src/Automata.Screen/IOcrEngine.cs
+++ b/src/Nexus.Screen/IOcrEngine.cs
@@ -1,6 +1,6 @@
using System.Drawing;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public interface IOcrEngine : IDisposable
{
diff --git a/src/Automata.Screen/IScreenCapture.cs b/src/Nexus.Screen/IScreenCapture.cs
similarity index 69%
rename from src/Automata.Screen/IScreenCapture.cs
rename to src/Nexus.Screen/IScreenCapture.cs
index 4e96887..f354f93 100644
--- a/src/Automata.Screen/IScreenCapture.cs
+++ b/src/Nexus.Screen/IScreenCapture.cs
@@ -1,7 +1,7 @@
using OpenCvSharp;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public interface IScreenCapture : IDisposable
{
diff --git a/src/Automata.Screen/IScreenReader.cs b/src/Nexus.Screen/IScreenReader.cs
similarity index 96%
rename from src/Automata.Screen/IScreenReader.cs
rename to src/Nexus.Screen/IScreenReader.cs
index 3d5e808..dbeaf98 100644
--- a/src/Automata.Screen/IScreenReader.cs
+++ b/src/Nexus.Screen/IScreenReader.cs
@@ -1,6 +1,6 @@
-using Automata.Core;
+using Nexus.Core;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public interface IScreenReader : IDisposable
{
diff --git a/src/Automata.Screen/ImagePreprocessor.cs b/src/Nexus.Screen/ImagePreprocessor.cs
similarity index 99%
rename from src/Automata.Screen/ImagePreprocessor.cs
rename to src/Nexus.Screen/ImagePreprocessor.cs
index 4e374e6..b935b75 100644
--- a/src/Automata.Screen/ImagePreprocessor.cs
+++ b/src/Nexus.Screen/ImagePreprocessor.cs
@@ -1,4 +1,4 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
using System.Drawing;
using OpenCvSharp;
diff --git a/src/Automata.Screen/ImageUtils.cs b/src/Nexus.Screen/ImageUtils.cs
similarity index 97%
rename from src/Automata.Screen/ImageUtils.cs
rename to src/Nexus.Screen/ImageUtils.cs
index 8cb346b..dde7e84 100644
--- a/src/Automata.Screen/ImageUtils.cs
+++ b/src/Nexus.Screen/ImageUtils.cs
@@ -1,4 +1,4 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
using System.Drawing;
using System.Drawing.Imaging;
diff --git a/src/Automata.Screen/LootDebugDetector.cs b/src/Nexus.Screen/LootDebugDetector.cs
similarity index 98%
rename from src/Automata.Screen/LootDebugDetector.cs
rename to src/Nexus.Screen/LootDebugDetector.cs
index 47c2f4c..0a5c7cb 100644
--- a/src/Automata.Screen/LootDebugDetector.cs
+++ b/src/Nexus.Screen/LootDebugDetector.cs
@@ -1,6 +1,6 @@
using Serilog;
-namespace Automata.Screen;
+namespace Nexus.Screen;
///
/// Debug-only: periodically captures the screen, runs loot label detection,
diff --git a/src/Automata.Screen/LootLabel.cs b/src/Nexus.Screen/LootLabel.cs
similarity index 99%
rename from src/Automata.Screen/LootLabel.cs
rename to src/Nexus.Screen/LootLabel.cs
index a3fd8d3..99e56eb 100644
--- a/src/Automata.Screen/LootLabel.cs
+++ b/src/Nexus.Screen/LootLabel.cs
@@ -1,4 +1,4 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
///
/// A detected loot label on screen with its position and classified tier.
diff --git a/src/Automata.Screen/Automata.Screen.csproj b/src/Nexus.Screen/Nexus.Screen.csproj
similarity index 91%
rename from src/Automata.Screen/Automata.Screen.csproj
rename to src/Nexus.Screen/Nexus.Screen.csproj
index 780d038..e2b7096 100644
--- a/src/Automata.Screen/Automata.Screen.csproj
+++ b/src/Nexus.Screen/Nexus.Screen.csproj
@@ -15,6 +15,6 @@
-
+
diff --git a/src/Automata.Screen/Ocr/EasyOcrEngine.cs b/src/Nexus.Screen/Ocr/EasyOcrEngine.cs
similarity index 96%
rename from src/Automata.Screen/Ocr/EasyOcrEngine.cs
rename to src/Nexus.Screen/Ocr/EasyOcrEngine.cs
index 47d6655..1a81fd8 100644
--- a/src/Automata.Screen/Ocr/EasyOcrEngine.cs
+++ b/src/Nexus.Screen/Ocr/EasyOcrEngine.cs
@@ -1,6 +1,6 @@
using System.Drawing;
-namespace Automata.Screen.Ocr;
+namespace Nexus.Screen.Ocr;
///
/// OCR engine wrapping the Python EasyOCR daemon.
diff --git a/src/Automata.Screen/Ocr/OcrEngineFactory.cs b/src/Nexus.Screen/Ocr/OcrEngineFactory.cs
similarity index 93%
rename from src/Automata.Screen/Ocr/OcrEngineFactory.cs
rename to src/Nexus.Screen/Ocr/OcrEngineFactory.cs
index 8ee2636..e4cd982 100644
--- a/src/Automata.Screen/Ocr/OcrEngineFactory.cs
+++ b/src/Nexus.Screen/Ocr/OcrEngineFactory.cs
@@ -1,6 +1,6 @@
using Serilog;
-namespace Automata.Screen.Ocr;
+namespace Nexus.Screen.Ocr;
public static class OcrEngineFactory
{
diff --git a/src/Automata.Screen/Ocr/OneOcrEngine.cs b/src/Nexus.Screen/Ocr/OneOcrEngine.cs
similarity index 99%
rename from src/Automata.Screen/Ocr/OneOcrEngine.cs
rename to src/Nexus.Screen/Ocr/OneOcrEngine.cs
index a982024..dd9a5ec 100644
--- a/src/Automata.Screen/Ocr/OneOcrEngine.cs
+++ b/src/Nexus.Screen/Ocr/OneOcrEngine.cs
@@ -3,7 +3,7 @@ using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using Serilog;
-namespace Automata.Screen.Ocr;
+namespace Nexus.Screen.Ocr;
///
/// OCR engine using OneOCR (Windows 11 Snipping Tool's built-in engine).
diff --git a/src/Automata.Screen/Ocr/WinOcrEngine.cs b/src/Nexus.Screen/Ocr/WinOcrEngine.cs
similarity index 98%
rename from src/Automata.Screen/Ocr/WinOcrEngine.cs
rename to src/Nexus.Screen/Ocr/WinOcrEngine.cs
index f9688f1..b1e7cd5 100644
--- a/src/Automata.Screen/Ocr/WinOcrEngine.cs
+++ b/src/Nexus.Screen/Ocr/WinOcrEngine.cs
@@ -7,7 +7,7 @@ using Windows.Storage.Streams;
using BitmapDecoder = Windows.Graphics.Imaging.BitmapDecoder;
using SdImageFormat = System.Drawing.Imaging.ImageFormat;
-namespace Automata.Screen.Ocr;
+namespace Nexus.Screen.Ocr;
public sealed class WinOcrEngine : IOcrEngine
{
diff --git a/src/Automata.Screen/OnnxYoloDetector.cs b/src/Nexus.Screen/OnnxYoloDetector.cs
similarity index 99%
rename from src/Automata.Screen/OnnxYoloDetector.cs
rename to src/Nexus.Screen/OnnxYoloDetector.cs
index 0ac27bd..0da8399 100644
--- a/src/Automata.Screen/OnnxYoloDetector.cs
+++ b/src/Nexus.Screen/OnnxYoloDetector.cs
@@ -5,7 +5,7 @@ using OpenCvSharp;
using OpenCvSharp.Dnn;
using Serilog;
-namespace Automata.Screen;
+namespace Nexus.Screen;
///
/// YOLO11 object detection via ONNX Runtime with CUDA GPU acceleration.
diff --git a/src/Automata.Screen/PythonDetectBridge.cs b/src/Nexus.Screen/PythonDetectBridge.cs
similarity index 99%
rename from src/Automata.Screen/PythonDetectBridge.cs
rename to src/Nexus.Screen/PythonDetectBridge.cs
index 6a083a3..4249144 100644
--- a/src/Automata.Screen/PythonDetectBridge.cs
+++ b/src/Nexus.Screen/PythonDetectBridge.cs
@@ -1,4 +1,4 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
using System.Diagnostics;
using System.Text.Json;
diff --git a/src/Automata.Screen/PythonOcrBridge.cs b/src/Nexus.Screen/PythonOcrBridge.cs
similarity index 99%
rename from src/Automata.Screen/PythonOcrBridge.cs
rename to src/Nexus.Screen/PythonOcrBridge.cs
index ef206d9..544135f 100644
--- a/src/Automata.Screen/PythonOcrBridge.cs
+++ b/src/Nexus.Screen/PythonOcrBridge.cs
@@ -1,4 +1,4 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
using System.Diagnostics;
using System.Drawing;
diff --git a/src/Automata.Screen/ScreenCapture.cs b/src/Nexus.Screen/ScreenCapture.cs
similarity index 96%
rename from src/Automata.Screen/ScreenCapture.cs
rename to src/Nexus.Screen/ScreenCapture.cs
index 8d64f61..4018ee6 100644
--- a/src/Automata.Screen/ScreenCapture.cs
+++ b/src/Nexus.Screen/ScreenCapture.cs
@@ -1,9 +1,9 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
static class ScreenCapture
{
diff --git a/src/Automata.Screen/ScreenFrame.cs b/src/Nexus.Screen/ScreenFrame.cs
similarity index 93%
rename from src/Automata.Screen/ScreenFrame.cs
rename to src/Nexus.Screen/ScreenFrame.cs
index 7acceeb..5377be0 100644
--- a/src/Automata.Screen/ScreenFrame.cs
+++ b/src/Nexus.Screen/ScreenFrame.cs
@@ -1,7 +1,7 @@
using OpenCvSharp;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public class ScreenFrame : IDisposable
{
diff --git a/src/Automata.Screen/ScreenReader.cs b/src/Nexus.Screen/ScreenReader.cs
similarity index 99%
rename from src/Automata.Screen/ScreenReader.cs
rename to src/Nexus.Screen/ScreenReader.cs
index c2457a7..3a92ca7 100644
--- a/src/Automata.Screen/ScreenReader.cs
+++ b/src/Nexus.Screen/ScreenReader.cs
@@ -3,12 +3,12 @@ using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using OpenCvSharp;
using OpenCvSharp.Extensions;
-using Automata.Core;
+using Nexus.Core;
using Serilog;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
using Size = OpenCvSharp.Size;
-namespace Automata.Screen;
+namespace Nexus.Screen;
public class ScreenReader : IScreenReader
{
diff --git a/src/Automata.Screen/SignalProcessing.cs b/src/Nexus.Screen/SignalProcessing.cs
similarity index 99%
rename from src/Automata.Screen/SignalProcessing.cs
rename to src/Nexus.Screen/SignalProcessing.cs
index 3f9fee9..84a810d 100644
--- a/src/Automata.Screen/SignalProcessing.cs
+++ b/src/Nexus.Screen/SignalProcessing.cs
@@ -1,4 +1,4 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
static class SignalProcessing
{
diff --git a/src/Automata.Screen/TemplateMatchHandler.cs b/src/Nexus.Screen/TemplateMatchHandler.cs
similarity index 98%
rename from src/Automata.Screen/TemplateMatchHandler.cs
rename to src/Nexus.Screen/TemplateMatchHandler.cs
index d779cf1..61fd1a7 100644
--- a/src/Automata.Screen/TemplateMatchHandler.cs
+++ b/src/Nexus.Screen/TemplateMatchHandler.cs
@@ -1,9 +1,9 @@
-namespace Automata.Screen;
+namespace Nexus.Screen;
using System.Drawing;
using OpenCvSharp;
using OpenCvSharp.Extensions;
-using Region = Automata.Core.Region;
+using Region = Nexus.Core.Region;
class TemplateMatchHandler
{
diff --git a/src/Nexus.Simulator/Bridge/SimInputController.cs b/src/Nexus.Simulator/Bridge/SimInputController.cs
new file mode 100644
index 0000000..794c67e
--- /dev/null
+++ b/src/Nexus.Simulator/Bridge/SimInputController.cs
@@ -0,0 +1,149 @@
+using System.Numerics;
+using Nexus.Core;
+using Nexus.Simulator.World;
+
+namespace Nexus.Simulator.Bridge;
+
+///
+/// Captures bot actions (key presses, mouse moves) and feeds them into SimWorld.
+/// Implements IInputController so BotEngine systems can emit actions normally.
+///
+public class SimInputController : IInputController
+{
+ private readonly SimWorld _world;
+ private readonly object _lock = new();
+
+ // WASD key states
+ private bool _wHeld, _aHeld, _sHeld, _dHeld;
+
+ // Mouse position (screen coords captured from SmoothMoveTo/MouseMoveTo)
+ private Vector2 _mouseScreenPos = new(1280, 720);
+
+ // Camera matrix for screen→world conversion
+ private Matrix4x4? _cameraMatrix;
+
+ public bool IsInitialized => true;
+
+ public SimInputController(SimWorld world)
+ {
+ _world = world;
+ }
+
+ public void SetCameraMatrix(Matrix4x4 camera)
+ {
+ _cameraMatrix = camera;
+ }
+
+ ///
+ /// Called each sim tick to push accumulated inputs into SimWorld.
+ ///
+ public void FlushToWorld()
+ {
+ lock (_lock)
+ {
+ // Convert WASD to direction vector (with 45° isometric rotation inversion)
+ var dx = 0f;
+ var dy = 0f;
+ if (_wHeld) { dx += 0.70710678f; dy += 0.70710678f; }
+ if (_sHeld) { dx -= 0.70710678f; dy -= 0.70710678f; }
+ if (_dHeld) { dx += 0.70710678f; dy -= 0.70710678f; }
+ if (_aHeld) { dx -= 0.70710678f; dy += 0.70710678f; }
+
+ var dir = new Vector2(dx, dy);
+ if (dir.LengthSquared() > 0.001f)
+ dir = Vector2.Normalize(dir);
+
+ _world.MoveDirection = dir;
+ _world.MouseWorldPos = ScreenToWorld(_mouseScreenPos);
+ }
+ }
+
+ private Vector2 ScreenToWorld(Vector2 screen)
+ {
+ if (_cameraMatrix is not { } cam) return _world.Player.Position;
+ if (!Matrix4x4.Invert(cam, out var inv)) return _world.Player.Position;
+
+ // NDC from screen
+ var ndcX = screen.X / 1280f - 1f;
+ var ndcY = 1f - screen.Y / 720f;
+
+ var worldNear = Vector4.Transform(new Vector4(ndcX, ndcY, 0, 1), inv);
+ if (MathF.Abs(worldNear.W) < 0.0001f) return _world.Player.Position;
+ return new Vector2(worldNear.X / worldNear.W, worldNear.Y / worldNear.W);
+ }
+
+ // IInputController implementation — captures actions, no actual Win32 calls
+
+ public void KeyDown(ushort scanCode)
+ {
+ lock (_lock)
+ {
+ switch (scanCode)
+ {
+ case 0x11: _wHeld = true; break; // W
+ case 0x1E: _aHeld = true; break; // A
+ case 0x1F: _sHeld = true; break; // S
+ case 0x20: _dHeld = true; break; // D
+ }
+ }
+ }
+
+ public void KeyUp(ushort scanCode)
+ {
+ lock (_lock)
+ {
+ switch (scanCode)
+ {
+ case 0x11: _wHeld = false; break;
+ case 0x1E: _aHeld = false; break;
+ case 0x1F: _sHeld = false; break;
+ case 0x20: _dHeld = false; break;
+ }
+ }
+ }
+
+ public void KeyPress(ushort scanCode, int holdMs = 50)
+ {
+ // Queue as skill cast
+ var target = ScreenToWorld(_mouseScreenPos);
+ _world.QueueSkill(scanCode, target);
+ }
+
+ public void MouseMoveTo(int x, int y)
+ {
+ lock (_lock) { _mouseScreenPos = new Vector2(x, y); }
+ }
+
+ public void SmoothMoveTo(int x, int y) => MouseMoveTo(x, y);
+ public void MouseMoveBy(int dx, int dy)
+ {
+ lock (_lock) { _mouseScreenPos += new Vector2(dx, dy); }
+ }
+
+ public void LeftClick(int x, int y)
+ {
+ MouseMoveTo(x, y);
+ var target = ScreenToWorld(new Vector2(x, y));
+ // LMB = default attack / melee
+ _world.QueueSkill(0, target);
+ }
+
+ public void RightClick(int x, int y)
+ {
+ MouseMoveTo(x, y);
+ var target = ScreenToWorld(new Vector2(x, y));
+ _world.QueueSkill(1, target);
+ }
+
+ public void MiddleClick(int x, int y)
+ {
+ MouseMoveTo(x, y);
+ var target = ScreenToWorld(new Vector2(x, y));
+ _world.QueueSkill(2, target);
+ }
+
+ public void LeftDown() { }
+ public void LeftUp() { }
+ public void RightDown() { }
+ public void RightUp() { }
+}
diff --git a/src/Nexus.Simulator/Bridge/SimPoller.cs b/src/Nexus.Simulator/Bridge/SimPoller.cs
new file mode 100644
index 0000000..872c569
--- /dev/null
+++ b/src/Nexus.Simulator/Bridge/SimPoller.cs
@@ -0,0 +1,112 @@
+using System.Numerics;
+using Nexus.Core;
+using Nexus.Data;
+using Nexus.Simulator.Config;
+using Nexus.Simulator.World;
+
+namespace Nexus.Simulator.Bridge;
+
+///
+/// Replaces MemoryPoller. Ticks SimWorld at 60Hz and pushes state to GameDataCache.
+/// Runs on a background thread, just like the real MemoryPoller.
+///
+public sealed class SimPoller : IDisposable
+{
+ private readonly SimWorld _world;
+ private readonly SimInputController _input;
+ private readonly GameDataCache _cache;
+ private readonly SimConfig _config;
+
+ private Thread? _thread;
+ private volatile bool _running;
+
+ public event Action? StateUpdated;
+
+ public SimPoller(SimWorld world, SimInputController input, GameDataCache cache, SimConfig config)
+ {
+ _world = world;
+ _input = input;
+ _cache = cache;
+ _config = config;
+ }
+
+ public void Start()
+ {
+ if (_running) return;
+ _running = true;
+ _thread = new Thread(PollLoop)
+ {
+ Name = "Nexus.SimPoller",
+ IsBackground = true,
+ };
+ _thread.Start();
+ }
+
+ public void Stop()
+ {
+ _running = false;
+ _thread?.Join(2000);
+ _thread = null;
+ }
+
+ private void PollLoop()
+ {
+ const double targetMs = 1000.0 / 60.0;
+ var sw = System.Diagnostics.Stopwatch.StartNew();
+ var lastMs = sw.Elapsed.TotalMilliseconds;
+
+ while (_running)
+ {
+ var nowMs = sw.Elapsed.TotalMilliseconds;
+ var dt = (float)((nowMs - lastMs) / 1000.0);
+ lastMs = nowMs;
+
+ // Clamp dt to avoid spiral of death
+ dt = Math.Min(dt, 0.1f);
+
+ // Flush bot inputs into world
+ _input.FlushToWorld();
+
+ // Tick the simulation
+ _world.Tick(dt);
+
+ // Build GameState
+ var state = SimStateBuilder.Build(_world, dt);
+ var cam = SimStateBuilder.BuildCameraMatrix(_world.Player.Position);
+
+ // Update input controller's camera for screen→world conversion
+ _input.SetCameraMatrix(cam);
+
+ // Push to cache
+ _cache.CameraMatrix = new CameraMatrixData(cam);
+ _cache.PlayerPosition = new PlayerPositionData(
+ _world.Player.Position.X, _world.Player.Position.Y, 0f);
+ _cache.PlayerVitals = new PlayerVitalsData(
+ _world.Player.Health, _world.Player.MaxHealth,
+ _world.Player.Mana, _world.Player.MaxMana, 0, 0);
+ _cache.IsLoading = false;
+ _cache.IsEscapeOpen = false;
+ _cache.Entities = state.Entities;
+ _cache.HostileMonsters = state.HostileMonsters;
+ _cache.NearbyLoot = [];
+ _cache.Terrain = _world.Terrain;
+ _cache.AreaHash = 1;
+ _cache.AreaLevel = 1;
+ _cache.CurrentAreaName = "SimulatedArena";
+ _cache.CharacterName = "SimPlayer";
+ _cache.LatestState = state;
+ _cache.HotTickTimestamp = Environment.TickCount64;
+ _cache.ColdTickTimestamp = Environment.TickCount64;
+
+ StateUpdated?.Invoke();
+
+ // Sleep for remainder of frame
+ var elapsed = sw.Elapsed.TotalMilliseconds - nowMs;
+ var sleep = targetMs - elapsed;
+ if (sleep > 1)
+ Thread.Sleep((int)sleep);
+ }
+ }
+
+ public void Dispose() => Stop();
+}
diff --git a/src/Nexus.Simulator/Bridge/SimStateBuilder.cs b/src/Nexus.Simulator/Bridge/SimStateBuilder.cs
new file mode 100644
index 0000000..e209499
--- /dev/null
+++ b/src/Nexus.Simulator/Bridge/SimStateBuilder.cs
@@ -0,0 +1,115 @@
+using System.Numerics;
+using Nexus.Core;
+using Nexus.Simulator.World;
+
+namespace Nexus.Simulator.Bridge;
+
+///
+/// Converts SimWorld state into GameState for the bot systems.
+///
+public static class SimStateBuilder
+{
+ private static long _tickNumber;
+
+ public static GameState Build(SimWorld world, float dt)
+ {
+ _tickNumber++;
+ var player = world.Player;
+
+ var entities = new List();
+ var hostiles = new List();
+
+ foreach (var enemy in world.Enemies)
+ {
+ var snap = new EntitySnapshot
+ {
+ Id = enemy.Id,
+ Path = "Metadata/Monsters/SimEnemy",
+ Category = EntityCategory.Monster,
+ ThreatLevel = enemy.GetThreatLevel(),
+ Rarity = enemy.Rarity,
+ Position = enemy.Position,
+ Z = 0f,
+ DistanceToPlayer = Vector2.Distance(enemy.Position, player.Position),
+ IsAlive = enemy.IsAlive,
+ LifeCurrent = enemy.Health,
+ LifeTotal = enemy.MaxHealth,
+ IsTargetable = enemy.IsAlive,
+ ActionId = enemy.IsAttacking ? (short)1 : (short)0,
+ IsAttacking = enemy.IsAttacking,
+ IsMoving = enemy.AiState == EnemyAiState.Chasing,
+ };
+ entities.Add(snap);
+ if (enemy.IsAlive)
+ hostiles.Add(snap);
+ }
+
+ var cameraMatrix = BuildCameraMatrix(player.Position);
+
+ return new GameState
+ {
+ TickNumber = _tickNumber,
+ DeltaTime = dt,
+ TimestampMs = Environment.TickCount64,
+ AreaHash = 1,
+ AreaLevel = 1,
+ CurrentAreaName = "SimulatedArena",
+ IsLoading = false,
+ IsEscapeOpen = false,
+ CameraMatrix = cameraMatrix,
+ Terrain = world.Terrain,
+ Entities = entities,
+ HostileMonsters = hostiles,
+ NearbyLoot = [],
+ Player = new PlayerState
+ {
+ CharacterName = "SimPlayer",
+ HasPosition = true,
+ Position = player.Position,
+ Z = 0f,
+ LifeCurrent = player.Health,
+ LifeTotal = player.MaxHealth,
+ ManaCurrent = player.Mana,
+ ManaTotal = player.MaxMana,
+ Skills = BuildSkillStates(),
+ },
+ };
+ }
+
+ ///
+ /// Creates a top-down orthographic camera matrix that WorldToScreen.Project() can use.
+ /// WorldToScreen expects: sx = (clipX + 1) * 1280, sy = (1 - clipY) * 720
+ /// So we need: clipX = (worldX - camX) / halfViewW, clipY = (worldY - camY) / halfViewH
+ ///
+ public static Matrix4x4 BuildCameraMatrix(Vector2 playerPos)
+ {
+ // View dimensions in world units that map to 2560x1440 screen
+ // At default zoom, ~5 world units per pixel → 2560*5 = 12800 world units wide
+ const float viewWidth = 12800f;
+ const float viewHeight = 7200f;
+
+ // Orthographic projection centered on player
+ // WorldToScreen does: clip = Transform(world4, matrix), then divides by W
+ // For ortho: we want (worldX - playerX) / halfW → clipX, (worldY - playerY) / halfH → clipY
+ var halfW = viewWidth / 2f;
+ var halfH = viewHeight / 2f;
+
+ // Row-major matrix that transforms (worldX, worldY, 0, 1) → (clipX, clipY, clipZ, 1)
+ return new Matrix4x4(
+ 1f / halfW, 0, 0, 0,
+ 0, 1f / halfH, 0, 0,
+ 0, 0, 1, 0,
+ -playerPos.X / halfW, -playerPos.Y / halfH, 0, 1);
+ }
+
+ private static List BuildSkillStates()
+ {
+ return
+ [
+ new SkillState { SlotIndex = 0, Name = "MeleeStrike", SkillBarSlot = 0, CanBeUsed = true, ChargesMax = 1, ChargesCurrent = 1 },
+ new SkillState { SlotIndex = 1, Name = "PowerStrike", SkillBarSlot = 1, CanBeUsed = true, ChargesMax = 1, ChargesCurrent = 1 },
+ new SkillState { SlotIndex = 3, Name = "WhirlingSlash", SkillBarSlot = 3, CanBeUsed = true, ChargesMax = 1, ChargesCurrent = 1, CooldownTimeMs = 500 },
+ new SkillState { SlotIndex = 4, Name = "SpearThrow", SkillBarSlot = 4, CanBeUsed = true, ChargesMax = 1, ChargesCurrent = 1, CooldownTimeMs = 300 },
+ ];
+ }
+}
diff --git a/src/Nexus.Simulator/Config/SimConfig.cs b/src/Nexus.Simulator/Config/SimConfig.cs
new file mode 100644
index 0000000..7231c97
--- /dev/null
+++ b/src/Nexus.Simulator/Config/SimConfig.cs
@@ -0,0 +1,47 @@
+namespace Nexus.Simulator.Config;
+
+public class SimConfig
+{
+ // Terrain
+ public int TerrainWidth { get; set; } = 500;
+ public int TerrainHeight { get; set; } = 500;
+ public float WorldToGrid { get; set; } = 23f / 250f;
+
+ // Player
+ public float PlayerMoveSpeed { get; set; } = 400f;
+ public int PlayerMaxHealth { get; set; } = 1000;
+ public int PlayerMaxMana { get; set; } = 500;
+ public float PlayerHealthRegen { get; set; } = 5f;
+ public float PlayerManaRegen { get; set; } = 10f;
+
+ // Enemies
+ public int TargetEnemyCount { get; set; } = 25;
+ public float EnemyAggroRange { get; set; } = 600f;
+ public float EnemyAttackRange { get; set; } = 100f;
+ public float EnemyMoveSpeedFactor { get; set; } = 0.75f;
+ public int EnemyBaseHealth { get; set; } = 200;
+ public int EnemyAttackDamage { get; set; } = 30;
+ public float EnemyAttackCooldown { get; set; } = 1.5f;
+ public float EnemyDespawnTime { get; set; } = 2f;
+ public float EnemyRespawnTime { get; set; } = 5f;
+ public float EnemyWanderRadius { get; set; } = 200f;
+
+ // Skills
+ public float MeleeRange { get; set; } = 150f;
+ public float MeleeConeAngle { get; set; } = 120f;
+ public float AoeRadius { get; set; } = 250f;
+ public float ProjectileSpeed { get; set; } = 1200f;
+ public float ProjectileRange { get; set; } = 800f;
+ public float ProjectileHitRadius { get; set; } = 80f;
+ public int SkillBaseDamage { get; set; } = 200;
+
+ // Simulation
+ public float SpeedMultiplier { get; set; } = 1f;
+ public bool IsPaused { get; set; }
+
+ // Rarity distribution (must sum to 1.0)
+ public float NormalChance { get; set; } = 0.70f;
+ public float MagicChance { get; set; } = 0.20f;
+ public float RareChance { get; set; } = 0.08f;
+ public float UniqueChance { get; set; } = 0.02f;
+}
diff --git a/src/Nexus.Simulator/Nexus.Simulator.csproj b/src/Nexus.Simulator/Nexus.Simulator.csproj
new file mode 100644
index 0000000..9161be8
--- /dev/null
+++ b/src/Nexus.Simulator/Nexus.Simulator.csproj
@@ -0,0 +1,23 @@
+
+
+ Exe
+ net8.0-windows10.0.19041.0
+ enable
+ enable
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Nexus.Simulator/Program.cs b/src/Nexus.Simulator/Program.cs
new file mode 100644
index 0000000..30330f0
--- /dev/null
+++ b/src/Nexus.Simulator/Program.cs
@@ -0,0 +1,264 @@
+using System.Numerics;
+using ImGuiNET;
+using Nexus.Core;
+using Nexus.Data;
+using Nexus.Pathfinding;
+using Nexus.Simulator.Bridge;
+using Nexus.Simulator.Config;
+using Nexus.Simulator.Rendering;
+using Nexus.Simulator.World;
+using Nexus.Systems;
+using Serilog;
+using Veldrid;
+using Veldrid.Sdl2;
+using Veldrid.StartupUtilities;
+
+Log.Logger = new LoggerConfiguration()
+ .MinimumLevel.Information()
+ .WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}")
+ .CreateLogger();
+
+Log.Information("Nexus Simulator starting...");
+
+// ── Configuration ──
+var simConfig = new SimConfig();
+var botConfig = new BotConfig
+{
+ WorldToGrid = simConfig.WorldToGrid,
+ LogicTickRateHz = 60,
+};
+
+// ── Create simulation world ──
+var world = new SimWorld(simConfig);
+var cache = new GameDataCache();
+var input = new SimInputController(world);
+var poller = new SimPoller(world, input, cache, simConfig);
+var nav = new NavigationController(botConfig);
+
+// ── Create systems (same as BotEngine, minus AreaProgression) ──
+var systems = new List
+{
+ new ThreatSystem { WorldToGrid = botConfig.WorldToGrid },
+ new MovementSystem
+ {
+ SafeDistance = botConfig.SafeDistance,
+ RepulsionWeight = botConfig.RepulsionWeight,
+ WorldToGrid = botConfig.WorldToGrid,
+ },
+ new NavigationSystem
+ {
+ WorldToGrid = botConfig.WorldToGrid,
+ WaypointReachedDistance = botConfig.WaypointReachedDistance,
+ },
+ new CombatSystem(botConfig),
+ new ResourceSystem(botConfig),
+ new LootSystem(),
+};
+
+// Apply a default profile with configured skills
+var profile = new CharacterProfile
+{
+ Name = "SimPlayer",
+ Skills =
+ [
+ new() { SlotIndex = 0, Label = "LMB", InputType = SkillInputType.LeftClick, Priority = 0, RangeMax = 150f, RequiresTarget = true },
+ new() { SlotIndex = 1, Label = "RMB", InputType = SkillInputType.RightClick, Priority = 1, RangeMax = 150f, RequiresTarget = true },
+ new() { SlotIndex = 3, Label = "Q", InputType = SkillInputType.KeyPress, ScanCode = 0x10, Priority = 3, RangeMax = 600f, CooldownMs = 500, MinMonstersInRange = 2 },
+ new() { SlotIndex = 4, Label = "E", InputType = SkillInputType.KeyPress, ScanCode = 0x12, Priority = 4, RangeMax = 800f, CooldownMs = 300 },
+ ],
+ Combat = new CombatSettings
+ {
+ GlobalCooldownMs = 400,
+ AttackRange = 600f,
+ },
+};
+
+// Apply profile to systems that need it
+foreach (var sys in systems)
+{
+ if (sys is CombatSystem combat) combat.ApplyProfile(profile);
+ if (sys is ResourceSystem resource) resource.ApplyProfile(profile);
+}
+
+// ── Start simulation poller ──
+poller.Start();
+
+// ── Start exploring ──
+nav.Explore();
+
+// ── Bot logic thread ──
+var actionQueue = new ActionQueue();
+var botRunning = true;
+
+var botThread = new Thread(() =>
+{
+ var sw = System.Diagnostics.Stopwatch.StartNew();
+ var intervalMs = 1000.0 / botConfig.LogicTickRateHz;
+
+ while (botRunning)
+ {
+ try
+ {
+ var state = cache.LatestState;
+ if (state is not null && !state.IsLoading && !state.IsEscapeOpen)
+ {
+ // Enrich
+ GameStateEnricher.Enrich(state);
+
+ // Clear and run systems
+ actionQueue.Clear();
+ nav.Update(state);
+
+ foreach (var sys in systems)
+ {
+ if (sys.IsEnabled)
+ sys.Update(state, actionQueue);
+ }
+
+ // Nav direction
+ if (nav.DesiredDirection.HasValue)
+ actionQueue.Submit(new MoveAction(SystemPriority.Navigation, nav.DesiredDirection.Value));
+
+ // Resolve and execute
+ var resolved = actionQueue.Resolve();
+ ExecuteActions(resolved, state, input);
+ }
+ }
+ catch (Exception ex)
+ {
+ Log.Debug(ex, "Bot logic error");
+ }
+
+ var elapsed = sw.Elapsed.TotalMilliseconds;
+ var sleep = intervalMs - (elapsed % intervalMs);
+ if (sleep > 1)
+ Thread.Sleep((int)sleep);
+ }
+})
+{
+ Name = "Nexus.BotLogic",
+ IsBackground = true,
+};
+botThread.Start();
+
+// ── Veldrid + ImGui window ──
+var windowInfo = new WindowCreateInfo
+{
+ X = 100,
+ Y = 100,
+ WindowWidth = 1600,
+ WindowHeight = 1000,
+ WindowTitle = "Nexus Simulator",
+};
+
+var window = VeldridStartup.CreateWindow(ref windowInfo);
+var gd = VeldridStartup.CreateGraphicsDevice(window, new GraphicsDeviceOptions
+{
+ PreferStandardClipSpaceYDirection = true,
+ PreferDepthRangeZeroToOne = true,
+ SyncToVerticalBlank = true,
+}, GraphicsBackend.Direct3D11);
+
+var imguiRenderer = new VeldridImGuiRenderer(
+ gd, gd.MainSwapchain.Framebuffer.OutputDescription,
+ window.Width, window.Height);
+
+var renderer = new SimRenderer(simConfig, world, nav, systems);
+var cl = gd.ResourceFactory.CreateCommandList();
+
+window.Resized += () =>
+{
+ gd.MainSwapchain.Resize((uint)window.Width, (uint)window.Height);
+ imguiRenderer.WindowResized(window.Width, window.Height);
+};
+
+// ── Main render loop ──
+var renderSw = System.Diagnostics.Stopwatch.StartNew();
+var lastRenderMs = 0.0;
+
+while (window.Exists)
+{
+ var nowMs = renderSw.Elapsed.TotalMilliseconds;
+ var deltaSeconds = (float)((nowMs - lastRenderMs) / 1000.0);
+ lastRenderMs = nowMs;
+
+ var snapshot = window.PumpEvents();
+ if (!window.Exists) break;
+
+ imguiRenderer.Update(deltaSeconds, snapshot);
+
+ // Render sim world
+ renderer.Render(cache.LatestState);
+
+ cl.Begin();
+ cl.SetFramebuffer(gd.MainSwapchain.Framebuffer);
+ cl.ClearColorTarget(0, new RgbaFloat(0.05f, 0.05f, 0.08f, 1f));
+ imguiRenderer.Render(gd, cl);
+ cl.End();
+ gd.SubmitCommands(cl);
+ gd.SwapBuffers(gd.MainSwapchain);
+}
+
+// ── Cleanup ──
+botRunning = false;
+botThread.Join(2000);
+poller.Dispose();
+cl.Dispose();
+imguiRenderer.Dispose();
+gd.Dispose();
+Log.Information("Nexus Simulator stopped.");
+
+// ── Helper: Execute bot actions via SimInputController ──
+static void ExecuteActions(List resolved, GameState state, SimInputController input)
+{
+ foreach (var action in resolved)
+ {
+ switch (action)
+ {
+ case MoveAction move:
+ // MovementKeyTracker equivalent — convert direction to WASD key presses
+ // The SimInputController interprets these directly
+ const float cos45 = 0.70710678f;
+ const float sin45 = 0.70710678f;
+ var sx = move.Direction.X * cos45 - move.Direction.Y * sin45;
+ var sy = move.Direction.X * sin45 + move.Direction.Y * cos45;
+
+ const float threshold = 0.3f;
+ if (sy > threshold) input.KeyDown(0x11); else input.KeyUp(0x11); // W
+ if (sy < -threshold) input.KeyDown(0x1F); else input.KeyUp(0x1F); // S
+ if (sx > threshold) input.KeyDown(0x20); else input.KeyUp(0x20); // D
+ if (sx < -threshold) input.KeyDown(0x1E); else input.KeyUp(0x1E); // A
+ break;
+
+ case CastAction cast:
+ if (cast.TargetScreenPos.HasValue)
+ input.SmoothMoveTo((int)cast.TargetScreenPos.Value.X, (int)cast.TargetScreenPos.Value.Y);
+ input.KeyPress(cast.SkillScanCode);
+ break;
+
+ case FlaskAction flask:
+ input.KeyPress(flask.FlaskScanCode);
+ break;
+
+ case ClickAction click:
+ var cx = (int)click.ScreenPosition.X;
+ var cy = (int)click.ScreenPosition.Y;
+ switch (click.Type)
+ {
+ case ClickType.Left: input.LeftClick(cx, cy); break;
+ case ClickType.Right: input.RightClick(cx, cy); break;
+ case ClickType.Middle: input.MiddleClick(cx, cy); break;
+ }
+ break;
+
+ case KeyAction key:
+ switch (key.Type)
+ {
+ case KeyActionType.Press: input.KeyPress(key.ScanCode); break;
+ case KeyActionType.Down: input.KeyDown(key.ScanCode); break;
+ case KeyActionType.Up: input.KeyUp(key.ScanCode); break;
+ }
+ break;
+ }
+ }
+}
diff --git a/src/Nexus.Simulator/Rendering/DebugPanel.cs b/src/Nexus.Simulator/Rendering/DebugPanel.cs
new file mode 100644
index 0000000..cbb586b
--- /dev/null
+++ b/src/Nexus.Simulator/Rendering/DebugPanel.cs
@@ -0,0 +1,131 @@
+using System.Numerics;
+using ImGuiNET;
+using Nexus.Core;
+using Nexus.Pathfinding;
+using Nexus.Simulator.Config;
+using Nexus.Simulator.World;
+
+namespace Nexus.Simulator.Rendering;
+
+public class DebugPanel
+{
+ private readonly SimConfig _config;
+ private readonly SimWorld _world;
+ private readonly NavigationController _nav;
+ private readonly IReadOnlyList _systems;
+
+ private int _spawnRarity; // 0=Normal, 1=Magic, 2=Rare, 3=Unique
+
+ public DebugPanel(SimConfig config, SimWorld world, NavigationController nav, IReadOnlyList systems)
+ {
+ _config = config;
+ _world = world;
+ _nav = nav;
+ _systems = systems;
+ }
+
+ public void Draw(GameState? state)
+ {
+ ImGui.Begin("Simulator Controls");
+
+ // Simulation controls
+ if (ImGui.CollapsingHeader("Simulation", ImGuiTreeNodeFlags.DefaultOpen))
+ {
+ var paused = _config.IsPaused;
+ if (ImGui.Checkbox("Paused", ref paused))
+ _config.IsPaused = paused;
+ ImGui.SameLine();
+ if (ImGui.Button("Step"))
+ {
+ _config.IsPaused = false;
+ }
+
+ var speed = _config.SpeedMultiplier;
+ if (ImGui.SliderFloat("Speed", ref speed, 0.1f, 4f, "%.1fx"))
+ _config.SpeedMultiplier = speed;
+
+ if (ImGui.Button("Regenerate Terrain"))
+ _world.RegenerateTerrain();
+ }
+
+ // Player stats
+ if (ImGui.CollapsingHeader("Player", ImGuiTreeNodeFlags.DefaultOpen))
+ {
+ var player = _world.Player;
+ ImGui.Text($"Position: ({player.Position.X:F0}, {player.Position.Y:F0})");
+
+ var hpPct = player.MaxHealth > 0 ? (float)player.Health / player.MaxHealth : 0;
+ ImGui.ProgressBar(hpPct, new Vector2(-1, 0), $"HP: {player.Health}/{player.MaxHealth}");
+
+ var manaPct = player.MaxMana > 0 ? (float)player.Mana / player.MaxMana : 0;
+ ImGui.ProgressBar(manaPct, new Vector2(-1, 0), $"MP: {player.Mana}/{player.MaxMana}");
+ }
+
+ // Enemy stats
+ if (ImGui.CollapsingHeader("Enemies", ImGuiTreeNodeFlags.DefaultOpen))
+ {
+ var alive = _world.Enemies.Count(e => e.IsAlive);
+ var dead = _world.Enemies.Count(e => !e.IsAlive);
+ var chasing = _world.Enemies.Count(e => e.AiState == EnemyAiState.Chasing);
+ var attacking = _world.Enemies.Count(e => e.AiState == EnemyAiState.Attacking);
+
+ ImGui.Text($"Total: {_world.Enemies.Count} Alive: {alive} Dead: {dead}");
+ ImGui.Text($"Chasing: {chasing} Attacking: {attacking}");
+
+ ImGui.Separator();
+ ImGui.Text("Spawn Enemy:");
+ string[] rarities = ["Normal", "Magic", "Rare", "Unique"];
+ ImGui.Combo("Rarity", ref _spawnRarity, rarities, rarities.Length);
+ if (ImGui.Button("Spawn at Player"))
+ {
+ var rarity = (MonsterRarity)_spawnRarity;
+ var offset = new Vector2(200, 0);
+ _world.SpawnEnemyAt(_world.Player.Position + offset, rarity);
+ }
+ }
+
+ // Navigation
+ if (ImGui.CollapsingHeader("Navigation"))
+ {
+ ImGui.Text($"Mode: {_nav.Mode}");
+ ImGui.Text($"Status: {_nav.Status}");
+ ImGui.Text($"Direction: {(_nav.DesiredDirection.HasValue ? $"({_nav.DesiredDirection.Value.X:F2}, {_nav.DesiredDirection.Value.Y:F2})" : "none")}");
+
+ var path = _nav.CurrentPath;
+ ImGui.Text($"Path: {path?.Count ?? 0} waypoints");
+ ImGui.Text($"Exploration complete: {_nav.IsExplorationComplete}");
+ }
+
+ // Systems
+ if (ImGui.CollapsingHeader("Systems"))
+ {
+ foreach (var sys in _systems)
+ {
+ var enabled = sys.IsEnabled;
+ if (ImGui.Checkbox(sys.Name, ref enabled))
+ sys.IsEnabled = enabled;
+ }
+ }
+
+ // Threat info
+ if (state is not null && ImGui.CollapsingHeader("Threat"))
+ {
+ ImGui.Text($"Danger: {state.Danger}");
+ var threats = state.Threats;
+ ImGui.Text($"Close: {threats.CloseRange} Mid: {threats.MidRange} Far: {threats.FarRange}");
+ ImGui.Text($"Closest: {threats.ClosestDistance:F0}");
+ ImGui.Text($"Has Rare/Unique: {threats.HasRareOrUnique}");
+ }
+
+ // Action queue
+ if (state is not null && ImGui.CollapsingHeader("State"))
+ {
+ ImGui.Text($"Tick: {state.TickNumber}");
+ ImGui.Text($"Entities: {state.Entities.Count}");
+ ImGui.Text($"Hostile: {state.HostileMonsters.Count}");
+ ImGui.Text($"Nearest: {state.NearestEnemies.Count}");
+ }
+
+ ImGui.End();
+ }
+}
diff --git a/src/Nexus.Simulator/Rendering/EffectRenderer.cs b/src/Nexus.Simulator/Rendering/EffectRenderer.cs
new file mode 100644
index 0000000..45a8cb6
--- /dev/null
+++ b/src/Nexus.Simulator/Rendering/EffectRenderer.cs
@@ -0,0 +1,92 @@
+using System.Numerics;
+using ImGuiNET;
+using Nexus.Simulator.World;
+
+namespace Nexus.Simulator.Rendering;
+
+public static class EffectRenderer
+{
+ public static void DrawEffects(ImDrawListPtr drawList, List effects,
+ Vector2 viewOffset, float zoom, Vector2 canvasOrigin, float worldToGrid)
+ {
+ foreach (var effect in effects)
+ {
+ var alpha = (byte)(255 * (1f - effect.Progress));
+ var originScreen = canvasOrigin + viewOffset + effect.Origin * worldToGrid * zoom;
+ var targetScreen = canvasOrigin + viewOffset + effect.TargetPosition * worldToGrid * zoom;
+
+ switch (effect.Type)
+ {
+ case SkillEffectType.Melee:
+ DrawMeleeCone(drawList, originScreen, targetScreen,
+ effect.Radius * worldToGrid * zoom, effect.ConeAngle, alpha);
+ break;
+
+ case SkillEffectType.Aoe:
+ DrawAoeCircle(drawList, targetScreen,
+ effect.Radius * worldToGrid * zoom, alpha);
+ break;
+
+ case SkillEffectType.Projectile:
+ DrawProjectileLine(drawList, originScreen, targetScreen, alpha);
+ break;
+ }
+ }
+ }
+
+ public static void DrawProjectiles(ImDrawListPtr drawList, List projectiles,
+ Vector2 viewOffset, float zoom, Vector2 canvasOrigin, float worldToGrid)
+ {
+ foreach (var proj in projectiles)
+ {
+ var pos = canvasOrigin + viewOffset + proj.Position * worldToGrid * zoom;
+ var radius = proj.HitRadius * worldToGrid * zoom * 0.3f;
+ drawList.AddCircleFilled(pos, Math.Max(3f, radius), 0xFF00DDFF);
+ drawList.AddCircle(pos, Math.Max(4f, radius + 1), 0xFF00AAFF);
+ }
+ }
+
+ private static void DrawMeleeCone(ImDrawListPtr drawList, Vector2 origin, Vector2 target,
+ float radius, float coneAngle, byte alpha)
+ {
+ var dir = target - origin;
+ if (dir.LengthSquared() < 1f) return;
+ dir = Vector2.Normalize(dir);
+
+ var halfAngle = coneAngle * MathF.PI / 360f;
+ var segments = 12;
+ var color = (uint)(alpha << 24) | 0x00FF4444;
+
+ // Draw cone as triangle fan
+ var prevPoint = origin + Rotate(dir, -halfAngle) * radius;
+ for (var i = 1; i <= segments; i++)
+ {
+ var t = (float)i / segments;
+ var angle = -halfAngle + t * halfAngle * 2;
+ var point = origin + Rotate(dir, angle) * radius;
+ drawList.AddTriangleFilled(origin, prevPoint, point, color);
+ prevPoint = point;
+ }
+ }
+
+ private static void DrawAoeCircle(ImDrawListPtr drawList, Vector2 center, float radius, byte alpha)
+ {
+ var fillColor = (uint)(alpha / 2 << 24) | 0x004488FF;
+ var borderColor = (uint)(alpha << 24) | 0x006688FF;
+ drawList.AddCircleFilled(center, radius, fillColor);
+ drawList.AddCircle(center, radius, borderColor, 0, 2f);
+ }
+
+ private static void DrawProjectileLine(ImDrawListPtr drawList, Vector2 from, Vector2 to, byte alpha)
+ {
+ var color = (uint)(alpha << 24) | 0x0000DDFF;
+ drawList.AddLine(from, to, color, 2f);
+ }
+
+ private static Vector2 Rotate(Vector2 v, float radians)
+ {
+ var cos = MathF.Cos(radians);
+ var sin = MathF.Sin(radians);
+ return new Vector2(v.X * cos - v.Y * sin, v.X * sin + v.Y * cos);
+ }
+}
diff --git a/src/Nexus.Simulator/Rendering/EntityRenderer.cs b/src/Nexus.Simulator/Rendering/EntityRenderer.cs
new file mode 100644
index 0000000..52aaac1
--- /dev/null
+++ b/src/Nexus.Simulator/Rendering/EntityRenderer.cs
@@ -0,0 +1,86 @@
+using System.Numerics;
+using ImGuiNET;
+using Nexus.Core;
+using Nexus.Simulator.World;
+
+namespace Nexus.Simulator.Rendering;
+
+public static class EntityRenderer
+{
+ public static void DrawPlayer(ImDrawListPtr drawList, SimPlayer player,
+ Vector2 viewOffset, float zoom, Vector2 canvasOrigin, float worldToGrid)
+ {
+ var gridPos = player.Position * worldToGrid;
+ var screenPos = canvasOrigin + viewOffset + gridPos * zoom;
+
+ var radius = 8f;
+ drawList.AddCircleFilled(screenPos, radius, 0xFF00FF00); // Green
+ drawList.AddCircle(screenPos, radius + 1, 0xFF00AA00);
+
+ // Health bar above player
+ DrawHealthBar(drawList, screenPos - new Vector2(15, radius + 8), 30, 4,
+ player.Health, player.MaxHealth, 0xFF00DD00);
+
+ // Mana bar
+ DrawHealthBar(drawList, screenPos - new Vector2(15, radius + 14), 30, 3,
+ player.Mana, player.MaxMana, 0xFFDD6600);
+ }
+
+ public static void DrawEnemies(ImDrawListPtr drawList, List enemies,
+ Vector2 viewOffset, float zoom, Vector2 canvasOrigin, float worldToGrid,
+ Vector2 canvasMin, Vector2 canvasMax)
+ {
+ foreach (var enemy in enemies)
+ {
+ var gridPos = enemy.Position * worldToGrid;
+ var screenPos = canvasOrigin + viewOffset + gridPos * zoom;
+
+ // Cull off-screen
+ if (screenPos.X < canvasMin.X - 20 || screenPos.X > canvasMax.X + 20 ||
+ screenPos.Y < canvasMin.Y - 20 || screenPos.Y > canvasMax.Y + 20)
+ continue;
+
+ var (color, radius) = enemy.Rarity switch
+ {
+ MonsterRarity.Unique => (0xFF00AAFF, 10f), // Orange
+ MonsterRarity.Rare => (0xFF00FFFF, 8f), // Yellow
+ MonsterRarity.Magic => (0xFFFF8800, 6f), // Blue
+ _ => (0xFFCCCCCC, 5f), // White
+ };
+
+ if (!enemy.IsAlive)
+ {
+ color = 0xFF444444;
+ radius *= 0.7f;
+ }
+
+ drawList.AddCircleFilled(screenPos, radius, color);
+
+ if (enemy.AiState == EnemyAiState.Chasing)
+ drawList.AddCircle(screenPos, radius + 2, 0xFF0000FF); // Red ring when chasing
+ else if (enemy.AiState == EnemyAiState.Attacking)
+ drawList.AddCircle(screenPos, radius + 3, 0xFF0000FF, 0, 3f);
+
+ // Health bar
+ if (enemy.IsAlive && enemy.Health < enemy.MaxHealth)
+ {
+ DrawHealthBar(drawList, screenPos - new Vector2(12, radius + 6), 24, 3,
+ enemy.Health, enemy.MaxHealth, 0xFF0000FF);
+ }
+ }
+ }
+
+ private static void DrawHealthBar(ImDrawListPtr drawList, Vector2 pos, float width, float height,
+ int current, int max, uint color)
+ {
+ if (max <= 0) return;
+ var pct = (float)current / max;
+
+ // Background
+ drawList.AddRectFilled(pos, pos + new Vector2(width, height), 0xFF000000);
+ // Fill
+ drawList.AddRectFilled(pos, pos + new Vector2(width * pct, height), color);
+ // Border
+ drawList.AddRect(pos, pos + new Vector2(width, height), 0xFF666666);
+ }
+}
diff --git a/src/Nexus.Simulator/Rendering/PathRenderer.cs b/src/Nexus.Simulator/Rendering/PathRenderer.cs
new file mode 100644
index 0000000..66335b7
--- /dev/null
+++ b/src/Nexus.Simulator/Rendering/PathRenderer.cs
@@ -0,0 +1,37 @@
+using System.Numerics;
+using ImGuiNET;
+using Nexus.Pathfinding;
+
+namespace Nexus.Simulator.Rendering;
+
+public static class PathRenderer
+{
+ public static void Draw(ImDrawListPtr drawList, NavigationController nav,
+ Vector2 viewOffset, float zoom, Vector2 canvasOrigin, float worldToGrid)
+ {
+ var path = nav.CurrentPath;
+ if (path is null || path.Count < 2) return;
+
+ for (var i = 0; i < path.Count - 1; i++)
+ {
+ var a = canvasOrigin + viewOffset + path[i] * worldToGrid * zoom;
+ var b = canvasOrigin + viewOffset + path[i + 1] * worldToGrid * zoom;
+ drawList.AddLine(a, b, 0xFFFFFF00, 2f); // Cyan
+ }
+
+ // Draw waypoint dots
+ foreach (var wp in path)
+ {
+ var pos = canvasOrigin + viewOffset + wp * worldToGrid * zoom;
+ drawList.AddCircleFilled(pos, 3f, 0xFFFFFF00);
+ }
+ }
+
+ public static void DrawExploredOverlay(ImDrawListPtr drawList,
+ bool[]? exploredGrid, int exploredWidth, int exploredHeight,
+ Vector2 viewOffset, float zoom, Vector2 canvasOrigin, Vector2 canvasSize)
+ {
+ // Already handled in TerrainRenderer via brightness difference
+ // This method is a placeholder for additional explore visualization
+ }
+}
diff --git a/src/Nexus.Simulator/Rendering/SimRenderer.cs b/src/Nexus.Simulator/Rendering/SimRenderer.cs
new file mode 100644
index 0000000..c8bae7c
--- /dev/null
+++ b/src/Nexus.Simulator/Rendering/SimRenderer.cs
@@ -0,0 +1,134 @@
+using System.Numerics;
+using ImGuiNET;
+using Nexus.Core;
+using Nexus.Pathfinding;
+using Nexus.Simulator.Config;
+using Nexus.Simulator.World;
+
+namespace Nexus.Simulator.Rendering;
+
+///
+/// Main renderer: draws the top-down game world viewport using ImGui draw lists.
+///
+public class SimRenderer
+{
+ private readonly SimConfig _config;
+ private readonly SimWorld _world;
+ private readonly NavigationController _nav;
+ private readonly DebugPanel _debugPanel;
+
+ // Camera
+ private Vector2 _viewOffset;
+ private float _zoom = 2f; // pixels per grid cell
+
+ public SimRenderer(SimConfig config, SimWorld world, NavigationController nav,
+ IReadOnlyList systems)
+ {
+ _config = config;
+ _world = world;
+ _nav = nav;
+ _debugPanel = new DebugPanel(config, world, nav, systems);
+
+ // Center view on player
+ CenterOnPlayer();
+ }
+
+ public void Render(GameState? state)
+ {
+ // Debug panel (side window)
+ _debugPanel.Draw(state);
+
+ // Main viewport
+ ImGui.SetNextWindowPos(Vector2.Zero, ImGuiCond.FirstUseEver);
+ ImGui.SetNextWindowSize(new Vector2(1200, 900), ImGuiCond.FirstUseEver);
+ ImGui.Begin("Simulator", ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoScrollWithMouse);
+
+ var canvasOrigin = ImGui.GetCursorScreenPos();
+ var canvasSize = ImGui.GetContentRegionAvail();
+
+ // Handle input
+ HandleInput(canvasOrigin, canvasSize);
+
+ // Center camera on player
+ CenterOnPlayer(canvasSize);
+
+ var drawList = ImGui.GetWindowDrawList();
+
+ // Clip to canvas
+ drawList.PushClipRect(canvasOrigin, canvasOrigin + canvasSize);
+
+ // 1. Terrain
+ TerrainRenderer.Draw(drawList, _world.Terrain, _viewOffset, _zoom, canvasOrigin, canvasSize,
+ _nav.ExploredGrid, _nav.ExploredWidth, _nav.ExploredHeight);
+
+ // 2. Path
+ PathRenderer.Draw(drawList, _nav, _viewOffset, _zoom, canvasOrigin, _config.WorldToGrid);
+
+ // 3. Effects
+ EffectRenderer.DrawEffects(drawList, _world.ActiveEffects, _viewOffset, _zoom, canvasOrigin, _config.WorldToGrid);
+ EffectRenderer.DrawProjectiles(drawList, _world.Projectiles, _viewOffset, _zoom, canvasOrigin, _config.WorldToGrid);
+
+ // 4. Enemies
+ EntityRenderer.DrawEnemies(drawList, _world.Enemies, _viewOffset, _zoom, canvasOrigin, _config.WorldToGrid,
+ canvasOrigin, canvasOrigin + canvasSize);
+
+ // 5. Player
+ EntityRenderer.DrawPlayer(drawList, _world.Player, _viewOffset, _zoom, canvasOrigin, _config.WorldToGrid);
+
+ drawList.PopClipRect();
+
+ // Minimap (bottom-right corner)
+ var minimapSize = 150f;
+ var minimapOrigin = canvasOrigin + canvasSize - new Vector2(minimapSize + 10, minimapSize + 10);
+ var playerGridPos = _world.Player.Position * _config.WorldToGrid;
+ TerrainRenderer.DrawMinimap(drawList, _world.Terrain, playerGridPos, minimapOrigin, minimapSize);
+
+ // HUD text
+ DrawHud(drawList, canvasOrigin, state);
+
+ ImGui.End();
+ }
+
+ private void CenterOnPlayer(Vector2? canvasSize = null)
+ {
+ var cs = canvasSize ?? new Vector2(1200, 900);
+ var playerGrid = _world.Player.Position * _config.WorldToGrid;
+ _viewOffset = cs * 0.5f - playerGrid * _zoom;
+ }
+
+ private void HandleInput(Vector2 canvasOrigin, Vector2 canvasSize)
+ {
+ if (!ImGui.IsWindowHovered()) return;
+
+ var io = ImGui.GetIO();
+
+ // Scroll to zoom
+ if (io.MouseWheel != 0)
+ {
+ var mousePos = io.MousePos - canvasOrigin;
+ var worldBeforeZoom = (mousePos - _viewOffset) / _zoom;
+
+ _zoom *= io.MouseWheel > 0 ? 1.15f : 1f / 1.15f;
+ _zoom = Math.Clamp(_zoom, 0.2f, 20f);
+
+ _viewOffset = mousePos - worldBeforeZoom * _zoom;
+ }
+ }
+
+ private void DrawHud(ImDrawListPtr drawList, Vector2 canvasOrigin, GameState? state)
+ {
+ var textPos = canvasOrigin + new Vector2(10, 10);
+ var color = 0xFFFFFFFF;
+
+ drawList.AddText(textPos, color, $"Nav: {_nav.Mode} - {_nav.Status}");
+ textPos.Y += 16;
+
+ if (state is not null)
+ {
+ drawList.AddText(textPos, color, $"Danger: {state.Danger} Enemies: {state.HostileMonsters.Count}");
+ textPos.Y += 16;
+ }
+
+ drawList.AddText(textPos, color, $"Zoom: {_zoom:F1}x Tick: {_world.TickNumber}");
+ }
+}
diff --git a/src/Nexus.Simulator/Rendering/TerrainRenderer.cs b/src/Nexus.Simulator/Rendering/TerrainRenderer.cs
new file mode 100644
index 0000000..6722a74
--- /dev/null
+++ b/src/Nexus.Simulator/Rendering/TerrainRenderer.cs
@@ -0,0 +1,99 @@
+using System.Numerics;
+using ImGuiNET;
+using Nexus.Core;
+
+namespace Nexus.Simulator.Rendering;
+
+public static class TerrainRenderer
+{
+ ///
+ /// Draws the walkability grid as colored rectangles on the ImGui draw list.
+ /// Only draws cells visible in the current viewport for performance.
+ ///
+ public static void Draw(ImDrawListPtr drawList, WalkabilitySnapshot terrain,
+ Vector2 viewOffset, float zoom, Vector2 canvasOrigin, Vector2 canvasSize,
+ bool[]? exploredGrid = null, int exploredWidth = 0, int exploredHeight = 0)
+ {
+ var cellSize = zoom;
+ if (cellSize < 0.5f) return; // Too zoomed out to draw individual cells
+
+ // Visible range in grid coords
+ var minGx = Math.Max(0, (int)(-viewOffset.X / cellSize));
+ var minGy = Math.Max(0, (int)(-viewOffset.Y / cellSize));
+ var maxGx = Math.Min(terrain.Width - 1, (int)((-viewOffset.X + canvasSize.X) / cellSize));
+ var maxGy = Math.Min(terrain.Height - 1, (int)((-viewOffset.Y + canvasSize.Y) / cellSize));
+
+ // Skip pixels if too many cells
+ var step = 1;
+ if (cellSize < 2f) step = 4;
+ else if (cellSize < 4f) step = 2;
+
+ for (var gy = minGy; gy <= maxGy; gy += step)
+ for (var gx = minGx; gx <= maxGx; gx += step)
+ {
+ var screenX = canvasOrigin.X + viewOffset.X + gx * cellSize;
+ var screenY = canvasOrigin.Y + viewOffset.Y + gy * cellSize;
+
+ var w = terrain.IsWalkable(gx, gy);
+ uint color;
+
+ if (!w)
+ {
+ color = 0xFF1A1A2E; // Dark wall
+ }
+ else
+ {
+ var explored = exploredGrid is not null
+ && gx < exploredWidth && gy < exploredHeight
+ && exploredGrid[gy * exploredWidth + gx];
+
+ color = explored ? 0xFF3D3D5C : 0xFF2A2A3F; // Brighter if explored
+ }
+
+ var size = cellSize * step;
+ drawList.AddRectFilled(
+ new Vector2(screenX, screenY),
+ new Vector2(screenX + size, screenY + size),
+ color);
+ }
+ }
+
+ ///
+ /// Draws a minimap in the corner.
+ ///
+ public static void DrawMinimap(ImDrawListPtr drawList, WalkabilitySnapshot terrain,
+ Vector2 playerGridPos, Vector2 minimapOrigin, float minimapSize)
+ {
+ var scaleX = minimapSize / terrain.Width;
+ var scaleY = minimapSize / terrain.Height;
+ var scale = Math.Min(scaleX, scaleY);
+
+ // Background
+ drawList.AddRectFilled(minimapOrigin,
+ minimapOrigin + new Vector2(terrain.Width * scale, terrain.Height * scale),
+ 0xFF0A0A15);
+
+ // Draw walkable cells (sampled)
+ var step = Math.Max(1, terrain.Width / 200);
+ for (var gy = 0; gy < terrain.Height; gy += step)
+ for (var gx = 0; gx < terrain.Width; gx += step)
+ {
+ if (!terrain.IsWalkable(gx, gy)) continue;
+ var px = minimapOrigin.X + gx * scale;
+ var py = minimapOrigin.Y + gy * scale;
+ drawList.AddRectFilled(
+ new Vector2(px, py),
+ new Vector2(px + scale * step, py + scale * step),
+ 0xFF2A2A3F);
+ }
+
+ // Player dot
+ var playerPx = minimapOrigin + playerGridPos * scale;
+ drawList.AddCircleFilled(playerPx, 3f, 0xFF00FF00);
+
+ // Border
+ drawList.AddRect(minimapOrigin,
+ minimapOrigin + new Vector2(terrain.Width * scale, terrain.Height * scale),
+ 0xFF666666);
+ }
+}
diff --git a/src/Nexus.Simulator/Rendering/VeldridImGuiRenderer.cs b/src/Nexus.Simulator/Rendering/VeldridImGuiRenderer.cs
new file mode 100644
index 0000000..85eaf71
--- /dev/null
+++ b/src/Nexus.Simulator/Rendering/VeldridImGuiRenderer.cs
@@ -0,0 +1,482 @@
+using System.Numerics;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using ImGuiNET;
+using Veldrid;
+
+namespace Nexus.Simulator.Rendering;
+
+///
+/// Minimal ImGui renderer for Veldrid 4.9.0 on D3D11.
+/// Based on the canonical veldrid-imgui integration.
+///
+public sealed class VeldridImGuiRenderer : IDisposable
+{
+ private readonly GraphicsDevice _gd;
+
+ // GPU resources
+ private DeviceBuffer _vertexBuffer = null!;
+ private DeviceBuffer _indexBuffer = null!;
+ private DeviceBuffer _projMatrixBuffer = null!;
+ private Texture _fontTexture = null!;
+ private TextureView _fontTextureView = null!;
+ private ResourceSet _fontResourceSet = null!;
+ private ResourceLayout _layout = null!;
+ private ResourceLayout _textureLayout = null!;
+ private Pipeline _pipeline = null!;
+ private Shader[] _shaders = null!;
+
+ private int _windowWidth;
+ private int _windowHeight;
+ private readonly IntPtr _fontAtlasId = (IntPtr)1;
+
+ // Per-texture resource sets
+ private readonly Dictionary _resourceSets = new();
+
+ public VeldridImGuiRenderer(GraphicsDevice gd, OutputDescription outputDescription, int width, int height)
+ {
+ _gd = gd;
+ _windowWidth = width;
+ _windowHeight = height;
+
+ var context = ImGui.CreateContext();
+ ImGui.SetCurrentContext(context);
+
+ var io = ImGui.GetIO();
+ io.BackendFlags |= ImGuiBackendFlags.RendererHasVtxOffset;
+ io.ConfigFlags |= ImGuiConfigFlags.NavEnableKeyboard;
+ io.DisplaySize = new Vector2(width, height);
+ io.DisplayFramebufferScale = Vector2.One;
+
+ CreateDeviceResources(gd, outputDescription);
+ SetupKeyMappings();
+ }
+
+ public void WindowResized(int width, int height)
+ {
+ _windowWidth = width;
+ _windowHeight = height;
+ ImGui.GetIO().DisplaySize = new Vector2(width, height);
+ }
+
+ public void Update(float deltaSeconds, InputSnapshot snapshot)
+ {
+ var io = ImGui.GetIO();
+ io.DisplaySize = new Vector2(_windowWidth, _windowHeight);
+ io.DeltaTime = deltaSeconds > 0 ? deltaSeconds : 1f / 60f;
+
+ UpdateInput(snapshot);
+
+ ImGui.NewFrame();
+ }
+
+ public void Render(GraphicsDevice gd, CommandList cl)
+ {
+ ImGui.Render();
+ RenderImDrawData(ImGui.GetDrawData(), gd, cl);
+ }
+
+ private void CreateDeviceResources(GraphicsDevice gd, OutputDescription outputDescription)
+ {
+ var factory = gd.ResourceFactory;
+
+ _vertexBuffer = factory.CreateBuffer(new BufferDescription(10000, BufferUsage.VertexBuffer | BufferUsage.Dynamic));
+ _indexBuffer = factory.CreateBuffer(new BufferDescription(2000, BufferUsage.IndexBuffer | BufferUsage.Dynamic));
+ _projMatrixBuffer = factory.CreateBuffer(new BufferDescription(64, BufferUsage.UniformBuffer | BufferUsage.Dynamic));
+
+ // Create shaders using HLSL
+ _shaders = CreateShaders(gd);
+
+ // Font texture
+ RecreateFontDeviceTexture(gd);
+
+ // Resource layouts
+ _layout = factory.CreateResourceLayout(new ResourceLayoutDescription(
+ new ResourceLayoutElementDescription("ProjectionMatrixBuffer", ResourceKind.UniformBuffer, ShaderStages.Vertex),
+ new ResourceLayoutElementDescription("MainSampler", ResourceKind.Sampler, ShaderStages.Fragment)));
+
+ _textureLayout = factory.CreateResourceLayout(new ResourceLayoutDescription(
+ new ResourceLayoutElementDescription("MainTexture", ResourceKind.TextureReadOnly, ShaderStages.Fragment)));
+
+ // Pipeline
+ var vertexLayout = new VertexLayoutDescription(
+ new VertexElementDescription("in_position", VertexElementSemantic.TextureCoordinate, VertexElementFormat.Float2),
+ new VertexElementDescription("in_texCoord", VertexElementSemantic.TextureCoordinate, VertexElementFormat.Float2),
+ new VertexElementDescription("in_color", VertexElementSemantic.TextureCoordinate, VertexElementFormat.Byte4_Norm));
+
+ var pipelineDesc = new GraphicsPipelineDescription
+ {
+ BlendState = new BlendStateDescription
+ {
+ AttachmentStates = [
+ new BlendAttachmentDescription
+ {
+ BlendEnabled = true,
+ SourceColorFactor = BlendFactor.SourceAlpha,
+ DestinationColorFactor = BlendFactor.InverseSourceAlpha,
+ ColorFunction = BlendFunction.Add,
+ SourceAlphaFactor = BlendFactor.One,
+ DestinationAlphaFactor = BlendFactor.InverseSourceAlpha,
+ AlphaFunction = BlendFunction.Add,
+ },
+ ],
+ },
+ DepthStencilState = new DepthStencilStateDescription(false, false, ComparisonKind.Always),
+ RasterizerState = new RasterizerStateDescription(
+ FaceCullMode.None, PolygonFillMode.Solid, FrontFace.Clockwise,
+ true, true),
+ PrimitiveTopology = PrimitiveTopology.TriangleList,
+ ResourceLayouts = [_layout, _textureLayout],
+ ShaderSet = new ShaderSetDescription([vertexLayout], _shaders),
+ Outputs = outputDescription,
+ };
+
+ _pipeline = factory.CreateGraphicsPipeline(ref pipelineDesc);
+ }
+
+ private void RecreateFontDeviceTexture(GraphicsDevice gd)
+ {
+ var io = ImGui.GetIO();
+ io.Fonts.GetTexDataAsRGBA32(out IntPtr pixels, out int width, out int height, out int bytesPerPixel);
+
+ _fontTexture?.Dispose();
+ _fontTextureView?.Dispose();
+
+ _fontTexture = gd.ResourceFactory.CreateTexture(TextureDescription.Texture2D(
+ (uint)width, (uint)height, 1, 1,
+ PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.Sampled));
+ _fontTexture.Name = "ImGui.NET Font Texture";
+
+ gd.UpdateTexture(_fontTexture, pixels, (uint)(bytesPerPixel * width * height), 0, 0, 0,
+ (uint)width, (uint)height, 1, 0, 0);
+
+ _fontTextureView = gd.ResourceFactory.CreateTextureView(_fontTexture);
+
+ io.Fonts.SetTexID(_fontAtlasId);
+ io.Fonts.ClearTexData();
+
+ // Create resource set for font
+ if (_textureLayout is not null)
+ {
+ _fontResourceSet?.Dispose();
+ _fontResourceSet = gd.ResourceFactory.CreateResourceSet(new ResourceSetDescription(
+ _textureLayout, _fontTextureView));
+ _resourceSets[_fontAtlasId] = _fontResourceSet;
+ }
+ }
+
+ private Shader[] CreateShaders(GraphicsDevice gd)
+ {
+ // For D3D11, use HLSL compiled at runtime
+ // For other backends, we'd need SPIRV
+ var backend = gd.BackendType;
+
+ byte[] vertexShaderBytes;
+ byte[] fragmentShaderBytes;
+
+ if (backend == GraphicsBackend.Direct3D11)
+ {
+ vertexShaderBytes = CompileHlsl(VertexShaderHlsl, "main", "vs_5_0");
+ fragmentShaderBytes = CompileHlsl(FragmentShaderHlsl, "main", "ps_5_0");
+ }
+ else
+ {
+ throw new NotSupportedException($"Backend {backend} not supported. Use Direct3D11.");
+ }
+
+ var vertexShader = gd.ResourceFactory.CreateShader(new ShaderDescription(
+ ShaderStages.Vertex, vertexShaderBytes, "main"));
+ var fragmentShader = gd.ResourceFactory.CreateShader(new ShaderDescription(
+ ShaderStages.Fragment, fragmentShaderBytes, "main"));
+
+ return [vertexShader, fragmentShader];
+ }
+
+ private void RenderImDrawData(ImDrawDataPtr drawData, GraphicsDevice gd, CommandList cl)
+ {
+ if (drawData.CmdListsCount == 0) return;
+
+ // Resize vertex/index buffers if needed
+ var totalVtxSize = (uint)(drawData.TotalVtxCount * Unsafe.SizeOf());
+ var totalIdxSize = (uint)(drawData.TotalIdxCount * sizeof(ushort));
+
+ if (totalVtxSize > _vertexBuffer.SizeInBytes)
+ {
+ _vertexBuffer.Dispose();
+ _vertexBuffer = gd.ResourceFactory.CreateBuffer(new BufferDescription(
+ totalVtxSize * 2, BufferUsage.VertexBuffer | BufferUsage.Dynamic));
+ }
+
+ if (totalIdxSize > _indexBuffer.SizeInBytes)
+ {
+ _indexBuffer.Dispose();
+ _indexBuffer = gd.ResourceFactory.CreateBuffer(new BufferDescription(
+ totalIdxSize * 2, BufferUsage.IndexBuffer | BufferUsage.Dynamic));
+ }
+
+ // Upload vertex/index data
+ uint vtxOffset = 0, idxOffset = 0;
+ for (var i = 0; i < drawData.CmdListsCount; i++)
+ {
+ var cmdList = drawData.CmdLists[i];
+ cl.UpdateBuffer(_vertexBuffer, vtxOffset,
+ cmdList.VtxBuffer.Data, (uint)(cmdList.VtxBuffer.Size * Unsafe.SizeOf()));
+ cl.UpdateBuffer(_indexBuffer, idxOffset,
+ cmdList.IdxBuffer.Data, (uint)(cmdList.IdxBuffer.Size * sizeof(ushort)));
+ vtxOffset += (uint)(cmdList.VtxBuffer.Size * Unsafe.SizeOf());
+ idxOffset += (uint)(cmdList.IdxBuffer.Size * sizeof(ushort));
+ }
+
+ // Update projection matrix
+ var io = ImGui.GetIO();
+ var mvp = Matrix4x4.CreateOrthographicOffCenter(
+ drawData.DisplayPos.X,
+ drawData.DisplayPos.X + drawData.DisplaySize.X,
+ drawData.DisplayPos.Y + drawData.DisplaySize.Y,
+ drawData.DisplayPos.Y,
+ -1f, 1f);
+ cl.UpdateBuffer(_projMatrixBuffer, 0, ref mvp);
+
+ cl.SetVertexBuffer(0, _vertexBuffer);
+ cl.SetIndexBuffer(_indexBuffer, IndexFormat.UInt16);
+ cl.SetPipeline(_pipeline);
+
+ // Create main resource set
+ var mainResourceSet = gd.ResourceFactory.CreateResourceSet(new ResourceSetDescription(
+ _layout, _projMatrixBuffer, gd.PointSampler));
+ cl.SetGraphicsResourceSet(0, mainResourceSet);
+
+ // Draw
+ var clipOff = drawData.DisplayPos;
+ vtxOffset = 0;
+ idxOffset = 0;
+ for (var n = 0; n < drawData.CmdListsCount; n++)
+ {
+ var cmdList = drawData.CmdLists[n];
+ for (var cmdI = 0; cmdI < cmdList.CmdBuffer.Size; cmdI++)
+ {
+ var pcmd = cmdList.CmdBuffer[cmdI];
+
+ if (pcmd.TextureId != IntPtr.Zero)
+ {
+ if (_resourceSets.TryGetValue(pcmd.TextureId, out var rs))
+ cl.SetGraphicsResourceSet(1, rs);
+ }
+
+ var clipRect = pcmd.ClipRect;
+ cl.SetScissorRect(0,
+ (uint)(clipRect.X - clipOff.X),
+ (uint)(clipRect.Y - clipOff.Y),
+ (uint)(clipRect.Z - clipRect.X),
+ (uint)(clipRect.W - clipRect.Y));
+
+ cl.DrawIndexed(pcmd.ElemCount, 1,
+ pcmd.IdxOffset + idxOffset,
+ (int)(pcmd.VtxOffset + vtxOffset),
+ 0);
+ }
+ vtxOffset += (uint)cmdList.VtxBuffer.Size;
+ idxOffset += (uint)cmdList.IdxBuffer.Size;
+ }
+
+ mainResourceSet.Dispose();
+ }
+
+ private void UpdateInput(InputSnapshot snapshot)
+ {
+ var io = ImGui.GetIO();
+
+ io.MousePos = snapshot.MousePosition;
+
+ io.MouseDown[0] = snapshot.IsMouseDown(MouseButton.Left);
+ io.MouseDown[1] = snapshot.IsMouseDown(MouseButton.Right);
+ io.MouseDown[2] = snapshot.IsMouseDown(MouseButton.Middle);
+ io.MouseWheel = snapshot.WheelDelta;
+
+ foreach (var ke in snapshot.KeyEvents)
+ {
+ var imguiKey = ConvertKey(ke.Key);
+ if (imguiKey != ImGuiKey.None)
+ io.AddKeyEvent(imguiKey, ke.Down);
+ }
+
+ foreach (var c in snapshot.KeyCharPresses)
+ io.AddInputCharacter(c);
+ }
+
+ private static ImGuiKey ConvertKey(Key key) => key switch
+ {
+ Key.Tab => ImGuiKey.Tab,
+ Key.Left => ImGuiKey.LeftArrow,
+ Key.Right => ImGuiKey.RightArrow,
+ Key.Up => ImGuiKey.UpArrow,
+ Key.Down => ImGuiKey.DownArrow,
+ Key.Home => ImGuiKey.Home,
+ Key.End => ImGuiKey.End,
+ Key.Delete => ImGuiKey.Delete,
+ Key.BackSpace => ImGuiKey.Backspace,
+ Key.Enter => ImGuiKey.Enter,
+ Key.Escape => ImGuiKey.Escape,
+ Key.Space => ImGuiKey.Space,
+ Key.A => ImGuiKey.A,
+ Key.C => ImGuiKey.C,
+ Key.V => ImGuiKey.V,
+ Key.X => ImGuiKey.X,
+ Key.Y => ImGuiKey.Y,
+ Key.Z => ImGuiKey.Z,
+ _ => ImGuiKey.None,
+ };
+
+ private void SetupKeyMappings()
+ {
+ // ImGui.NET 1.91+ uses the key event API directly, no need for explicit mappings
+ }
+
+ // ── HLSL Shader Sources ──
+
+ private const string VertexShaderHlsl = @"
+cbuffer ProjectionMatrixBuffer : register(b0)
+{
+ float4x4 ProjectionMatrix;
+};
+
+struct VS_INPUT
+{
+ float2 pos : TEXCOORD0;
+ float2 uv : TEXCOORD1;
+ float4 col : TEXCOORD2;
+};
+
+struct PS_INPUT
+{
+ float4 pos : SV_POSITION;
+ float4 col : COLOR0;
+ float2 uv : TEXCOORD0;
+};
+
+PS_INPUT main(VS_INPUT input)
+{
+ PS_INPUT output;
+ output.pos = mul(ProjectionMatrix, float4(input.pos.xy, 0.0, 1.0));
+ output.col = input.col;
+ output.uv = input.uv;
+ return output;
+}
+";
+
+ private const string FragmentShaderHlsl = @"
+Texture2D MainTexture : register(t0);
+SamplerState MainSampler : register(s0);
+
+struct PS_INPUT
+{
+ float4 pos : SV_POSITION;
+ float4 col : COLOR0;
+ float2 uv : TEXCOORD0;
+};
+
+float4 main(PS_INPUT input) : SV_Target
+{
+ float4 texColor = MainTexture.Sample(MainSampler, input.uv);
+ return input.col * texColor;
+}
+";
+
+ // ── D3DCompiler P/Invoke ──
+
+ [DllImport("d3dcompiler_47.dll", CallingConvention = CallingConvention.StdCall)]
+ private static extern int D3DCompile(
+ [MarshalAs(UnmanagedType.LPStr)] string pSrcData,
+ int srcDataSize,
+ [MarshalAs(UnmanagedType.LPStr)] string? pSourceName,
+ IntPtr pDefines,
+ IntPtr pInclude,
+ [MarshalAs(UnmanagedType.LPStr)] string pEntrypoint,
+ [MarshalAs(UnmanagedType.LPStr)] string pTarget,
+ uint flags1,
+ uint flags2,
+ out IntPtr ppCode,
+ out IntPtr ppErrorMsgs);
+
+ [DllImport("d3dcompiler_47.dll", CallingConvention = CallingConvention.StdCall)]
+ private static extern IntPtr D3DGetBlobPart(IntPtr pSrcData, int srcDataSize, int part, uint flags, out IntPtr ppPart);
+
+ // ID3DBlob vtable offsets
+ private static IntPtr BlobGetBufferPointer(IntPtr blob)
+ {
+ var vtable = Marshal.ReadIntPtr(blob);
+ var getBufferPtr = Marshal.ReadIntPtr(vtable, 3 * IntPtr.Size); // IUnknown (3 methods) + GetBufferPointer
+ var del = Marshal.GetDelegateForFunctionPointer(getBufferPtr);
+ return del(blob);
+ }
+
+ private static int BlobGetBufferSize(IntPtr blob)
+ {
+ var vtable = Marshal.ReadIntPtr(blob);
+ var getBufferSize = Marshal.ReadIntPtr(vtable, 4 * IntPtr.Size); // IUnknown (3 methods) + GetBufferPointer + GetBufferSize
+ var del = Marshal.GetDelegateForFunctionPointer(getBufferSize);
+ return del(blob);
+ }
+
+ private static void BlobRelease(IntPtr blob)
+ {
+ var vtable = Marshal.ReadIntPtr(blob);
+ var release = Marshal.ReadIntPtr(vtable, 2 * IntPtr.Size); // IUnknown::Release
+ var del = Marshal.GetDelegateForFunctionPointer(release);
+ del(blob);
+ }
+
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ private delegate IntPtr GetBufferPointerDelegate(IntPtr self);
+
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ private delegate int GetBufferSizeDelegate(IntPtr self);
+
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ private delegate int ReleaseDelegate(IntPtr self);
+
+ private static byte[] CompileHlsl(string source, string entryPoint, string target)
+ {
+ var hr = D3DCompile(source, source.Length, null, IntPtr.Zero, IntPtr.Zero,
+ entryPoint, target, 0, 0, out var codeBlob, out var errorBlob);
+
+ if (hr != 0 || codeBlob == IntPtr.Zero)
+ {
+ var error = "Unknown shader compilation error";
+ if (errorBlob != IntPtr.Zero)
+ {
+ var errorPtr = BlobGetBufferPointer(errorBlob);
+ error = Marshal.PtrToStringAnsi(errorPtr) ?? error;
+ BlobRelease(errorBlob);
+ }
+ throw new InvalidOperationException($"HLSL compilation failed: {error}");
+ }
+
+ if (errorBlob != IntPtr.Zero)
+ BlobRelease(errorBlob);
+
+ var bufferPtr = BlobGetBufferPointer(codeBlob);
+ var bufferSize = BlobGetBufferSize(codeBlob);
+ var result = new byte[bufferSize];
+ Marshal.Copy(bufferPtr, result, 0, bufferSize);
+ BlobRelease(codeBlob);
+ return result;
+ }
+
+ public void Dispose()
+ {
+ _vertexBuffer?.Dispose();
+ _indexBuffer?.Dispose();
+ _projMatrixBuffer?.Dispose();
+ _fontTexture?.Dispose();
+ _fontTextureView?.Dispose();
+ _fontResourceSet?.Dispose();
+ _pipeline?.Dispose();
+ _layout?.Dispose();
+ _textureLayout?.Dispose();
+ foreach (var shader in _shaders)
+ shader?.Dispose();
+ foreach (var rs in _resourceSets.Values)
+ rs?.Dispose();
+ }
+}
diff --git a/src/Nexus.Simulator/World/SimEnemy.cs b/src/Nexus.Simulator/World/SimEnemy.cs
new file mode 100644
index 0000000..95903b4
--- /dev/null
+++ b/src/Nexus.Simulator/World/SimEnemy.cs
@@ -0,0 +1,76 @@
+using System.Numerics;
+using Nexus.Core;
+
+namespace Nexus.Simulator.World;
+
+public enum EnemyAiState
+{
+ Idle,
+ Chasing,
+ Attacking,
+ Dead,
+}
+
+public class SimEnemy
+{
+ private static uint _nextId = 1000;
+
+ public uint Id { get; }
+ public Vector2 Position { get; set; }
+ public int Health { get; set; }
+ public int MaxHealth { get; set; }
+ public MonsterRarity Rarity { get; set; }
+ public EnemyAiState AiState { get; set; } = EnemyAiState.Idle;
+ public float MoveSpeed { get; set; }
+
+ // Timers
+ public float AttackCooldownRemaining { get; set; }
+ public float DespawnTimer { get; set; }
+ public float RespawnTimer { get; set; }
+
+ // Wander
+ public Vector2 WanderTarget { get; set; }
+ public float WanderTimer { get; set; }
+ public Vector2 SpawnPosition { get; set; }
+
+ public bool IsAlive => Health > 0;
+ public bool IsAttacking => AiState == EnemyAiState.Attacking;
+
+ public SimEnemy(Vector2 position, MonsterRarity rarity, int baseHealth, float moveSpeed)
+ {
+ Id = Interlocked.Increment(ref _nextId);
+ Position = position;
+ SpawnPosition = position;
+ Rarity = rarity;
+ MoveSpeed = moveSpeed;
+
+ var hpMultiplier = rarity switch
+ {
+ MonsterRarity.Magic => 1.5f,
+ MonsterRarity.Rare => 3f,
+ MonsterRarity.Unique => 5f,
+ _ => 1f,
+ };
+ MaxHealth = (int)(baseHealth * hpMultiplier);
+ Health = MaxHealth;
+ }
+
+ public void TakeDamage(int damage)
+ {
+ if (!IsAlive) return;
+ Health = Math.Max(0, Health - damage);
+ if (Health <= 0)
+ {
+ AiState = EnemyAiState.Dead;
+ DespawnTimer = 2f;
+ }
+ }
+
+ public MonsterThreatLevel GetThreatLevel() => Rarity switch
+ {
+ MonsterRarity.Magic => MonsterThreatLevel.Magic,
+ MonsterRarity.Rare => MonsterThreatLevel.Rare,
+ MonsterRarity.Unique => MonsterThreatLevel.Unique,
+ _ => MonsterThreatLevel.Normal,
+ };
+}
diff --git a/src/Nexus.Simulator/World/SimPlayer.cs b/src/Nexus.Simulator/World/SimPlayer.cs
new file mode 100644
index 0000000..1ca20ab
--- /dev/null
+++ b/src/Nexus.Simulator/World/SimPlayer.cs
@@ -0,0 +1,58 @@
+using System.Numerics;
+
+namespace Nexus.Simulator.World;
+
+public class SimPlayer
+{
+ public Vector2 Position { get; set; }
+ public int Health { get; set; }
+ public int MaxHealth { get; set; }
+ public int Mana { get; set; }
+ public int MaxMana { get; set; }
+ public float MoveSpeed { get; set; }
+ public float HealthRegen { get; set; }
+ public float ManaRegen { get; set; }
+
+ // Accumulate fractional regen
+ private float _healthRegenAccum;
+ private float _manaRegenAccum;
+
+ public SimPlayer(int maxHealth, int maxMana, float moveSpeed, float healthRegen, float manaRegen)
+ {
+ MaxHealth = maxHealth;
+ MaxMana = maxMana;
+ Health = maxHealth;
+ Mana = maxMana;
+ MoveSpeed = moveSpeed;
+ HealthRegen = healthRegen;
+ ManaRegen = manaRegen;
+ }
+
+ public void Update(float dt)
+ {
+ // Regenerate
+ _healthRegenAccum += HealthRegen * dt;
+ _manaRegenAccum += ManaRegen * dt;
+
+ if (_healthRegenAccum >= 1f)
+ {
+ var amount = (int)_healthRegenAccum;
+ Health = Math.Min(MaxHealth, Health + amount);
+ _healthRegenAccum -= amount;
+ }
+
+ if (_manaRegenAccum >= 1f)
+ {
+ var amount = (int)_manaRegenAccum;
+ Mana = Math.Min(MaxMana, Mana + amount);
+ _manaRegenAccum -= amount;
+ }
+ }
+
+ public void TakeDamage(int damage)
+ {
+ Health = Math.Max(0, Health - damage);
+ }
+
+ public bool IsAlive => Health > 0;
+}
diff --git a/src/Nexus.Simulator/World/SimProjectile.cs b/src/Nexus.Simulator/World/SimProjectile.cs
new file mode 100644
index 0000000..b4199b0
--- /dev/null
+++ b/src/Nexus.Simulator/World/SimProjectile.cs
@@ -0,0 +1,34 @@
+using System.Numerics;
+
+namespace Nexus.Simulator.World;
+
+public class SimProjectile
+{
+ public Vector2 Position { get; set; }
+ public Vector2 Direction { get; set; }
+ public float Speed { get; set; }
+ public float MaxRange { get; set; }
+ public float HitRadius { get; set; }
+ public int Damage { get; set; }
+ public float DistanceTraveled { get; set; }
+ public bool IsExpired { get; set; }
+
+ public SimProjectile(Vector2 origin, Vector2 direction, float speed, float maxRange, float hitRadius, int damage)
+ {
+ Position = origin;
+ Direction = Vector2.Normalize(direction);
+ Speed = speed;
+ MaxRange = maxRange;
+ HitRadius = hitRadius;
+ Damage = damage;
+ }
+
+ public void Update(float dt)
+ {
+ var step = Speed * dt;
+ Position += Direction * step;
+ DistanceTraveled += step;
+ if (DistanceTraveled >= MaxRange)
+ IsExpired = true;
+ }
+}
diff --git a/src/Nexus.Simulator/World/SimSkillEffect.cs b/src/Nexus.Simulator/World/SimSkillEffect.cs
new file mode 100644
index 0000000..073a51f
--- /dev/null
+++ b/src/Nexus.Simulator/World/SimSkillEffect.cs
@@ -0,0 +1,26 @@
+using System.Numerics;
+
+namespace Nexus.Simulator.World;
+
+public enum SkillEffectType
+{
+ Melee,
+ Aoe,
+ Projectile,
+}
+
+public class SimSkillEffect
+{
+ public SkillEffectType Type { get; set; }
+ public Vector2 Origin { get; set; }
+ public Vector2 TargetPosition { get; set; }
+ public float Radius { get; set; }
+ public float ConeAngle { get; set; }
+ public int Damage { get; set; }
+ public float Duration { get; set; } = 0.3f;
+ public float Elapsed { get; set; }
+ public bool Applied { get; set; }
+
+ public bool IsExpired => Elapsed >= Duration;
+ public float Progress => Duration > 0 ? Elapsed / Duration : 1f;
+}
diff --git a/src/Nexus.Simulator/World/SimWorld.cs b/src/Nexus.Simulator/World/SimWorld.cs
new file mode 100644
index 0000000..a35796d
--- /dev/null
+++ b/src/Nexus.Simulator/World/SimWorld.cs
@@ -0,0 +1,432 @@
+using System.Numerics;
+using Nexus.Core;
+using Nexus.Simulator.Config;
+
+namespace Nexus.Simulator.World;
+
+public class SimWorld
+{
+ private readonly SimConfig _config;
+ private readonly Random _rng = new();
+
+ public SimPlayer Player { get; }
+ public List Enemies { get; } = [];
+ public List Projectiles { get; } = [];
+ public List ActiveEffects { get; } = [];
+ public WalkabilitySnapshot Terrain { get; private set; }
+ public long TickNumber { get; private set; }
+
+ // Pending respawns
+ private readonly List<(float timer, MonsterRarity rarity)> _respawnQueue = [];
+
+ // Queued actions from SimInputController
+ public Vector2 MoveDirection { get; set; }
+ public Vector2 MouseWorldPos { get; set; }
+ private readonly Queue<(ushort scanCode, Vector2 targetWorldPos)> _skillQueue = new();
+
+ public SimWorld(SimConfig config)
+ {
+ _config = config;
+ Terrain = TerrainGenerator.Generate(config.TerrainWidth, config.TerrainHeight);
+
+ // Spawn player at center
+ var gridToWorld = 1f / config.WorldToGrid;
+ var (sx, sy) = TerrainGenerator.FindSpawnPosition(Terrain);
+ Player = new SimPlayer(
+ config.PlayerMaxHealth, config.PlayerMaxMana,
+ config.PlayerMoveSpeed, config.PlayerHealthRegen, config.PlayerManaRegen)
+ {
+ Position = new Vector2(sx * gridToWorld, sy * gridToWorld),
+ };
+
+ // Spawn initial enemies
+ SpawnEnemies(config.TargetEnemyCount);
+ }
+
+ public void RegenerateTerrain()
+ {
+ Terrain = TerrainGenerator.Generate(_config.TerrainWidth, _config.TerrainHeight);
+ var gridToWorld = 1f / _config.WorldToGrid;
+ var (sx, sy) = TerrainGenerator.FindSpawnPosition(Terrain);
+ Player.Position = new Vector2(sx * gridToWorld, sy * gridToWorld);
+ Player.Health = Player.MaxHealth;
+ Player.Mana = Player.MaxMana;
+ Enemies.Clear();
+ Projectiles.Clear();
+ ActiveEffects.Clear();
+ _respawnQueue.Clear();
+ SpawnEnemies(_config.TargetEnemyCount);
+ }
+
+ public void QueueSkill(ushort scanCode, Vector2 targetWorldPos)
+ {
+ _skillQueue.Enqueue((scanCode, targetWorldPos));
+ }
+
+ public void Tick(float dt)
+ {
+ if (_config.IsPaused) return;
+
+ dt *= _config.SpeedMultiplier;
+ TickNumber++;
+
+ // 1. Move player
+ MovePlayer(dt);
+
+ // 2. Process queued skills
+ ProcessSkills();
+
+ // 3. Update projectiles
+ UpdateProjectiles(dt);
+
+ // 4. Update skill effects
+ UpdateEffects(dt);
+
+ // 5. Update enemy AI
+ UpdateEnemies(dt);
+
+ // 6. Process respawn queue
+ UpdateRespawns(dt);
+
+ // 7. Player regen
+ Player.Update(dt);
+ }
+
+ private void MovePlayer(float dt)
+ {
+ if (MoveDirection.LengthSquared() < 0.001f) return;
+
+ var dir = Vector2.Normalize(MoveDirection);
+ var newPos = Player.Position + dir * Player.MoveSpeed * dt;
+
+ // Terrain collision
+ var gx = (int)(newPos.X * _config.WorldToGrid);
+ var gy = (int)(newPos.Y * _config.WorldToGrid);
+ if (Terrain.IsWalkable(gx, gy))
+ Player.Position = newPos;
+ else
+ {
+ // Try sliding along X
+ var slideX = new Vector2(Player.Position.X + dir.X * Player.MoveSpeed * dt, Player.Position.Y);
+ var sgx = (int)(slideX.X * _config.WorldToGrid);
+ var sgy = (int)(slideX.Y * _config.WorldToGrid);
+ if (Terrain.IsWalkable(sgx, sgy))
+ {
+ Player.Position = slideX;
+ return;
+ }
+
+ // Try sliding along Y
+ var slideY = new Vector2(Player.Position.X, Player.Position.Y + dir.Y * Player.MoveSpeed * dt);
+ sgx = (int)(slideY.X * _config.WorldToGrid);
+ sgy = (int)(slideY.Y * _config.WorldToGrid);
+ if (Terrain.IsWalkable(sgx, sgy))
+ Player.Position = slideY;
+ }
+ }
+
+ private void ProcessSkills()
+ {
+ while (_skillQueue.TryDequeue(out var skill))
+ {
+ // Determine skill type based on scan code slot
+ // Slots 0-1 (LMB/RMB) = melee, 3 (Q) = AOE, 4 (E) = projectile, else = melee
+ var type = GetSkillType(skill.scanCode);
+ var targetPos = skill.targetWorldPos;
+
+ switch (type)
+ {
+ case SkillEffectType.Melee:
+ ProcessMeleeSkill(targetPos);
+ break;
+ case SkillEffectType.Aoe:
+ ProcessAoeSkill(targetPos);
+ break;
+ case SkillEffectType.Projectile:
+ ProcessProjectileSkill(targetPos);
+ break;
+ }
+ }
+ }
+
+ private SkillEffectType GetSkillType(ushort scanCode)
+ {
+ return scanCode switch
+ {
+ 0x10 => SkillEffectType.Aoe, // Q
+ 0x12 => SkillEffectType.Projectile, // E
+ 0x13 => SkillEffectType.Aoe, // R
+ 0x14 => SkillEffectType.Projectile, // T
+ _ => SkillEffectType.Melee,
+ };
+ }
+
+ private void ProcessMeleeSkill(Vector2 targetPos)
+ {
+ var dir = targetPos - Player.Position;
+ if (dir.LengthSquared() > 0)
+ dir = Vector2.Normalize(dir);
+ else
+ dir = Vector2.UnitX;
+
+ var effect = new SimSkillEffect
+ {
+ Type = SkillEffectType.Melee,
+ Origin = Player.Position,
+ TargetPosition = targetPos,
+ Radius = _config.MeleeRange,
+ ConeAngle = _config.MeleeConeAngle,
+ Damage = _config.SkillBaseDamage,
+ };
+ ActiveEffects.Add(effect);
+
+ // Apply melee damage immediately
+ var halfAngle = _config.MeleeConeAngle * MathF.PI / 360f;
+ foreach (var enemy in Enemies)
+ {
+ if (!enemy.IsAlive) continue;
+ var toEnemy = enemy.Position - Player.Position;
+ var dist = toEnemy.Length();
+ if (dist > _config.MeleeRange) continue;
+
+ if (dist > 0)
+ {
+ var angle = MathF.Acos(Vector2.Dot(Vector2.Normalize(toEnemy), dir));
+ if (angle > halfAngle) continue;
+ }
+
+ enemy.TakeDamage(_config.SkillBaseDamage);
+ }
+ }
+
+ private void ProcessAoeSkill(Vector2 targetPos)
+ {
+ var effect = new SimSkillEffect
+ {
+ Type = SkillEffectType.Aoe,
+ Origin = Player.Position,
+ TargetPosition = targetPos,
+ Radius = _config.AoeRadius,
+ Damage = _config.SkillBaseDamage,
+ };
+ ActiveEffects.Add(effect);
+
+ // Apply AOE damage
+ foreach (var enemy in Enemies)
+ {
+ if (!enemy.IsAlive) continue;
+ if (Vector2.Distance(enemy.Position, targetPos) <= _config.AoeRadius)
+ enemy.TakeDamage(_config.SkillBaseDamage);
+ }
+ }
+
+ private void ProcessProjectileSkill(Vector2 targetPos)
+ {
+ var dir = targetPos - Player.Position;
+ if (dir.LengthSquared() < 1f) dir = Vector2.UnitX;
+
+ var projectile = new SimProjectile(
+ Player.Position,
+ dir,
+ _config.ProjectileSpeed,
+ _config.ProjectileRange,
+ _config.ProjectileHitRadius,
+ _config.SkillBaseDamage);
+
+ Projectiles.Add(projectile);
+
+ ActiveEffects.Add(new SimSkillEffect
+ {
+ Type = SkillEffectType.Projectile,
+ Origin = Player.Position,
+ TargetPosition = targetPos,
+ Radius = _config.ProjectileHitRadius,
+ Damage = _config.SkillBaseDamage,
+ Duration = _config.ProjectileRange / _config.ProjectileSpeed,
+ });
+ }
+
+ private void UpdateProjectiles(float dt)
+ {
+ for (var i = Projectiles.Count - 1; i >= 0; i--)
+ {
+ var proj = Projectiles[i];
+ proj.Update(dt);
+
+ // Check terrain collision
+ var gx = (int)(proj.Position.X * _config.WorldToGrid);
+ var gy = (int)(proj.Position.Y * _config.WorldToGrid);
+ if (!Terrain.IsWalkable(gx, gy))
+ {
+ proj.IsExpired = true;
+ }
+
+ // Check enemy hits
+ if (!proj.IsExpired)
+ {
+ foreach (var enemy in Enemies)
+ {
+ if (!enemy.IsAlive) continue;
+ if (Vector2.Distance(enemy.Position, proj.Position) <= proj.HitRadius)
+ {
+ enemy.TakeDamage(proj.Damage);
+ proj.IsExpired = true;
+ break;
+ }
+ }
+ }
+
+ if (proj.IsExpired)
+ Projectiles.RemoveAt(i);
+ }
+ }
+
+ private void UpdateEffects(float dt)
+ {
+ for (var i = ActiveEffects.Count - 1; i >= 0; i--)
+ {
+ ActiveEffects[i].Elapsed += dt;
+ if (ActiveEffects[i].IsExpired)
+ ActiveEffects.RemoveAt(i);
+ }
+ }
+
+ private void UpdateEnemies(float dt)
+ {
+ for (var i = Enemies.Count - 1; i >= 0; i--)
+ {
+ var enemy = Enemies[i];
+
+ if (enemy.AiState == EnemyAiState.Dead)
+ {
+ enemy.DespawnTimer -= dt;
+ if (enemy.DespawnTimer <= 0)
+ {
+ // Queue respawn
+ _respawnQueue.Add((_config.EnemyRespawnTime, enemy.Rarity));
+ Enemies.RemoveAt(i);
+ }
+ continue;
+ }
+
+ // Attack cooldown
+ if (enemy.AttackCooldownRemaining > 0)
+ enemy.AttackCooldownRemaining -= dt;
+
+ var dist = Vector2.Distance(enemy.Position, Player.Position);
+
+ if (dist <= _config.EnemyAttackRange && Player.IsAlive)
+ {
+ // In attack range
+ enemy.AiState = EnemyAiState.Attacking;
+ if (enemy.AttackCooldownRemaining <= 0)
+ {
+ Player.TakeDamage(_config.EnemyAttackDamage);
+ enemy.AttackCooldownRemaining = _config.EnemyAttackCooldown;
+ }
+ }
+ else if (dist <= _config.EnemyAggroRange && Player.IsAlive)
+ {
+ // Chase player
+ enemy.AiState = EnemyAiState.Chasing;
+ var dir = Vector2.Normalize(Player.Position - enemy.Position);
+ var newPos = enemy.Position + dir * enemy.MoveSpeed * dt;
+
+ var gx = (int)(newPos.X * _config.WorldToGrid);
+ var gy = (int)(newPos.Y * _config.WorldToGrid);
+ if (Terrain.IsWalkable(gx, gy))
+ enemy.Position = newPos;
+ }
+ else
+ {
+ // Idle: random wander
+ enemy.AiState = EnemyAiState.Idle;
+ enemy.WanderTimer -= dt;
+ if (enemy.WanderTimer <= 0)
+ {
+ // Pick new wander target
+ var angle = _rng.NextSingle() * MathF.Tau;
+ var dist2 = _rng.NextSingle() * _config.EnemyWanderRadius;
+ enemy.WanderTarget = enemy.SpawnPosition + new Vector2(MathF.Cos(angle), MathF.Sin(angle)) * dist2;
+ enemy.WanderTimer = 2f + _rng.NextSingle() * 3f;
+ }
+
+ if (Vector2.Distance(enemy.Position, enemy.WanderTarget) > 10f)
+ {
+ var dir = Vector2.Normalize(enemy.WanderTarget - enemy.Position);
+ var newPos = enemy.Position + dir * enemy.MoveSpeed * 0.3f * dt;
+ var gx = (int)(newPos.X * _config.WorldToGrid);
+ var gy = (int)(newPos.Y * _config.WorldToGrid);
+ if (Terrain.IsWalkable(gx, gy))
+ enemy.Position = newPos;
+ }
+ }
+ }
+ }
+
+ private void UpdateRespawns(float dt)
+ {
+ for (var i = _respawnQueue.Count - 1; i >= 0; i--)
+ {
+ var (timer, rarity) = _respawnQueue[i];
+ timer -= dt;
+ if (timer <= 0)
+ {
+ SpawnEnemy(rarity);
+ _respawnQueue.RemoveAt(i);
+ }
+ else
+ {
+ _respawnQueue[i] = (timer, rarity);
+ }
+ }
+
+ // Maintain population
+ var aliveCount = Enemies.Count(e => e.IsAlive) + _respawnQueue.Count;
+ while (aliveCount < _config.TargetEnemyCount)
+ {
+ SpawnEnemy(RollRarity());
+ aliveCount++;
+ }
+ }
+
+ public void SpawnEnemyAt(Vector2 worldPos, MonsterRarity rarity)
+ {
+ var enemy = new SimEnemy(worldPos, rarity, _config.EnemyBaseHealth,
+ _config.PlayerMoveSpeed * _config.EnemyMoveSpeedFactor)
+ {
+ WanderTarget = worldPos,
+ WanderTimer = _rng.NextSingle() * 3f,
+ };
+ Enemies.Add(enemy);
+ }
+
+ private void SpawnEnemies(int count)
+ {
+ for (var i = 0; i < count; i++)
+ SpawnEnemy(RollRarity());
+ }
+
+ private void SpawnEnemy(MonsterRarity rarity)
+ {
+ var gridToWorld = 1f / _config.WorldToGrid;
+ var pos = TerrainGenerator.FindRandomWalkable(Terrain, _rng);
+ if (pos is null) return;
+
+ var worldPos = new Vector2(pos.Value.x * gridToWorld, pos.Value.y * gridToWorld);
+
+ // Don't spawn too close to player
+ if (Vector2.Distance(worldPos, Player.Position) < 300f) return;
+
+ SpawnEnemyAt(worldPos, rarity);
+ }
+
+ private MonsterRarity RollRarity()
+ {
+ var roll = _rng.NextSingle();
+ if (roll < _config.UniqueChance) return MonsterRarity.Unique;
+ if (roll < _config.UniqueChance + _config.RareChance) return MonsterRarity.Rare;
+ if (roll < _config.UniqueChance + _config.RareChance + _config.MagicChance) return MonsterRarity.Magic;
+ return MonsterRarity.White;
+ }
+}
diff --git a/src/Nexus.Simulator/World/TerrainGenerator.cs b/src/Nexus.Simulator/World/TerrainGenerator.cs
new file mode 100644
index 0000000..548f19c
--- /dev/null
+++ b/src/Nexus.Simulator/World/TerrainGenerator.cs
@@ -0,0 +1,175 @@
+using Nexus.Core;
+
+namespace Nexus.Simulator.World;
+
+public static class TerrainGenerator
+{
+ private record Room(int X, int Y, int Width, int Height)
+ {
+ public int CenterX => X + Width / 2;
+ public int CenterY => Y + Height / 2;
+ }
+
+ public static WalkabilitySnapshot Generate(int width, int height, int? seed = null)
+ {
+ var rng = seed.HasValue ? new Random(seed.Value) : new Random();
+ var data = new byte[width * height]; // 0 = wall by default
+
+ var rooms = new List();
+ var attempts = 0;
+ var targetRooms = 15 + rng.Next(10);
+
+ while (rooms.Count < targetRooms && attempts < 500)
+ {
+ attempts++;
+ var rw = rng.Next(20, 60);
+ var rh = rng.Next(20, 60);
+ var rx = rng.Next(2, width - rw - 2);
+ var ry = rng.Next(2, height - rh - 2);
+
+ var candidate = new Room(rx, ry, rw, rh);
+
+ // Check overlap with existing rooms (with margin)
+ var overlaps = false;
+ foreach (var existing in rooms)
+ {
+ if (candidate.X - 3 < existing.X + existing.Width &&
+ candidate.X + candidate.Width + 3 > existing.X &&
+ candidate.Y - 3 < existing.Y + existing.Height &&
+ candidate.Y + candidate.Height + 3 > existing.Y)
+ {
+ overlaps = true;
+ break;
+ }
+ }
+
+ if (!overlaps)
+ rooms.Add(candidate);
+ }
+
+ // Carve rooms
+ foreach (var room in rooms)
+ {
+ for (var y = room.Y; y < room.Y + room.Height; y++)
+ for (var x = room.X; x < room.X + room.Width; x++)
+ data[y * width + x] = 1;
+ }
+
+ // Connect rooms with corridors
+ for (var i = 1; i < rooms.Count; i++)
+ {
+ var a = rooms[i - 1];
+ var b = rooms[i];
+ CarveCorridorL(data, width, a.CenterX, a.CenterY, b.CenterX, b.CenterY, rng);
+ }
+
+ // Also connect last to first for a loop
+ if (rooms.Count > 2)
+ {
+ var first = rooms[0];
+ var last = rooms[^1];
+ CarveCorridorL(data, width, first.CenterX, first.CenterY, last.CenterX, last.CenterY, rng);
+ }
+
+ // Add some random extra connections
+ var extraConnections = rng.Next(3, 7);
+ for (var i = 0; i < extraConnections; i++)
+ {
+ var a = rooms[rng.Next(rooms.Count)];
+ var b = rooms[rng.Next(rooms.Count)];
+ if (a != b)
+ CarveCorridorL(data, width, a.CenterX, a.CenterY, b.CenterX, b.CenterY, rng);
+ }
+
+ return new WalkabilitySnapshot
+ {
+ Width = width,
+ Height = height,
+ Data = data,
+ };
+ }
+
+ ///
+ /// Finds a walkable position near the center of the terrain.
+ ///
+ public static (int x, int y) FindSpawnPosition(WalkabilitySnapshot terrain)
+ {
+ var cx = terrain.Width / 2;
+ var cy = terrain.Height / 2;
+
+ // Spiral outward
+ for (var r = 0; r < Math.Max(terrain.Width, terrain.Height); r++)
+ {
+ for (var dx = -r; dx <= r; dx++)
+ for (var dy = -r; dy <= r; dy++)
+ {
+ if (Math.Abs(dx) != r && Math.Abs(dy) != r) continue;
+ var x = cx + dx;
+ var y = cy + dy;
+ if (terrain.IsWalkable(x, y))
+ return (x, y);
+ }
+ }
+
+ return (cx, cy);
+ }
+
+ ///
+ /// Finds a random walkable position.
+ ///
+ public static (int x, int y)? FindRandomWalkable(WalkabilitySnapshot terrain, Random rng, int maxAttempts = 200)
+ {
+ for (var i = 0; i < maxAttempts; i++)
+ {
+ var x = rng.Next(terrain.Width);
+ var y = rng.Next(terrain.Height);
+ if (terrain.IsWalkable(x, y))
+ return (x, y);
+ }
+ return null;
+ }
+
+ private static void CarveCorridorL(byte[] data, int width, int x1, int y1, int x2, int y2, Random rng)
+ {
+ var corridorWidth = 2 + rng.Next(2);
+
+ // L-shaped: horizontal then vertical (or vice versa)
+ if (rng.Next(2) == 0)
+ {
+ CarveHorizontal(data, width, x1, x2, y1, corridorWidth);
+ CarveVertical(data, width, y1, y2, x2, corridorWidth);
+ }
+ else
+ {
+ CarveVertical(data, width, y1, y2, x1, corridorWidth);
+ CarveHorizontal(data, width, x1, x2, y2, corridorWidth);
+ }
+ }
+
+ private static void CarveHorizontal(byte[] data, int width, int x1, int x2, int y, int thickness)
+ {
+ var xMin = Math.Min(x1, x2);
+ var xMax = Math.Max(x1, x2);
+ for (var x = xMin; x <= xMax; x++)
+ for (var dy = 0; dy < thickness; dy++)
+ {
+ var ry = y + dy;
+ if (ry >= 0 && ry < data.Length / width && x >= 0 && x < width)
+ data[ry * width + x] = 1;
+ }
+ }
+
+ private static void CarveVertical(byte[] data, int width, int y1, int y2, int x, int thickness)
+ {
+ var height = data.Length / width;
+ var yMin = Math.Min(y1, y2);
+ var yMax = Math.Max(y1, y2);
+ for (var y = yMin; y <= yMax; y++)
+ for (var dx = 0; dx < thickness; dx++)
+ {
+ var rx = x + dx;
+ if (y >= 0 && y < height && rx >= 0 && rx < width)
+ data[y * width + rx] = 1;
+ }
+ }
+}
diff --git a/src/Roboto.Systems/CombatSystem.cs b/src/Nexus.Systems/CombatSystem.cs
similarity index 99%
rename from src/Roboto.Systems/CombatSystem.cs
rename to src/Nexus.Systems/CombatSystem.cs
index d7423ef..0309724 100644
--- a/src/Roboto.Systems/CombatSystem.cs
+++ b/src/Nexus.Systems/CombatSystem.cs
@@ -1,8 +1,8 @@
using System.Numerics;
-using Roboto.Core;
+using Nexus.Core;
using Serilog;
-namespace Roboto.Systems;
+namespace Nexus.Systems;
public class CombatSystem : ISystem
{
diff --git a/src/Roboto.Systems/LootSystem.cs b/src/Nexus.Systems/LootSystem.cs
similarity index 86%
rename from src/Roboto.Systems/LootSystem.cs
rename to src/Nexus.Systems/LootSystem.cs
index f9c366b..0d34b87 100644
--- a/src/Roboto.Systems/LootSystem.cs
+++ b/src/Nexus.Systems/LootSystem.cs
@@ -1,6 +1,6 @@
-using Roboto.Core;
+using Nexus.Core;
-namespace Roboto.Systems;
+namespace Nexus.Systems;
public class LootSystem : ISystem
{
diff --git a/src/Roboto.Systems/MovementSystem.cs b/src/Nexus.Systems/MovementSystem.cs
similarity index 97%
rename from src/Roboto.Systems/MovementSystem.cs
rename to src/Nexus.Systems/MovementSystem.cs
index f19243d..bd46248 100644
--- a/src/Roboto.Systems/MovementSystem.cs
+++ b/src/Nexus.Systems/MovementSystem.cs
@@ -1,7 +1,7 @@
using System.Numerics;
-using Roboto.Core;
+using Nexus.Core;
-namespace Roboto.Systems;
+namespace Nexus.Systems;
///
/// Force-based avoidance: applies inverse-square repulsion from hostile monsters
diff --git a/src/Roboto.Systems/NavigationSystem.cs b/src/Nexus.Systems/NavigationSystem.cs
similarity index 85%
rename from src/Roboto.Systems/NavigationSystem.cs
rename to src/Nexus.Systems/NavigationSystem.cs
index 31cc4fd..f611070 100644
--- a/src/Roboto.Systems/NavigationSystem.cs
+++ b/src/Nexus.Systems/NavigationSystem.cs
@@ -1,10 +1,10 @@
using System.Numerics;
-using Roboto.Core;
+using Nexus.Core;
-namespace Roboto.Systems;
+namespace Nexus.Systems;
///
-/// Simplified navigation system. Pathfinding has moved to Roboto.Navigation.PathFinder.
+/// Simplified navigation system. Pathfinding has moved to Nexus.Pathfinding.PathFinder.
/// This system just submits a MoveAction if an external direction is set.
///
public class NavigationSystem : ISystem
diff --git a/src/Roboto.Systems/Roboto.Systems.csproj b/src/Nexus.Systems/Nexus.Systems.csproj
similarity index 83%
rename from src/Roboto.Systems/Roboto.Systems.csproj
rename to src/Nexus.Systems/Nexus.Systems.csproj
index bcebb88..60b2b65 100644
--- a/src/Roboto.Systems/Roboto.Systems.csproj
+++ b/src/Nexus.Systems/Nexus.Systems.csproj
@@ -8,6 +8,6 @@
-
+
diff --git a/src/Roboto.Systems/ResourceSystem.cs b/src/Nexus.Systems/ResourceSystem.cs
similarity index 97%
rename from src/Roboto.Systems/ResourceSystem.cs
rename to src/Nexus.Systems/ResourceSystem.cs
index 44fadda..3205681 100644
--- a/src/Roboto.Systems/ResourceSystem.cs
+++ b/src/Nexus.Systems/ResourceSystem.cs
@@ -1,6 +1,6 @@
-using Roboto.Core;
+using Nexus.Core;
-namespace Roboto.Systems;
+namespace Nexus.Systems;
public class ResourceSystem : ISystem
{
diff --git a/src/Roboto.Systems/ThreatSystem.cs b/src/Nexus.Systems/ThreatSystem.cs
similarity index 98%
rename from src/Roboto.Systems/ThreatSystem.cs
rename to src/Nexus.Systems/ThreatSystem.cs
index 6dcc52a..bd44615 100644
--- a/src/Roboto.Systems/ThreatSystem.cs
+++ b/src/Nexus.Systems/ThreatSystem.cs
@@ -1,8 +1,8 @@
using System.Numerics;
-using Roboto.Core;
+using Nexus.Core;
using Serilog;
-namespace Roboto.Systems;
+namespace Nexus.Systems;
///
/// Emergency threat response. Runs first (priority 50).
diff --git a/src/Automata.Trade/ITradeMonitor.cs b/src/Nexus.Trade/ITradeMonitor.cs
similarity index 93%
rename from src/Automata.Trade/ITradeMonitor.cs
rename to src/Nexus.Trade/ITradeMonitor.cs
index ef45711..4c34cc6 100644
--- a/src/Automata.Trade/ITradeMonitor.cs
+++ b/src/Nexus.Trade/ITradeMonitor.cs
@@ -1,6 +1,6 @@
-using Automata.Core;
+using Nexus.Core;
-namespace Automata.Trade;
+namespace Nexus.Trade;
public interface ITradeMonitor : IAsyncDisposable
{
diff --git a/src/Automata.Trade/Automata.Trade.csproj b/src/Nexus.Trade/Nexus.Trade.csproj
similarity index 77%
rename from src/Automata.Trade/Automata.Trade.csproj
rename to src/Nexus.Trade/Nexus.Trade.csproj
index 0d0f761..3266cd4 100644
--- a/src/Automata.Trade/Automata.Trade.csproj
+++ b/src/Nexus.Trade/Nexus.Trade.csproj
@@ -5,6 +5,6 @@
enable
-
+
diff --git a/src/Automata.Trade/Selectors.cs b/src/Nexus.Trade/Selectors.cs
similarity index 97%
rename from src/Automata.Trade/Selectors.cs
rename to src/Nexus.Trade/Selectors.cs
index eb0345a..c724ccd 100644
--- a/src/Automata.Trade/Selectors.cs
+++ b/src/Nexus.Trade/Selectors.cs
@@ -1,4 +1,4 @@
-namespace Automata.Trade;
+namespace Nexus.Trade;
public static class Selectors
{
diff --git a/src/Automata.Trade/TradeDaemonBridge.cs b/src/Nexus.Trade/TradeDaemonBridge.cs
similarity index 99%
rename from src/Automata.Trade/TradeDaemonBridge.cs
rename to src/Nexus.Trade/TradeDaemonBridge.cs
index df7c768..c51c163 100644
--- a/src/Automata.Trade/TradeDaemonBridge.cs
+++ b/src/Nexus.Trade/TradeDaemonBridge.cs
@@ -2,10 +2,10 @@ using System.Collections.Concurrent;
using System.Diagnostics;
using System.Text.Json;
using System.Text.Json.Serialization;
-using Automata.Core;
+using Nexus.Core;
using Serilog;
-namespace Automata.Trade;
+namespace Nexus.Trade;
public class TradeDaemonBridge : ITradeMonitor
{
diff --git a/src/Automata.Ui/App.axaml b/src/Nexus.Ui/App.axaml
similarity index 92%
rename from src/Automata.Ui/App.axaml
rename to src/Nexus.Ui/App.axaml
index a77fa7a..cc27e59 100644
--- a/src/Automata.Ui/App.axaml
+++ b/src/Nexus.Ui/App.axaml
@@ -1,7 +1,7 @@
diff --git a/src/Automata.Ui/App.axaml.cs b/src/Nexus.Ui/App.axaml.cs
similarity index 89%
rename from src/Automata.Ui/App.axaml.cs
rename to src/Nexus.Ui/App.axaml.cs
index 92a293f..822483d 100644
--- a/src/Automata.Ui/App.axaml.cs
+++ b/src/Nexus.Ui/App.axaml.cs
@@ -2,20 +2,20 @@ using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using Microsoft.Extensions.DependencyInjection;
-using Automata.Bot;
-using Automata.Core;
-using Automata.Game;
-using Automata.GameLog;
-using Automata.Inventory;
-using Automata.Items;
-using Automata.Screen;
-using Automata.Screen.Ocr;
-using Automata.Trade;
-using Automata.Ui.Overlay;
-using Automata.Ui.ViewModels;
-using Automata.Ui.Views;
+using Nexus.Bot;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.GameLog;
+using Nexus.Inventory;
+using Nexus.Items;
+using Nexus.Screen;
+using Nexus.Screen.Ocr;
+using Nexus.Trade;
+using Nexus.Ui.Overlay;
+using Nexus.Ui.ViewModels;
+using Nexus.Ui.Views;
-namespace Automata.Ui;
+namespace Nexus.Ui;
public partial class App : Application
{
@@ -70,7 +70,7 @@ public partial class App : Application
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
- services.AddSingleton();
+ services.AddSingleton();
services.AddSingleton();
var provider = services.BuildServiceProvider();
@@ -97,7 +97,7 @@ public partial class App : Application
mainVm.AtlasVm = provider.GetRequiredService();
mainVm.CraftingVm = provider.GetRequiredService();
mainVm.MemoryVm = provider.GetRequiredService();
- mainVm.RobotoVm = provider.GetRequiredService();
+ mainVm.NexusVm = provider.GetRequiredService();
mainVm.BrowserVm = provider.GetRequiredService();
var window = new MainWindow { DataContext = mainVm };
@@ -112,7 +112,7 @@ public partial class App : Application
{
overlay.Shutdown();
mainVm.Shutdown();
- mainVm.RobotoVm?.Shutdown();
+ mainVm.NexusVm?.Shutdown();
await bot.DisposeAsync();
};
}
diff --git a/src/Automata.Ui/Converters/ValueConverters.cs b/src/Nexus.Ui/Converters/ValueConverters.cs
similarity index 98%
rename from src/Automata.Ui/Converters/ValueConverters.cs
rename to src/Nexus.Ui/Converters/ValueConverters.cs
index 7550d71..fc43ef3 100644
--- a/src/Automata.Ui/Converters/ValueConverters.cs
+++ b/src/Nexus.Ui/Converters/ValueConverters.cs
@@ -2,10 +2,10 @@ using System.Globalization;
using Avalonia;
using Avalonia.Data.Converters;
using Avalonia.Media;
-using Automata.Core;
-using Automata.Ui.ViewModels;
+using Nexus.Core;
+using Nexus.Ui.ViewModels;
-namespace Automata.Ui.Converters;
+namespace Nexus.Ui.Converters;
public class LogLevelToBrushConverter : IValueConverter
{
diff --git a/src/Automata.Ui/Automata.Ui.csproj b/src/Nexus.Ui/Nexus.Ui.csproj
similarity index 76%
rename from src/Automata.Ui/Automata.Ui.csproj
rename to src/Nexus.Ui/Nexus.Ui.csproj
index ce866f4..f79c27c 100644
--- a/src/Automata.Ui/Automata.Ui.csproj
+++ b/src/Nexus.Ui/Nexus.Ui.csproj
@@ -16,16 +16,16 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Automata.Ui/Overlay/D2dNativeMethods.cs b/src/Nexus.Ui/Overlay/D2dNativeMethods.cs
similarity index 99%
rename from src/Automata.Ui/Overlay/D2dNativeMethods.cs
rename to src/Nexus.Ui/Overlay/D2dNativeMethods.cs
index f33e9f7..f37496b 100644
--- a/src/Automata.Ui/Overlay/D2dNativeMethods.cs
+++ b/src/Nexus.Ui/Overlay/D2dNativeMethods.cs
@@ -1,6 +1,6 @@
using System.Runtime.InteropServices;
-namespace Automata.Ui.Overlay;
+namespace Nexus.Ui.Overlay;
/// Win32 P/Invoke for the D2D overlay window, DWM transparency, and frame timing.
internal static partial class D2dNativeMethods
diff --git a/src/Automata.Ui/Overlay/D2dOverlay.cs b/src/Nexus.Ui/Overlay/D2dOverlay.cs
similarity index 98%
rename from src/Automata.Ui/Overlay/D2dOverlay.cs
rename to src/Nexus.Ui/Overlay/D2dOverlay.cs
index 5cc155b..1bcd18e 100644
--- a/src/Automata.Ui/Overlay/D2dOverlay.cs
+++ b/src/Nexus.Ui/Overlay/D2dOverlay.cs
@@ -1,13 +1,13 @@
using System.Diagnostics;
using System.Runtime;
using System.Runtime.InteropServices;
-using Automata.Bot;
-using Automata.Ui.Overlay.Layers;
-using Roboto.Memory;
+using Nexus.Bot;
+using Nexus.Ui.Overlay.Layers;
+using Nexus.Memory;
using Vortice.Mathematics;
-using static Automata.Ui.Overlay.D2dNativeMethods;
+using static Nexus.Ui.Overlay.D2dNativeMethods;
-namespace Automata.Ui.Overlay;
+namespace Nexus.Ui.Overlay;
///
/// Fullscreen transparent overlay rendered with Direct2D on a dedicated thread.
diff --git a/src/Automata.Ui/Overlay/D2dRenderContext.cs b/src/Nexus.Ui/Overlay/D2dRenderContext.cs
similarity index 99%
rename from src/Automata.Ui/Overlay/D2dRenderContext.cs
rename to src/Nexus.Ui/Overlay/D2dRenderContext.cs
index c81fa3c..d0cd9df 100644
--- a/src/Automata.Ui/Overlay/D2dRenderContext.cs
+++ b/src/Nexus.Ui/Overlay/D2dRenderContext.cs
@@ -6,7 +6,7 @@ using DWriteFactory = Vortice.DirectWrite.IDWriteFactory;
using D2dFactoryType = Vortice.Direct2D1.FactoryType;
using DwFactoryType = Vortice.DirectWrite.FactoryType;
-namespace Automata.Ui.Overlay;
+namespace Nexus.Ui.Overlay;
public sealed class D2dRenderContext : IDisposable
{
diff --git a/src/Automata.Ui/Overlay/IOverlayLayer.cs b/src/Nexus.Ui/Overlay/IOverlayLayer.cs
similarity index 91%
rename from src/Automata.Ui/Overlay/IOverlayLayer.cs
rename to src/Nexus.Ui/Overlay/IOverlayLayer.cs
index b220771..bd210ac 100644
--- a/src/Automata.Ui/Overlay/IOverlayLayer.cs
+++ b/src/Nexus.Ui/Overlay/IOverlayLayer.cs
@@ -1,7 +1,7 @@
-using Automata.Navigation;
-using Automata.Screen;
+using Nexus.Navigation;
+using Nexus.Screen;
-namespace Automata.Ui.Overlay;
+namespace Nexus.Ui.Overlay;
public record OverlayState(
IReadOnlyList Enemies,
diff --git a/src/Automata.Ui/Overlay/Layers/D2dDebugTextLayer.cs b/src/Nexus.Ui/Overlay/Layers/D2dDebugTextLayer.cs
similarity index 99%
rename from src/Automata.Ui/Overlay/Layers/D2dDebugTextLayer.cs
rename to src/Nexus.Ui/Overlay/Layers/D2dDebugTextLayer.cs
index f5d6c7f..e9f3008 100644
--- a/src/Automata.Ui/Overlay/Layers/D2dDebugTextLayer.cs
+++ b/src/Nexus.Ui/Overlay/Layers/D2dDebugTextLayer.cs
@@ -3,7 +3,7 @@ using Vortice.Direct2D1;
using Vortice.DirectWrite;
using Vortice.Mathematics;
-namespace Automata.Ui.Overlay.Layers;
+namespace Nexus.Ui.Overlay.Layers;
internal sealed class D2dDebugTextLayer : ID2dOverlayLayer, IDisposable
{
diff --git a/src/Automata.Ui/Overlay/Layers/D2dEnemyBoxLayer.cs b/src/Nexus.Ui/Overlay/Layers/D2dEnemyBoxLayer.cs
similarity index 99%
rename from src/Automata.Ui/Overlay/Layers/D2dEnemyBoxLayer.cs
rename to src/Nexus.Ui/Overlay/Layers/D2dEnemyBoxLayer.cs
index 13c0eb1..2a29ace 100644
--- a/src/Automata.Ui/Overlay/Layers/D2dEnemyBoxLayer.cs
+++ b/src/Nexus.Ui/Overlay/Layers/D2dEnemyBoxLayer.cs
@@ -3,7 +3,7 @@ using Vortice.Direct2D1;
using Vortice.DirectWrite;
using Vortice.Mathematics;
-namespace Automata.Ui.Overlay.Layers;
+namespace Nexus.Ui.Overlay.Layers;
internal sealed class D2dEnemyBoxLayer : ID2dOverlayLayer, IDisposable
{
diff --git a/src/Automata.Ui/Overlay/Layers/D2dEntityLabelLayer.cs b/src/Nexus.Ui/Overlay/Layers/D2dEntityLabelLayer.cs
similarity index 94%
rename from src/Automata.Ui/Overlay/Layers/D2dEntityLabelLayer.cs
rename to src/Nexus.Ui/Overlay/Layers/D2dEntityLabelLayer.cs
index b5fcf77..19c40d4 100644
--- a/src/Automata.Ui/Overlay/Layers/D2dEntityLabelLayer.cs
+++ b/src/Nexus.Ui/Overlay/Layers/D2dEntityLabelLayer.cs
@@ -1,10 +1,10 @@
using System.Drawing;
using System.Numerics;
-using Automata.Ui.ViewModels;
-using Roboto.Data;
+using Nexus.Ui.ViewModels;
+using Nexus.Data;
using Vortice.DirectWrite;
-namespace Automata.Ui.Overlay.Layers;
+namespace Nexus.Ui.Overlay.Layers;
internal sealed class D2dEntityLabelLayer : ID2dOverlayLayer, IDisposable
{
@@ -23,10 +23,10 @@ internal sealed class D2dEntityLabelLayer : ID2dOverlayLayer, IDisposable
public void Draw(D2dRenderContext ctx, OverlayState state)
{
- var data = RobotoViewModel.OverlayData;
+ var data = NexusViewModel.OverlayData;
if (data is null || data.Entries.Length == 0) return;
- var cache = RobotoViewModel.SharedCache;
+ var cache = NexusViewModel.SharedCache;
if (cache is null) return;
// Read camera and player position from centralized cache (updated at 60Hz)
diff --git a/src/Automata.Ui/Overlay/Layers/D2dHudInfoLayer.cs b/src/Nexus.Ui/Overlay/Layers/D2dHudInfoLayer.cs
similarity index 99%
rename from src/Automata.Ui/Overlay/Layers/D2dHudInfoLayer.cs
rename to src/Nexus.Ui/Overlay/Layers/D2dHudInfoLayer.cs
index 6381856..9dfa043 100644
--- a/src/Automata.Ui/Overlay/Layers/D2dHudInfoLayer.cs
+++ b/src/Nexus.Ui/Overlay/Layers/D2dHudInfoLayer.cs
@@ -3,7 +3,7 @@ using Vortice.Direct2D1;
using Vortice.DirectWrite;
using Vortice.Mathematics;
-namespace Automata.Ui.Overlay.Layers;
+namespace Nexus.Ui.Overlay.Layers;
internal sealed class D2dHudInfoLayer : ID2dOverlayLayer, IDisposable
{
diff --git a/src/Automata.Ui/Overlay/Layers/D2dLootLabelLayer.cs b/src/Nexus.Ui/Overlay/Layers/D2dLootLabelLayer.cs
similarity index 98%
rename from src/Automata.Ui/Overlay/Layers/D2dLootLabelLayer.cs
rename to src/Nexus.Ui/Overlay/Layers/D2dLootLabelLayer.cs
index 3ebfdcd..d716eb2 100644
--- a/src/Automata.Ui/Overlay/Layers/D2dLootLabelLayer.cs
+++ b/src/Nexus.Ui/Overlay/Layers/D2dLootLabelLayer.cs
@@ -3,7 +3,7 @@ using Vortice.Direct2D1;
using Vortice.DirectWrite;
using Vortice.Mathematics;
-namespace Automata.Ui.Overlay.Layers;
+namespace Nexus.Ui.Overlay.Layers;
internal sealed class D2dLootLabelLayer : ID2dOverlayLayer, IDisposable
{
diff --git a/src/Automata.Ui/Program.cs b/src/Nexus.Ui/Program.cs
similarity index 94%
rename from src/Automata.Ui/Program.cs
rename to src/Nexus.Ui/Program.cs
index 171915b..1afa025 100644
--- a/src/Automata.Ui/Program.cs
+++ b/src/Nexus.Ui/Program.cs
@@ -1,8 +1,8 @@
using System.Runtime.InteropServices;
using Avalonia;
-using Automata.Core;
+using Nexus.Core;
-namespace Automata.Ui;
+namespace Nexus.Ui;
class Program
{
diff --git a/src/Automata.Ui/ViewModels/AtlasViewModel.cs b/src/Nexus.Ui/ViewModels/AtlasViewModel.cs
similarity index 98%
rename from src/Automata.Ui/ViewModels/AtlasViewModel.cs
rename to src/Nexus.Ui/ViewModels/AtlasViewModel.cs
index f2acc8b..b257fc4 100644
--- a/src/Automata.Ui/ViewModels/AtlasViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/AtlasViewModel.cs
@@ -3,11 +3,11 @@ using Avalonia.Media.Imaging;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
-using Automata.Bot;
-using Automata.Navigation;
+using Nexus.Bot;
+using Nexus.Navigation;
using Serilog;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class AtlasViewModel : ObservableObject, IDisposable
{
diff --git a/src/Automata.Ui/ViewModels/CraftingViewModel.cs b/src/Nexus.Ui/ViewModels/CraftingViewModel.cs
similarity index 99%
rename from src/Automata.Ui/ViewModels/CraftingViewModel.cs
rename to src/Nexus.Ui/ViewModels/CraftingViewModel.cs
index e44b1d6..846b16a 100644
--- a/src/Automata.Ui/ViewModels/CraftingViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/CraftingViewModel.cs
@@ -3,12 +3,12 @@ using System.IO;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
-using Automata.Bot;
-using Automata.Core;
-using Automata.Items;
+using Nexus.Bot;
+using Nexus.Core;
+using Nexus.Items;
using Serilog;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class CraftStepViewModel : ObservableObject
{
diff --git a/src/Automata.Ui/ViewModels/DebugViewModel.cs b/src/Nexus.Ui/ViewModels/DebugViewModel.cs
similarity index 99%
rename from src/Automata.Ui/ViewModels/DebugViewModel.cs
rename to src/Nexus.Ui/ViewModels/DebugViewModel.cs
index 43dfce5..6760970 100644
--- a/src/Automata.Ui/ViewModels/DebugViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/DebugViewModel.cs
@@ -1,12 +1,12 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
-using Automata.Bot;
-using Automata.Core;
-using Automata.Game;
-using Automata.Screen;
+using Nexus.Bot;
+using Nexus.Core;
+using Nexus.Game;
+using Nexus.Screen;
using Serilog;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class DebugViewModel : ObservableObject
{
diff --git a/src/Automata.Ui/ViewModels/MainWindowViewModel.cs b/src/Nexus.Ui/ViewModels/MainWindowViewModel.cs
similarity index 98%
rename from src/Automata.Ui/ViewModels/MainWindowViewModel.cs
rename to src/Nexus.Ui/ViewModels/MainWindowViewModel.cs
index f75d7f5..017179f 100644
--- a/src/Automata.Ui/ViewModels/MainWindowViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/MainWindowViewModel.cs
@@ -4,12 +4,12 @@ using System.Runtime.InteropServices;
using Avalonia.Media.Imaging;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
-using Automata.Bot;
-using Automata.Core;
-using Automata.Navigation;
+using Nexus.Bot;
+using Nexus.Core;
+using Nexus.Navigation;
using Serilog;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public class LogEntry
{
@@ -183,7 +183,7 @@ public partial class MainWindowViewModel : ObservableObject
public AtlasViewModel? AtlasVm { get; set; }
public CraftingViewModel? CraftingVm { get; set; }
public MemoryViewModel? MemoryVm { get; set; }
- public RobotoViewModel? RobotoVm { get; set; }
+ public NexusViewModel? NexusVm { get; set; }
public ObjectBrowserViewModel? BrowserVm { get; set; }
partial void OnBotModeChanged(BotMode value)
diff --git a/src/Automata.Ui/ViewModels/MappingViewModel.cs b/src/Nexus.Ui/ViewModels/MappingViewModel.cs
similarity index 97%
rename from src/Automata.Ui/ViewModels/MappingViewModel.cs
rename to src/Nexus.Ui/ViewModels/MappingViewModel.cs
index 0514963..5ab9f3d 100644
--- a/src/Automata.Ui/ViewModels/MappingViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/MappingViewModel.cs
@@ -2,11 +2,11 @@ using System.Collections.ObjectModel;
using Timer = System.Timers.Timer;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
-using Automata.Bot;
-using Automata.Core;
-using Automata.Screen;
+using Nexus.Bot;
+using Nexus.Core;
+using Nexus.Screen;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class MappingViewModel : ObservableObject, IDisposable
{
diff --git a/src/Automata.Ui/ViewModels/MemoryViewModel.cs b/src/Nexus.Ui/ViewModels/MemoryViewModel.cs
similarity index 99%
rename from src/Automata.Ui/ViewModels/MemoryViewModel.cs
rename to src/Nexus.Ui/ViewModels/MemoryViewModel.cs
index 86093a3..d16b4b1 100644
--- a/src/Automata.Ui/ViewModels/MemoryViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/MemoryViewModel.cs
@@ -6,10 +6,10 @@ using Avalonia.Platform;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
-using Roboto.Memory;
-using Roboto.Memory.Objects;
+using Nexus.Memory;
+using Nexus.Memory.Objects;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class MemoryNodeViewModel : ObservableObject
{
@@ -646,7 +646,7 @@ public partial class MemoryViewModel : ObservableObject
{
var withPos = snap.Entities.Count(e => e.HasPosition);
var withComps = snap.Entities.Count(e => e.Components is not null);
- var monsters = snap.Entities.Count(e => e.Type == Roboto.Memory.EntityType.Monster);
+ var monsters = snap.Entities.Count(e => e.Type == Nexus.Memory.EntityType.Monster);
var knownComps = _reader?.Registry["components"].Count ?? 0;
_entitySummary!.Set($"{snap.Entities.Count} total, {withComps} with comps, {knownComps} known, {monsters} monsters");
@@ -723,7 +723,7 @@ public partial class MemoryViewModel : ObservableObject
/// from live memory and recurses. For collapsed nodes with children, ensures
/// a placeholder exists so the expand arrow is visible.
///
- private static void SyncUiNodeLazy(MemoryNodeViewModel vm, Roboto.Memory.Objects.UIElements uiElements)
+ private static void SyncUiNodeLazy(MemoryNodeViewModel vm, Nexus.Memory.Objects.UIElements uiElements)
{
var uiEl = vm.UiElement;
if (uiEl is null || uiEl.Address == 0) return;
diff --git a/src/Automata.Ui/ViewModels/ModPoolViewModel.cs b/src/Nexus.Ui/ViewModels/ModPoolViewModel.cs
similarity index 93%
rename from src/Automata.Ui/ViewModels/ModPoolViewModel.cs
rename to src/Nexus.Ui/ViewModels/ModPoolViewModel.cs
index 9233ef1..e815105 100644
--- a/src/Automata.Ui/ViewModels/ModPoolViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/ModPoolViewModel.cs
@@ -1,7 +1,7 @@
using CommunityToolkit.Mvvm.ComponentModel;
-using Automata.Core;
+using Nexus.Core;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class AvailableModViewModel : ObservableObject
{
diff --git a/src/Automata.Ui/ViewModels/RobotoViewModel.cs b/src/Nexus.Ui/ViewModels/NexusViewModel.cs
similarity index 98%
rename from src/Automata.Ui/ViewModels/RobotoViewModel.cs
rename to src/Nexus.Ui/ViewModels/NexusViewModel.cs
index 6bd17a1..711db01 100644
--- a/src/Automata.Ui/ViewModels/RobotoViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/NexusViewModel.cs
@@ -3,17 +3,17 @@ using System.Numerics;
using System.Runtime.InteropServices;
using Avalonia;
using Avalonia.Media.Imaging;
-using Roboto.Memory;
+using Nexus.Memory;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
-using Automata.GameLog;
-using Roboto.Core;
-using Roboto.Data;
-using Roboto.Engine;
-using Roboto.Input;
-using Roboto.Navigation;
+using Nexus.GameLog;
+using Nexus.Core;
+using Nexus.Data;
+using Nexus.Engine;
+using Nexus.Input;
+using Nexus.Pathfinding;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
///
/// Thread-safe snapshot read by the overlay layer each frame.
@@ -79,7 +79,7 @@ public partial class EntityListItem : ObservableObject
}
}
-public partial class RobotoViewModel : ObservableObject, IDisposable
+public partial class NexusViewModel : ObservableObject, IDisposable
{
[LibraryImport("user32.dll")]
private static partial short GetAsyncKeyState(int vKey);
@@ -170,7 +170,7 @@ public partial class RobotoViewModel : ObservableObject, IDisposable
///
public static volatile GameDataCache? SharedCache;
- public RobotoViewModel(IClientLogWatcher logWatcher)
+ public NexusViewModel(IClientLogWatcher logWatcher)
{
var config = new BotConfig();
var reader = new GameMemoryReader();
diff --git a/src/Automata.Ui/ViewModels/ObjectBrowserViewModel.cs b/src/Nexus.Ui/ViewModels/ObjectBrowserViewModel.cs
similarity index 99%
rename from src/Automata.Ui/ViewModels/ObjectBrowserViewModel.cs
rename to src/Nexus.Ui/ViewModels/ObjectBrowserViewModel.cs
index 778ebc2..5ccce1f 100644
--- a/src/Automata.Ui/ViewModels/ObjectBrowserViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/ObjectBrowserViewModel.cs
@@ -2,9 +2,9 @@ using System.Collections.ObjectModel;
using System.Text;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
-using Roboto.Memory;
+using Nexus.Memory;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class FieldRowViewModel : ObservableObject
{
@@ -409,7 +409,7 @@ public partial class ObjectBrowserViewModel : ObservableObject
///
/// Builds a map of offset → label name for the given object type, based on known GameOffsets.
///
- private static Dictionary BuildOffsetLabels(GameOffsets o, string objectType)
+ private static Dictionary BuildOffsetLabels(Nexus.Memory.GameOffsets o, string objectType)
{
// Normalize: strip namespace prefixes (e.g. "GameStates@InGameState" → "InGameState")
var type = objectType;
diff --git a/src/Automata.Ui/ViewModels/ParsedModViewModel.cs b/src/Nexus.Ui/ViewModels/ParsedModViewModel.cs
similarity index 97%
rename from src/Automata.Ui/ViewModels/ParsedModViewModel.cs
rename to src/Nexus.Ui/ViewModels/ParsedModViewModel.cs
index 18ae28f..9458f0c 100644
--- a/src/Automata.Ui/ViewModels/ParsedModViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/ParsedModViewModel.cs
@@ -1,7 +1,7 @@
using CommunityToolkit.Mvvm.ComponentModel;
using Sidekick.Data.Items;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class ParsedModViewModel : ObservableObject
{
diff --git a/src/Automata.Ui/ViewModels/SettingsViewModel.cs b/src/Nexus.Ui/ViewModels/SettingsViewModel.cs
similarity index 99%
rename from src/Automata.Ui/ViewModels/SettingsViewModel.cs
rename to src/Nexus.Ui/ViewModels/SettingsViewModel.cs
index e7d15f5..8080cf6 100644
--- a/src/Automata.Ui/ViewModels/SettingsViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/SettingsViewModel.cs
@@ -4,12 +4,12 @@ using Avalonia.Media.Imaging;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
-using Automata.Bot;
-using Automata.Core;
-using Automata.Inventory;
+using Nexus.Bot;
+using Nexus.Core;
+using Nexus.Inventory;
using Serilog;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class SettingsViewModel : ObservableObject
{
diff --git a/src/Automata.Ui/ViewModels/SkillProfileViewModel.cs b/src/Nexus.Ui/ViewModels/SkillProfileViewModel.cs
similarity index 98%
rename from src/Automata.Ui/ViewModels/SkillProfileViewModel.cs
rename to src/Nexus.Ui/ViewModels/SkillProfileViewModel.cs
index 6f685f6..5303369 100644
--- a/src/Automata.Ui/ViewModels/SkillProfileViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/SkillProfileViewModel.cs
@@ -1,9 +1,9 @@
using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
-using Roboto.Core;
+using Nexus.Core;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class SkillProfileViewModel : ObservableObject
{
diff --git a/src/Automata.Ui/ViewModels/StashTabViewModel.cs b/src/Nexus.Ui/ViewModels/StashTabViewModel.cs
similarity index 95%
rename from src/Automata.Ui/ViewModels/StashTabViewModel.cs
rename to src/Nexus.Ui/ViewModels/StashTabViewModel.cs
index 0685056..c9b7d1d 100644
--- a/src/Automata.Ui/ViewModels/StashTabViewModel.cs
+++ b/src/Nexus.Ui/ViewModels/StashTabViewModel.cs
@@ -1,8 +1,8 @@
using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
-using Automata.Core;
+using Nexus.Core;
-namespace Automata.Ui.ViewModels;
+namespace Nexus.Ui.ViewModels;
public partial class StashTabViewModel : ObservableObject
{
diff --git a/src/Automata.Ui/Views/MainWindow.axaml b/src/Nexus.Ui/Views/MainWindow.axaml
similarity index 99%
rename from src/Automata.Ui/Views/MainWindow.axaml
rename to src/Nexus.Ui/Views/MainWindow.axaml
index b47aa9e..e9a5163 100644
--- a/src/Automata.Ui/Views/MainWindow.axaml
+++ b/src/Nexus.Ui/Views/MainWindow.axaml
@@ -1,9 +1,9 @@
@@ -845,9 +845,9 @@
-
-
-
+
+
+
-
-
+
+
-
+
true/pm
diff --git a/src/Roboto.Core/Roboto.Core.csproj b/src/Roboto.Core/Roboto.Core.csproj
deleted file mode 100644
index b104a1a..0000000
--- a/src/Roboto.Core/Roboto.Core.csproj
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
- net8.0-windows10.0.19041.0
- enable
- enable
-
-