/// <summary> /// タンヤオ分析要求の受信処理を実行します。 /// </summary> /// <returns>タンヤオ分析応答</returns> /// <param name="request">タンヤオ分析要求</param> public AnalyzeYakuResponse Receive(AnalyzeYakuRequest request) { var response = DiProvider.GetContainer().GetInstance <AnalyzeYakuResponse>(); response.Yaku = Yaku.AllSimples; var context = request.WinHandsContext; // 雀頭 if (!IsAllSimpleRange(context.Head.GetNumber())) { return(response); } // 順子(シュンツ) if (context.Chows.Count() > 0) { var isValidChows = context.Chows .All(t => IsAllSimpleRangeForChows(t.GetNumber())); if (!isValidChows) { return(response); } } // 刻子(コーツ)と槓子(カンツ) if (context.PungsAndKongs.Count() > 0) { var isValidPungs = context.PungsAndKongs .All(t => IsAllSimpleRange(t.GetNumber())); if (!isValidPungs) { return(response); } } response.HasCompleted = true; return(response); }
/// <summary> /// 平和(ピンフ)分析要求の受信処理を実行します。 /// </summary> /// <returns>平和(ピンフ)分析応答</returns> /// <param name="request">平和(ピンフ)分析要求</param> public AnalyzeYakuResponse Receive(AnalyzeYakuRequest request) { var response = DiProvider.GetContainer().GetInstance <AnalyzeYakuResponse>(); var room = request.Room; response.Yaku = Yaku.AllSequenceHand; var context = request.WinHandsContext; // 4面子が順子(連番で揃えた面子) if (!(context.Chows.Count() >= 4 && context.PungsAndKongs.Count() <= 0)) { return(response); } // 頭は役牌(三元牌、場風牌、自風牌)以外 var windKind = context.Head.GetKind(); if (Tile.IsDragons(context.Head) || EqualsWind(windKind, room.Round) || EqualsWind(windKind, request.WinWind)) { return(response); } // 和了牌の待ち方は両面待ち var win = request.WinTile; var isBothSides = context.Chows.Any(chow => chow.GetKind() == win.GetKind() && (chow.GetNumber() + 1) == win.GetNumber()); if (!isBothSides) { return(response); } response.HasCompleted = true; return(response); }
/// <summary> /// 七対子(チートイツ)分析要求の受信処理を実行します。 /// </summary> /// <returns>七対子(チートイツ)分析応答</returns> /// <param name="request">七対子(チートイツ)分析要求</param> public AnalyzeYakuResponse Receive(AnalyzeYakuRequest request) { var response = DiProvider.GetContainer().GetInstance <AnalyzeYakuResponse>(); var room = request.Room; response.Yaku = Yaku.SevenPairs; var context = request.WinHandsContext; // 対子が7つある response.HasCompleted = context.Pairs.Count() == 7; return(response); }
/// <summary> /// 一盃口(イーペイコー)分析要求の受信処理を実行します。 /// </summary> /// <returns>一盃口(イーペイコー)分析応答</returns> /// <param name="request">一盃口(イーペイコー)分析要求</param> public AnalyzeYakuResponse Receive(AnalyzeYakuRequest request) { var response = DiProvider.GetContainer().GetInstance <AnalyzeYakuResponse>(); var room = request.Room; response.Yaku = Yaku.TwoIdenticalSequences; var context = request.WinHandsContext; // 同じ順子(連番で揃えた面子)が2つある var exists = context.Chows .GroupBy(c => new { kind = c.GetKind(), num = c.GetNumber() }) .Select(c => new { Count = c.Count() }) .Any(c => c.Count == 2); response.HasCompleted = exists; return(response); }