improvements

This commit is contained in:
Michal Vrba
2026-09-03 17:54:36 +02:00
parent 00aa94ea7c
commit 035da18584
14 changed files with 1006 additions and 52 deletions
+68 -3
View File
@@ -31,6 +31,9 @@ public class GameEngine
State.RoundLoser = null;
State.RoundNumber = 1;
State.LastFinishedPlayer = null;
State.ReviveTurnsRemaining = 0;
State.ReviveRoundsRemaining = 0;
State.ReviveWindowInitialTurns = 0;
State.TurnCount = 1;
State.PendingDrawCount = 0;
State.PendingSkip = false;
@@ -205,11 +208,13 @@ public class GameEngine
State.PendingDrawCount += addedPenalty;
var redSeven = cards.FirstOrDefault(c => c.IsRedSeven);
if (redSeven != null && State.Rules.RedSevenRevives && State.LastFinishedPlayer != null && State.LastFinishedPlayer != player)
if (redSeven != null && State.Rules.RedSevenRevives && State.LastFinishedPlayer != null && State.LastFinishedPlayer != player && State.ReviveTurnsRemaining > 0)
{
var revived = State.LastFinishedPlayer;
revived.FinishedPosition = null;
State.LastFinishedPlayer = null;
State.ReviveTurnsRemaining = 0;
State.ReviveRoundsRemaining = 0;
DrawCardsForPlayer(revived, 3);
EmitEvent(new GameEvent(
@@ -257,6 +262,20 @@ public class GameEngine
));
}
}
// Efekt Zeleného dolníka (rušenie sediem)
else if (firstRank == Rank.UnderKnave && cards.Any(c => c.IsGreenUnderKnave) && State.Rules.GreenUnderKnaveCancelsSevens && State.PendingDrawCount > 0)
{
int canceled = State.PendingDrawCount;
State.PendingDrawCount = 0;
EmitEvent(new GameEvent(
GameEventType.SevenCanceled,
player,
Cards: cards,
ExtraData: canceled,
Message: $"🍃 {player.Name} zahral Zeleného dolníka a ZRUŠIL trest {canceled} kariet!"
));
}
// Ostatné karty
else
{
@@ -328,11 +347,13 @@ public class GameEngine
State.PendingDrawCount += 3;
// Červená sedma vracia do hry
if (card.IsRedSeven && State.Rules.RedSevenRevives && State.LastFinishedPlayer != null && State.LastFinishedPlayer != player)
if (card.IsRedSeven && State.Rules.RedSevenRevives && State.LastFinishedPlayer != null && State.LastFinishedPlayer != player && State.ReviveTurnsRemaining > 0)
{
var revived = State.LastFinishedPlayer;
revived.FinishedPosition = null;
State.LastFinishedPlayer = null;
State.ReviveTurnsRemaining = 0;
State.ReviveRoundsRemaining = 0;
// Doberie 3 karty
DrawCardsForPlayer(revived, 3);
@@ -382,6 +403,21 @@ public class GameEngine
State.PendingSkip = true;
}
// Efekt Zeleného dolníka (rušenie sediem)
if (card.IsGreenUnderKnave && State.Rules.GreenUnderKnaveCancelsSevens && State.PendingDrawCount > 0)
{
int canceled = State.PendingDrawCount;
State.PendingDrawCount = 0;
EmitEvent(new GameEvent(
GameEventType.SevenCanceled,
player,
Card: card,
ExtraData: canceled,
Message: $"🍃 {player.Name} zahral Zeleného dolníka a ZRUŠIL trest {canceled} kariet!"
));
}
// Kontrola, či hráč vyhral / skončil
CheckPlayerFinish(player);
@@ -538,7 +574,22 @@ public class GameEngine
{
int nextPos = State.Players.Count(p => p.HasFinished) + 1;
player.FinishedPosition = nextPos;
State.LastFinishedPlayer = player;
if (State.Rules.RedSevenRevives)
{
State.LastFinishedPlayer = player;
int maxRounds = State.Rules.RedSevenMode == RedSevenMode.ColorOrSevenThreeRounds ? 3 : 1;
int activeCount = Math.Max(1, State.ActivePlayersCount);
State.ReviveRoundsRemaining = maxRounds;
State.ReviveTurnsRemaining = maxRounds * activeCount;
State.ReviveWindowInitialTurns = State.ReviveTurnsRemaining;
}
else
{
State.LastFinishedPlayer = null;
State.ReviveRoundsRemaining = 0;
State.ReviveTurnsRemaining = 0;
}
EmitEvent(new GameEvent(
GameEventType.PlayerFinished,
@@ -682,6 +733,20 @@ public class GameEngine
{
if (State.IsGameOver || State.IsRoundOver) return;
// Odpočet lehoty na oživenie
if (State.LastFinishedPlayer != null && State.ReviveTurnsRemaining > 0)
{
State.ReviveTurnsRemaining--;
int activeCount = Math.Max(1, State.ActivePlayersCount);
State.ReviveRoundsRemaining = (int)Math.Ceiling((double)State.ReviveTurnsRemaining / activeCount);
if (State.ReviveTurnsRemaining <= 0)
{
State.LastFinishedPlayer = null;
State.ReviveRoundsRemaining = 0;
}
}
int attempts = 0;
do
{