improvfmeents
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
<div class="game-card marias-card @(IsBack ? "card-back" : "") @(IsPlayable ? "playable" : (IsInteractive && !IsPlayable ? "unplayable" : "")) @CustomClass"
|
||||
style="@CustomStyle"
|
||||
data-card-index="@CardIndex"
|
||||
@onclick="HandleClick">
|
||||
|
||||
@if (IsBack || Card == null)
|
||||
@@ -20,6 +21,7 @@
|
||||
[Parameter] public bool IsBack { get; set; } = false;
|
||||
[Parameter] public bool IsPlayable { get; set; } = false;
|
||||
[Parameter] public bool IsInteractive { get; set; } = false;
|
||||
[Parameter] public int? CardIndex { get; set; }
|
||||
[Parameter] public string CustomClass { get; set; } = "";
|
||||
[Parameter] public string CustomStyle { get; set; } = "";
|
||||
[Parameter] public EventCallback<Card> OnCardClicked { get; set; }
|
||||
|
||||
@@ -1,79 +1,115 @@
|
||||
@namespace Faraon.Client.Components
|
||||
|
||||
<div class="game-over-overlay">
|
||||
<div class="game-over-card">
|
||||
<div class="game-over-title">
|
||||
<div class="match-summary-backdrop">
|
||||
<div class="match-summary-card">
|
||||
<div class="game-over-title" style="margin-bottom: 8px;">
|
||||
@if (IsOlympicMode)
|
||||
{
|
||||
<span>🏆 OLYMPIJSKÝ ŠAMPIÓN 👑</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>Výsledky Hry 👑</span>
|
||||
<span>🏆 VÝSLEDKY ZÁPASU 👑</span>
|
||||
}
|
||||
</div>
|
||||
|
||||
@if (IsOlympicMode && MatchWinner != null)
|
||||
{
|
||||
<div style="background: linear-gradient(135deg, rgba(245, 176, 65, 0.25), rgba(212, 172, 13, 0.15)); border: 2px solid var(--gold); border-radius: 14px; padding: 14px; margin-bottom: 18px; text-align: center;">
|
||||
<div style="font-size: 2.2rem; margin-bottom: 4px;">🥇👑</div>
|
||||
<div style="font-size: 1.35rem; font-weight: 900; color: var(--gold);">
|
||||
@MatchWinner.Avatar @MatchWinner.Name
|
||||
<!-- 3D PÓDIUM VÍŤAZOV -->
|
||||
@{
|
||||
var sortedPlayers = Players.OrderBy(p => p.IsEliminated ? 1 : 0).ThenBy(p => p.FinishedPosition ?? 99).ToList();
|
||||
var firstPlace = MatchWinner ?? sortedPlayers.FirstOrDefault(p => p.FinishedPosition == 1) ?? sortedPlayers.FirstOrDefault();
|
||||
var secondPlace = sortedPlayers.Count > 1 ? (sortedPlayers.FirstOrDefault(p => p != firstPlace && p.FinishedPosition == 2) ?? sortedPlayers.Skip(1).FirstOrDefault()) : null;
|
||||
var thirdPlace = sortedPlayers.Count > 2 ? (sortedPlayers.FirstOrDefault(p => p != firstPlace && p != secondPlace && p.FinishedPosition == 3) ?? sortedPlayers.Skip(2).FirstOrDefault()) : null;
|
||||
}
|
||||
|
||||
<div class="podium-container">
|
||||
<!-- 2. MIESTO (STRIEBRO) -->
|
||||
@if (secondPlace != null)
|
||||
{
|
||||
<div class="podium-column">
|
||||
<div class="podium-avatar-box">
|
||||
<div class="podium-avatar">@secondPlace.GetLiveAvatar()</div>
|
||||
</div>
|
||||
<div class="podium-name">@secondPlace.Name</div>
|
||||
<div class="podium-step step-silver">2</div>
|
||||
</div>
|
||||
<div style="font-size: 0.9rem; color: #f1f5f9; margin-top: 4px;">
|
||||
Prežil všetky kolá ako jediný hráč a zvíťazil v Olympijskom turnaji!
|
||||
}
|
||||
|
||||
<!-- 1. MIESTO (ZLATO) -->
|
||||
@if (firstPlace != null)
|
||||
{
|
||||
<div class="podium-column">
|
||||
<div class="podium-avatar-box">
|
||||
<div class="podium-crown">👑</div>
|
||||
<div class="podium-avatar" style="font-size: 3.2rem;">@firstPlace.GetLiveAvatar()</div>
|
||||
</div>
|
||||
<div class="podium-name" style="color: var(--gold); font-size: 0.95rem;">@firstPlace.Name</div>
|
||||
<div class="podium-step step-gold">1</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
<!-- 3. MIESTO (BRONZ) -->
|
||||
@if (thirdPlace != null)
|
||||
{
|
||||
<div class="podium-column">
|
||||
<div class="podium-avatar-box">
|
||||
<div class="podium-avatar">@thirdPlace.GetLiveAvatar()</div>
|
||||
</div>
|
||||
<div class="podium-name">@thirdPlace.Name</div>
|
||||
<div class="podium-step step-bronze">3</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
<!-- ŠTATISTIKY ZÁPASU -->
|
||||
@if (Stats != null)
|
||||
{
|
||||
<div class="match-stats-grid">
|
||||
<div class="stat-badge-box">
|
||||
<span class="stat-badge-icon">👑</span>
|
||||
<div>
|
||||
<div class="stat-badge-title">MVP Zápasu</div>
|
||||
<div class="stat-badge-value">@Stats.GetMvpPlayerName()</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stat-badge-box">
|
||||
<span class="stat-badge-icon">🎒</span>
|
||||
<div>
|
||||
<div class="stat-badge-title">Najväčší trest</div>
|
||||
<div class="stat-badge-value">
|
||||
@(Stats.MaxPenaltyDrawnInOneTurn > 0 ? $"+{Stats.MaxPenaltyDrawnInOneTurn} ({Stats.MaxPenaltyPlayerName})" : "Žiadny")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stat-badge-box">
|
||||
<span class="stat-badge-icon">⏱️</span>
|
||||
<div>
|
||||
<div class="stat-badge-title">Čas & Ťahy</div>
|
||||
<div class="stat-badge-value">
|
||||
@($"{(int)Stats.Duration.TotalMinutes}m {Stats.Duration.Seconds:D2}s • {Stats.TotalTurns} ťahov")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stat-badge-box">
|
||||
<span class="stat-badge-icon">🔥</span>
|
||||
<div>
|
||||
<div class="stat-badge-title">Spálenia & Esá</div>
|
||||
<div class="stat-badge-value">
|
||||
@($"{Stats.TotalCardsBurned / 4}x spálenie • {Stats.TotalAcesPlayed} es")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
<div class="podium-list">
|
||||
@foreach (var player in Players.OrderBy(p => p.IsEliminated ? 1 : 0).ThenBy(p => p.FinishedPosition ?? 99))
|
||||
{
|
||||
<div class="podium-row @((MatchWinner != null && player == MatchWinner) || (!IsOlympicMode && player.FinishedPosition == 1) ? "winner" : "")">
|
||||
<div class="podium-pos">
|
||||
@if ((MatchWinner != null && player == MatchWinner) || (!IsOlympicMode && player.FinishedPosition == 1)) { <span>🥇</span> }
|
||||
else if (player.FinishedPosition == 2) { <span>🥈</span> }
|
||||
else if (player.FinishedPosition == 3) { <span>🥉</span> }
|
||||
else { <span>#@(player.FinishedPosition ?? 4)</span> }
|
||||
</div>
|
||||
<div class="podium-player">
|
||||
<span>@player.Avatar</span>
|
||||
<span>@player.Name</span>
|
||||
@if (player.Type == PlayerType.AI)
|
||||
{
|
||||
<span style="font-size: 0.75rem; opacity: 0.7;">(AI)</span>
|
||||
}
|
||||
</div>
|
||||
<div style="font-weight: 800;">
|
||||
@if (IsOlympicMode)
|
||||
{
|
||||
if (player == MatchWinner)
|
||||
{
|
||||
<span style="color: var(--gold);">Šampión! 🏆</span>
|
||||
}
|
||||
else if (player.IsEliminated)
|
||||
{
|
||||
<span style="color: #ef4444;">Vyradený ☠️</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>@player.OlympicCardsCount kariet</span>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>@(player.FinishedPosition == 1 ? "Víťaz! 🎉" : $"{player.FinishedPosition}. miesto")</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
<div style="display: flex; gap: 12px; justify-content: center;">
|
||||
<button class="btn-primary-glow" @onclick="OnPlayAgain">
|
||||
Hrať znova 🔄
|
||||
<!-- AKČNÉ TLAČIDLÁ -->
|
||||
<div style="display: flex; gap: 12px; justify-content: center; margin-top: 8px;">
|
||||
<button class="btn-primary-glow" style="padding: 12px 30px;" @onclick="OnPlayAgain">
|
||||
Hrať znova ⚔️
|
||||
</button>
|
||||
<button class="btn-pill" style="padding: 12px 24px;" @onclick="OnBackToLobby">
|
||||
<button class="btn-pill" style="padding: 12px 26px;" @onclick="OnBackToLobby">
|
||||
Do Lobby 🏠
|
||||
</button>
|
||||
</div>
|
||||
@@ -84,6 +120,7 @@
|
||||
[Parameter] public List<Player> Players { get; set; } = new();
|
||||
[Parameter] public bool IsOlympicMode { get; set; } = false;
|
||||
[Parameter] public Player? MatchWinner { get; set; }
|
||||
[Parameter] public GameMatchStats? Stats { get; set; }
|
||||
[Parameter] public EventCallback OnPlayAgain { get; set; }
|
||||
[Parameter] public EventCallback OnBackToLobby { get; set; }
|
||||
}
|
||||
|
||||
@@ -217,6 +217,28 @@
|
||||
}
|
||||
</div>
|
||||
|
||||
<!-- Výber atmosféry herného stola -->
|
||||
<div style="margin-bottom: 24px;">
|
||||
<div style="font-weight: 800; color: var(--gold); font-size: 0.95rem; letter-spacing: 0.5px; margin-bottom: 10px; display: flex; align-items: center; gap: 8px;">
|
||||
<span>🌲</span>
|
||||
<span>ATMOSFÉRA & PLÁTNO HERNÉHO STOLA</span>
|
||||
</div>
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 10px;">
|
||||
@foreach (var t in TableThemes)
|
||||
{
|
||||
<div class="deck-option-card @(Rules.TableTheme == t.Theme ? "selected-deck" : "")"
|
||||
style="padding: 10px 14px; cursor: pointer; display: flex; align-items: center; gap: 10px;"
|
||||
@onclick="() => Rules.TableTheme = t.Theme">
|
||||
<div style="font-size: 1.8rem;">@t.Icon</div>
|
||||
<div class="deck-info" style="flex: 1;">
|
||||
<div class="deck-name" style="font-size: 0.92rem; color: var(--gold);">@t.Name</div>
|
||||
<div class="deck-desc" style="font-size: 0.76rem;">@t.Desc</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Štart tlačidlo -->
|
||||
<div style="text-align: center;">
|
||||
<button class="btn-primary-glow" style="padding: 14px 45px; font-size: 1.25rem;" @onclick="StartGame">
|
||||
@@ -235,6 +257,15 @@
|
||||
private bool ShowDeckSelector = false;
|
||||
|
||||
private record DeckInfo(string Id, string Name, string Desc, string Thumb, string Back);
|
||||
private record ThemeOption(TableTheme Theme, string Name, string Desc, string Icon);
|
||||
|
||||
private readonly ThemeOption[] TableThemes = new[]
|
||||
{
|
||||
new ThemeOption(TableTheme.ClassicGreen, "Zelený Filc", "Klasické kasíno s dreveným mantinelom", "🌲"),
|
||||
new ThemeOption(TableTheme.RoyalBurgundy, "Bordový Zamat", "Kráľovský VIP salónik so zlatým lemom", "🍷"),
|
||||
new ThemeOption(TableTheme.WoodCabin, "Drevená Koliba", "Rustikálny drevený stôl s teplým krbom", "🪵"),
|
||||
new ThemeOption(TableTheme.CyberNeon, "Cyberpunk Neón", "Holografický tmavomodrý neónový stôl", "🌌")
|
||||
};
|
||||
|
||||
private readonly DeckInfo[] AvailableDecks = new[]
|
||||
{
|
||||
|
||||
@@ -109,6 +109,7 @@
|
||||
IsInteractive="@IsMyTurn"
|
||||
IsPlayable="@isPlayable"
|
||||
CustomClass="@selectedClass"
|
||||
CardIndex="@i"
|
||||
OnCardClicked="HandleCardClick" />
|
||||
|
||||
@if (isSelected)
|
||||
|
||||
Reference in New Issue
Block a user