142 lines
5.1 KiB
C#
142 lines
5.1 KiB
C#
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<CardInstance> selectedCards;
|
|
public Func<CardInstance, bool> selectionCondition;
|
|
|
|
protected override void Awake()
|
|
{
|
|
base.Awake();
|
|
selectedCards = new List<CardInstance>();
|
|
}
|
|
|
|
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<CardInstance, bool> 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<Unit> 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: 后续完善
|
|
}
|
|
}
|
|
} |