using System; using UnityEngine; using UnityEngine.UI; using Vanguard.Api.Contracts; namespace Vanguard.UI.Overlays { /// Крупная карточка с полным текстом. Для скрытых карт показывает рубашку. public sealed class CardDetailOverlay { private readonly RectTransform _root; private readonly Image _art; private readonly Text _name; private readonly Text _meta; private readonly Text _stats; private readonly Text _ability; private readonly Func _catalog; private Action _onBack; public CardDetailOverlay( Transform parent, Func catalog) { _catalog = catalog; _root = UiKit.CreatePanel(parent, "CardDetailOverlay", new Color(0f, 0f, 0f, 0.82f)); var panel = UiKit.CreateCenteredCard( _root, "CardDetailPanel", new Vector2(900f, 600f), new Color(0.045f, 0.06f, 0.09f, 1f)); UiKit.AddVerticalLayout(panel, 16, 10); var header = UiKit.CreatePanel(panel, "Header", Color.clear); UiKit.AddHorizontalLayout(header, 0, 10); UiKit.SetPreferredHeight(header, 44f); _name = UiKit.CreateText(header, "Name", "Карта", 24, Color.white, TextAnchor.MiddleLeft); _name.fontStyle = FontStyle.Bold; UiKit.MakeLiteral(_name); UiKit.SetPreferredHeight(_name, 44f); var back = UiKit.CreateButton(header, "Back", "Назад", () => _onBack?.Invoke(), 16); var backElement = UiKit.SetPreferredHeight(back, 40f, 0f); backElement.preferredWidth = 110f; var close = UiKit.CreateButton(header, "Close", "Закрыть", () => _onBack?.Invoke(), 16); var closeElement = UiKit.SetPreferredHeight(close, 40f, 0f); closeElement.preferredWidth = 110f; var body = UiKit.CreatePanel(panel, "Body", Color.clear); var bodyElement = body.gameObject.AddComponent(); bodyElement.flexibleHeight = 1f; bodyElement.minHeight = 500f; UiKit.AddHorizontalLayout(body, 0, 16); var artPanel = UiKit.CreatePanel(body, "Art", Color.white); var artElement = artPanel.gameObject.AddComponent(); artElement.preferredWidth = 300f; artElement.preferredHeight = 460f; artElement.flexibleWidth = 0f; _art = artPanel.GetComponent(); _art.raycastTarget = false; var info = UiKit.CreatePanel(body, "Info", Color.clear); var infoElement = info.gameObject.AddComponent(); infoElement.flexibleWidth = 1f; infoElement.flexibleHeight = 1f; UiKit.AddVerticalLayout(info, 0, 6); _meta = UiKit.CreateText(info, "Meta", string.Empty, 15, new Color(0.72f, 0.80f, 0.94f), TextAnchor.UpperLeft); _meta.horizontalOverflow = HorizontalWrapMode.Wrap; UiKit.MakeLiteral(_meta); UiKit.SetPreferredHeight(_meta, 52f); _stats = UiKit.CreateText(info, "Stats", string.Empty, 17, Color.white, TextAnchor.UpperLeft); _stats.fontStyle = FontStyle.Bold; UiKit.MakeLiteral(_stats); UiKit.SetPreferredHeight(_stats, 40f); _ability = UiKit.CreateText(info, "Ability", string.Empty, 15, Color.white, TextAnchor.UpperLeft); _ability.horizontalOverflow = HorizontalWrapMode.Wrap; _ability.verticalOverflow = VerticalWrapMode.Overflow; UiKit.MakeLiteral(_ability); UiKit.SetPreferredHeight(_ability, 300f); _root.gameObject.SetActive(false); } public bool IsVisible => _root.gameObject.activeSelf; public void Show(CardListEntry entry, Action onBack) { _onBack = onBack; var card = entry.Card; var meta = card != null ? _catalog?.Invoke(card.PrintingId) : null; if (entry.Hidden || card == null) { _art.sprite = CardArt.Back; _art.color = Color.white; _name.text = entry.Label ?? "Закрытая карта"; _meta.text = "Содержимое этой карты скрыто."; _stats.text = string.Empty; _ability.text = string.Empty; } else { CardImageService.Apply( _art, meta != null ? meta.ImageKey : null, CardArt.ForCard( meta != null ? meta.NameId : card.PrintingId, meta != null ? meta.Clan : "None")); _name.text = meta != null ? Loc.CardName(meta) : card.PrintingId; _meta.text = meta != null ? meta.Clan + " · " + meta.Type + " · G" + meta.Grade + (string.IsNullOrEmpty(meta.Trigger) || meta.Trigger == "None" ? string.Empty : " · " + meta.Trigger) : string.Empty; _stats.text = "P " + card.Power + " · Shield " + (meta != null ? meta.Shield : 0) + " · C " + card.Critical; _ability.text = meta != null ? Loc.CardText(meta) : string.Empty; } _root.SetAsLastSibling(); _root.gameObject.SetActive(true); } public void Hide() { _root.gameObject.SetActive(false); } } }