mixedcards/Assets/Battle/HandControls.cs
2020-09-24 23:00:36 -04:00

106 lines
3.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public enum HandControlsPosition {
Top,
Bottom,
}
public class HandControls<BaseCardT> where BaseCardT : BaseCard
{
public delegate void CardClickedAction(BaseCardT card);
public event CardClickedAction OnCardClicked;
private GameObject uiCanvas;
private GameObject cardPrefab;
private HandControlsPosition position;
private List<BaseCardT> hand;
private List<GameObject> cardsInHandUIs;
private TeamChoice team;
private int insightLevel;
private HandPlayability<BaseCardT> playability;
public HandControls(GameObject uiCanvas, GameObject cardPrefab, HandControlsPosition position,
TeamChoice team, int insightLevel, HandPlayability<BaseCardT> playability) {
this.uiCanvas = uiCanvas;
this.cardPrefab = cardPrefab;
this.position = position;
this.team = team;
this.insightLevel = insightLevel;
this.playability = playability;
if (playability != null) {
playability.OnPlayabilityChanged += UpdateCardPlayability;
}
}
public void SetHand(List<BaseCardT> hand) {
this.hand = hand;
RenderHand();
}
private Vector3 CalculateHandCardPosition(int index, int count) {
const int SPACING = 8;
const int DELTA = BattleCardPrefabConstants.CARD_WIDTH + SPACING;
float x = Screen.width * 0.5f - DELTA / 2 * (count - 1) + DELTA * index;
float y = (this.position == HandControlsPosition.Bottom
? SPACING + BattleCardPrefabConstants.CARD_HEIGHT / 2
: Screen.height - SPACING - BattleCardPrefabConstants.CARD_HEIGHT / 2);
return new Vector3(x, y, 0);
}
public int InsightLevel {
get => this.insightLevel;
set {
this.insightLevel = value;
RenderHand();
}
}
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<GameObject>();
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<CardUI>();
if (i < this.insightLevel) {
cardUIScript.Init(card);
} else {
cardUIScript.InitHidden();
}
int cardIndex = i;
cardUI.GetComponent<Button>().onClick.AddListener(delegate {OnCardClicked(card);});
}
UpdateCardPlayability();
}
private void UpdateCardPlayability() {
if (this.hand == null || this.playability == null) {
return;
}
for (int i = 0; i < this.hand.Count; i++) {
BaseCardT card = this.hand[i];
CardUI cardUI = this.cardsInHandUIs[i].GetComponent<CardUI>();
cardUI.Playable = this.playability.IsPlayable(card);
}
}
}