using OECS; namespace Game.CardWars; /// /// Discards field cards, clears tokens, draws new hands, checks game over. /// public class CleanupSystem : ISystem { public void Run(World world) { var state = world.ReadSingleton(); if (state.Phase != GamePhase.Cleanup) return; ref var mutable = ref world.GetSingleton(); var players = GameUtil.FindAllEntities(world); var publicDeck = GameUtil.FindEntity(world); foreach (var player in players) { GameUtil.DiscardField(world, player, publicDeck); // Clear tokens on banners. var banner = CardEffectHelpers.GetBanner(world, player); if (banner != Entity.Null) { var tokens = world.GetSources(banner).ToList(); foreach (var token in tokens) world.DestroyEntity(token); } } // Draw 2 public cards per player. foreach (var player in players) { for (int i = 0; i < 2; i++) GameUtil.DrawCard(world, publicDeck, player); } // Check game over. int maxScore = 0; foreach (var player in players) { var castles = world.GetSources(player) .Where(c => world.HasComponent(c)) .ToList(); maxScore = Math.Max(maxScore, castles.Count); } if (maxScore >= 4) { mutable.Phase = GamePhase.GameOver; } else { mutable.Phase = GamePhase.PlayPhase; mutable.RoundNumber++; mutable.CurrentPlayerIndex = (mutable.StartingPlayerIndex + 1) % mutable.PlayerCount; mutable.StartingPlayerIndex = mutable.CurrentPlayerIndex; mutable.PlayPhaseEnded = false; } world.MarkModified(World.SingletonEntity); } }