Cut 8b. Aetheria.Shared builds headless against GameCult.Caching and
GameCult.Caching.MessagePack at the pinned CultLib; the pin guard also
checks the Caching project exists.
Documents: [CultDocument("aetheria.<type>", "1")] with [MessagePackObject]
and integer [Key]s on the Q7 concrete types (the eight ItemData leaves,
Faction, FactionProductData, PersonalityAttribute, NameFile, OrbitData, the
four BodyData leaves, SavedZone, SavedGame, PlayerSettings, InputLayout).
SavedGame and PlayerSettings are [CultGlobal]; Name members are [CultName].
ItemData, CraftedItemData, EquippableItemData, BodyData and AgentTask lose
[MessagePackObject]; BodyData and AgentTask lose their [Union]s. InputLayout
moves into ServerShared so AetheriaStores can route it.
References: Guid and DatabaseLink<T> members become CultRecordRef<T>;
Guid-keyed maps become ref-keyed with [CultReference(..., many: true)];
ZonePack holds refs to orbit and body records. Runtime maps (Zone orbits,
bodies and belts, cargo ItemsOfType, agent targets) key by CultRecordKey.
Identity is the record key: ID comparisons become reference or key
comparisons. StatModifierData.RequireBehavior is a simple type name.
AetheriaStores.Open composes the catalog (read-only unless writable), run
and player stores, one home per type. CultRecordRefs carries IsSet, a
null-safe Get(ref), RefOf (key from TryGetHandle) and Upsert.
ItemManager.GetData is the one item resolution path. MathResolver is
declared by [assembly: CultCacheFormatterResolver].
Inspector attributes: text, range and asset path map onto CultLib's
CultInspector attributes (asset path only on string members); every
replaced Aetheria attribute keeps [Inspectable] for the runtime panel.
Builds: Aetheria.Shared. Does not build: AetherDb and the Unity project,
which follow.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
103 lines
2.7 KiB
C#
103 lines
2.7 KiB
C#
using System.Collections.Generic;
|
|
using GameCult.Caching;
|
|
using MessagePack;
|
|
using Newtonsoft.Json;
|
|
|
|
[CultDocument("aetheria.inputlayout", "1"), MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class InputLayout
|
|
{
|
|
[Key(0), JsonProperty("rows")] public InputLayoutRow[] Rows;
|
|
|
|
public IEnumerable<InputLayoutBindableKey> GetBindableKeys()
|
|
{
|
|
foreach (var row in Rows)
|
|
{
|
|
if (!(row is InputLayoutKeyRow keyRow)) continue;
|
|
|
|
foreach (var column in keyRow.Columns)
|
|
{
|
|
if (column is InputLayoutBindableKey bindableKey)
|
|
{
|
|
yield return bindableKey;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
[MessagePackObject,
|
|
Union(0, typeof(InputLayoutRowSpacer)),
|
|
Union(1, typeof(InputLayoutKeyRow))
|
|
]
|
|
public abstract class InputLayoutRow { }
|
|
|
|
[MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class InputLayoutRowSpacer : InputLayoutRow
|
|
{
|
|
[Key(0), JsonProperty("height")] public float Height;
|
|
}
|
|
|
|
[MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class InputLayoutKeyRow : InputLayoutRow
|
|
{
|
|
[Key(0), JsonProperty("columns")] public InputLayoutColumn[] Columns;
|
|
}
|
|
|
|
[MessagePackObject,
|
|
Union(0, typeof(InputLayoutColumnSpacer)),
|
|
Union(1, typeof(InputLayoutKey)),
|
|
Union(2, typeof(InputLayoutBindableKey)),
|
|
Union(3, typeof(InputLayoutMultiRowKey))
|
|
]
|
|
public abstract class InputLayoutColumn
|
|
{
|
|
[Key(0), JsonProperty("width")] public float Width;
|
|
}
|
|
|
|
[MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class InputLayoutColumnSpacer : InputLayoutColumn { }
|
|
|
|
[MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class InputLayoutKey : InputLayoutColumn { }
|
|
|
|
[MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class InputLayoutBindableKey : InputLayoutKey, IBindableButton
|
|
{
|
|
[Key(1), JsonProperty("mainLabel")] public string MainLabel;
|
|
[Key(2), JsonProperty("altLabel")] public string AltLabel;
|
|
[Key(3), JsonProperty("path")] public string ShortPath;
|
|
|
|
[IgnoreMember]
|
|
public string InputSystemPath
|
|
{
|
|
get
|
|
{
|
|
return $"<Keyboard>/{ShortPath}";
|
|
}
|
|
set
|
|
{
|
|
ShortPath = value.Substring(value.LastIndexOf('/') + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
[MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class InputLayoutMultiRowKey : InputLayoutBindableKey
|
|
{
|
|
[Key(4), JsonProperty("height")] public int Height;
|
|
}
|
|
|
|
public class InputLayoutMouseButton : IBindableButton
|
|
{
|
|
public string Path;
|
|
public string InputSystemPath
|
|
{
|
|
get => Path;
|
|
set => Path = value;
|
|
}
|
|
}
|
|
|
|
public interface IBindableButton
|
|
{
|
|
public string InputSystemPath { get; set; }
|
|
}
|