/// <summary> /// ターンのプレイヤーからカードを受け取り時の処理 /// </summary> /// <param name="playerId"></param> /// <param name="cards"></param> /// <returns></returns> private ResultOfPlaying ReceivedPlayingCards(int playerId, List <Card> cards) { ResultOfPlaying result = ResultOfPlaying.Accepted; do { if (playerId != Turn) { // logger( LogLevel.Error, "Not player turn. Player(" + playerId + ")"); result = ResultOfPlaying.NotAccepted; // フェーズを進めずリターン return(result); } var playerHand = players[playerId].hand; var field = fieldStack.FirstOrDefault(); if (DaifugoFunction.ArePlayedCardsValid(cards, playerHand, field)) { // フィールドスタックにカードを追加して fieldStack.Push(cards); // パスフラグをリセット players.ForEach(p => p.hasPassed = false); result = ResultOfPlaying.Accepted; } else { players[playerId].hasPassed = true; if (players.All(p => p.hasPassed || p.hand.Count == 0)) { // 全員パスなら、場を流してパスフラグをリセット while (fieldStack.Count > 0) { flowedCards.AddRange(fieldStack.Pop()); } players.ForEach(p => p.hasPassed = false); } result = ResultOfPlaying.NotAccepted; } } while (false); phase = Phase.AfterPlaying; return(result); }
/// <summary> /// カード受理結果を通知 /// </summary> /// <param name="connectionId"></param> /// <param name="result"></param> /// <returns></returns> public Task SendResultOfPlayingAsync(string connectionId, ResultOfPlaying result) { var task = new Task(() => { if (string.IsNullOrEmpty(connectionId)) { return; } SingleProcessMessageTransceiver client; if (_connectedClientTable.TryGetValue(connectionId, out client)) { client.ReceivedResultOfPlaying?.Invoke(this, new ReceivedResultOfPlayingArgs(result)); } }); task.RunSynchronously(); return(task); }
public void SendResultOfPlayingAsync_SendResult_ClientReceivedResult(IServerMessageTransceiver server, IClientMessageTransceiver client) { string connectionId = null; server.ReceivedJoinRequest += (_, args) => { connectionId = args.ConnectionId; }; ResultOfPlaying result = ResultOfPlaying.NotAccepted; client.ReceivedResultOfPlaying += (_, args) => { result = args.Result; }; client.SendJoinRequestAsync().Wait(); server.SendResultOfPlayingAsync(connectionId, ResultOfPlaying.Accepted).Wait(); Assert.Equal(ResultOfPlaying.Accepted, result); }
public ReceivedResultOfPlayingArgs(ResultOfPlaying result) { Result = result; }