VanguardReMaster/client/Assets/Vanguard/Runtime/UI/Overlays/CardListModels.cs

135 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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