Exemplo n.º 1
0
    protected override EResponse OnSelect_SuteHai(EKaze fromPlayerKaze, Hai haiToHandle)
    {
        _action.Reset();
        _action.State = EActionState.Select_Sutehai;

        return(DisplayMenuList());
    }
Exemplo n.º 2
0
    // -----------------------static methods start---------------------------
    public static int getRelation(EKaze otherKaze, EKaze selfKaze)
    {
        int other = (int)otherKaze;
        int self  = (int)selfKaze;

        ERelation relation;

        if (self == other)
        {
            relation = ERelation.JiBun; //自家
        }
        else if ((self + 1) % 4 == other)
        {
            relation = ERelation.ShiMoCha; //下家.
        }
        else if ((self + 2) % 4 == other)
        {
            relation = ERelation.ToiMen;  //对家
        }
        else //if( (self + 3) % 4 == other )
        {
            relation = ERelation.KaMiCha; //上家.
        }

        return((int)relation);
    }
Exemplo n.º 3
0
    protected override EResponse OnHandle_KakanHai(EKaze fromPlayerKaze, Hai haiToHandle)
    {
        _action.Reset();

        if (inTest)
        {
            return(DoResponse(EResponse.Nagashi));
        }

        Hai kanHai = haiToHandle;

        int agariScore = MahjongAgent.getAgariScore(Tehai, kanHai, JiKaze);

        if (agariScore > 0)
        {
            if (GameSettings.AllowFuriten || !isFuriten())
            {
                return(DoResponse(EResponse.Ron_Agari));
            }
            else
            {
                Utils.LogWarningFormat("AI {0} is enable ron but furiten...", JiKaze.ToString());
            }
        }

        return(DoResponse(EResponse.Nagashi));
    }
    public void SetInfo(EKaze kaze, int curTenbou, int changeValue, bool isTenpai = false, bool showTenpai = false)
    {
        lab_kaze.text = ResManager.getString("kaze_" + kaze.ToString().ToLower());

        lab_current.text = curTenbou.ToString();

        if (changeValue > 0)
        {
            lab_change.color = Color.blue;
            lab_change.text  = "+" + changeValue.ToString();
        }
        else if (changeValue < 0)
        {
            lab_change.color = Color.red;
            lab_change.text  = "" + changeValue.ToString();
        }
        else
        {
            lab_change.text = "";
        }

        if (isTenpai)
        {
            lab_tenpai.text = ResManager.getString("is_tenpai");
        }
        else
        {
            lab_tenpai.text = ResManager.getString("not_tenpai");
        }

        lab_tenpai.gameObject.SetActive(showTenpai);
    }
Exemplo n.º 5
0
    protected override EResponse OnSelect_SuteHai(EKaze fromPlayerKaze, Hai haiToHandle)
    {
        _action.Reset();

        thinkSelectSuteHai();

        return(DoResponse(EResponse.SuteHai));
    }
Exemplo n.º 6
0
 public void SetKaze(EKaze kaze)
 {
     string ww = ResManager.getString("kaze_" + kaze.ToString().ToLower());
     //if(!isAI)
     //Debug.Log (this._ownerPlayer.Name+"設定為"+ww+"風");
     //_isAI = isAI;
     //if (_isAI)
     //	lab_point.text = "(電腦)";
     //else
     //	lab_point.text = "(玩家)";
 }
Exemplo n.º 7
0
    protected override EResponse OnHandle_SuteHai(EKaze fromPlayerKaze, Hai haiToHandle)
    {
        _action.Reset();
        _action.SutehaiIndex = 0;
        Hai suteHai = haiToHandle;

        // check Ron
        int agariScore = MahjongAgent.getAgariScore(Tehai, suteHai, JiKaze);

        if (agariScore > 0)  // Ron
        {
            if (GameSettings.AllowFuriten || !isFuriten())
            {
                return(DoResponse(EResponse.Ron_Agari));
            }
            else
            {
                Utils.LogWarningFormat("AI {0} is enable to ron but furiten...", JiKaze.ToString());
            }
        }

        if (MahjongAgent.getTsumoRemain() <= 0)
        {
            return(DoResponse(EResponse.Nagashi));
        }

        if (MahjongAgent.isReach(JiKaze))
        {
            return(DoResponse(EResponse.Nagashi));
        }

        // TODO: Chii, Pon, Kan check

        // check Kan(test)

        /*
         * if( MahjongAgent.getTotalKanCount() < GameSettings.KanCountMax )
         * {
         *  if( Tehai.validDaiMinKan(suteHai) ) {
         *      _action.IsValidDaiMinKan = true;
         *      return DoResponse(EResponse.DaiMinKan);
         *  }
         * }
         */
        //_action.Reset();

        //thinkSelectSuteHai();

        return(DoResponse(EResponse.Nagashi));
        //return DoResponse(EResponse.Nagashi);
    }
Exemplo n.º 8
0
    public static EKaze Pre(this EKaze kaze)
    {
        switch (kaze)
        {
        case EKaze.Ton: return(EKaze.Pei);

        case EKaze.Nan: return(EKaze.Ton);

        case EKaze.Sya: return(EKaze.Nan);

        case EKaze.Pei: return(EKaze.Sya);
        }
        return(EKaze.Pei);
    }
Exemplo n.º 9
0
    void Show_Internel()
    {
        lab_reachbou.text = "x" + currentAgari.reachBou.ToString();

        var   tenbouInfos = currentAgari.tenbouChangeInfoList;
        EKaze nextKaze    = currentAgari.manKaze;

        for (int i = 0; i < playerTenbouList.Count; i++)
        {
            PlayerTenbouChangeInfo info = tenbouInfos.Find(ptci => ptci.playerKaze == nextKaze);
            playerTenbouList[i].SetPointInfo(info.playerKaze, info.current, info.changed);
            nextKaze = nextKaze.Next();
        }
    }
