public static YakuResult CalcNormalYaku(HoraPattern horaMentsu, InfoForResult ifr, Field field,int[] horaSyu, int[] realPaiNum, int redDoraNum) { YakuResult result = new YakuResult(); result.Fu = CalcFu(horaMentsu, field, ifr); result.IsTsumo = ifr.IsTsumo; result.IsOya = ifr.IsOya; //役の文字列取得 var yakuString = MJUtil.YAKU_STRING; //飜数の辞書選択 var yakuHanNum = ifr.IsMenzen ? MJUtil.YAKU_HAN_MENZEN : MJUtil.YAKU_HAN_FUROED; if (ifr.IsDoubleReach) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.DOUBLEREACH], yakuHanNum[(int)MJUtil.Yaku.DOUBLEREACH] }); } else if (ifr.IsReach) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.REACH], yakuHanNum[(int)MJUtil.Yaku.REACH] }); } if (ifr.IsTsumo && ifr.IsMenzen) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.TSUMO], yakuHanNum[(int)MJUtil.Yaku.TSUMO] }); } if (ifr.IsIppatsu) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.IPPATSU], yakuHanNum[(int)MJUtil.Yaku.IPPATSU] }); } if (IsPinfu(horaMentsu, ifr)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.PINFU], yakuHanNum[(int)MJUtil.Yaku.PINFU] }); result.Fu = ifr.IsTsumo ? 20 : 30;//ピンフツモは20符、ピンフロンは30符 } if (IsTannyao(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.TANNYAO], yakuHanNum[(int)MJUtil.Yaku.TANNYAO] }); } //一盃口と二盃口は両立しない if (IsRyanpeiko(horaMentsu, ifr)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.RYANPEIKO], yakuHanNum[(int)MJUtil.Yaku.RYANPEIKO] }); } else if (IsIipeiko(horaMentsu, ifr)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.IIPEIKOU], yakuHanNum[(int)MJUtil.Yaku.IIPEIKOU] }); } if (IsYakuhai(horaMentsu, ifr)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.YAKUHAI], CalcYakuhaiNum(horaMentsu, ifr)}); } if (ifr.IsHoutei) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.HOUTEI], yakuHanNum[(int)MJUtil.Yaku.HOUTEI] }); } if (ifr.IsHaitei) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.HAITEI], yakuHanNum[(int)MJUtil.Yaku.HAITEI] }); } if (ifr.IsRinshan) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.RINSHAN], yakuHanNum[(int)MJUtil.Yaku.RINSHAN] }); } if (ifr.IsChankan) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.CHANKAN], yakuHanNum[(int)MJUtil.Yaku.CHANKAN] }); } if (ifr.CalcDoraNum(realPaiNum) > 0) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.DORA], ifr.CalcDoraNum(realPaiNum) }); } if (redDoraNum > 0) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.REDDORA], redDoraNum }); } if (IsSansyokuDoujun(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.SANSYOKUDOJUN], yakuHanNum[(int)MJUtil.Yaku.SANSYOKUDOJUN] }); } if (IsIttsuu(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.ITTSUU], yakuHanNum[(int)MJUtil.Yaku.ITTSUU] }); } if (IsSananko(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.SANANKO], yakuHanNum[(int)MJUtil.Yaku.SANANKO] }); } if (IsToitoi(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.TOITOI], yakuHanNum[(int)MJUtil.Yaku.TOITOI] }); } if (IsShosangen(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.SHOSANGEN], yakuHanNum[(int)MJUtil.Yaku.SHOSANGEN] }); } //混老頭とチャンタ系は同時に成立しない if (IsHonroto(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.HONROTO], yakuHanNum[(int)MJUtil.Yaku.HONROTO] }); } else { //純チャンタと混チャンタは同時に成立しない if (IsJunChanta(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.JUNCHANTA], yakuHanNum[(int)MJUtil.Yaku.JUNCHANTA] }); } else if (IsChanta(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.CHANTA], yakuHanNum[(int)MJUtil.Yaku.CHANTA] }); } } if (IsSansyokuDoko(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.SANSYOKUDOKO], yakuHanNum[(int)MJUtil.Yaku.SANSYOKUDOKO] }); } if (IsSankantsu(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.SANKANTSU], yakuHanNum[(int)MJUtil.Yaku.SANKANTSU] }); } //混一色と清一色は同時に成立しない if (IsHonnitsu(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.HONNITSU], yakuHanNum[(int)MJUtil.Yaku.HONNITSU] }); } else if (IsChinnitsu(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.CHINNITSU], yakuHanNum[(int)MJUtil.Yaku.CHINNITSU] }); } //ここから役満 if(IsSuuanko(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.SUUANKO], yakuHanNum[(int)MJUtil.Yaku.SUUANKO] }); } if (IsDaisangen(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.DAISANGEN], yakuHanNum[(int)MJUtil.Yaku.DAISANGEN] }); } if (IsShosushi(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.SHOSUSHI], yakuHanNum[(int)MJUtil.Yaku.SHOSUSHI] }); } if (IsDaisushi(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.DAISUSHI], yakuHanNum[(int)MJUtil.Yaku.DAISUSHI] }); } if (IsTsuiso(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.TSUISO], yakuHanNum[(int)MJUtil.Yaku.TSUISO] }); } if (IsRyuiso(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.RYUISO], yakuHanNum[(int)MJUtil.Yaku.RYUISO] }); } if (IsChinroto(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.CHINROTO], yakuHanNum[(int)MJUtil.Yaku.CHINROTO] }); } if(IsChurenpoto(ifr, horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.CHURENPOTO], yakuHanNum[(int)MJUtil.Yaku.CHURENPOTO] }); } if (IsSukantsu(horaMentsu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.SUKANTSU], yakuHanNum[(int)MJUtil.Yaku.SUKANTSU] }); } if (IsTenho(ifr)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.TENHO], yakuHanNum[(int)MJUtil.Yaku.TENHO] }); } if( IsChiho(ifr)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.CHIHO], yakuHanNum[(int)MJUtil.Yaku.CHIHO] }); } if (HasYakuman(result.yakus)) { result.yakus = SelectYakuman(result.yakus); result.YakumanMultiple = result.yakus.Count; } //飜数計算 result.Han = CalcHanSum(result.yakus); result.HasYakuExcludeDora = CalcHanSumWithoutDora(result.yakus) > 0; return result; }
public static YakuResult CalcSpecialYaku(InfoForResult ifr, Field field, int[] horaSyu, int redDoraNum) { YakuResult result = new YakuResult(); result.Fu = 25;//国士無双の場合は符を考慮しなくてよいため七対子の符に設定 result.IsTsumo = ifr.IsTsumo; result.IsOya = ifr.IsOya; //役の文字列取得 var yakuString = MJUtil.YAKU_STRING; //飜数の辞書選択 var yakuHanNum = ifr.IsMenzen ? MJUtil.YAKU_HAN_MENZEN : MJUtil.YAKU_HAN_FUROED; if (IsChitoitsu(horaSyu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.CHITOITSU], yakuHanNum[(int)MJUtil.Yaku.CHITOITSU] }); } if (ifr.IsDoubleReach) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.DOUBLEREACH], yakuHanNum[(int)MJUtil.Yaku.DOUBLEREACH] }); } else if (ifr.IsReach) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.REACH], yakuHanNum[(int)MJUtil.Yaku.REACH] }); } if (ifr.IsTsumo && ifr.IsMenzen) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.TSUMO], yakuHanNum[(int)MJUtil.Yaku.TSUMO] }); } if (ifr.IsIppatsu) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.IPPATSU], yakuHanNum[(int)MJUtil.Yaku.IPPATSU] }); } if (ifr.CalcDoraNum(horaSyu)>0) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.DORA], ifr.CalcDoraNum(horaSyu) }); } if (redDoraNum>0) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.REDDORA], redDoraNum }); } if (IsChinnitsu(horaSyu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.CHINNITSU], yakuHanNum[(int)MJUtil.Yaku.CHINNITSU] }); } if (IsHonnitsu(horaSyu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.HONNITSU], yakuHanNum[(int)MJUtil.Yaku.HONNITSU] }); } if (IsTannyao(horaSyu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.TANNYAO], yakuHanNum[(int)MJUtil.Yaku.TANNYAO] }); } if (IsHonroto(horaSyu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.HONROTO], yakuHanNum[(int)MJUtil.Yaku.HONROTO] }); } if (ifr.IsHoutei) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.HOUTEI], yakuHanNum[(int)MJUtil.Yaku.HOUTEI] }); } if (ifr.IsHaitei) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.HAITEI], yakuHanNum[(int)MJUtil.Yaku.HAITEI] }); } if (ifr.IsChankan) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.CHANKAN], yakuHanNum[(int)MJUtil.Yaku.CHANKAN] }); } if (IsTenho(ifr)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.TENHO], yakuHanNum[(int)MJUtil.Yaku.TENHO] }); } if (IsChiho(ifr)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.CHIHO], yakuHanNum[(int)MJUtil.Yaku.CHIHO] }); } if (IsTsuiso(horaSyu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.TSUISO], yakuHanNum[(int)MJUtil.Yaku.TSUISO] }); } if (IsKokushi(horaSyu)) { result.yakus.Add(new List<object>() { yakuString[(int)MJUtil.Yaku.KOKUSHIMUSO], yakuHanNum[(int)MJUtil.Yaku.KOKUSHIMUSO] }); } if (HasYakuman(result.yakus)) { result.yakus = SelectYakuman(result.yakus); result.YakumanMultiple = result.yakus.Count; } result.Han = CalcHanSum(result.yakus); result.HasYakuExcludeDora = CalcHanSumWithoutDora(result.yakus) > 0; return result; }