using System; using System.Collections.Generic; using System.Linq; using Continentis.MainGame.Card; using UniRx; using UnityEngine; using UnityEngine.UI; namespace Continentis.MainGame.UI { public class HandCardSelectionInterface : WaitableUIElement { public int maximumSelection; public bool isForcedMaximum; public CanvasGroup canvasGroup; public RectTransform selectionContainer; public RectTransform playingCardContainer; public Button confirmButton; public CardInstance playingCard; public CardLocation playingCardOriginalLocation; public Dictionary selectedCards; protected override void Awake() { base.Awake(); selectedCards = new Dictionary(); } public override void Show() { base.Show(); canvasGroup.alpha = 1; canvasGroup.interactable = true; canvasGroup.blocksRaycasts = true; selectedCards.Clear(); confirmButton.interactable = !isForcedMaximum; } public void Setup(CardInstance playingCard, int maxSelection, bool forcedMaximum = false) { this.maximumSelection = maxSelection; this.isForcedMaximum = forcedMaximum; this.playingCard = playingCard; string pileName = playingCard.currentPileName; int index = playingCard.deck.Pile(pileName).IndexOf(playingCard); playingCardOriginalLocation = new CardLocation(pileName, index); CombatUIManager.Instance.deckPage.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.Keys.Contains(cardView.cardInstance)) { return; } string pileName = cardView.cardInstance.currentPileName; int index = cardView.cardInstance.deck.Pile(pileName).IndexOf(cardView.cardInstance); CardLocation location = new CardLocation(pileName, index); selectedCards.Add(cardView.cardInstance, location); CombatUIManager.Instance.deckPage.Pile(cardView.cardInstance.currentPileName).RemoveCard(cardView); cardView.transform.SetParent(selectionContainer, false); if (isForcedMaximum) { confirmButton.interactable = CheckNoMoreAvailable() || selectedCards.Count == maximumSelection; } } public void Deselect(HandCardView cardView) { CardLocation location = selectedCards[cardView.cardInstance]; PileBase uiPile = CombatUIManager.Instance.deckPage.Pile(location.pileName); selectedCards.Remove(cardView.cardInstance); uiPile.AddCard(cardView); cardView.transform.SetParent(uiPile.rectTransform, false); cardView.transform.SetSiblingIndex(location.index); } public void EndSelection() { //Playing Card回归原位 PileBase playingCardPile = CombatUIManager.Instance.deckPage.Pile(playingCardOriginalLocation.pileName); playingCardPile.AddCard(playingCard.handCardView); playingCard.handCardView.transform.SetParent(playingCardPile.rectTransform, false); playingCard.handCardView.transform.SetSiblingIndex(playingCardOriginalLocation.index); playingCard.handCardView.isOccupied = false; //Selected Cards回归原位 foreach (KeyValuePair selectedCard in selectedCards) { CardLocation location = selectedCard.Value; PileBase uiPile = CombatUIManager.Instance.deckPage.Pile(location.pileName); HandCardView handCardView = selectedCard.Key.handCardView; uiPile.AddCard(handCardView); handCardView.transform.SetParent(uiPile.rectTransform, false); handCardView.transform.SetSiblingIndex(location.index); } } public bool CheckNoMoreAvailable() { return false; //TODO: 后续完善 } } public class CardLocation { public string pileName; public int index; public CardLocation(string pileName, int index) { this.pileName = pileName; this.index = index; } } }