private void ProcessAnte(Ante ante, HandHistory handHistory)
        {
            var anteAmount = (decimal)ante.Amount / handHistory.Players.Count;

            handHistory.GameDescription.Limit.Ante        = anteAmount;
            handHistory.GameDescription.Limit.IsAnteTable = true;

            var sbAction = handHistory.HandActions.FirstOrDefault(x => x.HandActionType == HandActionType.SMALL_BLIND);

            IEnumerable <Player> players;

            if (sbAction != null)
            {
                players = handHistory.Players
                          .SkipWhile(x => x.PlayerName != sbAction.PlayerName)
                          .Concat(handHistory.Players.TakeWhile(x => x.PlayerName != sbAction.PlayerName))
                          .Reverse();
            }
            else
            {
                players = handHistory.Players.Reverse();
            }

            foreach (var player in players)
            {
                var anteAction = new HandAction(player.PlayerName,
                                                HandActionType.ANTE,
                                                anteAmount,
                                                Street.Preflop);

                handHistory.HandActions.Insert(0, anteAction);
            }
        }
Beispiel #2
0
        public ActiveGame()
        {
            ActivePlayerIndex = 0;
            Ante              = new Ante();
            Exile             = new Exile();
            Stack             = new Stack();
            ActivePhase       = GamePhases.None;
            OverrideNextPhase = GamePhases.None;

            _PendingActions     = new List <IPendingAction>();
            _Players            = new List <Player>();
            _SkipPhases         = new List <GamePhases>();
            _Modifiers          = new List <GameModifier>();
            _ActiveEffects      = new List <Effect>();
            _Attackers          = new List <AttackingCreature>();
            _UpkeepRequirements = new List <UpkeepRequirement>();
        }
Beispiel #3
0
        private void OnAddCardToZone(object sender, EventArgs e)
        {
            AddCardToZoneEventArgs args = (AddCardToZoneEventArgs)e;

            switch (args.TargetZone)
            {
            case TargetZone.Ante:
                Ante.Add(args.Card);
                break;

            case TargetZone.Battlefield:
                args.ZoneOwner.Battlefield.Add(args.Card);
                break;

            case TargetZone.Command:
                args.ZoneOwner.Command.Add(args.Card);
                break;

            case TargetZone.Exile:
                Exile.Add(args.Card);
                break;

            case TargetZone.Graveyard:
                args.ZoneOwner.Graveyard.Add(args.Card);
                break;

            case TargetZone.Hand:
                args.ZoneOwner.Hand.Add(args.Card);
                break;

            case TargetZone.Library:
                args.ZoneOwner.Library.Add(args.Card);
                break;

            case TargetZone.Stack:
                Stack.Add(args.Card);
                break;
            }
        }
        private HandHistory BuildHand(List <Adda52JsonPackage> packages)
        {
            HandHistory handHistory = null;

            try
            {
                if (!Validate(packages))
                {
                    packages.Clear();
                    return(handHistory);
                }

                var isGameStarted = false;

                Ante ante = null;

                foreach (var package in packages)
                {
                    if (package.PackageType == Adda52PackageType.GameStart)
                    {
                        handHistory = new HandHistory
                        {
                            DateOfHandUtc = package.TimestampUtc
                        };

                        ParsePackage <GameStart>(package, x => ProcessGameStart(x, handHistory));

                        isGameStarted = true;
                        continue;
                    }

                    if (!isGameStarted)
                    {
                        continue;
                    }

                    switch (package.PackageType)
                    {
                    case Adda52PackageType.Ante:
                        ParsePackage <Ante>(package, x => ante = x);
                        break;

                    case Adda52PackageType.Blinds:
                        ParsePackage <Blinds>(package, x => ProcessBlinds(package.RoomId, x, handHistory));
                        break;

                    case Adda52PackageType.CommunityCard:
                        ParsePackage <CommunityCardInfo>(package, x => ProcessCommunityCards(x, handHistory));
                        break;

                    case Adda52PackageType.Dealer:
                        ParsePackage <Dealer>(package, x => ProcessDealer(x, handHistory));
                        break;

                    case Adda52PackageType.UserAction:
                        ParsePackage <UserAction>(package, x => ProcessUserAction(x, handHistory));
                        break;

                    case Adda52PackageType.UncalledBet:
                        ParsePackage <UncalledBet>(package, x => ProcessUncalledBet(x, handHistory));
                        break;

                    case Adda52PackageType.SeatInfo:
                        ParsePackage <RoomSeatInfo>(package, x =>
                        {
                            ProcessSeatInfo(x, handHistory);

                            if (ante != null)
                            {
                                ProcessAnte(ante, handHistory);
                                ante = null;
                            }
                        });
                        break;

                    case Adda52PackageType.Winner:
                        ParsePackage <Winner>(package, x => ProcessWinner(x, handHistory));
                        break;

                    case Adda52PackageType.HoleCard:
                        ParsePackage <HoleCard>(package, x => ProcessHoleCard(x, handHistory));
                        break;
                    }
                }

                AdjustHandHistory(handHistory);

                return(handHistory);
            }
            catch (Exception e)
            {
                LogProvider.Log.Error(this, $"Failed to build hand #{handHistory?.HandId ?? 0} room #{handHistory?.GameDescription.Identifier ?? 0}. [{loggerName}]", e);
                return(null);
            }
            finally
            {
                packages.Clear();
            }
        }