Esempio n. 1
0
 public async Task SaveRace(MMgameNG game)
 {
     // /**
     using (var _db = new MMdb(_mmdb))
     {
         foreach (var pl in game.GetPlayers())
         {
             var dbpl = _db.MMdbRaces.Where(x => x.Name == pl.Name).FirstOrDefault();
             if (dbpl != null)
             {
                 foreach (var rat in pl.Rating[game.Lobby].Where(x => x.Db == false).OrderBy(o => o.Games).ToArray())
                 {
                     MMdbRaceRating dbrat;
                     dbrat            = new MMdbRaceRating();
                     dbrat.EXP        = rat.EXP;
                     dbrat.Games      = rat.Games;
                     dbrat.Lobby      = game.Lobby;
                     dbrat.MU         = rat.MU;
                     dbrat.SIGMA      = rat.SIGMA;
                     dbrat.MMdbRaceId = dbpl.MMdbRaceId;
                     dbrat.MMdbRace   = dbpl;
                     dbrat.Time       = rat.Time;
                     rat.Db           = true;
                     _db.MMdbRaceRatings.Add(dbrat);
                     //dbpl.MMdbRaceRatings.Add(dbrat);
                 }
             }
         }
         await _db.SaveChangesAsync();
     }
     // **/
 }
Esempio n. 2
0
        async Task Save(MMgameNG game)
        {
            string output = WorkDir + "/games/" + game.ID + "_found.json";

            using (FileStream fs = File.Create(output))
            {
                await JsonSerializer.SerializeAsync(fs, game);
            }
        }
Esempio n. 3
0
        public async Task Save(MMgameNG game)
        {
            // /**
            foreach (var pl in game.GetPlayers())
            {
                if (pl.Name.StartsWith("Random") || pl.Name.StartsWith("Dummy"))
                {
                    continue;
                }
                var dbpl = _db.MMdbPlayers.Where(x => x.Name == pl.Name).FirstOrDefault();
                if (dbpl != null)
                {
                    var dbrat = _db.MMdbRatings.Where(x => x.MMdbPlayerId == dbpl.MMdbPlayerId && x.Lobby == game.Lobby).FirstOrDefault();
                    if (dbrat == null)
                    {
                        dbrat = new MMdbRating();
                    }
                    var rat = pl.Rating[game.Lobby];
                    dbrat.EXP          = rat.EXP;
                    dbrat.Games        = rat.Games;
                    dbrat.Lobby        = game.Lobby;
                    dbrat.MU           = rat.MU;
                    dbrat.SIGMA        = rat.SIGMA;
                    dbrat.MMdbPlayerId = dbpl.MMdbPlayerId;
                    dbrat.MMdbPlayer   = dbpl;

                    if (dbrat.MMdbRatingId == null)
                    {
                        dbpl.MMdbRatings.Add(dbrat);
                    }
                    //_db.MMdbRatings.Add(dbrat);
                    else
                    {
                        _db.MMdbRatings.Update(dbrat);
                    }
                }
            }
            await _db.SaveChangesAsync();

            // **/
            string output = Program.workdir + "/games/" + game.ID + "_report.json";

            if (!File.Exists(output))
            {
                using (FileStream fs = File.Create(output))
                {
                    await JsonSerializer.SerializeAsync(fs, game);
                }
            }
        }
Esempio n. 4
0
        public async Task Save(MMgameNG game)
        {
            // /**
            using (var _db = new MMdb(_mmdb))
            {
                foreach (var pl in game.GetPlayers())
                {
                    if (pl.Name.StartsWith("Random") || pl.Name.StartsWith("Dummy"))
                    {
                        continue;
                    }
                    var dbpl = _db.MMdbPlayers.Where(x => x.Name == pl.Name).FirstOrDefault();
                    if (dbpl != null)
                    {
                        var dbrat = _db.MMdbRatings.Where(x => x.MMdbPlayerId == dbpl.MMdbPlayerId && x.Lobby == game.Lobby).FirstOrDefault();
                        if (dbrat == null)
                        {
                            dbrat = new MMdbRating();
                        }
                        var rat = pl.Rating[game.Lobby];
                        dbrat.EXP          = rat.EXP;
                        dbrat.Games        = rat.Games;
                        dbrat.Lobby        = game.Lobby;
                        dbrat.MU           = rat.MU;
                        dbrat.SIGMA        = rat.SIGMA;
                        dbrat.MMdbPlayerId = dbpl.MMdbPlayerId;
                        dbrat.MMdbPlayer   = dbpl;

                        if (dbrat.MMdbRatingId == null)
                        {
                            dbpl.MMdbRatings.Add(dbrat);
                        }
                        //_db.MMdbRatings.Add(dbrat);
                        else
                        {
                            _db.MMdbRatings.Update(dbrat);
                        }
                    }
                }
                await _db.SaveChangesAsync();
            }
            // **/
        }
