示例#1
0
        /// <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;
            }
        }
示例#2
0
        /// <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;
        }