+ 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" : "");
+
+
c.Rank == card.Rank);
- // Ak už máme vybraté karty inej hodnoty, zresetujeme výber
- if (SelectedCards.Count > 0 && SelectedCards[0].Rank != card.Rank)
+ // 1. Ak ešte nie je nič vybraté:
+ if (SelectedCards.Count == 0)
{
- SelectedCards.Clear();
- }
+ // 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 a žiadna nie je vybratá:
- if (rankCount == 1 && SelectedCards.Count == 0)
- {
- if (CanPlayCard(card))
+ // 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;
}
- // Ak je už karta v zozname vybratých -> odoberieme ju (deselect)
+ // 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))
{
- SelectedCards.Remove(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 na koniec zoznamu ako ďalšiu v poradí
+ // Pridáme do poradia ako 2., 3., 4. kartu
SelectedCards.Add(card);
}
@@ -172,6 +222,7 @@
private void ReverseSelectionOrder()
{
+ if (SelectedCards.Count <= 1) return;
SelectedCards.Reverse();
StateHasChanged();
}
@@ -198,7 +249,7 @@
private async Task PlaySelected()
{
- if (SelectedCards.Count > 0 && CanPlayCards(SelectedCards))
+ if (SelectedCards.Count > 0 && CanPlayCards(SelectedCards) && CanPlayCard(SelectedCards[0]))
{
var cardsToPlay = new List(SelectedCards);
SelectedCards.Clear();
diff --git a/Faraon.Client/wwwroot/css/app.css b/Faraon.Client/wwwroot/css/app.css
index 0563070..3ac0fc3 100644
--- a/Faraon.Client/wwwroot/css/app.css
+++ b/Faraon.Client/wwwroot/css/app.css
@@ -641,6 +641,21 @@ body, html {
filter: brightness(1.1);
}
+/* Všetky karty rovnakej hodnoty sa automaticky vysunú pri otvorení comba */
+.hand-card-slot.rank-group-lifted .game-card {
+ transform: translateY(-18px) scale(1.04);
+ border-color: rgba(245, 176, 65, 0.8) !important;
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.6), 0 0 18px rgba(245, 176, 65, 0.6) !important;
+ filter: brightness(1.05);
+ cursor: pointer;
+}
+
+.hand-card-slot.rank-group-lifted:hover .game-card {
+ transform: translateY(-28px) scale(1.08);
+ border-color: #ffd700 !important;
+ box-shadow: 0 14px 32px rgba(0, 0, 0, 0.7), 0 0 22px rgba(245, 176, 65, 0.95) !important;
+}
+
/* COMBO ACTION BAR */
.hand-combo-action-bar {
position: absolute;