示例#1
0
        public void FindGame(SEplayer _seplayer)
        {
            SEARCHING   = true;
            Game        = new MMgame();
            preGame     = new MMgame();
            seplayer    = _seplayer;
            Info        = "Connecting ...";
            Serverbadge = "badge-success";
            Serverinfo  = "Online";
            Info       += " LetmePlay ..";
            _time       = TimeSpan.FromSeconds(1);
            //var result = DSrest.LetmePlay(seplayer);
            var result = _mmrep.LetmePlay(seplayer).Result;

            if (result == null)
            {
                Reset();
            }
            else
            {
                MyELO = Math.Round(result.EXP, 2);
                Info  = "Searching ...";
                Task.Run(() => { Searching(); });
            }
        }
示例#2
0
        List <BasePlayer> GameList(MMgame game)
        {
            List <BasePlayer> ilist = new List <BasePlayer>();

            ilist.AddRange(game.Team1);
            ilist.AddRange(game.Team2);
            return(ilist);
        }
示例#3
0
 public void GameFound(MMgame game)
 {
     GAMEFOUND = true;
     MMID      = game.ID;
     //SP.Play();
     ALL_DECLINED = false;
     ALL_ACCEPTED = false;
     ACCEPTED     = false;
     DECLINED     = false;
     Task.Run(() => { Accept(game.ID); });
     Lobby.Clear();
 }
示例#4
0
 public void Save(MMgame game)
 {
     Task.Factory.StartNew(() =>
     {
         try
         {
             var json = JsonConvert.SerializeObject(game, Formatting.Indented);
             File.WriteAllText(WorkDir + "/games/" + game.ID + "_found.json", json);
         }
         catch
         {
             _logger.LogError("Failed writing found game " + game.ID);
         }
     });
 }
示例#5
0
        public static MMgame RateGame(List <MMplayer> t1, List <MMplayer> t2)
        {
            int i     = 0;
            var team1 = new Team();
            var team2 = new Team();

            foreach (var pl in t1)
            {
                team1.AddPlayer(new Player(i), new Rating(pl.MU, pl.SIGMA));
                pl.Games++;
                i++;
            }
            foreach (var pl in t2)
            {
                team2.AddPlayer(new Player(i), new Rating(pl.MU, pl.SIGMA));
                pl.Games++;
                i++;
            }

            var gameInfo = GameInfo.DefaultGameInfo;
            var teams    = Teams.Concat(team1, team2);
            var newRatingsWinLoseExpected = TrueSkillCalculator.CalculateNewRatings(gameInfo, teams, 1, 2);

            MMgame game = new MMgame();

            i = 0;
            foreach (var pl in team1.AsDictionary().Keys)
            {
                var res = newRatingsWinLoseExpected[pl];
                t1[i].EXP   = res.ConservativeRating;
                t1[i].MU    = res.Mean;
                t1[i].SIGMA = res.StandardDeviation;
                game.Team1.Add(new BasePlayer(t1[i]));
                i++;
            }
            i = 0;
            foreach (var pl in team2.AsDictionary().Keys)
            {
                var res = newRatingsWinLoseExpected[pl];
                t2[i].EXP   = res.ConservativeRating;
                t2[i].MU    = res.Mean;
                t2[i].SIGMA = res.StandardDeviation;
                game.Team2.Add(new BasePlayer(t2[i]));
                i++;
            }

            return(game);
        }
示例#6
0
        public void GameReady(MMgame game)
        {
            Reset();
            Game = game;
            MMGameReady.TryAdd(Game.ID, Game);
            MMID   = Game.ID;
            Server = Game.Server;

            string mypos   = "";
            string creator = "Player1";

            int    j     = 0;
            int    games = 0;
            string mmid  = game.ID.ToString();

            foreach (var pl in game.GetPlayers())
            {
                j++;
                if (pl.Name == seplayer.Name)
                {
                    mypos = "Player" + j;
                }
                if (pl.Games > games)
                {
                    creator = "Player" + j;
                    games   = pl.Games;
                }
            }

            if (creator == mypos.ToString())
            {
                Info = "Game found! You have been elected to be the lobby creator. Please open your Starcraft 2 client on the " + game.Server + " server and create a private Direct Strike Lobby. " +
                       "Join the Channel sc2dsmm by typing ‘/join sc2dsmm’ in the Starcraft 2 chat and post the lobby link combined with the MMID by typing ‘/lobbylink " +
                       mmid + "’ (without the quotes). Have fun! :)";
            }
            else
            {
                Info = "Game found! Player " + creator + " has been elected to be the lobby creator. Please open your Starcraft 2 client on the " + game.Server + " server and join the Channel" +
                       " sc2dsmm by typing ‘/join sc2dsmm’ in the Starcraft 2 chat. Wait for the lobby link combined with the MMID " +
                       mmid + " and click on it. Have fun! :)";
            }
        }
