예제 #1
0
 public abstract State Handle(PlayerAction action, IPlayerContext playerContext);
예제 #2
0
        public override State Handle(PlayerAction action, IPlayerContext playerContext)
        {
            // [_, ход пятёркой] -> "конечное состояние без подсказки"

            if (IsPlayFiveRankedAction(action))
            {
                return(new FinalWithoutClueState(this, playerContext.Player));
            }

            // [_, сброс ненужной карты] -> "конечное состояние без подсказки"
            if (IsDiscardNoNeedCard(action))
            {
                // пробуем найти альтернативу.
                var alternativeAction = action.CreateClueToAvoid(BoardContext, playerContext);
                var defaultState      = new FinalWithoutClueState(this, playerContext.Player);

                if (alternativeAction != null)
                {
                    BoardContext.AddToFirework(action.Cards.First());
                    var situation = new OnlyClueExistsSituation(playerContext, alternativeAction.Clue);

                    var optionalState = new OptionalClueState(this, situation);

                    return(new MixedState(optionalState, defaultState));
                }
                else
                {
                    return(defaultState);
                }
            }

            // [A, ход картой] -> A
            if (IsPlayCardAction(action))
            {
                BoardContext.AddToFirework(action.Cards.First());
                return(this);
            }

            // ["никаких подсказок не требуется", сброс некритичной карты] -> "возможна подсказка" или "плюс подсказка"
            if (IsWhateverToPlayCardAction(action))
            {
                var clueAndAction =
                    action.CreateClueToAvoid(BoardContext, playerContext);

                if (clueAndAction != null)
                {
                    // добавить в сброшенные карты карту, которая полетит?
                    return(new OptionalClueState(this, new OnlyClueExistsSituation(playerContext, clueAndAction.Clue)));
                }
                else
                {
                    return(new FinalWithoutClueState(this, playerContext.Player));
                }
            }

            // ["никаких подсказок не требуется", взрыв] -> "требуется подсказка" или безвыходная ситуация
            // ["никаких подсказок не требуется", сброс критичной карты] -> "требуется подсказка" или безвыходная ситуация
            if (action.IsActionToAvoid)
            {
                ClueAndAction clueAndAction = action.CreateClueToAvoid(BoardContext, playerContext);

                if (clueAndAction == null)
                {
                    return(new NoExitState(this));
                }

                // TODO выяснить, что будет делать игрок после этой подсказки
                // Если действие порождает подсказку, то можно уходить в конечной состояние.
                var correctedAction = clueAndAction.Action;

                var solution          = new OnlyClueExistsSituation(playerContext, clueAndAction.Clue);
                var requiredClueState = new RequiredClue(this, solution);
                if ((correctedAction.Outcome & OutcomeFlags.Play) > 0)
                {
                    return(requiredClueState);
                }
                else if ((correctedAction.Outcome &
                          (OutcomeFlags.DiscardNoNeedCard |
                           OutcomeFlags.DiscardWhateverToPlayCard |
                           OutcomeFlags.PlayFiveRankCard)) > 0)
                {
                    return(new FinalWithClueState(requiredClueState));
                }
                throw new InvalidOperationException($"{action.GetType()}");
            }

            throw new InvalidOperationException($"Неизвестный тип {action.GetType()}");
        }
예제 #3
0
 public override State Handle(PlayerAction action, IPlayerContext playerContext)
 {
     return(this);
 }
예제 #4
0
 protected static bool IsPlayCardAction(PlayerAction action)
 {
     return((action.Outcome & OutcomeFlags.Play) > 0);
 }
예제 #5
0
 protected static bool IsWhateverToPlayCardAction(PlayerAction action)
 {
     return((action.Outcome & OutcomeFlags.DiscardWhateverToPlayCard) > 0);
 }
예제 #6
0
 protected static bool IsPlayFiveRankedAction(PlayerAction action)
 {
     return((action.Outcome & OutcomeFlags.PlayFiveRankCard) > 0);
 }
예제 #7
0
 protected static bool IsDiscardNoNeedCard(PlayerAction action)
 {
     return((action.Outcome & OutcomeFlags.DiscardNoNeedCard) > 0);
 }
예제 #8
0
 protected abstract bool IsNewActionCorrect(PlayerAction action);
예제 #9
0
 protected override bool IsNewActionCorrect(PlayerAction action)
 {
     return((action.Outcome & OutcomeFlags.Play) > 0);
 }
예제 #10
0
 protected override bool IsNewActionCorrect(PlayerAction action)
 {
     return(!action.IsActionToAvoid);
 }
예제 #11
0
 protected override bool IsNewActionCorrect(PlayerAction action)
 {
     // игрок собирался взрывать...
     // что угодно, только не взрыв и не сброс нужной карты!
     return(!action.IsActionToAvoid);
 }
예제 #12
0
 protected override bool IsNewActionCorrect(PlayerAction action)
 {
     return(false);
 }