Exemplo n.º 10
0
    void Show_Internel()
    {
        lab_msg.text = GetRyuuKyokuReasonString();

        PlayRyuuKyokuVoice();

        bool showTenpai = ryuuKyokuReason == ERyuuKyokuReason.NoTsumoHai;

        var   tenbouInfos = currentAgari.tenbouChangeInfoList;
        EKaze nextKaze    = currentAgari.manKaze;

        for (int i = 0; i < playerTenbouList.Count; i++)
        {
            PlayerTenbouChangeInfo info = tenbouInfos.Find(ptci => ptci.playerKaze == nextKaze);
            playerTenbouList[i].SetInfo(info.playerKaze, info.current, info.changed, info.isTenpai, showTenpai);
            nextKaze = nextKaze.Next();
        }
    }
Exemplo n.º 11
0
    IEnumerator ShowTenbouInfo()
    {
        yield return(new WaitForSeconds(1f));

        lab_reachbou.text = "x" + currentAgari.reachBou.ToString();

        SetTenbouInfo(true);


        var   tenbouInfos = currentAgari.tenbouChangeInfoList;
        EKaze nextKaze    = currentAgari.manKaze;

        for (int i = 0; i < playerTenbouList.Count; i++)
        {
            PlayerTenbouChangeInfo info = tenbouInfos.Find(ptci => ptci.playerKaze == nextKaze);
            playerTenbouList[i].SetInfo(info.playerKaze, info.current, info.changed);
            nextKaze = nextKaze.Next();
        }
    }
Exemplo n.º 12
0
    public virtual void HandleRequest(ERequest request, EKaze fromPlayerKaze, Hai haiToHandle, Action <EKaze, EResponse> onResponse)
    {
        this._request    = request;
        this._onResponse = onResponse;

        switch (request)
        {
        case ERequest.Handle_TsumoHai:
        {
            OnHandle_TsumoHai(fromPlayerKaze, haiToHandle);
        }
        break;

        case ERequest.Handle_KaKanHai:
        {
            OnHandle_KakanHai(fromPlayerKaze, haiToHandle);
        }
        break;

        case ERequest.Handle_SuteHai:
        {
            OnHandle_SuteHai(fromPlayerKaze, haiToHandle);
        }
        break;

        case ERequest.Select_SuteHai:
        {
            OnSelect_SuteHai(fromPlayerKaze, haiToHandle);
        }
        break;

        default:
        {
            DoResponse(EResponse.Nagashi);
        }
        break;
        }
    }
Exemplo n.º 13
0
    protected override EResponse OnHandle_KakanHai(EKaze fromPlayerKaze, Hai haiToHandle)
    {
        _action.Reset();

        if (inTest)
        {
            //return DoResponse(EResponse.Nagashi);
        }

        Hai kanHai = haiToHandle;

        int agariScore = MahjongAgent.getAgariScore(Tehai, kanHai, JiKaze);

        if (agariScore > 0)
        {
            if (GameSettings.AllowFuriten || !isFuriten())
            {
                _action.IsValidRon = true;
                _action.MenuList.Add(EActionType.Ron);

                if (MahjongAgent.isReach(JiKaze))
                {
                    return(DisplayMenuList());
                }
                else
                {
                    _action.MenuList.Add(EActionType.Nagashi);
                    return(DisplayMenuList());
                }
            }
            else
            {
                Utils.LogWarningFormat("Player {0} is enable ron but furiten...", JiKaze.ToString());
            }
        }

        return(DoResponse(EResponse.Nagashi));
    }
    public void SetPointInfo(EKaze kaze, int tenbou, int point)
    {
        lab_kaze.text = ResManager.getString("kaze_" + kaze.ToString().ToLower());

        lab_current.text = tenbou.ToString();

        if (point > 0)
        {
            lab_change.color = Color.blue;
            lab_change.text  = "+" + point.ToString() + "pt";
        }
        else if (point < 0)
        {
            lab_change.color = Color.red;
            lab_change.text  = "" + point.ToString() + "pt";
        }
        else
        {
            lab_change.text = "";
        }

        lab_tenpai.gameObject.SetActive(false);
    }
Exemplo n.º 15
0
        public CheckLenFonHai(Yaku owner)
        {
            this.YakuID = 42;

            EKaze jikaze = owner.AgariParam.getJikaze();
            EKaze bakaze = owner.AgariParam.getBakaze();

            if (jikaze == EKaze.Ton && bakaze == EKaze.Ton)
            {
                if (owner.checkTon())
                {
                    hantei = true;
                    hanSuu = 2;
                }
            }
            else if (jikaze == EKaze.Nan && bakaze == EKaze.Nan)
            {
                if (owner.checkNan())
                {
                    hantei = true;
                    hanSuu = 2;
                }
            }
        }
Exemplo n.º 16
0
 protected abstract EResponse OnHandle_KakanHai(EKaze fromPlayerKaze, Hai haiToHandle);
