38 lines
1.2 KiB
C#
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}");
|
|
}
|
|
}
|