/// <summary> /// 試合開始までの待機中に通信などの処理を行う関数 /// </summary> /// <param name="_source"></param> /// <param name="_e"></param> /// <param name="isHost"></param> /// <param name="data"></param> private static void WaitStartMatchTask(object _source, ElapsedEventArgs _e, bool isHost, CommonData data) { var matchKey = data.RoomName; if (isHost) { state = (data.MatchManager.CanStartMatch(data.PlayerNum)) ? State.SugorokuFrameInitBefore : State.WaitMatchStart; if (state == State.SugorokuFrameInitBefore) { data.MatchManager.CloseJoinMatch(); } } else { state = (data.MatchManager.IsMatchStarted()) ? State.SugorokuFrameInitBefore : State.WaitMatchStart; } if (state == State.SugorokuFrameInitBefore) { WaitEventTimer.Stop(); var(r, matchStr) = data.MatchManager.GetMatchInfoString(); data.MatchInfoStr = "" + matchStr; for (int i = 0; !r; i++) { Task.Delay(5000); (r, matchStr) = data.MatchManager.GetMatchInfoString(); data.MatchInfoStr = "" + matchStr; if (i > 5) { state = State.Error; return; } } data.MatchInfo = JsonConvert.DeserializeObject <MatchInfo>(matchStr); PlayingEventTimer.Interval = 4000; PlayingEventTimer.AutoReset = true; PlayingEventTimer.Enabled = true; PlayingEventTimer.Elapsed += (o, e) => PlayingMatchTask(o, e, data); PlayingEventTimer.Start(); state = State.SugorokuFrameInit; } }
/// <summary> /// 試合中の通信の処理などを行う関数 /// </summary> /// <param name="_source"></param> /// <param name="_e"></param> /// <param name="data">各シーンで共用する変数</param> private static void PlayingMatchTask(object _source, ElapsedEventArgs _e, CommonData data) { if (isProcessingPlayingEvent) { return; } var(r, matchStr) = data.MatchManager.GetMatchString(); data.MatchInfoStr = matchStr + ""; if (!r) { return; } isProcessingPlayingEvent = true; // ダイスを投げる要求を行う if (JsonConvert.DeserializeObject <MatchInfo>(matchStr).NextPlayerID == data.Player.PlayerID) { PlayingEventTimer.Stop(); Task.Delay(4000); PlayingEventTimer.Start(); var(status, dice, start, end, rank) = data.MatchManager.ThrowDice(); switch (status) { case ReflectionStatus.NextSuccess: case ReflectionStatus.PrevDiceSuccess: data.PlayerEvents.Enqueue(new PlayerMoveEvent(start, end, JsonConvert.DeserializeObject <MatchInfo>(matchStr).NextPlayerID, dice)); break; case ReflectionStatus.AlreadyFinished: data.Ranking = new List <int>(rank); IsGoal = true; state = State.Goal; break; case ReflectionStatus.NotYourTurn: break; default: state = State.Error; break; } } var infoStr = data.MatchManager.GetMatchString(); if (infoStr.Item1 && !infoStr.Item2.Equals(matchStr)) { var eventList = data.MatchManager.ReverseEvent(matchStr, infoStr.Item2, data.Player.PlayerID); for (var i = 0; i < eventList.Count; i++) { data.PlayerEvents.Enqueue(eventList[i]); } data.MatchInfoStr = infoStr.Item2 + ""; data.MatchInfo = JsonConvert.DeserializeObject <MatchInfo>(data.MatchInfoStr); } foreach (var player in JsonConvert.DeserializeObject <MatchInfo>(infoStr.Item2).Players) { if (player.Position == 30) { IsGoal = true; state = State.Goal; } } if (state == State.Goal || state == State.Error || IsGoal) { PlayingEventTimer.Stop(); var(ret, rank) = data.MatchManager.GetRanking(); if (ret) { data.Ranking = new List <int>(rank); } else { state = State.Error; } PlayingEventTimer.Enabled = false; isProcessingPlayingEvent = false; PlayingEventTimer.Dispose(); } isProcessingPlayingEvent = false; }