Example #1
0
        public static PointResult AnalyzePoint(YakuResult yakuResult)
        {
            PointResult pointResult = new PointResult();

            int bp = calcBasicPoint(yakuResult.Fu, yakuResult.Han, yakuResult.IsYakuman);


            if (yakuResult.IsTsumo)
            {//tsumo
                if (yakuResult.IsOya)
                {
                    pointResult.ChildOutcome = ceilAt100(bp * 2);
                    pointResult.HoraPlayerIncome = pointResult.ChildOutcome * 3;
                }
                else
                {
                    pointResult.ChildOutcome = ceilAt100(bp);
                    pointResult.OyaOutcome = ceilAt100(bp * 2);
                    pointResult.HoraPlayerIncome = pointResult.ChildOutcome * 2 + pointResult. OyaOutcome;
                }
            }
            else
            {//ron
                if (yakuResult.IsOya)
                {
                    pointResult.HoraPlayerIncome = ceilAt100(bp * 6);
                }
                else
                {
                    pointResult.HoraPlayerIncome = ceilAt100(bp * 4);
                }
            }

            return pointResult;
        }
Example #2
0
        public static PointResult AnalyzePoint(YakuResult yakuResult)
        {
            PointResult pointResult = new PointResult();

            int bp = calcBasicPoint(yakuResult.Fu, yakuResult.Han, yakuResult.IsYakuman);


            if (yakuResult.IsTsumo)
            {//tsumo
                if (yakuResult.IsOya)
                {
                    pointResult.ChildOutcome     = ceilAt100(bp * 2);
                    pointResult.HoraPlayerIncome = pointResult.ChildOutcome * 3;
                }
                else
                {
                    pointResult.ChildOutcome     = ceilAt100(bp);
                    pointResult.OyaOutcome       = ceilAt100(bp * 2);
                    pointResult.HoraPlayerIncome = pointResult.ChildOutcome * 2 + pointResult.OyaOutcome;
                }
            }
            else
            {//ron
                if (yakuResult.IsOya)
                {
                    pointResult.HoraPlayerIncome = ceilAt100(bp * 6);
                }
                else
                {
                    pointResult.HoraPlayerIncome = ceilAt100(bp * 4);
                }
            }

            return(pointResult);
        }
Example #3
0
        private static int CalcHanSum(YakuResult result)
        {
            var hanSum = 0;

            foreach (var yaku in result.yakus)
            {
                hanSum += yaku.Value;
            }
            return(hanSum);
        }
Example #4
0
        public static YakuResult CalcSpecialYaku(InfoForResult ifr, Field field, int[] horaSyu)
        {
            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;

            //七対子をあらかじめセット
            //国士無双の場合はSelectYakumanで七対子が消えるため初期段階でセットして問題ない
            result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHITOITSU], yakuHanNum[(int)MJUtil.Yaku.CHITOITSU]);


            if (ifr.IsDoubleReach)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.DOUBLEREACH], yakuHanNum[(int)MJUtil.Yaku.DOUBLEREACH]);
            }
            else if (ifr.IsReach)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.REACH], yakuHanNum[(int)MJUtil.Yaku.REACH]);
            }

            if (ifr.IsTsumo && ifr.IsMenzen)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TSUMO], yakuHanNum[(int)MJUtil.Yaku.TSUMO]);
            }
            if (ifr.IsIppatsu)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.IPPATSU], yakuHanNum[(int)MJUtil.Yaku.IPPATSU]);
            }
            
            if (IsDora(ifr,horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.DORA], CalcDoraNum(ifr, horaSyu));
            }
            if (IsChinnitsu(horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHINNITSU], yakuHanNum[(int)MJUtil.Yaku.CHINNITSU]);
            }
            if (IsHonnitsu(horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HONNITSU], yakuHanNum[(int)MJUtil.Yaku.HONNITSU]);
            }
            if (IsTannyao(horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TANNYAO], yakuHanNum[(int)MJUtil.Yaku.TANNYAO]);
            }
            if (IsHonroto(horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HONROTO], yakuHanNum[(int)MJUtil.Yaku.HONROTO]);
            }
            if (ifr.IsHoutei)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HOUTEI], yakuHanNum[(int)MJUtil.Yaku.HOUTEI]);
            }
            if (ifr.IsHaitei)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HAITEI], yakuHanNum[(int)MJUtil.Yaku.HAITEI]);
            }
            if (ifr.IsChankan)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHANKAN], yakuHanNum[(int)MJUtil.Yaku.CHANKAN]);
            }
            if (IsTenho(ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TENHO], yakuHanNum[(int)MJUtil.Yaku.TENHO]);
            }

            if (IsChiho(ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHIHO], yakuHanNum[(int)MJUtil.Yaku.CHIHO]);
            }
            if (IsTsuiso(horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TSUISO], yakuHanNum[(int)MJUtil.Yaku.TSUISO]);
            }


            if (HasYakuman(result.yakus))
            {
                result.yakus = SelectYakuman(result.yakus);
            }


            return result;
        }
