54 lines
1.7 KiB
C#
54 lines
1.7 KiB
C#
using Vanguard.Rules.Engine;
|
|
|
|
namespace Vanguard.Rules.Diagnostics;
|
|
|
|
/// <summary>Проверки, которые должны выполняться после любой команды.</summary>
|
|
public static class GameInvariants
|
|
{
|
|
public const int DeckSize = 50;
|
|
|
|
public static IReadOnlyList<string> Check(GameState state)
|
|
{
|
|
var issues = new List<string>();
|
|
var ids = new HashSet<int>();
|
|
|
|
for (var player = 0; player < 2; player++)
|
|
{
|
|
var p = state.Players[player];
|
|
var zones = new List<IEnumerable<CardInstance>>
|
|
{
|
|
p.Deck,
|
|
p.Hand,
|
|
p.Soul,
|
|
p.Damage,
|
|
p.Drop,
|
|
p.Trigger,
|
|
p.Guardian,
|
|
p.Vanguard is null ? Enumerable.Empty<CardInstance>() : new[] { p.Vanguard },
|
|
p.RearGuards.OfType<CardInstance>(),
|
|
state.InTransit.Where(t => t.Player == player).Select(t => t.Card),
|
|
};
|
|
|
|
var total = 0;
|
|
foreach (var card in zones.SelectMany(zone => zone))
|
|
{
|
|
if (!ids.Add(card.Id))
|
|
issues.Add($"Игрок {player}: повтор instanceId {card.Id}");
|
|
|
|
total++;
|
|
}
|
|
|
|
if (total != DeckSize)
|
|
issues.Add($"Игрок {player}: {total} карт вместо {DeckSize}");
|
|
|
|
if (p.Damage.Count > GameEngine.MaxDamage)
|
|
issues.Add($"Игрок {player}: урон {p.Damage.Count} больше {GameEngine.MaxDamage}");
|
|
}
|
|
|
|
if (state.IsFinished && state.Winner is null)
|
|
issues.Add("Партия завершена без победителя");
|
|
|
|
return issues;
|
|
}
|
|
}
|