private void RegistrerNyPostSynkront(string deltakerId, string lagId, string postkode, string bruktVåpen) { var matchId = _currentMatchProvider.GetMatchId(); using (var context = _dataContextFactory.Create()) { using (var transaction = context.Database.BeginTransaction()) { try { if (string.IsNullOrEmpty(postkode)) { return; } postkode = postkode.Trim(); var lagIMatch = (from lm in context.LagIMatch.Include(x => x.Lag) where lm.Lag.LagId == lagId && lm.Match.MatchId == matchId select lm).SingleOrDefault(); if (lagIMatch == null) { return; } var post = (from pim in context.PosterIMatch.Include(x => x.Post).Include(x => x.Match) where pim.Post.HemmeligKode == postkode && pim.Match.MatchId == matchId select pim).SingleOrDefault(); if (post == null) { _eventPublisher.PrøvdeÅRegistrereEnPostMedFeilKode(lagId, deltakerId); return; // Feil kode eller post - straff? } if (!post.ErSynlig) { _eventPublisher.PrøvdeÅRegistrereEnPostSomIkkeErSynlig(lagId, deltakerId); } else { if (context.PostRegisteringer.Any(x => x.RegistertForLag.Id == lagIMatch.Id && x.RegistertPost.Id == post.Id)) { _eventPublisher.AlleredeRegistrert(lagId, deltakerId); return; // Allerede registrert post denne matchen } var deltaker = context.Deltakere.Single(x => x.DeltakerId == deltakerId); var poeng = post.HentPoengOgInkrementerIndex(); if (!string.IsNullOrEmpty(post.RiggetVåpen)) { poeng = KjørRiggedeVåpenOgReturnerPoeng(post, poeng, bruktVåpen, lagId, deltakerId); bruktVåpen = null; // bruker ikke eget våpen når felle går av } else { _eventPublisher.PoengScoret(lagId, deltakerId, poeng); } lagIMatch.PoengSum += poeng; var registrering = new PostRegistrering { PoengForRegistrering = poeng, RegistertForLag = lagIMatch, RegistrertAvDeltaker = deltaker, RegistertPost = post, BruktVaapenId = bruktVåpen, RegistertTidspunkt = TimeService.Now }; context.PostRegisteringer.Add(registrering); if (!string.IsNullOrEmpty(bruktVåpen)) { var brukt = (from v in context.VåpenBeholdning where v.VaapenId == bruktVåpen && v.LagIMatchId == lagIMatch.Id && v.BruktIPostRegistrering == null select v).FirstOrDefault(); // Har prøvd å bruke noe laget ikke har if (brukt != null) { brukt.BruktIPostRegistrering = registrering; if (bruktVåpen == Constants.Våpen.Bombe) { post.SynligFraTid = TimeService.Now.AddSeconds(_settings.PostSkjulesISekunderEtterVåpen); _eventPublisher.BrukteBombe(lagId, deltakerId); } if (bruktVåpen == Constants.Våpen.Felle) { post.RiggetVåpen = Constants.Våpen.Felle; post.RiggetVåpenParam = lagId; _eventPublisher.RiggetEnFelle(lagId, deltakerId); } } } } context.SaveChanges(); transaction.Commit(); } catch (Exception) { transaction.Rollback(); throw; } } } _gameState.Calculate(); }
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 } }