improvements
This commit is contained in:
@@ -17,6 +17,7 @@ else
|
||||
<!-- Horná lišta -->
|
||||
<header class="game-header">
|
||||
<div style="display: flex; align-items: center; gap: 10px;">
|
||||
<img src="assets/logo/logo_2_modern.jpg" style="width: 34px; height: 34px; border-radius: 50%; border: 1.5px solid #00e5ff; object-fit: cover; box-shadow: 0 0 12px rgba(0,229,255,0.6);" alt="Logo" />
|
||||
<h1 class="game-title">FARAÓN</h1>
|
||||
@if (Engine.State.Rules.OlympicMode)
|
||||
{
|
||||
@@ -25,20 +26,21 @@ else
|
||||
</span>
|
||||
}
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; gap: 12px;">
|
||||
<div style="display: flex; align-items: center; gap: 8px;">
|
||||
<!-- Rýchlosť hry -->
|
||||
<button class="btn-speed-control" @onclick="CycleSpeed" title="Zmeniť rýchlosť hry">
|
||||
@GetSpeedButtonText(Engine.State.Rules.SpeedLevel)
|
||||
</button>
|
||||
|
||||
<!-- Zvuk -->
|
||||
<button class="btn-header-action" @onclick="ToggleMute" title="@(IsMuted ? "Zapnúť zvuk" : "Stlmiť zvuk")">
|
||||
@(IsMuted ? "🔇" : "🔊")
|
||||
<button class="btn-header-action @(IsMuted ? "btn-sound-muted" : "")" @onclick="ToggleMute" title="@(IsMuted ? "Zapnúť zvuk" : "Stlmiť zvuk")">
|
||||
<span>@(IsMuted ? "🔇" : "🔊")</span>
|
||||
</button>
|
||||
|
||||
<!-- Nová hra -->
|
||||
<!-- Menu -->
|
||||
<button class="btn-header-action" @onclick="ReturnToLobby" title="Späť do menu">
|
||||
⚙️ Menu
|
||||
<span style="font-size: 0.9rem;">⚙️</span>
|
||||
<span>Menu</span>
|
||||
</button>
|
||||
</div>
|
||||
</header>
|
||||
@@ -174,7 +176,7 @@ else
|
||||
}
|
||||
|
||||
<div style="display: flex; align-items: center; gap: 8px;">
|
||||
<span class="avatar-icon">@ViewingPlayer.Avatar</span>
|
||||
<span class="avatar-icon">@ViewingPlayer.GetLiveAvatar()</span>
|
||||
<span class="avatar-name">
|
||||
@ViewingPlayer.Name
|
||||
@if (ViewingPlayer.Type == PlayerType.AI)
|
||||
@@ -475,6 +477,40 @@ else
|
||||
}
|
||||
}
|
||||
|
||||
// Dynamické emócie hráčov na herné udalosti
|
||||
if (e.SourcePlayer != null)
|
||||
{
|
||||
switch (e.Type)
|
||||
{
|
||||
case GameEventType.AceSkipped:
|
||||
SetPlayerEmotion(e.SourcePlayer, PlayerEmotion.Freezing, 3500);
|
||||
break;
|
||||
case GameEventType.AceCountered:
|
||||
case GameEventType.SevenCanceled:
|
||||
SetPlayerEmotion(e.SourcePlayer, PlayerEmotion.Relieved, 3000);
|
||||
break;
|
||||
case GameEventType.CardsBurned:
|
||||
SetPlayerEmotion(e.SourcePlayer, PlayerEmotion.Confident, 3500);
|
||||
break;
|
||||
case GameEventType.PlayerFinished:
|
||||
case GameEventType.MatchWon:
|
||||
SetPlayerEmotion(e.SourcePlayer, PlayerEmotion.Celebrating, 10000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (e.TargetPlayer != null)
|
||||
{
|
||||
switch (e.Type)
|
||||
{
|
||||
case GameEventType.SevenStacked:
|
||||
SetPlayerEmotion(e.TargetPlayer, e.ExtraData >= 6 ? PlayerEmotion.Shocked : PlayerEmotion.Angry, 3500);
|
||||
break;
|
||||
case GameEventType.PlayerRevived:
|
||||
SetPlayerEmotion(e.TargetPlayer, PlayerEmotion.Confident, 3500);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Engine != null && Engine.State.CurrentPlayer.Hand.Count == 1 && !Engine.State.CurrentPlayer.HasFinished)
|
||||
{
|
||||
await Fx.PlayHeartbeatAsync();
|
||||
@@ -746,6 +782,27 @@ else
|
||||
var aiPlayer = Engine.State.CurrentPlayer;
|
||||
if (aiPlayer.Type != PlayerType.AI) return;
|
||||
|
||||
if (aiPlayer.Hand.Count <= 2)
|
||||
{
|
||||
SetPlayerEmotion(aiPlayer, PlayerEmotion.Confident, 3500);
|
||||
}
|
||||
else if (aiPlayer.Hand.Count >= 8)
|
||||
{
|
||||
SetPlayerEmotion(aiPlayer, PlayerEmotion.Desperate, 3500);
|
||||
}
|
||||
else if (Engine.State.PendingSkip)
|
||||
{
|
||||
SetPlayerEmotion(aiPlayer, PlayerEmotion.Freezing, 3500);
|
||||
}
|
||||
else if (Engine.State.PendingDrawCount > 0)
|
||||
{
|
||||
SetPlayerEmotion(aiPlayer, PlayerEmotion.Shocked, 3500);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPlayerEmotion(aiPlayer, PlayerEmotion.Thinking, 3500);
|
||||
}
|
||||
|
||||
if (Engine.State.Rules.AIHumanMode)
|
||||
{
|
||||
string thought = AIDialogueService.GetThinkingDialogue(aiPlayer, Engine.State);
|
||||
@@ -962,6 +1019,25 @@ else
|
||||
});
|
||||
}
|
||||
|
||||
private void SetPlayerEmotion(Player player, PlayerEmotion emotion, int durationMs = 3000)
|
||||
{
|
||||
player.CurrentEmotion = emotion;
|
||||
StateHasChanged();
|
||||
|
||||
if (emotion != PlayerEmotion.Neutral && emotion != PlayerEmotion.Celebrating)
|
||||
{
|
||||
_ = Task.Run(async () =>
|
||||
{
|
||||
await Task.Delay(durationMs);
|
||||
if (player.CurrentEmotion == emotion)
|
||||
{
|
||||
player.CurrentEmotion = PlayerEmotion.Neutral;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerable<(Player Player, string PositionClass)> GetOpponents()
|
||||
{
|
||||
if (Engine == null) return Enumerable.Empty<(Player, string)>();
|
||||
|
||||
Reference in New Issue
Block a user