Esempio n. 5
0
        public async Task <int> CheckValid(dsreplay replay, MMgameNG game)
        {
            int valid = 0;

            return(await Task.Run(() =>
            {
                HashSet <string> game_Names = game.GetPlayers().Select(s => s.Name).ToHashSet();
                foreach (dsplayer dspl in replay.PLAYERS)
                {
                    if (game_Names.Contains(dspl.NAME))
                    {
                        valid++;
                        int rep_team = dspl.TEAM + 1;
                        List <MMplayerNG> game_team = new List <MMplayerNG>();
                        if (game.Team1.Select(s => s.Name == dspl.NAME).Count() > 0)
                        {
                            game_team = game.Team1;
                        }
                        else
                        {
                            game_team = game.Team2;
                        }

                        foreach (dsplayer tdspl in replay.PLAYERS.Where(x => x.TEAM == dspl.TEAM))
                        {
                            if (tdspl.NAME == dspl.NAME)
                            {
                                continue;
                            }
                            if (game_Names.Contains(tdspl.NAME))
                            {
                                if (game_team.Where(x => x.Name == tdspl.NAME).Count() > 0)
                                {
                                    valid++;
                                }
                            }
                        }
                    }
                }
                return valid;
            }));
        }
Esempio n. 6
0
        public async Task Save(MMgameNG game)
        {
            // /**
            foreach (var pl in game.GetPlayers())
            {
                if (pl.Name.StartsWith("Random") || pl.Name.StartsWith("Dummy"))
                {
                    continue;
                }
                var dbpl = _startUp._db.MMdbPlayers.Where(x => x.Name == pl.Name).FirstOrDefault();
                if (dbpl != null)
                {
                    foreach (var rat in pl.Rating[game.Lobby].Where(x => x.Db == false).OrderBy(o => o.Time).ToArray())
                    {
                        MMdbRating dbrat = new MMdbRating();
                        dbrat.EXP          = rat.EXP;
                        dbrat.Games        = rat.Games;
                        dbrat.Lobby        = game.Lobby;
                        dbrat.MU           = rat.MU;
                        dbrat.SIGMA        = rat.SIGMA;
                        dbrat.MMdbPlayerId = dbpl.MMdbPlayerId;
                        dbrat.MMdbPlayer   = dbpl;
                        rat.Db             = true;
                        _startUp._db.MMdbRatings.Add(dbrat);
                    }
                }
            }
            await _startUp._db.SaveChangesAsync();

            // **/
            string output = Program.workdir + "/games/" + game.ID + "_report.json";

            if (!File.Exists(output))
            {
                using (FileStream fs = File.Create(output))
                {
                    await JsonSerializer.SerializeAsync(fs, game);
                }
            }
        }
Esempio n. 7
0
        public async Task SaveRace(MMgameNG game)
        {
            // /**
            foreach (var pl in game.GetPlayers())
            {
                var dbpl = _db.MMdbRaces.Where(x => x.Name == pl.Name).FirstOrDefault();
                if (dbpl != null)
                {
                    var dbrat = _db.MMdbRaceRatings.Where(x => x.MMdbRaceId == dbpl.MMdbRaceId && x.Lobby == game.Lobby).FirstOrDefault();
                    if (dbrat == null)
                    {
                        dbrat = new MMdbRaceRating();
                    }
                    var rat = pl.Rating[game.Lobby];
                    dbrat.EXP        = rat.EXP;
                    dbrat.Games      = rat.Games;
                    dbrat.Lobby      = game.Lobby;
                    dbrat.MU         = rat.MU;
                    dbrat.SIGMA      = rat.SIGMA;
                    dbrat.MMdbRaceId = dbpl.MMdbRaceId;
                    dbrat.MMdbRace   = dbpl;

                    if (dbrat.MMdbRaceRatingId == null)
                    {
                        dbpl.MMdbRaceRatings.Add(dbrat);
                    }
                    else
                    {
                        _db.MMdbRaceRatings.Update(dbrat);
                    }
                }
            }
            await _db.SaveChangesAsync();

            // **/
        }
