Files
Continentis/Assets/Scripts/MainGame/UI/CombatMainPage/CustomCardSelectionInterface.cs
SoulliesOfficial 5fe665d0ce Card爆改!
2025-11-15 12:17:34 -05:00

143 lines
5.2 KiB
C#

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<CardInstance> cardsToSelect;
public List<CardInstance> 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<CardInstance> 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<CardInstance>();
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<Unit> 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;
}
}
}
}
}