From a8f6df5bb1562868ad78903ff4f65cfe1069472c Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 14 Jun 2026 04:35:51 +0100 Subject: [PATCH] Use typed item mass and thermal facts --- .voidbot/state/aetheria.cc | Bin 63215 -> 63708 bytes Aetheria.State.Import/Program.cs | 7 ++++ .../AetheriaRuntimeCatalogSnapshotMapper.cs | 1 + Aetheria.State.Verify/Program.cs | 9 ++++- .../Documents/AetheriaItemDefinition.cs | 3 ++ .../AetheriaRuntimeItemCatalog.cs | 13 +++++++ Assets/Scripts/ServerShared/ItemManager.cs | 34 ++++++++++++++---- GameData/aetheria-world.cc | Bin 30542 -> 30723 bytes ...fa831c114bded61755656ce143acff8498.msgpack | 2 +- ...6bcb5217c5fee889541667442528a98491.msgpack | 4 +-- ...a275af9147897cd1f60b23a18cc48b7fee.msgpack | 4 +-- ...3921217d7ba077f48246e0b33fc1493431.msgpack | 4 +-- ...3fbff428c15ab389a42d0d2aa0e75980fd.msgpack | 2 +- ...6b93b4259541f580967a52464d9686f3aa.msgpack | 4 +-- ...fdee0c7ff471c8bb4b4e0b2067eb36da09.msgpack | 4 +-- ...cc1c87e1e40afcab2bb8dd8f889fe0918b.msgpack | 2 +- ...1ac1edd3dffac04996b12d9f9d0e8304f1.msgpack | 2 +- ...1368ec2948a11425e377fa92a71d575637.msgpack | 4 +-- ...8858c36442af01034165db67b886e94ce3.msgpack | 4 +-- ...2cd5bdbf86136a558044079cba7a029ac8.msgpack | 4 +-- ...6ba52bd445978bb0cb399047cf64aa722f.msgpack | 4 +-- ...3e8ff05893f872c2437a5621f2a2eec71b.msgpack | 4 +-- ...9bb06b3f45a746ac5f7739b1cbd896443f.msgpack | 4 +-- ...07d0fb3e1d5d58fbc176520a100614f404.msgpack | 2 +- ...48df04cfa2250b7101fc00f9c6f2c1317c.msgpack | 4 +-- ...06e97680a29efe7d1436947e3a8eba4c95.msgpack | 4 +-- ...2ccd793983d2af31967b7d70a977fd2e02.msgpack | 4 +-- ...f91cb8ca685ea96318a795771ae6d911eb.msgpack | 4 +-- ...db27aa2b805705e823bed4877c4623cf88.msgpack | 4 +-- ...5eead201bac20496fa5a2649e4b1522a37.msgpack | 4 +-- ...fa0290206edd7b2e0dc08b0f9842dea0f2.msgpack | 4 +-- ...dd6eeb3d8311f3753af60c2b5596719b15.msgpack | 4 +-- ...d7e3a5d8fa1509efb8a9249d0e48891299.msgpack | 2 +- ...c76a739617023ffa2c2aeb091cf5580b7d.msgpack | 2 +- ...f5bd89832b6e55959ea4902bfa15bc8117.msgpack | 4 +-- ...d52fa612f479ccbad76307db432c0b6147.msgpack | 2 +- ...268eff507c40681c6b1955fa786f99066c.msgpack | 2 +- ...ad0cb1b8ec9229ee0525bb8571edb6ea32.msgpack | 4 +-- ...1b5d1ba2d39f2014715b235086b087f9b7.msgpack | 2 +- ...616a532f076ae0a66f2257f9c7899100a9.msgpack | 4 +-- ...ae26acc72f64a9ca536b895d59a8675c66.msgpack | 4 +-- ...44c85439d1f3caa1caaf24beb34e7d8d50.msgpack | 2 +- ...9500e6c9192f76c38393eb84bee3345ee0.msgpack | 4 +-- ...dd6ef83562c3b82a0e03c21a37c241f5b8.msgpack | 4 +-- ...5cdcddbcded4980427149dc10ba9eb08a1.msgpack | 2 +- ...baf1c52a76a0e7adce5acb06a2d7f5bd79.msgpack | 4 +-- ...79872da971faf89ceef4c395a64f1b5e88.msgpack | 4 +-- ...60257125aef40381db5877aa16c02b39e4.msgpack | 4 +-- ...ea1ff3e3f204925bb28ccb1d45d2b3d732.msgpack | 4 +-- ...786b7af0cd4f808a703d5f242c9b0fd372.msgpack | 2 +- ...05ae7658005ee7019c3810650baf8e6c4f.msgpack | 4 +-- ...d65f26dcd9e6b2bc9ef89cb16dd16e4b07.msgpack | 4 +-- ...4187f90237d4386c76e3b847376b466dd3.msgpack | 4 +-- ...042b3f00710055061bb4b6d9b2306d14c3.msgpack | 2 +- ...36ce1066ae558fc09801457a30674f515b.msgpack | 4 +-- ...e298fc6ceb8352b047986733e405d6006b.msgpack | 4 +-- ...7cb628668b9e3842a59c0e2dd106a820bb.msgpack | 4 +-- ...b30b7614eb776ee14b16bed525675b67b8.msgpack | 4 +-- ...6321b14e59b2b62a7e914e74771273097a.msgpack | 4 +-- ...d39c7f7412772d7ad9adc1f1db3f39cc10.msgpack | 4 +-- ...e152a6e77f714229898548c45b02cc72d6.msgpack | 4 +-- ...0ecea7ff27435bd9e9d534bcb0c1b892ef.msgpack | 4 +-- ...daf7ada6d75ceaa0a07f1e0dc46d65003f.msgpack | 4 +-- ...25c2c88303bdbc1a54a178c895086e6c55.msgpack | 4 +-- ...320b70986559345e184297437f13bcae7d.msgpack | 4 +-- ...1f7c425775d76ba34c55a9ae879e27b3d8.msgpack | 2 +- ...8181b2c9794fa3a70f803c67de8d0dcff0.msgpack | 4 +-- ...918704bf6ad447ce7a4733664d3888359d.msgpack | 4 +-- ...9358f522e1794e5a675f77b06e99ee061e.msgpack | 2 +- ...fd4bd127dae7ce9a1cc25669b23daffd1b.msgpack | 2 +- ...72d6a82431bf8c842bc57b1c7f3bae4876.msgpack | 4 +-- ...78de0d154287774728c30a461ed0d9e334.msgpack | 4 +-- ...5a77b77ba285ba04fa6e1c678d86988867.msgpack | 4 +-- ...cb33184e1aade105b24afaba265b148ce4.msgpack | 4 +-- ...92a3874ff91d1e08024120231bb836c2bb.msgpack | 4 +-- ...30a284a5876d9f55597d457cebba6a2226.msgpack | 4 +-- ...04c4d886f2bf72ae35b733603966e28d61.msgpack | 4 +-- ...a65e76836067e0661b91eb2fa4cc5c2b3f.msgpack | 4 +-- ...6550ff7ce20b046a653debb4e7bc10e047.msgpack | 2 +- ...2888041296cc8e256b3774e29b1b969c4b.msgpack | 4 +-- ...d247ef4aa34cfbe648b0b1587836dc48cb.msgpack | 2 +- ...eb069ff9e1ed707a2590cedcffc835ac23.msgpack | 4 +-- ...199f861a6986234742cd7d603c9d8cbe86.msgpack | 4 +-- ...699d5fc930104242470efeddc8f9500222.msgpack | 4 +-- ...ef7f34c156794d697606252db56928e23b.msgpack | 4 +-- ...d30298201bd0eced6bfa9c3b7e01d9448c.msgpack | 4 +-- ...946ba31ec32b37bfe4b0829825c4e85029.msgpack | 2 +- ...cb793e7bcf5f7afa2c328d12d6561d0f1e.msgpack | 4 +-- ...56919b8dd915d9fef8f2361b77d9bf6b99.msgpack | 4 +-- ...386b0b8e8f80cfe0ad311061b682ecff95.msgpack | 4 +-- ...1c82be1f818ee634833d6e3e637e694344.msgpack | 4 +-- ...4f2a1a72a54f72c42a4e4c1d0f231586ba.msgpack | 4 +-- ...34144722b989cf3cf2f03431cabc1f3929.msgpack | 4 +-- ...a34a37e5fcb7892a29eb02cf5da1c338de.msgpack | 4 +-- ...c97b1604f21df8132d6305f350e80ba5b7.msgpack | 4 +-- ...98c89c7c57fff60a2c357887e8dc400dc3.msgpack | 2 +- ...c595e7f3aea98935f9e9a6aafdf8b4d9d2.msgpack | 4 +-- ...1539aa45529f4c740066eb5301ed36edfd.msgpack | 4 +-- ...2e4971d71ab5b8b38ac0c89c3f9a764764.msgpack | 2 +- ...cc7b2c41fe7e5fcc138566aa65f6a2b10b.msgpack | 2 +- ...79e8b3e7a51e9d5145e08f639a88de38be.msgpack | 4 +-- ...cb2be74c711de0d5b22f9160aba0ee7ee9.msgpack | 2 +- ...65d32cdc881f54a82297e048ac6adff8ff.msgpack | 4 +-- ...0336d40c18572d3f6ed6318a4008af5a89.msgpack | 4 +-- ...fcd8fa1e9858c270d58ccf5d2170a3842c.msgpack | 4 +-- ...d2064953cbde740647c3a820bacf9c27c3.msgpack | 4 +-- ...33d98be75491a3b1b3af0d080505b31b21.msgpack | 4 +-- ...76f8e8486ae0dd84c256d8c672c54837ec.msgpack | 4 +-- ...7dd3b2bd29116afbf8857d8b5afdc85c8f.msgpack | 4 +-- ...26af1122625e375d29d192aacad668e2a7.msgpack | 4 +-- ...0d87791a49bb911b2e7ab294e1303e180c.msgpack | 4 +-- ...85198b8b38c36fc5417df965fe098c7523.msgpack | 4 +-- ...fdf046f5a7951655cf83dc22938e7563b2.msgpack | 4 +-- ...f4651415e50cce4eb13240370a1394b928.msgpack | 4 +-- ...52a044e5c42314b43945ded225f3009bf9.msgpack | 4 +-- ...b76604f01f891d11f6bc9c079621d2b45c.msgpack | 4 +-- ...dd6056bad45424aaadc0ed86534053fd43.msgpack | 2 +- ...6a84bb1ad648c6e3f72452f8ee47f98cb5.msgpack | 4 +-- ...28230b2636da2c91d4e12ec6c804c8a04a.msgpack | 4 +-- ...480afdb5047dee177edeac207ce337e083.msgpack | 4 +-- ...7f81911af70edf42cb5275ce8f96dee707.msgpack | 2 +- ...07128f325b6f8981e61bf216400dd09f8e.msgpack | 4 +-- ...f4dc349da455027ef5db10f14d88553894.msgpack | 4 +-- ...1ade7f7e67031a1f69bec307690212bb53.msgpack | 4 +-- ...3ff4da3985d54c314bcaf6ceca29a0d80e.msgpack | 4 +-- ...1b1a624f836079caf3f9c892cbc94d0aae.msgpack | 4 +-- ...01600dd1985f3e1ddeeb16b10593afc5ab.msgpack | 2 +- ...08e1a83f1dc14096339f67d56c0e0869ff.msgpack | 4 +-- ...06d60f0e24b919fdf36a025cfddee87011.msgpack | 4 +-- ...0f1c261fbbb7f1961d8acd057a3b287e38.msgpack | 4 +-- ...5b07b6b9ec7bba75debf9915460dbe3e1a.msgpack | 4 +-- ...2762b088b45c2b873b2816cc7dd4e7672c.msgpack | 4 +-- ...e79aecf53d9558fd48290599da73065788.msgpack | 4 +-- ...3dd2a11f08fa54e6ffc699ee7ff032399d.msgpack | 2 +- ...36c731b877c242d1dd966801858145a431.msgpack | 4 +-- ...8668f9d2c05806983d89a8e9227a63871e.msgpack | 4 +-- ...e2540502e68596a3603f76389e57028805.msgpack | 4 +-- ...9ab8ab7bd5c5792eaffa4226a6c04eb105.msgpack | 4 +-- ...b464103bd76e410747a9c9b7ff24e3c4e1.msgpack | 4 +-- ...5ee0f0a8c3001293f5702aa2424e24427e.msgpack | 2 +- ...731eadcb421407c89d781610905a20f024.msgpack | 2 +- ...4a3699e1985d69a91cf8dcb7f4c66bddf5.msgpack | 4 +-- ...25da6d94408d6a3d1d9118f6ee39b59f6b.msgpack | 4 +-- ...27c780283d518bb03ec1796d41885bd88a.msgpack | 4 +-- ...0f473896745b146e5990046afe53ac54b8.msgpack | 2 +- ...e9c2093d642b67286400600a6215e90683.msgpack | 4 +-- ...08270dbd928b514d6de583f46201acc8e6.msgpack | 2 +- ...8f723d3a0a7f48de7e52fe545a530c2559.msgpack | 4 +-- ...3f7d34327c64a8a33c3dfb1809131717a1.msgpack | 4 +-- ...42f2cef8f92eb11513d698d60a8ad234c4.msgpack | 4 +-- ...d4f7d77f094191b2e9d7590b6795950780.msgpack | 4 +-- ...c4bd13b358f1ffb0937b14289d35ab2d53.msgpack | 4 +-- ...6b87f1ba0566a44f3d381b757edb40d25d.msgpack | 4 +-- ...e4f0b2d619dceb69ec354fe56f99488b42.msgpack | 2 +- ...beb23a1fa47461adda98ef10295021480f.msgpack | 4 +-- ...d3f4d154424deaf2f21dd15d213684d46f.msgpack | 4 +-- ...8da4a63ef12a1dc5126b11ebba43840395.msgpack | 2 +- .../Runtime/AetheriaRuntimeCatalogSnapshot.cs | 3 ++ .../Runtime/AetheriaRuntimeCatalogStore.cs | 9 ++++- docs/aetheria-perfect-machine-map.md | 12 +++++-- 160 files changed, 344 insertions(+), 275 deletions(-) diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index 9625b9a43e99e826d12a62e34a09c6f4d7e36058..90fe1661fa9db6fab98539c9cff1756ef694afcf 100644 GIT binary patch delta 1564 zcmaJ>O>7%Q6ee+hk_rw)l$3~{2UJu9dtEn4Yg(ELskF@@q79Ky1Bi}ypS=_9?rdjf z-uHd) zXY+RH)}7Kc3!@_> zFO!xn({YjojOq=2hbzP8LqqbQgfTsE4Nz-pW_-2F!8Z)_JlcibAP`2;a|Is&YvbUg0OHB-2w>y?PjeuSEb+9 zon^kOwsY@l=P~o=m5S-|9V4%rlh0yZ+N|5l6C2+SBK6+>&iau92VCTx-`*NT+&0hm-o7?I2-R2q29P#F A82|tP delta 1057 zcmZXTPe@cj9LLkOP$4QQ5i0tf%v9EO)zl6_p@D};L;~#}<9oliJ2`LWIWte&JSbipB-Fp&c( z<`f9d3TYVOj_?D98p|~m>g0q{B^PrLo>mA1IEGqUPceK6y;Nov!sg=eOh|)(OfekM z=nvVe(n}h-vaZ*c_GhCsWvuMf+9QHU{sKBnaRTwTnKy==Gxz}cby_0Pp#`9=RJkYS8$O$#5ya<^KzL+)7SxeEj zCCRM{5Rd{B#08Hcb5&;?J-6`0W_|Et61OKtOUM$BU4az$6MUcvt959r+59NBM&FB+=ObYk~&LsjaT{0|R4i@pE= diff --git a/Aetheria.State.Import/Program.cs b/Aetheria.State.Import/Program.cs index 3f798a676..76babecf3 100644 --- a/Aetheria.State.Import/Program.cs +++ b/Aetheria.State.Import/Program.cs @@ -387,6 +387,7 @@ internal static class LegacyCatalogReader LegacyId = legacyId, Description = description, Mass = GetDouble(payload, 4), + SpecificHeat = GetPositiveDoubleOrDefault(payload, 6, 1), Volume = shape.OccupiedCells, ManufacturerLegacyId = GetOptionalGuid(payload, 3), Price = GetInt(payload, 8), @@ -588,6 +589,12 @@ internal static class LegacyCatalogReader }; } + private static double GetPositiveDoubleOrDefault(IReadOnlyDictionary payload, int key, double fallback) + { + var value = GetDouble(payload, key); + return value > 0 ? value : fallback; + } + private static int GetInt(IReadOnlyDictionary payload, int key) { if (!payload.TryGetValue(key, out var value) || value == null) diff --git a/Aetheria.State.Unity/AetheriaRuntimeCatalogSnapshotMapper.cs b/Aetheria.State.Unity/AetheriaRuntimeCatalogSnapshotMapper.cs index 74e40280a..6c02ed7d9 100644 --- a/Aetheria.State.Unity/AetheriaRuntimeCatalogSnapshotMapper.cs +++ b/Aetheria.State.Unity/AetheriaRuntimeCatalogSnapshotMapper.cs @@ -23,6 +23,7 @@ internal static class AetheriaRuntimeCatalogSnapshotMapper item.ManufacturerLegacyId, item.Price, item.Mass, + item.SpecificHeat, item.Volume, item.ShapeWidth, item.ShapeHeight, diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 78a53bcfc..08cd8bebc 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -47,6 +47,7 @@ if (nameFiles.Any(nameFile => nameFile.Names.Length == 0 || nameFile.Names.Lengt var pricedItems = items.Count(item => item.Price > 0); var manufacturedItems = items.Count(item => !string.IsNullOrWhiteSpace(item.ManufacturerLegacyId)); +var specificHeatItems = items.Count(item => item.SpecificHeat > 0); var shapedItems = items.Count(item => item.ShapeWidth > 0 && item.ShapeHeight > 0 && item.OccupiedCells > 0); var shapedMaskItems = items.Count(item => item.ShapeCells.Length > 0); var interiorShapeItems = items.Count(item => item.InteriorShapeCells.Length > 0); @@ -89,6 +90,12 @@ if (manufacturedItems == 0) throw new InvalidOperationException("Typed item definitions did not import any manufacturer legacy IDs."); } +if (specificHeatItems != items.Length) +{ + throw new InvalidOperationException( + $"Typed item definitions did not import positive specific heat for every item: {specificHeatItems}/{items.Length}."); +} + if (shapedItems == 0) { throw new InvalidOperationException("Typed item definitions did not import any shape dimensions."); @@ -346,7 +353,7 @@ if (string.IsNullOrWhiteSpace(quarantine.CatalogFingerprint)) Console.WriteLine($"Aetheria typed state verify passed: {statePath}"); Console.WriteLine($"Catalog fingerprint: {quarantine.CatalogFingerprint}"); Console.WriteLine($"Item definitions: {items.Length}"); -Console.WriteLine($"Priced/manufactured/shaped items: {pricedItems}/{manufacturedItems}/{shapedItems}"); +Console.WriteLine($"Priced/manufactured/specific-heat/shaped items: {pricedItems}/{manufacturedItems}/{specificHeatItems}/{shapedItems}"); Console.WriteLine($"Shape masks: {shapedMaskItems}"); Console.WriteLine($"Interior masks/hardpoint hosts/hardpoints: {interiorShapeItems}/{hardpointHostItems}/{hardpointCount}"); Console.WriteLine($"Behavior payload items/payloads/fields/legacy refs: {behaviorPayloadItems}/{behaviorPayloadCount}/{behaviorFieldCount}/{behaviorLegacyRefCount}"); diff --git a/Aetheria.State/Documents/AetheriaItemDefinition.cs b/Aetheria.State/Documents/AetheriaItemDefinition.cs index b77e21afc..4c19a4283 100644 --- a/Aetheria.State/Documents/AetheriaItemDefinition.cs +++ b/Aetheria.State/Documents/AetheriaItemDefinition.cs @@ -126,6 +126,9 @@ public sealed class AetheriaItemDefinition [Key(37)] public string CompoundCommodityCategory { get; set; } = ""; + + [Key(38)] + public double SpecificHeat { get; set; } = 1; } [MessagePackObject] diff --git a/Assets/Scripts/ServerShared/AetheriaRuntimeItemCatalog.cs b/Assets/Scripts/ServerShared/AetheriaRuntimeItemCatalog.cs index aa14af90c..c9cef0f3f 100644 --- a/Assets/Scripts/ServerShared/AetheriaRuntimeItemCatalog.cs +++ b/Assets/Scripts/ServerShared/AetheriaRuntimeItemCatalog.cs @@ -8,12 +8,14 @@ using Unity.Mathematics; public interface IRuntimeItemProjectionReader { + AetheriaRuntimeCatalogItem GetRuntimeItem(Guid guid); ItemData Get(Guid guid); T Get(Guid guid) where T : ItemData; } public sealed class AetheriaRuntimeItemCatalog : IRuntimeItemProjectionReader { + private readonly Dictionary _typedItems; private readonly Dictionary _items; private static readonly IReadOnlyDictionary BehaviorTypesByUnionKey = new Dictionary { @@ -54,12 +56,22 @@ public sealed class AetheriaRuntimeItemCatalog : IRuntimeItemProjectionReader { if (catalog == null) throw new ArgumentNullException(nameof(catalog)); + _typedItems = catalog.Items + .Where(item => Guid.TryParse(item.LegacyId, out _)) + .ToDictionary(item => Guid.Parse(item.LegacyId), item => item); + _items = catalog.Items .Select(ProjectItem) .Where(item => item != null) .ToDictionary(item => item.ID, item => item); } + public AetheriaRuntimeCatalogItem GetRuntimeItem(Guid guid) + { + _typedItems.TryGetValue(guid, out var item); + return item; + } + public ItemData Get(Guid guid) { ItemData item; @@ -90,6 +102,7 @@ public sealed class AetheriaRuntimeItemCatalog : IRuntimeItemProjectionReader projected.Description = item.Description; projected.Manufacturer = ParseGuid(item.ManufacturerLegacyId); projected.Mass = (float)item.Mass; + projected.SpecificHeat = (float)item.SpecificHeat; projected.Shape = ProjectShape(item.ShapeWidth, item.ShapeHeight, item.ShapeCells); projected.Price = item.Price; diff --git a/Assets/Scripts/ServerShared/ItemManager.cs b/Assets/Scripts/ServerShared/ItemManager.cs index 6d6740f05..979a69915 100644 --- a/Assets/Scripts/ServerShared/ItemManager.cs +++ b/Assets/Scripts/ServerShared/ItemManager.cs @@ -6,6 +6,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; +using GameCult.Aetheria.State.Unity; using Unity.Mathematics; using static Unity.Mathematics.math; using float2 = Unity.Mathematics.float2; @@ -57,6 +58,12 @@ public class ItemManager return _itemProjections.Get(id); } + public AetheriaRuntimeCatalogItem GetRuntimeItem(ItemInstance item) + { + var itemId = item?.Data?.ItemId ?? Guid.Empty; + return itemId == Guid.Empty ? null : _itemProjections.GetRuntimeItem(itemId); + } + public RuntimeItemReference CreateReference(ItemData item) { return new RuntimeItemReference(item); @@ -107,21 +114,32 @@ public class ItemManager public float GetMass(ItemInstance item) { + var typedItem = GetRuntimeItem(item); + if (typedItem == null) + { + return 0; + } + return item switch { - CraftedItemInstance _ => GetData(item).Mass, - SimpleCommodity commodity => GetData(item).Mass * commodity.Quantity, + CraftedItemInstance _ => (float)typedItem.Mass, + SimpleCommodity commodity => (float)typedItem.Mass * commodity.Quantity, _ => 0 }; } public float GetThermalMass(ItemInstance item) { - var data = GetData(item); + var typedItem = GetRuntimeItem(item); + if (typedItem == null) + { + return 0; + } + return item switch { - CraftedItemInstance _ => data.Mass * data.SpecificHeat, - SimpleCommodity commodity => data.Mass * data.SpecificHeat * commodity.Quantity, + CraftedItemInstance _ => (float)(typedItem.Mass * typedItem.SpecificHeat), + SimpleCommodity commodity => (float)(typedItem.Mass * typedItem.SpecificHeat * commodity.Quantity), _ => 0 }; } @@ -145,8 +163,10 @@ public class ItemManager public int GetPrice(CraftedItemInstance item) { - var data = GetData(item); - return (int) (GameplaySettings.QualityPriceModifier.Evaluate(item.Quality) * data.Price); + var typedItem = GetRuntimeItem(item); + return typedItem == null + ? 0 + : (int) (GameplaySettings.QualityPriceModifier.Evaluate(item.Quality) * typedItem.Price); } public SimpleCommodity CreateInstance(SimpleCommodityData item, int count) diff --git a/GameData/aetheria-world.cc b/GameData/aetheria-world.cc index c91e0747830d62b0e3745b8a0d797a41529e32b3..811ab8661bae08ec2ac9b6535a5e8551f0a1985a 100644 GIT binary patch delta 300 zcmbu(J4ypl6aY|DXd!}CGC{DJLJL2c_r32~h!P8}Qe*?(d*6K!a8yV{tldGTaR)XE z!tBEZh&vF1EAUg=yMe=bU3Bh0J1=|15k+zUR$R<@@JUi~ z0V}rNJBU7$7UZTb4u>ik3#uYTmCA;-qGVGt%-XY&B;+(k0I|QABg|Td5L}EEWmMwf zt$1wC&-%@6vEFw3AHDg;YA@`Tmsm@AP>!#KCwaoBg0tppXF4CO4gcGIU)pX*gXNXY Zhpnf-{`2^5I+J?;4tl8= fields ? 0 : reader.ReadDouble(); } + private static double ReadFieldDouble(ref MessagePackReader reader, int fields, int index, double fallback) + { + return index >= fields ? fallback : reader.ReadDouble(); + } + private static IReadOnlyList ReadFieldStringArray(ref MessagePackReader reader, int fields, int index) { if (index >= fields) return Array.Empty(); diff --git a/docs/aetheria-perfect-machine-map.md b/docs/aetheria-perfect-machine-map.md index 119ea9907..78f6f61ea 100644 --- a/docs/aetheria-perfect-machine-map.md +++ b/docs/aetheria-perfect-machine-map.md @@ -222,8 +222,8 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. dimensions, occupied cell counts, full typed shape-cell masks, hardpoint type, hull type, interior shape masks for hull/cargo equipment, hull hardpoint definitions, behavior kind fingerprints, typed recursive behavior - payloads, stack size, durability, and weapon range/caliber/type/fire/modifier - classifications. Corporation documents now carry the legacy short name, true + payloads, stack size, specific heat, durability, and weapon + range/caliber/type/fire/modifier classifications. Corporation documents now carry the legacy short name, true description from key 3, name-file and boss-hull legacy IDs, influence distance, allegiance count, full allegiance edges, and music bank IDs. Empty legacy GUID references are imported as absent links rather than as @@ -239,6 +239,12 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. `.cc` records. It exposes trade-item, manufacturer, corporation prefix, and corporation name-file queries, plus equipment, hardpoint, and behavior queries without touching runtime projection DTOs. +- `ItemManager` can now ask its typed runtime item reader for the owning + `AetheriaRuntimeCatalogItem` row by item ID. Its generic mass, thermal-mass, + and crafted-price helpers read typed mass, specific heat, quantity, quality, + and price rather than hydrating `ItemData`; legacy projection hydration is + still used for behavior construction and simulation surfaces that have not + been rebuilt yet. - The embedded `GameCult.Aetheria.State.Unity` package now owns the Unity-visible immutable catalog read-model contract for trade/equipment/behavior/hardpoint/manufacturer/corporation/name queries, @@ -658,6 +664,8 @@ First Aetheria surfaces to publish: and active-duration fill until typed consumable effect execution exists. - Done: import typed thermal bounds and move schematic HUD heat-fill ranges onto typed catalog rows. + - Done: import typed item specific heat and move `ItemManager` generic mass, + thermal-mass, and crafted-price helpers onto typed runtime catalog rows. - Done: import typed thermal performance curve keys and move PropertiesPanel thermal curve presentation onto typed catalog rows; incomplete typed rows use a neutral fallback curve instead of hydrating legacy thermal DTOs.