using Vanguard.Rules.Engine; namespace Vanguard.Rules.Diagnostics; /// Проверки, которые должны выполняться после любой команды. public static class GameInvariants { public const int DeckSize = 50; public static IReadOnlyList Check(GameState state) { var issues = new List(); var ids = new HashSet(); for (var player = 0; player < 2; player++) { var p = state.Players[player]; var zones = new List> { p.Deck, p.Hand, p.Soul, p.Damage, p.Drop, p.Trigger, p.Guardian, p.Vanguard is null ? Enumerable.Empty() : new[] { p.Vanguard }, p.RearGuards.OfType(), 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; } }