using UnityEngine; using UnityEngine.Scripting; namespace NecromancerTome { /// /// Квадраты зоны ремонтника и лутера (28.10.2026, #84): сетка 3x3 в окне «Содержимое» - окно necroUrnZone в группе окон /// игры bagStorage (Config/XUi_InGame), как фильтр логиста. Север сверху, в среднем квадрате - урна. Щелчок включает / /// выключает квадрат (TEFeatureCinerarium.ToggleSector); выключенный - тёмный с красной рамкой. Видна только у урн с /// большой зоной; у прочих урн и сумок транспорта и волка скрыта. s0..s8 в XML - номера квадратов (столбец + строка * 3, /// строка 0 - юг), f0..f8 - их рамки. /// [Preserve] public class XUiC_NecroUrnZone : XUiController { readonly XUiController[] _cells = new XUiController[TEFeatureCinerarium.ZoneSectors]; readonly XUiController[] _frames = new XUiController[TEFeatureCinerarium.ZoneSectors]; static readonly Color On = new Color(0.3f, 0.6f, 0.45f, 0.9f); static readonly Color Off = new Color(0.12f, 0.12f, 0.12f, 0.9f); static readonly Color FrameOn = new Color(0.55f, 0.9f, 0.75f, 1f); static readonly Color FrameOff = new Color(0.95f, 0.3f, 0.25f, 1f); public override void Init() { base.Init(); for (int i = 0; i < _cells.Length; i++) { int s = i; _cells[i] = GetChildById("s" + i); _frames[i] = GetChildById("f" + i); if (_cells[i] != null) { _cells[i].OnPress += (_x, _m) => Toggle(s); } } } public override void OnOpen() { base.OnOpen(); Refresh(); } void Toggle(int _s) { TEFeatureCinerarium urn = CinerariumContents.Urn; if (urn == null) { return; } urn.ToggleSector(_s); Refresh(); } void Refresh() { TEFeatureCinerarium urn = CinerariumContents.Urn; bool show = urn != null && urn.IsBigZone; ViewComponent.IsVisible = show; if (!show) { return; } for (int i = 0; i < _cells.Length; i++) { bool on = urn.SectorOn(i); if (_cells[i]?.ViewComponent is XUiV_Sprite sp) { sp.Color = on ? On : Off; sp.ToolTip = Localization.Get(on ? "necroZoneSectorOn" : "necroZoneSectorOff"); } if (_frames[i]?.ViewComponent is XUiV_Sprite fr) { fr.Color = on ? FrameOn : FrameOff; } } } } }