示例#7
0
        public void Save(MMgame game, dsreplay replay)
        {
            Task.Factory.StartNew(() =>
            {
                try
                {
                    var json = JsonConvert.SerializeObject(game, Formatting.Indented);
                    if (!File.Exists(WorkDir + "/games/" + game.ID + "_report.json"))
                    {
                        File.WriteAllText(WorkDir + "/games/" + game.ID + "_report.json", json);
                    }
                }
                catch
                {
                    _logger.LogError("Failed writing report game " + game.ID);
                }

                replay.GenHash();
                ReplayHash.Add(replay.HASH);
                try
                {
                    var json           = JsonConvert.SerializeObject(replay, Formatting.Indented);
                    string replay_file = WorkDir + "/games/" + game.ID + "_replay.json";
                    int i = 1;
                    while (File.Exists(replay_file))
                    {
                        replay_file = WorkDir + "/games/" + game.ID + "_replay_" + i.ToString() + ".json";
                        i++;
                    }
                    File.WriteAllText(replay_file, json);
                }
                catch
                {
                    _logger.LogError("Failed writing report replay " + game.ID);
                }
            });
        }
示例#8
0
        public static async Task <MMgame> GenMatch(List <MMplayer> qplayers, int size)
        {
            List <MMplayer> result = new List <MMplayer>();
            int             c      = 0;

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

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

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

            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 <MMplayer> thisresult = new List <MMplayer>(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)
                    {
                        if (i < result.Count() / 2)
                        {
                            team1.AddPlayer(new Player(i), new Rating(pl.MU, pl.SIGMA));
                        }
                        else
                        {
                            team2.AddPlayer(new Player(i), new Rating(pl.MU, pl.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 <MMplayer>(thisresult);
                    }

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

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

                return game;
            }));
        }
示例#9
0
        public async Task <MMgame> Report(dsreplay replay, string id)
        {
            MMgame mmgame = new MMgame();
            int    gid    = int.Parse(id);

            if (Replays.ContainsKey(gid))
            {
                Replays[gid].Add(replay);
            }
            else
            {
                Replays.TryAdd(gid, new ConcurrentBag <dsreplay>());
                Replays[gid].Add(replay);
            }
            Save(Games[gid], replay);
            lock (Games)
            {
                if (Games.ContainsKey(gid))
                {
                    if (Games[gid].Reported == true)
                    {
                        return(Games[gid]);
                    }
                }

                replay.GenHash();
                if (ReplayHash.Contains(replay.HASH))
                {
                    //return null;
                }
                else
                {
                    ReplayHash.Add(replay.HASH);
                }

                List <MMplayer> team1 = new List <MMplayer>();
                List <MMplayer> team2 = new List <MMplayer>();
                foreach (var pl in replay.PLAYERS)
                {
                    MMplayer mmpl = new MMplayer();
                    if (MMplayers.ContainsKey(pl.NAME))
                    {
                        mmpl = MMplayers[pl.NAME];
                    }
                    else
                    {
                        mmpl.Name = "Dummy";
                    }

                    if (pl.TEAM == replay.WINNER)
                    {
                        team1.Add(mmpl);
                    }
                    else
                    {
                        team2.Add(mmpl);
                    }
                }
                MMgame repgame = new MMgame();
                repgame          = MMrating.RateGame(team1, team2);
                repgame.ID       = Games[gid].ID;
                repgame.Quality  = Games[gid].Quality;
                repgame.Server   = Games[gid].Server;
                repgame.Reported = true;
                Games[gid]       = repgame;
            }
            Save();
            return(Games[gid]);
        }
