Files
FaraonCardGame/Faraon.Core/Engine/ActionValidator.cs
T
2026-08-28 13:59:36 +02:00

116 lines
3.3 KiB
C#

namespace Faraon.Core.Engine;
using Faraon.Core.Models;
public static class ActionValidator
{
public static bool CanPlayCard(
Card card,
Card? topCard,
Suit? activeSuit,
int pendingDrawCount,
bool pendingSkip,
RuleOptions rules)
{
// 1. Ak je na stole trest zo sedmy (napr. +2, +4, +6)
if (pendingDrawCount > 0)
{
// Ak je povolené prebíjanie sediem, musí zahrať sedmu
return rules.StackSevens && card.IsSeven;
}
// 2. Ak je na stole eso (státie)
if (pendingSkip)
{
// Ak je povolené prebíjanie esa esom, musí zahrať eso
return rules.CounterAceWithAce && card.IsAce;
}
// 3. Ak je kôpka prázdna (začiatok hry)
if (topCard == null)
{
return true;
}
// 4. Horník (Menič) sa môže zahrať na čokoľvek (keď nie je aktívny trest/eso)
if (card.IsHornik)
{
return true;
}
// 5. Ak bola zmenená farba Horníkom
if (activeSuit.HasValue)
{
// Musí sedieť zvolená farba (alebo zahrať ďalšieho Horníka, čo rieši bod 4)
return card.Suit == activeSuit.Value;
}
// 6. Bežné pravidlo: rovnaká farba ALEBO rovnaká hodnota
return card.Suit == topCard.Suit || card.Rank == topCard.Rank;
}
public static bool CanPlayCards(
List<Card> cards,
Card? topCard,
Suit? activeSuit,
int pendingDrawCount,
bool pendingSkip,
RuleOptions rules)
{
if (cards == null || cards.Count == 0) return false;
// Všetky karty musia mať rovnakú hodnotu
var firstRank = cards[0].Rank;
if (!cards.All(c => c.Rank == firstRank)) return false;
// 1. Ak je na stole trest zo sedmy
if (pendingDrawCount > 0)
{
return rules.StackSevens && cards.All(c => c.IsSeven);
}
// 2. Ak je na stole eso
if (pendingSkip)
{
return rules.CounterAceWithAce && cards.All(c => c.IsAce);
}
// 3. Ak je kôpka prázdna
if (topCard == null)
{
return true;
}
// 4. Horníci sa dajú vyložiť kedykoľvek
if (firstRank == Rank.OverKnave)
{
return true;
}
// 5. Ak bola zmenená farba Horníkom
if (activeSuit.HasValue)
{
// Aspoň jedna karta musí mať požadovanú farbu (prvá vyložená)
return cards.Any(c => c.Suit == activeSuit.Value);
}
// 6. Bežné pravidlo: aspoň jedna karta musí sedieť farbou na topCard, ALEBO hodnota kariet sedí na topCard
return firstRank == topCard.Rank || cards.Any(c => c.Suit == topCard.Suit);
}
public static bool CanBurnCards(
List<Card> cards,
int pendingDrawCount,
bool pendingSkip,
RuleOptions rules)
{
if (!rules.FourOfAKindBurns) return false;
if (pendingDrawCount > 0 || pendingSkip) return false;
if (cards.Count != 4) return false;
// Všetky 4 karty musia mať rovnakú hodnotu
var firstRank = cards[0].Rank;
return cards.All(c => c.Rank == firstRank);
}
}