@namespace Faraon.Client.Components
@if (SelectedCards.Count > 0 && IsMyTurn) { var firstSelected = SelectedCards[0]; var matchingHandCards = Player.Hand.Where(c => c.Rank == firstSelected.Rank).ToList(); var canPlayCombo = CanPlayCards(SelectedCards) && CanPlayCard(firstSelected);
Poradie:
@for (int s = 0; s < SelectedCards.Count; s++) { var sc = SelectedCards[s]; var isFinal = (s == SelectedCards.Count - 1 && SelectedCards.Count > 1); @(s + 1). @sc.SuitSymbol @sc.SuitName @if (isFinal) { 👑 } @if (s < SelectedCards.Count - 1) { ➔ } }
@if (canPlayCombo) { } else {
⚠️ Prvá karta (@firstSelected.SuitName) nesedí na stôl
} @if (SelectedCards.Count > 1) { } @if (matchingHandCards.Count > SelectedCards.Count) { }
}
@for (int i = 0; i < Player.Hand.Count; i++) { var card = Player.Hand[i]; var selectedIdx = SelectedCards.IndexOf(card); var isSelected = selectedIdx >= 0; var isSameRankAsSelected = SelectedCards.Count > 0 && SelectedCards[0].Rank == card.Rank; // Karta je hrateľná ako 1. na stôl, ALEBO patrí do aktívneho comba rovnakej hodnoty var isPlayable = IsMyTurn && ( (SelectedCards.Count == 0 && CanPlayCard(card)) || (SelectedCards.Count > 0 && isSameRankAsSelected) ); // Výpočet vejárovitého natočenia kariet v ruke int total = Player.Hand.Count; double mid = (total - 1) / 2.0; double offset = i - mid; double angle = total > 1 ? offset * (Math.Min(35.0 / total, 5.5)) : 0; double yOffset = Math.Abs(offset) * 4.0; double xOffset = offset * (total > 8 ? 26 : 38); // Ak patrí do aktívnej skupiny rovnakej hodnoty, vysunieme ju string slotClasses = "hand-card-slot"; if (isSameRankAsSelected && !isSelected) { slotClasses += " rank-group-lifted"; } string fanSlotStyle = $"transform: translateX({xOffset}px) translateY({yOffset}px) rotate({angle}deg); z-index: {(isSelected ? 140 + i : (isSameRankAsSelected ? 110 + i : i + 1))};"; string selectedClass = isSelected ? "card-selected-combo" : (isSameRankAsSelected ? "card-group-active" : "");
@if (isSelected) { var orderNum = selectedIdx + 1; var isTopCard = (selectedIdx == SelectedCards.Count - 1 && SelectedCards.Count > 1);
@orderNum. @if (isTopCard) { 👑 Vrch }
}
}
@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); } } }