using MessagePack; using OECS; namespace Game.Blackjack; /// /// Player hits: draws one card from the deck to the player's hand. /// [MessagePackObject] public struct HitCommand : ICommand { public void Execute(World world) { var state = world.ReadSingleton(); if (state.Phase != GamePhase.PlayerTurn) return; DrawCard(world); } /// /// Draws the top card from the deck and adds it to the given hand. /// internal static void DrawCard(World world) where THand : struct { var deckEntity = world.FindEntity(); var handEntity = world.FindEntity(); if (deckEntity == Entity.Null || handEntity == Entity.Null) return; // Find a card still in the deck. var cardsInDeck = world.GetSources(deckEntity); if (cardsInDeck.Count == 0) return; var cardEntity = cardsInDeck.First(); // Remove from deck, add to hand. world.RemoveComponent(cardEntity); world.AddComponent(cardEntity, new Holds { Target = handEntity }); // Flush so subsequent DrawCard calls see the updated state. world.FlushPendingMutations(); } internal static Entity FindEntity(World world) where T : struct { return world.FindEntity(); } }