public static IPlayer ExtractWinner(IReplay replay)
        {
            IList <IPlayer> players = new List <IPlayer>(replay.Players);

            foreach (IAction action in replay.Actions)
            {
                if (action.ActionType == ActionType.LeaveGame)
                {
                    LeaveGameAction a = (LeaveGameAction)action;
                    switch (a.LeaveGameType)
                    {
                    case LeaveGameType.Dropped:
                        return(null);

                    case LeaveGameType.Quit:
                        players.Remove(a.Player);
                        break;

                    default:
                        throw new InvalidOperationException();
                    }
                }
            }

            if (players.Count() == 1)
            {
                return(players[0]);
            }

            return(null);
        }
Exemple #2
0
        public async Task Handle(LeaveGameAction action, IDispatcher dispatcher)
        {
            if (ServerState.Value.Status != ServerStatus.Connected || ServerState.Value.GameServer is null)
            {
                return;
            }

            var response = await ServerState.Value.GameServer.LeaveGame();

            if (response is not null && response.ErrorMessage is not null)
            {
                dispatcher.Dispatch(new AddToast(new Toast("Oops, something when wrong!", response.ErrorMessage)));
            }
        }
Exemple #3
0
        private void CheckIdle(object state)
        {
            foreach (var key in _lastRegisteredActivity.Keys)
            {
                if (_lastRegisteredActivity.TryGetValue(key, out var dateTime) && (DateTimeOffset.UtcNow - dateTime).TotalMinutes >= 5)
                {
                    if (!_lastRegisteredActivity.TryRemove(key, out _))
                    {
                        continue;
                    }

                    var game   = _gameAccessor.Game;
                    var player = game.Players.FirstOrDefault(p => p.Id.Equals(key));
                    if (player is null)
                    {
                        continue;
                    }

                    var gameAction = new LeaveGameAction(player);

                    _gameManager.PerformAction(gameAction, ref game);
                }
            }
        }
Exemple #4
0
        //public static IPlayer ExtractWinner(IReplay replay)
        //{
        //    IList<IPlayer> players = new List<IPlayer>(replay.Players);

        //    foreach (IAction action in replay.Actions) {

        //        if (action.ActionType == ActionType.LeaveGame) {

        //            LeaveGameAction a = (LeaveGameAction)action;
        //            switch (a.LeaveGameType) {
        //                case LeaveGameType.Dropped:
        //                    return null;

        //                case LeaveGameType.Quit:
        //                    players.Remove(a.Player);
        //                    break;
        //                default:
        //                    throw new InvalidOperationException();
        //            }
        //        }
        //    }

        //    if (players.Count() == 1) {
        //        return players[0];
        //    }

        //    return null;
        //}


        //  What about OBSERVERS?? They don't have to leave the game or don't get dropped before it ends?? Do they remain in the players list??
        // yes observers stay in the list... Have to find a way to remove them, how?
        public static IEnumerable <IPlayer> ExtractWinners(IReplay replay)
        {
            IList <IPlayer> players   = new List <IPlayer>(replay.Players);
            IList <IPlayer> observers = new List <IPlayer>(replay.Observers);

            foreach (IAction action in replay.Actions)
            {
                if (action.ActionType == ActionType.LeaveGame)
                {
                    LeaveGameAction a = (LeaveGameAction)action;
                    switch (a.LeaveGameType)
                    {
                    case LeaveGameType.Dropped:
                        players.Remove(a.Player);
                        // once I get player teams to work, I have to only add this to players of the other team obviously...
                        foreach (var aPlayer in players)
                        {
                            aPlayer.OpponentDropped = true;
                        }
                        break;

                    case LeaveGameType.Quit:
                        players.Remove(a.Player);
                        break;

                    default:
                        players.Remove(a.Player);
                        break;
                        // why throw an exception if the actiontype has been identified to be leavegame? Maybe there are other possible values for the type of leavegame action...
                        //throw new InvalidOperationException();
                    }
                }
                //if (action.ActionType == ActionType.Build)
                //{
                //    BuildAction a = (BuildAction)action;
                //    if (a.Player.IsObserver == null)
                //    {
                //        a.Player.IsObserver = false;
                //    }
                //}
            }
            // your code for IsObserver doesn't make much sense, it's not remembered past this function!!
            if (players.Count() == 0)
            {
                return(players.AsEnumerable());
            }
            //for (int i = players.Count - 1; i >= 0; i--)
            //{
            //    if (players[i].IsObserver == null)
            //    {
            //        players[i].IsObserver = true;
            //        players.RemoveAt(i);
            //    }
            //}
            for (int i = players.Count - 1; i >= 0; i--)
            {
                if (observers.Contains(players[i]))
                {
                    players.RemoveAt(i);
                }
            }
            if (players.Count() == 0)
            {
                return(players.AsEnumerable());
            }
            // should be ExtractWinnerSSSS => what about 2v2, 3v3, 4v4 !!?
            return(players.AsEnumerable <IPlayer>());
        }