Esempio n. 8
0
        public static MMgameNG RateGame(Team team1, Team team2, string lobby, StartUp _mm, bool cmdr = false)
        {
            var gameInfo = GameInfo.DefaultGameInfo;
            var teams    = Teams.Concat(team1, team2);
            var newRatingsWinLoseExpected = TrueSkillCalculator.CalculateNewRatings(gameInfo, teams, 1, 2);

            MMgameNG game = new MMgameNG();

            game.Lobby = lobby;
            int i = 0;

            foreach (var pl in team1.AsDictionary().Keys)
            {
                var        res   = newRatingsWinLoseExpected[pl];
                string     name  = pl.Id.ToString();
                MMplayerNG mpl   = new MMplayerNG();
                MMPlRating plrat = new MMPlRating();
                if (_mm.MMplayers.ContainsKey(name))
                {
                    mpl      = _mm.MMplayers[name];
                    plrat    = mpl.Rating[lobby].LastOrDefault().ShallowCopy();
                    plrat.Db = false;
                }
                else
                {
                    mpl.Name = "Dummy" + i;
                }

                if (cmdr == true)
                {
                    mpl      = _mm.MMraces[name];
                    plrat    = mpl.Rating[lobby].LastOrDefault().ShallowCopy();
                    plrat.Db = false;
                }

                double temp = plrat.EXP;
                plrat.EXP     = res.ConservativeRating;
                mpl.ExpChange = plrat.EXP - temp;
                plrat.MU      = res.Mean;
                plrat.SIGMA   = res.StandardDeviation;
                plrat.Games++;
                plrat.Time = DateTime.UtcNow;
                mpl.Rating[lobby].Add(plrat);
                game.Team1.Add(mpl);
                i++;
            }
            foreach (var pl in team2.AsDictionary().Keys)
            {
                var        res   = newRatingsWinLoseExpected[pl];
                string     name  = pl.Id.ToString();
                MMplayerNG mpl   = new MMplayerNG();
                MMPlRating plrat = new MMPlRating();
                if (_mm.MMplayers.ContainsKey(name))
                {
                    mpl      = _mm.MMplayers[name];
                    plrat    = mpl.Rating[lobby].LastOrDefault().ShallowCopy();
                    plrat.Db = false;
                }
                else
                {
                    mpl.Name = "Dummy" + i;
                }

                if (cmdr == true)
                {
                    mpl      = _mm.MMraces[name];
                    plrat    = mpl.Rating[lobby].LastOrDefault().ShallowCopy();
                    plrat.Db = false;
                }

                double temp = plrat.EXP;
                plrat.EXP     = res.ConservativeRating;
                mpl.ExpChange = plrat.EXP - temp;
                plrat.MU      = res.Mean;
                plrat.SIGMA   = res.StandardDeviation;
                plrat.Games++;
                plrat.Time = DateTime.UtcNow;
                mpl.Rating[lobby].Add(plrat);
                game.Team2.Add(mpl);
                i++;
            }

            return(game);
        }