Exemplo n.º 17
0
    protected override EResponse OnHandle_TsumoHai(EKaze fromPlayerKaze, Hai haiToHandle)
    {
        _action.Reset();
        _action.State = EActionState.Select_Sutehai;

        if (inTest)
        {
            //_action.State = EActionState.Select_Sutehai;
            //return DisplayMenuList();
        }

        // 手牌をコピーする。
        Hai tsumoHai = haiToHandle;

        // check enable Tsumo
        int agariScore = MahjongAgent.getAgariScore(Tehai, tsumoHai, JiKaze);

        if (agariScore > 0)
        {
            if (GameSettings.AllowFuriten || !isFuriten())
            {
                _action.IsValidTsumo = true;
                _action.MenuList.Add(EActionType.Tsumo);

                if (MahjongAgent.isReach(JiKaze))
                {
                    return(DisplayMenuList());
                }
            }
            else
            {
                Utils.LogWarningFormat("Player {0} is enable tsumo but furiten...", JiKaze.ToString());
            }
        }

        // 九种九牌check
        if (MahjongAgent.CheckHaiTypeOver9(Tehai, tsumoHai))
        {
            _action.MenuList.Add(EActionType.RyuuKyoku);
        }

        // check enable Reach
        if (CheckReachPreConditions() == true)
        {
            List <int> reachHaiIndexList;
            if (MahjongAgent.tryGetReachHaiIndex(Tehai, tsumoHai, out reachHaiIndexList))
            {
                _action.IsValidReach      = true;
                _action.ReachHaiIndexList = reachHaiIndexList;
                _action.MenuList.Add(EActionType.Reach);
            }
        }

        // 制限事項。リーチ後のカンをさせない
        if (!MahjongAgent.isReach(JiKaze))
        {
            if (MahjongAgent.getTotalKanCount() < GameSettings.KanCountMax)
            {
                // tsumo kans
                List <Hai> kanHais = new List <Hai>();
                if (Tehai.validAnyTsumoKan(tsumoHai, kanHais))
                {
                    _action.setValidTsumoKan(true, kanHais);

                    _action.MenuList.Add(EActionType.Kan);
                }
            }
        }
        else
        {
            if (MahjongAgent.getTotalKanCount() < GameSettings.KanCountMax)
            {
                // if player machi hais won't change after setting AnKan, enable to to it.
                if (Tehai.validAnKan(tsumoHai))
                {
                    List <Hai> machiHais;
                    if (MahjongAgent.tryGetMachiHais(Tehai, out machiHais))
                    {
                        Tehai tehaiCopy = new Tehai(Tehai);
                        tehaiCopy.setAnKan(tsumoHai);
                        tehaiCopy.Sort();

                        List <Hai> newMachiHais;

                        if (MahjongAgent.tryGetMachiHais(tehaiCopy, out newMachiHais))
                        {
                            if (machiHais.Count == newMachiHais.Count)
                            {
                                machiHais.Sort(Tehai.Compare);
                                newMachiHais.Sort(Tehai.Compare);

                                bool enableAnkan = true;

                                for (int i = 0; i < machiHais.Count; i++)
                                {
                                    if (machiHais[i].ID != newMachiHais[i].ID)
                                    {
                                        enableAnkan = false;
                                        break;
                                    }
                                }

                                if (enableAnkan == true)
                                {
                                    _action.setValidTsumoKan(true, new List <Hai>()
                                    {
                                        tsumoHai
                                    });

                                    _action.MenuList.Add(EActionType.Kan);
                                    _action.MenuList.Add(EActionType.Nagashi);

                                    _action.State = EActionState.Select_Kan;
                                }
                            }
                        }
                    }
                } // end if(valid ankan)
            }     // end kan count check

            // can Ron or Ankan, sute hai automatically.
            if (_action.MenuList.Count == 0)
            {
                _action.SutehaiIndex = Tehai.getJyunTehaiCount(); // sute the tsumo hai on Reach

                return(DoResponse(EResponse.SuteHai));
            }
        }

        // always display menu on pick tsumo hai.
        return(DisplayMenuList());
    }
Exemplo n.º 18
0
    protected override EResponse OnHandle_SuteHai(EKaze fromPlayerKaze, Hai haiToHandle)
    {
        _action.Reset();

        if (inTest)
        {
            //_action.MenuList.Add(EActionType.Nagashi);
            //return DisplayMenuList();
        }

        Hai suteHai = haiToHandle;

        // check Ron
        int agariScore = MahjongAgent.getAgariScore(Tehai, suteHai, JiKaze);

        if (agariScore > 0)  // Ron
        {
            if (GameSettings.AllowFuriten || !isFuriten())
            {
                _action.IsValidRon = true;
                _action.MenuList.Add(EActionType.Ron);

                if (MahjongAgent.isReach(JiKaze))
                {
                    //_action.MenuList.Add( EActionType.Nagashi );
                    return(DisplayMenuList());
                }
                else
                {
                    _action.MenuList.Add(EActionType.Nagashi);
                }
            }
            else
            {
                Utils.LogWarningFormat("Player {0} is enable to ron but furiten...", JiKaze.ToString());
            }
        }

        if (MahjongAgent.getTsumoRemain() <= 0)
        {
            return(DoResponse(EResponse.Nagashi));
        }

        if (MahjongAgent.isReach(JiKaze))
        {
            return(DoResponse(EResponse.Nagashi));
        }


        // check menu Kan
        if (MahjongAgent.getTotalKanCount() < GameSettings.KanCountMax)
        {
            if (Tehai.validDaiMinKan(suteHai))
            {
                _action.IsValidDaiMinKan = true;
                _action.MenuList.Add(EActionType.Kan);
            }
        }

        // check menu Pon
        if (Tehai.validPon(suteHai))
        {
            _action.IsValidPon = true;
            _action.MenuList.Add(EActionType.Pon);
        }

        // check menu Chii
        int relation = Mahjong.getRelation(fromPlayerKaze, JiKaze);

        if (relation == (int)ERelation.KaMiCha)
        {
            List <Hai> sarashiHaiRight = new List <Hai>();
            if (Tehai.validChiiRight(suteHai, sarashiHaiRight))
            {
                _action.setValidChiiRight(true, sarashiHaiRight);

                if (!_action.MenuList.Contains(EActionType.Chii))
                {
                    _action.MenuList.Add(EActionType.Chii);
                }
            }

            List <Hai> sarashiHaiCenter = new List <Hai>();
            if (Tehai.validChiiCenter(suteHai, sarashiHaiCenter))
            {
                _action.setValidChiiCenter(true, sarashiHaiCenter);

                if (!_action.MenuList.Contains(EActionType.Chii))
                {
                    _action.MenuList.Add(EActionType.Chii);
                }
            }

            List <Hai> sarashiHaiLeft = new List <Hai>();
            if (Tehai.validChiiLeft(suteHai, sarashiHaiLeft))
            {
                _action.setValidChiiLeft(true, sarashiHaiLeft);

                if (!_action.MenuList.Contains(EActionType.Chii))
                {
                    _action.MenuList.Add(EActionType.Chii);
                }
            }
        }

        if (_action.MenuList.Count > 0)
        {
            _action.MenuList.Add(EActionType.Nagashi);
            return(DisplayMenuList());
        }

        return(DoResponse(EResponse.Nagashi));
    }
