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(); costText = front.transform.Find("CostText").GetComponent(); statsText = front.transform.Find("StatsText").GetComponent(); infoText = back.transform.Find("InfoText").GetComponent(); icon = front.transform.Find("TowerIcon").GetComponent(); placeholderSprite = icon.sprite; placeholderColor = icon.color; originalScale = transform.localScale; foreach (var text in GetComponentsInChildren(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; } } }