From 385e85dbbbfd184434bc4106bd7ada7e2781d196 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 14 Jun 2026 00:48:20 +0100 Subject: [PATCH] Use typed shapes for inventory selection --- .voidbot/state/aetheria.cc | Bin 54987 -> 54856 bytes Assets/Scripts/UI/Menu/InventoryMenu.cs | 103 ++++++++++++++++-------- docs/aetheria-perfect-machine-map.md | 3 +- 3 files changed, 70 insertions(+), 36 deletions(-) diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index dc9b0e614f4936834cdc79f10fd1818cc777b925..167ac6e6ae5dbb58541f3af72d7be68555d61368 100644 GIT binary patch delta 1905 zcmZ`)O>Z1U5XD*JFBAzOP_Po9#KDmwcI{n%tYV)+LXZidD2^}YL-fwn?zG&~J#_c% zvQf|qL5?|~L0q^H#lZ@gKv=<%C^v*b0&bT04G0bhaih9tKkUdHb`Lc(UGKemuX^{( z!Vf!zuRl97zOb}hE|)6VpM@v0KYkp`c8^?}>eVXq8y}85k*UI!L1oETCPtqgIodrr zS}Ap_pWJ@w`}&GKm60%^I_zRteO(g&@L!S{uuSa8y8G zg9UByfPu*n43AU6Ja>FM%VKQj1fQ`6;Af=iVZ3r<|77bMqOlP1PsbwKy zHY(j^UdPoq5u9*4gdd$xZK{#z_2ph)bte+6NTni#STzwM`qQ&@wu!^;9w5;uCK{U@ zTSKX=YBBv%2-ZuzU*#Is6*XhlvS8B<@j-&1Q-P-RInj%hzJzu2`$NxkFWj7aWaM&o z_0IJ25a<8cf*Bgh{?37tCXG>N*I&Po{X6w&cj>E@@$B7~k7p-do0uF7DEsyNiH>;@ z?V1-3!?R>20~(DIO(&`+<42P}ar4p2vYz5G5VfI0!KqFRpMw^+5garl5Xd?cqDCr| zc1XPtWq_Bkd-c2HlaI|;mn(~<>gn>vmSqhRV5WQf-ajMLI|J^;lz-u6Ejq`W?A6M( z&If0Z=B_z|h)(A;Kxb(#6LN>fm?eqVyKTt%E3huPZIhwt>6$NrGZI0fY%og-3bM1n zCV5tqb5N71m~=T=hZ|XV0d>lBYNjg&02b_{f>D7Rm(E`{<-R}}7wr357#)pRm_|Ee_QytnSOg7vHImujd zozh%lF9CVO*^!*!(HuN~pE*3PO~i!Q$FT=V^Y!C(^CyGU+5@1FO3Eumu1ecS@EXw| zZ8X+W-rF5+1kO?Yi5<*#t$VKe{X*ycn;PqTGqeNsa%HZvRGeEXmKTZ-jJ;^QRkvt! zggX>#+DXRGX`2EbGu_^MW1UU_+Vq;&IU)6}`=UDZZX5>_;Rwz+=bOU}bRY`d5%KJ) z$LE*xyR3YAu^-SkyVZ~X9v!>o&+dMD|LEl8;GOK3!t_M%_M6ZCDjcIL@m~M(TPXLg g!?EnQT{WmK`086fy*H>-UFDmf?@#tCi}M@*0YquYN&o-= delta 1929 zcmZ9NQD_`R7{|RP)+A7&wNj&|{i?;PT=v>aVwyySNQ|Z&NikOnp@Or!-`!5LJG0Ep z=6Zr2QbnW>wd|w#q^%%Ygwv;r5~v`?7avm;^w9?&`XD|C;y1f{xsaDzZg%$j{@?fg z{xd&*F|hUJz*jf-4OM4mC#%kL)9Jl|Bk2$Ou8!mj)2Aobu9qH8<-nUeD`&Emp~0i2 z54$G^t4>XANyLd+ZEJ%OoLya62CjiY69p<}&<7MvE)ZOq2%o8T z8Cn4k5$4eZs5k?K5sPCknxGAR04|17G&LBRjy*HBU(bP$EdAFV?d0!UOw&q;6x+Gs zg^WjcOCR;3Wnxb1T-3a0xD@kRqj46MjLvE)fC)c;yTElEvUZKNWn$=)RUXA5W_#AL z?MkM6h?&x;fGGrDcDy7)VM`(fS?!g6m9dhSFw57gl%p<#kOurjF?V;xSshNU0$eV9 zTfEi9vH;^QQ-D4<8Wc%GFabTALHfih(+3thg514iruQ%%ITJ*zG%Z z+~c8?>vm60L$4!sA3W(JcuYW;(ASN`*oPM)6G;qQ7zxZ6=4Bt#u7Zs|1zzR^pfCkPI>*sU18UF)rhnXdsB^b8z96%a#EEM55zL@* zJPnr;ZHPaQB^rSnsz4aVMKSGsV7o}4gNF1HUF7r<8W;g4TSPutfEw$`D55YiGl6#C z!MZ|bGTyo1BK@WQNT;$ywpn0?RThhBEwcz0twD6aVx%}!s*ETEcex!k^hwK;tRu$x zY;4yuGWuJHAW5=ZY)EQ87aJA^+Gg4@ajYIivVeycYwdi_gcnHl8aDK=_p$B=7r&eA z{&oHMvxiU3o;ovodfJ(pnOytSuqM5Jz5B$se-Cz-t6$&$!h4oT(&$og+6&0ehI{bp z`2}iqi^>(g?MDk)Ox@wsQ%fe2ss?#7z4!K!^lI(#PKZtBwc$dxt=E;p;M-T~nO=_? z70MSkSo+Wld?xHG#Vxoy<+l>xA8r*UkQh~WI zBI$FYP33FO4)-6|h^Sst7X!AzZ5G4B(5j-bM3JNrWGUKL@6P@{QhFo(Z*FwCUkgR;164p{ePyo(@bJ#d z^x)QL?-HD-W|!dlPv7sXOcfX9{&Zza?yTmQ^j0RbmF` _backgroundSubscriptions; // private ItemInstance _dragItem; @@ -100,29 +101,15 @@ public class InventoryMenu : MonoBehaviour } else { - if (_selectedPanel != null) - { - if (_selectedPanel.CellInstances.ContainsKey(_selectedPosition)) - { - foreach (var v in _selectedItemData.Shape.Coordinates) - { - var v2 = _selectedItemData.Shape.Rotate(v, _selectedItem.Rotation) + _selectedPosition; - _selectedPanel.CellInstances[v2].Icon.color = _selectedPanel.GetColor(v2); - } - } - } + ClearSelectedCellHighlight(); _selectedPanel = panel; _selectedPosition = cargoEvent.Position; PropertiesPanel.Inspect(item); _selectedPanel = panel; _selectedPosition = cargoEvent.CargoBay.Cargo[item]; _selectedItem = item; - _selectedItemData = GameManager.ItemManager.GetData(item); - foreach (var v in _selectedItemData.Shape.Coordinates) - { - var v2 = _selectedItemData.Shape.Rotate(v, _selectedItem.Rotation) + _selectedPosition; - _selectedPanel.CellInstances[v2].Icon.color = _selectedPanel.GetColor(v2, true); - } + _selectedCells = GetSelectedCells(item, _selectedPosition); + ApplySelectedCellHighlight(); // TODO: SFX: Success } } @@ -155,28 +142,14 @@ public class InventoryMenu : MonoBehaviour } else { - if (_selectedPanel != null) - { - if (_selectedPanel.CellInstances.ContainsKey(_selectedPosition)) - { - foreach (var v in _selectedItemData.Shape.Coordinates) - { - var v2 = _selectedItemData.Shape.Rotate(v, _selectedItem.Rotation) + _selectedPosition; - _selectedPanel.CellInstances[v2].Icon.color = _selectedPanel.GetColor(v2); - } - } - } + ClearSelectedCellHighlight(); PropertiesPanel.Inspect(item); _selectedPanel = panel; _selectedPosition = item.Position; _selectedItem = item.EquippableItem; - _selectedItemData = GameManager.ItemManager.GetData(item.EquippableItem); - foreach (var v in _selectedItemData.Shape.Coordinates) - { - var v2 = _selectedItemData.Shape.Rotate(v, _selectedItem.Rotation) + _selectedPosition; - _selectedPanel.CellInstances[v2].Icon.color = _selectedPanel.GetColor(v2, true); - } + _selectedCells = GetSelectedCells(item.EquippableItem, _selectedPosition); + ApplySelectedCellHighlight(); // TODO: SFX: Success } } @@ -208,4 +181,64 @@ public class InventoryMenu : MonoBehaviour // _dragItem.Rotation = (ItemRotation) (((int) _dragItem.Rotation + 3) % 4); // } } + + private void ClearSelectedCellHighlight() + { + if (_selectedPanel == null || _selectedCells == null) return; + + foreach (var v in _selectedCells) + { + if (_selectedPanel.CellInstances.ContainsKey(v)) + _selectedPanel.CellInstances[v].Icon.color = _selectedPanel.GetColor(v); + } + } + + private void ApplySelectedCellHighlight() + { + if (_selectedPanel == null || _selectedCells == null) return; + + foreach (var v in _selectedCells) + { + if (_selectedPanel.CellInstances.ContainsKey(v)) + _selectedPanel.CellInstances[v].Icon.color = _selectedPanel.GetColor(v, true); + } + } + + private int2[] GetSelectedCells(ItemInstance item, int2 position) + { + var typedItem = FindTypedInventoryItem(item); + if (typedItem != null && typedItem.ShapeCells.Count > 0) + { + return typedItem.ShapeCells + .Select(cell => RotateTypedShapeCell(cell, typedItem, item.Rotation) + position) + .ToArray(); + } + + var shape = GameManager.ItemManager.GetData(item).Shape; + return shape.Coordinates + .Select(cell => shape.Rotate(cell, item.Rotation) + position) + .ToArray(); + } + + private static AetheriaRuntimeCatalogItem FindTypedInventoryItem(ItemInstance item) + { + var itemId = item?.Data?.ItemId ?? Guid.Empty; + return itemId == Guid.Empty + ? null + : ActionGameManager.RuntimeCatalog?.FindItemByLegacyId(itemId.ToString("D")); + } + + private static int2 RotateTypedShapeCell( + AetheriaRuntimeShapeCell cell, + AetheriaRuntimeCatalogItem item, + ItemRotation rotation) + { + return rotation switch + { + ItemRotation.Clockwise => new int2(cell.Y, item.ShapeWidth - 1 - cell.X), + ItemRotation.Reversed => new int2(item.ShapeWidth - 1 - cell.X, item.ShapeHeight - 1 - cell.Y), + ItemRotation.CounterClockwise => new int2(item.ShapeHeight - 1 - cell.Y, cell.X), + _ => new int2(cell.X, cell.Y) + }; + } } diff --git a/docs/aetheria-perfect-machine-map.md b/docs/aetheria-perfect-machine-map.md index ae87a8d38..be3f4bfbb 100644 --- a/docs/aetheria-perfect-machine-map.md +++ b/docs/aetheria-perfect-machine-map.md @@ -148,7 +148,8 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. The item properties panel also reads typed catalog description, manufacturer, and base mass for item presentation before hydrating legacy DTOs for behavior reflection, thermal curves, and durability math that have not yet moved to - typed behavior surfaces. + typed behavior surfaces. Inventory selection highlighting now uses typed item + shape cells for UI tint geometry before falling back to legacy `ItemData.Shape`. - `Galaxy` generation no longer accepts a runtime item catalog reader or `ItemManager`. Sector and tutorial generation receive the package-owned typed runtime catalog. `Galaxy` projects typed corporation v2 records into temporary legacy