Exemplo n.º 19
0
    public void SetKyoku(EKaze kaze, int kyoku)
    {
        string kazeStr = ResManager.getString("kaze_" + kaze.ToString().ToLower());

        kyokuLab.text = kazeStr + " " + kyoku.ToString() + "局";
    }
Exemplo n.º 20
0
    public int GetAgariScore(Tehai tehai, Hai addHai, EKaze jikaze, AgariParam param = null)
    {
        if (param == null)
        {
            param = AgariParam;
            param.ResetDoraHais();
        }

        param.setBakaze(getBaKaze());
        param.setJikaze(jikaze);

        param.ResetYakuFlags(); // should reset params or create a new.

        if (m_activePlayer.IsReach)
        {
            if (m_activePlayer.IsDoubleReach)
            {
                param.setYakuFlag(EYakuFlagType.DOUBLE_REACH, true);
            }
            else
            {
                param.setYakuFlag(EYakuFlagType.REACH, true);
            }
        }

        if (m_isTsumo)
        {
            param.setYakuFlag(EYakuFlagType.TSUMO, true);

            if (m_isTenhou)
            {
                param.setYakuFlag(EYakuFlagType.TENHOU, true);
            }
            else if (m_isChihou)
            {
                param.setYakuFlag(EYakuFlagType.TIHOU, true);
            }
        }
        else if (m_isRenhou)
        {
            if (getPlayerIndex(jikaze) != OyaIndex)    // only ko can Renhou.
            {
                param.setYakuFlag(EYakuFlagType.RENHOU, true);
            }
        }

        if (m_isTsumo && m_isRinshan)
        {
            param.setYakuFlag(EYakuFlagType.RINSYAN, true);
        }

        if (m_isChanKan)
        {
            param.setYakuFlag(EYakuFlagType.CHANKAN, true);
        }

        if (m_isLast)
        {
            if (m_isTsumo)
            {
                param.setYakuFlag(EYakuFlagType.HAITEI, true);
            }
            else
            {
                param.setYakuFlag(EYakuFlagType.HOUTEI, true);
            }
        }

        if (m_activePlayer.IsIppatsu)
        {
            param.setYakuFlag(EYakuFlagType.IPPATU, true);
        }

        if (GameSettings.UseKuitan)
        {
            param.setYakuFlag(EYakuFlagType.KUITAN, true);
        }

        return(AgariScoreManager.GetAgariScore(tehai, addHai, param, ref m_combis, ref m_agariInfo));
    }
Exemplo n.º 21
0
 // get player index from kaze.
 public int getPlayerIndex(EKaze kaze)
 {
     return(m_playerList.FindIndex((p) => p.JiKaze == kaze));
 }
Exemplo n.º 22
0
 // get player from kaze.
 public Player getPlayer(EKaze kaze)
 {
     return(m_playerList.Find((p) => p.JiKaze == kaze));
 }
Exemplo n.º 23
0
        public CheckYakuHai(Yaku owner)
        {
            this.YakuID = 43;

            if (owner.checkHaku())
            {
                hanSuu++;
                hantei = true;
            }
            if (owner.checkHatsu())
            {
                hanSuu++;
                hantei = true;
            }
            if (owner.checkCyun())
            {
                hanSuu++;
                hantei = true;
            }


            EKaze          jikaze           = owner.AgariParam.getJikaze();
            CheckLenFonHai lenFonHaiChecker = new CheckLenFonHai(owner);

            EKaze bakaze = owner.AgariParam.getBakaze();

            // check BaKaze hai
            if (bakaze == EKaze.Ton && jikaze != EKaze.Ton)  // lenfon is checking in CheckLenFonHai()
            {
                if (owner.checkTon())
                {
                    hanSuu++;
                    hantei = true;
                }
            }
            else if (bakaze == EKaze.Nan && jikaze != EKaze.Nan)  // lenfon is checking in CheckLenFonHai()
            {
                if (owner.checkNan())
                {
                    hanSuu++;
                    hantei = true;
                }
            }

            // check JiKaze hai.
            if (jikaze == EKaze.Ton)
            {
                if (lenFonHaiChecker.isHantei())
                {
                }
                else if (owner.checkTon())
                {
                    hanSuu++;
                    hantei = true;
                }
            }
            else if (jikaze == EKaze.Nan)
            {
                if (lenFonHaiChecker.isHantei())
                {
                }
                else if (owner.checkNan())
                {
                    hanSuu++;
                    hantei = true;
                }
            }
            else if (jikaze == EKaze.Sya)
            {
                if (lenFonHaiChecker.isHantei())
                {
                }
                else if (owner.checkSya())
                {
                    hanSuu++;
                    hantei = true;
                }
            }
            else
            {
                if (lenFonHaiChecker.isHantei())
                {
                }
                else if (owner.checkPei())
                {
                    hanSuu++;
                    hantei = true;
                }
            }
        }
Exemplo n.º 24
0
 public void setBakaze(EKaze bakaze)
 {
     _baKaze = bakaze;
 }
Exemplo n.º 25
0
 public void setJikaze(EKaze jikaze)
 {
     _jiKaze = jikaze;
 }
