VanguardReMaster/server/src/Vanguard.Rules/Replay/ReplayRunner.cs

38 lines
1.2 KiB
C#

using Vanguard.Rules.Cards;
using Vanguard.Rules.Engine;
namespace Vanguard.Rules.Replay;
/// <summary>Воспроизводит запись матча и проверяет, что события совпали.</summary>
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}");
}
}