public MatchState(Guid matchId, Dictionary <string, GameStateForLag> gamestates, ScoreboardState scoreboard, DateTime?gyldigInntil)
 {
     MatchId       = matchId;
     _gamestates   = gamestates;
     _scoreboard   = scoreboard;
     _gyldigInntil = gyldigInntil ?? DateTime.MaxValue;
 }
Пример #2
0
 public MatchState(Guid matchId, Dictionary<string, GameStateForLag> gamestates, ScoreboardState scoreboard, DateTime? gyldigInntil)
 {
     MatchId = matchId;
     _gamestates = gamestates;
     _scoreboard = scoreboard;
     _gyldigInntil = gyldigInntil ?? DateTime.MaxValue;
 }
Пример #3
0
        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
            }
        }