Example #5
0
        public static YakuResult CalcNormalYaku(HoraPattern horaMentsu, InfoForResult ifr, Field field,int[] horaSyu)
        {
            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(yakuString[(int)MJUtil.Yaku.DOUBLEREACH], yakuHanNum[(int)MJUtil.Yaku.DOUBLEREACH]);
            }
            else if (ifr.IsReach)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.REACH], yakuHanNum[(int)MJUtil.Yaku.REACH]);
            }

            if (ifr.IsTsumo && ifr.IsMenzen)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TSUMO], yakuHanNum[(int)MJUtil.Yaku.TSUMO]);
            }
            if (ifr.IsIppatsu)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.IPPATSU], yakuHanNum[(int)MJUtil.Yaku.IPPATSU]);
            }
            if (IsPinfu(horaMentsu, ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.PINFU], yakuHanNum[(int)MJUtil.Yaku.PINFU]);
                result.Fu = ifr.IsTsumo ? 20 : 30;//ピンフツモは20符、ピンフロンは30符
            }
            if (IsTannyao(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TANNYAO], yakuHanNum[(int)MJUtil.Yaku.TANNYAO]);
            }

            //一盃口と二盃口は両立しない
            if (IsRyanpeiko(horaMentsu, ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.RYANPEIKO], yakuHanNum[(int)MJUtil.Yaku.RYANPEIKO]);
            }
            else if (IsIipeiko(horaMentsu, ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.IIPEIKOU], yakuHanNum[(int)MJUtil.Yaku.IIPEIKOU]);
            }

            if (IsYakuhai(horaMentsu, ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.YAKUHAI], CalcYakuhaiNum(horaMentsu, ifr));
            }
            if (ifr.IsHoutei)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HOUTEI], yakuHanNum[(int)MJUtil.Yaku.HOUTEI]);
            }
            if (ifr.IsHaitei)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HAITEI], yakuHanNum[(int)MJUtil.Yaku.HAITEI]);
            }
            if (ifr.IsRinshan)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.RINSHAN], yakuHanNum[(int)MJUtil.Yaku.RINSHAN]);
            }
            if (ifr.IsChankan)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHANKAN], yakuHanNum[(int)MJUtil.Yaku.CHANKAN]);
            }
            if (IsDora(horaMentsu, ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.DORA], CalcDoraNum(horaMentsu, ifr));
            }
            if (IsSansyokuDoujun(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SANSYOKUDOJUN], yakuHanNum[(int)MJUtil.Yaku.SANSYOKUDOJUN]);
            }

            if (IsIttsuu(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.ITTSUU], yakuHanNum[(int)MJUtil.Yaku.ITTSUU]);
            }

            if (IsSananko(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SANANKO], yakuHanNum[(int)MJUtil.Yaku.SANANKO]);
            }

            if (IsToitoi(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TOITOI], yakuHanNum[(int)MJUtil.Yaku.TOITOI]);
            }

            if (IsShosangen(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SHOSANGEN], yakuHanNum[(int)MJUtil.Yaku.SHOSANGEN]);
            }

            //混老頭とチャンタ系は同時に成立しないためif elseで判定する
            if (IsHonroto(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HONROTO], yakuHanNum[(int)MJUtil.Yaku.HONROTO]);
            }
            else
            {
                if (IsChanta(horaMentsu))
                {
                    result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHANTA], yakuHanNum[(int)MJUtil.Yaku.CHANTA]);
                }
                if (IsJunChanta(horaMentsu))
                {
                    result.yakus.Add(yakuString[(int)MJUtil.Yaku.JUNCHANTA], yakuHanNum[(int)MJUtil.Yaku.JUNCHANTA]);
                }
            }


            if (IsSansyokuDoko(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SANSYOKUDOKO], yakuHanNum[(int)MJUtil.Yaku.SANSYOKUDOKO]);
            }

            if (IsSankantsu(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SANKANTSU], yakuHanNum[(int)MJUtil.Yaku.SANKANTSU]);
            }

            //混一色と清一色は同時に成立しないためif elseで判定する
            if (IsHonnitsu(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HONNITSU], yakuHanNum[(int)MJUtil.Yaku.HONNITSU]);
            }
            else if (IsChinnitsu(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHINNITSU], yakuHanNum[(int)MJUtil.Yaku.CHINNITSU]);
            }



            //ここから役満
            if(IsSuuanko(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SUUANKO], yakuHanNum[(int)MJUtil.Yaku.SUUANKO]);
            }

            if (IsDaisangen(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.DAISANGEN], yakuHanNum[(int)MJUtil.Yaku.DAISANGEN]);
            }

            if (IsShosushi(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SHOSUSHI], yakuHanNum[(int)MJUtil.Yaku.SHOSUSHI]);
            }

            if (IsDaisushi(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.DAISUSHI], yakuHanNum[(int)MJUtil.Yaku.DAISUSHI]);
            }

            if(IsTsuiso(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TSUISO], yakuHanNum[(int)MJUtil.Yaku.TSUISO]);
            }

            if (IsRyuiso(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.RYUISO], yakuHanNum[(int)MJUtil.Yaku.RYUISO]);
            }

            if (IsChinroto(horaMentsu)) {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHINROTO], yakuHanNum[(int)MJUtil.Yaku.CHINROTO]);
            }

            if(IsChurenpoto(ifr,horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHURENPOTO], yakuHanNum[(int)MJUtil.Yaku.CHURENPOTO]);
            }

            if (IsSukantsu(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SUKANTSU], yakuHanNum[(int)MJUtil.Yaku.SUKANTSU]);
            }

            if (IsTenho(ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TENHO], yakuHanNum[(int)MJUtil.Yaku.TENHO]);
            }
            
            if( IsChiho(ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHIHO], yakuHanNum[(int)MJUtil.Yaku.CHIHO]);
            }

            if (HasYakuman(result.yakus))
            {
                result.yakus = SelectYakuman(result.yakus);
                result.IsYakuman = true;
            }

            //飜数計算
            result.Han = CalcHanSum(result);
            return result;
        }
