135 lines
4.7 KiB
C#
135 lines
4.7 KiB
C#
using System.Collections.Generic;
|
||
using Vanguard.Board3D;
|
||
using Vanguard.Shared.Protocol;
|
||
|
||
namespace Vanguard.UI.Overlays
|
||
{
|
||
/// <summary>Один тайл в общем списке карт. Закрытые карты не раскрывают printingId.</summary>
|
||
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; }
|
||
}
|
||
|
||
/// <summary>Запрос на общий горизонтальный список карт.</summary>
|
||
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<CardListEntry> Entries { get; } = new List<CardListEntry>();
|
||
public string EmptyText { get; set; } = "В этой зоне нет карт.";
|
||
}
|
||
|
||
/// <summary>Собирает содержимое зоны для CardListView без раскрытия скрытых данных.</summary>
|
||
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<CardView>();
|
||
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<CardView> 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;
|
||
}
|
||
}
|
||
}
|