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;
}
}
}