improvfmeents
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user