improvements

This commit is contained in:
Michal Vrba
2026-08-28 16:34:40 +02:00
parent 4803bc22a6
commit 02bca7c34a
212 changed files with 622 additions and 112 deletions
+70 -11
View File
@@ -15,7 +15,15 @@ else
<!-- Horná lišta -->
<header class="game-header">
<h1 class="game-title">FARAÓN</h1>
<div style="display: flex; align-items: center; gap: 10px;">
<h1 class="game-title">FARAÓN</h1>
@if (Engine.State.Rules.OlympicMode)
{
<span style="background: linear-gradient(135deg, #f5b041, #d4ac0d); color: #1a1a1a; font-weight: 900; font-size: 0.78rem; padding: 2px 10px; border-radius: 12px; letter-spacing: 0.5px;">
🏅 KOLO #@Engine.State.RoundNumber
</span>
}
</div>
<div style="font-size: 0.95rem; font-weight: 700; color: #a3b899;">
Ťah #@Engine.State.TurnCount &bull; Na rade:
<span style="color: var(--gold); font-weight: 900;">
@@ -24,8 +32,8 @@ else
</div>
<div class="game-controls">
<!-- Rýchly prepínač balíčka kariet -->
<button class="btn-game-icon" title="Zmeniť balíček kariet (Original / SpongeBob)" @onclick="ToggleDeck">
@(Engine.State.Rules.SelectedDeck == "spongebob" ? "🧽" : "🎴")
<button class="btn-game-icon" title="Zmeniť balíček kariet (@Engine.State.Rules.SelectedDeck)" @onclick="ToggleDeck">
@GetDeckIcon(Engine.State.Rules.SelectedDeck)
</button>
<button class="btn-game-icon" title="Stlmiť / Zapnúť zvuk" @onclick="ToggleMute">
@(IsMuted ? "🔇" : "🔊")
@@ -43,6 +51,7 @@ else
{
<PlayerSlot Player="@opp.Player"
IsCurrentTurn="@(Engine.State.CurrentPlayer == opp.Player)"
IsOlympicMode="@Engine.State.Rules.OlympicMode"
PositionClass="@opp.PositionClass" />
}
@@ -96,21 +105,36 @@ else
<span class="avatar-icon">@ViewingPlayer.Avatar</span>
<span class="avatar-name">@ViewingPlayer.Name</span>
<span class="avatar-card-count">(@ViewingPlayer.Hand.Count kariet)</span>
@if (Engine.State.Rules.OlympicMode)
{
<span style="font-size: 0.75rem; color: var(--gold); background: rgba(0,0,0,0.4); padding: 2px 8px; border-radius: 10px; border: 1px solid rgba(245, 176, 65, 0.4);">
🏅 @ViewingPlayer.OlympicCardsCount @(ViewingPlayer.OlympicCardsCount == 1 ? "karta" : (ViewingPlayer.OlympicCardsCount < 5 ? "karty" : "kariet"))
</span>
}
</div>
</div>
<!-- Interaktívna ruka hráča -->
<PlayerHandView Player="@ViewingPlayer"
Deck="@Engine.State.Rules.SelectedDeck"
IsMyTurn="@IsViewingPlayerTurn"
CanPlayCardFunc="@(c => Engine.CanPlayCard(ViewingPlayer, c))"
CanPlayCardsFunc="@(cards => Engine.CanPlayCards(ViewingPlayer, cards))"
OnPlayCards="HandlePlayCards" />
@if (!ViewingPlayer.IsEliminated)
{
<PlayerHandView Player="@ViewingPlayer"
Deck="@Engine.State.Rules.SelectedDeck"
IsMyTurn="@IsViewingPlayerTurn"
CanPlayCardFunc="@(c => Engine.CanPlayCard(ViewingPlayer, c))"
CanPlayCardsFunc="@(cards => Engine.CanPlayCards(ViewingPlayer, cards))"
OnPlayCards="HandlePlayCards" />
}
else
{
<div style="padding: 20px; color: #ef4444; font-weight: 800; font-size: 1.1rem; text-shadow: 0 2px 8px rgba(0,0,0,0.8);">
☠️ Bol si vyradený z Olympijského turnaja. Sleduj zápas až do konca!
</div>
}
</div>
</div>
<!-- Akčné tlačidlá pre aktívneho živého hráča -->
@if (IsViewingPlayerTurn && Engine.State.TurnState == TurnState.Playing)
@if (IsViewingPlayerTurn && Engine.State.TurnState == TurnState.Playing && !ViewingPlayer.IsEliminated)
{
<div style="position: absolute; bottom: 18px; right: 24px; z-index: 60; display: flex; gap: 10px;">
@if (CheckFourOfAKindRank(ViewingPlayer) is Rank burnRank)
@@ -158,9 +182,20 @@ else
<PassScreenModal Player="@Engine.State.CurrentPlayer" OnContinue="HandlePassContinue" />
}
@if (Engine.State.TurnState == TurnState.RoundOver)
{
<RoundOverModal RoundNumber="@Engine.State.RoundNumber"
RoundLoser="@Engine.State.RoundLoser"
Players="@Engine.State.Players"
OnNextRound="HandleStartNextRound"
OnBackToLobby="ReturnToLobby" />
}
@if (Engine.State.IsGameOver)
{
<GameOverModal Players="@Engine.State.Players"
IsOlympicMode="@Engine.State.Rules.OlympicMode"
MatchWinner="@Engine.State.MatchWinner"
OnPlayAgain="HandlePlayAgain"
OnBackToLobby="ReturnToLobby" />
}
@@ -285,13 +320,29 @@ else
return "top";
}
private static readonly string[] AvailableDecks = new[] { "original", "janosik", "spongebob", "cyberpunk", "fantasy", "egypt", "pets", "pixel" };
private void ToggleDeck()
{
if (Engine == null) return;
Engine.State.Rules.SelectedDeck = Engine.State.Rules.SelectedDeck == "spongebob" ? "original" : "spongebob";
int currentIdx = Array.IndexOf(AvailableDecks, Engine.State.Rules.SelectedDeck);
int nextIdx = (currentIdx + 1) % AvailableDecks.Length;
Engine.State.Rules.SelectedDeck = AvailableDecks[nextIdx];
StateHasChanged();
}
private string GetDeckIcon(string deck) => deck switch
{
"janosik" => "🪓",
"spongebob" => "🧽",
"cyberpunk" => "⚡",
"fantasy" => "🐉",
"egypt" => "⚔️",
"pets" => "🐱",
"pixel" => "🕹️",
_ => "🎴"
};
private async Task HandlePlayCards(List<Card> cards)
{
if (Engine == null || cards.Count == 0) return;
@@ -349,6 +400,14 @@ else
CheckTriggerAI();
}
private void HandleStartNextRound()
{
if (Engine == null) return;
Engine.StartNextRound();
StateHasChanged();
CheckTriggerAI();
}
private async Task HandleBurn(Rank rank)
{
if (Engine == null) return;