diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index e231886f5..6463f9164 100644 Binary files a/.voidbot/state/aetheria.cc and b/.voidbot/state/aetheria.cc differ diff --git a/Aetheria.State.Verify/Aetheria.State.Verify.csproj b/Aetheria.State.Verify/Aetheria.State.Verify.csproj index ca788873d..e9e2dc0f7 100644 --- a/Aetheria.State.Verify/Aetheria.State.Verify.csproj +++ b/Aetheria.State.Verify/Aetheria.State.Verify.csproj @@ -9,5 +9,6 @@ + diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 4d18d0288..db6e844ce 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -1,5 +1,6 @@ using Aetheria.State; using Aetheria.State.Documents; +using GameCult.Aetheria.State.Unity; var root = args.Length > 0 ? Path.GetFullPath(args[0]) : Directory.GetCurrentDirectory(); var statePath = args.Length > 1 @@ -86,13 +87,13 @@ var importedThermalCurveItems = items.Count(item => item.ThermalPerformanceCurve var thermalResilienceItems = items.Count(item => item.ThermalResilience > 0); var audioStatItems = items.Count(item => item.AudioStats.Length > 0); var audioStatCount = items.Sum(item => item.AudioStats.Length); -var consumableItems = items.Count(item => item.Category == "ConsumableItemData"); -var consumableDurationItems = items.Count(item => item.Category == "ConsumableItemData" && item.Duration > 0); +var consumableItems = items.Count(item => item.Category == AetheriaRuntimeItemCategories.Consumable); +var consumableDurationItems = items.Count(item => item.Category == AetheriaRuntimeItemCategories.Consumable && item.Duration > 0); var consumableEffectivenessItems = items.Count(item => item.EffectivenessCurveKeys.Length > 0); var actionBarIconItems = items.Count(item => !string.IsNullOrWhiteSpace(item.ActionBarIcon)); -var dockingBayItems = items.Count(item => item.Category == "DockingBayData"); +var dockingBayItems = items.Count(item => item.Category == AetheriaRuntimeItemCategories.DockingBay); var dockingBayMaxSizeItems = items.Count(item => - item.Category == "DockingBayData" && + item.Category == AetheriaRuntimeItemCategories.DockingBay && item.DockingMaxSizeX > 0 && item.DockingMaxSizeY > 0); var describedCorporations = corporations.Count(corporation => !string.IsNullOrWhiteSpace(corporation.Description)); diff --git a/docs/aetheria-perfect-machine-map.md b/docs/aetheria-perfect-machine-map.md index 585e82efb..81adc08bb 100644 --- a/docs/aetheria-perfect-machine-map.md +++ b/docs/aetheria-perfect-machine-map.md @@ -549,7 +549,9 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. map is keyed by typed behavior payload kind rather than legacy union key. Runtime item category classification uses package-owned `AetheriaRuntimeItemCategories` tokens; gameplay code should not ask C# - legacy DTO class names to classify typed catalog rows. + legacy DTO class names to classify typed catalog rows. The typed state + verifier also consumes those package-owned category tokens for consumable and + docking-bay coverage checks instead of hardcoding migrated class-name strings. Item/behavior DTO field layout for the temporary projection bridge is now marked with project-owned `LegacyPayloadKeyAttribute`, not MessagePack metadata. Item properties