@code {
[Parameter, EditorRequired] public Player Player { get; set; } = default!;
[Parameter] public string Deck { get; set; } = "original";
[Parameter] public bool IsMyTurn { get; set; } = false;
[Parameter] public Func CanPlayCardFunc { get; set; } = _ => false;
[Parameter] public Func, bool> CanPlayCardsFunc { get; set; } = _ => false;
[Parameter] public EventCallback> OnPlayCards { get; set; }
private List SelectedCards = new();
private bool CanPlayCard(Card card) => CanPlayCardFunc(card);
private bool CanPlayCards(List cards) => CanPlayCardsFunc(cards);
protected override void OnParametersSet()
{
// Vyčistíme karty, ktoré hráč už nemá v ruke
SelectedCards.RemoveAll(c => !Player.Hand.Contains(c));
}
private async Task HandleCardClick(Card card)
{
if (!IsMyTurn) return;
var rankCount = Player.Hand.Count(c => c.Rank == card.Rank);
// 1. Ak ešte nie je nič vybraté:
if (SelectedCards.Count == 0)
{
// Prvá karta MUSÍ legálne sedieť na stôl!
if (!CanPlayCard(card))
{
// Karta nemôže ísť ako prvá (napr. Žaluď na Červeň) -> nedovolíme začať s ňou
return;
}
// Ak má hráč v ruke len 1 kartu danej hodnoty -> okamžite zahrať
if (rankCount == 1)
{
await OnPlayCards.InvokeAsync(new List { card });
return;
}
// Ak má viac kariet rovnakej hodnoty -> označíme túto ako 1. a vysunú sa všetky karty danej hodnoty!
SelectedCards.Add(card);
StateHasChanged();
return;
}
// 2. Ak už máme niečo vybraté z INEJ hodnoty:
if (SelectedCards[0].Rank != card.Rank)
{
// Môže táto nová karta ísť legálne na stôl ako prvá?
if (!CanPlayCard(card))
{
return;
}
SelectedCards.Clear();
if (rankCount == 1)
{
await OnPlayCards.InvokeAsync(new List { card });
return;
}
SelectedCards.Add(card);
StateHasChanged();
return;
}
// 3. Ak klikáme na kartu ROVNAKEJ hodnoty:
if (SelectedCards.Contains(card))
{
// Ak je to prvá a jediná vybratá karta, kliknutie ju odznačí a zruší combo
if (SelectedCards.Count == 1 && SelectedCards[0] == card)
{
SelectedCards.Clear();
}
else
{
// Odznačíme kartu zo zoznamu
SelectedCards.Remove(card);
}
}
else
{
// Pridáme do poradia ako 2., 3., 4. kartu
SelectedCards.Add(card);
}
StateHasChanged();
}
private void ReverseSelectionOrder()
{
if (SelectedCards.Count <= 1) return;
SelectedCards.Reverse();
StateHasChanged();
}
private void SelectAllOfRank()
{
if (SelectedCards.Count == 0) return;
var rank = SelectedCards[0].Rank;
foreach (var c in Player.Hand.Where(c => c.Rank == rank))
{
if (!SelectedCards.Contains(c))
{
SelectedCards.Add(c);
}
}
StateHasChanged();
}
private void ClearSelection()
{
SelectedCards.Clear();
StateHasChanged();
}
private async Task PlaySelected()
{
if (SelectedCards.Count > 0 && CanPlayCards(SelectedCards) && CanPlayCard(SelectedCards[0]))
{
var cardsToPlay = new List(SelectedCards);
SelectedCards.Clear();
await OnPlayCards.InvokeAsync(cardsToPlay);
}
}
}