public HandleResult HandleTurn(PlayerTurnModel model) { _cityDomain.BushelsCount -= model.AcrChange * _cityDomain.AcrCost; var validationResult = _validator.Validate(_cityDomain, model); if (validationResult.HasErrors) { return(new HandleResult { TurnHandleResult = TurnHandleResult.ValidationError, ValidationResult = validationResult }); } _currentYear = ++_cityDomain.CurrentYear; _cityDomain.AcresCount += model.AcrChange; var bushelsForPerson = model.BushelsToFeed / _normFoodForPerson; var fedPeopleCount = bushelsForPerson > _cityDomain.AlivePeople ? _cityDomain.AlivePeople : bushelsForPerson; _cityDomain.StarvedPeople = _cityDomain.AlivePeople - fedPeopleCount; _cityDomain.AlivePeople -= _cityDomain.StarvedPeople; if (_cityDomain.AlivePeople <= _cityDomain.StarvedPeople) { return(new HandleResult { TurnHandleResult = TurnHandleResult.GameOver, CityDomain = _cityDomain.Clone(), GameOverCause = GameOverCause.PeopleDead }); } _cityDomain.ComingInCurrentYearPeople = GameRandom.Next(2, 11); _cityDomain.AlivePeople += _cityDomain.ComingInCurrentYearPeople; _cityDomain.AcrCost = GameRandom.Next(16, 26); _cityDomain.BushelsCount -= model.AcresToPlant + model.BushelsToFeed; _cityDomain.HarvestedBushelsPerAcr = _cityDomain.BushelsCount < 3000 ? GameRandom.Next(1, 6) : OneBushelPerAcr; _cityDomain.BushelsCount += _cityDomain.HarvestedBushelsPerAcr * model.AcresToPlant; var eatenByRatsPercent = GameRandom.NextDouble(); _cityDomain.EatenByRats = (int)(_cityDomain.BushelsCount * (eatenByRatsPercent >= 0.6 ? eatenByRatsPercent - ReductionRatsFactor : eatenByRatsPercent)); _cityDomain.BushelsCount -= _cityDomain.EatenByRats; var result = new HandleResult { CityDomain = _cityDomain.Clone(), TurnHandleResult = _currentYear > _maxYears ? TurnHandleResult.GameOver : TurnHandleResult.Succeed, }; result.GameOverCause = result.TurnHandleResult == TurnHandleResult.GameOver ? GameOverCause.CameLastYear : GameOverCause.None; return(result); }