namespace RuleEngine.Core; using RuleEngine; public class GameEvent { public string Type { get; set; } = ""; public string Player { get; set; } = ""; public string? Description { get; set; } public int? Tile { get; set; } } public class MahjongGameState { public string Phase { get; set; } = ""; public Dictionary> Hands { get; set; } = new(); public Dictionary> Exposed { get; set; } = new(); public Dictionary> FlowerPool { get; set; } = new(); public List Deck { get; set; } = new(); public List DiscardPool { get; set; } = new(); public int? LastDiscard { get; set; } public string? LastDiscardPlayer { get; set; } public string CurrentPlayer { get; set; } = ""; public List PlayerOrder { get; set; } = new(); public string Dealer { get; set; } = ""; public int RoundNumber { get; set; } public Dictionary Scores { get; set; } = new(); public List HuPlayers { get; set; } = new(); public List AlivePlayers { get; set; } = new(); public Dictionary FuFlags { get; set; } = new(); public bool IsDeckExhausted { get; set; } public List RecentEvents { get; set; } = new(); public int FlowerReplaced { get; set; } public MahjongGameState Clone() { return new MahjongGameState { Phase = Phase, Hands = Hands.ToDictionary(kv => kv.Key, kv => new List(kv.Value)), Exposed = Exposed.ToDictionary(kv => kv.Key, kv => kv.Value.Select(m => m.Clone()).ToList()), FlowerPool = FlowerPool.ToDictionary(kv => kv.Key, kv => new List(kv.Value)), Deck = new List(Deck), DiscardPool = new List(DiscardPool), LastDiscard = LastDiscard, LastDiscardPlayer = LastDiscardPlayer, CurrentPlayer = CurrentPlayer, PlayerOrder = new List(PlayerOrder), Dealer = Dealer, RoundNumber = RoundNumber, Scores = new Dictionary(Scores), HuPlayers = new List(HuPlayers), AlivePlayers = new List(AlivePlayers), FuFlags = new Dictionary(FuFlags), IsDeckExhausted = IsDeckExhausted, RecentEvents = new List(RecentEvents), FlowerReplaced = FlowerReplaced }; } public void AddEvent(string type, string player, int? tile = null, string? desc = null) { RecentEvents.Add(new GameEvent { Type = type, Player = player, Tile = tile, Description = desc }); } }