public DomainResult ProgressMatch(PlayerProgression playerProgression) { if (!_isStarted) { return(DomainResult.Error(new MatchDidNotStartYet())); } if (_isFinished) { return(DomainResult.Error(new MatchAllreadyFinished())); } var playerIsNotInHomeOrGuestTeam = !HomeTeamPlayers.Contains(playerProgression.PlayerId) && !GuestTeamPlayers.Contains(playerProgression.PlayerId); if (playerIsNotInHomeOrGuestTeam) { return(DomainResult.Error(new PlayerWasNotPartOfTheTeamWhenStartingTheMatch(playerProgression.PlayerId))); } var playerProgressions = PlayerProgressions.Append(playerProgression); var gameResult = CreateGameResult(playerProgressions); var matchResultUploaded = new MatchProgressed(MatchId, playerProgression, gameResult); return(DomainResult.Ok(matchResultUploaded)); }
private List <MatchEventModel> CreateEvents() { var events = new List <MatchEventModel>(); foreach (var e in Events) { if (e.Type != EventType.A) { var eventModel = new MatchEventModel { Id = e.Id }; if (e.TeamId == HomeTeam.Id) { eventModel.Player = HomeTeamPlayers.Where(p => p.Id == e.PlayerId).First(); eventModel.ViewType = 0; } else { eventModel.Player = AwayTeamPlayers.Where(p => p.Id == e.PlayerId).First(); eventModel.ViewType = 1; } if (e.Type == EventType.P2 || e.Type == EventType.P10) { eventModel.ResourceId = Resource.Drawable.ic_numeric_2_box_grey600_24dp; } else { if (e.Type == EventType.P5) { eventModel.ResourceId = Resource.Drawable.ic_numeric_2_box_grey600_24dp; } else { if (e.Type == EventType.G) { eventModel.ResourceId = Resource.Drawable.ball; eventModel.IsGoal = true; var assist = Events.FirstOrDefault(a => a.Time == e.Time && a.Type == EventType.A); if (assist != null) { var player = assist.TeamId == HomeTeam.Id ? HomeTeamPlayers.Where(p => p.Id == e.PlayerId).First() : AwayTeamPlayers.Where(p => p.Id == e.PlayerId).First(); eventModel.Assist = new MatchEventModel { ResourceId = Resource.Drawable.ball, Player = player }; } } } } eventModel.Time = e.Time; eventModel.EventMessage = EventMessages.First(em => em.Id == e.EventMessageId); events.Add(eventModel); } } return(events); }
private void LogTeams(Coordinate ballPosition) { var height = 120; var width = 25; var homePlayers = new int?[width, height]; var awayPlayers = new int?[width, height]; HomeTeamPlayers.Execute(p => homePlayers[(int)(p.Location.X * width), (int)(p.Location.Y * height)] = p.Number); AwayTeamPlayers.Execute(p => awayPlayers[(int)(p.Location.X * width), (int)(p.Location.Y * height)] = p.Number); var ballX = (int)(ballPosition.X * width); var ballY = (int)(ballPosition.Y * height); var stringBuilder = new StringBuilder("\n"); stringBuilder.AppendLine(string.Join("", Enumerable.Repeat("_", homePlayers.GetLength(1)).ToArray())); for (var i = 0; i < homePlayers.GetLength(0); ++i) { for (var j = 0; j < homePlayers.GetLength(1); ++j) { if (j == 0 || j == homePlayers.GetLength(1) - 1) { stringBuilder.Append("|"); } if (homePlayers[i, j].HasValue) { var adjust = i == ballX && j == ballY ? 1 : 0; var prepend = i == ballX && j == ballY ? "*_" : "_"; stringBuilder.Append(prepend + homePlayers[i, j]); j = homePlayers[i, j] >= 10 ? j + 2 + adjust : j + 1 + adjust; continue; } else if (awayPlayers[i, j].HasValue) { var adjust = i == ballX && j == ballY ? 1 : 0; var prepend = i == ballX && j == ballY ? "*|" : "|"; stringBuilder.Append("|" + awayPlayers[i, j]); j = awayPlayers[i, j] >= 10 ? j + 2 + adjust : j + 1 + adjust; continue; } stringBuilder.Append(" "); } stringBuilder.AppendLine(); } stringBuilder.AppendLine(string.Join("", Enumerable.Repeat("_", homePlayers.GetLength(1)).ToArray())); Log(stringBuilder.ToString()); }
public void Play(IFixture fixture, Action <double, double[, ]> updateUi) { HeatMap = new double[Configuration.HeatMapDimensions.Item1, Configuration.HeatMapDimensions.Item2]; if (PlayerMatch) { updateUi(0.5d, null); } var ballPosition = new Coordinate { X = 0.5d, Y = 0.5d }; var kickoff = DateTime.Now; PlayerMatch = updateUi != null; PhasesOfPlay = 0; if (PlayerMatch) { updateUi(0.5d, HeatMap); Thread.Sleep(5000); } LogTeam(Side.Home); LogRatingBattle(Side.Home); LogTeam(Side.Away); LogRatingBattle(Side.Away); LogRatingBattle(); fixture.PlayingPeriod = PlayingPeriod.FirstHalf; PlayHalf(fixture, updateUi); fixture.PlayingPeriod = PlayingPeriod.HalfTime; HeatMap = new double[Configuration.HeatMapDimensions.Item1, Configuration.HeatMapDimensions.Item2]; if (PlayerMatch) { updateUi(HomeTouches / (HomeTouches + AwayTouches), null); Thread.Sleep(5000); } PhasesOfPlay = 0; fixture.PlayingPeriod = PlayingPeriod.SecondHalf; var temp = HomeGoal; HomeGoal = AwayGoal; AwayGoal = temp; // Switching sides at halftime is covered by the ViewModel bound animation. // Non-player matches have to do this here. if (!PlayerMatch) { HomeTeamPlayers.Concat(AwayTeamPlayers).Execute(p => p.Location.Invert()); } TeamFormationAttributes.SecondHalf(); PlayHalf(fixture, updateUi); fixture.PlayingPeriod = PlayingPeriod.FullTime; }
private int CountTouchDownsHome(IEnumerable <PlayerProgression> trainerResults) { return(trainerResults.Count(playerProgression => HomeTeamPlayers.Contains(playerProgression.PlayerId) && playerProgression.ProgressionEvent == ProgressionEvent.PlayerMadeTouchdown)); }