using Vellum;
namespace Amphora.Vellum
{
///
/// Saves a Rand as the four words of its generator's state, so the loaded one draws the same numbers the saved one
/// would have.
///
public sealed class RandConverter : SaveConverter
{
public const string State0Key = "state0";
public const string State1Key = "state1";
public const string State2Key = "state2";
public const string CounterKey = "counter";
public override SaveNode Write(Rand value, SaveSession session)
{
Sfc64 generator = value.Generator;
SaveNode returnMe = SaveNode.NewTable();
returnMe.Entries[State0Key] = session.ToNode(generator.State0);
returnMe.Entries[State1Key] = session.ToNode(generator.State1);
returnMe.Entries[State2Key] = session.ToNode(generator.State2);
returnMe.Entries[CounterKey] = session.ToNode(generator.Counter);
return returnMe;
}
public override Rand Read(SaveNode node, SaveSession session)
{
var reader = new SaveReader(node, session);
ulong state0 = reader.Require(State0Key);
ulong state1 = reader.Require(State1Key);
ulong state2 = reader.Require(State2Key);
ulong counter = reader.Require(CounterKey);
return new Rand(new Sfc64(state0, state1, state2, counter));
}
public override bool TryListChildren(SaveNode node, ChildList children)
{
// Everything it reads is built-in, and so left out.
SaveNode state0;
return node.TryGetEntry(State0Key, out state0);
}
}
}