mixedcards/Assets/Battle/BattlePlayerControls.cs

98 lines
2.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BattlePlayerControls : MonoBehaviour
{
public BattleController battleController;
public GameObject uiCanvas;
public GameObject cardPrefab;
public delegate void CardUsedAction(BaseCard card);
public event CardUsedAction OnCardUsed;
public delegate void TurnPassedAction();
public event TurnPassedAction OnTurnPassed;
private HeroDeck heroDeck;
private List<GameObject> cardsInHandUIs;
public void Init(HeroDeck heroDeck) {
this.heroDeck = heroDeck;
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void SetHand(List<BaseCard> hand) {
if (this.cardsInHandUIs != null) {
foreach (GameObject cardInHandUI in this.cardsInHandUIs) {
Destroy(cardInHandUI);
}
}
this.cardsInHandUIs = new List<GameObject>();
for (int i = 0; i < hand.Count; i++) {
BaseCard card = hand[i];
GameObject cardUI = Instantiate(this.cardPrefab, this.uiCanvas.transform);
this.cardsInHandUIs.Add(cardUI);
cardUI.transform.position = CalculateCardPosition(i, hand.Count);
cardUI.GetComponent<CardUI>().Init(card);
int cardIndex = i;
cardUI.GetComponent<Button>().onClick.AddListener(delegate {OnCardClicked(card);});
}
}
private Vector3 CalculateCardPosition(int index, int count) {
const int CARD_SIZE = 120;
const int SPACING = 8;
const int DELTA = CARD_SIZE + SPACING;
return new Vector3(Screen.width * 0.5f - DELTA / 2 * (count - 1) + DELTA * index, 160, 0);
}
private void OnCardClicked(BaseCard card) {
if (this.singleTargeting == null) {
if (this.battleController.CanUseCard(card)) {
OnCardUsed(card);
}
}
}
private SingleTargeting singleTargeting;
public IEnumerator ChooseTarget(SingleTargeting targeting) {
this.singleTargeting = targeting;
yield return this.singleTargeting.ChooseTarget();
this.singleTargeting = null;
}
public void NotifyParticipantSpriteClicked(BattleParticipant participant) {
if (this.singleTargeting != null) {
this.singleTargeting.NotifyParticipantSpriteClicked(participant);
}
}
public void PassTurnButtonClicked() {
if (this.singleTargeting == null) {
OnTurnPassed();
}
}
public bool CouldTarget(BattleParticipant participant) {
return this.singleTargeting != null && this.singleTargeting.CanTarget(participant);
}
public void NotifyHandPileChanged() {
SetHand(this.heroDeck.GetHandPile());
}
}