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()); }
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)); }
// 打哪些牌可以立直. public bool tryGetReachHaiIndex(Tehai a_tehai, Hai tsumoHai, out List <int> haiIndexList) { haiIndexList = new List <int>(); // 鳴いている場合は、リーチできない。x //if( a_tehai.isNaki() ) // return false; /// find all reach-enabled hais in a_tehai, also the tsumoHai. _reachHaiList.Clear(); // As _jyunTehais won't sort automatically on new hais added, // so we can add tsumo hai directly to simplify the checks. Tehai tehai_copy = new Tehai(a_tehai); tehai_copy.addJyunTehai(tsumoHai); tehai_copy.Sort(); Hai[] jyunTehai = tehai_copy.getJyunTehai(); for (int i = 0; i < jyunTehai.Length; i++) { Hai haiTemp = tehai_copy.removeJyunTehaiAt(i); for (int id = Hai.ID_MIN; id <= Hai.ID_MAX; id++) { countFormat.setCounterFormat(tehai_copy, new Hai(id)); if (countFormat.calculateCombisCount(combis) > 0) { _reachHaiList.Add(new Hai(haiTemp)); break; } } tehai_copy.insertJyunTehai(i, haiTemp); } /// transfer to index list. if (_reachHaiList.Count > 0) { jyunTehai = a_tehai.getJyunTehai(); for (int i = 0; i < _reachHaiList.Count; i++) { for (int j = 0; j < jyunTehai.Length; j++) { if (jyunTehai[j].ID == _reachHaiList[i].ID && !haiIndexList.Contains(j)) { haiIndexList.Add(j); } } if (tsumoHai.ID == _reachHaiList[i].ID && !haiIndexList.Contains(jyunTehai.Length)) { haiIndexList.Add(jyunTehai.Length); } } haiIndexList.Sort(); return(true); } return(false); }