Exemplo n.º 26
0
    protected override EResponse OnHandle_TsumoHai(EKaze fromPlayerKaze, Hai haiToHandle)
    {
        _action.Reset();

        if (inTest)
        {
            _action.SutehaiIndex = Tehai.getJyunTehaiCount();
            return(DoResponse(EResponse.SuteHai));
        }

        Hai tsumoHai = haiToHandle;

        // ツモあがりの場合は、イベント(ツモあがり)を返す。
        int agariScore = MahjongAgent.getAgariScore(Tehai, tsumoHai, JiKaze);

        if (agariScore > 0)
        {
            if (GameSettings.AllowFuriten || !isFuriten())
            {
                return(DoResponse(EResponse.Tsumo_Agari));
            }
            else
            {
                Utils.LogWarningFormat("AI {0} is enable tsumo but furiten...", JiKaze.ToString());
            }
        }

        // 九种九牌check
        if (MahjongAgent.CheckHaiTypeOver9(Tehai, tsumoHai))
        {
            return(DoResponse(EResponse.Nagashi));
        }

        // リーチの場合は、ツモ切りする
        if (MahjongAgent.isReach(JiKaze))
        {
            _action.SutehaiIndex = Tehai.getJyunTehaiCount();

            return(DoResponse(EResponse.SuteHai));
        }

        // check enable Reach
        if (CheckReachPreConditions() == true)
        {
            List <int> reachHaiIndexList;
            if (MahjongAgent.tryGetReachHaiIndex(Tehai, tsumoHai, out reachHaiIndexList))
            {
                _action.IsValidReach      = true;
                _action.ReachHaiIndexList = reachHaiIndexList;

                thinkReach();

                return(DoResponse(EResponse.Reach));
            }
        }

        // 制限事項。リーチ後のカンをさせない
        if (!MahjongAgent.isReach(JiKaze))
        {
            /*
             * if( MahjongAgent.getTotalKanCount() < GameSettings.KanCountMax )
             * {
             *  // TODO: tsumo kans
             *  List<Hai> kanHais = new List<Hai>();
             *  if( Tehai.validAnyTsumoKan(tsumoHai, kanHais) )
             *  {
             *      _action.setValidTsumoKan(true, kanHais);
             *
             *  }
             * }
             */
        }
        else
        {
            if (MahjongAgent.getTotalKanCount() < GameSettings.KanCountMax)
            {
                // if player machi hais won't change after setting AnKan, enable to to it.
                if (Tehai.validAnKan(tsumoHai))
                {
                    List <Hai> machiHais;
                    if (MahjongAgent.tryGetMachiHais(Tehai, out machiHais))
                    {
                        Tehai tehaiCopy = new Tehai(Tehai);
                        tehaiCopy.setAnKan(tsumoHai);
                        tehaiCopy.Sort();

                        List <Hai> newMachiHais;

                        if (MahjongAgent.tryGetMachiHais(tehaiCopy, out newMachiHais))
                        {
                            if (machiHais.Count == newMachiHais.Count)
                            {
                                machiHais.Sort(Tehai.Compare);
                                newMachiHais.Sort(Tehai.Compare);

                                bool enableAnkan = true;

                                for (int i = 0; i < machiHais.Count; i++)
                                {
                                    if (machiHais[i].ID != newMachiHais[i].ID)
                                    {
                                        enableAnkan = false;
                                        break;
                                    }
                                }

                                if (enableAnkan == true)
                                {
                                    _action.setValidTsumoKan(true, new List <Hai>()
                                    {
                                        tsumoHai
                                    });
                                    return(DoResponse(EResponse.Ankan));
                                }
                            }
                        }
                    }
                }
            }

            // can Ron or Ankan, sute hai automatically.
            _action.SutehaiIndex = Tehai.getJyunTehaiCount(); // sute the tsumo hai on Reach

            return(DoResponse(EResponse.SuteHai));
        }


        thinkSutehai(tsumoHai);

        return(DoResponse(EResponse.SuteHai));
    }