Example #6
0
 private static int CalcHanSum(YakuResult result)
 {
     var hanSum = 0;
     foreach( var yaku in result.yakus)
     {
         hanSum += yaku.Value;
     }
     return hanSum;
 }
Example #7
0
        public static YakuResult CalcSpecialYaku(InfoForResult ifr, Field field, int[] horaSyu)
        {
            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;

            //七対子をあらかじめセット
            //国士無双の場合はSelectYakumanで七対子が消えるため初期段階でセットして問題ない
            result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHITOITSU], yakuHanNum[(int)MJUtil.Yaku.CHITOITSU]);


            if (ifr.IsDoubleReach)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.DOUBLEREACH], yakuHanNum[(int)MJUtil.Yaku.DOUBLEREACH]);
            }
            else if (ifr.IsReach)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.REACH], yakuHanNum[(int)MJUtil.Yaku.REACH]);
            }

            if (ifr.IsTsumo && ifr.IsMenzen)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TSUMO], yakuHanNum[(int)MJUtil.Yaku.TSUMO]);
            }
            if (ifr.IsIppatsu)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.IPPATSU], yakuHanNum[(int)MJUtil.Yaku.IPPATSU]);
            }

            if (IsDora(ifr, horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.DORA], CalcDoraNum(ifr, horaSyu));
            }
            if (IsChinnitsu(horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHINNITSU], yakuHanNum[(int)MJUtil.Yaku.CHINNITSU]);
            }
            if (IsHonnitsu(horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HONNITSU], yakuHanNum[(int)MJUtil.Yaku.HONNITSU]);
            }
            if (IsTannyao(horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TANNYAO], yakuHanNum[(int)MJUtil.Yaku.TANNYAO]);
            }
            if (IsHonroto(horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HONROTO], yakuHanNum[(int)MJUtil.Yaku.HONROTO]);
            }
            if (ifr.IsHoutei)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HOUTEI], yakuHanNum[(int)MJUtil.Yaku.HOUTEI]);
            }
            if (ifr.IsHaitei)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HAITEI], yakuHanNum[(int)MJUtil.Yaku.HAITEI]);
            }
            if (ifr.IsChankan)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHANKAN], yakuHanNum[(int)MJUtil.Yaku.CHANKAN]);
            }
            if (IsTenho(ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TENHO], yakuHanNum[(int)MJUtil.Yaku.TENHO]);
            }

            if (IsChiho(ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHIHO], yakuHanNum[(int)MJUtil.Yaku.CHIHO]);
            }
            if (IsTsuiso(horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TSUISO], yakuHanNum[(int)MJUtil.Yaku.TSUISO]);
            }


            if (HasYakuman(result.yakus))
            {
                result.yakus = SelectYakuman(result.yakus);
            }


            return(result);
        }
