using OECS; namespace Game.Blackjack; /// /// Dealer draws cards until reaching 17 or higher, /// then resolves the round result. /// public class DealerSystem : ISystem { public void RunImpl(World world) { var state = world.ReadSingleton(); if (state.Phase != GamePhase.DealerTurn) return; ref var mutableState = ref world.GetSingleton(); // Dealer must hit on 16 and below, stand on 17+. int dealerTotal = HandUtil.CalculateHand(world, DealerHandTag.Instance); int safety = 0; while (dealerTotal < 17 && safety < 52) { HitCommand.DrawCard(world); dealerTotal = HandUtil.CalculateHand(world, DealerHandTag.Instance); safety++; } int playerTotal = HandUtil.CalculateHand(world, PlayerHandTag.Instance); mutableState.Phase = GamePhase.RoundOver; if (dealerTotal > 21) { mutableState.Result = RoundResult.DealerBust; mutableState.Chips += mutableState.CurrentBet * 2; } else if (playerTotal > dealerTotal) { mutableState.Result = RoundResult.PlayerWin; mutableState.Chips += mutableState.CurrentBet * 2; } else if (dealerTotal > playerTotal) { mutableState.Result = RoundResult.DealerWin; } else { // Push: return the bet. mutableState.Result = RoundResult.Push; mutableState.Chips += mutableState.CurrentBet; } } }