54 lines
1.6 KiB
C#
54 lines
1.6 KiB
C#
using MessagePack;
|
|
using OECS;
|
|
|
|
namespace Game.Blackjack;
|
|
|
|
/// <summary>
|
|
/// Starts a new round after the previous one ended.
|
|
/// </summary>
|
|
[MessagePackObject]
|
|
public struct NewRoundCommand : ICommand
|
|
{
|
|
public void Execute(World world)
|
|
{
|
|
ref var state = ref world.GetSingleton<GameState>();
|
|
|
|
if (state.Phase != GamePhase.RoundOver)
|
|
return;
|
|
|
|
// Clear hands from previous round.
|
|
var singletonEntity = World.SingletonEntity;
|
|
var handEntities = new List<Entity>();
|
|
using (var iter = world.Select<PlayerHand>())
|
|
{
|
|
while (iter.MoveNext())
|
|
{
|
|
if (iter.CurrentEntity != singletonEntity)
|
|
handEntities.Add(iter.CurrentEntity);
|
|
}
|
|
}
|
|
using (var iter = world.Select<DealerHand>())
|
|
{
|
|
while (iter.MoveNext())
|
|
{
|
|
if (iter.CurrentEntity != singletonEntity)
|
|
handEntities.Add(iter.CurrentEntity);
|
|
}
|
|
}
|
|
foreach (var hand in handEntities)
|
|
{
|
|
var cards = world.GetSources<Holds>(hand);
|
|
var deckEntity = HitCommand.FindEntity<Deck>(world, singletonEntity);
|
|
foreach (var card in cards)
|
|
{
|
|
world.RemoveComponent<Holds>(card);
|
|
world.AddComponent(card, new InDeck { Source = card, Target = deckEntity });
|
|
}
|
|
}
|
|
|
|
state.RoundNumber++;
|
|
state.Phase = GamePhase.Betting;
|
|
state.Result = RoundResult.None;
|
|
world.MarkModified<GameState>(World.SingletonEntity);
|
|
}
|
|
} |