Example #8
0
        public static YakuResult CalcNormalYaku(HoraPattern horaMentsu, InfoForResult ifr, Field field, int[] horaSyu)
        {
            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(yakuString[(int)MJUtil.Yaku.DOUBLEREACH], yakuHanNum[(int)MJUtil.Yaku.DOUBLEREACH]);
            }
            else if (ifr.IsReach)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.REACH], yakuHanNum[(int)MJUtil.Yaku.REACH]);
            }

            if (ifr.IsTsumo && ifr.IsMenzen)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TSUMO], yakuHanNum[(int)MJUtil.Yaku.TSUMO]);
            }
            if (ifr.IsIppatsu)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.IPPATSU], yakuHanNum[(int)MJUtil.Yaku.IPPATSU]);
            }
            if (IsPinfu(horaMentsu, ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.PINFU], yakuHanNum[(int)MJUtil.Yaku.PINFU]);
                result.Fu = ifr.IsTsumo ? 20 : 30;//ピンフツモは20符、ピンフロンは30符
            }
            if (IsTannyao(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TANNYAO], yakuHanNum[(int)MJUtil.Yaku.TANNYAO]);
            }

            //一盃口と二盃口は両立しない
            if (IsRyanpeiko(horaMentsu, ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.RYANPEIKO], yakuHanNum[(int)MJUtil.Yaku.RYANPEIKO]);
            }
            else if (IsIipeiko(horaMentsu, ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.IIPEIKOU], yakuHanNum[(int)MJUtil.Yaku.IIPEIKOU]);
            }

            if (IsYakuhai(horaMentsu, ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.YAKUHAI], CalcYakuhaiNum(horaMentsu, ifr));
            }
            if (ifr.IsHoutei)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HOUTEI], yakuHanNum[(int)MJUtil.Yaku.HOUTEI]);
            }
            if (ifr.IsHaitei)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HAITEI], yakuHanNum[(int)MJUtil.Yaku.HAITEI]);
            }
            if (ifr.IsRinshan)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.RINSHAN], yakuHanNum[(int)MJUtil.Yaku.RINSHAN]);
            }
            if (ifr.IsChankan)
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHANKAN], yakuHanNum[(int)MJUtil.Yaku.CHANKAN]);
            }
            if (IsDora(horaMentsu, ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.DORA], CalcDoraNum(horaMentsu, ifr));
            }
            if (IsSansyokuDoujun(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SANSYOKUDOJUN], yakuHanNum[(int)MJUtil.Yaku.SANSYOKUDOJUN]);
            }

            if (IsIttsuu(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.ITTSUU], yakuHanNum[(int)MJUtil.Yaku.ITTSUU]);
            }

            if (IsSananko(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SANANKO], yakuHanNum[(int)MJUtil.Yaku.SANANKO]);
            }

            if (IsToitoi(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TOITOI], yakuHanNum[(int)MJUtil.Yaku.TOITOI]);
            }

            if (IsShosangen(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SHOSANGEN], yakuHanNum[(int)MJUtil.Yaku.SHOSANGEN]);
            }

            //混老頭とチャンタ系は同時に成立しないためif elseで判定する
            if (IsHonroto(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HONROTO], yakuHanNum[(int)MJUtil.Yaku.HONROTO]);
            }
            else
            {
                if (IsChanta(horaMentsu))
                {
                    result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHANTA], yakuHanNum[(int)MJUtil.Yaku.CHANTA]);
                }
                if (IsJunChanta(horaMentsu))
                {
                    result.yakus.Add(yakuString[(int)MJUtil.Yaku.JUNCHANTA], yakuHanNum[(int)MJUtil.Yaku.JUNCHANTA]);
                }
            }


            if (IsSansyokuDoko(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SANSYOKUDOKO], yakuHanNum[(int)MJUtil.Yaku.SANSYOKUDOKO]);
            }

            if (IsSankantsu(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SANKANTSU], yakuHanNum[(int)MJUtil.Yaku.SANKANTSU]);
            }

            //混一色と清一色は同時に成立しないためif elseで判定する
            if (IsHonnitsu(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.HONNITSU], yakuHanNum[(int)MJUtil.Yaku.HONNITSU]);
            }
            else if (IsChinnitsu(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHINNITSU], yakuHanNum[(int)MJUtil.Yaku.CHINNITSU]);
            }



            //ここから役満
            if (IsSuuanko(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SUUANKO], yakuHanNum[(int)MJUtil.Yaku.SUUANKO]);
            }

            if (IsDaisangen(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.DAISANGEN], yakuHanNum[(int)MJUtil.Yaku.DAISANGEN]);
            }

            if (IsShosushi(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SHOSUSHI], yakuHanNum[(int)MJUtil.Yaku.SHOSUSHI]);
            }

            if (IsDaisushi(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.DAISUSHI], yakuHanNum[(int)MJUtil.Yaku.DAISUSHI]);
            }

            if (IsTsuiso(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TSUISO], yakuHanNum[(int)MJUtil.Yaku.TSUISO]);
            }

            if (IsRyuiso(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.RYUISO], yakuHanNum[(int)MJUtil.Yaku.RYUISO]);
            }

            if (IsChinroto(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHINROTO], yakuHanNum[(int)MJUtil.Yaku.CHINROTO]);
            }

            if (IsChurenpoto(ifr, horaSyu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHURENPOTO], yakuHanNum[(int)MJUtil.Yaku.CHURENPOTO]);
            }

            if (IsSukantsu(horaMentsu))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.SUKANTSU], yakuHanNum[(int)MJUtil.Yaku.SUKANTSU]);
            }

            if (IsTenho(ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.TENHO], yakuHanNum[(int)MJUtil.Yaku.TENHO]);
            }

            if (IsChiho(ifr))
            {
                result.yakus.Add(yakuString[(int)MJUtil.Yaku.CHIHO], yakuHanNum[(int)MJUtil.Yaku.CHIHO]);
            }

            if (HasYakuman(result.yakus))
            {
                result.yakus     = SelectYakuman(result.yakus);
                result.IsYakuman = true;
            }

            //飜数計算
            result.Han = CalcHanSum(result);
            return(result);
        }