Esempio n. 9
0
        public static async Task <MMgameNG> GenMatch(List <MMplayerNG> qplayers, int size)
        {
            List <MMplayerNG> result = new List <MMplayerNG>();
            int c = 0;

            List <MMplayerNG> players = new List <MMplayerNG>();

            players = qplayers.Where(x => x.Game.ID == 0).ToList();

            if (players.Count < size)
            {
                return(null);
            }

            string lobby = players.First().Mode + players.First().Mode2 + players.First().Ladder;

            double bestquality = 0;

            return(await Task.Run(() => {
                while (true)
                {
                    c++;
                    int i = 0;
                    var team1 = new Team();
                    var team2 = new Team();

                    var rnd = new Random();
                    List <MMplayerNG> thisresult = new List <MMplayerNG>(players.Select(x => new { value = x, order = rnd.Next() })
                                                                         .OrderBy(x => x.order).Select(x => x.value).Take(size).ToList());


                    foreach (var pl in thisresult)
                    {
                        MMPlRating plrat = pl.Rating[lobby].LastOrDefault();
                        if (plrat == null)
                        {
                            plrat = new MMPlRating();
                            pl.Rating[lobby].Add(plrat);
                        }
                        if (i < result.Count() / 2)
                        {
                            team1.AddPlayer(new Player(i), new Rating(plrat.MU, plrat.SIGMA));
                        }
                        else
                        {
                            team2.AddPlayer(new Player(i), new Rating(plrat.MU, plrat.SIGMA));
                        }
                        i++;
                    }

                    var gameInfo = GameInfo.DefaultGameInfo;
                    var teams = Teams.Concat(team1, team2);

                    double thisquality = TrueSkillCalculator.CalculateMatchQuality(gameInfo, teams);

                    if (thisquality > bestquality)
                    {
                        bestquality = thisquality;
                        result = new List <MMplayerNG>(thisresult);
                    }

                    if (c > 10 && bestquality > 0.5)
                    {
                        break;
                    }
                    if (c > 50 && bestquality > 0.4)
                    {
                        break;
                    }
                    if (c > 200)
                    {
                        break;
                    }
                }

                MMgameNG game = new MMgameNG();
                game.Quality = bestquality;
                game.ID = 1;
                int j = 0;
                foreach (var pl in result)
                {
                    if (j < result.Count() / 2)
                    {
                        game.Team1.Add(pl);
                    }
                    else
                    {
                        game.Team2.Add(pl);
                    }
                    j++;
                }

                return game;
            }));
        }
Esempio n. 10
0
        async Task <MMgameNG> CheckLobby(ObservableCollection <MMplayerNG> lobby, int lobbysize)
        {
            MMgameNG game = new MMgameNG();

            var rng      = lobby.Where(x => x.Random == true);
            int minticks = lobby.OrderBy(o => o.Ticks).First().Ticks;

            if (rng.Count() >= 2)
            {
                if (lobby.Count < lobbysize && minticks > Minticks)
                {
                    int i = 0;
                    while (lobby.Count < lobbysize)
                    {
                        i++;
                        MMplayerNG mm = new MMplayerNG();
                        mm.Name     = "Random" + i;
                        mm.Ticks    = Minticks * 3 + 1;
                        mm.Accepted = true;
                        lobby.Add(mm);
                    }
                }
            }
            if (lobby.Count >= lobbysize)
            {
                if (minticks > Minticks || lobby.Count > lobbysize)
                {
                    _logger.LogInformation("Generating Matchup .. " + minticks);
                    game = await MMrating.GenMatch(lobby.ToList(), lobbysize);

                    if (game != null)
                    {
                        Interlocked.Increment(ref MMID);
                        game.ID = MMID;
                        var temp_pl = game.GetPlayers().FirstOrDefault();
                        game.Lobby = temp_pl.Mode + temp_pl.Mode2 + temp_pl.Ladder;
                        _logger.LogInformation("Game found: {0} ({1}) ", MMID, lobby.Count);

                        Dictionary <string, int> Server = new Dictionary <string, int>();
                        foreach (var pl in game.GetPlayers())
                        {
                            Match m = rx_rng.Match(pl.Name);
                            if (m.Success)
                            {
                                continue;
                            }
                            lock (_startUp.MMplayers[pl.Name])
                            {
                                _startUp.MMplayers[pl.Name].Game = game;
                            }

                            lock (lobby)
                            {
                                lobby.Remove(_startUp.MMplayers[pl.Name]);

                                if (lobby.Count == 0)
                                {
                                    int p = 0;
                                    foreach (var ent in Lobbies.Values)
                                    {
                                        if (ent != null && ent.Count > 0)
                                        {
                                            p++;
                                        }
                                    }
                                    if (p == 0)
                                    {
                                        LobbyCheck = false;
                                    }
                                }
                            }

                            if (!Server.ContainsKey(_startUp.MMplayers[pl.Name].Server))
                            {
                                Server.Add(_startUp.MMplayers[pl.Name].Server, 1);
                            }
                            else
                            {
                                Server[_startUp.MMplayers[pl.Name].Server]++;
                            }
                        }
                        game.Server                 = Server.OrderByDescending(o => o.Value).First().Key;
                        game.State.GameID           = game.ID;
                        game.State.PropertyChanged += GameChanged;
                        lock (Games)
                        {
                            Games[game.ID] = game;
                        }
                    }
                }
            }

            return(game);
        }