示例#10
0
        MMgame CheckLobby(ConcurrentDictionary <MMplayer, byte> lobby)
        {
            int lobbysize = 0;

            if (lobby.Count > 0)
            {
                lobbysize = lobby.Keys.First().Lobbysize;
            }

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

            if (rng.Count() >= 2 && lobby.Count < lobbysize && minticks > Minticks)
            {
                int i = 0;
                while (lobby.Count < lobbysize)
                {
                    i++;
                    MMplayer mm = new MMplayer();
                    mm.Name      = "Random" + i;
                    mm.Ticks     = Minticks * 3 + 1;
                    mm.Accepted  = true;
                    mm.Lobbysize = lobbysize;
                    lobby.TryAdd(mm, 0);
                }
            }

            MMgame game = new MMgame();

            lock (lobby)
            {
                if (lobbysize > 0 && lobby.Count >= lobbysize)
                {
                    if (minticks > Minticks || lobby.Count > lobbysize)
                    {
                        _logger.LogInformation("Generating Matchup .. " + minticks);
                        game = GenMatchup(lobby, lobbysize).Result;
                        if (game != null)
                        {
                            Interlocked.Increment(ref MMID);
                            game.ID = MMID;
                            _logger.LogInformation("Game found: {0} ({1}) ", MMID, lobby.Count);

                            Save(game);
                            byte zero = 0;
                            var  dic  = GameList(game).ToDictionary(x => new MMplayer(x), x => zero);

                            Dictionary <string, int> Server = new Dictionary <string, int>();
                            foreach (var pl in GameList(game))
                            {
                                Match m = rx_rng.Match(pl.Name);
                                if (m.Success)
                                {
                                    continue;
                                }
                                lock (MMplayers[pl.Name])
                                {
                                    MMplayers[pl.Name].Game  = game;
                                    MMplayers[pl.Name].Lobby = new ConcurrentDictionary <MMplayer, byte>(dic);
                                }
                                lobby.TryRemove(MMplayers[pl.Name], out zero);

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

                                if (!Server.ContainsKey(MMplayers[pl.Name].Server))
                                {
                                    Server.Add(MMplayers[pl.Name].Server, 1);
                                }
                                else
                                {
                                    Server[MMplayers[pl.Name].Server]++;
                                }
                            }
                            game.Server = Server.OrderByDescending(o => o.Value).First().Key;
                            Games.TryAdd(MMID, game);
                        }
                    }
                }
                // fail safe
                foreach (var ent in lobby.Keys)
                {
                    Match m    = rx_rng.Match(ent.Name);
                    byte  zero = 0;
                    if (m.Success)
                    {
                        lobby.TryRemove(ent, out zero);
                    }
                }
            }
            return(game);
        }
示例#11
0
        public void Accept(int id)
        {
            MMgame game = new MMgame();

            while (ALL_ACCEPTED == false && ALL_DECLINED == false)
            {
                Thread.Sleep(500);
                Info = "Waiting for all players to accept ...";
                //game = DSrest.Status(id);
                game    = _mmrep.Status(id.ToString()).Result;
                preGame = game;
                if (game == null)
                {
                    //Console.WriteLine("game = null {0} => ({1})", seplayer.Name, id);
                    if (DECLINED == false && ACCEPTED == true)
                    {
                        ALL_DECLINED = true;
                        Info         = "# Game not found :( - Searching again ..";
                        Thread.Sleep(2500);
                        GAMEFOUND = false;
                        Task.Run(() => { Searching(); });
                        return;
                    }
                }
                else if (game.Declined == true)
                {
                    //Console.WriteLine("game = declined {0} => {1} ({2})", seplayer.Name, game.ID, id);
                    List <BasePlayer> ilist = new List <BasePlayer>();
                    ilist.AddRange(game.Team1);
                    ilist.AddRange(game.Team2);
                    Lobby.Clear();
                    foreach (var pl in ilist)
                    {
                        Lobby.TryAdd(pl.Name, pl.Accepted);
                    }
                    Thread.Sleep(1500);
                    if (DECLINED == false && ACCEPTED == true)
                    {
                        ALL_DECLINED = true;

                        Info = "# Someone declined :( - Searching again ..";
                        Thread.Sleep(2500);
                        GAMEFOUND = false;
                        Task.Run(() => { Searching(); });
                        return;
                    }
                }
                else
                {
                    //Console.WriteLine("Some accepted = true {0} => {1} ({2})", seplayer.Name, game.ID, id);
                    List <BasePlayer> ilist = new List <BasePlayer>();
                    ilist.AddRange(game.Team1);
                    ilist.AddRange(game.Team2);
                    Lobby.Clear();
                    foreach (var pl in ilist)
                    {
                        Lobby.TryAdd(pl.Name, pl.Accepted);
                    }

                    if (game.Accepted == true)
                    {
                        GAMEFOUND = false;
                        Lobby.Clear();
                        Info         = "Game ready!";
                        ALL_ACCEPTED = true;
                        GameReady(game);
                        return;
                    }
                }

                if (Done > 100)
                {
                    Reset();
                }
                else if (Done > 85)
                {
                    if (ACCEPTED == false)
                    {
                        Declined();
                    }
                }

                if (DECLINED == true)
                {
                    Info      = "We declined/timed out :(";
                    GAMEFOUND = false;
                    //DSrest.Decline(seplayer.Name, MMID);
                    _mmrep.Decline(seplayer.Name, MMID.ToString());
                    ALL_DECLINED = true;
                }

                Thread.Sleep(500);
                _time = _time.Add(TimeSpan.FromSeconds(0.5));
                Done += 1.428571429;
                Done += 1.428571429;
            }
        }