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(); }); } }
List <BasePlayer> GameList(MMgame game) { List <BasePlayer> ilist = new List <BasePlayer>(); ilist.AddRange(game.Team1); ilist.AddRange(game.Team2); return(ilist); }
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(); }
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); } }); }
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); }
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! :)"; } }
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); } }); }
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; })); }
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]); }
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); }
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; } }