Exemplo n.º 27
0
 protected abstract EResponse OnSelect_SuteHai(EKaze fromPlayerKaze, Hai haiToHandle);
    void OnHandle_ResponseSuteHai()
    {
        List <EKaze> ronPlayers = logicOwner.GetRonPlayers();

        if (ronPlayers.Count > 0)
        {
            if (ronPlayers.Count >= 3 && !GameSettings.AllowRon3)
            {
                logicOwner.Handle_Invalid_RyuuKyoku(); // must.

                logicOwner.RyuuKyokuReason = ERyuuKyokuReason.Ron3;
                owner.ChangeState <LoopState_HandleRyuuKyoKu>();
            }
            else
            {
                logicOwner.Handle_SuteHai_Ron();
                logicOwner.AgariResult = EAgariType.Ron;

                // show ron ui.
                EventManager.Get().SendEvent(UIEventType.Ron_Agari, ronPlayers, logicOwner.FromKaze, logicOwner.SuteHai);

                owner.ChangeState <LoopState_Agari>();
            }
        }
        else
        {
            // ERyuuKyokuReason.Reach4: no one Ron the 4th player's rute hai
            if (logicOwner.Reach4Flag == true)
            {
                logicOwner.Handle_Invalid_RyuuKyoku(); // must.

                logicOwner.RyuuKyokuReason = ERyuuKyokuReason.Reach4;
                owner.ChangeState <LoopState_HandleRyuuKyoKu>();
                return;
            }

            // As DaiMinKan and Pon is availabe to one player at the same time, and their priority is bigger than Chii,
            // perform DaiMinKan and Pon firstly.
            List <EKaze> validKaze = new List <EKaze>();

            foreach (var info in logicOwner.PlayerResponseMap)
            {
                if (info.Value == EResponse.Pon || info.Value == EResponse.DaiMinKan)
                {
                    validKaze.Add(info.Key);
                }
            }

            if (validKaze.Count > 0)
            {
                if (validKaze.Count == 1)
                {
                    EKaze     kaze = validKaze[0];
                    EResponse resp = logicOwner.PlayerResponseMap[kaze];

                    logicOwner.ResetActivePlayer(kaze);

                    switch (resp)
                    {
                    case EResponse.Pon:
                    {
                        logicOwner.Handle_Pon();

                        EventManager.Get().SendEvent(UIEventType.Pon, logicOwner.ActivePlayer, logicOwner.FromKaze);

                        owner.ChangeState <LoopState_AskSelectSuteHai>();
                    }
                    break;

                    case EResponse.DaiMinKan:
                    {
                        logicOwner.Handle_DaiMinKan();

                        EventManager.Get().SendEvent(UIEventType.DaiMinKan, logicOwner.ActivePlayer, logicOwner.FromKaze);

                        if (logicOwner.checkKanCountOverFlow())
                        {
                            logicOwner.Handle_Invalid_RyuuKyoku();     // must.

                            logicOwner.RyuuKyokuReason = ERyuuKyokuReason.KanOver4;
                            owner.ChangeState <LoopState_HandleRyuuKyoKu>();
                        }
                        else
                        {
                            owner.ChangeState <LoopState_PickRinshanHai>();
                        }
                    }
                    break;
                    }
                }
                else
                {
                    throw new MahjongException("More than one player perform Pon or DaiMinKan!?");
                }
            }
            else // no one Pon or DaiMinKan, perform Chii
            {
                foreach (var info in logicOwner.PlayerResponseMap)
                {
                    if (info.Value == EResponse.Chii_Left ||
                        info.Value == EResponse.Chii_Center ||
                        info.Value == EResponse.Chii_Right)
                    {
                        validKaze.Add(info.Key);
                    }
                }

                if (validKaze.Count > 0)
                {
                    if (validKaze.Count == 1)
                    {
                        EKaze     kaze = validKaze[0];
                        EResponse resp = logicOwner.PlayerResponseMap[kaze];

                        logicOwner.ResetActivePlayer(kaze);

                        switch (resp)
                        {
                        case EResponse.Chii_Left:
                        {
                            logicOwner.Handle_ChiiLeft();

                            EventManager.Get().SendEvent(UIEventType.Chii_Left, logicOwner.ActivePlayer, logicOwner.FromKaze);
                        }
                        break;

                        case EResponse.Chii_Center:
                        {
                            logicOwner.Handle_ChiiCenter();

                            EventManager.Get().SendEvent(UIEventType.Chii_Center, logicOwner.ActivePlayer, logicOwner.FromKaze);
                        }
                        break;

                        case EResponse.Chii_Right:
                        {
                            logicOwner.Handle_ChiiRight();

                            EventManager.Get().SendEvent(UIEventType.Chii_Right, logicOwner.ActivePlayer, logicOwner.FromKaze);
                        }
                        break;
                        }

                        owner.ChangeState <LoopState_AskSelectSuteHai>();
                    }
                    else
                    {
                        throw new MahjongException("More than one player perform Chii!?");
                    }
                }
                else // no one handle the sute hai.
                {
                    logicOwner.Handle_SuteHai_Nagashi();

                    owner.ChangeState <LoopState_ToNextLoop>();
                }
            }
        }
    }
