public async Task <MatchResult> RunMatch()
        {
            if (MatchController == null)
            {
                throw new InvalidOperationException("Cannot run match without a match controller");
            }

            Debug.Log("Starting cooldown...");
            CurrentProgressionID = MatchProgressionState.Intro;
            await Mediator.Global.PublishAsync(new MatchStartCountdownEvent
            {
                MatchConfig = Config,
                MatchState  = MatchController.CurrentState
            });

            Debug.Log("Running match...");
            CurrentProgressionID = MatchProgressionState.InGame;
            MatchTask            = new TaskCompletionSource <MatchResult>();
            Mediator.Global.Publish(new MatchStartEvent {
                MatchConfig = Config,
                MatchState  = MatchController.CurrentState
            });

            // TODO(james7132): Properly evaluate the match result here.
            var result = await MatchTask.Task;
            await Mediator.Global.PublishAsync(new MatchEndEvent {
                MatchConfig = Config,
                MatchState  = MatchController.CurrentState
            });

            CurrentProgressionID = MatchProgressionState.End;
            return(result);
        }
示例#2
0
        public void Deserialize(Deserializer deserializer)
        {
            var mask = deserializer.ReadByte();

            PlayerCount  = mask & 15;
            playerStates = ArrayPool <PlayerState> .Shared.Rent(PlayerCount);

            for (var i = 0; i < PlayerCount; i++)
            {
                var state = new PlayerState();
                if ((mask & (1 << (i + 4))) != 0)
                {
                    state.Deserialize(deserializer);
                }
                SetPlayerState(i, state);
            }
            StateID = (MatchProgressionState)deserializer.ReadByte();
        }
        public void SetPaused(bool paused)
        {
            if (!IsLocal)
            {
                return;
            }

            var  pauseID = paused ? MatchProgressionState.Pause : MatchProgressionState.InGame;
            bool changed = pauseID != CurrentProgressionID;

            CurrentProgressionID = pauseID;
            if (changed)
            {
                Mediator.Global.Publish(new MatchPauseStateChangedEvent {
                    MatchConfig = Config,
                    MatchState  = MatchController.CurrentState,
                    Paused      = paused
                });
            }
        }