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();
}
}