64 lines
1.9 KiB
C#
64 lines
1.9 KiB
C#
using System.Collections.Immutable;
|
|
|
|
namespace SideScrollerGame.Sim.Runtime;
|
|
|
|
public sealed class SimulationState
|
|
{
|
|
public SimulationState(int tick, int seed, ulong randomState, ulong lastRandomValue, ImmutableArray<PlayerState> players, ImmutableHashSet<string> activatedTriggerIds)
|
|
{
|
|
Tick = tick;
|
|
Seed = seed;
|
|
RandomState = randomState;
|
|
LastRandomValue = lastRandomValue;
|
|
Players = players.IsDefault ? ImmutableArray<PlayerState>.Empty : players;
|
|
ActivatedTriggerIds = activatedTriggerIds == default ? ImmutableHashSet<string>.Empty : activatedTriggerIds;
|
|
}
|
|
|
|
public SimulationState Clone()
|
|
{
|
|
var builder = ImmutableArray.CreateBuilder<PlayerState>(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<PlayerState> Players { get; }
|
|
|
|
public ImmutableHashSet<string> ActivatedTriggerIds { get; private set; }
|
|
} |