Ejemplo n.º 1
0
        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);
        }