diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 13207a552..93c2a4164 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -6344,6 +6344,7 @@ static void RequireDaemonVersePublication(string root) "AetheriaRuntimeDaemonPublicationStore.PublishProviderAdvertisement", "AetheriaRuntimeDaemonPublicationStore.PublishHealth", "AetheriaRuntimeDaemonGameSurfaceBuilder.Build", + "AetheriaRuntimeCatalogStore.ProjectStatRecipeSurfaceDocument(stateFilePath)", "AetheriaRuntimeDaemonPublicationStore.PublishGameSurface", "AetheriaRuntimeDaemonPublicationStore.PublishGameTuiSurface", "AetheriaRuntimeDaemonEditorSurfaceBuilder.Build", @@ -6466,6 +6467,9 @@ static void RequireDaemonVersePublication(string root) "\"editor.daemon\"", "\"Verse Provider\"", "\"Witnesses\"", + "\"Designer Surfaces\"", + "AetheriaRuntimeSurfaceDocument", + "AetheriaRuntimeStatRecipeCommands.SurfaceId", "\"Typed Commands\"", "AetheriaRuntimeDaemonCommandBoundaryEntry" }; @@ -6495,6 +6499,7 @@ static void RequireDaemonVersePublication(string root) "AetheriaRuntimeDaemonSchemas.EditorSurface", "AetheriaRuntimeDaemonGameSurfaceBuilder.SurfaceId", "AetheriaRuntimeDaemonEditorSurfaceBuilder.SurfaceId", + "AetheriaRuntimeStatRecipeCommands.SurfaceId", "AetheriaRuntimeDaemonCommandKinds.TransferCargoItem", "nameof(AetheriaRuntimeCargoTransferCommand)" }; diff --git a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs index 0c7e17471..200945804 100644 --- a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs +++ b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs @@ -286,6 +286,10 @@ public class DaemonRuntimeDocumentTests Assert.AreEqual(42, editorSurface.Version); Assert.IsTrue(ContainsSurfaceMetric(editorSurface.Surface.Root, "Verse", "aetheria.test")); Assert.IsTrue(ContainsSurfaceMetric(editorSurface.Surface.Root, "Status", "healthy")); + Assert.IsTrue(ContainsSurfaceProp( + editorSurface.Surface.Root, + "surfaceId", + AetheriaRuntimeStatRecipeCommands.SurfaceId)); Assert.IsTrue(editorSurface.Commands.Any(command => command.Command == "aetheria.daemon.commands.TransferCargoItem" && command.Transport == "cultmesh")); @@ -2376,4 +2380,18 @@ public class DaemonRuntimeDocumentTests return component.Children.Any(child => ContainsSurfaceMetric(child, label, value)); } + + private static bool ContainsSurfaceProp( + AetheriaRuntimeSurfaceComponent component, + string key, + string value) + { + if (component.Props.TryGetValue(key, out var actual) && + string.Equals(actual, value, StringComparison.Ordinal)) + { + return true; + } + + return component.Children.Any(child => ContainsSurfaceProp(child, key, value)); + } } diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogStore.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogStore.cs index 859dceecd..60c9f502d 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogStore.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogStore.cs @@ -69,16 +69,15 @@ namespace GameCult.Aetheria.State.Verse surfaces.Add(ReadEveSurface(record.Payload)); } - surfaces.Add(ProjectStatRecipeSurface(stateFilePath)); + surfaces.Add(AetheriaRuntimeEveSurfaceAdapter.ToEveSurfaceDocument( + ProjectStatRecipeSurfaceDocument(stateFilePath))); return surfaces; } - private static EveSurfaceDocument ProjectStatRecipeSurface(string stateFilePath) + public static AetheriaRuntimeSurfaceDocument ProjectStatRecipeSurfaceDocument(string stateFilePath) { var state = ProjectStatRecipeSurfaceState(stateFilePath); - var document = AetheriaRuntimeStatRecipeSurfaceBuilder.Build( - state); - return AetheriaRuntimeEveSurfaceAdapter.ToEveSurfaceDocument(document); + return AetheriaRuntimeStatRecipeSurfaceBuilder.Build(state); } private static AetheriaRuntimeStatRecipeSurfaceState ProjectStatRecipeSurfaceState(string stateFilePath) diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonEditorSurfaceBuilder.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonEditorSurfaceBuilder.cs index ac5452736..4f663e1e8 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonEditorSurfaceBuilder.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonEditorSurfaceBuilder.cs @@ -15,11 +15,13 @@ namespace GameCult.Aetheria.State.Verse public static AetheriaRuntimeSurfaceDocument Build( AetheriaRuntimeDaemonProviderAdvertisementDocument provider, AetheriaRuntimeDaemonHealthDocument health, - AetheriaRuntimeDaemonCommandBoundaryDocument commandBoundary) + AetheriaRuntimeDaemonCommandBoundaryDocument commandBoundary, + IReadOnlyList? designerSurfaces = null) { provider ??= new AetheriaRuntimeDaemonProviderAdvertisementDocument(); health ??= new AetheriaRuntimeDaemonHealthDocument(); commandBoundary ??= AetheriaRuntimeDaemonCommandBoundaryDocument.Create(provider.DaemonId); + designerSurfaces ??= Array.Empty(); return new AetheriaRuntimeSurfaceDocument( providerId: "aetheria.daemon", @@ -94,6 +96,16 @@ namespace GameCult.Aetheria.State.Verse commandBoundary.Commands .Take(16) .Select((entry, index) => CommandRow(index, entry)) + .ToArray())), + Node( + "aetheria.daemon.editor.designer_surfaces", + "card", + new[] { ("title", "Designer Surfaces") }, + Row( + "aetheria.daemon.editor.designer_surfaces.rows", + designerSurfaces + .Where(surface => surface != null) + .Select((surface, index) => DesignerSurfaceRow(index, surface)) .ToArray()))), Array.Empty()), commands: commandBoundary.Commands @@ -104,6 +116,23 @@ namespace GameCult.Aetheria.State.Verse .ToArray()); } + private static AetheriaRuntimeSurfaceComponent DesignerSurfaceRow( + int index, + AetheriaRuntimeSurfaceDocument surface) + { + return Node( + $"aetheria.daemon.editor.designer_surfaces.{index}", + "inspector.kv", + new[] + { + ("title", surface.Title), + ("surfaceId", surface.Surface.Id), + ("provider", surface.ProviderId), + ("kind", surface.ProviderKind), + ("commands", surface.Commands.Count.ToString(CultureInfo.InvariantCulture)) + }); + } + private static AetheriaRuntimeSurfaceComponent CommandRow( int index, AetheriaRuntimeDaemonCommandBoundaryEntry entry) diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonTickRunner.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonTickRunner.cs index 9f7176e92..c47885456 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonTickRunner.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonTickRunner.cs @@ -165,10 +165,15 @@ namespace GameCult.Aetheria.State.Verse var gameTuiSurfacePath = AetheriaRuntimeDaemonPublicationStore.PublishGameTuiSurface( stateFilePath, gameSurface); + var designerSurfaces = new[] + { + AetheriaRuntimeCatalogStore.ProjectStatRecipeSurfaceDocument(stateFilePath) + }; var editorSurface = AetheriaRuntimeDaemonEditorSurfaceBuilder.Build( providerAdvertisement, health, - commandBoundary); + commandBoundary, + designerSurfaces); var editorSurfacePath = AetheriaRuntimeDaemonPublicationStore.PublishEditorSurface( stateFilePath, editorSurface);