Files
DepthsOfGreed/Assets/Scripts/HandbookUI/TowerCardView.cs
T

128 lines
5.1 KiB
C#

using System.Collections;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace DepthsOfGreed.HandbookUI
{
public sealed class TowerCardView : MonoBehaviour, IPointerClickHandler, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
{
public HandbookTowerEntry Entry { get; private set; }
private BuildMenuController menu;
private GameObject front, back;
private TMP_Text nameText, costText, statsText, infoText;
private Coroutine flipRoutine;
private Vector3 originalScale;
private bool showingBack, dragged;
private Image icon;
private Sprite placeholderSprite;
private Color placeholderColor;
public void Initialize(BuildMenuController owner)
{
menu = owner;
front = transform.Find("Front").gameObject;
back = transform.Find("Back").gameObject;
nameText = front.transform.Find("NameText").GetComponent<TMP_Text>();
costText = front.transform.Find("CostText").GetComponent<TMP_Text>();
statsText = front.transform.Find("StatsText").GetComponent<TMP_Text>();
infoText = back.transform.Find("InfoText").GetComponent<TMP_Text>();
icon = front.transform.Find("TowerIcon").GetComponent<Image>();
placeholderSprite = icon.sprite;
placeholderColor = icon.color;
originalScale = transform.localScale;
foreach (var text in GetComponentsInChildren<TMP_Text>(true))
{
text.raycastTarget = false;
text.color = Color.black;
text.enableAutoSizing = true;
text.fontSizeMin = 14;
text.fontSizeMax = text.fontSize;
}
SetBack(false, true);
}
public void Bind(HandbookTowerEntry entry)
{
Entry = entry;
nameText.text = entry.displayName;
string price = HandbookCostText.Format(entry.energyCost, entry.entrailsCost);
costText.text = price.Length > 0 ? "Kosten: " + price : "";
costText.gameObject.SetActive(price.Length > 0);
statsText.text = entry.summary;
infoText.text = entry.description;
icon.sprite = entry.icon ? entry.icon : placeholderSprite;
icon.color = entry.icon ? Color.white : placeholderColor;
icon.preserveAspect = true;
}
public void OnPointerClick(PointerEventData data)
{
if (data.button == PointerEventData.InputButton.Left && !data.dragging && !dragged)
menu.ToggleCard(this);
dragged = false;
}
public void OnPointerEnter(PointerEventData data) { if (menu.Placement) menu.Placement.ShowCardHint(Entry); }
public void OnPointerExit(PointerEventData data) { if (menu.Placement) menu.Placement.ClearCardHint(); }
public void OnBeginDrag(PointerEventData data)
{
dragged = true;
if (data.button == PointerEventData.InputButton.Left && !showingBack && menu.Placement)
menu.Placement.Begin(Entry, data.position);
}
public void OnDrag(PointerEventData data)
{
if (menu.Placement) menu.Placement.Move(data.position);
}
public void OnEndDrag(PointerEventData data)
{
if (menu.Placement) menu.Placement.End(data.position);
dragged = false;
}
public void SetBack(bool showBack, bool instant = false)
{
showingBack = showBack;
if (flipRoutine != null) StopCoroutine(flipRoutine);
flipRoutine = null;
if (instant || !isActiveAndEnabled)
{
transform.localScale = originalScale;
front.SetActive(!showBack);
back.SetActive(showBack);
}
else flipRoutine = StartCoroutine(Flip(showBack));
}
private IEnumerator Flip(bool showBack)
{
float startingY = transform.localScale.y;
const float halfDuration = 0.09f;
for (float elapsed = 0; elapsed < halfDuration; elapsed += Time.unscaledDeltaTime)
{
transform.localScale = new Vector3(originalScale.x, Mathf.Lerp(startingY, 0.02f, elapsed / halfDuration), originalScale.z);
yield return null;
}
front.SetActive(!showBack);
back.SetActive(showBack);
for (float elapsed = 0; elapsed < halfDuration; elapsed += Time.unscaledDeltaTime)
{
transform.localScale = new Vector3(originalScale.x, Mathf.Lerp(0.02f, originalScale.y, elapsed / halfDuration), originalScale.z);
yield return null;
}
transform.localScale = originalScale;
flipRoutine = null;
}
private void OnDisable()
{
if (flipRoutine != null) StopCoroutine(flipRoutine);
flipRoutine = null;
transform.localScale = originalScale;
}
}
}