using System.Collections.Immutable; namespace SideScrollerGame.Sim.Runtime; public sealed class SimulationState { public SimulationState(int tick, int seed, ulong randomState, ulong lastRandomValue, ImmutableArray players, ImmutableHashSet activatedTriggerIds) { Tick = tick; Seed = seed; RandomState = randomState; LastRandomValue = lastRandomValue; Players = players.IsDefault ? ImmutableArray.Empty : players; ActivatedTriggerIds = activatedTriggerIds == default ? ImmutableHashSet.Empty : activatedTriggerIds; } public SimulationState Clone() { var builder = ImmutableArray.CreateBuilder(Players.Length); foreach (var player in Players) builder.Add(player.Clone()); return new(Tick, Seed, RandomState, LastRandomValue, builder.MoveToImmutable(), ActivatedTriggerIds); } public PlayerState GetRequiredPlayer(PlayerId playerId) { foreach (var player in Players) { if (player.PlayerId == playerId) return player; } throw new InvalidOperationException($"Unknown player id {playerId.Value}."); } public void AdvanceTick(int tick, ulong randomState, ulong lastRandomValue) { Tick = tick; RandomState = randomState; LastRandomValue = lastRandomValue; } public bool ActivateTrigger(string triggerId) { if (ActivatedTriggerIds.Contains(triggerId)) return false; ActivatedTriggerIds = ActivatedTriggerIds.Add(triggerId); return true; } public int Tick { get; private set; } public int Seed { get; } public ulong RandomState { get; private set; } public ulong LastRandomValue { get; private set; } public ImmutableArray Players { get; } public ImmutableHashSet ActivatedTriggerIds { get; private set; } }