Exemplo n.º 29
0
    // handle ui event.
    public void OnHandleEvent(UIEventType evtID, object[] args)
    {
        switch (evtID)
        {
        case UIEventType.Init_Game:     // game init /
        {
            Clear();
            Init();
            HideAllHudPanel();
        }
        break;

        case UIEventType.Select_ChiiCha:
        {
            selectChiiChanPanel.Show();
        }
        break;

        case UIEventType.Init_PlayerInfoUI:
        {
            List <Player> players = Model.PlayerList;
            for (int i = 0; i < players.Count; i++)
            {
                Player   player = players[i];
                PlayerUI ui     = playerUIDict[i];

                ui.SetKaze(player.JiKaze);
                ui.SetTenbou(player.Tenbou);
                ui.Reach(false);

                ui.SetOyaKaze(i == Model.OyaIndex);
                ui.BindPlayer(player);

                if (player.JiKaze == Model.getManKaze())
                {
                    playerInputPanel.BindPlayer(player);
                    playerInputPanel.SetOwnerPlayerUI(ui);
                }
            }
        }
        break;

        case UIEventType.SetYama_BeforeHaipai:
        {
            // Yama.
            Hai[] yamaHais = Model.Yama.getYamaHais();

            for (int i = 0; i < 4; i++)
            {
                Dictionary <int, Hai> haiDict = new Dictionary <int, Hai>();

                int[] indexRange = getStartEndOfYamaUIOfPlayer(i);
                for (int h = indexRange[0]; h <= indexRange[1]; h++)
                {
                    haiDict.Add(h, yamaHais[h]);
                }

                playerUIDict[i].SetYamaHais(haiDict, indexRange[0], indexRange[1]);
            }

            //TestYama();
        }
        break;

        case UIEventType.DisplayKyokuInfo:
        {
            string kyokuStr = (string)args[0];
            string honbaStr = (string)args[1];

            kyokuInfoPanel.Show(kyokuStr, honbaStr);
        }
        break;

        case UIEventType.Select_Wareme:
        {
            Sai[] sais = Model.Saifuri();

            saifuriPanel.Show(sais[0].Num, sais[1].Num);
        }
        break;

        case UIEventType.SetUI_AfterHaipai:     // 配牌 /
        {
            /// set game info.
            gameInfo.SetKyoku(Model.getBaKaze(), Model.Kyoku);
            gameInfo.SetReachCount(Model.ReachBou);
            gameInfo.SetHonba(Model.HonBa);
            gameInfo.SetRemain(Model.getTsumoRemainCount());

            int totalPickHaiCount = (4 * 3 + 1) * Model.PlayerList.Count;

            /// set yama.
            int waremeIndex        = Model.Wareme;
            int tsumoHaiStartIndex = waremeIndex + totalPickHaiCount;

            //Debug.Log(string.Format("remove yamahai in range[{0},{1}]", waremeIndex+1, tsumoHaiStartIndex % Yama.YAMA_HAIS_MAX));

            for (int i = waremeIndex + 1; i <= tsumoHaiStartIndex; i++)
            {
                int        index = i % Yama.YAMA_HAIS_MAX;
                int        p     = findPlayerForYamahaiIndex(index);
                MahjongPai pai   = playerUIDict[p].PickUpYamaHai(index);
                PlayerUI.CollectMahjongPai(pai);
            }

            /// set tehais.
            int PlayerCount = Model.PlayerList.Count;
            for (int i = 0; i < PlayerCount; i++)
            {
                Player player = Model.PlayerList[i];

                PlayerUI ui = playerUIDict[i];

                ui.SetTehai(player.Tehai.getJyunTehai());
                ui.SetTehaiVisiable(!player.IsAI);

                playerUIDict_Kaze[player.JiKaze] = ui;
            }


            /// set init Dora.
            int showIndex = waremeIndex - 5;
            if (showIndex < 0)
            {
                showIndex += Yama.YAMA_HAIS_MAX;
            }

            int pi = findPlayerForYamahaiIndex(showIndex);
            playerUIDict[pi].ShowYamaHai(showIndex);

            // set Wareme.
            showIndex = waremeIndex - 13;
            if (showIndex < 0)
            {
                showIndex += Yama.YAMA_HAIS_MAX;
            }
            pi = findPlayerForYamahaiIndex(showIndex);
            playerUIDict[pi].SetWareme(showIndex);
        }
        break;


        case UIEventType.DisplayMenuList:
        {
            // TODO: shouldn't use Model too frequently

            // if menu is for HandleSuteHai, set sute hai shining.
            if (Model.CurrentRequest == ERequest.Handle_SuteHai &&
                Model.ActivePlayer.Action.MenuList.Count > 0)
            {
                if (hasShining == false)
                {
                    shiningKaze = Model.FromKaze;
                    playerUIDict_Kaze[shiningKaze].SetShining(true);
                    hasShining = true;
                }
            }
            playerInputPanel.Show();
        }
        break;

        case UIEventType.HideMenuList:
        {
            playerInputPanel.Hide();

            // if menu is for HandleSuteHai, set sute hai not shining.
            if (hasShining)
            {
                playerUIDict_Kaze[shiningKaze].SetShining(false);
                hasShining = false;
            }
        }
        break;


        case UIEventType.PickTsumoHai:
        {
            gameInfo.SetRemain(Model.getTsumoRemainCount());

            Player activePlayer  = (Player)args[0];
            int    lastPickIndex = (int)args[1];
            Hai    newHai        = (Hai)args[2];

            int        yamaPlayerIndex = findPlayerForYamahaiIndex(lastPickIndex);
            MahjongPai pai             = playerUIDict[yamaPlayerIndex].PickUpYamaHai(lastPickIndex);
            PlayerUI.CollectMahjongPai(pai);

            PlayerUI playerUI = playerUIDict_Kaze[activePlayer.JiKaze];
            playerUI.PickHai(newHai, true, !activePlayer.IsAI);

            SetManInputEnable(!activePlayer.IsAI && !activePlayer.IsReach);
        }
        break;

        case UIEventType.PickRinshanHai:
        {
            Player activePlayer         = (Player)args[0];
            int    lastPickRinshanIndex = (int)args[1];
            Hai    newHai          = (Hai)args[2];
            int    newDoraHaiIndex = (int)args[3];

            int        yamaPlayerIndex = findPlayerForYamahaiIndex(lastPickRinshanIndex);
            MahjongPai pai             = playerUIDict[yamaPlayerIndex].PickUpYamaHai(lastPickRinshanIndex);
            PlayerUI.CollectMahjongPai(pai);

            PlayerUI playerUI = playerUIDict_Kaze[activePlayer.JiKaze];
            playerUI.PickHai(newHai, true, !activePlayer.IsAI);

            // open a omote dora hai
            int omoteDoraPlayerIndex = findPlayerForYamahaiIndex(newDoraHaiIndex);
            playerUIDict[omoteDoraPlayerIndex].ShowYamaHai(newDoraHaiIndex);

            SetManInputEnable(!activePlayer.IsAI && !activePlayer.IsReach);
        }
        break;

        case UIEventType.SuteHai:
        {
            UIAnimWillEndAfter(SuteHaiAnimationTime);

            Player activePlayer = (Player)args[0];
            int    sutehaiIndex = (int)args[1];
            //Hai suteHai = (Hai)args[2];
            bool isTedashi = (bool)args[3];

            PlayerUI ui = playerUIDict_Kaze[activePlayer.JiKaze];
            ui.SuteHai(sutehaiIndex);
            ui.SetTedashi(isTedashi);

            // needn't sort hais if sute the last one.
            if (sutehaiIndex < activePlayer.Tehai.getJyunTehaiCount())
            {
                ui.SortTehai(activePlayer.Tehai.getJyunTehai(), SuteHaiAnimationTime);
            }

            SetManInputEnable(false);

            // play a sute hai sound
            AudioManager.Get().PlaySFX(AudioConfig.GetSEPath(ESeType.SuteHai));
        }
        break;

        case UIEventType.Reach:
        {
            UIAnimWillEndAfter(ReachAnimationTime);

            Player activePlayer = (Player)args[0];
            int    sutehaiIndex = (int)args[1];
            //Hai suteHai = (Hai)args[2];
            bool isTedashi = (bool)args[3];

            PlayerUI ui = playerUIDict_Kaze[activePlayer.JiKaze];
            ui.SuteHai(sutehaiIndex);
            ui.SetTedashi(isTedashi);
            ui.Reach();

            ui.Speak(ECvType.Reach);

            // needn't sort hais if sute the last one.
            if (sutehaiIndex < activePlayer.Tehai.getJyunTehaiCount())
            {
                ui.SortTehai(activePlayer.Tehai.getJyunTehai(), SuteHaiAnimationTime);
            }

            ui.Info.SetReach(true);
            ui.Info.SetTenbou(activePlayer.Tenbou);
            gameInfo.SetReachCount(Model.ReachBou);

            SetManInputEnable(false);
        }
        break;

        case UIEventType.Kakan:
        {
            UIAnimWillEndAfter(NakiAnimationTime);

            Player activePlayer = (Player)args[0];
            //Hai kakanHai = (Hai)args[1];

            PlayerUI ui = playerUIDict_Kaze[activePlayer.JiKaze];
            ui.UpdateFuuro(activePlayer.Tehai.getFuuros());
            ui.SetTehai(activePlayer.Tehai.getJyunTehai(), true);

            ui.Speak(ECvType.Kan);

            SetManInputEnable(!activePlayer.IsAI);
        }
        break;

        case UIEventType.Ankan:
        {
            UIAnimWillEndAfter(NakiAnimationTime);

            Player activePlayer = (Player)args[0];

            PlayerUI ui = playerUIDict_Kaze[activePlayer.JiKaze];
            ui.UpdateFuuro(activePlayer.Tehai.getFuuros());
            ui.SetTehai(activePlayer.Tehai.getJyunTehai(), true);

            ui.Speak(ECvType.Kan);

            SetManInputEnable(!activePlayer.IsAI);
        }
        break;

        case UIEventType.DaiMinKan:
        {
            UIAnimWillEndAfter(NakiAnimationTime);

            Player activePlayer = (Player)args[0];
            EKaze  fromKaze     = (EKaze)args[1];

            PlayerUI ui = playerUIDict_Kaze[activePlayer.JiKaze];
            ui.UpdateFuuro(activePlayer.Tehai.getFuuros());
            ui.SetTehai(activePlayer.Tehai.getJyunTehai(), true);

            ui.Speak(ECvType.Kan);

            PlayerUI fromUI = playerUIDict_Kaze[fromKaze];
            fromUI.SetNaki();

            SetManInputEnable(!activePlayer.IsAI);
        }
        break;

        case UIEventType.Pon:
        {
            UIAnimWillEndAfter(NakiAnimationTime);

            Player activePlayer = (Player)args[0];
            EKaze  fromKaze     = (EKaze)args[1];

            PlayerUI ui = playerUIDict_Kaze[activePlayer.JiKaze];
            ui.UpdateFuuro(activePlayer.Tehai.getFuuros());
            ui.SetTehai(activePlayer.Tehai.getJyunTehai(), true);

            ui.Speak(ECvType.Pon);

            PlayerUI fromUI = playerUIDict_Kaze[fromKaze];
            fromUI.SetNaki();

            SetManInputEnable(!activePlayer.IsAI);
        }
        break;

        case UIEventType.Chii_Left:
        case UIEventType.Chii_Center:
        case UIEventType.Chii_Right:
        {
            UIAnimWillEndAfter(NakiAnimationTime);

            Player activePlayer = (Player)args[0];
            EKaze  fromKaze     = (EKaze)args[1];

            PlayerUI ui = playerUIDict_Kaze[activePlayer.JiKaze];
            ui.UpdateFuuro(activePlayer.Tehai.getFuuros());
            ui.SetTehai(activePlayer.Tehai.getJyunTehai(), true);

            ui.Speak(ECvType.Chii);

            PlayerUI fromUI = playerUIDict_Kaze[fromKaze];
            fromUI.SetNaki();

            SetManInputEnable(!activePlayer.IsAI);
        }
        break;

        case UIEventType.Ron_Agari:
        {
            UIAnimWillEndAfter(AgariAnimationTime);

            List <EKaze> ronPlayers = (List <EKaze>)args[0];
            EKaze        fromKaze   = (EKaze)args[1];
            Hai          ronHai     = (Hai)args[2];

            for (int i = 0; i < ronPlayers.Count; i++)
            {
                PlayerUI ui = playerUIDict_Kaze[ronPlayers[i]];
                ui.PickHai(ronHai, true, false);
                ui.SetTehaiVisiable(true);

                ui.Speak(ECvType.Ron);
            }

            PlayerUI fromUI = playerUIDict_Kaze[fromKaze];
            fromUI.SetNaki();

            // show out all players' tehai
            ShowAllPlayerTehai();
        }
        break;

        case UIEventType.Tsumo_Agari:
        {
            UIAnimWillEndAfter(AgariAnimationTime);

            Player activePlayer = (Player)args[0];

            PlayerUI ui = playerUIDict_Kaze[activePlayer.JiKaze];
            ui.SetTehaiVisiable(true);

            ui.Speak(ECvType.Tsumo);

            // show out all players' tehai
            ShowAllPlayerTehai();
        }
        break;

        case UIEventType.Display_Agari_Panel:
        {
            List <AgariUpdateInfo> agariList = (List <AgariUpdateInfo>)args[0];
            agariPanel.Show(agariList);
        }
        break;

        case UIEventType.RyuuKyoku:
        {
            ERyuuKyokuReason       reason    = (ERyuuKyokuReason)args[0];
            List <AgariUpdateInfo> agariList = (List <AgariUpdateInfo>)args[1];

            ShowAllPlayerTehai();

            ryuuKyokuPanel.Show(reason, agariList);
        }
        break;

        case UIEventType.End_Game:
        {
            List <AgariUpdateInfo> agariList = (List <AgariUpdateInfo>)args[0];
            gameOverPanel.Show(agariList);
        }
        break;
        }
    }
Exemplo n.º 30
0
 // player info.
 public void SetKaze(EKaze kaze)
 {
     playerInfo.SetKaze(kaze);
 }