From 91b79265b9d13443daf055671d337e0524491ef9 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 5 Jul 2026 15:12:29 +0100 Subject: [PATCH] Move RTS body icon authority to daemon --- Aetheria RTS.lnk | Bin 0 -> 1163 bytes .../Client/aetheria-rts-contract.ts | 1 + .../Electron/aetheria-cultmesh.ts | 50 ++++++++++++------ .../aetheria-rts-generated-bindings.ts | 13 +++-- .../Electron/aetheria-rts-local-documents.ts | 1 + .../scripts/generate-rts-bindings.mjs | 3 ++ Aetheria.State.Daemon/Program.cs | 43 +++++++++++---- .../Runtime/AetheriaRuntimeDaemonDocuments.cs | 10 +++- .../AetheriaRuntimeDaemonRenderQueries.cs | 19 +++++++ .../AetheriaRuntimeDaemonTickRunner.cs | 5 +- .../Runtime/AetheriaRuntimeRtsDocuments.cs | 9 ++-- .../AetheriaRuntimeRtsViewportDocuments.cs | 3 ++ .../AetheriaRuntimeSnapshotDocuments.cs | 3 ++ 13 files changed, 125 insertions(+), 35 deletions(-) create mode 100644 Aetheria RTS.lnk diff --git a/Aetheria RTS.lnk b/Aetheria RTS.lnk new file mode 100644 index 0000000000000000000000000000000000000000..713c0ce380c621f7001ece1f0365987ec90164a6 GIT binary patch literal 1163 zcmb_aT}V@57=C6el)RXv!+ykrp+!H(&8eG%z%^S-)>=yD*~i zDk!@sB%&xR5&|Qm@-A;gy7EFHB#9yri7=vzp6}o$O`)4Uc)s^N&-;GQ`+o0tJOFgX zdE9|_+78zetwdb;t{NRbXLLV$cWq4<&gxz{yR>ik)@zwMZC}~ybj2w5eLONHeYLBG z`_uW@Z8F{6jB2M{S;@+JEih~ToYLVnAfU#=ov8#GQ2;#_-dt{dY@b)0CuQa=nhe}? z%MITv(*>X+hA=vjLV`I)oXDzPj2YnXNhBjtOAWAp4c%$$TDpBDPvA!n^^%An3JZ7~ zrDzeBSD#R>-jWcChUG{)lI>Tp^GdVU?~=YM+pj*`w(HwCLevXGrf!-L{Q}Lzw&i?b z_Yz_qB8rH0#Mp*CZK79jl*^M+GIvultzbJm2%?)4389@&=wOW`y$Ir*Q;^It9OvC6 z96$%z5TkLk|$G3dWJLMg1l1H8$9UK+0HiEA<)JiK>A{mUIRpa8pwe@M|!k4%GCilaag)^5N zKK+jClb-YG#iHBKU&wcUDO3N7f1pYM^#^FpexHBtTC3}|$L1XSz3FDvV07{VdA+Dq zPE-?q{#0h7j;PVRTH0EA7MN)3X>E*I&_J%9c^0yDurf=qHhO0IR&v4@I%b|Uk;|+G wI-;2oW3=h%K$rWGyHS3yFMXqoe7i_;i|t_lgyX%_)#vLiEy@pg1(jKU0Q^VlPXGV_ literal 0 HcmV?d00001 diff --git a/Aetheria.Rts.Web/Client/aetheria-rts-contract.ts b/Aetheria.Rts.Web/Client/aetheria-rts-contract.ts index 67305e261..51cc54f7f 100644 --- a/Aetheria.Rts.Web/Client/aetheria-rts-contract.ts +++ b/Aetheria.Rts.Web/Client/aetheria-rts-contract.ts @@ -339,6 +339,7 @@ export type BodyView = { radius: number; isAsteroidBelt: boolean; iconAsset: AssetRef; + iconSize: number; }; diff --git a/Aetheria.Rts.Web/Electron/aetheria-cultmesh.ts b/Aetheria.Rts.Web/Electron/aetheria-cultmesh.ts index 43fcf728e..de7f16b5f 100644 --- a/Aetheria.Rts.Web/Electron/aetheria-cultmesh.ts +++ b/Aetheria.Rts.Web/Electron/aetheria-cultmesh.ts @@ -70,6 +70,19 @@ type AetheriaPublicationDocumentSpec = CultMeshPublicationDocumentBinding & { readonly remoteRecordKey?: string; }; +type AetheriaRuntimeRtsQueryExecutors = { + mapViewport: (request: ViewportRequest) => Promise; + objectsViewport: (request: ViewportRequest) => Promise; + gravityViewport: (request: ViewportRequest) => Promise; + renderSplatsViewport: (request: ViewportRequest) => Promise; + selectedObject: (request: SelectedObjectRequest) => Promise; + inventory: (request: SelectedObjectRequest) => Promise; + daemonHealth: () => Promise; + authorityStatus: () => Promise; + starbridgeSession: () => Promise; + assetManifest: () => Promise; +}; + export type AetheriaCultMeshClientOptions = { publicationMode?: "local" | "remote"; snapshotTimeoutMs?: number; @@ -211,6 +224,7 @@ export class AetheriaCultMeshClient { starbridgeSession: async () => readStarbridgeSessionSummaryDocument(await this.fetchStarbridgeSessionSummaryDocument()), assetManifest: async () => readAssetManifestDocument(await this.fetchAssetManifestDocument()), }; + this.queryExecutors = executors; this.queries = createAetheriaRuntimeRtsQueryHandles( executors, this.queryVerse.context.routeHint, @@ -251,6 +265,7 @@ export class AetheriaCultMeshClient { private readonly publicationDescription: string; private readonly publications: CultMeshDocumentCatalog; + private readonly queryExecutors: AetheriaRuntimeRtsQueryExecutors; private readonly queries: ReturnType; private readonly documents: AetheriaRuntimeRtsDocuments; private readonly operations: AetheriaRuntimeRtsOperationHandles; @@ -278,27 +293,27 @@ export class AetheriaCultMeshClient { } public async mapViewport(request: ViewportRequest): Promise { - return this.aetheria.zone().viewport.within(request); + return this.queryExecutors.mapViewport(request); } public async objectsViewport(request: ViewportRequest): Promise { - return this.aetheria.zone().objects.visibleWithin(request); + return this.queryExecutors.objectsViewport(request); } public async gravityViewport(request: ViewportRequest): Promise { - return this.aetheria.zone().gravity.within(request); + return this.queryExecutors.gravityViewport(request); } public async renderSplatsViewport(request: ViewportRequest): Promise { - return this.aetheria.zone().renderSplats.within(request); + return this.queryExecutors.renderSplatsViewport(request); } public async selectedObject(request: SelectedObjectRequest): Promise { - return this.aetheria.selectedObject(request.entityIndex); + return this.queryExecutors.selectedObject(request); } public async inventory(request: SelectedObjectRequest): Promise { - return this.aetheria.inventory(request.entityIndex); + return this.queryExecutors.inventory(request); } public async daemonHealth(): Promise { @@ -533,16 +548,16 @@ export class AetheriaCultMeshClient { selectedObject, inventory, ] = await Promise.all([ - this.aetheria.zone().gravity.within(request.viewport), - this.aetheria.daemon.health(), - this.aetheria.daemon.authorityStatus(), - this.aetheria.daemon.starbridgeSession(), - this.aetheria.daemon.assetManifest(), + this.queryExecutors.gravityViewport(request.viewport), + this.queryExecutors.daemonHealth(), + this.queryExecutors.authorityStatus(), + this.queryExecutors.starbridgeSession(), + this.queryExecutors.assetManifest(), selectedEntityIndex >= 0 - ? this.aetheria.selectedObject(selectedEntityIndex) + ? this.queryExecutors.selectedObject({ entityIndex: selectedEntityIndex }) : Promise.resolve(null), selectedEntityIndex >= 0 - ? this.aetheria.inventory(selectedEntityIndex) + ? this.queryExecutors.inventory({ entityIndex: selectedEntityIndex }) : Promise.resolve(null), ]); @@ -658,14 +673,14 @@ function normalizeDaemonTarget(target: string | AetheriaCultMeshDaemonTarget): R async function retryTransientPublicationRead(read: () => Promise): Promise { let lastError: unknown; - for (let attempt = 0; attempt < 8; attempt += 1) { + for (let attempt = 0; attempt < 40; attempt += 1) { try { return await read(); } catch (error) { lastError = error; if (!isTransientPublicationReadError(error)) throw error; - await delay(20 + attempt * 15); + await delay(25 + attempt * 8); } } throw lastError; @@ -673,7 +688,10 @@ async function retryTransientPublicationRead(read: () => Promise): Promise function isTransientPublicationReadError(error: unknown): boolean { const message = error instanceof Error ? error.message : String(error); - return message.includes("EBUSY") || message.includes("EPERM") || message.includes("ENOENT"); + return message.includes("EBUSY") || + message.includes("EPERM") || + message.includes("ENOENT") || + message.includes("did not contain schema"); } function buildMainMenuSurface( diff --git a/Aetheria.Rts.Web/Electron/aetheria-rts-generated-bindings.ts b/Aetheria.Rts.Web/Electron/aetheria-rts-generated-bindings.ts index 4aaa83348..183247c93 100644 --- a/Aetheria.Rts.Web/Electron/aetheria-rts-generated-bindings.ts +++ b/Aetheria.Rts.Web/Electron/aetheria-rts-generated-bindings.ts @@ -254,7 +254,8 @@ export type AetheriaRuntimeDaemonFrameDocumentSlot = | "rejectedImportedFactIds" | "duplicateImportedFactIds" | "cumulativeImportedFactIds" - | "cumulativeRejectedImportedFactIds"; + | "cumulativeRejectedImportedFactIds" + | "renderSettings"; export const aetheriaRuntimeDaemonFrameDocumentSlots: Record = { schema: 0, @@ -278,6 +279,7 @@ export const aetheriaRuntimeDaemonFrameDocumentSlots: Record = { kind: 1, @@ -1122,6 +1125,7 @@ export const aetheriaRuntimeBodySnapshotCommitSlots: Record = { bodyKey: 0, @@ -1335,6 +1340,7 @@ export const aetheriaRuntimeRtsBodyViewSlots: Record TickAsync( : currentFrame.SessionId; var run = HasPlayableRun(currentFrame?.Run) && HasRtsScenario(currentFrame?.Run) ? currentFrame!.Run - : await ReadRuntimeRunCheckpointAsync(node).ConfigureAwait(false) ?? new AetheriaRuntimeRunCheckpointCommit(); + : await ReadRuntimeRunCheckpointAsync(node, options.RenderSettings).ConfigureAwait(false) ?? new AetheriaRuntimeRunCheckpointCommit(); + ApplyDaemonRenderSettings(run, options.RenderSettings); var loadoutTemplates = node.Cache .GetAll() @@ -175,6 +176,7 @@ static async Task TickAsync( CumulativeAppliedCommandIds = currentFrame?.CumulativeAppliedCommandIds ?? currentFrame?.AppliedCommandIds ?? Array.Empty(), CumulativeRejectedCommandIds = currentFrame?.CumulativeRejectedCommandIds ?? currentFrame?.RejectedCommandIds ?? Array.Empty(), Catalog = node.RuntimeCatalog().Latest(), + RenderSettings = options.RenderSettings, StarbridgeScenario = starbridgeScenario, StarbridgeSession = starbridgeSession, BuildPublications = buildPublications, @@ -1684,12 +1686,15 @@ static async Task EnsureTradeValuePolicyAsync(AetheriaStateNode node, string now now)).ConfigureAwait(false); } -static async Task EnsurePlayableRunDocumentsAsync(AetheriaStateNode node, string now) +static async Task EnsurePlayableRunDocumentsAsync( + AetheriaStateNode node, + AetheriaDaemonHostOptions options, + string now) { var settings = await node.MutableDocument(AetheriaStateNode.PlayerSettingsKey).ReadAsync().ConfigureAwait(false); if (!string.IsNullOrWhiteSpace(settings?.ActiveRunKey)) { - var existingRun = await ReadRuntimeRunCheckpointAsync(node).ConfigureAwait(false); + var existingRun = await ReadRuntimeRunCheckpointAsync(node, options.RenderSettings).ConfigureAwait(false); if (HasPlayableRun(existingRun) && HasRtsScenario(existingRun)) return; } @@ -1846,7 +1851,9 @@ static async Task EnsureVerseAuthorityPolicyAsync( .ConfigureAwait(false); } -static async Task ReadRuntimeRunCheckpointAsync(AetheriaStateNode node) +static async Task ReadRuntimeRunCheckpointAsync( + AetheriaStateNode node, + AetheriaRuntimeDaemonRenderSettings renderSettings) { var settings = await node.MutableDocument(AetheriaStateNode.PlayerSettingsKey).ReadAsync().ConfigureAwait(false); if (string.IsNullOrWhiteSpace(settings?.ActiveRunKey)) @@ -1864,7 +1871,7 @@ static async Task ReadRuntimeRunCheckpointA if (zone == null) continue; - zones.Add(await ToRuntimeZoneAsync(node, zone, zoneIndex).ConfigureAwait(false)); + zones.Add(await ToRuntimeZoneAsync(node, zone, zoneIndex, renderSettings).ConfigureAwait(false)); } return new AetheriaRuntimeRunCheckpointCommit @@ -1893,7 +1900,8 @@ static async Task ReadRuntimeRunCheckpointA static async Task ToRuntimeZoneAsync( AetheriaStateNode node, AetheriaZoneState zone, - int zoneIndex) + int zoneIndex, + AetheriaRuntimeDaemonRenderSettings renderSettings) { var entityKeys = zone.EntityKeys ?? Array.Empty(); var entityIndices = entityKeys @@ -1919,7 +1927,7 @@ static async Task ToRuntimeZoneAsync( OwnerFactionIndex = zone.OwnerFactionIndex, Entities = entities, Orbits = (zone.Orbits ?? Array.Empty()).Select(ToRuntimeOrbit).ToArray(), - Bodies = (zone.Bodies ?? Array.Empty()).Select(body => ToRuntimeBody(body, entityIndices)).ToArray(), + Bodies = (zone.Bodies ?? Array.Empty()).Select(body => ToRuntimeBody(body, entityIndices, renderSettings)).ToArray(), DroppedPickups = (zone.DroppedPickups ?? Array.Empty()).Select(ToRuntimePickup).ToArray(), GravityTerrainRadius = zone.GravityTerrainRadius, GravityTerrainDepth = zone.GravityTerrainDepth, @@ -2036,7 +2044,8 @@ static AetheriaRuntimeOrbitSnapshotCommit ToRuntimeOrbit(AetheriaOrbitSnapshot o static AetheriaRuntimeBodySnapshotCommit ToRuntimeBody( AetheriaBodySnapshot body, - IReadOnlyDictionary entityIndices) + IReadOnlyDictionary entityIndices, + AetheriaRuntimeDaemonRenderSettings renderSettings) { return new AetheriaRuntimeBodySnapshotCommit { @@ -2106,10 +2115,22 @@ static AetheriaRuntimeBodySnapshotCommit ToRuntimeBody( GravityWellDepth = body.GravityWellDepth, GravityWaveRadius = body.GravityWaveRadius, GravityWaveDepth = body.GravityWaveDepth, - GravityWaveSpeed = body.GravityWaveSpeed + GravityWaveSpeed = body.GravityWaveSpeed, + IconSize = renderSettings.ResolveBodyIconSize(body.Mass) }; } +static void ApplyDaemonRenderSettings( + AetheriaRuntimeRunCheckpointCommit run, + AetheriaRuntimeDaemonRenderSettings renderSettings) +{ + foreach (var zone in run.Zones ?? Array.Empty()) + { + foreach (var body in zone.Bodies ?? Array.Empty()) + body.IconSize = renderSettings.ResolveBodyIconSize(body.Mass); + } +} + static AetheriaRuntimeDroppedPickupCommit ToRuntimePickup(AetheriaDroppedPickupSnapshot pickup) { return new AetheriaRuntimeDroppedPickupCommit @@ -2283,6 +2304,8 @@ internal sealed class AetheriaDaemonHostOptions public TimeSpan TickInterval { get; init; } = TimeSpan.FromMilliseconds(20); public TimeSpan ApiPublicationInterval { get; init; } = TimeSpan.FromSeconds(1); public double FixedDeltaSeconds { get; init; } = 0.02; + public AetheriaRuntimeDaemonRenderSettings RenderSettings { get; init; } = + AetheriaRuntimeDaemonRenderSettings.AetheriaDefault; public bool Once { get; init; } public static AetheriaDaemonHostOptions Parse(IReadOnlyList args) diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonDocuments.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonDocuments.cs index 95af4cd87..fca1f2066 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonDocuments.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonDocuments.cs @@ -532,6 +532,10 @@ namespace GameCult.Aetheria.State.Verse [Key(20)] public IReadOnlyList CumulativeRejectedImportedFactIds { get; set; } = Array.Empty(); + [Key(21)] + public AetheriaRuntimeDaemonRenderSettings RenderSettings { get; set; } = + AetheriaRuntimeDaemonRenderSettings.AetheriaDefault; + public static AetheriaRuntimeDaemonFrameDocument Create( AetheriaRuntimeRunCheckpointCommit run, string daemonId, @@ -540,7 +544,8 @@ namespace GameCult.Aetheria.State.Verse double simulationTimeSeconds, double fixedDeltaSeconds, bool isAuthoritative = true, - string stateSource = "daemon") + string stateSource = "daemon", + AetheriaRuntimeDaemonRenderSettings? renderSettings = null) { return new AetheriaRuntimeDaemonFrameDocument { @@ -552,7 +557,8 @@ namespace GameCult.Aetheria.State.Verse FixedDeltaSeconds = fixedDeltaSeconds, IsAuthoritative = isAuthoritative, StateSource = string.IsNullOrWhiteSpace(stateSource) ? "daemon" : stateSource, - Run = run ?? new AetheriaRuntimeRunCheckpointCommit() + Run = run ?? new AetheriaRuntimeRunCheckpointCommit(), + RenderSettings = renderSettings ?? AetheriaRuntimeDaemonRenderSettings.AetheriaDefault }; } } diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonRenderQueries.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonRenderQueries.cs index 1beb3782f..2d346a6ec 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonRenderQueries.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonRenderQueries.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using CultMath; +using MessagePack; #nullable enable @@ -42,6 +43,7 @@ namespace GameCult.Aetheria.State.Verse } } + [MessagePackObject(true)] public readonly struct AetheriaRuntimeExponentialCurve { public AetheriaRuntimeExponentialCurve(double exponent, double multiplier, double constant) @@ -61,8 +63,25 @@ namespace GameCult.Aetheria.State.Verse } } + [MessagePackObject(true)] public readonly struct AetheriaRuntimeDaemonRenderSettings { + public static AetheriaRuntimeDaemonRenderSettings AetheriaDefault { get; } = + new AetheriaRuntimeDaemonRenderSettings( + default, + default, + default, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + bodyIconSizeCurve: new AetheriaRuntimeExponentialCurve(0.15, 10.0, 25.0), + bodyRadiusCurve: default, + lightRadiusCurve: default, + gravityWaveFrequencyCurve: default); + public AetheriaRuntimeDaemonRenderSettings( AetheriaRuntimeExponentialCurve temperatureEmissionCurve, AetheriaRuntimeExponentialLerp lockIndicatorFrequency, diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonTickRunner.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonTickRunner.cs index bf0b0e789..527f5d1dc 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonTickRunner.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonTickRunner.cs @@ -30,6 +30,8 @@ namespace GameCult.Aetheria.State.Verse public AetheriaRuntimeStarbridgeScenarioDocument? StarbridgeScenario { get; set; } public AetheriaRuntimeStarbridgeSessionDocument? StarbridgeSession { get; set; } public AetheriaRuntimeCatalogSnapshot? Catalog { get; set; } + public AetheriaRuntimeDaemonRenderSettings RenderSettings { get; set; } = + AetheriaRuntimeDaemonRenderSettings.AetheriaDefault; public bool BuildPublications { get; set; } = true; } @@ -136,7 +138,8 @@ namespace GameCult.Aetheria.State.Verse options.SessionId, options.FrameId, options.SimulationTimeSeconds, - options.FixedDeltaSeconds); + options.FixedDeltaSeconds, + renderSettings: options.RenderSettings); frame.AppliedCommandIds = operationResult.AppliedCommandIds; frame.RejectedCommandIds = operationResult.RejectedCommandIds; frame.AccountedCommandIds = accountedBeforeTick diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeRtsDocuments.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeRtsDocuments.cs index f1996a3fa..3798beae8 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeRtsDocuments.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeRtsDocuments.cs @@ -99,7 +99,7 @@ namespace GameCult.Aetheria.State.Verse ZoneName = string.IsNullOrWhiteSpace(zone.Name) ? $"Zone {zone.ZoneIndex}" : zone.Name, Viewport = normalizedViewport, GravityInfluences = visibleBodies.Select(ToGravityInfluence).ToArray(), - Bodies = visibleBodies.Select(ToBodyView).ToArray(), + Bodies = visibleBodies.Select(body => ToBodyView(body, frame.RenderSettings)).ToArray(), TerrainRadius = zone.GravityTerrainRadius, TerrainDepth = zone.GravityTerrainDepth, TerrainDepthExponent = zone.GravityTerrainDepthExponent, @@ -850,7 +850,9 @@ namespace GameCult.Aetheria.State.Verse return obj; } - private static AetheriaRuntimeRtsBodyView ToBodyView(AetheriaRuntimeBodySnapshotCommit body) + private static AetheriaRuntimeRtsBodyView ToBodyView( + AetheriaRuntimeBodySnapshotCommit body, + AetheriaRuntimeDaemonRenderSettings renderSettings) { var view = new AetheriaRuntimeRtsBodyView { @@ -862,7 +864,8 @@ namespace GameCult.Aetheria.State.Verse Y = body.GravityInfluenceCenterZ, Radius = Math.Max(32, body.BodyRadiusMultiplier * 70), IsAsteroidBelt = (body.Kind ?? "").IndexOf("asteroid", StringComparison.OrdinalIgnoreCase) >= 0, - Body = body + Body = body, + IconSize = body.IconSize > 0 ? body.IconSize : renderSettings.ResolveBodyIconSize(body.Mass) }; view.IconAsset = AetheriaRuntimeAssets.ResolveBodyIcon(view); return view; diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeRtsViewportDocuments.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeRtsViewportDocuments.cs index 95f25b8ae..1bbbebb08 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeRtsViewportDocuments.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeRtsViewportDocuments.cs @@ -1498,5 +1498,8 @@ namespace GameCult.Aetheria.State.Verse [Key(9)] public AetheriaRuntimeAssetRef IconAsset { get; set; } = AetheriaRuntimeAssetRef.Empty(AetheriaRuntimeAssetKinds.Sprite); + + [Key(10)] + public double IconSize { get; set; } } } diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeSnapshotDocuments.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeSnapshotDocuments.cs index f2c5a3bfc..f9736aa5d 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeSnapshotDocuments.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeSnapshotDocuments.cs @@ -599,6 +599,9 @@ namespace GameCult.Aetheria.State.Verse [Key(21)] public double GravityWaveSpeed { get; set; } + + [Key(22)] + public double IconSize { get; set; } } [MessagePackObject]