2026-07-18 23:26:56 +08:00
|
|
|
using MessagePack;
|
|
|
|
|
using OECS;
|
|
|
|
|
|
2026-07-20 16:41:10 +08:00
|
|
|
namespace Game.Blackjack;
|
2026-07-18 23:26:56 +08:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Player hits: draws one card from the deck to the player's hand.
|
|
|
|
|
/// </summary>
|
|
|
|
|
[MessagePackObject]
|
|
|
|
|
public struct HitCommand : ICommand
|
|
|
|
|
{
|
|
|
|
|
public void Execute(World world)
|
|
|
|
|
{
|
2026-07-21 13:57:11 +08:00
|
|
|
var state = world.ReadSingleton<GameState>();
|
2026-07-18 23:26:56 +08:00
|
|
|
|
|
|
|
|
if (state.Phase != GamePhase.PlayerTurn)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
DrawCard<PlayerHand>(world);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Draws the top card from the deck and adds it to the given hand.
|
|
|
|
|
/// </summary>
|
|
|
|
|
internal static void DrawCard<THand>(World world)
|
|
|
|
|
where THand : struct
|
|
|
|
|
{
|
2026-07-21 13:57:11 +08:00
|
|
|
var deckEntity = world.FindEntity<Deck>();
|
|
|
|
|
var handEntity = world.FindEntity<THand>();
|
2026-07-18 23:26:56 +08:00
|
|
|
|
|
|
|
|
if (deckEntity == Entity.Null || handEntity == Entity.Null)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Find a card still in the deck.
|
|
|
|
|
var cardsInDeck = world.GetSources<InDeck>(deckEntity);
|
|
|
|
|
if (cardsInDeck.Count == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
var cardEntity = cardsInDeck.First();
|
|
|
|
|
|
|
|
|
|
// Remove from deck, add to hand.
|
|
|
|
|
world.RemoveComponent<InDeck>(cardEntity);
|
2026-07-20 22:59:27 +08:00
|
|
|
world.AddComponent(cardEntity, new Holds { Target = handEntity });
|
2026-07-21 13:57:11 +08:00
|
|
|
|
|
|
|
|
// Flush so subsequent DrawCard calls see the updated state.
|
|
|
|
|
world.FlushPendingMutations();
|
2026-07-18 23:26:56 +08:00
|
|
|
}
|
|
|
|
|
|
2026-07-21 13:57:11 +08:00
|
|
|
internal static Entity FindEntity<T>(World world)
|
2026-07-18 23:26:56 +08:00
|
|
|
where T : struct
|
|
|
|
|
{
|
2026-07-21 13:57:11 +08:00
|
|
|
return world.FindEntity<T>();
|
2026-07-18 23:26:56 +08:00
|
|
|
}
|
2026-07-21 13:57:11 +08:00
|
|
|
}
|