Beispiel #1
0
 private void PlayerPrompt(IHanabiPlayer player, RequestPromptCard prompt)
 {
     player.Room.Prompt(player, prompt);
 }
Beispiel #2
0
        public void DispatchRequest(IPlayer player, string message)
        {
            IHanabiPlayer hanabiPlayer = player as IHanabiPlayer;

            if (hanabiPlayer == null)
            {
                return;
            }

            Command    command = JsonConvert.DeserializeObject <Command>(message);
            ActionType action  = ( ActionType )Enum.Parse(typeof(ActionType), command.Action, false);

            switch (action)
            {
            case ActionType.EnterGame:
            {
                RequestEnterGame request = JsonConvert.DeserializeObject <RequestEnterGame>(command.Payload);
                PlayerEnterGame(hanabiPlayer, request);
                break;
            }

            case ActionType.ExitGame:
            {
                RequestExitGame request = JsonConvert.DeserializeObject <RequestExitGame>(command.Payload);
                PlayerExitGame(hanabiPlayer, request);
                break;
            }

            case ActionType.GetRoomList:
            {
                PlayerGetRoomList(hanabiPlayer);
                break;
            }

            case ActionType.JoinRoom:
            {
                RequestJoinRoom request = JsonConvert.DeserializeObject <RequestJoinRoom>(command.Payload);
                PlayerJoinRoom(hanabiPlayer, request);
                break;
            }

            case ActionType.QuitRoom:
            {
                RequestQuitRoom request = JsonConvert.DeserializeObject <RequestQuitRoom>(command.Payload);
                PlayerQuitRoom(hanabiPlayer, request);
                break;
            }

            case ActionType.Message:
            {
                // TODO:
                break;
            }

            case ActionType.Ready:
            {
                PlayerReady(hanabiPlayer);
                break;
            }

            case ActionType.PromptCard:
            {
                RequestPromptCard request = JsonConvert.DeserializeObject <RequestPromptCard>(command.Payload);
                PlayerPrompt(hanabiPlayer, request);
                break;
            }

            case ActionType.PlayCard:
            {
                RequestPlayCard request = JsonConvert.DeserializeObject <RequestPlayCard>(command.Payload);
                PlayerPlayCard(hanabiPlayer, request);
                break;
            }

            case ActionType.DiscardCard:
            {
                RequestDiscardCard request = JsonConvert.DeserializeObject <RequestDiscardCard>(command.Payload);
                PlayerDiscardCard(hanabiPlayer, request);
                break;
            }

            default:
                break;
            }
        }
Beispiel #3
0
        /// <summary>
        /// 提示玩家卡牌資訊
        /// </summary>
        /// <param name="player">行動的玩家</param>
        /// <param name="prompt">提示資訊</param>
        public void Prompt(IHanabiPlayer player, RequestPromptCard prompt)
        {
            if (!IsCurrentPlayer(player))
            {
                ResponsePromptCard invalidResponse = new ResponsePromptCard();
                invalidResponse.Result            = PromptCardResult.InvalidTurn;
                invalidResponse.PromptInformation = prompt.PromptInformation;
                SendCommandToPlayer(player, ActionType.PromptCard, invalidResponse);
                return;
            }

            IHanabiPlayer targetPlayer = this.GetPlayer(prompt.Nickname);

            if (targetPlayer == null)
            {
                ResponsePromptCard invalidResponse = new ResponsePromptCard();
                invalidResponse.Result            = PromptCardResult.InvalidPlayer;
                invalidResponse.PromptInformation = prompt.PromptInformation;
                SendCommandToPlayer(player, ActionType.PromptCard, invalidResponse);
                return;
            }

            PromptCardResult result = PromptCardResult.InvalidPrompt;

            switch (prompt.PromptInformation)
            {
            case ( int )CardValueType.Value1:
            case ( int )CardValueType.Value2:
            case ( int )CardValueType.Value3:
            case ( int )CardValueType.Value4:
            case ( int )CardValueType.Value5:
                result = Rule.PromptCard(( CardValueType )prompt.PromptInformation, targetPlayer, Board);
                break;

            case ( int )CardColorType.Blue:
            case ( int )CardColorType.Green:
            case ( int )CardColorType.Yellow:
            case ( int )CardColorType.Red:
            case ( int )CardColorType.White:
                result = Rule.PromptCard(( CardColorType )prompt.PromptInformation, targetPlayer, Board);
                break;
            }

            if (result != PromptCardResult.Success)
            {
                ResponsePromptCard invalidResponse = new ResponsePromptCard();
                invalidResponse.Result            = result;
                invalidResponse.PromptInformation = prompt.PromptInformation;
                SendCommandToPlayer(player, ActionType.PromptCard, invalidResponse);
                return;
            }

            // 通知被提示玩家的命令
            ResponsePromptCard notify = new ResponsePromptCard();

            notify.Result            = result;
            notify.Nickname          = prompt.Nickname;
            notify.PromptInformation = prompt.PromptInformation;
            notify.Token             = Board.Tokens.Info;

            // 通知其他玩家的命令
            ResponsePromptCard response = new ResponsePromptCard();

            response.Result            = result;
            response.Nickname          = prompt.Nickname;
            response.PromptInformation = prompt.PromptInformation;
            response.Token             = Board.Tokens.Info;
            foreach (var handCard in targetPlayer.Cards)
            {
                CardInfo responseInfo = handCard.Info;
                response.Cards.Add(responseInfo);

                CardInfo notifyInfo = handCard.Info;
                notifyInfo.Color = ( int )CardColorType.Unknown;
                notifyInfo.Value = ( int )CardValueType.Unknown;
                notify.Cards.Add(notifyInfo);
            }

            foreach (var notifyPlayer in Players)
            {
                if (notifyPlayer == targetPlayer)
                {
                    SendCommandToPlayer(notifyPlayer, ActionType.PromptCard, notify);
                }
                else
                {
                    SendCommandToPlayer(notifyPlayer, ActionType.PromptCard, response);
                }
            }

            NextActivePlayer();
            NotifyNextPlayer();
        }