public override TurnState HandleInput(PlayerAction action)
        {
            if (action.Type != ActionType.Path)
            {
                PromptError(Resources.TurnState_GeneralInvalidInput);
                return(this);
            }

            if (ActivePlayer.CanTransfer(roadContainer) && placedRoads < 2 && Board.CanPlaceRoadSomewhere(ActivePlayer))
            {
                ActivePlayer.Transfer(roadContainer, Bank);

                if (!Board.PlaceRoad(Model, action.Index))
                {
                    PromptError(Resources.PlaceRoad_Failed);
                    return(this);
                }

                Presenter.ColorRoad(ActivePlayer, action.Index);

                if (placedRoads == 0)
                {
                    PromptUser(Resources.PlayRoadBuilding_SecondInstruction);
                    placedRoads++;
                    return(this);
                }
                return(ReturnState);
            }

            PromptError(Resources.PlayRoadBuilding_NoRoads);
            return(ReturnState);
        }
Beispiel #2
0
        public override TurnState HandleInput(PlayerAction action)
        {
            if (action.Type != ActionType.Hex || action.Value == Item.Desert)
            {
                PromptError(Resources.TurnState_GeneralInvalidInput);
                return(this);
            }

            var requestedResource = Board.GetHex(action.Index).Resource;

            if (ExchangeTypeSelected && exchangeType != requestedResource)
            {
                var tradeAway = new ItemContainer(new Dictionary <Item, int> {
                    { exchangeType, exchangeRate }
                });
                var tradeGet = new ItemContainer(new Dictionary <Item, int> {
                    { requestedResource, 1 }
                });

                if (!Bank.CanTransfer(tradeGet))
                {
                    PromptError(Resources.PlayYearOfPlenty_OutOfAResource);
                    return(this);
                }

                ActivePlayer.Transfer(tradeAway, Bank);
                Bank.Transfer(tradeGet, ActivePlayer);
                Presenter.DisplayPlayerResources(ActivePlayer);
                ExchangeTypeSelected = false;
                return(State <Trade>());
            }
            else
            {
                var tradeAway = new ItemContainer(new Dictionary <Item, int> {
                    { requestedResource, exchangeRate }
                });
                if (ActivePlayer.CanTransfer(tradeAway))
                {
                    exchangeType         = requestedResource;
                    ExchangeTypeSelected = true;
                    PromptUser(Resources.DoTrade_SelectWant);
                }
                else
                {
                    PromptError(Resources.DoTrade_NotEnough);
                }
            }

            return(this);
        }