using System; using System.Collections.Generic; using Continentis.MainGame.Card; using NUnit.Framework; using TMPro; using UniRx; using UnityEngine; using UnityEngine.UI; namespace Continentis.MainGame.UI { public class CustomCardSelectionInterface : 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 cardsToSelect; public List selectedCards; protected override void Awake() { base.Awake(); } 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, List cardsToSelect, int maxSelection, bool forcedMaximum = false) { this.title = title; this.maximumSelection = maxSelection; this.isForcedMaximum = forcedMaximum; this.titleText.text = title; this.playingCard = playingCard; CombatUIManager.Instance.combatMainPage.Pile(playingCard.cardLocation.pileName).RemoveCard(playingCard.handCardView); playingCard.handCardView.transform.SetParent(playingCardContainer, false); playingCard.handCardView.transform.localPosition = Vector3.zero; playingCard.handCardView.isOccupied = true; this.cardsToSelect = cardsToSelect; this.selectedCards = new List(); foreach (CardInstance card in this.cardsToSelect) { Debug.Log($"Card to select: {card.contentSubmodule.cardName} from {card.cardLocation.pileName}"); CombatUIManager.Instance.combatMainPage.Pile(card.cardLocation.pileName).RemoveCard(card.handCardView); card.handCardView.transform.SetParent(selectionContainer, false); card.handCardView.transform.localScale = Vector3.one; } } 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 (selectedCards.Contains(cardView.card)) { return; } if (maximumSelection > 0 && selectedCards.Count >= maximumSelection) { return; } selectedCards.Add(cardView.card); cardView.EnableSelectShadow(); if (isForcedMaximum) { confirmButton.interactable = CheckNoMoreAvailable() || selectedCards.Count == maximumSelection; } } public void Deselect(HandCardView cardView) { selectedCards.Remove(cardView.card); cardView.DisableSelectShadow(); if (isForcedMaximum) { confirmButton.interactable = CheckNoMoreAvailable() || selectedCards.Count == maximumSelection; } } private bool CheckNoMoreAvailable() { return cardsToSelect.Count < maximumSelection; } 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; //CardsToSelect回归原位 foreach (CardInstance card in cardsToSelect) { CardLocation location = card.cardLocation; PileBase uiPile = CombatUIManager.Instance.combatMainPage.Pile(location.pileName); HandCardView handCardView = card.handCardView; uiPile.AddCard(handCardView); handCardView.transform.SetParent(uiPile.rectTransform, false); handCardView.transform.SetSiblingIndex(location.index); handCardView.DisableSelectShadow(true); if (location.pileName != "Hand") { card.handCardView.transform.localScale = Vector3.zero; } } } } }