133 lines
4.5 KiB
C#
133 lines
4.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using Vanguard.Board3D;
|
|
using Vanguard.Shared.Protocol;
|
|
|
|
namespace Vanguard.UI.Overlays
|
|
{
|
|
/// <summary>
|
|
/// Кликабельные блоки зон: рука, колода, дроп, душа, урон, защита, триггер.
|
|
/// Своя панель снизу слева, противника — сверху справа.
|
|
/// </summary>
|
|
public sealed class ZoneBlockStripView
|
|
{
|
|
private static readonly BoardZone[] Zones =
|
|
{
|
|
BoardZone.Hand,
|
|
BoardZone.Deck,
|
|
BoardZone.Drop,
|
|
BoardZone.Soul,
|
|
BoardZone.Damage,
|
|
BoardZone.Guardian,
|
|
BoardZone.Trigger,
|
|
};
|
|
|
|
private readonly Dictionary<BoardZone, Text> _labels =
|
|
new Dictionary<BoardZone, Text>();
|
|
private Text _header;
|
|
|
|
public RectTransform Root { get; private set; }
|
|
public event Action<BoardZone> ZoneClicked;
|
|
|
|
public void Build(
|
|
Transform parent,
|
|
string name,
|
|
Vector2 anchor,
|
|
Vector2 pivot,
|
|
Vector2 position,
|
|
Vector2 size)
|
|
{
|
|
Root = UiKit.CreatePanel(parent, name, new Color(0.02f, 0.035f, 0.055f, 0.82f));
|
|
Root.anchorMin = anchor;
|
|
Root.anchorMax = anchor;
|
|
Root.pivot = pivot;
|
|
Root.anchoredPosition = position;
|
|
Root.sizeDelta = size;
|
|
|
|
var image = Root.GetComponent<Image>();
|
|
if (image != null)
|
|
image.raycastTarget = false;
|
|
|
|
UiKit.AddVerticalLayout(Root, 8, 4);
|
|
|
|
_header = UiKit.CreateText(
|
|
Root,
|
|
"Header",
|
|
string.Empty,
|
|
14,
|
|
new Color(0.86f, 0.91f, 1f),
|
|
TextAnchor.MiddleLeft);
|
|
_header.fontStyle = FontStyle.Bold;
|
|
UiKit.MakeLiteral(_header);
|
|
UiKit.SetPreferredHeight(_header, 20f);
|
|
|
|
var firstRow = CreateRow("Row1");
|
|
var secondRow = CreateRow("Row2");
|
|
|
|
for (var i = 0; i < Zones.Length; i++)
|
|
{
|
|
var zone = Zones[i];
|
|
var row = i < 4 ? firstRow : secondRow;
|
|
var button = UiKit.CreateButton(
|
|
row,
|
|
"Zone_" + zone,
|
|
string.Empty,
|
|
() => ZoneClicked?.Invoke(zone),
|
|
13);
|
|
var element = UiKit.SetPreferredHeight(button, 32f);
|
|
element.preferredWidth = i < 4 ? 80f : 108f;
|
|
_labels[zone] = button.GetComponentInChildren<Text>();
|
|
UiKit.MakeLiteral(_labels[zone]);
|
|
}
|
|
}
|
|
|
|
public void Update(PlayerView player, bool self)
|
|
{
|
|
if (Root == null)
|
|
return;
|
|
|
|
_header.text = Loc.Translate(self ? "ВЫ" : "ПРОТИВНИК")
|
|
+ (player != null && !string.IsNullOrEmpty(player.Name)
|
|
? " · " + player.Name
|
|
: string.Empty);
|
|
|
|
var hand = player != null
|
|
? Mathf.Max(player.HandCount, player.Hand?.Count ?? 0)
|
|
: 0;
|
|
var deck = player?.DeckCount ?? 0;
|
|
var drop = player?.Drop?.Count ?? 0;
|
|
var soul = player?.Soul?.Count ?? 0;
|
|
var damage = player != null
|
|
? player.FaceDownDamage + (player.FaceUpDamage?.Count ?? 0)
|
|
: 0;
|
|
var guardian = player?.Guardian?.Count ?? 0;
|
|
var trigger = player?.Trigger?.Count ?? 0;
|
|
|
|
Set(BoardZone.Hand, "Рука", hand);
|
|
Set(BoardZone.Deck, "Колода", deck);
|
|
Set(BoardZone.Drop, "Дроп", drop);
|
|
Set(BoardZone.Soul, "Душа", soul);
|
|
Set(BoardZone.Damage, "Урон", damage);
|
|
Set(BoardZone.Guardian, "Защита", guardian);
|
|
Set(BoardZone.Trigger, "Триг.", trigger);
|
|
}
|
|
|
|
private RectTransform CreateRow(string name)
|
|
{
|
|
var row = UiKit.CreatePanel(Root, name, Color.clear);
|
|
var element = row.gameObject.AddComponent<LayoutElement>();
|
|
element.preferredHeight = 32f;
|
|
UiKit.AddHorizontalLayout(row, 0, 4);
|
|
return row;
|
|
}
|
|
|
|
private void Set(BoardZone zone, string label, int count)
|
|
{
|
|
if (_labels.TryGetValue(zone, out var text) && text != null)
|
|
text.text = Loc.Translate(label) + " " + count;
|
|
}
|
|
}
|
|
}
|