public void Handle(CardPlayedEvent cardPlayedEvent, GameState gameState) { //2. Declare round variables var currentRound = gameState.GetCurrentRound(); var setOfPlays = currentRound.ThePlay; //3. Set new Round before play, if necessary var currentPlayRound = setOfPlays.Last(); //int playCount = _args.ScoreCalculator.SumValues(currentPlayRound.Select(scs => scs.Card).Append(_args.PlayedCard)); //if (playCount > GameState.Rules.PlayMaxScore) //{ // var playerPlayItems = new List<PlayerPlayItem>(); // setOfPlays.Add(playerPlayItems); // currentPlayRound = playerPlayItems; //} //4. Card is played var playerCardPlayedScore = new PlayerPlayItem { Card = new Card(cardPlayedEvent.Played), Player = cardPlayedEvent.PlayerId }; currentPlayRound.Add(playerCardPlayedScore); var playScore = _scoreCalculator.CountThePlay(currentPlayRound.Select(psc => psc.Card).ToList()); //currentPlayerScore.Score += playScore; //create new round var playedCards = setOfPlays.SelectMany(c => c).Select(spc => spc.Card); var playsLeft = gameState.GetCurrentRound().Hands.SelectMany(kv => kv.Hand).Except(playedCards, CardValueEquality.Instance); if (playsLeft.All(c => _scoreCalculator.SumValues(currentPlayRound.Select(spc => spc.Card).Append(c)) > GameRules.PlayMaxScore)) { //add Go Value. not counted if 31 as was included with ScoreCalculation.CountThePlay int playCountNew = _scoreCalculator.SumValues(currentPlayRound.Select(ppi => ppi.Card)); if (playCountNew != GameRules.PlayMaxScore) { var goValue = _scoreCalculator.GoValue; playScore += goValue; } //not done playing, so add new play round setOfPlays.Add(new List<PlayerPlayItem>()); } var currentPlayerScore = gameState.IndividualScores.Single(ps => ps.Player == cardPlayedEvent.PlayerId); var currentTeamScore = gameState.TeamScores.Single(ps => ps.Players.Contains(cardPlayedEvent.PlayerId)); playerCardPlayedScore.NextPlayer = FindNextPlayer(gameState, cardPlayedEvent.PlayerId); playerCardPlayedScore.Score += playScore; currentPlayerScore.Score += playScore; currentTeamScore.Score += playScore; //5. Check if done with Play bool isDone = setOfPlays.SelectMany(c => c).Select(spc => spc.Card).Count() == gameState.PlayerIds.Count * GameRules.HandSize; currentRound.PlayedCardsComplete = isDone; }
public void PlayCard(int playerId, Card card) { var validation = new CardPlayedEventValidation(); var @event = new CardPlayedEvent { GameId = State.Id, Played = card, PlayerId = playerId, }; validation.Validate(State, @event); Stream.Add(@event); if (State.GetCurrentRound().PlayedCardsComplete) { Stream.Add(new PlayFinishedEvent { GameId = State.Id, Round = State.GetCurrentRound().Round }); } }