using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TcgEngine.Client; namespace TcgEngine.UI { /// /// Ability button on a BoardCard, let you activate abilities /// public class AbilityButton : MonoBehaviour { public Text text; public Image focus_highlight; private Card card; private AbilityData iability; private CanvasGroup canvas_group; private float target_alpha = 0f; private bool focus = false; private bool nextfocus = false; private bool interactable = false; private static List button_list = new List(); void Awake() { button_list.Add(this); canvas_group = GetComponent(); canvas_group.alpha = 0f; if (focus_highlight != null) focus_highlight.enabled = false; } private void OnDestroy() { button_list.Remove(this); } void Update() { canvas_group.alpha = Mathf.MoveTowards(canvas_group.alpha, target_alpha, 5f * Time.deltaTime); focus = nextfocus; if (focus_highlight != null && IsVisible()) focus_highlight.enabled = focus && interactable; } public void SetAbility(Card card, AbilityData iability) { this.card = card; this.iability = iability; text.text = iability.title; if (this.iability.mana_cost > 0) text.text += " (" + this.iability.mana_cost + ")"; canvas_group.interactable = true; canvas_group.blocksRaycasts = true; target_alpha = 1f; } public void SetInteractable(bool interact) { interactable = interact; } public void Hide() { if (canvas_group == null) canvas_group = GetComponent(); this.card = null; this.iability = null; canvas_group.interactable = false; canvas_group.blocksRaycasts = false; target_alpha = 0f; } public void OnClick() { if (card != null && iability != null) { if (!Tutorial.Get().CanDo(TutoEndTrigger.CastAbility, card)) return; GameClient.Get().CastAbility(card, iability); PlayerControls.Get().UnselectAll(); } } public AbilityData GetAbility() { return iability; } public bool IsVisible() { return canvas_group.alpha > 0.5f; } public bool IsInteractable() { return interactable && IsVisible(); } public void MouseEnter() { focus = true; nextfocus = true; } public void MouseExit() { nextfocus = false; //Keep it focused 1 more frame to work on mobile } public static AbilityButton GetFocus(Vector3 pos, float range = 999f) { AbilityButton nearest = null; float min_dist = range; foreach (AbilityButton button in button_list) { float dist = (button.transform.position - pos).magnitude; if (button.focus && button.IsVisible() && dist < min_dist) { min_dist = dist; nearest = button; } } return nearest; } public static AbilityButton GetNearest(Vector3 pos, float range = 999f) { AbilityButton nearest = null; float min_dist = range; foreach (AbilityButton button in button_list) { float dist = (button.transform.position - pos).magnitude; if (dist < min_dist) { min_dist = dist; nearest = button; } } return nearest; } } }