using Vanguard.Rules.Cards; using Vanguard.Rules.Engine; namespace Vanguard.Rules.Replay; /// Воспроизводит запись матча и проверяет, что события совпали. public static class ReplayRunner { public static GameEngine Replay(CardCatalog catalog, MatchRecord record) { var engine = new GameEngine(catalog, record.Seed, record.Deck0, record.Deck1); engine.Start(); foreach (var encoded in record.Commands) { var command = CommandCodec.Decode(encoded); var result = engine.Execute(command); if (!result.Accepted) { throw new InvalidOperationException( $"Реплей разошёлся на команде «{encoded}»: {result.Reason}"); } } return engine; } public static void Verify(CardCatalog catalog, MatchRecord record) { var engine = Replay(catalog, record); var actual = EventHasher.Hash(engine.Events); if (!string.Equals(actual, record.EventHash, StringComparison.Ordinal)) throw new InvalidOperationException($"Хэш событий не совпал: {actual} != {record.EventHash}"); } }