using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TcgEngine.FX; using TcgEngine.Client; namespace TcgEngine.Client { /// /// Visual representation of a booster pack in hand, for the OpenPack scene /// public class HandPack : MonoBehaviour { public Image pack_sprite; public Image pack_glow; public Text pack_quantity; public float move_speed = 10f; public float move_rotate_speed = 4f; public float move_max_rotate = 10f; [HideInInspector] public Vector2 deck_position; [HideInInspector] public float deck_angle; [Header("FX")] public GameObject pack_open_fx; public AudioClip pack_open_audio; private string pack_tid = ""; private int quantity = 0; private RectTransform hand_transform; private RectTransform card_transform; private Vector3 start_scale; private float current_alpha = 0f; private Vector3 current_rotate; private Vector3 target_rotate; private Vector3 prev_pos; private bool destroyed = false; private float focus_timer = 0f; private bool focus = false; private bool drag = false; private static List pack_list = new List(); void Awake() { pack_list.Add(this); card_transform = transform.GetComponent(); hand_transform = transform.parent.GetComponent(); start_scale = transform.localScale; } private void Start() { } private void OnDestroy() { pack_list.Remove(this); } void Update() { focus_timer += Time.deltaTime; Vector2 target_position = deck_position; Vector3 target_size = start_scale; float target_alpha = 1f; bool player_dragging = HandPackArea.Get().IsDragging(); if (focus && focus_timer > 0.5f) { target_position = deck_position + Vector2.up * 40f; } if (drag) { target_position = GetTargetPosition(); target_size = start_scale * 0.8f; Vector3 dir = card_transform.position - prev_pos; Vector3 addrot = new Vector3(dir.y * 90f, -dir.x * 90f, 0f); target_rotate += addrot * move_rotate_speed * Time.deltaTime; target_rotate = new Vector3(Mathf.Clamp(target_rotate.x, -move_max_rotate, move_max_rotate), Mathf.Clamp(target_rotate.y, -move_max_rotate, move_max_rotate), 0f); current_rotate = Vector3.Lerp(current_rotate, target_rotate, move_rotate_speed * Time.deltaTime); move_speed = 9f; target_alpha = 0.8f; } else { target_rotate = new Vector3(0f, 0f, deck_angle); current_rotate = new Vector3(0f, 0f, deck_angle); } card_transform.anchoredPosition = Vector2.Lerp(card_transform.anchoredPosition, target_position, Time.deltaTime * move_speed); card_transform.rotation = Quaternion.Slerp(card_transform.rotation, Quaternion.Euler(current_rotate), Time.deltaTime * move_speed); card_transform.localScale = Vector3.Lerp(card_transform.localScale, target_size, 4f * Time.deltaTime); pack_glow.enabled = (focus && !player_dragging) || drag; current_alpha = Mathf.MoveTowards(current_alpha, target_alpha, 2f * Time.deltaTime); pack_sprite.color = new Color(1f, 1f, 1f, current_alpha); pack_glow.color = new Color(pack_glow.color.r, pack_glow.color.g, pack_glow.color.b, current_alpha * 0.8f); pack_quantity.text = quantity.ToString(); prev_pos = Vector3.Lerp(prev_pos, card_transform.position, 1f * Time.deltaTime); } private Vector2 GetTargetPosition() { RectTransformUtility.ScreenPointToLocalPointInRectangle(hand_transform, Input.mousePosition, Camera.main, out Vector2 tpos); return tpos; } public void SetPack(UserCardData pack) { this.pack_tid = pack.tid; this.quantity = pack.quantity; PackData ipack = PackData.Get(pack.tid); if (ipack) { pack_sprite.sprite = ipack.pack_img; } } public void OpenPack() { FXTool.DoFX(pack_open_fx, transform.position); AudioTool.Get().PlaySFX("pack_open", pack_open_audio); Destroy(gameObject); OpenPackMenu.Get().OpenPack(pack_tid); } public void Remove() { quantity--; if (quantity <= 0) Kill(); } public void Kill() { if (!destroyed) { destroyed = true; Destroy(gameObject); } } public bool IsFocus() { return focus && !drag; } public bool IsDrag() { return drag; } public PackData GetPackData() { return PackData.Get(pack_tid); } public string GetPackTid() { return pack_tid; } public int GetPackQuantity() { UserData udata = Authenticator.Get().UserData; return udata.GetPackQuantity(pack_tid); } public void OnMouseEnterCard() { if (HandPackArea.Get().IsLocked()) return; focus = true; } public void OnMouseExitCard() { focus = false; focus_timer = 0f; } public void OnMouseDownCard() { if (HandPackArea.Get().IsLocked()) return; drag = true; AudioTool.Get().PlaySFX("hand_card", AssetData.Get().hand_card_click_audio); } public void OnMouseUpCard() { Vector3 world_pos = MouseToWorld(Input.mousePosition); if (drag && world_pos.y > -2.5f) OpenPack(); else HandPackArea.Get().SortCards(); drag = false; } public Vector3 MouseToWorld(Vector3 mouse_pos) { Vector3 wpos = Camera.main.ScreenToWorldPoint(mouse_pos); wpos.z = 0f; return wpos; } public PackData PackData { get { return GetPackData(); } } public static HandPack GetDrag() { foreach (HandPack card in pack_list) { if (card.IsDrag()) return card; } return null; } public static HandPack GetFocus() { foreach (HandPack card in pack_list) { if (card.IsFocus()) return card; } return null; } public static HandPack Get(string uid) { foreach (HandPack card in pack_list) { if (card && card.GetPackTid() == uid) return card; } return null; } public static List GetAll() { return pack_list; } } }