@namespace Faraon.Client.Components
@if (SelectedCards.Count > 0 && IsMyTurn) { var firstSelected = SelectedCards[0]; var lastSelected = SelectedCards[SelectedCards.Count - 1]; var matchingHandCards = Player.Hand.Where(c => c.Rank == firstSelected.Rank).ToList(); var canPlayCombo = CanPlayCards(SelectedCards);
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 {
Nemožno zahrať 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 isPlayable = IsMyTurn && (CanPlayCard(card) || (SelectedCards.Count > 0 && SelectedCards[0].Rank == card.Rank && CanPlayCards(new List { card }))); // 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); string fanSlotStyle = $"transform: translateX({xOffset}px) translateY({yOffset}px) rotate({angle}deg); z-index: {(isSelected ? 120 + i : i + 1)};"; string selectedClass = isSelected ? "card-selected-combo" : "";
@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); // Ak už máme vybraté karty inej hodnoty, zresetujeme výber if (SelectedCards.Count > 0 && SelectedCards[0].Rank != card.Rank) { SelectedCards.Clear(); } // Ak má hráč v ruke len 1 kartu danej hodnoty a žiadna nie je vybratá: if (rankCount == 1 && SelectedCards.Count == 0) { if (CanPlayCard(card)) { await OnPlayCards.InvokeAsync(new List { card }); } return; } // Ak je už karta v zozname vybratých -> odoberieme ju (deselect) if (SelectedCards.Contains(card)) { SelectedCards.Remove(card); } else { // Pridáme na koniec zoznamu ako ďalšiu v poradí SelectedCards.Add(card); } StateHasChanged(); } private void ReverseSelectionOrder() { 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)) { var cardsToPlay = new List(SelectedCards); SelectedCards.Clear(); await OnPlayCards.InvokeAsync(cardsToPlay); } } }