public MatchState(Guid matchId, Dictionary <string, GameStateForLag> gamestates, ScoreboardState scoreboard, DateTime?gyldigInntil) { MatchId = matchId; _gamestates = gamestates; _scoreboard = scoreboard; _gyldigInntil = gyldigInntil ?? DateTime.MaxValue; }
public MatchState(Guid matchId, Dictionary<string, GameStateForLag> gamestates, ScoreboardState scoreboard, DateTime? gyldigInntil) { MatchId = matchId; _gamestates = gamestates; _scoreboard = scoreboard; _gyldigInntil = gyldigInntil ?? DateTime.MaxValue; }
public void Calculate() { var matchId = _currentMatchProvider.GetMatchId(); //using (With.ReadUncommitted()) using (var context = _dataContextFactory.Create()) { var sorterteLag = context.LagIMatch.Include(x => x.Lag.Deltakere).Include(x => x.VåpenBeholdning).Include("Våpenbeholdning.BruktIPostRegistrering") .Where(x => x.Match.MatchId == matchId) .OrderByDescending(x => x.PoengSum) .ToList(); // Legg på poeng fra Achievements var achievementsPoeng = from a in context.Achievements group a by a.LagId into g select new { LagId = g.Key, Poeng = g.Sum(x => x.Score), Achievements = g }; foreach (var lagPoeng in achievementsPoeng) { var p = lagPoeng; var lag = sorterteLag.Single(x => x.Lag.LagId == p.LagId); lag.PoengSum += p.Poeng; } var poster = (from p in context.PosterIMatch.Include(x => x.Post) where p.Match.MatchId == matchId select new TempPost { PostId = p.Post.PostId, Latitude = p.Post.Latitude, Longitude = p.Post.Longitude, CurrentPoengIndex = p.CurrentPoengIndex, PoengArray = p.PoengArray, Navn = p.Post.Navn, ErSynlig = p.SynligFraTid < TimeService.Now && TimeService.Now < p.SynligTilTid, SynligFra = p.SynligFraTid, SynligTil = p.SynligTilTid, RiggetMedVåpen = p.RiggetVåpen }).ToList(); var postRegistreringer = (from l in context.LagIMatch from p in l.PostRegistreringer where l.Match.MatchId == matchId select new { PostId = p.RegistertPost.Post.PostId, LagIMatchId = p.RegistertForLag.Id, Poeng = p.PoengForRegistrering, Deltaker = p.RegistrertAvDeltaker }).ToList(); var rankedeLag = (from l in sorterteLag select new { Id = l.Id, Lag = l.Lag, Rank = sorterteLag.Count(x => x.PoengSum > l.PoengSum) + 1, PoengSum = l.PoengSum, LagIMatch = l }).OrderBy(x => x.Rank).ToList(); var poengsummer = (from l in rankedeLag select l.PoengSum).Distinct().OrderByDescending(x => x).ToList(); var nyGameState = new Dictionary<string, GameStateForLag>(); var random = new Random(); foreach (var lag in rankedeLag) { var egenPoengIndex = poengsummer.IndexOf(lag.PoengSum); var poengForover = egenPoengIndex == 0 ? lag.PoengSum : poengsummer[egenPoengIndex - 1]; var poengBakover = egenPoengIndex == poengsummer.Count - 1 ? lag.PoengSum : poengsummer[egenPoengIndex + 1]; var state = new GameStateForLag { LagId = lag.Lag.LagId, LagNavn = lag.Lag.Navn, LagFarge = lag.Lag.Farge, LagIkon = lag.Lag.Ikon, Score = lag.PoengSum, Ranking = new GameStateRanking { Rank = lag.Rank, PoengBakLagetForan = poengForover - lag.PoengSum, PoengForanLagetBak = lag.PoengSum - poengBakover, }, Poster = (from p in poster.Where(x => x.ErSynlig) join r in postRegistreringer.Where(x => x.LagIMatchId == lag.Id) on p.PostId equals r.PostId into j from reg in j.DefaultIfEmpty() select new GameStatePost { PostId = p.PostId.ToString(), Navn = p.Navn, Latitude = p.Latitude, Longitude = p.Longitude, PoengVerdi = reg != null ? reg.Poeng : PostIMatch.BeregnPoengForNesteRegistrering(p.PoengArray, p.CurrentPoengIndex), HarRegistrert = reg != null, }).OrderBy(x => x.Navn).ToList(), Vaapen = lag.LagIMatch.VåpenBeholdning.Where(x => x.BruktIPostRegistrering == null).Select(x => new GameStateVaapen { VaapenId = x.VaapenId }).ToList(), Deltakere = lag.Lag.Deltakere.Select(x => new GameStateDeltaker { DeltakerId = x.DeltakerId, Navn = x.Navn }).ToList(), Achievements = new List<GameStateAchievement>()//achievementsPoeng.Where(x => x.LagId == lag.Lag.LagId).Select(x => x.Achievements) }; nyGameState.Add(state.LagId, state); } var scoreboard = new ScoreboardState(); scoreboard.Poster = (from p in poster select new ScoreboardPost { PostId = p.PostId.ToString(), Latitude = p.Latitude, Longitude = p.Longitude, ErSynlig = p.ErSynlig, Navn = p.Navn, Verdi = PostIMatch.BeregnPoengForNesteRegistrering(p.PoengArray, p.CurrentPoengIndex), AntallRegistreringer = postRegistreringer.Count(x => x.PostId == p.PostId), SynligFra = p.SynligFra, RiggetMedVåpen = p.RiggetMedVåpen }).OrderBy(x => x.Navn).ToList(); scoreboard.Lag = sorterteLag.Select(l => new ScoreboardLag { LagId = l.Lag.LagId, LagNavn = l.Lag.Navn, LagFarge = l.Lag.Farge, Score = l.PoengSum, Ranking = sorterteLag.Count(x => x.PoengSum > l.PoengSum) + 1, AntallRegistreringer = postRegistreringer.Count(x => x.LagIMatchId == l.Id) }).ToList(); var deltakerPoeng = postRegistreringer .GroupBy(p => p.Deltaker.DeltakerId) .Select(g => new { DeltakerId = g.Key, Navn = g.First().Deltaker.Navn, LagIMatchId = g.First().LagIMatchId, AntallRegistreringer = g.Count(), Poengsum = g.Sum(x => x.Poeng) }).ToList(); scoreboard.Deltakere = (from p in deltakerPoeng join l in sorterteLag on p.LagIMatchId equals l.Id select new ScoreboardDeltaker { DeltakerId = p.DeltakerId, Navn = p.Navn, AntallRegistreringer = p.AntallRegistreringer, Score = p.Poengsum, LagId = l.Lag.LagId, LagFarge = l.Lag.Farge, LagIkon = l.Lag.Ikon, LagNavn = l.Lag.Navn, MostValueablePlayerRanking = deltakerPoeng.Count(x => x.Poengsum > p.Poengsum) + 1 }).OrderByDescending(x => x.MostValueablePlayerRanking).ToList(); var førsteTidspunktEtterNå = (from p in poster from t in p.Tider where t > TimeService.Now select t).Union(new[] { DateTime.MaxValue }).Min(); scoreboard.Match = LagScoreboardMatchInfo(context, matchId); // swap current state _matchStates[matchId] = new MatchState(matchId, nyGameState, scoreboard, førsteTidspunktEtterNå); // IKKE SAVE CHANGES } }
public void Calculate() { var matchId = _currentMatchProvider.GetMatchId(); //using (With.ReadUncommitted()) using (var context = _dataContextFactory.Create()) { var sorterteLag = context.LagIMatch.Include(x => x.Lag.Deltakere).Include(x => x.VåpenBeholdning).Include("Våpenbeholdning.BruktIPostRegistrering") .Where(x => x.Match.MatchId == matchId) .OrderByDescending(x => x.PoengSum) .ToList(); // Legg på poeng fra Achievements var achievementsPoeng = from a in context.Achievements group a by a.LagId into g select new { LagId = g.Key, Poeng = g.Sum(x => x.Score), Achievements = g }; foreach (var lagPoeng in achievementsPoeng) { var p = lagPoeng; var lag = sorterteLag.Single(x => x.Lag.LagId == p.LagId); lag.PoengSum += p.Poeng; } var poster = (from p in context.PosterIMatch.Include(x => x.Post) where p.Match.MatchId == matchId select new TempPost { PostId = p.Post.PostId, Latitude = p.Post.Latitude, Longitude = p.Post.Longitude, CurrentPoengIndex = p.CurrentPoengIndex, PoengArray = p.PoengArray, Navn = p.Post.Navn, ErSynlig = p.SynligFraTid < TimeService.Now && TimeService.Now < p.SynligTilTid, SynligFra = p.SynligFraTid, SynligTil = p.SynligTilTid, RiggetMedVåpen = p.RiggetVåpen }).ToList(); var postRegistreringer = (from l in context.LagIMatch from p in l.PostRegistreringer where l.Match.MatchId == matchId select new { PostId = p.RegistertPost.Post.PostId, LagIMatchId = p.RegistertForLag.Id, Poeng = p.PoengForRegistrering, Deltaker = p.RegistrertAvDeltaker }).ToList(); var rankedeLag = (from l in sorterteLag select new { Id = l.Id, Lag = l.Lag, Rank = sorterteLag.Count(x => x.PoengSum > l.PoengSum) + 1, PoengSum = l.PoengSum, LagIMatch = l }).OrderBy(x => x.Rank).ToList(); var poengsummer = (from l in rankedeLag select l.PoengSum).Distinct().OrderByDescending(x => x).ToList(); var nyGameState = new Dictionary <string, GameStateForLag>(); var random = new Random(); foreach (var lag in rankedeLag) { var egenPoengIndex = poengsummer.IndexOf(lag.PoengSum); var poengForover = egenPoengIndex == 0 ? lag.PoengSum : poengsummer[egenPoengIndex - 1]; var poengBakover = egenPoengIndex == poengsummer.Count - 1 ? lag.PoengSum : poengsummer[egenPoengIndex + 1]; var state = new GameStateForLag { LagId = lag.Lag.LagId, LagNavn = lag.Lag.Navn, LagFarge = lag.Lag.Farge, LagIkon = lag.Lag.Ikon, Score = lag.PoengSum, Ranking = new GameStateRanking { Rank = lag.Rank, PoengBakLagetForan = poengForover - lag.PoengSum, PoengForanLagetBak = lag.PoengSum - poengBakover, }, Poster = (from p in poster.Where(x => x.ErSynlig) join r in postRegistreringer.Where(x => x.LagIMatchId == lag.Id) on p.PostId equals r.PostId into j from reg in j.DefaultIfEmpty() select new GameStatePost { PostId = p.PostId.ToString(), Navn = p.Navn, Latitude = p.Latitude, Longitude = p.Longitude, PoengVerdi = reg != null ? reg.Poeng : PostIMatch.BeregnPoengForNesteRegistrering(p.PoengArray, p.CurrentPoengIndex), HarRegistrert = reg != null, }).OrderBy(x => x.Navn).ToList(), Vaapen = lag.LagIMatch.VåpenBeholdning.Where(x => x.BruktIPostRegistrering == null).Select(x => new GameStateVaapen { VaapenId = x.VaapenId }).ToList(), Deltakere = lag.Lag.Deltakere.Select(x => new GameStateDeltaker { DeltakerId = x.DeltakerId, Navn = x.Navn }).ToList(), Achievements = new List <GameStateAchievement>()//achievementsPoeng.Where(x => x.LagId == lag.Lag.LagId).Select(x => x.Achievements) }; nyGameState.Add(state.LagId, state); } var scoreboard = new ScoreboardState(); scoreboard.Poster = (from p in poster select new ScoreboardPost { PostId = p.PostId.ToString(), Latitude = p.Latitude, Longitude = p.Longitude, ErSynlig = p.ErSynlig, Navn = p.Navn, Verdi = PostIMatch.BeregnPoengForNesteRegistrering(p.PoengArray, p.CurrentPoengIndex), AntallRegistreringer = postRegistreringer.Count(x => x.PostId == p.PostId), SynligFra = p.SynligFra, RiggetMedVåpen = p.RiggetMedVåpen }).OrderBy(x => x.Navn).ToList(); scoreboard.Lag = sorterteLag.Select(l => new ScoreboardLag { LagId = l.Lag.LagId, LagNavn = l.Lag.Navn, LagFarge = l.Lag.Farge, Score = l.PoengSum, Ranking = sorterteLag.Count(x => x.PoengSum > l.PoengSum) + 1, AntallRegistreringer = postRegistreringer.Count(x => x.LagIMatchId == l.Id) }).ToList(); var deltakerPoeng = postRegistreringer .GroupBy(p => p.Deltaker.DeltakerId) .Select(g => new { DeltakerId = g.Key, Navn = g.First().Deltaker.Navn, LagIMatchId = g.First().LagIMatchId, AntallRegistreringer = g.Count(), Poengsum = g.Sum(x => x.Poeng) }).ToList(); scoreboard.Deltakere = (from p in deltakerPoeng join l in sorterteLag on p.LagIMatchId equals l.Id select new ScoreboardDeltaker { DeltakerId = p.DeltakerId, Navn = p.Navn, AntallRegistreringer = p.AntallRegistreringer, Score = p.Poengsum, LagId = l.Lag.LagId, LagFarge = l.Lag.Farge, LagIkon = l.Lag.Ikon, LagNavn = l.Lag.Navn, MostValueablePlayerRanking = deltakerPoeng.Count(x => x.Poengsum > p.Poengsum) + 1 }).OrderByDescending(x => x.MostValueablePlayerRanking).ToList(); var førsteTidspunktEtterNå = (from p in poster from t in p.Tider where t > TimeService.Now select t).Union(new[] { DateTime.MaxValue }).Min(); scoreboard.Match = LagScoreboardMatchInfo(context, matchId); // swap current state _matchStates[matchId] = new MatchState(matchId, nyGameState, scoreboard, førsteTidspunktEtterNå); // IKKE SAVE CHANGES } }