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