VanguardReMaster/server/src/Vanguard.Rules/Diagnostics/GameInvariants.cs

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;
}
}