improvfmeents

This commit is contained in:
Michal Vrba
2026-09-04 11:31:52 +02:00
parent 7ca0e08637
commit d4e0071f95
14 changed files with 941 additions and 61 deletions
+81 -2
View File
@@ -1,5 +1,6 @@
@page "/"
@using Faraon.Core.AI
@implements IDisposable
@inject FxService Fx
@inject IFaraonAI AI
@inject IJSRuntime JS
@@ -10,7 +11,7 @@
}
else
{
<div id="game-table-container">
<div id="game-table-container" class="theme-@Engine.State.Rules.TableTheme.ToString().ToLowerInvariant()">
<!-- Canvas pre časticové efekty (oheň, ľad, konfety) -->
<canvas id="particle-canvas"></canvas>
@@ -27,6 +28,11 @@ else
}
</div>
<div style="display: flex; align-items: center; gap: 8px;">
<!-- Prepínač témy stola -->
<button class="btn-header-action" @onclick="CycleTableTheme" title="Téma stola: @GetThemeName(Engine.State.Rules.TableTheme)">
<span>@GetThemeIcon(Engine.State.Rules.TableTheme)</span>
</button>
<!-- Rýchlosť hry -->
<button class="btn-speed-control" @onclick="CycleSpeed" title="Zmeniť rýchlosť hry">
@GetSpeedButtonText(Engine.State.Rules.SpeedLevel)
@@ -45,6 +51,32 @@ else
</div>
</header>
<!-- Živý radar & Záznamník ťahov -->
<div class="game-log-radar @(IsLogRadarMinimized ? "minimized" : "")">
<button class="log-radar-toggle-btn" @onclick="() => IsLogRadarMinimized = !IsLogRadarMinimized" title="Záznamník ťahov">
<span>📜 Ťahy</span>
<span style="font-size: 0.65rem;">@(IsLogRadarMinimized ? "▼" : "▲")</span>
</button>
@if (!IsLogRadarMinimized && Engine.State.MoveLog.Count > 0)
{
<div class="log-radar-items-container">
@foreach (var log in Engine.State.MoveLog.TakeLast(5).Reverse())
{
<div class="log-radar-item" style="border-left-color: @(log.AccentColor ?? "var(--gold)");">
<span class="log-radar-icon">@log.Icon</span>
<div class="log-radar-text">
<div>@log.Text</div>
@if (!string.IsNullOrEmpty(log.SubText))
{
<div class="log-radar-sub">@log.SubText</div>
}
</div>
</div>
}
</div>
}
</div>
<!-- Špeciálny banner kartového vtipu (AI Human Mode) -->
@if (CurrentJoke != null)
{
@@ -310,6 +342,7 @@ else
<GameOverModal Players="@Engine.State.Players"
IsOlympicMode="@Engine.State.Rules.OlympicMode"
MatchWinner="@Engine.State.MatchWinner"
Stats="@Engine.State.Stats"
OnPlayAgain="HandlePlayAgain"
OnBackToLobby="ReturnToLobby" />
}
@@ -319,6 +352,7 @@ else
@code {
private bool IsInLobby = true;
private bool IsMuted = false;
private bool IsLogRadarMinimized = true;
private GameEngine? Engine;
private string LastEventMessage = "";
private System.Threading.CancellationTokenSource? _aiCts;
@@ -376,7 +410,7 @@ else
private void StartNewGame()
{
// Klony hráčov pre čistú hru
var gamePlayers = ConfiguredPlayers.Select(p => new Player(p.Name, p.Type, p.Avatar, p.Difficulty)).ToList();
var gamePlayers = ConfiguredPlayers.Select(p => new Player(p.Name, p.Type, p.Avatar, p.Difficulty, p.PersonalityId)).ToList();
Engine = new GameEngine();
Engine.OnGameEvent += HandleGameEvent;
@@ -1024,6 +1058,11 @@ else
player.CurrentEmotion = emotion;
StateHasChanged();
if (player.Type == PlayerType.AI && !string.IsNullOrEmpty(player.PersonalityId))
{
_ = Fx.PlayBotSfxAsync(player.PersonalityId, emotion.ToString().ToLowerInvariant());
}
if (emotion != PlayerEmotion.Neutral && emotion != PlayerEmotion.Celebrating)
{
_ = Task.Run(async () =>
@@ -1038,6 +1077,38 @@ else
}
}
private void CycleTableTheme()
{
if (Engine == null) return;
Engine.State.Rules.TableTheme = Engine.State.Rules.TableTheme switch
{
TableTheme.ClassicGreen => TableTheme.RoyalBurgundy,
TableTheme.RoyalBurgundy => TableTheme.WoodCabin,
TableTheme.WoodCabin => TableTheme.CyberNeon,
TableTheme.CyberNeon => TableTheme.ClassicGreen,
_ => TableTheme.ClassicGreen
};
StateHasChanged();
}
private string GetThemeName(TableTheme theme) => theme switch
{
TableTheme.ClassicGreen => "Zelené plátno",
TableTheme.RoyalBurgundy => "Kráľovský bord",
TableTheme.WoodCabin => "Drevený zrub",
TableTheme.CyberNeon => "Cyberpunk neón",
_ => "Zelené plátno"
};
private string GetThemeIcon(TableTheme theme) => theme switch
{
TableTheme.ClassicGreen => "🍀",
TableTheme.RoyalBurgundy => "👑",
TableTheme.WoodCabin => "🪵",
TableTheme.CyberNeon => "⚡",
_ => "🍀"
};
private IEnumerable<(Player Player, string PositionClass)> GetOpponents()
{
if (Engine == null) return Enumerable.Empty<(Player, string)>();
@@ -1132,6 +1203,7 @@ else
{
PlayerThoughts.Clear();
CurrentJoke = null;
IsLogRadarMinimized = true;
StartNewGame();
}
@@ -1140,7 +1212,14 @@ else
_aiCts?.Cancel();
PlayerThoughts.Clear();
CurrentJoke = null;
IsLogRadarMinimized = true;
IsInLobby = true;
Engine = null;
}
public void Dispose()
{
_aiCts?.Cancel();
_aiCts?.Dispose();
}
}