using System; using System.Collections.Generic; using System.Linq; using Continentis.MainGame.Card; using NUnit.Framework; using TMPro; using UniRx; using UnityEngine; using UnityEngine.UI; namespace Continentis.MainGame.UI { public class HandCardSelectionInterface : WaitableUIElement { public string title; public int maximumSelection; public bool isForcedMaximum; public CanvasGroup canvasGroup; public TMP_Text titleText; public RectTransform selectionContainer; public RectTransform playingCardContainer; public Button confirmButton; public CardInstance playingCard; public List selectedCards; public Func selectionCondition; protected override void Awake() { base.Awake(); selectedCards = new List(); } public override void Show() { base.Show(); canvasGroup.alpha = 1; canvasGroup.interactable = true; canvasGroup.blocksRaycasts = true; selectedCards.Clear(); confirmButton.interactable = !isForcedMaximum; } public void Setup(string title, CardInstance playingCard, int maxSelection, Func condition = null, bool forcedMaximum = false) { this.title = title; this.maximumSelection = maxSelection; this.isForcedMaximum = forcedMaximum; this.selectionCondition = condition ?? (card => true); this.titleText.text = title; this.playingCard = playingCard; string pileName = playingCard.cardLocation.pileName; CombatUIManager.Instance.combatMainPage.Pile(pileName).RemoveCard(playingCard.handCardView); playingCard.handCardView.transform.SetParent(playingCardContainer, false); playingCard.handCardView.transform.localPosition = Vector3.zero; playingCard.handCardView.isOccupied = true; } public override void Hide() { base.Hide(); canvasGroup.alpha = 0; canvasGroup.interactable = false; canvasGroup.blocksRaycasts = false; } public override IObservable OnConfirm() { return confirmButton.OnClickAsObservable().First().Do(_ => EndSelection()).AsUnitObservable(); } public void Select(HandCardView cardView) { if (maximumSelection > 0 && selectedCards.Count >= maximumSelection) { return; } if (selectedCards.Contains(cardView.card)) { return; } if (!selectionCondition(cardView.card)) { return; } string pileName = cardView.card.cardLocation.pileName; int index = cardView.card.deck.Pile(pileName).IndexOf(cardView.card); selectedCards.Add(cardView.card); CombatUIManager.Instance.combatMainPage.Pile(pileName).RemoveCard(cardView); cardView.transform.SetParent(selectionContainer, false); if (isForcedMaximum) { confirmButton.interactable = CheckNoMoreAvailable() || selectedCards.Count == maximumSelection; } } public void Deselect(HandCardView cardView) { CardLocation location = cardView.card.cardLocation; PileBase uiPile = CombatUIManager.Instance.combatMainPage.Pile(location.pileName); selectedCards.Remove(cardView.card); uiPile.AddCard(cardView); cardView.transform.SetParent(uiPile.rectTransform, false); cardView.transform.SetSiblingIndex(location.index); } public void EndSelection() { //Playing Card回归原位 PileBase playingCardPile = CombatUIManager.Instance.combatMainPage.Pile(playingCard.cardLocation.pileName); playingCardPile.AddCard(playingCard.handCardView); playingCard.handCardView.transform.SetParent(playingCardPile.rectTransform, false); playingCard.handCardView.transform.SetSiblingIndex(playingCard.cardLocation.index); playingCard.handCardView.isOccupied = false; //Selected Cards回归原位 foreach (CardInstance selectedCard in selectedCards) { CardLocation location = selectedCard.cardLocation; PileBase uiPile = CombatUIManager.Instance.combatMainPage.Pile(location.pileName); HandCardView handCardView = selectedCard.handCardView; uiPile.AddCard(handCardView); handCardView.transform.SetParent(uiPile.rectTransform, false); handCardView.transform.SetSiblingIndex(location.index); } } public bool CheckNoMoreAvailable() { return false; //TODO: 后续完善 } } }