protected override EResponse OnSelect_SuteHai(EKaze fromPlayerKaze, Hai haiToHandle) { _action.Reset(); _action.State = EActionState.Select_Sutehai; return(DisplayMenuList()); }
// -----------------------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); }
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); }
protected override EResponse OnSelect_SuteHai(EKaze fromPlayerKaze, Hai haiToHandle) { _action.Reset(); thinkSelectSuteHai(); return(DoResponse(EResponse.SuteHai)); }
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 = "(玩家)"; }
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); }
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); }
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(); } }
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(); } }
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(); } }
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; } }
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); }
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; } } }
protected abstract EResponse OnHandle_KakanHai(EKaze fromPlayerKaze, Hai haiToHandle);
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_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)); }
public void SetKyoku(EKaze kaze, int kyoku) { string kazeStr = ResManager.getString("kaze_" + kaze.ToString().ToLower()); kyokuLab.text = kazeStr + " " + kyoku.ToString() + "局"; }
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)); }
// get player index from kaze. public int getPlayerIndex(EKaze kaze) { return(m_playerList.FindIndex((p) => p.JiKaze == kaze)); }
// get player from kaze. public Player getPlayer(EKaze kaze) { return(m_playerList.Find((p) => p.JiKaze == kaze)); }
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; } } }
public void setBakaze(EKaze bakaze) { _baKaze = bakaze; }
public void setJikaze(EKaze jikaze) { _jiKaze = jikaze; }
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)); }
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>(); } } } }
// 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; } }
// player info. public void SetKaze(EKaze kaze) { playerInfo.SetKaze(kaze); }