using System.Globalization; namespace Godosa.Core.Runs; /// Shared run flags: --deterministic [seed] (fixed step, seeded streams), --digest [every=N] /// (state hash lines), --headless (no window; implies deterministic). null = the game's default. public sealed record RunFlags(bool Deterministic = false, ulong? Seed = null, bool Digest = false, int DigestEvery = 0, bool Headless = false) { public ulong SeedOr(ulong fallback) => Seed ?? fallback; /// Consumes the run flag at (and its optional value, advancing ); /// false when args[i] is no run flag. public static bool TryTake(IReadOnlyList args, ref int i, ref RunFlags flags) { string? next = i + 1 < args.Count ? args[i + 1] : null; switch (args[i]) { case "--deterministic": flags = flags with { Deterministic = true }; if (next != null && ulong.TryParse(next, NumberStyles.None, CultureInfo.InvariantCulture, out var seed)) (flags, i) = (flags with { Seed = seed }, i + 1); return true; case "--digest": flags = flags with { Digest = true }; if (next != null && next.StartsWith("every=", StringComparison.Ordinal)) { if (!int.TryParse(next.AsSpan(6), NumberStyles.None, CultureInfo.InvariantCulture, out var every) || every < 1) throw new ArgumentException($"--digest {next}: every=N needs N ≥ 1"); (flags, i) = (flags with { DigestEvery = every }, i + 1); } return true; case "--headless": flags = flags with { Headless = true, Deterministic = true }; return true; default: return false; } } }