using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; public enum HandControlsPosition { Top, Bottom, } public class HandControls where BaseCardT : BaseCard { public delegate void CardClickedAction(BaseCardT card); public event CardClickedAction OnCardClicked; private BattleDeck deck; private GameObject uiCanvas; private GameObject cardPrefab; private HandControlsPosition position; private List hand; private List cardsInHandUIs; private TeamChoice team; private int insightLevel; private HandPlayability playability; private float scale; public HandControls(BattleDeck deck, GameObject uiCanvas, GameObject cardPrefab, HandControlsPosition position, TeamChoice team, int insightLevel, HandPlayability playability, float scale) { this.deck = deck; this.uiCanvas = uiCanvas; this.cardPrefab = cardPrefab; this.position = position; this.team = team; this.insightLevel = insightLevel; this.playability = playability; this.scale = scale; deck.OnHandPileChanged += this.UpdateState; if (playability != null) { playability.OnPlayabilityChanged += this.UpdateState; } } private Vector3 CalculateHandCardPosition(int index, int count) { float SPACING = 0 * this.scale; float DELTA = BattleCardPrefabConstants.CARD_WIDTH * this.scale + SPACING; float x = Screen.width * 0.5f - DELTA / 2 * (count - 1) + DELTA * index; float y = (this.position == HandControlsPosition.Bottom ? SPACING + BattleCardPrefabConstants.CARD_HEIGHT * this.scale / 2 : Screen.height - SPACING - BattleCardPrefabConstants.CARD_HEIGHT * this.scale / 2); return new Vector3(x, y, 0); } public int InsightLevel { get => this.insightLevel; set { this.insightLevel = value; UpdateState(); } } private void RenderHand() { if (this.hand == null) { return; } if (this.cardsInHandUIs != null) { foreach (GameObject cardInHandUI in this.cardsInHandUIs) { GameObject.Destroy(cardInHandUI); } } this.cardsInHandUIs = new List(); for (int i = 0; i < this.hand.Count; i++) { BaseCardT card = this.hand[i]; GameObject cardUI = GameObject.Instantiate(this.cardPrefab, this.uiCanvas.transform); this.cardsInHandUIs.Add(cardUI); cardUI.transform.position = CalculateHandCardPosition(i, this.hand.Count); CardUI cardUIScript = cardUI.GetComponent(); if (i < this.insightLevel) { cardUIScript.Init(card); } else { cardUIScript.InitHidden(); } int cardIndex = i; cardUI.GetComponent