improvements
This commit is contained in:
@@ -12,9 +12,15 @@ public static class ActionValidator
|
||||
bool pendingSkip,
|
||||
RuleOptions rules)
|
||||
{
|
||||
// 1. Ak je na stole trest zo sedmy (napr. +2, +4, +6)
|
||||
// 1. Ak je na stole trest zo sedmy (napr. +3, +6, +9)
|
||||
if (pendingDrawCount > 0)
|
||||
{
|
||||
// Zelený dolník ruší sedmičky
|
||||
if (rules.GreenUnderKnaveCancelsSevens && card.IsGreenUnderKnave)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Ak je povolené prebíjanie sediem, musí zahrať sedmu
|
||||
return rules.StackSevens && card.IsSeven;
|
||||
}
|
||||
@@ -38,6 +44,21 @@ public static class ActionValidator
|
||||
return true;
|
||||
}
|
||||
|
||||
// 4b. Červená sedma v režime AnyCardOneRound sa môže zahrať na ľubovoľnú kartu
|
||||
if (card.IsRedSeven && rules.RedSevenMode == RedSevenMode.AnyCardOneRound)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// 4c. Zelený dolník v režime UniversalWildcard ide na čokoľvek a naňho ide čokoľvek
|
||||
if (rules.GreenUnderKnaveMode == GreenUnderKnaveMode.UniversalWildcard)
|
||||
{
|
||||
if (card.IsGreenUnderKnave || topCard.IsGreenUnderKnave)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// 5. Ak bola zmenená farba Horníkom
|
||||
if (activeSuit.HasValue)
|
||||
{
|
||||
@@ -66,6 +87,10 @@ public static class ActionValidator
|
||||
// 1. Ak je na stole trest zo sedmy
|
||||
if (pendingDrawCount > 0)
|
||||
{
|
||||
if (rules.GreenUnderKnaveCancelsSevens && cards.Any(c => c.IsGreenUnderKnave))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return rules.StackSevens && cards.All(c => c.IsSeven);
|
||||
}
|
||||
|
||||
@@ -87,6 +112,21 @@ public static class ActionValidator
|
||||
return true;
|
||||
}
|
||||
|
||||
// 4b. Combo so Srdcovou/Červenou sedmou v režime AnyCardOneRound sa dá vyložiť na čokoľvek
|
||||
if (firstRank == Rank.Seven && cards.Any(c => c.IsRedSeven) && rules.RedSevenMode == RedSevenMode.AnyCardOneRound)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// 4c. Zelený dolník v režime UniversalWildcard
|
||||
if (rules.GreenUnderKnaveMode == GreenUnderKnaveMode.UniversalWildcard)
|
||||
{
|
||||
if (cards.Any(c => c.IsGreenUnderKnave) || topCard.IsGreenUnderKnave)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// 5. Ak bola zmenená farba Horníkom
|
||||
if (activeSuit.HasValue)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user