using System.Collections.Generic; using Vanguard.Board3D; using Vanguard.Shared.Protocol; namespace Vanguard.UI.Overlays { /// Один тайл в общем списке карт. Закрытые карты не раскрывают printingId. public sealed class CardListEntry { public CardListEntry(CardView card, bool hidden = false, string label = null) { Card = card; Hidden = hidden; Label = label; } public CardView Card { get; } public bool Hidden { get; } public string Label { get; } } /// Запрос на общий горизонтальный список карт. public sealed class CardListRequest { public CardListRequest(string title, int player, BoardZone zone) { Title = title; Player = player; Zone = zone; } public string Title { get; } public int Player { get; } public BoardZone Zone { get; } public List Entries { get; } = new List(); public string EmptyText { get; set; } = "В этой зоне нет карт."; } /// Собирает содержимое зоны для CardListView без раскрытия скрытых данных. public static class CardZoneContent { public static CardListRequest Build( PlayerView player, int viewer, BoardZone zone) { var request = new CardListRequest(ZoneTitle(zone, player), player?.Index ?? 0, zone); if (player == null) return request; switch (zone) { case BoardZone.Hand: if (player.Index == viewer) AddCards(request, player.Hand); else AddHidden(request, player.HandCount, "Закрытая карта"); break; case BoardZone.Deck: // Порядок колоды не покидает сервер: показываем только закрытые слоты. AddHidden(request, player.DeckCount, "Колода"); break; case BoardZone.Drop: AddCards(request, player.Drop); break; case BoardZone.Soul: AddCards(request, player.Soul); break; case BoardZone.Guardian: AddCards(request, player.Guardian); break; case BoardZone.Trigger: AddCards(request, player.Trigger); break; case BoardZone.Damage: AddDamage(request, player); break; } return request; } private static void AddDamage(CardListRequest request, PlayerView player) { var faceUp = player.FaceUpDamage ?? new List(); for (var i = faceUp.Count - 1; i >= 0; i--) request.Entries.Add(new CardListEntry(faceUp[i])); for (var i = 0; i < player.FaceDownDamage; i++) request.Entries.Add(new CardListEntry(null, true, "Закрытый урон")); } private static void AddCards(CardListRequest request, List cards) { if (cards == null) return; for (var i = cards.Count - 1; i >= 0; i--) request.Entries.Add(new CardListEntry(cards[i])); } private static void AddHidden(CardListRequest request, int count, string label) { for (var i = 0; i < count; i++) request.Entries.Add(new CardListEntry(null, true, label)); } private static string ZoneTitle(BoardZone zone, PlayerView player) { var name = player != null ? player.Name : string.Empty; var title = zone switch { BoardZone.Hand => "Рука", BoardZone.Deck => "Колода", BoardZone.Drop => "Дроп", BoardZone.Soul => "Душа", BoardZone.Damage => "Урон", BoardZone.Guardian => "Круг защиты", BoardZone.Trigger => "Триггер", BoardZone.Bind => "Bind", BoardZone.GenerationBreak => "G Zone", _ => "Зона", }; return string.IsNullOrEmpty(name) ? title : title + " · " + name; } } }